Repository: m1k1o/neko Branch: master Commit: a2f5f7ec79b4 Files: 563 Total size: 4.0 MB Directory structure: gitextract_7wv1b94k/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ ├── client_build.yml │ ├── client_test.yml │ ├── dockerhub.yml │ ├── ghcr.yml │ ├── ghcr_intel.yml │ ├── ghcr_nvidia.yml │ ├── image_app.yml │ ├── image_base.yml │ ├── server_test.yml │ ├── webpage_build.yml │ ├── webpage_deploy.yml │ └── webpage_test.yml ├── .gitignore ├── .vscode/ │ ├── launch.json │ └── settings.json ├── Dockerfile.tmpl ├── LICENSE ├── README.md ├── SECURITY.md ├── apps/ │ ├── brave/ │ │ ├── Dockerfile │ │ ├── Dockerfile.nvidia │ │ ├── openbox.xml │ │ ├── policies.json │ │ ├── preferences.json │ │ ├── supervisord.conf │ │ └── supervisord.nvidia.conf │ ├── chromium/ │ │ ├── Dockerfile │ │ ├── Dockerfile.nvidia │ │ ├── openbox.xml │ │ ├── policies.json │ │ ├── preferences.json │ │ ├── supervisord.conf │ │ ├── supervisord.nvidia.conf │ │ └── widevinecdm.sh │ ├── firefox/ │ │ ├── Dockerfile │ │ ├── Dockerfile.nvidia │ │ ├── autoconfig.js │ │ ├── neko.js │ │ ├── openbox.xml │ │ ├── policies.json │ │ ├── profiles.ini │ │ ├── supervisord.conf │ │ └── supervisord.nvidia.conf │ ├── google-chrome/ │ │ ├── Dockerfile │ │ ├── Dockerfile.nvidia │ │ ├── openbox.xml │ │ ├── policies.json │ │ ├── preferences.json │ │ ├── supervisord.conf │ │ └── supervisord.nvidia.conf │ ├── kde/ │ │ ├── Dockerfile │ │ └── supervisord.conf │ ├── microsoft-edge/ │ │ ├── Dockerfile │ │ ├── Dockerfile.nvidia │ │ ├── openbox.xml │ │ ├── policies.json │ │ ├── preferences.json │ │ ├── supervisord.conf │ │ └── supervisord.nvidia.conf │ ├── opera/ │ │ ├── Dockerfile │ │ ├── fix-ffmpeg-widevine.sh │ │ ├── openbox.xml │ │ └── supervisord.conf │ ├── remmina/ │ │ ├── Dockerfile │ │ ├── rdp.remmina │ │ ├── remmina.pref │ │ ├── run-remmina.sh │ │ ├── spice.remmina │ │ ├── supervisord.conf │ │ └── vnc.remmina │ ├── tor-browser/ │ │ ├── Dockerfile │ │ ├── openbox.xml │ │ └── supervisord.conf │ ├── ungoogled-chromium/ │ │ ├── Dockerfile │ │ ├── openbox.xml │ │ ├── policies.json │ │ ├── preferences.json │ │ ├── supervisord.conf │ │ └── widevinecdm.sh │ ├── vivaldi/ │ │ ├── Dockerfile │ │ ├── openbox.xml │ │ ├── policies.json │ │ ├── preferences.json │ │ └── supervisord.conf │ ├── vlc/ │ │ ├── Dockerfile │ │ ├── openbox.xml │ │ └── supervisord.conf │ ├── waterfox/ │ │ ├── Dockerfile │ │ ├── autoconfig.js │ │ ├── neko.js │ │ ├── openbox.xml │ │ ├── policies.json │ │ ├── profiles.ini │ │ └── supervisord.conf │ └── xfce/ │ ├── Dockerfile │ └── supervisord.conf ├── build ├── client/ │ ├── .babelrc │ ├── .browserslistrc │ ├── .editorconfig │ ├── .eslintrc │ ├── .prettierrc │ ├── .vscode/ │ │ └── settings.json │ ├── Dockerfile │ ├── dev/ │ │ ├── build │ │ ├── exec │ │ ├── npm │ │ └── serve │ ├── package.json │ ├── public/ │ │ ├── browserconfig.xml │ │ ├── emoji.json │ │ ├── index.html │ │ ├── keyboard_layouts.json │ │ └── site.webmanifest │ ├── src/ │ │ ├── app.vue │ │ ├── assets/ │ │ │ └── styles/ │ │ │ ├── _reset.scss │ │ │ ├── _variables.scss │ │ │ ├── main.scss │ │ │ └── vendor/ │ │ │ ├── _emoji.scss │ │ │ ├── _emote.scss │ │ │ ├── _font-awesome.scss │ │ │ ├── _font-whitney.scss │ │ │ ├── _github.scss │ │ │ ├── _swal.scss │ │ │ └── _tooltip.scss │ │ ├── components/ │ │ │ ├── about.vue │ │ │ ├── avatar.vue │ │ │ ├── chat.vue │ │ │ ├── clipboard.vue │ │ │ ├── connect.vue │ │ │ ├── context.vue │ │ │ ├── controls.vue │ │ │ ├── emoji.vue │ │ │ ├── emote.vue │ │ │ ├── emotes.vue │ │ │ ├── files.vue │ │ │ ├── header.vue │ │ │ ├── markdown.ts │ │ │ ├── members.vue │ │ │ ├── menu.vue │ │ │ ├── resolution.vue │ │ │ ├── settings.vue │ │ │ ├── side.vue │ │ │ ├── unsupported.vue │ │ │ └── video.vue │ │ ├── lib.ts │ │ ├── locale/ │ │ │ ├── de-de.ts │ │ │ ├── en-us.ts │ │ │ ├── es-sp.ts │ │ │ ├── fi-fi.ts │ │ │ ├── fr-fr.ts │ │ │ ├── id-id.ts │ │ │ ├── index.ts │ │ │ ├── ja-jp.ts │ │ │ ├── ko-kr.ts │ │ │ ├── nb-no.ts │ │ │ ├── pl-pl.ts │ │ │ ├── ru-ru.ts │ │ │ ├── sk-sk.ts │ │ │ ├── sv-se.ts │ │ │ ├── zh-cn.ts │ │ │ └── zh-tw.ts │ │ ├── main.ts │ │ ├── neko/ │ │ │ ├── base.ts │ │ │ ├── data.ts │ │ │ ├── events.ts │ │ │ ├── index.ts │ │ │ ├── messages.ts │ │ │ └── types.ts │ │ ├── plugins/ │ │ │ ├── anime.ts │ │ │ ├── axios.ts │ │ │ ├── i18n.ts │ │ │ ├── log.ts │ │ │ ├── neko.ts │ │ │ └── swal.ts │ │ ├── store/ │ │ │ ├── chat.ts │ │ │ ├── client.ts │ │ │ ├── emoji.ts │ │ │ ├── files.ts │ │ │ ├── index.ts │ │ │ ├── remote.ts │ │ │ ├── settings.ts │ │ │ ├── user.ts │ │ │ └── video.ts │ │ ├── types/ │ │ │ ├── eventemitter3.d.ts │ │ │ ├── navigator.keyboard.d.ts │ │ │ ├── shims-scss.d.ts │ │ │ ├── shims-tsx.d.ts │ │ │ └── shims-vue.d.ts │ │ └── utils/ │ │ ├── guacamole-keyboard.js │ │ ├── guacamole-keyboard.ts │ │ ├── index.ts │ │ └── localstorage.ts │ ├── tools/ │ │ ├── emoji.ts │ │ ├── emoji_custom.ts │ │ └── tsconfig.json │ ├── tsconfig.json │ └── vue.config.js ├── config.yml ├── docker-compose.yaml ├── neko.code-workspace ├── runtime/ │ ├── .Xresources │ ├── Dockerfile │ ├── Dockerfile.bookworm │ ├── Dockerfile.intel │ ├── Dockerfile.intel.bookworm │ ├── Dockerfile.nvidia │ ├── Dockerfile.nvidia.bookworm │ ├── dbus │ ├── default.pa │ ├── fontconfig/ │ │ └── 75-emoji.conf │ ├── fonts/ │ │ └── .gitkeep │ ├── icon-theme/ │ │ └── .gitkeep │ ├── intel/ │ │ ├── add-render-group.sh │ │ └── supervisord.rendergroup.conf │ ├── nvidia/ │ │ └── entrypoint.sh │ ├── supervisord.conf │ ├── supervisord.dbus.conf │ └── xorg.conf ├── server/ │ ├── .gitignore │ ├── Dockerfile │ ├── Dockerfile.bookworm │ ├── build │ ├── cmd/ │ │ ├── neko/ │ │ │ └── main.go │ │ ├── plugins.go │ │ ├── root.go │ │ └── serve.go │ ├── dev/ │ │ ├── build │ │ ├── exec │ │ ├── fmt │ │ ├── go │ │ ├── lint │ │ ├── rebuild │ │ ├── rebuild.input │ │ ├── runtime/ │ │ │ ├── Dockerfile │ │ │ ├── config.nvidia.yml │ │ │ ├── config.yml │ │ │ └── supervisord.conf │ │ └── start │ ├── go.mod │ ├── go.sum │ ├── internal/ │ │ ├── api/ │ │ │ ├── members/ │ │ │ │ ├── bluk.go │ │ │ │ ├── controler.go │ │ │ │ └── handler.go │ │ │ ├── room/ │ │ │ │ ├── broadcast.go │ │ │ │ ├── clipboard.go │ │ │ │ ├── control.go │ │ │ │ ├── handler.go │ │ │ │ ├── keyboard.go │ │ │ │ ├── screen.go │ │ │ │ ├── settings.go │ │ │ │ └── upload.go │ │ │ ├── router.go │ │ │ ├── session.go │ │ │ └── sessions/ │ │ │ ├── controller.go │ │ │ └── handler.go │ │ ├── capture/ │ │ │ ├── broadcast.go │ │ │ ├── manager.go │ │ │ ├── screencast.go │ │ │ ├── streamselector.go │ │ │ ├── streamsink.go │ │ │ └── streamsrc.go │ │ ├── config/ │ │ │ ├── capture.go │ │ │ ├── capture_pipeline.go │ │ │ ├── config.go │ │ │ ├── desktop.go │ │ │ ├── member.go │ │ │ ├── plugins.go │ │ │ ├── root.go │ │ │ ├── server.go │ │ │ ├── session.go │ │ │ └── webrtc.go │ │ ├── desktop/ │ │ │ ├── clipboard.go │ │ │ ├── drop.go │ │ │ ├── filechooserdialog.go │ │ │ ├── manager.go │ │ │ ├── xevent.go │ │ │ ├── xinput.go │ │ │ └── xorg.go │ │ ├── http/ │ │ │ ├── batch.go │ │ │ ├── debug.go │ │ │ ├── legacy/ │ │ │ │ ├── event/ │ │ │ │ │ └── events.go │ │ │ │ ├── handler.go │ │ │ │ ├── message/ │ │ │ │ │ └── messages.go │ │ │ │ ├── session.go │ │ │ │ ├── types/ │ │ │ │ │ └── types.go │ │ │ │ ├── wstobackend.go │ │ │ │ └── wstoclient.go │ │ │ ├── logger.go │ │ │ ├── manager.go │ │ │ └── router.go │ │ ├── member/ │ │ │ ├── file/ │ │ │ │ ├── provider.go │ │ │ │ ├── provider_test.go │ │ │ │ └── types.go │ │ │ ├── manager.go │ │ │ ├── multiuser/ │ │ │ │ ├── provider.go │ │ │ │ └── types.go │ │ │ ├── noauth/ │ │ │ │ └── provider.go │ │ │ └── object/ │ │ │ ├── provider.go │ │ │ └── types.go │ │ ├── plugins/ │ │ │ ├── chat/ │ │ │ │ ├── config.go │ │ │ │ ├── manager.go │ │ │ │ ├── plugin.go │ │ │ │ └── types.go │ │ │ ├── dependency.go │ │ │ ├── dependency_test.go │ │ │ ├── filetransfer/ │ │ │ │ ├── config.go │ │ │ │ ├── manager.go │ │ │ │ ├── plugin.go │ │ │ │ ├── types.go │ │ │ │ └── utils.go │ │ │ └── manager.go │ │ ├── session/ │ │ │ ├── auth.go │ │ │ ├── manager.go │ │ │ ├── serialize.go │ │ │ └── session.go │ │ ├── webrtc/ │ │ │ ├── cursor/ │ │ │ │ ├── image.go │ │ │ │ └── position.go │ │ │ ├── handler.go │ │ │ ├── legacyhandler.go │ │ │ ├── manager.go │ │ │ ├── metrics.go │ │ │ ├── payload/ │ │ │ │ ├── receive.go │ │ │ │ ├── send.go │ │ │ │ └── types.go │ │ │ ├── peer.go │ │ │ ├── pionlog/ │ │ │ │ ├── factory.go │ │ │ │ ├── logger.go │ │ │ │ └── nullog.go │ │ │ └── track.go │ │ └── websocket/ │ │ ├── filechooserdialog.go │ │ ├── handler/ │ │ │ ├── clipboard.go │ │ │ ├── control.go │ │ │ ├── handler.go │ │ │ ├── keyboard.go │ │ │ ├── screen.go │ │ │ ├── send.go │ │ │ ├── session.go │ │ │ ├── signal.go │ │ │ └── system.go │ │ ├── manager.go │ │ └── peer.go │ ├── neko.go │ ├── openapi.yaml │ ├── pkg/ │ │ ├── auth/ │ │ │ ├── auth.go │ │ │ └── auth_test.go │ │ ├── drop/ │ │ │ ├── drop.c │ │ │ ├── drop.go │ │ │ └── drop.h │ │ ├── gst/ │ │ │ ├── gst.c │ │ │ ├── gst.go │ │ │ └── gst.h │ │ ├── types/ │ │ │ ├── api.go │ │ │ ├── capture.go │ │ │ ├── codec/ │ │ │ │ └── codecs.go │ │ │ ├── desktop.go │ │ │ ├── event/ │ │ │ │ └── events.go │ │ │ ├── http.go │ │ │ ├── member.go │ │ │ ├── message/ │ │ │ │ └── messages.go │ │ │ ├── plugins.go │ │ │ ├── session.go │ │ │ ├── webrtc.go │ │ │ └── websocket.go │ │ ├── utils/ │ │ │ ├── array.go │ │ │ ├── color.go │ │ │ ├── deocde.go │ │ │ ├── http.go │ │ │ ├── image.go │ │ │ ├── request.go │ │ │ ├── trenddetector.go │ │ │ ├── uid.go │ │ │ └── zip.go │ │ ├── xevent/ │ │ │ ├── xevent.c │ │ │ ├── xevent.go │ │ │ └── xevent.h │ │ ├── xinput/ │ │ │ ├── dummy.go │ │ │ ├── types.go │ │ │ └── xinput.go │ │ └── xorg/ │ │ ├── keysymdef.go │ │ ├── keysymdef.sh │ │ ├── xorg.c │ │ ├── xorg.go │ │ └── xorg.h │ └── plugins/ │ └── .gitkeep ├── tsconfig.json ├── utils/ │ ├── docker/ │ │ ├── go.mod │ │ └── main.go │ └── xorg-deps/ │ ├── Dockerfile │ ├── xf86-input-neko/ │ │ ├── .gitignore │ │ ├── 80-neko.conf │ │ ├── COPYING │ │ ├── Dockerfile │ │ ├── Makefile.am │ │ ├── README.md │ │ ├── autogen-clean.sh │ │ ├── autogen.sh │ │ ├── configure.ac │ │ ├── m4/ │ │ │ └── .gitkeep │ │ ├── release.sh │ │ ├── src/ │ │ │ ├── Makefile.am │ │ │ └── neko.c │ │ └── xorg-neko.pc.in │ └── xf86-video-dummy/ │ ├── 01_v0.3.8_xdummy-randr.patch │ ├── README.md │ └── v0.3.8/ │ ├── COPYING │ ├── ChangeLog │ ├── Makefile.am │ ├── Makefile.in │ ├── README │ ├── aclocal.m4 │ ├── compile │ ├── config.guess │ ├── config.h.in │ ├── config.sub │ ├── configure │ ├── configure.ac │ ├── depcomp │ ├── install-sh │ ├── ltmain.sh │ ├── missing │ └── src/ │ ├── Makefile.am │ ├── Makefile.in │ ├── compat-api.h │ ├── dummy.h │ ├── dummy_cursor.c │ ├── dummy_dga.c │ └── dummy_driver.c └── webpage/ ├── .gitignore ├── README.md ├── docs/ │ ├── api/ │ │ ├── README.mdx │ │ ├── batch.api.mdx │ │ ├── broadcast-start.api.mdx │ │ ├── broadcast-status.api.mdx │ │ ├── broadcast-stop.api.mdx │ │ ├── clipboard-get-image.api.mdx │ │ ├── clipboard-get-text.api.mdx │ │ ├── clipboard-set-text.api.mdx │ │ ├── control-give.api.mdx │ │ ├── control-release.api.mdx │ │ ├── control-request.api.mdx │ │ ├── control-reset.api.mdx │ │ ├── control-status.api.mdx │ │ ├── control-take.api.mdx │ │ ├── current-session.tag.mdx │ │ ├── general.tag.mdx │ │ ├── healthcheck.api.mdx │ │ ├── keyboard-map-get.api.mdx │ │ ├── keyboard-map-set.api.mdx │ │ ├── keyboard-modifiers-get.api.mdx │ │ ├── keyboard-modifiers-set.api.mdx │ │ ├── login.api.mdx │ │ ├── logout.api.mdx │ │ ├── members-bulk-delete.api.mdx │ │ ├── members-bulk-update.api.mdx │ │ ├── members-create.api.mdx │ │ ├── members-get-profile.api.mdx │ │ ├── members-list.api.mdx │ │ ├── members-remove.api.mdx │ │ ├── members-update-password.api.mdx │ │ ├── members-update-profile.api.mdx │ │ ├── members.tag.mdx │ │ ├── metrics.api.mdx │ │ ├── profile.api.mdx │ │ ├── room-broadcast.tag.mdx │ │ ├── room-clipboard.tag.mdx │ │ ├── room-control.tag.mdx │ │ ├── room-keyboard.tag.mdx │ │ ├── room-screen.tag.mdx │ │ ├── room-settings.tag.mdx │ │ ├── room-upload.tag.mdx │ │ ├── schemas/ │ │ │ └── memberprofile.schema.mdx │ │ ├── screen-cast-image.api.mdx │ │ ├── screen-configuration-change.api.mdx │ │ ├── screen-configuration.api.mdx │ │ ├── screen-configurations-list.api.mdx │ │ ├── screen-shot-image.api.mdx │ │ ├── session-disconnect.api.mdx │ │ ├── session-get.api.mdx │ │ ├── session-remove.api.mdx │ │ ├── sessions-get.api.mdx │ │ ├── sessions.tag.mdx │ │ ├── settings-get.api.mdx │ │ ├── settings-set.api.mdx │ │ ├── sidebar.ts │ │ ├── stats.api.mdx │ │ ├── upload-dialog-close.api.mdx │ │ ├── upload-dialog.api.mdx │ │ ├── upload-drop.api.mdx │ │ └── whoami.api.mdx │ ├── configuration/ │ │ ├── README.md │ │ ├── authentication.md │ │ ├── capture.md │ │ ├── desktop.md │ │ ├── help.json │ │ ├── help.txt │ │ ├── plugins.md │ │ └── webrtc.md │ ├── customization/ │ │ ├── README.md │ │ ├── browsers.json │ │ ├── browsers.md │ │ ├── browsers.tsx │ │ ├── networking.md │ │ ├── projects.md │ │ └── ui.md │ ├── developer-guide/ │ │ ├── README.md │ │ ├── build.md │ │ └── repository-structure.md │ ├── faq.md │ ├── hardware-acceleration/ │ │ ├── amd-gpu-support.md │ │ ├── gpu-acceleration-overview.md │ │ ├── intel-qsv.md │ │ ├── nvidia-gpu-support.md │ │ └── raspberry-pi.md │ ├── installation/ │ │ ├── README.md │ │ ├── docker-images.md │ │ └── examples.md │ ├── introduction.md │ ├── migration-from-v2/ │ │ ├── README.md │ │ ├── help.json │ │ └── help.txt │ ├── quick-start.md │ ├── release-notes.md │ ├── reverse-proxy-setup.md │ ├── roadmap.md │ └── troubleshooting.md ├── docusaurus.config.ts ├── package.json ├── scripts/ │ ├── gen-api-docs.sh │ └── gen-config.sh ├── sidebars.ts ├── src/ │ ├── components/ │ │ ├── Anchor.tsx │ │ ├── AppIcon.tsx │ │ ├── Configuration/ │ │ │ ├── generate.js │ │ │ └── index.tsx │ │ ├── HomepageFeatures/ │ │ │ ├── index.tsx │ │ │ └── styles.module.css │ │ ├── HomepageShowcase/ │ │ │ ├── index.tsx │ │ │ └── styles.module.css │ │ └── HomepageUseCases/ │ │ ├── index.tsx │ │ └── styles.module.css │ ├── css/ │ │ └── custom.css │ └── pages/ │ ├── contact.md │ ├── contributing.md │ ├── index.module.css │ ├── index.tsx │ └── non-goals.md ├── static/ │ ├── .nojekyll │ ├── .well-known/ │ │ └── security.txt │ └── CNAME ├── tsconfig.json ├── versioned_docs/ │ └── version-v2/ │ ├── README.md │ ├── configuration.md │ ├── examples.md │ ├── faq.md │ ├── quick-start.md │ ├── reverse-proxy.md │ └── troubleshooting.md ├── versioned_sidebars/ │ └── version-v2-sidebars.json └── versions.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ root = true [*] charset = utf-8 indent_style = space indent_size = 2 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true ================================================ FILE: .gitattributes ================================================ * text=auto *.css text *.js text *.ts text *.json text *.htm text *.html text *.env text *.xml text *.svg text *.txt text *.ini text *.sql text *.sh text *.png binary *.jpg binary *.jpeg binary *.gif binary *.ico binary *.mov binary *.mp4 binary *.mp3 binary ================================================ FILE: .github/FUNDING.yml ================================================ github: [ m1k1o ] ================================================ FILE: .github/workflows/client_build.yml ================================================ name: Build Client on: workflow_call: inputs: with-artifact: required: false type: boolean default: true description: | If true, the build artifacts will be uploaded as a GitHub Actions artifact. This is useful for debugging and testing purposes. If false, the artifacts will not be uploaded. This is useful for test builds where you don't need the artifacts. jobs: build-client: name: Build Client runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: 18 cache: npm cache-dependency-path: client/package-lock.json - name: Install dependencies working-directory: ./client run: npm ci - name: Build client working-directory: ./client run: npm run build - name: Upload artifacts uses: actions/upload-artifact@v4 if: ${{ inputs.with-artifact }} with: name: client path: client/dist ================================================ FILE: .github/workflows/client_test.yml ================================================ name: Test Client on: pull_request: branches: - master paths: - client/** - .github/workflows/client_build.yml - .github/workflows/client_test.yml jobs: test-client: name: Test Client uses: ./.github/workflows/client_build.yml with: # Do not upload artifacts for test builds with-artifact: false secrets: inherit ================================================ FILE: .github/workflows/dockerhub.yml ================================================ name: Build and Push to Docker Hub on: push: branches: - master paths-ignore: - 'webpage/**' # # Run this action periodically to keep browsers up-to-date # even if there is no activity in this repo. # schedule: - cron: "43 2 * * 1" # allow only one workflow to run at a time # and cancel in-progress jobs if a new one is triggered concurrency: group: "dockerhub" cancel-in-progress: true env: DOCKER_IMAGE: m1k1o/neko jobs: build-base: name: Base Image runs-on: ubuntu-latest # # do not run on forks # if: github.repository_owner == 'm1k1o' steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Extract metadata (tags, labels) for Docker uses: docker/metadata-action@v5 id: meta with: images: ${{ env.DOCKER_IMAGE }} tags: | type=raw,value=base - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ github.actor }} password: ${{ secrets.DOCKER_TOKEN }} - name: Generate base Dockerfile run: go run utils/docker/main.go -i Dockerfile.tmpl -o Dockerfile - name: Build and push uses: docker/build-push-action@v6 with: context: ./ push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max build-app: name: App Image runs-on: ubuntu-latest # # do not run on forks # if: github.repository_owner == 'm1k1o' needs: build-base strategy: # Will build all images even if some fail. fail-fast: false matrix: tag: - firefox # Temporarily disabled due to Cloudflare blocked download link #- waterfox - chromium - google-chrome - ungoogled-chromium - microsoft-edge - brave - vivaldi - opera - tor-browser - remmina - vlc - xfce - kde steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Extract metadata (tags, labels) for Docker uses: docker/metadata-action@v5 id: meta with: images: ${{ env.DOCKER_IMAGE }} tags: | type=raw,value=latest,enable=${{ matrix.tag == 'firefox' }} type=raw,value=${{ matrix.tag }} - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ github.actor }} password: ${{ secrets.DOCKER_TOKEN }} - name: Build and push uses: docker/build-push-action@v6 with: context: apps/${{ matrix.tag }} push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | BASE_IMAGE=${{ env.DOCKER_IMAGE }}:base cache-from: type=gha cache-to: type=gha,mode=max ================================================ FILE: .github/workflows/ghcr.yml ================================================ name: Build and Push to GHCR on: push: tags: - 'v*' jobs: build-base: name: Base Image uses: ./.github/workflows/image_base.yml with: platforms: linux/amd64,linux/arm64,linux/arm/v7 secrets: inherit build-app: name: App Image uses: ./.github/workflows/image_app.yml needs: build-base strategy: # Will build all images even if some fail. fail-fast: false matrix: include: - name: firefox platforms: linux/amd64,linux/arm64,linux/arm/v7 # Temporarily disabled due to Cloudflare blocked download link #- name: waterfox # platforms: linux/amd64 - name: chromium platforms: linux/amd64,linux/arm64,linux/arm/v7 - name: google-chrome platforms: linux/amd64 - name: ungoogled-chromium platforms: linux/amd64 - name: microsoft-edge platforms: linux/amd64 - name: brave platforms: linux/amd64,linux/arm64 - name: vivaldi platforms: linux/amd64,linux/arm64,linux/arm/v7 - name: opera platforms: linux/amd64 - name: tor-browser platforms: linux/amd64 - name: remmina platforms: linux/amd64,linux/arm64,linux/arm/v7 - name: vlc platforms: linux/amd64,linux/arm64,linux/arm/v7 - name: xfce platforms: linux/amd64,linux/arm64,linux/arm/v7 - name: kde platforms: linux/amd64,linux/arm64,linux/arm/v7 with: name: ${{ matrix.name }} platforms: ${{ matrix.platforms }} secrets: inherit ================================================ FILE: .github/workflows/ghcr_intel.yml ================================================ name: Build and Push to GHCR for Intel on: push: tags: - 'v*' jobs: build-base: name: Base Image uses: ./.github/workflows/image_base.yml with: flavor: intel platforms: linux/amd64 dockerfile: Dockerfile.intel secrets: inherit build-app: name: App Image uses: ./.github/workflows/image_app.yml needs: build-base strategy: # Will build all images even if some fail. fail-fast: false matrix: include: - name: firefox # Temporarily disabled due to Cloudflare blocked download link #- name: waterfox - name: chromium - name: google-chrome - name: ungoogled-chromium - name: microsoft-edge - name: brave - name: vivaldi - name: opera - name: tor-browser - name: remmina - name: vlc - name: xfce - name: kde with: name: ${{ matrix.name }} flavor: intel platforms: ${{ matrix.platforms }} dockerfile: ${{ matrix.dockerfile }} secrets: inherit ================================================ FILE: .github/workflows/ghcr_nvidia.yml ================================================ name: Build and Push to GHCR for Nvidia on: push: tags: - 'v*' jobs: build-base: name: Base Image uses: ./.github/workflows/image_base.yml with: flavor: nvidia platforms: linux/amd64 dockerfile: Dockerfile.nvidia secrets: inherit build-app: name: App Image uses: ./.github/workflows/image_app.yml needs: build-base strategy: # Will build all images even if some fail. fail-fast: false matrix: include: - name: firefox dockerfile: Dockerfile.nvidia - name: brave dockerfile: Dockerfile.nvidia - name: chromium dockerfile: Dockerfile.nvidia - name: google-chrome dockerfile: Dockerfile.nvidia - name: microsoft-edge dockerfile: Dockerfile.nvidia with: name: ${{ matrix.name }} flavor: nvidia platforms: ${{ matrix.platforms }} dockerfile: ${{ matrix.dockerfile }} secrets: inherit ================================================ FILE: .github/workflows/image_app.yml ================================================ name: Build App Image on: workflow_call: inputs: name: required: true type: string description: "The name of the app to build." flavor: required: false type: string default: "" description: "The flavor of the image to build." platforms: required: false type: string default: "linux/amd64" description: "The platforms to build for." dockerfile: required: false type: string default: "Dockerfile" description: "The Dockerfile to use for building the image." env: FLAVOR_PREFIX: ${{ inputs.flavor && format('{0}-', inputs.flavor) || '' }} jobs: build-app: name: Build App Image runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Extract metadata (tags, labels) for Docker uses: docker/metadata-action@v5 id: meta with: images: ghcr.io/${{ github.repository }}/${{ env.FLAVOR_PREFIX }}${{ inputs.name }} tags: | type=edge,branch=master type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} type=sha,format=long - name: Log in to the Container registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GHCR_ACCESS_TOKEN }} - name: Build and push uses: docker/build-push-action@v6 with: context: apps/${{ inputs.name }} file: apps/${{ inputs.name }}/${{ inputs.dockerfile || 'Dockerfile' }} push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | BASE_IMAGE=ghcr.io/${{ github.repository }}/${{ env.FLAVOR_PREFIX }}base:sha-${{ github.sha }} platforms: ${{ inputs.platforms || 'linux/amd64' }} cache-from: type=gha cache-to: type=gha,mode=max ================================================ FILE: .github/workflows/image_base.yml ================================================ name: Build Base Image on: workflow_call: inputs: flavor: required: false type: string default: "" description: "The flavor of the image to build. This is used to determine the base image and the Dockerfile to use." platforms: required: false type: string default: "linux/amd64" description: "The platforms to build for." dockerfile: required: false type: string default: "Dockerfile" description: "The Dockerfile to use for building the image." env: FLAVOR_PREFIX: ${{ inputs.flavor && format('{0}-', inputs.flavor) || '' }} jobs: build-client: name: Build Client Artifacts uses: ./.github/workflows/client_build.yml build-base: name: Build Base Image runs-on: ubuntu-latest needs: build-client steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download client dist uses: actions/download-artifact@v4 with: name: client path: client/dist - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Extract metadata (tags, labels) for Docker uses: docker/metadata-action@v5 id: meta with: images: ghcr.io/${{ github.repository }}/${{ env.FLAVOR_PREFIX }}base tags: | type=edge,branch=master type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} type=sha,format=long - name: Log in to the Container registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GHCR_ACCESS_TOKEN }} - name: Generate base Dockerfile env: RUNTIME_DOCKERFILE: ${{ inputs.dockerfile || 'Dockerfile' }} run: go run utils/docker/main.go -i Dockerfile.tmpl -o Dockerfile -client client/dist - name: Build and push uses: docker/build-push-action@v6 with: context: ./ push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} platforms: ${{ inputs.platforms || 'linux/amd64' }} cache-from: type=gha cache-to: type=gha,mode=max ================================================ FILE: .github/workflows/server_test.yml ================================================ name: Test Server on: pull_request: branches: - master paths: - server/** - .github/workflows/server_test.yml jobs: build-amd64: name: Build amd64 runs-on: ubuntu-latest permissions: contents: read steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Build Docker image uses: docker/build-push-action@v6 with: context: ./server platforms: linux/amd64 build-arm64: name: Build arm64 runs-on: ubuntu-24.04-arm permissions: contents: read steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Build Docker image uses: docker/build-push-action@v6 with: context: ./server platforms: linux/arm64 ================================================ FILE: .github/workflows/webpage_build.yml ================================================ name: Build Webpage on: workflow_call: inputs: with-artifact: required: false type: boolean default: true description: | If true, the build artifacts will be uploaded as a GitHub Actions artifact. This is useful for debugging and testing purposes. If false, the artifacts will not be uploaded. This is useful for test builds where you don't need the artifacts. jobs: build-webpage: name: Build Webpage runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: 18 cache: npm cache-dependency-path: webpage/package-lock.json - name: Install dependencies working-directory: ./webpage run: npm ci - name: Build webpage working-directory: ./webpage run: npm run build - if: ${{ inputs.with-artifact }} name: Upload artifacts uses: actions/upload-pages-artifact@v3 with: artifact-name: github-pages path: ./webpage/build ================================================ FILE: .github/workflows/webpage_deploy.yml ================================================ name: Build and Deploy Webpage to GitHub Pages on: # Runs on pushes targeting the default branch push: branches: - master paths: - webpage/** - .github/workflows/webpage_build.yml - .github/workflows/webpage_deploy.yml # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: contents: read pages: write id-token: write # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: group: "pages" cancel-in-progress: false jobs: build-webpage: name: Build Webpage uses: ./.github/workflows/webpage_build.yml secrets: inherit deploy-webpage: name: Deploy to GitHub Pages needs: build-webpage # Deploy to the github-pages environment environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 ================================================ FILE: .github/workflows/webpage_test.yml ================================================ name: Test Webpage on: pull_request: branches: - master paths: - webpage/** - .github/workflows/webpage_build.yml - .github/workflows/webpage_test.yml jobs: test-webpage: name: Test Webpage uses: ./.github/workflows/webpage_build.yml with: # Do not upload artifacts for test builds with-artifact: false secrets: inherit ================================================ FILE: .gitignore ================================================ # OS files .DS_Store .DS_Store? ._* .Spotlight-V100 .Trashes ehthumbs.db Thumbs.db # Log/Temp files .tmp/ tmp/ *.tmp .logs/ logs/ *.log core .build # Runtime data pids *.pid *.seed *.pid.lock # TypeScript incremental compilation cache *.tsbuildinfo # Node modules node_modules dist bin # Environment files *.env .env.development # Code Editors .idea runtime/fonts/* !runtime/fonts/.gitkeep runtime/icon-theme/* !runtime/icon-theme/.gitkeep # root Dockerfile is generated from the Dockerfile.tmpl /Dockerfile ================================================ FILE: .vscode/launch.json ================================================ { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "launch", "type": "go", "debugAdapter": "dlv-dap", "request": "launch", "mode": "debug", "program": "${workspaceFolder}/server/cmd/neko", "output": "${workspaceFolder}/server/bin/debug/neko", "cwd": "${workspaceFolder}/server/", "args": ["serve", "-d", "-c", "dev/runtime/config.yml"], "env": { "DISPLAY": ":99.0", "PION_LOG_TRACE": "all", } } ] } ================================================ FILE: .vscode/settings.json ================================================ { "go.inferGopath": false, "go.autocompleteUnimportedPackages": true, "go.delveConfig": { "useApiV1": false }, "[go]": { "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.organizeImports": "explicit" } } } ================================================ FILE: Dockerfile.tmpl ================================================ # This Dockerfile is pre-processed by the ./utils/docker script, it is not meant to be used directly. FROM ./server/ AS server FROM ./client/ AS client FROM ./utils/xorg-deps/ AS xorg-deps FROM ./runtime/$RUNTIME_DOCKERFILE AS runtime # tells neko-rooms which version of the API to use LABEL net.m1k1o.neko.api-version=3 COPY --from=server /src/bin/plugins/ /etc/neko/plugins/ COPY --from=server /src/bin/neko /usr/bin/neko COPY --from=client /src/dist/ /var/www COPY --from=xorg-deps /usr/local/lib/xorg/modules/drivers/dummy_drv.so /usr/lib/xorg/modules/drivers/dummy_drv.so COPY --from=xorg-deps /usr/local/lib/xorg/modules/input/neko_drv.so /usr/lib/xorg/modules/input/neko_drv.so COPY config.yml /etc/neko/neko.yaml ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright (C) 2020 Nurdism Copyright (C) 2020-2024 m1k1o & Demodesk GmbH Copyright (C) 2024- m1k1o All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: README.md ================================================

release license pulls issues issues Chat on discord Featured|HelloGitHub build

# n.eko Welcome to Neko, a self-hosted virtual browser that runs in Docker and uses WebRTC technology. Neko is a powerful tool that allows you to **run a fully-functional browser in a virtual environment**, giving you the ability to **access the internet securely and privately from anywhere**. With Neko, you can browse the web, **run applications**, and perform other tasks just as you would on a regular browser, all within a **secure and isolated environment**. Whether you are a developer looking to test web applications, a **privacy-conscious user seeking a secure browsing experience**, or simply someone who wants to take advantage of the **convenience and flexibility of a virtual browser**, Neko is the perfect solution. In addition to its security and privacy features, Neko offers the **ability for multiple users to access it simultaneously**. This makes it an ideal solution for teams or organizations that need to share access to a browser, as well as for individuals who want to use **multiple devices to access the same virtual environment**. With Neko, you can **easily and securely share access to a browser with others**, without having to worry about maintaining separate configurations or settings. Whether you need to **collaborate on a project**, access shared resources, or simply want to **share access to a browser with friends or family**, Neko makes it easy to do so. Neko is also a great tool for **hosting watch parties** and interactive presentations. With its virtual browser capabilities, Neko allows you to host watch parties and presentations that are **accessible from anywhere**, without the need for in-person gatherings. This makes it easy to **stay connected with friends and colleagues**, even when you are unable to meet in person. With Neko, you can easily host a watch party or give an **interactive presentation**, whether it's for leisure or work. Simply invite your guests to join the virtual environment, and you can share the screen and **interact with them in real-time**. ## About This app uses WebRTC to stream a desktop inside of a docker container, original author made this because [rabb.it](https://en.wikipedia.org/wiki/Rabb.it) went under and his internet could not handle streaming and discord kept crashing when his friend attempted to. He just wanted to watch anime with his friends ლ(ಠ益ಠლ) so he started digging throughout the internet and found a few *kinda* clones, but none of them had the virtual browser, then he found [Turtus](https://github.com/Khauri/Turtus) and he was able to figure out the rest. Then I found [this](https://github.com/nurdism/neko) project and started to dig into it. I really liked the idea of having collaborative browser browsing together with multiple people, so I created a fork. Initially, I wanted to merge my changes to the upstream repository, but the original author did not have time for this project anymore and it got eventually archived. ## Use-cases and comparison Neko started as a virtual browser that is streamed using WebRTC to multiple users. - It is **not only limited to a browser**; it can run anything that runs on linux (e.g. VLC). Browser only happens to be the most popular and widely used use-case. - In fact, it is not limited to a single program either; you can install a full desktop environment (e.g. XFCE, KDE). - Speaking of limits, it does not need to run in a container; you could install neko on your host, connect to your X server and control your whole VM. - Theoretically it is not limited to only X server, anything that can be controlled and scraped periodically for images could be used instead. - Like implementing RDP or VNC protocol, where neko would only act as WebRTC relay server. This is currently only future. Primary use case is connecting with multiple people, leveraging real time synchronization and interactivity: - **Watch party** - watching video content together with multiple people and reacting to it (chat, emotes) - open source alternative to [giggl.app](https://giggl.app/) or [hyperbeam](https://watch.hyperbeam.com). - **Interactive presentation** - not only screen sharing, but others can control the screen. - **Collaborative tool** - brainstorming ideas, cobrowsing, code debugging together. - **Support/Teaching** - interactively guiding people in controlled environment. - **Embed anything** - embed virtual browser in your web app - open source alternative to [hyperbeam API](https://hyperbeam.com/). - open any third-party website or application, synchronize audio and video flawlessly among multiple participants. - request rooms using API with [neko-rooms](https://github.com/m1k1o/neko-rooms). - [**Neko inside VR Chat**](https://github.com/jameskitt616/vrchat_streaming) - watch remote browser together with friends in VR. Other use cases that benefit from single-user: - **Personal workspace** - streaming containerized apps and desktops to end-users - similar to [kasm](https://www.kasmweb.com/). - **Persistent browser** - own browser with persistent cookies available anywhere - similar to [mightyapp](https://www.mightyapp.com/). - no state is left on the host browser after terminating the connection. - sensitive data like cookies are not transferred - only video is shared. - **Throwaway browser** - a better solution for planning secret parties and buying birthday gifts off the internet. - use Tor Browser and [VPN](https://github.com/m1k1o/neko-vpn) for additional anonymity. - mitigates risk of OS fingerprinting and browser vulnerabilities by running in container. - **Session broadcasting** - broadcast room content using RTMP (to e.g. twitch or youtube...). - **Session recording** - broadcast RTMP can be saved to a file using e.g. [nginx-rtmp](https://www.nginx.com/products/nginx/modules/rtmp-media-streaming/) - have clean environment when recording tutorials. - no need to hide bookmarks or use incognito mode. - **Jump host** - access your internal applications securely without the need for VPN. - **Automated browser** - you can install [playwright](https://playwright.dev/) or [puppeteer](https://pptr.dev/) and automate tasks while being able to actively intercept them. Compared to clientless remote desktop gateway (e.g. [Apache Guacamole](https://guacamole.apache.org/) or [websockify](https://github.com/novnc/websockify) with [noVNC](https://novnc.com/)), installed with remote desktop server along with desired program (e.g. [linuxserver/firefox](https://docs.linuxserver.io/images/docker-firefox)) provides neko additionally: - **Smooth video** because it uses WebRTC and not images sent over WebSockets. - **Built in audio** support, what is not part of Apache Guacamole or noVNC. - **Multi-participant control**, what is not natively supported by Apache Guacamole or noVNC. ### Supported browsers
... see [all available images](https://neko.m1k1o.net/docs/v3/installation/docker-images)
### Other applications
... others in m1k1o/neko-apps
### Why neko? I like cats 🐱 (`Neko` is the Japanese word for cat), I'm a weeb/nerd. ***But why the cat butt?*** Because cats are *assholes*, but you love them anyways. ## Multiple rooms For neko room management software, visit [neko-rooms](https://github.com/m1k1o/neko-rooms). It also offers [Zero-knowledge installation (with HTTPS)](https://github.com/m1k1o/neko-rooms/?tab=readme-ov-file#zero-knowledge-installation-with-https). ## Documentation Full documentation is available at [neko.m1k1o.net](https://neko.m1k1o.net/). Key sections include: - [Migration from V2](https://neko.m1k1o.net/docs/v3/migration-from-v2) - [Getting Started](https://neko.m1k1o.net/docs/v3/quick-start) - [Installation](https://neko.m1k1o.net/docs/v3/installation) - [Examples](https://neko.m1k1o.net/docs/v3/installation/examples) - [Configuration](https://neko.m1k1o.net/docs/v3/configuration) - [Frequently Asked Questions](https://neko.m1k1o.net/docs/v3/faq) - [Troubleshooting](https://neko.m1k1o.net/docs/v3/troubleshooting) ## How to Contribute Contributions are welcome! Check the [Contributing Guide](https://neko.m1k1o.net/contributing) for details. ## Support If you find Neko useful, consider supporting the project via [GitHub Sponsors](https://github.com/sponsors/m1k1o). ================================================ FILE: SECURITY.md ================================================ # Security Policy ## Reporting a Vulnerability If there are any vulnerabilities in **m1k1o/neko**, don't hesitate to _report them_. 1. Send an email to `security@m1k1o.net`. 2. Describe the vulnerability. If you have a fix, that is most welcome -- please attach or summarize it in your message! 3. We will evaluate the vulnerability and, if necessary, release a fix or mitigating steps to address it. We will contact you to let you know the outcome, and will credit you in the report. Please **do not disclose the vulnerability publicly** until a fix is released! 4. Once we have either a) published a fix, or b) declined to address the vulnerability for whatever reason, you are free to publicly disclose it. We appreciate your help in keeping Neko secure. ================================================ FILE: apps/brave/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE RUN set -eux; apt-get update; \ apt-get install -y --no-install-recommends apt-transport-https curl openbox; \ # # install brave browser ARCH=$(dpkg --print-architecture); \ curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg; \ echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg arch=${ARCH}] https://brave-browser-apt-release.s3.brave.com/ stable main" \ | tee /etc/apt/sources.list.d/brave-browser-release.list; \ apt-get update; \ apt-get install -y --no-install-recommends brave-browser; \ # # clean up apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/brave.conf COPY --chown=neko preferences.json /home/neko/.config/brave/Default/Preferences COPY policies.json /etc/brave/policies/managed/policies.json COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/brave/Dockerfile.nvidia ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/nvidia-base:latest FROM $BASE_IMAGE RUN set -eux; apt-get update; \ apt-get install -y --no-install-recommends apt-transport-https curl openbox; \ # # install brave browser curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg; \ echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg arch=amd64] https://brave-browser-apt-release.s3.brave.com/ stable main" \ | tee /etc/apt/sources.list.d/brave-browser-release.list; \ apt-get update; \ apt-get install -y --no-install-recommends brave-browser; \ # # clean up apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.nvidia.conf /etc/neko/supervisord/brave.conf COPY --chown=neko preferences.json /home/neko/.config/brave/Default/Preferences COPY policies.json /etc/brave/policies/managed/policies.json COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/brave/openbox.xml ================================================ 10 20 no true yes normal yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g leftno rightno upno downno leftno rightno upno downno 1 2 3 4 scrot -s yesyes right left up down true Konqueror kfmclient openProfile filemanagement scrot 1 500 400 false previous next previous next previous next no yes top left right bottom vertical horizontal previous next previous next previous next previous next previous next menu.xml 200 no 100 400 yes yes
================================================ FILE: apps/brave/policies.json ================================================ { "AutofillAddressEnabled": false, "AutofillCreditCardEnabled": false, "BrowserSignin": 0, "DefaultNotificationsSetting": 2, "DeveloperToolsAvailability": 2, "EditBookmarksEnabled": false, "FullscreenAllowed": true, "IncognitoModeAvailability": 1, "SyncDisabled": true, "AutoplayAllowed": true, "BrowserAddPersonEnabled": false, "BrowserGuestModeEnabled": false, "DefaultPopupsSetting": 2, "DownloadRestrictions": 3, "VideoCaptureAllowed": true, "AllowFileSelectionDialogs": false, "PromptForDownloadLocation": false, "BookmarkBarEnabled": false, "PasswordManagerEnabled": false, "URLAllowlist": [ "file:///home/neko/Downloads" ], "URLBlocklist": [ "file://*", "chrome://policy" ], "ExtensionInstallForcelist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm;https://clients2.google.com/service/update2/crx", "mnjggcdmjocbbbhaepdhchncahnbgone;https://clients2.google.com/service/update2/crx" ], "ExtensionInstallAllowlist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm", "mnjggcdmjocbbbhaepdhchncahnbgone" ], "ExtensionInstallBlocklist": [ "*" ] } ================================================ FILE: apps/brave/preferences.json ================================================ { "homepage": "http://www.google.com", "homepage_is_newtabpage": false, "first_run_tabs": [ "https://www.google.com/_/chrome/newtab?ie=UTF-8" ], "custom_links": { "initialized": true, "list": [ { "title": "YouTube", "url": "https://www.youtube.com/" }, { "title": "Netflix", "url": "https://netflix.com" }, { "title": "Hulu", "url": "https://www.hulu.com/" }, { "title": "9Anime", "url": "https://9anime.to/" }, { "title": "Crunchy Roll", "url": "https://www.crunchyroll.com/" }, { "title": "Funimation", "url": "https://www.funimation.com/" }, { "title": "Disney+", "url": "https://www.disneyplus.com/" }, { "title": "HBO Now", "url": "https://play.hbonow.com/" }, { "title": "Amazon Video", "url": "https://www.amazon.com/Amazon-Video/b?node=2858778011" }, { "title": "VRV", "url": "https://vrv.co/" }, { "title": "Twitch", "url": "https://www.twitch.tv/" }, { "title": "Mixer", "url": "https://mixer.com/" } ] }, "browser": { "custom_chrome_frame": false, "show_home_button": true, "window_placement": { "maximized": true } }, "bookmark_bar": { "show_on_all_tabs": false }, "sync_promo": { "show_on_first_run_allowed": false }, "distribution": { "import_bookmarks_from_file": "bookmarks.html", "import_bookmarks": true, "import_history": true, "import_home_page": true, "import_search_engine": true, "ping_delay": 60, "do_not_create_desktop_shortcut": true, "do_not_create_quick_launch_shortcut": true, "do_not_create_taskbar_shortcut": true, "do_not_launch_chrome": true, "do_not_register_for_update_launch": true, "make_chrome_default": true, "make_chrome_default_for_user": true, "system_level": false, "verbose_logging": false }, "profile": { "avatar_index": 19, "default_content_setting_values": { "clipboard": 2, "cookies": 4, "geolocation": 2, "media_stream_camera": 2, "media_stream_mic": 2, "midi_sysex": 2, "payment_handler": 2, "usb_guard": 2 }, "name": "neko", "using_default_avatar": false, "using_default_name": false, "using_gaia_avatar": false }, "signin": { "allowed": false } } ================================================ FILE: apps/brave/supervisord.conf ================================================ [program:brave] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/brave-browser --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/brave --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/brave.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/brave/supervisord.nvidia.conf ================================================ [program:brave] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/bin/entrypoint.sh /usr/bin/brave-browser --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/brave --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --enable-features=Vulkan,UseSkiaRenderer,VaapiVideoEncoder,VaapiVideoDecoder,CanvasOopRasterization --ignore-gpu-blocklist --disable-seccomp-filter-sandbox --use-angle=vulkan --disable-software-rasterizer --disable-dev-shm-usage --disable-vulkan-surface --enable-unsafe-webgpu stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/brave.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/chromium/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE COPY ./widevinecdm.sh /widevine.sh # # install neko chromium RUN set -eux; \ echo "deb http://ftp.de.debian.org/debian bookworm main" >> /etc/apt/sources.list; \ apt-get update; \ apt-get install -y --no-install-recommends chromium chromium-common chromium-sandbox openbox; \ # # install widevine module (only for amd64) CHROMIUM_DIR="/usr/lib/chromium"; \ ARCH=$(dpkg --print-architecture); \ if [ "${ARCH}" = "amd64" ]; then \ apt-get install -y --no-install-recommends xz-utils; \ ./widevine.sh "${CHROMIUM_DIR}/WidevineCdm"; \ rm -f /widevine.sh; \ apt-get --purge autoremove -y xz-utils; \ else \ echo "Widevine is not supported on ${ARCH}"; \ fi; \ # # clean up apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/chromium.conf COPY --chown=neko preferences.json /home/neko/.config/chromium/Default/Preferences COPY policies.json /etc/chromium/policies/managed/policies.json COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/chromium/Dockerfile.nvidia ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/nvidia-base:latest FROM $BASE_IMAGE COPY ./widevinecdm.sh /widevine.sh # # install neko chromium RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends software-properties-common; \ # chromium-browser from default repo needs snap to be installed # and nvidia base is ubuntu not debian add-apt-repository ppa:system76/pop; \ apt-get update; \ apt-get install -y --no-install-recommends xz-utils chromium openbox; \ # # install widevine module CHROMIUM_DIR="/usr/lib/chromium"; \ ./widevine.sh "${CHROMIUM_DIR}/WidevineCdm"; \ rm -f /widevine.sh; \ # # clean up apt-get --purge autoremove -y xz-utils; \ apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.nvidia.conf /etc/neko/supervisord/chromium.conf COPY --chown=neko preferences.json /home/neko/.config/chromium/Default/Preferences COPY policies.json /etc/chromium/policies/managed/policies.json COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/chromium/openbox.xml ================================================ 10 20 no true yes normal yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g leftno rightno upno downno leftno rightno upno downno 1 2 3 4 scrot -s yesyes right left up down true Konqueror kfmclient openProfile filemanagement scrot 1 500 400 false previous next previous next previous next no yes top left right bottom vertical horizontal previous next previous next previous next previous next previous next menu.xml 200 no 100 400 yes yes
================================================ FILE: apps/chromium/policies.json ================================================ { "AutofillAddressEnabled": false, "AutofillCreditCardEnabled": false, "BrowserSignin": 0, "DefaultNotificationsSetting": 2, "DeveloperToolsAvailability": 2, "EditBookmarksEnabled": false, "FullscreenAllowed": true, "IncognitoModeAvailability": 1, "SyncDisabled": true, "AutoplayAllowed": true, "BrowserAddPersonEnabled": false, "BrowserGuestModeEnabled": false, "DefaultPopupsSetting": 2, "DownloadRestrictions": 3, "VideoCaptureAllowed": true, "AllowFileSelectionDialogs": false, "PromptForDownloadLocation": false, "BookmarkBarEnabled": false, "PasswordManagerEnabled": false, "BrowserLabsEnabled": false, "URLAllowlist": [ "file:///home/neko/Downloads" ], "URLBlocklist": [ "file://*", "chrome://policy" ], "ExtensionInstallForcelist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm;https://clients2.google.com/service/update2/crx", "mnjggcdmjocbbbhaepdhchncahnbgone;https://clients2.google.com/service/update2/crx" ], "ExtensionInstallAllowlist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm", "mnjggcdmjocbbbhaepdhchncahnbgone" ], "ExtensionInstallBlocklist": [ "*" ] } ================================================ FILE: apps/chromium/preferences.json ================================================ { "homepage": "http://www.google.com", "homepage_is_newtabpage": false, "first_run_tabs": [ "https://www.google.com/_/chrome/newtab?ie=UTF-8" ], "custom_links": { "initialized": true, "list": [ { "title": "YouTube", "url": "https://www.youtube.com/" }, { "title": "Netflix", "url": "https://netflix.com" }, { "title": "Hulu", "url": "https://www.hulu.com/" }, { "title": "9Anime", "url": "https://9anime.to/" }, { "title": "Crunchy Roll", "url": "https://www.crunchyroll.com/" }, { "title": "Funimation", "url": "https://www.funimation.com/" }, { "title": "Disney+", "url": "https://www.disneyplus.com/" }, { "title": "HBO Now", "url": "https://play.hbonow.com/" }, { "title": "Amazon Video", "url": "https://www.amazon.com/Amazon-Video/b?node=2858778011" }, { "title": "VRV", "url": "https://vrv.co/" }, { "title": "Twitch", "url": "https://www.twitch.tv/" }, { "title": "Mixer", "url": "https://mixer.com/" } ] }, "browser": { "custom_chrome_frame": false, "show_home_button": true, "window_placement": { "maximized": true } }, "bookmark_bar": { "show_on_all_tabs": false }, "sync_promo": { "show_on_first_run_allowed": false }, "distribution": { "import_bookmarks_from_file": "bookmarks.html", "import_bookmarks": true, "import_history": true, "import_home_page": true, "import_search_engine": true, "ping_delay": 60, "do_not_create_desktop_shortcut": true, "do_not_create_quick_launch_shortcut": true, "do_not_create_taskbar_shortcut": true, "do_not_launch_chrome": true, "do_not_register_for_update_launch": true, "make_chrome_default": true, "make_chrome_default_for_user": true, "system_level": false, "verbose_logging": false }, "profile": { "avatar_index": 19, "default_content_setting_values": { "clipboard": 2, "cookies": 4, "geolocation": 2, "media_stream_camera": 2, "media_stream_mic": 2, "midi_sysex": 2, "payment_handler": 2, "usb_guard": 2 }, "name": "neko", "using_default_avatar": false, "using_default_name": false, "using_gaia_avatar": false }, "signin": { "allowed": false } } ================================================ FILE: apps/chromium/supervisord.conf ================================================ [program:chromium] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/chromium --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/chromium --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/chromium.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/chromium/supervisord.nvidia.conf ================================================ [program:chromium] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/bin/entrypoint.sh /usr/bin/chromium --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/chromium --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --enable-features=Vulkan,UseSkiaRenderer,VaapiVideoEncoder,VaapiVideoDecoder,CanvasOopRasterization --ignore-gpu-blocklist --disable-seccomp-filter-sandbox --use-angle=vulkan --disable-software-rasterizer --disable-dev-shm-usage --disable-vulkan-surface --enable-unsafe-webgpu stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/chromium.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/chromium/widevinecdm.sh ================================================ #!/usr/bin/env bash set -e TARGET_DIR="$(realpath "$1")" if [ -z "$TARGET_DIR" ]; then echo "Usage: $0 /path/to/install/WidevineCdm" exit 1 fi TMPDIR=$(mktemp -d) cd "$TMPDIR" function cleanup { rm -rf "$TMPDIR" } trap cleanup EXIT # Fetch manifest and extract URL URL=$(python3 -c " import json, urllib.request data = json.load(urllib.request.urlopen('https://raw.githubusercontent.com/mozilla/gecko-dev/master/toolkit/content/gmp-sources/widevinecdm.json')) for v in data['vendors'].values(): for k, p in v['platforms'].items(): if 'Linux_x86_64-gcc3' in k: print(p['fileUrl']) break ") # Download CRX curl -L -o widevinecdm.crx "$URL" # Install go-crx3 echo "Fetching latest go-crx3 version..." VERSION=$(curl -s https://api.github.com/repos/m1k1o/go-crx3/releases/latest | grep 'tag_name' | cut -d '"' -f4) ARTIFACT="go-crx3_${VERSION#v}_linux_amd64.tar.gz" URL="https://github.com/m1k1o/go-crx3/releases/download/${VERSION}/${ARTIFACT}" echo "Downloading $URL" curl -L -o "$ARTIFACT" "$URL" tar -xzf "$ARTIFACT" # Unpack with go-crx3 ./go-crx3 unpack widevinecdm.crx mkdir -p "$TARGET_DIR" cp -ar widevinecdm/* "$TARGET_DIR" ================================================ FILE: apps/firefox/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE # # install firefox RUN set -eux; apt-get update; \ apt-get install -y --no-install-recommends openbox; \ ARCH=$(dpkg --print-architecture); \ if [ "${ARCH}" = "armhf" ]; then \ # # install firefox-esr for armhf apt-get install -y --no-install-recommends firefox-esr; \ ln -s /usr/lib/firefox-esr /usr/lib/firefox; \ # # install extensions mkdir -p /usr/lib/firefox-esr/distribution/extensions; \ wget -O '/usr/lib/firefox-esr/distribution/extensions/uBlock0@raymondhill.net.xpi' https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi; \ wget -O '/usr/lib/firefox-esr/distribution/extensions/sponsorBlocker@ajay.app.xpi' https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi; \ else \ # # fetch latest release (for amd64 and arm64) if [ "${ARCH}" = "amd64" ]; then \ SRC_URL="https://download.mozilla.org/?product=firefox-latest&os=linux64&lang=en-US"; \ elif [ "${ARCH}" = "arm64" ]; then \ SRC_URL="https://download.mozilla.org/?product=firefox-latest&os=linux64-aarch64&lang=en-US"; \ fi; \ if [ ! -z "${SRC_URL}" ]; then \ apt-get install -y --no-install-recommends xz-utils libgtk-3-0 libdbus-glib-1-2; \ wget -O /tmp/firefox-setup.tar.xz "${SRC_URL}"; \ mkdir /usr/lib/firefox; \ tar -xvf /tmp/firefox-setup.tar.xz -C /usr/lib; \ rm -f /tmp/firefox-setup.tar.xz; \ ln -s /usr/lib/firefox/firefox /usr/bin/firefox; \ apt-get --purge autoremove -y xz-utils; \ else \ echo "Unsupported architecture: ${ARCH}"; \ exit 1; \ fi; \ fi; \ # # create a profile directory mkdir -p /home/neko/.mozilla/firefox/profile.default/extensions; \ chown -R neko:neko /home/neko/.mozilla/firefox/profile.default; \ # # clean up apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/firefox.conf COPY neko.js /usr/lib/firefox/mozilla.cfg COPY autoconfig.js /usr/lib/firefox/defaults/pref/autoconfig.js COPY policies.json /usr/lib/firefox/distribution/policies.json COPY --chown=neko profiles.ini /home/neko/.mozilla/firefox/profiles.ini COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/firefox/Dockerfile.nvidia ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/nvidia-base:latest FROM $BASE_IMAGE ARG SRC_URL="https://download.mozilla.org/?product=firefox-latest&os=linux64&lang=en-US" # # install firefox RUN set -eux; apt-get update; \ apt-get install -y --no-install-recommends openbox \ xz-utils libgtk-3-0 libdbus-glib-1-2; \ # # fetch latest release wget -O /tmp/firefox-setup.tar.xz "${SRC_URL}"; \ mkdir /usr/lib/firefox; \ tar -xvf /tmp/firefox-setup.tar.xz -C /usr/lib; \ rm -f /tmp/firefox-setup.tar.xz; \ ln -s /usr/lib/firefox/firefox /usr/bin/firefox; \ # # create a profile directory mkdir -p /home/neko/.mozilla/firefox/profile.default/extensions; \ chown -R neko:neko /home/neko/.mozilla/firefox/profile.default; \ # # clean up apt-get --purge autoremove -y xz-utils; \ apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.nvidia.conf /etc/neko/supervisord/firefox.conf COPY neko.js /usr/lib/firefox/mozilla.cfg COPY autoconfig.js /usr/lib/firefox/defaults/pref/autoconfig.js COPY policies.json /usr/lib/firefox/distribution/policies.json COPY --chown=neko profiles.ini /home/neko/.mozilla/firefox/profiles.ini COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/firefox/autoconfig.js ================================================ pref("general.config.obscure_value", 0); pref("general.config.filename", "mozilla.cfg"); ================================================ FILE: apps/firefox/neko.js ================================================ // firefox config for neko lockPref("browser.tabs.closeWindowWithLastTab", false); lockPref("app.update.auto", false); lockPref("app.update.enabled", false); lockPref("app.update.silent", true); lockPref("browser.cache.disk.capacity", 1000); lockPref("browser.download.useDownloadDir", false); lockPref("browser.rights.3.shown", true); lockPref("browser.search.update", false); lockPref("browser.shell.checkDefaultBrowser", false); lockPref("extensions.update.enabled", false); lockPref("plugin.default_plugin_disabled", false); lockPref("plugin.scan.plid.all", true); lockPref("plugins.hide_infobar_for_missing_plugin", true); lockPref("profile.allow_automigration", false); lockPref("signon.prefillForms", false); lockPref("signon.rememberSignons", false); //lockPref("xpinstall.enabled", false); //lockPref("xpinstall.whitelist.required", true); lockPref("browser.download.manager.retention", 0); lockPref("browser.download.folderList", 2); lockPref("browser.download.forbid_open_with", true); lockPref("browser.safebrowsing.downloads.enabled", false); lockPref("browser.safebrowsing.downloads.remote.enabled", false); lockPref("browser.helperApps.alwaysAsk.force", false); lockPref("browser.helperApps.neverAsk.saveToDisk", "application/zip,application/octet-stream,image/jpeg,application/vnd.ms-outlook,text/html,application/pdf"); lockPref("browser.helperApps.neverAsk.openFile", "application/zip,application/octet-stream,image/jpeg,application/vnd.ms-outlook,text/html,application/pdf"); lockPref("browser.newtabpage.activity-stream.default.sites", "https://ipleak.net/,https://www.youtube.com/,https://www.google.com/"); // dark mode lockPref("reader.color_scheme", "dark"); lockPref("devtools.theme", "dark"); lockPref("ui.systemUsesDarkTheme", 1); lockPref("lightweightThemes.usedThemes","[]"); lockPref("lightweightThemes.selectedThemeID", "firefox-compact-dark@mozilla.org"); lockPref("extensions.activeThemeID", "firefox-compact-dark@mozilla.org"); lockPref("browser.theme.toolbar-theme", 0); lockPref("browser.in-content.dark-mode", true); ================================================ FILE: apps/firefox/openbox.xml ================================================ 10 20 no true yes normal yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g leftno rightno upno downno leftno rightno upno downno 1 2 3 4 scrot -s yesyes right left up down true Konqueror kfmclient openProfile filemanagement scrot 1 500 400 false previous next previous next previous next no yes top left right bottom vertical horizontal previous next previous next previous next previous next previous next menu.xml 200 no 100 400 yes yes
================================================ FILE: apps/firefox/policies.json ================================================ { "policies": { "BlockAboutAddons": false, "BlockAboutConfig": true, "BlockAboutProfiles": true, "BlockAboutSupport": true, "Bookmarks": [ { "Title": "IPLeak", "URL": "https://ipleak.net/", "Favicon": "https://ipleak.net/favicon.ico", "Folder": "Pages", "Placement": "toolbar" }, { "Title": "YouTube", "URL": "https://www.youtube.com/", "Favicon": "https://www.youtube.com/favicon.ico", "Folder": "Pages", "Placement": "toolbar" }, { "Title": "Google", "URL": "https://www.google.com/", "Favicon": "https://www.google.com/favicon.ico", "Folder": "Pages", "Placement": "toolbar" } ], "CaptivePortal": false, "DisableAppUpdate": true, "DisableBuiltinPDFViewer": true, "DisableDeveloperTools": false, "DisableFeedbackCommands": true, "DisableFirefoxAccounts": true, "DisableFirefoxScreenshots": true, "DisableFirefoxStudies": true, "DisableForgetButton": true, "DisableMasterPasswordCreation": true, "DisablePocket": true, "DisablePrivateBrowsing": true, "DisableProfileImport": true, "DisableProfileRefresh": true, "DisableSafeMode": true, "DisableSetDesktopBackground": true, "DisableSystemAddonUpdate": true, "DisableTelemetry": true, "DisplayBookmarksToolbar": false, "DontCheckDefaultBrowser": true, "EnableTrackingProtection": { "Cryptomining": true, "Fingerprinting": true, "Value": true }, "ExtensionSettings": { "*": { "installation_mode": "blocked" }, "sponsorBlocker@ajay.app": { "install_url": "https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi", "installation_mode": "force_installed" }, "uBlock0@raymondhill.net": { "install_url": "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi", "installation_mode": "force_installed" } }, "ExtensionUpdate": false, "FirefoxHome": { "Highlights": false, "Pocket": false, "Search": true, "Snippets": false, "TopSites": true }, "FlashPlugin": {}, "HardwareAcceleration": false, "Homepage": { "Additional": [], "StartPage": "home" }, "NewTabPage": true, "NoDefaultBookmarks": true, "OfferToSaveLogins": false, "OfferToSaveLoginsDefault": false, "OverrideFirstRunPage": "", "OverridePostUpdatePage": "", "PasswordManagerEnabled": false, "Permissions": { "Camera": { "BlockNewRequests": true }, "Location": { "BlockNewRequests": true }, "Microphone": { "BlockNewRequests": true }, "Notifications": { "BlockNewRequests": true } }, "Preferences": { "browser.tabs.warnOnClose": false, "browser.urlbar.suggest.bookmark": false, "browser.urlbar.suggest.history": false, "browser.urlbar.suggest.openpage": false, "datareporting.policy.dataSubmissionPolicyBypassNotification": true, "dom.disable_window_flip": true, "dom.disable_window_move_resize": true, "dom.event.contextmenu.enabled": true, "extensions.getAddons.showPane": false, "places.history.enabled": false, "privacy.file_unique_origin": true, "ui.key.menuAccessKeyFocuses": false, "browser.tabs.allowTabDetach": false }, "PromptForDownloadLocation": false, "SanitizeOnShutdown": { "Cache": true, "Cookies": true, "Downloads": true, "FormData": true, "History": true, "OfflineApps": true, "Sessions": true, "SiteSettings": true } } } ================================================ FILE: apps/firefox/profiles.ini ================================================ [General] StartWithLastProfile=1 [Profile0] Name=default IsRelative=1 Path=profile.default Default=1 ================================================ FILE: apps/firefox/supervisord.conf ================================================ [program:firefox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/firefox --no-remote -P default --display=%(ENV_DISPLAY)s -setDefaultBrowser -width 1280 -height 720 stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/firefox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/firefox/supervisord.nvidia.conf ================================================ [program:firefox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/bin/entrypoint.sh /usr/bin/firefox --no-remote -P default --display=%(ENV_DISPLAY)s -setDefaultBrowser -width 1280 -height 720 stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/firefox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/google-chrome/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE ARG SRC_URL="https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" # # install google chrome RUN set -eux; apt-get update; \ wget -O /tmp/google-chrome.deb "${SRC_URL}"; \ apt-get install -y --no-install-recommends openbox /tmp/google-chrome.deb; \ # # clean up apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/google-chrome.conf COPY --chown=neko preferences.json /home/neko/.config/google-chrome/Default/Preferences COPY policies.json /etc/opt/chrome/policies/managed/policies.json COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/google-chrome/Dockerfile.nvidia ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/nvidia-base:latest FROM $BASE_IMAGE # latest working version with EGL: 111.0.5563.146, revert when resolved # 112.0.5615.49 fails: https://github.com/VirtualGL/virtualgl/issues/229 # google does not provide a direct link to the deb file anymore # ARG SRC_URL="https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_111.0.5563.146-1_amd64.deb" ARG SRC_URL="https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" # # install google chrome RUN set -eux; apt-get update; \ wget -O /tmp/google-chrome.deb "${SRC_URL}"; \ apt-get install -y --no-install-recommends openbox /tmp/google-chrome.deb; \ # # clean up apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.nvidia.conf /etc/neko/supervisord/google-chrome.conf COPY --chown=neko preferences.json /home/neko/.config/google-chrome/Default/Preferences COPY policies.json /etc/opt/chrome/policies/managed/policies.json COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/google-chrome/openbox.xml ================================================ 10 20 no true yes normal yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g leftno rightno upno downno leftno rightno upno downno 1 2 3 4 scrot -s yesyes right left up down true Konqueror kfmclient openProfile filemanagement scrot 1 500 400 false previous next previous next previous next no yes top left right bottom vertical horizontal previous next previous next previous next previous next previous next menu.xml 200 no 100 400 yes yes
================================================ FILE: apps/google-chrome/policies.json ================================================ { "AutofillAddressEnabled": false, "AutofillCreditCardEnabled": false, "BrowserSignin": 0, "DefaultNotificationsSetting": 2, "DeveloperToolsAvailability": 2, "EditBookmarksEnabled": false, "FullscreenAllowed": true, "IncognitoModeAvailability": 1, "SyncDisabled": true, "AutoplayAllowed": true, "BrowserAddPersonEnabled": false, "BrowserGuestModeEnabled": false, "DefaultPopupsSetting": 2, "DownloadRestrictions": 3, "VideoCaptureAllowed": true, "AllowFileSelectionDialogs": false, "PromptForDownloadLocation": false, "BookmarkBarEnabled": false, "PasswordManagerEnabled": false, "URLAllowlist": [ "file:///home/neko/Downloads" ], "URLBlocklist": [ "file://*", "chrome://policy" ], "ExtensionInstallForcelist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm;https://clients2.google.com/service/update2/crx", "mnjggcdmjocbbbhaepdhchncahnbgone;https://clients2.google.com/service/update2/crx" ], "ExtensionInstallAllowlist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm", "mnjggcdmjocbbbhaepdhchncahnbgone" ], "ExtensionInstallBlocklist": [ "*" ] } ================================================ FILE: apps/google-chrome/preferences.json ================================================ { "homepage": "http://www.google.com", "homepage_is_newtabpage": false, "first_run_tabs": [ "https://www.google.com/_/chrome/newtab?ie=UTF-8" ], "custom_links": { "initialized": true, "list": [ { "title": "YouTube", "url": "https://www.youtube.com/" }, { "title": "Netflix", "url": "https://netflix.com" }, { "title": "Hulu", "url": "https://www.hulu.com/" }, { "title": "9Anime", "url": "https://9anime.to/" }, { "title": "Crunchy Roll", "url": "https://www.crunchyroll.com/" }, { "title": "Funimation", "url": "https://www.funimation.com/" }, { "title": "Disney+", "url": "https://www.disneyplus.com/" }, { "title": "HBO Now", "url": "https://play.hbonow.com/" }, { "title": "Amazon Video", "url": "https://www.amazon.com/Amazon-Video/b?node=2858778011" }, { "title": "VRV", "url": "https://vrv.co/" }, { "title": "Twitch", "url": "https://www.twitch.tv/" }, { "title": "Mixer", "url": "https://mixer.com/" } ] }, "browser": { "custom_chrome_frame": false, "show_home_button": true, "window_placement": { "maximized": true } }, "bookmark_bar": { "show_on_all_tabs": false }, "sync_promo": { "show_on_first_run_allowed": false }, "distribution": { "import_bookmarks_from_file": "bookmarks.html", "import_bookmarks": true, "import_history": true, "import_home_page": true, "import_search_engine": true, "ping_delay": 60, "do_not_create_desktop_shortcut": true, "do_not_create_quick_launch_shortcut": true, "do_not_create_taskbar_shortcut": true, "do_not_launch_chrome": true, "do_not_register_for_update_launch": true, "make_chrome_default": true, "make_chrome_default_for_user": true, "system_level": false, "verbose_logging": false }, "profile": { "avatar_index": 19, "default_content_setting_values": { "clipboard": 2, "cookies": 4, "geolocation": 2, "media_stream_camera": 2, "media_stream_mic": 2, "midi_sysex": 2, "payment_handler": 2, "usb_guard": 2 }, "name": "neko", "using_default_avatar": false, "using_default_name": false, "using_gaia_avatar": false }, "signin": { "allowed": false } } ================================================ FILE: apps/google-chrome/supervisord.conf ================================================ [program:google-chrome] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/google-chrome --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/google-chrome --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/google-chrome.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/google-chrome/supervisord.nvidia.conf ================================================ [program:google-chrome] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/bin/entrypoint.sh /usr/bin/google-chrome --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/chromium --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --enable-features=Vulkan,UseSkiaRenderer,VaapiVideoEncoder,VaapiVideoDecoder,CanvasOopRasterization --ignore-gpu-blocklist --disable-seccomp-filter-sandbox --use-angle=vulkan --disable-software-rasterizer --disable-dev-shm-usage --disable-vulkan-surface --enable-unsafe-webgpu stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/google-chrome.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/kde/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE # # install kde RUN set -eux; apt-get update; \ apt-get install -y --no-install-recommends kde-full kwin-x11 sudo; \ # # add user to sudoers usermod -aG sudo neko; \ echo "neko:neko" | chpasswd; \ echo "%sudo ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers; \ # clean up apt remove xserver-xorg-legacy -y; \ apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # disable autolock RUN kwriteconfig5 --file /home/neko/.config/kscreenlockerrc --group Daemon --key Autolock false; \ chown neko:neko /home/neko/.config/kscreenlockerrc # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/kde.conf ================================================ FILE: apps/kde/supervisord.conf ================================================ [program:kde] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/startplasma-x11 stopsignal=INT autorestart=true priority=500 user=%(ENV_USER)s stdout_logfile=/var/log/neko/kde.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:kwin] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/kwin_x11 stopsignal=INT autorestart=true priority=500 user=%(ENV_USER)s stdout_logfile=/var/log/neko/kwin.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/microsoft-edge/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE ARG API_URL="https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/" # # install microsoft edge RUN set -eux; apt-get update; \ # # fetch latest release SRC_URL="${API_URL}$(wget -O - "${API_URL}" 2>/dev/null | sed -n 's/.*href="\([^"]*\).*/\1/p' | sort --version-sort | tail -1)"; \ wget -O /tmp/microsoft-edge.deb "${SRC_URL}"; \ apt-get install -y --no-install-recommends openbox /tmp/microsoft-edge.deb; \ # # clean up apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/microsoft-edge.conf COPY --chown=neko preferences.json /home/neko/.config/microsoft-edge/Default/Preferences COPY policies.json /etc/opt/edge/policies/managed/policies.json COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/microsoft-edge/Dockerfile.nvidia ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE ARG API_URL="https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/" # # install microsoft edge RUN set -eux; apt-get update; \ # # fetch latest release SRC_URL="${API_URL}$(wget -O - "${API_URL}" 2>/dev/null | sed -n 's/.*href="\([^"]*\).*/\1/p' | sort --version-sort | tail -1)"; \ wget -O /tmp/microsoft-edge.deb "${SRC_URL}"; \ apt-get install -y --no-install-recommends openbox /tmp/microsoft-edge.deb; \ # # clean up apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.nvidia.conf /etc/neko/supervisord/microsoft-edge.conf COPY --chown=neko preferences.json /home/neko/.config/microsoft-edge/Default/Preferences COPY policies.json /etc/opt/edge/policies/managed/policies.json COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/microsoft-edge/openbox.xml ================================================ 10 20 no true yes normal yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g leftno rightno upno downno leftno rightno upno downno 1 2 3 4 scrot -s yesyes right left up down true Konqueror kfmclient openProfile filemanagement scrot 1 500 400 false previous next previous next previous next no yes top left right bottom vertical horizontal previous next previous next previous next previous next previous next menu.xml 200 no 100 400 yes yes
================================================ FILE: apps/microsoft-edge/policies.json ================================================ { "AutofillAddressEnabled": false, "AutofillCreditCardEnabled": false, "BrowserSignin": 0, "DefaultNotificationsSetting": 2, "DeveloperToolsAvailability": 2, "EditBookmarksEnabled": false, "FullscreenAllowed": true, "IncognitoModeAvailability": 1, "SyncDisabled": true, "AutoplayAllowed": true, "BrowserAddPersonEnabled": false, "BrowserGuestModeEnabled": false, "DefaultPopupsSetting": 2, "DownloadRestrictions": 3, "VideoCaptureAllowed": true, "AllowFileSelectionDialogs": false, "PromptForDownloadLocation": false, "BookmarkBarEnabled": false, "PasswordManagerEnabled": false, "URLAllowlist": [ "file:///home/neko/Downloads" ], "URLBlocklist": [ "file://*", "edge://policy" ], "ExtensionInstallForcelist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm;https://clients2.google.com/service/update2/crx", "mnjggcdmjocbbbhaepdhchncahnbgone;https://clients2.google.com/service/update2/crx" ], "ExtensionInstallAllowlist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm", "mnjggcdmjocbbbhaepdhchncahnbgone" ], "ExtensionInstallBlocklist": [ "*" ] } ================================================ FILE: apps/microsoft-edge/preferences.json ================================================ { "homepage": "http://www.google.com", "homepage_is_newtabpage": false, "first_run_tabs": [ "https://www.google.com/_/chrome/newtab?ie=UTF-8" ], "custom_links": { "initialized": true, "list": [ { "title": "YouTube", "url": "https://www.youtube.com/" }, { "title": "Netflix", "url": "https://netflix.com" }, { "title": "Hulu", "url": "https://www.hulu.com/" }, { "title": "9Anime", "url": "https://9anime.to/" }, { "title": "Crunchy Roll", "url": "https://www.crunchyroll.com/" }, { "title": "Funimation", "url": "https://www.funimation.com/" }, { "title": "Disney+", "url": "https://www.disneyplus.com/" }, { "title": "HBO Now", "url": "https://play.hbonow.com/" }, { "title": "Amazon Video", "url": "https://www.amazon.com/Amazon-Video/b?node=2858778011" }, { "title": "VRV", "url": "https://vrv.co/" }, { "title": "Twitch", "url": "https://www.twitch.tv/" }, { "title": "Mixer", "url": "https://mixer.com/" } ] }, "browser": { "custom_chrome_frame": false, "show_home_button": true, "window_placement": { "maximized": true } }, "bookmark_bar": { "show_on_all_tabs": false }, "sync_promo": { "show_on_first_run_allowed": false }, "distribution": { "import_bookmarks_from_file": "bookmarks.html", "import_bookmarks": true, "import_history": true, "import_home_page": true, "import_search_engine": true, "ping_delay": 60, "do_not_create_desktop_shortcut": true, "do_not_create_quick_launch_shortcut": true, "do_not_create_taskbar_shortcut": true, "do_not_launch_chrome": true, "do_not_register_for_update_launch": true, "make_chrome_default": true, "make_chrome_default_for_user": true, "system_level": false, "verbose_logging": false }, "profile": { "avatar_index": 19, "default_content_setting_values": { "clipboard": 2, "cookies": 4, "geolocation": 2, "media_stream_camera": 2, "media_stream_mic": 2, "midi_sysex": 2, "payment_handler": 2, "usb_guard": 2 }, "name": "neko", "using_default_avatar": false, "using_default_name": false, "using_gaia_avatar": false }, "signin": { "allowed": false } } ================================================ FILE: apps/microsoft-edge/supervisord.conf ================================================ [program:microsoft-edge] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/microsoft-edge --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/microsoft-edge --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/microsoft-edge.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/microsoft-edge/supervisord.nvidia.conf ================================================ [program:microsoft-edge] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/bin/entrypoint.sh /usr/bin/microsoft-edge --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/microsoft-edge --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --enable-features=Vulkan,UseSkiaRenderer,VaapiVideoEncoder,VaapiVideoDecoder,CanvasOopRasterization --ignore-gpu-blocklist --disable-seccomp-filter-sandbox --use-angle=vulkan --disable-software-rasterizer --disable-dev-shm-usage --disable-vulkan-surface --enable-unsafe-webgpu stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/microsoft-edge.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/opera/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE ARG API_URL="https://download5.operacdn.com/pub/opera/desktop/" COPY fix-ffmpeg-widevine.sh /tmp/fix-ffmpeg-widevine.sh # # install opera RUN set -eux; apt-get update; \ # # fetch latest available release with linux package VERSIONS="$(wget -O - "${API_URL}" 2>/dev/null | sed -n 's/.*href="\([^"/]*\).*/\1/p' | sort --version-sort -r | head -n 10)"; \ VERSION=""; \ for v in $VERSIONS; do \ if wget --spider "${API_URL}${v}/linux/opera-stable_${v}_amd64.deb" 2>/dev/null; then \ VERSION="$v"; \ break; \ fi; \ done; \ if [ -z "$VERSION" ]; then \ echo "No Opera version with Linux package found"; \ exit 1; \ fi; \ echo "Using Opera version: $VERSION"; \ wget -O /tmp/opera.deb "${API_URL}${VERSION}/linux/opera-stable_${VERSION}_amd64.deb"; \ apt-get install -y --no-install-recommends openbox curl jq unzip /tmp/opera.deb; \ /tmp/fix-ffmpeg-widevine.sh; \ rm -f /tmp/opera.deb /tmp/fix-ffmpeg-widevine.sh; \ # # clean up apt-get --purge autoremove -y curl jq unzip; \ apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/opera.conf COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/opera/fix-ffmpeg-widevine.sh ================================================ #!/bin/bash # From https://github.com/Ld-Hagen/fix-opera-linux-ffmpeg-widevine. # Config section readonly FIX_FFMPEG=true readonly FIX_WIDEVINE=true readonly FIX_DIR='/tmp/opera-fix' # readonly FFMPEG_SRC_MAIN='https://api.github.com/repos/nwjs-ffmpeg-prebuilt/nwjs-ffmpeg-prebuilt/releases' readonly FFMPEG_SRC_MAIN='https://api.github.com/repos/Ld-Hagen/nwjs-ffmpeg-prebuilt/releases' readonly FFMPEG_SRC_ALT='https://api.github.com/repos/Ld-Hagen/fix-opera-linux-ffmpeg-widevine/releases' readonly WIDEVINE_SRC='https://raw.githubusercontent.com/mozilla-firefox/firefox/refs/heads/main/toolkit/content/gmp-sources/widevinecdm.json' readonly FFMPEG_SO_NAME='libffmpeg.so' readonly WIDEVINE_SO_NAME='libwidevinecdm.so' readonly WIDEVINE_MANIFEST_NAME='manifest.json' OPERA_VERSIONS=() if [ -x "$(command -v opera)" ]; then OPERA_VERSIONS+=("opera") fi if [ -x "$(command -v opera-beta)" ]; then OPERA_VERSIONS+=("opera-beta") fi # Getting download links printf 'Getting download links...\n' ## ffmpeg if $FIX_FFMPEG; then readonly FFMPEG_URL_MAIN=$(curl -sL4 $FFMPEG_SRC_MAIN | jq -rS 'sort_by(.published_at) | .[-1].assets[0].browser_download_url') readonly FFMPEG_URL_ALT=$(curl -sL4 $FFMPEG_SRC_ALT | jq -rS 'sort_by(.published_at) | .[-1].assets[0].browser_download_url') [[ $(basename $FFMPEG_URL_ALT) < $(basename $FFMPEG_URL_MAIN) ]] && readonly FFMPEG_URL=$FFMPEG_URL_MAIN || readonly FFMPEG_URL=$FFMPEG_URL_ALT if [[ -z $FFMPEG_URL ]]; then printf 'Failed to get ffmpeg download URL. Exiting...\n' exit 1 fi fi ## Widevine if $FIX_WIDEVINE; then readonly WIDEVINE_URL=$(curl -sL4 $WIDEVINE_SRC | jq -r '.vendors."gmp-widevinecdm".platforms."Linux_x86_64-gcc3".mirrorUrls[0]') fi # Downloading files printf 'Downloading files...\n' mkdir -p "$FIX_DIR" ## ffmpeg if $FIX_FFMPEG; then curl -L4 --progress-bar $FFMPEG_URL -o "$FIX_DIR/ffmpeg.zip" if [ $? -ne 0 ]; then printf 'Failed to download ffmpeg. Check your internet connection or try later\n' exit 1 fi fi ## Widevine if $FIX_WIDEVINE; then curl -L4 --progress-bar "$WIDEVINE_URL" -o "$FIX_DIR/widevine.zip" if [ $? -ne 0 ]; then printf 'Failed to download Widevine CDM. Check your internet connection or try later\n' exit 1 fi fi # Extracting files ## ffmpeg if $FIX_FFMPEG; then echo "Extracting ffmpeg..." unzip -o "$FIX_DIR/ffmpeg.zip" -d $FIX_DIR > /dev/null fi ## Widevine if $FIX_WIDEVINE; then echo "Extracting WidevineCDM..." unzip -oj "$FIX_DIR/widevine.zip" -d $FIX_DIR > /dev/null 2>/dev/null fi for opera in ${OPERA_VERSIONS[@]}; do echo "Doing $opera" EXECUTABLE=$(command -v "$opera") OPERA_DIR=$(dirname $(readlink -f $EXECUTABLE)) OPERA_LIB_DIR="$OPERA_DIR/lib_extra" OPERA_WIDEVINE_DIR="$OPERA_LIB_DIR/WidevineCdm" OPERA_WIDEVINE_SO_DIR="$OPERA_WIDEVINE_DIR/_platform_specific/linux_x64" OPERA_WIDEVINE_CONFIG="$OPERA_DIR/resources/widevine_config.json" # Removing old libraries and preparing directories printf 'Removing old libraries & making directories...\n' ## ffmpeg if $FIX_FFMPEG; then rm -f "$OPERA_LIB_DIR/$FFMPEG_SO_NAME" mkdir -p "$OPERA_LIB_DIR" fi ## Widevine if $FIX_WIDEVINE; then rm -rf "$OPERA_WIDEVINE_DIR" mkdir -p "$OPERA_WIDEVINE_SO_DIR" fi # Moving libraries to their place printf 'Moving libraries to their places...\n' ## ffmpeg if $FIX_FFMPEG; then cp -f "$FIX_DIR/$FFMPEG_SO_NAME" "$OPERA_LIB_DIR" chmod 0644 "$OPERA_LIB_DIR/$FFMPEG_SO_NAME" fi ## Widevine if $FIX_WIDEVINE; then cp -f "$FIX_DIR/$WIDEVINE_SO_NAME" "$OPERA_WIDEVINE_SO_DIR" chmod 0644 "$OPERA_WIDEVINE_SO_DIR/$WIDEVINE_SO_NAME" cp -f "$FIX_DIR/$WIDEVINE_MANIFEST_NAME" "$OPERA_WIDEVINE_DIR" chmod 0644 "$OPERA_WIDEVINE_DIR/$WIDEVINE_MANIFEST_NAME" printf "[\n {\n \"preload\": \"$OPERA_WIDEVINE_DIR\"\n }\n]\n" > "$OPERA_WIDEVINE_CONFIG" fi done # Removing temporary files printf 'Removing temporary files...\n' rm -rf "$FIX_DIR" ================================================ FILE: apps/opera/openbox.xml ================================================ 10 20 no true yes normal yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g leftno rightno upno downno leftno rightno upno downno 1 2 3 4 scrot -s yesyes right left up down true Konqueror kfmclient openProfile filemanagement scrot 1 500 400 false previous next previous next previous next no yes top left right bottom vertical horizontal previous next previous next previous next previous next previous next menu.xml 200 no 100 400 yes yes
================================================ FILE: apps/opera/supervisord.conf ================================================ [program:opera] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/opera --no-sandbox --no-first-run --start-maximized --force-dark-mode --disable-gpu stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/opera.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/remmina/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE # install remmina RUN set -eux; apt-get update; \ apt-get install -y --no-install-recommends \ remmina-plugin-rdp remmina-plugin-vnc \ # remmina-plugin-x2go # not in bullseye remmina-plugin-spice remmina-plugin-nx; \ # clean up apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # copy configuation files COPY supervisord.conf /etc/neko/supervisord/remmina.conf COPY --chown=neko remmina.pref /home/neko/.config/remmina/remmina.pref COPY --chown=neko rdp.remmina spice.remmina vnc.remmina /home/neko/.local/share/remmina/ COPY run-remmina.sh /usr/bin/run-remmina.sh ENV REMMINA_URL= ENV REMMINA_PROFILE= ================================================ FILE: apps/remmina/rdp.remmina ================================================ [remmina] password= gateway_username= notes_text= vc= preferipv6=0 ssh_tunnel_loopback=0 serialname= sound=local printer_overrides= name=rdpdefault console=0 colordepth=99 security= precommand= disable_fastpath=0 left-handed=0 postcommand= multitransport=0 group= server= ssh_tunnel_certfile= glyph-cache=0 ssh_tunnel_enabled=0 disableclipboard=0 audio-output= parallelpath= monitorids= cert_ignore=0 gateway_server= serialpermissive=0 protocol=RDP old-license=0 ssh_tunnel_password= resolution_mode=2 pth= loadbalanceinfo= disableautoreconnect=0 clientname= clientbuild= resolution_width=0 drive= relax-order-checks=0 username= base-cred-for-gw=0 gateway_domain= network=none rdp2tcp= gateway_password= serialdriver= domain= profile-lock=0 rdp_reconnect_attempts= restricted-admin=0 multimon=0 exec= smartcardname= serialpath= enable-autostart=0 usb= shareprinter=0 ssh_tunnel_passphrase= shareparallel=0 disablepasswordstoring=0 quality=0 span=0 parallelname= ssh_tunnel_auth=0 keymap= ssh_tunnel_username= execpath= shareserial=0 resolution_height=0 timeout= useproxyenv=0 sharesmartcard=0 freerdp_log_filters= microphone= dvc= ssh_tunnel_privatekey= gwtransp=http ssh_tunnel_server= ignore-tls-errors=1 disable-smooth-scrolling=0 gateway_usage=0 websockets=0 freerdp_log_level=INFO window_maximize=1 scale=1 viewmode=4 ================================================ FILE: apps/remmina/remmina.pref ================================================ [remmina_pref] secret=Jsh7BJPwHqLCKi2vdkMAImSgdBVZGF6s8VbUPY3Q9WA= datadir_path= remmina_file_name=%G_%P_%N_%h screenshot_path= screenshot_name= deny_screenshot_clipboard=true save_view_mode=true use_master_password=false unlock_timeout=0 unlock_password= trust_all=true floating_toolbar_placement=0 toolbar_placement=3 prevent_snap_welcome_message=true last_quickconnect_protocol= fullscreen_on_auto=true always_show_tab=false hide_connection_toolbar=true hide_searchbar=true default_action=0 scale_quality=3 ssh_loglevel=1 ssh_parseconfig=true hide_toolbar=true small_toolbutton=true view_file_mode=0 resolutions=640x480,800x600,1024x768,1152x864,1280x960,1400x1050 keystrokes= main_width=600 main_height=400 main_maximize=true main_sort_column_id=1 main_sort_order=0 expanded_group= toolbar_pin_down=false sshtunnel_port=4732 ssh_tcp_keepidle=20 ssh_tcp_keepintvl=10 ssh_tcp_keepcnt=3 ssh_tcp_usrtimeout=60000 applet_new_ontop=false applet_hide_count=true applet_enable_avahi=false disable_tray_icon=true dark_tray_icon=false recent_maximum=10 default_mode=3 tab_mode=0 fullscreen_toolbar_visibility=2 auto_scroll_step=10 hostkey=65508 shortcutkey_fullscreen= shortcutkey_autofit= shortcutkey_nexttab= shortcutkey_prevtab= shortcutkey_scale= shortcutkey_grab=65508 shortcutkey_viewonly=109 shortcutkey_screenshot= shortcutkey_minimize=65478 shortcutkey_disconnect=65473 shortcutkey_toolbar=116 vte_font= vte_allow_bold_text=true vte_lines=512 [ssh_colors] background=#d5ccba cursor=#45373c bold=#45373c foreground=#45373c color0=#20111b color1=#be100e color2=#858162 color3=#eaa549 color4=#426a79 color5=#97522c color6=#989a9c color7=#968c83 color8=#5e5252 color9=#be100e color10=#858162 color11=#eaa549 color12=#426a79 color13=#97522c color14=#989a9c color15=#d5ccba [usage_stats] periodic_usage_stats_permitted=false periodic_usage_stats_last_sent=0 periodic_usage_stats_uuid_prefix= [remmina_news] periodic_news_permitted=false periodic_rmnews_last_get=0 periodic_rmnews_get_count=1 periodic_rmnews_uuid_prefix= [remmina] name= ignore-tls-errors=1 ================================================ FILE: apps/remmina/run-remmina.sh ================================================ #!/bin/bash err() { echo "ERROR: $*" >&2 exit 1 } profile_dir="/home/neko/.local/share/remmina" if [[ -n "$REMMINA_PROFILE" ]]; then profile=${REMMINA_PROFILE%.remmina}.remmina file=${profile##/*/} [[ "$file" = "$profile" ]] && profile="$profile_dir"/"$file" [[ -f "$profile" ]] || err "Connection profile $profile not found" echo "Running remmina with connection profile $profile" exec remmina -c "$profile" fi if [[ ! -z "$REMMINA_URL" ]]; then readarray -t arr < <( echo -n "$REMMINA_URL" | perl -pe 's|^(\w+)\:\/\/(?:([^:]+)(?::([^@]+))?@)?(.*)$|\1\n\2\n\3\n\4|' ) proto="${arr[0]}" user="${arr[1]}" pw="${arr[2]}" host="${arr[3]}" echo "Parsed url in 'REMMINA_URL': proto:$proto username:$user host:$host" [[ "$proto" != "vnc" && "$proto" != "rdp" && "$proto" != "spice" ]] && err "Unsupported protocol $proto in connection url 'REMMINA_URL'" profile="$profile_dir"/"$proto".remmina remmina --set-option username="$user" --update-profile "$profile" remmina --set-option password="$pw" --update-profile "$profile" remmina --set-option server="$host" --update-profile "$profile" # remmina --set-option window_maximize=1 --update-profile "$profile" # remmina --set-option scale=1 --update-profile "$profile" echo "Running remmina with URL $REMMINA_URL" exec remmina -c "$profile" fi echo "Running remmina without connection profile" exec remmina ================================================ FILE: apps/remmina/spice.remmina ================================================ [remmina] disablegstvideooverlay=0 disablepasswordstoring=0 sharesmartcard=0 videocodec=0 ssh_tunnel_password= postcommand= server= name=spicedefault ssh_tunnel_enabled=0 profile-lock=0 enable-autostart=0 imagecompression=0 password= precommand= disableclipboard=0 group= ssh_tunnel_certfile= protocol=SPICE enableaudio=1 viewonly=0 ssh_tunnel_server= ssh_tunnel_loopback=0 ssh_tunnel_auth=0 ignore-tls-errors=1 ssh_tunnel_username= ssh_tunnel_passphrase= ssh_tunnel_privatekey= notes_text= usetls=0 window_maximize=1 scale=1 viewmode=4 ================================================ FILE: apps/remmina/supervisord.conf ================================================ [program:remmina] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/run-remmina.sh stopsignal=INT autorestart=true priority=500 user=%(ENV_USER)s stdout_logfile=/var/log/neko/remmina.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/remmina/vnc.remmina ================================================ [remmina] encodings= videocodec=0 name=temp eos ssh_tunnel_server= ssh_tunnel_privatekey= password= quality=0 disablesmoothscrolling=0 enableaudio=1 precommand= disablegstvideooverlay=0 ssh_tunnel_enabled=0 sharesmartcard=0 imagecompression=0 ssh_tunnel_passphrase= ssh_tunnel_password= usetls=0 viewonly=0 disableserverinput=0 depth_profile=0 postcommand= tightencoding=0 disablepasswordstoring=0 lossy_encoding=0 ignore-tls-errors=1 gvncdebug=0 ssh_tunnel_username= server= disableclipboard=0 disableserverbell=0 profile-lock=0 enable-autostart=0 window_maximize=1 scale=1 disableencryption=0 ssh_tunnel_auth=0 group= ssh_tunnel_loopback=0 showcursor=1 viewmode=4 notes_text= keymap= colordepth=32 proxy= protocol=VNC ssh_tunnel_certfile= shared=0 username= ================================================ FILE: apps/tor-browser/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE # # install dependencies RUN set -eux; apt-get update; \ apt-get install -y --no-install-recommends openbox curl xz-utils file libgtk-3-0 libdbus-glib-1-2; \ # # download TOR browser DOWNLOAD_URI="$(curl -s -N https://www.torproject.org/download/ | grep -Po -m 1 '(?=(dist/torbrowser)).*(?<=.tar.xz)')"; \ echo "Downloading $DOWNLOAD_URI"; \ curl -sSL -o /tmp/tor.tar.xz "https://www.torproject.org/$DOWNLOAD_URI"; \ tar -xvJf /tmp/tor.tar.xz -C /opt; \ mv /opt/tor-browser* /opt/tor-browser_en-US; \ chown -R neko:neko /opt/tor-browser_en-US/; \ rm -f /tmp/tor.tar.xz; \ # # clean up apt-get --purge autoremove -y curl xz-utils; \ apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/*; # # copy configuation file COPY supervisord.conf /etc/neko/supervisord/tor-browser.conf COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/tor-browser/openbox.xml ================================================ 10 20 no true yes normal yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g leftno rightno upno downno leftno rightno upno downno 1 2 3 4 scrot -s yesyes right left up down true Konqueror kfmclient openProfile filemanagement scrot 1 500 400 false previous next previous next previous next no yes top left right bottom vertical horizontal previous next previous next previous next previous next previous next menu.xml 200 no 100 400 yes yes
================================================ FILE: apps/tor-browser/supervisord.conf ================================================ [program:tor-browser] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/opt/tor-browser_en-US/Browser/start-tor-browser --display=%(ENV_DISPLAY)s --setDefaultBrowser --window-size 1280,720 stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/tor-browser.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true stderr_logfile=/var/log/neko/tor-browser.err.log stderr_logfile_maxbytes=100MB stderr_logfile_backups=10 [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/ungoogled-chromium/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE ARG API_URL="https://api.github.com/repos/macchrome/linchrome/releases/latest" COPY ./widevinecdm.sh /widevine.sh # # install custom chromium build from woolyss with support for hevc/x265 SHELL ["/bin/bash", "-c"] RUN set -eux; apt-get update; \ apt-get install -y --no-install-recommends wget unzip libatk1.0-0 libatk-bridge2.0-0 libatomic1 \ libcups2 libgtk-3-0 libnss3 libpci3 libxcomposite1 libxss1 openbox xz-utils jq; \ # # fetch latest release SRC_URL="$(wget -O - "${API_URL}" 2>/dev/null | jq -r "[.assets[] | select(.browser_download_url | contains(\"tar.xz\"))][-1] | .browser_download_url")"; \ wget -O - /tmp/chromium.tar.xz "${SRC_URL}" | tar -xJf- -C /tmp; \ mv /tmp/ungoogled-chromium_* /usr/lib/chromium; \ # # make required changes for sandbox mode mv /usr/lib/chromium/chrome_sandbox /usr/lib/chromium/chrome-sandbox; \ chown root:root /usr/lib/chromium/chrome-sandbox; \ chmod 4755 /usr/lib/chromium/chrome-sandbox; \ # # install widevine module CHROMIUM_DIR="/usr/lib/chromium"; \ ./widevine.sh "${CHROMIUM_DIR}/WidevineCdm"; \ rm -f /widevine.sh; \ # # install latest version of uBlock Origin and SponsorBlock for YouTube CHROMIUM_VERSION="$(wget -O - "${API_URL}" 2>/dev/null | jq -r ".tag_name" | sed -e 's/v//' -e 's/-.*//')"; \ EXTENSIONS_DIR="/usr/share/chromium/extensions"; \ EXTENSIONS=( \ cjpalhdlnbpafiamejdnhcphjbkeiagm \ mnjggcdmjocbbbhaepdhchncahnbgone \ ); \ mkdir -p "${EXTENSIONS_DIR}"; \ for EXT_ID in "${EXTENSIONS[@]}"; \ do \ EXT_URL="https://clients2.google.com/service/update2/crx?response=redirect&nacl_arch=x86-64&prodversion=${CHROMIUM_VERSION}&acceptformat=crx2,crx3&x=id%3D${EXT_ID}%26installsource%3Dondemand%26uc"; \ EXT_PATH="${EXTENSIONS_DIR}/${EXT_ID}.crx"; \ wget -O "${EXT_PATH}" "${EXT_URL}"; \ EXT_VERSION="$(unzip -p "${EXT_PATH}" manifest.json 2>/dev/null | jq -r ".version")"; \ echo -e "{\n \"external_crx\": \"${EXT_PATH}\",\n \"external_version\": \"${EXT_VERSION}\"\n}" > "${EXTENSIONS_DIR}"/"${EXT_ID}".json; \ done; \ # # clean up apt-get --purge autoremove -y xz-utils jq; \ apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/ungoogled-chromium.conf COPY preferences.json /usr/lib/chromium/master_preferences COPY policies.json /etc/chromium/policies/managed/policies.json COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/ungoogled-chromium/openbox.xml ================================================ 10 20 no true yes normal yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g leftno rightno upno downno leftno rightno upno downno 1 2 3 4 scrot -s yesyes right left up down true Konqueror kfmclient openProfile filemanagement scrot 1 500 400 false previous next previous next previous next no yes top left right bottom vertical horizontal previous next previous next previous next previous next previous next menu.xml 200 no 100 400 yes yes
================================================ FILE: apps/ungoogled-chromium/policies.json ================================================ { "AutofillAddressEnabled": false, "AutofillCreditCardEnabled": false, "BrowserSignin": 0, "DefaultNotificationsSetting": 2, "DeveloperToolsAvailability": 2, "EditBookmarksEnabled": false, "FullscreenAllowed": true, "IncognitoModeAvailability": 1, "SyncDisabled": true, "AutoplayAllowed": true, "BrowserAddPersonEnabled": false, "BrowserGuestModeEnabled": false, "DefaultPopupsSetting": 2, "DownloadRestrictions": 3, "VideoCaptureAllowed": true, "AllowFileSelectionDialogs": false, "PromptForDownloadLocation": false, "BookmarkBarEnabled": false, "PasswordManagerEnabled": false, "URLAllowlist": [ "file:///home/neko/Downloads" ], "URLBlocklist": [ "file://*", "chrome://policy" ], "ExtensionInstallAllowlist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm", "mnjggcdmjocbbbhaepdhchncahnbgone" ], "ExtensionInstallBlocklist": [ "*" ] } ================================================ FILE: apps/ungoogled-chromium/preferences.json ================================================ { "homepage": "https://duckduckgo.com/", "homepage_is_newtabpage": false, "first_run_tabs": [ "https://duckduckgo.com/" ], "custom_links": { "initialized": true, "list": [ { "title": "YouTube", "url": "https://www.youtube.com/" }, { "title": "Netflix", "url": "https://netflix.com" }, { "title": "Hulu", "url": "https://www.hulu.com/" }, { "title": "9Anime", "url": "https://9anime.to/" }, { "title": "Crunchy Roll", "url": "https://www.crunchyroll.com/" }, { "title": "Funimation", "url": "https://www.funimation.com/" }, { "title": "Disney+", "url": "https://www.disneyplus.com/" }, { "title": "HBO Now", "url": "https://play.hbonow.com/" }, { "title": "Amazon Video", "url": "https://www.amazon.com/Amazon-Video/b?node=2858778011" }, { "title": "VRV", "url": "https://vrv.co/" }, { "title": "Twitch", "url": "https://www.twitch.tv/" }, { "title": "Mixer", "url": "https://mixer.com/" } ] }, "browser": { "custom_chrome_frame": false, "show_home_button": true, "window_placement": { "maximized": true } }, "bookmark_bar": { "show_on_all_tabs": false }, "sync_promo": { "show_on_first_run_allowed": false }, "distribution": { "import_bookmarks_from_file": "bookmarks.html", "import_bookmarks": true, "import_history": true, "import_home_page": true, "import_search_engine": true, "ping_delay": 60, "do_not_create_desktop_shortcut": true, "do_not_create_quick_launch_shortcut": true, "do_not_create_taskbar_shortcut": true, "do_not_launch_chrome": true, "do_not_register_for_update_launch": true, "make_chrome_default": true, "make_chrome_default_for_user": true, "system_level": false, "verbose_logging": false }, "profile": { "avatar_index": 19, "default_content_setting_values": { "clipboard": 2, "cookies": 4, "geolocation": 2, "media_stream_camera": 2, "media_stream_mic": 2, "midi_sysex": 2, "payment_handler": 2, "usb_guard": 2 }, "name": "neko", "using_default_avatar": false, "using_default_name": false, "using_gaia_avatar": false }, "signin": { "allowed": false } } ================================================ FILE: apps/ungoogled-chromium/supervisord.conf ================================================ [program:ungoogled-chromium] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/lib/chromium/chrome-wrapper --window-position=0,0 --display=%(ENV_DISPLAY)s --start-maximized --bwsi --test-type --force-dark-mode --disable-file-system --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/ungoogled-chromium.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/ungoogled-chromium/widevinecdm.sh ================================================ #!/usr/bin/env bash set -e TARGET_DIR="$(realpath "$1")" if [ -z "$TARGET_DIR" ]; then echo "Usage: $0 /path/to/install/WidevineCdm" exit 1 fi TMPDIR=$(mktemp -d) cd "$TMPDIR" function cleanup { rm -rf "$TMPDIR" } trap cleanup EXIT # Fetch manifest and extract URL URL=$(python3 -c " import json, urllib.request data = json.load(urllib.request.urlopen('https://raw.githubusercontent.com/mozilla/gecko-dev/master/toolkit/content/gmp-sources/widevinecdm.json')) for v in data['vendors'].values(): for k, p in v['platforms'].items(): if 'Linux_x86_64-gcc3' in k: print(p['fileUrl']) break ") # Download CRX curl -L -o widevinecdm.crx "$URL" # Install go-crx3 echo "Fetching latest go-crx3 version..." VERSION=$(curl -s https://api.github.com/repos/m1k1o/go-crx3/releases/latest | grep 'tag_name' | cut -d '"' -f4) ARTIFACT="go-crx3_${VERSION#v}_linux_amd64.tar.gz" URL="https://github.com/m1k1o/go-crx3/releases/download/${VERSION}/${ARTIFACT}" echo "Downloading $URL" curl -L -o "$ARTIFACT" "$URL" tar -xzf "$ARTIFACT" # Unpack with go-crx3 ./go-crx3 unpack widevinecdm.crx mkdir -p "$TARGET_DIR" cp -ar widevinecdm/* "$TARGET_DIR" ================================================ FILE: apps/vivaldi/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE # # install vivaldi SHELL ["/bin/bash", "-c"] RUN set -eux; apt-get update; \ ARCH=$(dpkg --print-architecture); \ wget -O /tmp/vivaldi.deb "https://downloads.vivaldi.com/stable/vivaldi-stable_${ARCH}.deb"; \ apt-get install -y --no-install-recommends wget unzip xz-utils jq openbox; \ apt install -y --no-install-recommends /tmp/vivaldi.deb; \ # # install latest version of uBlock Origin and SponsorBlock for YouTube EXTENSIONS_DIR="/usr/share/chromium/extensions"; \ EXTENSIONS=( \ cjpalhdlnbpafiamejdnhcphjbkeiagm \ mnjggcdmjocbbbhaepdhchncahnbgone \ ); \ mkdir -p "${EXTENSIONS_DIR}"; \ for EXT_ID in "${EXTENSIONS[@]}"; \ do \ EXT_URL="https://clients2.google.com/service/update2/crx?response=redirect&prodversion=100&acceptformat=crx2,crx3&x=id%3D${EXT_ID}%26installsource%3Dondemand%26uc"; \ EXT_PATH="${EXTENSIONS_DIR}/${EXT_ID}.crx"; \ wget -O "${EXT_PATH}" "${EXT_URL}"; \ EXT_VERSION="$(unzip -p "${EXT_PATH}" manifest.json 2>/dev/null | jq -r ".version")"; \ echo -e "{\n \"external_crx\": \"${EXT_PATH}\",\n \"external_version\": \"${EXT_VERSION}\"\n}" > "${EXTENSIONS_DIR}"/"${EXT_ID}".json; \ done; \ # # clean up apt-get --purge autoremove -y xz-utils jq; \ apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/vivaldi-browser.conf COPY --chown=neko preferences.json /home/neko/.config/vivaldi/Default/Preferences COPY policies.json /etc/opt/vivaldi/policies/managed/policies.json COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/vivaldi/openbox.xml ================================================ 10 20 no true yes normal yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g leftno rightno upno downno leftno rightno upno downno 1 2 3 4 scrot -s yesyes right left up down true Konqueror kfmclient openProfile filemanagement scrot 1 500 400 false previous next previous next previous next no yes top left right bottom vertical horizontal previous next previous next previous next previous next previous next menu.xml 200 no 100 400 yes yes
================================================ FILE: apps/vivaldi/policies.json ================================================ { "AutofillAddressEnabled": false, "AutofillCreditCardEnabled": false, "BrowserSignin": 0, "DefaultNotificationsSetting": 2, "DeveloperToolsAvailability": 2, "EditBookmarksEnabled": false, "FullscreenAllowed": true, "IncognitoModeAvailability": 1, "SyncDisabled": true, "AutoplayAllowed": true, "BrowserAddPersonEnabled": false, "BrowserGuestModeEnabled": false, "DefaultPopupsSetting": 2, "DownloadRestrictions": 3, "VideoCaptureAllowed": true, "AllowFileSelectionDialogs": false, "PromptForDownloadLocation": false, "BookmarkBarEnabled": false, "PasswordManagerEnabled": false, "URLAllowlist": [ "file:///home/neko/Downloads" ], "URLBlocklist": [ "file://*", "chrome://policy" ], "ExtensionInstallForcelist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm;https://clients2.google.com/service/update2/crx", "mnjggcdmjocbbbhaepdhchncahnbgone;https://clients2.google.com/service/update2/crx" ], "ExtensionInstallAllowlist": [ "cjpalhdlnbpafiamejdnhcphjbkeiagm", "mnjggcdmjocbbbhaepdhchncahnbgone" ], "ExtensionInstallBlocklist": [ "*" ] } ================================================ FILE: apps/vivaldi/preferences.json ================================================ { "homepage": "http://www.google.com", "homepage_is_newtabpage": false, "first_run_tabs": [ "https://www.google.com/_/chrome/newtab?ie=UTF-8" ], "custom_links": { "initialized": true, "list": [ { "title": "YouTube", "url": "https://www.youtube.com/" }, { "title": "Netflix", "url": "https://netflix.com" }, { "title": "Hulu", "url": "https://www.hulu.com/" }, { "title": "9Anime", "url": "https://9anime.to/" }, { "title": "Crunchy Roll", "url": "https://www.crunchyroll.com/" }, { "title": "Funimation", "url": "https://www.funimation.com/" }, { "title": "Disney+", "url": "https://www.disneyplus.com/" }, { "title": "HBO Now", "url": "https://play.hbonow.com/" }, { "title": "Amazon Video", "url": "https://www.amazon.com/Amazon-Video/b?node=2858778011" }, { "title": "VRV", "url": "https://vrv.co/" }, { "title": "Twitch", "url": "https://www.twitch.tv/" }, { "title": "Mixer", "url": "https://mixer.com/" } ] }, "browser": { "custom_chrome_frame": false, "show_home_button": true, "window_placement": { "maximized": true } }, "bookmark_bar": { "show_on_all_tabs": false }, "sync_promo": { "show_on_first_run_allowed": false }, "default_search_provider_data": { "image_template_url_data": { "alternate_urls": ["https://www.google.com/#q={searchTerms}", "https://www.google.com/search#q={searchTerms}", "https://www.google.com/webhp#q={searchTerms}", "https://www.google.com/s#q={searchTerms}", "https://www.google.com/s?q={searchTerms}"], "contextual_search_url": "", "created_by_policy": false, "created_from_play_api": false, "date_created": "0", "doodle_url": "", "favicon_url": "https://www.google.com/favicon.ico", "id": "11", "image_url": "https://www.google.com/searchbyimage/upload", "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}", "input_encodings": ["UTF-8"], "is_active": 0, "keyword": "g", "last_modified": "0", "last_visited": "0", "logo_url": "", "new_tab_url": "", "originating_url": "", "position": "IhxEc1dKb3ZJanppM1NCWTZhRHNGN0ljYkRHeVk9", "preconnect_to_search_url": false, "prepopulate_id": 1, "safe_for_autoreplace": true, "search_url_post_params": "", "short_name": "Google", "side_search_param": "", "suggestions_url": "", "suggestions_url_post_params": "", "url": "https://www.google.com/search?q={searchTerms}&{google:originalQueryForSuggestion}{google:prefetchSource}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}", "usage_count": 0 }, "private_template_url_data": { "alternate_urls": [], "contextual_search_url": "", "created_by_policy": false, "created_from_play_api": false, "date_created": "0", "doodle_url": "", "favicon_url": "https://duckduckgo.com/favicon.ico", "id": "4", "image_url": "", "image_url_post_params": "", "input_encodings": ["UTF-8"], "is_active": 0, "keyword": "d", "last_modified": "0", "last_visited": "0", "logo_url": "", "new_tab_url": "", "originating_url": "", "position": "Ih3bMkFheVB5WitEdGZmeU9hV0d5K3RGUXRhR3RFPQ==", "preconnect_to_search_url": false, "prepopulate_id": 7, "safe_for_autoreplace": true, "search_url_post_params": "", "short_name": "DuckDuckGo", "side_search_param": "", "suggestions_url": "https://duckduckgo.com/ac/?q={searchTerms}&type=list", "suggestions_url_post_params": "", "url": "https://duckduckgo.com/?q={searchTerms}&{ddg:Referral}", "usage_count": 0 }, "speeddials_template_url_data": { "alternate_urls": ["https://www.google.com/#q={searchTerms}", "https://www.google.com/search#q={searchTerms}", "https://www.google.com/webhp#q={searchTerms}", "https://www.google.com/s#q={searchTerms}", "https://www.google.com/s?q={searchTerms}"], "contextual_search_url": "", "created_by_policy": false, "created_from_play_api": false, "date_created": "0", "doodle_url": "", "favicon_url": "https://www.google.com/favicon.ico", "id": "11", "image_url": "https://www.google.com/searchbyimage/upload", "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}", "input_encodings": ["UTF-8"], "is_active": 0, "keyword": "g", "last_modified": "0", "last_visited": "0", "logo_url": "", "new_tab_url": "", "originating_url": "", "position": "IhxEc1dKb3ZJanppM1NCWTZhRHNGN0ljYkRHeVk9", "preconnect_to_search_url": false, "prepopulate_id": 1, "safe_for_autoreplace": true, "search_url_post_params": "", "short_name": "Google", "side_search_param": "", "suggestions_url": "", "suggestions_url_post_params": "", "url": "https://www.google.com/search?q={searchTerms}&{google:originalQueryForSuggestion}{google:prefetchSource}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}", "usage_count": 0 }, "template_url_data": { "alternate_urls": ["https://www.google.com/#q={searchTerms}", "https://www.google.com/search#q={searchTerms}", "https://www.google.com/webhp#q={searchTerms}", "https://www.google.com/s#q={searchTerms}", "https://www.google.com/s?q={searchTerms}"], "contextual_search_url": "", "created_by_policy": false, "created_from_play_api": false, "date_created": "0", "doodle_url": "", "favicon_url": "https://www.google.com/favicon.ico", "id": "11", "image_url": "https://www.google.com/searchbyimage/upload", "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}", "input_encodings": ["UTF-8"], "is_active": 0, "keyword": "g", "last_modified": "0", "last_visited": "0", "logo_url": "", "new_tab_url": "", "originating_url": "", "position": "IhxEc1dKb3ZJanppM1NCWTZhRHNGN0ljYkRHeVk9", "preconnect_to_search_url": false, "prepopulate_id": 1, "safe_for_autoreplace": true, "search_url_post_params": "", "short_name": "Google", "side_search_param": "", "suggestions_url": "", "suggestions_url_post_params": "", "url": "https://www.google.com/search?q={searchTerms}&{google:originalQueryForSuggestion}{google:prefetchSource}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}", "usage_count": 0 } }, "distribution": { "import_bookmarks_from_file": "bookmarks.html", "import_bookmarks": true, "import_history": true, "import_home_page": true, "import_search_engine": true, "ping_delay": 60, "do_not_create_desktop_shortcut": true, "do_not_create_quick_launch_shortcut": true, "do_not_create_taskbar_shortcut": true, "do_not_launch_chrome": true, "do_not_register_for_update_launch": true, "make_chrome_default": true, "make_chrome_default_for_user": true, "system_level": false, "verbose_logging": false }, "enable_do_not_track": true, "profile": { "avatar_index": 34, "default_content_setting_values": { "clipboard": 2, "cookies": 4, "geolocation": 2, "media_stream_camera": 2, "media_stream_mic": 2, "midi_sysex": 2, "payment_handler": 2, "usb_guard": 2 }, "name": "Neko", "using_default_avatar": false, "using_default_name": false, "using_gaia_avatar": false }, "signin": { "allowed": false }, "vivaldi": { "address_bar": { "autocomplete": { "enabled": false }, "omnibox": { "show_browser_history": false, "show_search_history": false, "show_typed_history": false }, "search": { "display": 1, "in_new_tab": false }, "show_full_url": true, "show_qr_generator": true, "visible": true }, "bookmarks": { "deleted_partners": [ "f79cd6e8-ebc0-444d-ac96-00da456dcb59", "d680347f-1073-46b9-a546-ae0238e7b9d9" ], "language": "en-US", "version": "24" }, "downloads": { "notify_on_complete": false, "open_panel_on_new": false, "start_automatically": false, "update_default_download_when_saving_as": false }, "history": { "days_to_keep_visits": 0 }, "homepage": "vivaldi://startpage", "incognito": { "show_intro": false }, "language_at_install": "en-US", "menu": { "icon_type": 1 }, "mouse_gestures": { "enabled": false, "rocker_gestures": { "enabled": false } }, "popups": { "show_in_tab": true }, "settings": { "in_tab": true }, "startpage": { "navigation": 1, "speed_dial": { "add_button_visible": false, "allow_dnd": false, "columns": 4, "delete_visible": false, "display_search": true, "privacy_stats_show": false, "tracker_suggestion_show": false, "width": 170 } }, "startup": { "check_is_default": false, "has_seen_feature": 1 }, "status_bar": { "display": 0, "minimized": 0 }, "system": { "show_exit_confirmation_dialog": true }, "tabs": { "new_placement": 3, "open_new_in_background": false, "stacking": { "open_accordions": [] } }, "theme": { "schedule": { "o_s": { "dark": "Vivaldi2", "light": "Vivaldi2" } }, "use_animation": false }, "translate": { "enabled": false }, "windows": { "use_native_decoration": true } } } ================================================ FILE: apps/vivaldi/supervisord.conf ================================================ [program:vivaldi-stable] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/vivaldi-stable --no-sandbox --window-position=0,0 --display=%(ENV_DISPLAY)s --user-data-dir=/home/neko/.config/vivaldi --no-first-run --start-maximized --bwsi --force-dark-mode --disable-file-system --disable-gpu --disable-software-rasterizer --disable-dev-shm-usage stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/vivaldi.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/vlc/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE # # install vlc RUN set -eux; apt-get update; \ apt-get install -y --no-install-recommends openbox vlc vlc-plugin-skins2; \ # # clean up apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* ENV VLC_MEDIA="/media" # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/vlc.conf COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/vlc/openbox.xml ================================================ 10 20 no true yes normal yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g leftno rightno upno downno leftno rightno upno downno 1 2 3 4 scrot -s yesyes right left up down true Konqueror kfmclient openProfile filemanagement scrot 1 500 400 false previous next previous next previous next no yes top left right bottom vertical horizontal previous next previous next previous next previous next previous next menu.xml 200 no 100 400 yes yes
================================================ FILE: apps/vlc/supervisord.conf ================================================ [program:vlc] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/vlc --x11-display=%(ENV_DISPLAY)s --no-qt-privacy-ask %(ENV_VLC_MEDIA)s stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/vlc.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/waterfox/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE ARG SRC_URL="https://cdn1.waterfox.net/waterfox/releases/latest/linux" # # install waterfox RUN set -eux; apt-get update; \ apt-get install -y --no-install-recommends openbox \ xz-utils bzip2 libgtk-3-0 libdbus-glib-1-2; \ # # fetch latest release wget --user-agent="Mozilla/5.0" -O /tmp/waterfox-setup.tar.bz2 "${SRC_URL}"; \ mkdir /usr/lib/waterfox; \ tar -xjf /tmp/waterfox-setup.tar.bz2 -C /usr/lib; \ rm -f /tmp/waterfox-setup.tar.bz2; \ ln -s /usr/lib/waterfox/waterfox /usr/bin/waterfox; \ # # create a profile directory mkdir -p /home/neko/.waterfox/profile.default/extensions; \ chown -R neko:neko /home/neko/.waterfox/profile.default; \ # # clean up apt-get --purge autoremove -y xz-utils bzip2; \ apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/waterfox.conf COPY neko.js /usr/lib/waterfox/mozilla.cfg COPY autoconfig.js /usr/lib/waterfox/defaults/pref/autoconfig.js COPY policies.json /usr/lib/waterfox/distribution/policies.json COPY --chown=neko profiles.ini /home/neko/.waterfox/profiles.ini COPY openbox.xml /etc/neko/openbox.xml ================================================ FILE: apps/waterfox/autoconfig.js ================================================ pref("general.config.obscure_value", 0); pref("general.config.filename", "mozilla.cfg"); ================================================ FILE: apps/waterfox/neko.js ================================================ // firefox config for neko lockPref("browser.tabs.closeWindowWithLastTab", false); lockPref("app.update.auto", false); lockPref("app.update.enabled", false); lockPref("app.update.silent", true); lockPref("browser.cache.disk.capacity", 1000); lockPref("browser.download.useDownloadDir", false); lockPref("browser.rights.3.shown", true); lockPref("browser.search.update", false); lockPref("browser.shell.checkDefaultBrowser", false); lockPref("extensions.update.enabled", false); lockPref("plugin.default_plugin_disabled", false); lockPref("plugin.scan.plid.all", true); lockPref("plugins.hide_infobar_for_missing_plugin", true); lockPref("profile.allow_automigration", false); lockPref("signon.prefillForms", false); lockPref("signon.rememberSignons", false); //lockPref("xpinstall.enabled", false); //lockPref("xpinstall.whitelist.required", true); lockPref("browser.download.manager.retention", 0); lockPref("browser.download.folderList", 2); lockPref("browser.download.forbid_open_with", true); lockPref("browser.safebrowsing.downloads.enabled", false); lockPref("browser.safebrowsing.downloads.remote.enabled", false); lockPref("browser.helperApps.alwaysAsk.force", false); lockPref("browser.helperApps.neverAsk.saveToDisk", "application/zip,application/octet-stream,image/jpeg,application/vnd.ms-outlook,text/html,application/pdf"); lockPref("browser.helperApps.neverAsk.openFile", "application/zip,application/octet-stream,image/jpeg,application/vnd.ms-outlook,text/html,application/pdf"); lockPref("browser.newtabpage.activity-stream.default.sites", "https://ipleak.net/,https://www.youtube.com/,https://www.google.com/"); // dark mode lockPref("reader.color_scheme", "dark"); lockPref("devtools.theme", "dark"); lockPref("ui.systemUsesDarkTheme", 1); lockPref("lightweightThemes.usedThemes","[]"); lockPref("lightweightThemes.selectedThemeID", "firefox-compact-dark@mozilla.org"); lockPref("extensions.activeThemeID", "firefox-compact-dark@mozilla.org"); lockPref("browser.theme.toolbar-theme", 0); lockPref("browser.in-content.dark-mode", true); ================================================ FILE: apps/waterfox/openbox.xml ================================================ 10 20 no true yes normal yes no yes no 200 no Smart
yes
Primary 1
Clearlooks NLIMC yes yes sans 8 bold normal sans 8 bold normal sans 9 normal normal sans 9 normal normal sans 9 bold normal sans 9 bold normal 1 1 875 yes Nonpixel Center 10 10 0 0 0 0 TopLeft 0 0 no Above Vertical no 300 300 Middle C-g leftno rightno upno downno leftno rightno upno downno 1 2 3 4 scrot -s yesyes right left up down true Konqueror kfmclient openProfile filemanagement scrot 1 500 400 false previous next previous next previous next no yes top left right bottom vertical horizontal previous next previous next previous next previous next previous next menu.xml 200 no 100 400 yes yes
================================================ FILE: apps/waterfox/policies.json ================================================ { "policies": { "BlockAboutAddons": false, "BlockAboutConfig": true, "BlockAboutProfiles": true, "BlockAboutSupport": true, "Bookmarks": [ { "Title": "IPLeak", "URL": "https://ipleak.net/", "Favicon": "https://ipleak.net/favicon.ico", "Folder": "Pages", "Placement": "toolbar" }, { "Title": "YouTube", "URL": "https://www.youtube.com/", "Favicon": "https://www.youtube.com/favicon.ico", "Folder": "Pages", "Placement": "toolbar" }, { "Title": "Google", "URL": "https://www.google.com/", "Favicon": "https://www.google.com/favicon.ico", "Folder": "Pages", "Placement": "toolbar" } ], "CaptivePortal": false, "DisableAppUpdate": true, "DisableBuiltinPDFViewer": true, "DisableDeveloperTools": false, "DisableFeedbackCommands": true, "DisableFirefoxAccounts": true, "DisableFirefoxScreenshots": true, "DisableFirefoxStudies": true, "DisableForgetButton": true, "DisableMasterPasswordCreation": true, "DisablePocket": true, "DisablePrivateBrowsing": true, "DisableProfileImport": true, "DisableProfileRefresh": true, "DisableSafeMode": true, "DisableSetDesktopBackground": true, "DisableSystemAddonUpdate": true, "DisableTelemetry": true, "DisplayBookmarksToolbar": false, "DontCheckDefaultBrowser": true, "EnableTrackingProtection": { "Cryptomining": true, "Fingerprinting": true, "Value": true }, "ExtensionSettings": { "*": { "installation_mode": "blocked" }, "sponsorBlocker@ajay.app": { "install_url": "https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi", "installation_mode": "force_installed" }, "uBlock0@raymondhill.net": { "install_url": "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi", "installation_mode": "force_installed" } }, "ExtensionUpdate": false, "FirefoxHome": { "Highlights": false, "Pocket": false, "Search": true, "Snippets": false, "TopSites": true }, "FlashPlugin": {}, "HardwareAcceleration": false, "Homepage": { "Additional": [], "StartPage": "home" }, "NewTabPage": true, "NoDefaultBookmarks": true, "OfferToSaveLogins": false, "OfferToSaveLoginsDefault": false, "OverrideFirstRunPage": "", "OverridePostUpdatePage": "", "PasswordManagerEnabled": false, "Permissions": { "Camera": { "BlockNewRequests": true }, "Location": { "BlockNewRequests": true }, "Microphone": { "BlockNewRequests": true }, "Notifications": { "BlockNewRequests": true } }, "Preferences": { "browser.tabs.warnOnClose": false, "browser.urlbar.suggest.bookmark": false, "browser.urlbar.suggest.history": false, "browser.urlbar.suggest.openpage": false, "datareporting.policy.dataSubmissionPolicyBypassNotification": true, "dom.disable_window_flip": true, "dom.disable_window_move_resize": true, "dom.event.contextmenu.enabled": true, "extensions.getAddons.showPane": false, "places.history.enabled": false, "privacy.file_unique_origin": true, "ui.key.menuAccessKeyFocuses": false }, "PromptForDownloadLocation": false, "SanitizeOnShutdown": { "Cache": true, "Cookies": true, "Downloads": true, "FormData": true, "History": true, "OfflineApps": true, "Sessions": true, "SiteSettings": true } } } ================================================ FILE: apps/waterfox/profiles.ini ================================================ [General] StartWithLastProfile=1 [Profile0] Name=default IsRelative=1 Path=profile.default Default=1 ================================================ FILE: apps/waterfox/supervisord.conf ================================================ [program:waterfox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/waterfox --no-remote -P default --display=%(ENV_DISPLAY)s -setDefaultBrowser -width 1280 -height 720 stopsignal=INT autorestart=true priority=800 user=%(ENV_USER)s stdout_logfile=/var/log/neko/waterfox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true [program:openbox] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/openbox --config-file /etc/neko/openbox.xml autorestart=true priority=300 user=%(ENV_USER)s stdout_logfile=/var/log/neko/openbox.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: apps/xfce/Dockerfile ================================================ ARG BASE_IMAGE=ghcr.io/m1k1o/neko/base:latest FROM $BASE_IMAGE # # install xfce RUN set -eux; apt-get update; \ apt-get install -y --no-install-recommends xfce4 xfce4-terminal sudo; \ # # add user to sudoers usermod -aG sudo neko; \ echo "neko:neko" | chpasswd; \ echo "%sudo ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers; \ # clean up apt-get clean -y; \ rm -rf /var/lib/apt/lists/* /var/cache/apt/* # # copy configuation files COPY supervisord.conf /etc/neko/supervisord/xfce.conf ================================================ FILE: apps/xfce/supervisord.conf ================================================ [program:xfce] environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" command=/usr/bin/startxfce4 stopsignal=INT autorestart=true priority=500 user=%(ENV_USER)s stdout_logfile=/var/log/neko/xfce.log stdout_logfile_maxbytes=100MB stdout_logfile_backups=10 redirect_stderr=true ================================================ FILE: build ================================================ #!/bin/bash set -e cd "$(dirname "$0")" # # This script builds the neko base image and all the applications # # disable buildx because of https://github.com/docker/buildx/issues/847 # if you want to use buildx, set USE_BUILDX=1 if [ -z "$USE_BUILDX" ]; then USE_BUILDX=0 fi # check if docker buildx is available, its not docker-buildx command but rather subcommand of docker #if [ -z "$USE_BUILDX" ] && [ -x "$(command -v docker)" ]; then # if docker buildx version >/dev/null 2>&1; then # USE_BUILDX=1 # fi #fi function log() { echo "$(date +'%Y-%m-%d %H:%M:%S') - [NEKO] - $1" > /dev/stderr } function help() { echo "Usage: $0 [options] [image]" echo echo "Options:" echo " -p, --platform : The platform (default: system architecture)" echo " -r, --repository : The repository prefix (default: ghcr.io/m1k1o/neko)" echo " -t, --tag : The image tag, can be specified multiple times, if not specified" echo " uses 'latest' and if available, current git semver tag (v*.*.*)" echo " -f, --flavor : The flavor, if not specified, builds without flavor" echo " -b, --base_image : The base image name (default: [-]base:)" echo " -a, --application : The app to build, if not specified, builds the base image" echo " -y, --yes : Skip confirmation prompts" echo " --no-cache : Build without docker cache" echo " --push : Push the image to the registry after building" echo " -h, --help : Show this help message" echo echo "Positional arguments:" echo " : The image name, if not specified, uses the full image name" echo " in the format /-:" echo " Example: ghcr.io/m1k1o/neko/nvidia-firefox:latest" echo " You can override any of the above options by specifying them" echo " after the image name." echo echo "Environment variables:" echo " USE_BUILDX : Set to 1 to use docker buildx instead of docker build" echo " (default: 0)" echo " CLIENT_DIST : The client dist file to use, if not specified, builds them" echo " from the source code." echo " (options) : Options can be specified as environment variables, for example:" echo " PLATFORM=linux/arm64 $0 --repository ghcr.io/m1k1o/neko" } FULL_IMAGE="" while [[ "$#" -gt 0 ]]; do case $1 in --platform|-p) PLATFORM="$2"; shift ;; --repository|-r) REPOSITORY="$2"; shift ;; --tag|-t) TAGS+=("$2"); TAG="$2"; shift ;; --flavor|-f) FLAVOR="$2"; shift ;; --base_image|-b) BASE_IMAGE="$2"; shift ;; --application|-a) APPLICATION="$2"; shift ;; --yes|-y) YES=1 ;; --no-cache) NO_CACHE=1 ;; --push) PUSH=1 ;; --help|-h) help; exit 0 ;; -*) log "Unknown parameter passed: $1"; help; exit 1 ;; *) if [ -z "$FULL_IMAGE" ]; then FULL_IMAGE="$1" # extracts image, flavor, app and tag from the full image name # example: # ghcr.io/m1k1o/neko/nvidia-firefox:latest # will be split into: # REPOSITORY=ghcr.io/m1k1o/neko # FLAVOR=nvidia # APPLICATION=firefox # TAG=latest # remove the tag from the image name if [[ "$FULL_IMAGE" == *":"* ]]; then # removes everything before the last : TAG="${FULL_IMAGE##*:}" # will be latest TAGS+=("$TAG") # removes everything after the last : FULL_IMAGE="${FULL_IMAGE%:*}" # will be ghcr.io/m1k1o/neko/nvidia-firefox fi # extract the image name and save the rest to REPOSITORY if [[ "$FULL_IMAGE" == *"/"* ]]; then # removes everything after the last / REPOSITORY="${FULL_IMAGE%/*}" # will be ghcr.io/m1k1o/neko # removes everything before the last / FULL_IMAGE="${FULL_IMAGE##*/}" # will be nvidia-firefox fi # extract the flavor and application name if [[ "$FULL_IMAGE" == *"-"* ]]; then # removes everything after the last - FLAVOR="${FULL_IMAGE%-*}" # will be nvidia # removes everything before the last - APPLICATION="${FULL_IMAGE#*-}" # will be firefox else # no flavor specified so use the full image name as application name APPLICATION="$FULL_IMAGE" # will be firefox fi # if application name is base, set it to empty if [ "$APPLICATION" == "base" ]; then APPLICATION="" fi else log "Unknown positional argument: $1" help exit 1 fi ;; esac shift done function prompt() { if [ ! -z "$YES" ]; then return 0 fi local OK="" while [ -z "$OK" ]; do read -p "$1 (yes/no) " REPLY case "$REPLY" in yes|YES|y|Y) OK=1 ;; no|NO|n|N) log "Aborting build." exit 1 ;; *) log "Please answer 'yes' or 'no'." ;; esac done } function build_image() { # first argument is the image name, rest are the build args local APPLICATION_IMAGE="$1" shift # get list of tags in full format: : local IMAGE_NO_TAG="${APPLICATION_IMAGE%:*}" local FULL_TAGS=() for T in "${TAGS[@]}"; do FULL_TAGS+=("$IMAGE_NO_TAG:$T") done if [ -z "$USE_BUILDX" ] || [ "$USE_BUILDX" != "1" ]; then # if buildx is not available, use docker build docker build \ --platform $PLATFORM \ $NO_CACHE \ -t $APPLICATION_IMAGE \ $@ # tag and push the image to the registry for T in $FULL_TAGS; do # do not tag if the tag is the same as the image tag if [ "$T" != "$APPLICATION_IMAGE" ]; then log "Tagging $APPLICATION_IMAGE as $T" docker tag "$APPLICATION_IMAGE" "$T" fi # if push is enabled, push the image to the registry if [ ! -z "$PUSH" ]; then log "Pushing $T to registry" docker push "$T" fi done else # create cmd for buildx, repeat --tag for each tag local CMD="" for T in $FULL_TAGS; do CMD+="--tag $T " done # if push is enabled, add --push if [ ! -z "$PUSH" ]; then CMD+="--push " fi # if no cache is enabled, add --no-cache if [ ! -z "$NO_CACHE" ]; then CMD+="--no-cache " fi # buildx build command docker buildx build \ --platform $PLATFORM \ --load --pull $CMD \ $@ fi } # -------------------------------------------------------------------- if [ -z "$USE_BUILDX" ] || [ "$USE_BUILDX" != "1" ]; then log "Using docker build" else log "Using docker buildx" fi if [ -z "$PLATFORM" ]; then # use system architecture if not specified UNAME="$(uname -m)" if [ "$UNAME" == "x86_64" ]; then PLATFORM="linux/amd64" elif [ "$UNAME" == "aarch64" ] || [ "$UNAME" == "arm64" ]; then PLATFORM="linux/arm64" elif [ "$UNAME" == "armv7l" ]; then PLATFORM="linux/arm/v7" else log "Unknown architecture: $UNAME" exit 1 fi fi log "Using platform: $PLATFORM" if [ -z "$REPOSITORY" ]; then REPOSITORY="ghcr.io/m1k1o/neko" fi log "Using repository: $REPOSITORY" if [ -z "$TAG" ]; then # if git is available, use the latest tag from git if [ -d ".git" ] && [ -x "$(command -v git)" ]; then # get the latest version tag from git (v*.*.*) GIT_VER=$(git describe --tags --exact-match --match "v*.*.*" 2>/dev/null || true) if [ ! -z "$GIT_VER" ]; then # split to major, minor and patch IFS='.' read -r MAJOR MINOR PATCH <<< "${GIT_VER#v}" # append MAJOR.MINOR.PATCH, MAJOR.MINOR and MAJOR to the tags TAGS=("$MAJOR.$MINOR.$PATCH" "$MAJOR.$MINOR" "$MAJOR") #else # # if no version tag is found, use the latest commit hash # GIT_VER=$(git rev-parse HEAD # TAGS=("sha-$GIT_VER") fi fi TAG="latest" TAGS=("$TAG" "${TAGS[@]}") fi for T in "${TAGS[@]}"; do log "Using tag: $T" done if [ -z "$FLAVOR" ]; then log "No flavor specified, building without flavor" else log "Using flavor: $FLAVOR" fi if [ -z "$BASE_IMAGE" ]; then if [ -z "$FLAVOR" ]; then BASE_IMAGE="$REPOSITORY/base:$TAG" else BASE_IMAGE="$REPOSITORY/$FLAVOR-base:$TAG" fi fi if [ ! -z "$NO_CACHE" ] && [ "$NO_CACHE" != "0" ]; then NO_CACHE="--no-cache" log "Building without cache" else NO_CACHE="" fi # -------------------------------------------------------------------- if [ ! -z "$APPLICATION" ]; then log "Building application: $APPLICATION" log "Using base image: $BASE_IMAGE" # check if application directory exists APPLICATION_DIR="apps/$APPLICATION" if [ ! -d "$APPLICATION_DIR" ]; then log "Application directory $APPLICATION_DIR does not exist." exit 1 fi # flavor is specified, append it to the image name and Dockerfile APPLICATION_IMAGE="$REPOSITORY/$APPLICATION:$TAG" APPLICATION_DOCKERFILE="apps/$APPLICATION/Dockerfile" if [ ! -z "$FLAVOR" ]; then APPLICATION_IMAGE="$REPOSITORY/$FLAVOR-$APPLICATION" # if application flavor is specified and Dockerfile exists, use it if [ -f "$APPLICATION_DIR/Dockerfile.$FLAVOR" ]; then APPLICATION_DOCKERFILE="$APPLICATION_DIR/Dockerfile.$FLAVOR" fi fi prompt "Are you sure you want to build $APPLICATION_IMAGE from $APPLICATION_DOCKERFILE?" log "Building $APPLICATION_IMAGE image from $APPLICATION_DOCKERFILE" build_image $APPLICATION_IMAGE \ --build-arg="BASE_IMAGE=$BASE_IMAGE" \ -f $APPLICATION_DOCKERFILE \ $APPLICATION_DIR exit 0 fi # -------------------------------------------------------------------- prompt "Are you sure you want to build $BASE_IMAGE?" RUNTIME_DOCKERFILE="Dockerfile" if [ ! -z "$FLAVOR" ] && [ -f "runtime/Dockerfile.$FLAVOR" ]; then RUNTIME_DOCKERFILE="Dockerfile.$FLAVOR" fi log "Building base image: $BASE_IMAGE" docker run --rm -i \ -v "$(pwd)":/src \ -e "RUNTIME_DOCKERFILE=$RUNTIME_DOCKERFILE" \ --workdir /src \ --entrypoint go \ golang:1.24-bullseye \ run utils/docker/main.go \ -i Dockerfile.tmpl -client "$CLIENT_DIST" | build_image $BASE_IMAGE -f - . ================================================ FILE: client/.babelrc ================================================ { "presets": ["@vue/cli-plugin-babel/preset"] } ================================================ FILE: client/.browserslistrc ================================================ > 1% last 2 versions ================================================ FILE: client/.editorconfig ================================================ root = true [*] charset = utf-8 indent_style = space indent_size = 2 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true ================================================ FILE: client/.eslintrc ================================================ { "root": true, "env": { "node": true }, "extends": ["plugin:vue/essential", "@vue/prettier", "@vue/typescript"], "parserOptions": { "parser": "@typescript-eslint/parser" }, "rules": { "vue/valid-v-for": "off", "no-case-declarations": "off", "no-dupe-class-members": "off", "no-console": "off", "no-empty": "off" } } ================================================ FILE: client/.prettierrc ================================================ { "semi": false, "trailingComma": "all", "singleQuote": true, "printWidth": 120, "tabWidth": 2, "vueIndentScriptAndStyle": true } ================================================ FILE: client/.vscode/settings.json ================================================ { "editor.tabSize": 2, "editor.insertSpaces": true, "editor.detectIndentation": false, "files.encoding": "utf8", "files.eol": "\n", "typescript.tsdk": "./node_modules/typescript/lib", "todo-tree.filtering.excludeGlobs": ["**/node_modules/**"], "eslint.validate": [ "vue", "javascript", "javascriptreact", "typescript", "typescriptreact", ], "vetur.validation.template": true, "vetur.useWorkspaceDependencies": true, "remote.extensionKind": { "ms-azuretools.vscode-docker": "ui" }, "editor.formatOnSave": false, "editor.codeActionsOnSave": { "source.fixAll.eslint": true }, "remote.containers.defaultExtensions": [ "octref.vetur", "esbenp.prettier-vscode", "dbaeumer.vscode-eslint", "ms-vscode-remote.vscode-remote-extensionpack", "ms-vscode-remote.remote-containers", "ms-azuretools.vscode-docker", "editorconfig.editorconfig", "gruntfuggly.todo-tree", "eamodio.gitlens", "swyphcosmo.spellchecker" ], } ================================================ FILE: client/Dockerfile ================================================ ARG BASE_IMAGE=node:18-bullseye-slim FROM $BASE_IMAGE AS client WORKDIR /src # # install dependencies COPY package*.json ./ RUN npm install # # build client COPY . . RUN npm run build # # artifacts from this stage # COPY --from=client /src/dist/ /var/www ================================================ FILE: client/dev/build ================================================ #!/bin/sh cd "$(dirname "$0")" # start component watch docker run --rm -it \ --user "$(id -u):$(id -g)" \ --volume "${PWD}/../:/app" \ --entrypoint="npm" \ --workdir="/app" \ node:18-bullseye-slim run build ================================================ FILE: client/dev/exec ================================================ #!/bin/sh cd "$(dirname "$0")" # start component watch docker run --rm -it \ --user "$(id -u):$(id -g)" \ --volume "${PWD}/../:/app" \ --entrypoint="/bin/bash" \ --workdir="/app" \ node:18-bullseye-slim ================================================ FILE: client/dev/npm ================================================ #!/bin/sh cd "$(dirname "$0")" # npm docker run --rm -it \ --user "$(id -u):$(id -g)" \ --volume "${PWD}/../:/app" \ --entrypoint="npm" \ --workdir="/app" \ node:18-bullseye-slim "$@" ================================================ FILE: client/dev/serve ================================================ #!/bin/bash cd "$(dirname "$0")" if [ -z $VUE_APP_SERVER_PORT ]; then VUE_APP_SERVER_PORT="3000" fi echo "Using VUE_APP_SERVER_PORT: ${VUE_APP_SERVER_PORT}" # use -i to install if [ ! -d "${PWD}/../node_modules" ] || [ "$1" == "-i" ]; then docker run --rm -it \ --volume "${PWD}/../:/app" \ --workdir="/app" \ --entrypoint="npm" \ node:18-bullseye-slim install fi # npm run serve docker run --rm -it \ -p 3001:3001 \ -e "VUE_APP_SERVER_PORT=$VUE_APP_SERVER_PORT" \ --user "$(id -u):$(id -g)" \ --volume "${PWD}/../:/app" \ --entrypoint="npm" \ --workdir="/app" \ node:18-bullseye-slim run serve -- --port 3001 ================================================ FILE: client/package.json ================================================ { "name": "neko-client", "version": "2.5.0", "description": "Client for neko streaming server", "license": "Apache License 2.0", "author": "Nurdism ", "homepage": "https://github.com/m1k1o/neko/client#readme", "repository": { "type": "git", "url": "git+https://github.com/m1k1o/neko.git" }, "bugs": { "url": "https://github.com/m1k1o/neko/issues" }, "scripts": { "serve": "vue-cli-service serve --mode development", "build": "vue-cli-service build", "build:lib": "vue-cli-service build --target lib --name neko-lib 'src/lib.ts'", "build:emoji": "ts-node --files --project tools/tsconfig.json tools/emoji.ts", "lint": "vue-cli-service lint" }, "dependencies": { "@fortawesome/fontawesome-free": "^6.2.0", "animejs": "^3.2.0", "axios": "^1.2.3", "date-fns": "^2.29.3", "emoji-datasource": "^6.0.1", "eventemitter3": "^4.0.7", "resize-observer-polyfill": "^1.5.1", "simple-markdown": "^0.7.2", "sweetalert2": "11.4.8", "typed-vuex": "^0.1.21", "v-tooltip": "^2.0.3", "vue": "^2.7.13", "vue-class-component": "^7.2.6", "vue-clickaway": "^2.2.2", "vue-context": "^5.2.0", "vue-i18n": "^8.27.2", "vue-notification": "^1.3.20", "vue-property-decorator": "^9.1.2", "vuex": "^3.5.1" }, "devDependencies": { "@types/animejs": "^3.1.6", "@types/node": "^18.11.18", "@types/vue": "^2.0.0", "@types/vue-clickaway": "^2.2.0", "@typescript-eslint/eslint-plugin": "^5.0.8", "@typescript-eslint/parser": "^5.0.8", "@vue/cli-plugin-babel": "^5.0.8", "@vue/cli-plugin-eslint": "^5.0.8", "@vue/cli-plugin-typescript": "^5.0.8", "@vue/cli-plugin-vuex": "^5.0.8", "@vue/cli-service": "^5.0.8", "@vue/eslint-config-prettier": "^6.0.0", "@vue/eslint-config-typescript": "^11.0.2", "core-js": "^3.26.0", "emojilib": "^3.0.7", "eslint": "^8.32.0", "eslint-plugin-prettier": "^3.4.1", "eslint-plugin-vue": "^9.0.0", "prettier": "^2.7.1", "sass": "^1.55.0", "sass-loader": "^10.3.1", "ts-node": "^9.1.1", "typescript": "^4.8.4", "vue-template-compiler": "^2.7.13" } } ================================================ FILE: client/public/browserconfig.xml ================================================ #19bd9c ================================================ FILE: client/public/emoji.json ================================================ {"groups":[{"id":"neko","name":"Neko","list":["neko"]},{"id":"emotion","name":"Emotion","list":["japanese_ogre","japanese_goblin","ghost","alien","space_invader","imp","skull","kiss","love_letter","heartbeat","broken_heart","two_hearts","sparkling_heart","heartpulse","cupid","blue_heart","green_heart","yellow_heart","purple_heart","gift_heart","revolving_hearts","heart_decoration","anger","bomb","zzz","boom","sweat_drops","dash","hankey","dizzy","speech_balloon","thought_balloon","100","hole","black_heart","left_speech_bubble","right_anger_bubble","grinning","grin","joy","smiley","smile","sweat_smile","laughing","innocent","smiling_imp","wink","blush","yum","relieved","heart_eyes","sunglasses","smirk","neutral_face","expressionless","unamused","sweat","pensive","confused","confounded","kissing","kissing_heart","kissing_smiling_eyes","kissing_closed_eyes","stuck_out_tongue","stuck_out_tongue_winking_eye","stuck_out_tongue_closed_eyes","disappointed","worried","angry","rage","cry","persevere","triumph","disappointed_relieved","frowning","anguished","fearful","weary","sleepy","tired_face","grimacing","sob","open_mouth","hushed","cold_sweat","scream","astonished","flushed","sleeping","dizzy_face","no_mouth","mask","smile_cat","joy_cat","smiley_cat","heart_eyes_cat","smirk_cat","kissing_cat","pouting_cat","crying_cat_face","scream_cat","slightly_frowning_face","slightly_smiling_face","upside_down_face","face_with_rolling_eyes","see_no_evil","hear_no_evil","speak_no_evil","white_heart","brown_heart","zipper_mouth_face","money_mouth_face","face_with_thermometer","nerd_face","thinking_face","face_with_head_bandage","robot_face","hugging_face","face_with_cowboy_hat","clown_face","nauseated_face","rolling_on_the_floor_laughing","drooling_face","lying_face","sneezing_face","face_with_raised_eyebrow","star-struck","zany_face","shushing_face","face_with_symbols_on_mouth","face_with_hand_over_mouth","face_vomiting","exploding_head","smiling_face_with_3_hearts","yawning_face","smiling_face_with_tear","partying_face","woozy_face","hot_face","cold_face","disguised_face","pleading_face","face_with_monocle","orange_heart","skull_and_crossbones","white_frowning_face","relaxed","heavy_heart_exclamation_mark_ornament","heart"]},{"id":"people","name":"People","list":["santa","snowboarder","woman-running","man-running","runner","woman-surfing","man-surfing","surfer","horse_racing","woman-swimming","man-swimming","swimmer","woman-lifting-weights","man-lifting-weights","weight_lifter","woman-golfing","man-golfing","golfer","eyes","eye","ear","nose","lips","tongue","point_up_2","point_down","point_left","point_right","facepunch","wave","ok_hand","+1","-1","clap","open_hands","footprints","bust_in_silhouette","busts_in_silhouette","boy","girl","male-farmer","male-cook","man_feeding_baby","male-student","male-singer","male-artist","male-teacher","male-factory-worker","man-boy-boy","man-boy","man-girl-boy","man-girl-girl","man-girl","man-man-boy","man-man-boy-boy","man-man-girl","man-man-girl-boy","man-man-girl-girl","man-woman-boy","man-woman-boy-boy","man-woman-girl","man-woman-girl-boy","man-woman-girl-girl","male-technologist","male-office-worker","male-mechanic","male-scientist","male-astronaut","male-firefighter","man_with_probing_cane","red_haired_man","curly_haired_man","bald_man","white_haired_man","man_in_motorized_wheelchair","man_in_manual_wheelchair","male-doctor","male-judge","male-pilot","man-heart-man","man-kiss-man","man","female-farmer","female-cook","woman_feeding_baby","female-student","female-singer","female-artist","female-teacher","female-factory-worker","woman-boy-boy","woman-boy","woman-girl-boy","woman-girl-girl","woman-girl","woman-woman-boy","woman-woman-boy-boy","woman-woman-girl","woman-woman-girl-boy","woman-woman-girl-girl","female-technologist","female-office-worker","female-mechanic","female-scientist","female-astronaut","female-firefighter","woman_with_probing_cane","red_haired_woman","curly_haired_woman","bald_woman","white_haired_woman","woman_in_motorized_wheelchair","woman_in_manual_wheelchair","female-doctor","female-judge","female-pilot","woman-heart-man","woman-heart-woman","woman-kiss-man","woman-kiss-woman","woman","family","man_and_woman_holding_hands","two_men_holding_hands","two_women_holding_hands","female-police-officer","male-police-officer","cop","woman-with-bunny-ears-partying","man-with-bunny-ears-partying","dancers","woman_with_veil","man_with_veil","bride_with_veil","blond-haired-woman","blond-haired-man","person_with_blond_hair","man_with_gua_pi_mao","woman-wearing-turban","man-wearing-turban","man_with_turban","older_man","older_woman","baby","female-construction-worker","male-construction-worker","construction_worker","princess","angel","woman-tipping-hand","man-tipping-hand","information_desk_person","female-guard","male-guard","guardsman","dancer","nail_care","woman-getting-massage","man-getting-massage","massage","woman-getting-haircut","man-getting-haircut","haircut","couplekiss","couple_with_heart","muscle","man_in_business_suit_levitating","female-detective","male-detective","sleuth_or_spy","man_dancing","raised_hand_with_fingers_splayed","middle_finger","spock-hand","speaking_head_in_silhouette","woman-gesturing-no","man-gesturing-no","no_good","woman-gesturing-ok","man-gesturing-ok","ok_woman","woman-bowing","man-bowing","bow","woman-raising-hand","man-raising-hand","raising_hand","raised_hands","woman-frowning","man-frowning","person_frowning","woman-pouting","man-pouting","person_with_pouting_face","pray","woman-rowing-boat","man-rowing-boat","rowboat","woman-biking","man-biking","bicyclist","woman-mountain-biking","man-mountain-biking","mountain_bicyclist","woman-walking","man-walking","walking","bath","sleeping_accommodation","pinched_fingers","pinching_hand","the_horns","call_me_hand","raised_back_of_hand","left-facing_fist","right-facing_fist","handshake","crossed_fingers","i_love_you_hand_sign","woman-facepalming","man-facepalming","face_palm","pregnant_woman","breast-feeding","palms_up_together","selfie","prince","woman_in_tuxedo","man_in_tuxedo","person_in_tuxedo","mrs_claus","woman-shrugging","man-shrugging","shrug","woman-cartwheeling","man-cartwheeling","person_doing_cartwheel","woman-juggling","man-juggling","juggling","fencer","woman-wrestling","man-wrestling","wrestlers","woman-playing-water-polo","man-playing-water-polo","water_polo","woman-playing-handball","man-playing-handball","handball","ninja","bone","leg","foot","tooth","female_superhero","male_superhero","superhero","female_supervillain","male_supervillain","supervillain","ear_with_hearing_aid","mechanical_arm","mechanical_leg","woman_standing","man_standing","standing_person","woman_kneeling","man_kneeling","kneeling_person","deaf_woman","deaf_man","deaf_person","farmer","cook","person_feeding_baby","mx_claus","student","singer","artist","teacher","factory_worker","technologist","office_worker","mechanic","scientist","astronaut","firefighter","people_holding_hands","person_with_probing_cane","red_haired_person","curly_haired_person","bald_person","white_haired_person","person_in_motorized_wheelchair","person_in_manual_wheelchair","health_worker","judge","pilot","adult","child","older_adult","bearded_person","person_with_headscarf","woman_in_steamy_room","man_in_steamy_room","person_in_steamy_room","woman_climbing","man_climbing","person_climbing","woman_in_lotus_position","man_in_lotus_position","person_in_lotus_position","female_mage","male_mage","mage","female_fairy","male_fairy","fairy","female_vampire","male_vampire","vampire","mermaid","merman","merperson","female_elf","male_elf","elf","female_genie","male_genie","genie","female_zombie","male_zombie","zombie","brain","anatomical_heart","lungs","people_hugging","point_up","skier","woman-bouncing-ball","man-bouncing-ball","person_with_ball","fist","hand","v","writing_hand"]},{"id":"nature","name":"Nature","list":["seedling","evergreen_tree","deciduous_tree","palm_tree","cactus","tulip","cherry_blossom","rose","hibiscus","sunflower","blossom","ear_of_rice","herb","four_leaf_clover","maple_leaf","fallen_leaf","leaves","rosette","rat","mouse2","ox","water_buffalo","cow2","tiger2","leopard","rabbit2","black_cat","cat2","dragon","crocodile","whale2","snail","snake","racehorse","ram","goat","sheep","monkey","rooster","chicken","service_dog","dog2","pig2","boar","elephant","octopus","shell","bug","ant","bee","ladybug","fish","tropical_fish","blowfish","turtle","hatching_chick","baby_chick","hatched_chick","bird","penguin","koala","poodle","dromedary_camel","camel","dolphin","mouse","cow","tiger","rabbit","cat","dragon_face","whale","horse","monkey_face","dog","pig","frog","hamster","wolf","polar_bear","bear","panda_face","pig_nose","feet","chipmunk","bouquet","white_flower","dove_of_peace","spider","spider_web","wilted_flower","lion_face","scorpion","turkey","unicorn_face","eagle","duck","bat","shark","owl","fox_face","butterfly","deer","gorilla","lizard","rhinoceros","giraffe_face","zebra_face","hedgehog","sauropod","t-rex","cricket","kangaroo","llama","peacock","hippopotamus","parrot","raccoon","mosquito","microbe","badger","swan","mammoth","dodo","sloth","otter","orangutan","skunk","flamingo","beaver","bison","seal","guide_dog","fly","worm","beetle","cockroach","potted_plant","feather","shamrock"]},{"id":"food","name":"Food","list":["hotdog","taco","burrito","chestnut","hot_pepper","corn","mushroom","tomato","eggplant","grapes","melon","watermelon","tangerine","lemon","banana","pineapple","apple","green_apple","pear","peach","cherries","strawberry","hamburger","pizza","meat_on_bone","poultry_leg","rice_cracker","rice_ball","rice","curry","ramen","spaghetti","bread","fries","sweet_potato","dango","oden","sushi","fried_shrimp","fish_cake","icecream","shaved_ice","ice_cream","doughnut","cookie","chocolate_bar","candy","lollipop","custard","honey_pot","cake","bento","stew","fried_egg","fork_and_knife","tea","sake","wine_glass","cocktail","tropical_drink","beer","beers","baby_bottle","knife_fork_plate","champagne","popcorn","birthday","amphora","hocho","clinking_glasses","tumbler_glass","spoon","croissant","avocado","cucumber","bacon","potato","carrot","baguette_bread","green_salad","shallow_pan_of_food","stuffed_flatbread","egg","glass_of_milk","peanuts","kiwifruit","pancakes","dumpling","fortune_cookie","takeout_box","chopsticks","bowl_with_spoon","cup_with_straw","coconut","broccoli","pie","pretzel","cut_of_meat","sandwich","canned_food","leafy_green","mango","moon_cake","bagel","crab","shrimp","squid","lobster","oyster","cheese_wedge","cupcake","salt","beverage_box","garlic","onion","falafel","waffle","butter","mate_drink","ice_cube","bubble_tea","blueberries","bell_pepper","olive","flatbread","tamale","fondue","teapot","coffee"]},{"id":"activity","name":"Activity","list":["mahjong","black_joker","ribbon","gift","jack_o_lantern","christmas_tree","fireworks","sparkler","balloon","tada","confetti_ball","tanabata_tree","bamboo","dolls","flags","wind_chime","rice_scene","medal","reminder_ribbon","admission_tickets","fishing_pole_and_fish","art","ticket","performing_arts","video_game","dart","slot_machine","8ball","game_die","bowling","flower_playing_cards","running_shirt_with_sash","tennis","ski","basketball","sports_medal","trophy","football","rugby_football","cricket_bat_and_ball","volleyball","field_hockey_stick_and_ball","ice_hockey_stick_and_puck","table_tennis_paddle_and_ball","badminton_racquet_and_shuttlecock","crystal_ball","joystick","frame_with_picture","sled","diving_mask","goal_net","first_place_medal","second_place_medal","third_place_medal","boxing_glove","martial_arts_uniform","curling_stone","lacrosse","softball","flying_disc","red_envelope","firecracker","jigsaw","thread","yarn","teddy_bear","nazar_amulet","yo-yo","kite","magic_wand","pinata","nesting_dolls","sewing_needle","knot","chess_pawn","spades","clubs","hearts","diamonds","soccer","baseball","golf","ice_skate","sparkles"]},{"id":"travel","name":"Travel","list":["cyclone","foggy","closed_umbrella","night_with_stars","sunrise_over_mountains","sunrise","city_sunset","city_sunrise","rainbow","bridge_at_night","ocean","volcano","milky_way","earth_africa","earth_americas","earth_asia","globe_with_meridians","new_moon","waxing_crescent_moon","first_quarter_moon","moon","full_moon","waning_gibbous_moon","last_quarter_moon","waning_crescent_moon","crescent_moon","new_moon_with_face","first_quarter_moon_with_face","last_quarter_moon_with_face","full_moon_with_face","sun_with_face","star2","stars","thermometer","mostly_sunny","barely_sunny","partly_sunny_rain","rain_cloud","snow_cloud","lightning","tornado","fog","wind_blowing_face","carousel_horse","ferris_wheel","roller_coaster","circus_tent","racing_motorcycle","racing_car","snow_capped_mountain","camping","beach_with_umbrella","building_construction","house_buildings","cityscape","derelict_house_building","classical_building","desert","desert_island","national_park","stadium","house","house_with_garden","office","post_office","european_post_office","hospital","bank","hotel","love_hotel","convenience_store","school","department_store","factory","japanese_castle","european_castle","barber","wedding","droplet","seat","fire","kaaba","mosque","synagogue","clock1","clock2","clock3","clock4","clock5","clock6","clock7","clock8","clock9","clock10","clock11","clock12","clock130","clock230","clock330","clock430","clock530","clock630","clock730","clock830","clock930","clock1030","clock1130","clock1230","mantelpiece_clock","world_map","mount_fuji","tokyo_tower","statue_of_liberty","japan","rocket","helicopter","steam_locomotive","railway_car","bullettrain_side","bullettrain_front","train2","metro","light_rail","station","tram","train","bus","oncoming_bus","trolleybus","busstop","minibus","ambulance","fire_engine","police_car","oncoming_police_car","taxi","oncoming_taxi","car","oncoming_automobile","blue_car","truck","articulated_lorry","tractor","monorail","mountain_railway","suspension_railway","mountain_cableway","aerial_tramway","ship","speedboat","traffic_light","vertical_traffic_light","construction","rotating_light","bike","bellhop_bell","octagonal_sign","hindu_temple","hut","oil_drum","motorway","railway_track","motor_boat","small_airplane","airplane_departure","airplane_arriving","satellite","passenger_ship","scooter","motor_scooter","canoe","flying_saucer","skateboard","auto_rickshaw","pickup_truck","roller_skate","motorized_wheelchair","manual_wheelchair","compass","bricks","luggage","parachute","ringed_planet","rock","wood","watch","hourglass","alarm_clock","stopwatch","timer_clock","hourglass_flowing_sand","sunny","cloud","umbrella","snowman","comet","umbrella_with_rain_drops","hotsprings","anchor","zap","snowman_without_snow","partly_sunny","thunder_cloud_and_rain","shinto_shrine","church","mountain","umbrella_on_ground","fountain","ferry","boat","tent","fuelpump","airplane","snowflake","star"]},{"id":"objects","name":"Objects","list":["school_satchel","mortar_board","studio_microphone","level_slider","control_knobs","film_frames","microphone","movie_camera","headphones","tophat","clapper","musical_note","notes","saxophone","guitar","musical_keyboard","trumpet","violin","musical_score","izakaya_lantern","label","bow_and_arrow","crown","womans_hat","eyeglasses","necktie","shirt","jeans","dress","kimono","bikini","womans_clothes","purse","handbag","pouch","mans_shoe","athletic_shoe","high_heel","sandal","boot","lipstick","syringe","pill","ring","gem","bulb","moneybag","credit_card","yen","dollar","euro","pound","money_with_wings","chart","computer","briefcase","minidisc","floppy_disk","cd","dvd","file_folder","open_file_folder","page_with_curl","page_facing_up","date","calendar","card_index","chart_with_upwards_trend","chart_with_downwards_trend","bar_chart","clipboard","pushpin","round_pushpin","paperclip","straight_ruler","triangular_ruler","bookmark_tabs","ledger","notebook","notebook_with_decorative_cover","closed_book","book","green_book","blue_book","orange_book","books","scroll","memo","telephone_receiver","pager","fax","satellite_antenna","loudspeaker","mega","outbox_tray","inbox_tray","package","e-mail","incoming_envelope","envelope_with_arrow","mailbox_closed","mailbox","mailbox_with_mail","mailbox_with_no_mail","postbox","postal_horn","newspaper","iphone","calling","camera","camera_with_flash","video_camera","tv","radio","vhs","film_projector","prayer_beads","mute","speaker","sound","loud_sound","battery","electric_plug","mag","mag_right","lock_with_ink_pen","closed_lock_with_key","key","lock","unlock","bell","no_bell","bookmark","link","flashlight","wrench","hammer","nut_and_bolt","gun","microscope","telescope","candle","dark_sunglasses","linked_paperclips","lower_left_ballpoint_pen","lower_left_fountain_pen","lower_left_paintbrush","lower_left_crayon","desktop_computer","printer","three_button_mouse","trackball","card_index_dividers","card_file_box","file_cabinet","wastebasket","spiral_note_pad","spiral_calendar_pad","compression","old_key","rolled_up_newspaper","dagger_knife","ballot_box_with_ballot","moyai","door","smoking","toilet","shower","bathtub","couch_and_lamp","shopping_bags","bed","shopping_trolley","elevator","hammer_and_wrench","shield","drum_with_drumsticks","sari","lab_coat","goggles","hiking_boot","womans_flat_shoe","probing_cane","safety_vest","billed_cap","scarf","gloves","coat","socks","test_tube","petri_dish","dna","abacus","fire_extinguisher","toolbox","magnet","lotion_bottle","safety_pin","broom","basket","roll_of_paper","soap","sponge","receipt","ballet_shoes","one-piece_swimsuit","briefs","shorts","thong_sandal","drop_of_blood","adhesive_bandage","stethoscope","boomerang","chair","razor","axe","diya_lamp","banjo","military_helmet","accordion","long_drum","coin","carpentry_saw","screwdriver","ladder","hook","mirror","window","plunger","bucket","mouse_trap","toothbrush","headstone","placard","keyboard","phone","hammer_and_pick","crossed_swords","scales","alembic","gear","coffin","funeral_urn","pick","helmet_with_white_cross","chains","scissors","email","pencil2","black_nib"]},{"id":"symbols","name":"Symbols","list":["hash","keycap_star","zero","one","two","three","four","five","six","seven","eight","nine","copyright","registered","a","b","o2","parking","ab","cl","cool","free","id","new","ng","ok","sos","up","vs","koko","sa","u7121","u6307","u7981","u7a7a","u5408","u6e80","u6709","u6708","u7533","u5272","u55b6","ideograph_advantage","accept","cinema","atm","diamond_shape_with_a_dot_inside","currency_exchange","heavy_dollar_sign","name_badge","vibration_mode","mobile_phone_off","no_mobile_phones","signal_strength","twisted_rightwards_arrows","repeat","repeat_one","arrows_clockwise","arrows_counterclockwise","low_brightness","high_brightness","radio_button","back","end","on","soon","top","underage","keycap_ten","capital_abcd","abcd","1234","symbols","abc","six_pointed_star","beginner","trident","black_square_button","white_square_button","red_circle","large_blue_circle","large_orange_diamond","large_blue_diamond","small_orange_diamond","small_blue_diamond","small_red_triangle","small_red_triangle_down","arrow_up_small","arrow_down_small","om_symbol","menorah_with_nine_branches","no_entry_sign","no_smoking","put_litter_in_its_place","do_not_litter","potable_water","non-potable_water","no_bicycles","no_pedestrians","children_crossing","mens","womens","restroom","baby_symbol","wc","passport_control","customs","baggage_claim","left_luggage","place_of_worship","large_orange_circle","large_yellow_circle","large_green_circle","large_purple_circle","large_brown_circle","large_red_square","large_blue_square","large_orange_square","large_yellow_square","large_green_square","large_purple_square","large_brown_square","bangbang","interrobang","tm","information_source","left_right_arrow","arrow_up_down","arrow_upper_left","arrow_upper_right","arrow_lower_right","arrow_lower_left","leftwards_arrow_with_hook","arrow_right_hook","eject","fast_forward","rewind","arrow_double_up","arrow_double_down","black_right_pointing_double_triangle_with_vertical_bar","black_left_pointing_double_triangle_with_vertical_bar","black_right_pointing_triangle_with_double_vertical_bar","double_vertical_bar","black_square_for_stop","black_circle_for_record","m","black_small_square","white_small_square","arrow_forward","arrow_backward","white_medium_square","black_medium_square","white_medium_small_square","black_medium_small_square","ballot_box_with_check","radioactive_sign","biohazard_sign","orthodox_cross","star_and_crescent","peace_symbol","yin_yang","wheel_of_dharma","female_sign","male_sign","aries","taurus","gemini","cancer","leo","virgo","libra","scorpius","sagittarius","capricorn","aquarius","pisces","recycle","infinity","wheelchair","medical_symbol","atom_symbol","fleur_de_lis","warning","transgender_symbol","white_circle","black_circle","ophiuchus","no_entry","white_check_mark","heavy_check_mark","heavy_multiplication_x","latin_cross","star_of_david","eight_spoked_asterisk","eight_pointed_black_star","sparkle","x","negative_squared_cross_mark","question","grey_question","grey_exclamation","exclamation","heavy_plus_sign","heavy_minus_sign","heavy_division_sign","arrow_right","curly_loop","loop","arrow_heading_up","arrow_heading_down","arrow_left","arrow_up","arrow_down","black_large_square","white_large_square","o","wavy_dash","part_alternation_mark","congratulations","secret"]},{"id":"flags","name":"Flags","list":["flag-ac","flag-ad","flag-ae","flag-af","flag-ag","flag-ai","flag-al","flag-am","flag-ao","flag-aq","flag-ar","flag-as","flag-at","flag-au","flag-aw","flag-ax","flag-az","flag-ba","flag-bb","flag-bd","flag-be","flag-bf","flag-bg","flag-bh","flag-bi","flag-bj","flag-bl","flag-bm","flag-bn","flag-bo","flag-bq","flag-br","flag-bs","flag-bt","flag-bv","flag-bw","flag-by","flag-bz","flag-ca","flag-cc","flag-cd","flag-cf","flag-cg","flag-ch","flag-ci","flag-ck","flag-cl","flag-cm","cn","flag-co","flag-cp","flag-cr","flag-cu","flag-cv","flag-cw","flag-cx","flag-cy","flag-cz","de","flag-dg","flag-dj","flag-dk","flag-dm","flag-do","flag-dz","flag-ea","flag-ec","flag-ee","flag-eg","flag-eh","flag-er","es","flag-et","flag-eu","flag-fi","flag-fj","flag-fk","flag-fm","flag-fo","fr","flag-ga","gb","flag-gd","flag-ge","flag-gf","flag-gg","flag-gh","flag-gi","flag-gl","flag-gm","flag-gn","flag-gp","flag-gq","flag-gr","flag-gs","flag-gt","flag-gu","flag-gw","flag-gy","flag-hk","flag-hm","flag-hn","flag-hr","flag-ht","flag-hu","flag-ic","flag-id","flag-ie","flag-il","flag-im","flag-in","flag-io","flag-iq","flag-ir","flag-is","it","flag-je","flag-jm","flag-jo","jp","flag-ke","flag-kg","flag-kh","flag-ki","flag-km","flag-kn","flag-kp","kr","flag-kw","flag-ky","flag-kz","flag-la","flag-lb","flag-lc","flag-li","flag-lk","flag-lr","flag-ls","flag-lt","flag-lu","flag-lv","flag-ly","flag-ma","flag-mc","flag-md","flag-me","flag-mf","flag-mg","flag-mh","flag-mk","flag-ml","flag-mm","flag-mn","flag-mo","flag-mp","flag-mq","flag-mr","flag-ms","flag-mt","flag-mu","flag-mv","flag-mw","flag-mx","flag-my","flag-mz","flag-na","flag-nc","flag-ne","flag-nf","flag-ng","flag-ni","flag-nl","flag-no","flag-np","flag-nr","flag-nu","flag-nz","flag-om","flag-pa","flag-pe","flag-pf","flag-pg","flag-ph","flag-pk","flag-pl","flag-pm","flag-pn","flag-pr","flag-ps","flag-pt","flag-pw","flag-py","flag-qa","flag-re","flag-ro","flag-rs","ru","flag-rw","flag-sa","flag-sb","flag-sc","flag-sd","flag-se","flag-sg","flag-sh","flag-si","flag-sj","flag-sk","flag-sl","flag-sm","flag-sn","flag-so","flag-sr","flag-ss","flag-st","flag-sv","flag-sx","flag-sy","flag-sz","flag-ta","flag-tc","flag-td","flag-tf","flag-tg","flag-th","flag-tj","flag-tk","flag-tl","flag-tm","flag-tn","flag-to","flag-tr","flag-tt","flag-tv","flag-tw","flag-tz","flag-ua","flag-ug","flag-um","flag-un","us","flag-uy","flag-uz","flag-va","flag-vc","flag-ve","flag-vg","flag-vi","flag-vn","flag-vu","flag-wf","flag-ws","flag-xk","flag-ye","flag-yt","flag-za","flag-zm","flag-zw","crossed_flags","checkered_flag","rainbow-flag","transgender_flag","waving_white_flag","pirate_flag","flag-england","flag-scotland","flag-wales","waving_black_flag","triangular_flag_on_post"]}],"list":["neko","hash","keycap_star","zero","one","two","three","four","five","six","seven","eight","nine","copyright","registered","mahjong","black_joker","a","b","o2","parking","ab","cl","cool","free","id","new","ng","ok","sos","up","vs","flag-ac","flag-ad","flag-ae","flag-af","flag-ag","flag-ai","flag-al","flag-am","flag-ao","flag-aq","flag-ar","flag-as","flag-at","flag-au","flag-aw","flag-ax","flag-az","flag-ba","flag-bb","flag-bd","flag-be","flag-bf","flag-bg","flag-bh","flag-bi","flag-bj","flag-bl","flag-bm","flag-bn","flag-bo","flag-bq","flag-br","flag-bs","flag-bt","flag-bv","flag-bw","flag-by","flag-bz","flag-ca","flag-cc","flag-cd","flag-cf","flag-cg","flag-ch","flag-ci","flag-ck","flag-cl","flag-cm","cn","flag-co","flag-cp","flag-cr","flag-cu","flag-cv","flag-cw","flag-cx","flag-cy","flag-cz","de","flag-dg","flag-dj","flag-dk","flag-dm","flag-do","flag-dz","flag-ea","flag-ec","flag-ee","flag-eg","flag-eh","flag-er","es","flag-et","flag-eu","flag-fi","flag-fj","flag-fk","flag-fm","flag-fo","fr","flag-ga","gb","flag-gd","flag-ge","flag-gf","flag-gg","flag-gh","flag-gi","flag-gl","flag-gm","flag-gn","flag-gp","flag-gq","flag-gr","flag-gs","flag-gt","flag-gu","flag-gw","flag-gy","flag-hk","flag-hm","flag-hn","flag-hr","flag-ht","flag-hu","flag-ic","flag-id","flag-ie","flag-il","flag-im","flag-in","flag-io","flag-iq","flag-ir","flag-is","it","flag-je","flag-jm","flag-jo","jp","flag-ke","flag-kg","flag-kh","flag-ki","flag-km","flag-kn","flag-kp","kr","flag-kw","flag-ky","flag-kz","flag-la","flag-lb","flag-lc","flag-li","flag-lk","flag-lr","flag-ls","flag-lt","flag-lu","flag-lv","flag-ly","flag-ma","flag-mc","flag-md","flag-me","flag-mf","flag-mg","flag-mh","flag-mk","flag-ml","flag-mm","flag-mn","flag-mo","flag-mp","flag-mq","flag-mr","flag-ms","flag-mt","flag-mu","flag-mv","flag-mw","flag-mx","flag-my","flag-mz","flag-na","flag-nc","flag-ne","flag-nf","flag-ng","flag-ni","flag-nl","flag-no","flag-np","flag-nr","flag-nu","flag-nz","flag-om","flag-pa","flag-pe","flag-pf","flag-pg","flag-ph","flag-pk","flag-pl","flag-pm","flag-pn","flag-pr","flag-ps","flag-pt","flag-pw","flag-py","flag-qa","flag-re","flag-ro","flag-rs","ru","flag-rw","flag-sa","flag-sb","flag-sc","flag-sd","flag-se","flag-sg","flag-sh","flag-si","flag-sj","flag-sk","flag-sl","flag-sm","flag-sn","flag-so","flag-sr","flag-ss","flag-st","flag-sv","flag-sx","flag-sy","flag-sz","flag-ta","flag-tc","flag-td","flag-tf","flag-tg","flag-th","flag-tj","flag-tk","flag-tl","flag-tm","flag-tn","flag-to","flag-tr","flag-tt","flag-tv","flag-tw","flag-tz","flag-ua","flag-ug","flag-um","flag-un","us","flag-uy","flag-uz","flag-va","flag-vc","flag-ve","flag-vg","flag-vi","flag-vn","flag-vu","flag-wf","flag-ws","flag-xk","flag-ye","flag-yt","flag-za","flag-zm","flag-zw","koko","sa","u7121","u6307","u7981","u7a7a","u5408","u6e80","u6709","u6708","u7533","u5272","u55b6","ideograph_advantage","accept","cyclone","foggy","closed_umbrella","night_with_stars","sunrise_over_mountains","sunrise","city_sunset","city_sunrise","rainbow","bridge_at_night","ocean","volcano","milky_way","earth_africa","earth_americas","earth_asia","globe_with_meridians","new_moon","waxing_crescent_moon","first_quarter_moon","moon","full_moon","waning_gibbous_moon","last_quarter_moon","waning_crescent_moon","crescent_moon","new_moon_with_face","first_quarter_moon_with_face","last_quarter_moon_with_face","full_moon_with_face","sun_with_face","star2","stars","thermometer","mostly_sunny","barely_sunny","partly_sunny_rain","rain_cloud","snow_cloud","lightning","tornado","fog","wind_blowing_face","hotdog","taco","burrito","chestnut","seedling","evergreen_tree","deciduous_tree","palm_tree","cactus","hot_pepper","tulip","cherry_blossom","rose","hibiscus","sunflower","blossom","corn","ear_of_rice","herb","four_leaf_clover","maple_leaf","fallen_leaf","leaves","mushroom","tomato","eggplant","grapes","melon","watermelon","tangerine","lemon","banana","pineapple","apple","green_apple","pear","peach","cherries","strawberry","hamburger","pizza","meat_on_bone","poultry_leg","rice_cracker","rice_ball","rice","curry","ramen","spaghetti","bread","fries","sweet_potato","dango","oden","sushi","fried_shrimp","fish_cake","icecream","shaved_ice","ice_cream","doughnut","cookie","chocolate_bar","candy","lollipop","custard","honey_pot","cake","bento","stew","fried_egg","fork_and_knife","tea","sake","wine_glass","cocktail","tropical_drink","beer","beers","baby_bottle","knife_fork_plate","champagne","popcorn","ribbon","gift","birthday","jack_o_lantern","christmas_tree","santa","fireworks","sparkler","balloon","tada","confetti_ball","tanabata_tree","crossed_flags","bamboo","dolls","flags","wind_chime","rice_scene","school_satchel","mortar_board","medal","reminder_ribbon","studio_microphone","level_slider","control_knobs","film_frames","admission_tickets","carousel_horse","ferris_wheel","roller_coaster","fishing_pole_and_fish","microphone","movie_camera","cinema","headphones","art","tophat","circus_tent","ticket","clapper","performing_arts","video_game","dart","slot_machine","8ball","game_die","bowling","flower_playing_cards","musical_note","notes","saxophone","guitar","musical_keyboard","trumpet","violin","musical_score","running_shirt_with_sash","tennis","ski","basketball","checkered_flag","snowboarder","woman-running","man-running","runner","woman-surfing","man-surfing","surfer","sports_medal","trophy","horse_racing","football","rugby_football","woman-swimming","man-swimming","swimmer","woman-lifting-weights","man-lifting-weights","weight_lifter","woman-golfing","man-golfing","golfer","racing_motorcycle","racing_car","cricket_bat_and_ball","volleyball","field_hockey_stick_and_ball","ice_hockey_stick_and_puck","table_tennis_paddle_and_ball","snow_capped_mountain","camping","beach_with_umbrella","building_construction","house_buildings","cityscape","derelict_house_building","classical_building","desert","desert_island","national_park","stadium","house","house_with_garden","office","post_office","european_post_office","hospital","bank","atm","hotel","love_hotel","convenience_store","school","department_store","factory","izakaya_lantern","japanese_castle","european_castle","rainbow-flag","transgender_flag","waving_white_flag","pirate_flag","flag-england","flag-scotland","flag-wales","waving_black_flag","rosette","label","badminton_racquet_and_shuttlecock","bow_and_arrow","amphora","rat","mouse2","ox","water_buffalo","cow2","tiger2","leopard","rabbit2","black_cat","cat2","dragon","crocodile","whale2","snail","snake","racehorse","ram","goat","sheep","monkey","rooster","chicken","service_dog","dog2","pig2","boar","elephant","octopus","shell","bug","ant","bee","ladybug","fish","tropical_fish","blowfish","turtle","hatching_chick","baby_chick","hatched_chick","bird","penguin","koala","poodle","dromedary_camel","camel","dolphin","mouse","cow","tiger","rabbit","cat","dragon_face","whale","horse","monkey_face","dog","pig","frog","hamster","wolf","polar_bear","bear","panda_face","pig_nose","feet","chipmunk","eyes","eye","ear","nose","lips","tongue","point_up_2","point_down","point_left","point_right","facepunch","wave","ok_hand","+1","-1","clap","open_hands","crown","womans_hat","eyeglasses","necktie","shirt","jeans","dress","kimono","bikini","womans_clothes","purse","handbag","pouch","mans_shoe","athletic_shoe","high_heel","sandal","boot","footprints","bust_in_silhouette","busts_in_silhouette","boy","girl","male-farmer","male-cook","man_feeding_baby","male-student","male-singer","male-artist","male-teacher","male-factory-worker","man-boy-boy","man-boy","man-girl-boy","man-girl-girl","man-girl","man-man-boy","man-man-boy-boy","man-man-girl","man-man-girl-boy","man-man-girl-girl","man-woman-boy","man-woman-boy-boy","man-woman-girl","man-woman-girl-boy","man-woman-girl-girl","male-technologist","male-office-worker","male-mechanic","male-scientist","male-astronaut","male-firefighter","man_with_probing_cane","red_haired_man","curly_haired_man","bald_man","white_haired_man","man_in_motorized_wheelchair","man_in_manual_wheelchair","male-doctor","male-judge","male-pilot","man-heart-man","man-kiss-man","man","female-farmer","female-cook","woman_feeding_baby","female-student","female-singer","female-artist","female-teacher","female-factory-worker","woman-boy-boy","woman-boy","woman-girl-boy","woman-girl-girl","woman-girl","woman-woman-boy","woman-woman-boy-boy","woman-woman-girl","woman-woman-girl-boy","woman-woman-girl-girl","female-technologist","female-office-worker","female-mechanic","female-scientist","female-astronaut","female-firefighter","woman_with_probing_cane","red_haired_woman","curly_haired_woman","bald_woman","white_haired_woman","woman_in_motorized_wheelchair","woman_in_manual_wheelchair","female-doctor","female-judge","female-pilot","woman-heart-man","woman-heart-woman","woman-kiss-man","woman-kiss-woman","woman","family","man_and_woman_holding_hands","two_men_holding_hands","two_women_holding_hands","female-police-officer","male-police-officer","cop","woman-with-bunny-ears-partying","man-with-bunny-ears-partying","dancers","woman_with_veil","man_with_veil","bride_with_veil","blond-haired-woman","blond-haired-man","person_with_blond_hair","man_with_gua_pi_mao","woman-wearing-turban","man-wearing-turban","man_with_turban","older_man","older_woman","baby","female-construction-worker","male-construction-worker","construction_worker","princess","japanese_ogre","japanese_goblin","ghost","angel","alien","space_invader","imp","skull","woman-tipping-hand","man-tipping-hand","information_desk_person","female-guard","male-guard","guardsman","dancer","lipstick","nail_care","woman-getting-massage","man-getting-massage","massage","woman-getting-haircut","man-getting-haircut","haircut","barber","syringe","pill","kiss","love_letter","ring","gem","couplekiss","bouquet","couple_with_heart","wedding","heartbeat","broken_heart","two_hearts","sparkling_heart","heartpulse","cupid","blue_heart","green_heart","yellow_heart","purple_heart","gift_heart","revolving_hearts","heart_decoration","diamond_shape_with_a_dot_inside","bulb","anger","bomb","zzz","boom","sweat_drops","droplet","dash","hankey","muscle","dizzy","speech_balloon","thought_balloon","white_flower","100","moneybag","currency_exchange","heavy_dollar_sign","credit_card","yen","dollar","euro","pound","money_with_wings","chart","seat","computer","briefcase","minidisc","floppy_disk","cd","dvd","file_folder","open_file_folder","page_with_curl","page_facing_up","date","calendar","card_index","chart_with_upwards_trend","chart_with_downwards_trend","bar_chart","clipboard","pushpin","round_pushpin","paperclip","straight_ruler","triangular_ruler","bookmark_tabs","ledger","notebook","notebook_with_decorative_cover","closed_book","book","green_book","blue_book","orange_book","books","name_badge","scroll","memo","telephone_receiver","pager","fax","satellite_antenna","loudspeaker","mega","outbox_tray","inbox_tray","package","e-mail","incoming_envelope","envelope_with_arrow","mailbox_closed","mailbox","mailbox_with_mail","mailbox_with_no_mail","postbox","postal_horn","newspaper","iphone","calling","vibration_mode","mobile_phone_off","no_mobile_phones","signal_strength","camera","camera_with_flash","video_camera","tv","radio","vhs","film_projector","prayer_beads","twisted_rightwards_arrows","repeat","repeat_one","arrows_clockwise","arrows_counterclockwise","low_brightness","high_brightness","mute","speaker","sound","loud_sound","battery","electric_plug","mag","mag_right","lock_with_ink_pen","closed_lock_with_key","key","lock","unlock","bell","no_bell","bookmark","link","radio_button","back","end","on","soon","top","underage","keycap_ten","capital_abcd","abcd","1234","symbols","abc","fire","flashlight","wrench","hammer","nut_and_bolt","hocho","gun","microscope","telescope","crystal_ball","six_pointed_star","beginner","trident","black_square_button","white_square_button","red_circle","large_blue_circle","large_orange_diamond","large_blue_diamond","small_orange_diamond","small_blue_diamond","small_red_triangle","small_red_triangle_down","arrow_up_small","arrow_down_small","om_symbol","dove_of_peace","kaaba","mosque","synagogue","menorah_with_nine_branches","clock1","clock2","clock3","clock4","clock5","clock6","clock7","clock8","clock9","clock10","clock11","clock12","clock130","clock230","clock330","clock430","clock530","clock630","clock730","clock830","clock930","clock1030","clock1130","clock1230","candle","mantelpiece_clock","hole","man_in_business_suit_levitating","female-detective","male-detective","sleuth_or_spy","dark_sunglasses","spider","spider_web","joystick","man_dancing","linked_paperclips","lower_left_ballpoint_pen","lower_left_fountain_pen","lower_left_paintbrush","lower_left_crayon","raised_hand_with_fingers_splayed","middle_finger","spock-hand","black_heart","desktop_computer","printer","three_button_mouse","trackball","frame_with_picture","card_index_dividers","card_file_box","file_cabinet","wastebasket","spiral_note_pad","spiral_calendar_pad","compression","old_key","rolled_up_newspaper","dagger_knife","speaking_head_in_silhouette","left_speech_bubble","right_anger_bubble","ballot_box_with_ballot","world_map","mount_fuji","tokyo_tower","statue_of_liberty","japan","moyai","grinning","grin","joy","smiley","smile","sweat_smile","laughing","innocent","smiling_imp","wink","blush","yum","relieved","heart_eyes","sunglasses","smirk","neutral_face","expressionless","unamused","sweat","pensive","confused","confounded","kissing","kissing_heart","kissing_smiling_eyes","kissing_closed_eyes","stuck_out_tongue","stuck_out_tongue_winking_eye","stuck_out_tongue_closed_eyes","disappointed","worried","angry","rage","cry","persevere","triumph","disappointed_relieved","frowning","anguished","fearful","weary","sleepy","tired_face","grimacing","sob","open_mouth","hushed","cold_sweat","scream","astonished","flushed","sleeping","dizzy_face","no_mouth","mask","smile_cat","joy_cat","smiley_cat","heart_eyes_cat","smirk_cat","kissing_cat","pouting_cat","crying_cat_face","scream_cat","slightly_frowning_face","slightly_smiling_face","upside_down_face","face_with_rolling_eyes","woman-gesturing-no","man-gesturing-no","no_good","woman-gesturing-ok","man-gesturing-ok","ok_woman","woman-bowing","man-bowing","bow","see_no_evil","hear_no_evil","speak_no_evil","woman-raising-hand","man-raising-hand","raising_hand","raised_hands","woman-frowning","man-frowning","person_frowning","woman-pouting","man-pouting","person_with_pouting_face","pray","rocket","helicopter","steam_locomotive","railway_car","bullettrain_side","bullettrain_front","train2","metro","light_rail","station","tram","train","bus","oncoming_bus","trolleybus","busstop","minibus","ambulance","fire_engine","police_car","oncoming_police_car","taxi","oncoming_taxi","car","oncoming_automobile","blue_car","truck","articulated_lorry","tractor","monorail","mountain_railway","suspension_railway","mountain_cableway","aerial_tramway","ship","woman-rowing-boat","man-rowing-boat","rowboat","speedboat","traffic_light","vertical_traffic_light","construction","rotating_light","triangular_flag_on_post","door","no_entry_sign","smoking","no_smoking","put_litter_in_its_place","do_not_litter","potable_water","non-potable_water","bike","no_bicycles","woman-biking","man-biking","bicyclist","woman-mountain-biking","man-mountain-biking","mountain_bicyclist","woman-walking","man-walking","walking","no_pedestrians","children_crossing","mens","womens","restroom","baby_symbol","toilet","wc","shower","bath","bathtub","passport_control","customs","baggage_claim","left_luggage","couch_and_lamp","sleeping_accommodation","shopping_bags","bellhop_bell","bed","place_of_worship","octagonal_sign","shopping_trolley","hindu_temple","hut","elevator","hammer_and_wrench","shield","oil_drum","motorway","railway_track","motor_boat","small_airplane","airplane_departure","airplane_arriving","satellite","passenger_ship","scooter","motor_scooter","canoe","sled","flying_saucer","skateboard","auto_rickshaw","pickup_truck","roller_skate","large_orange_circle","large_yellow_circle","large_green_circle","large_purple_circle","large_brown_circle","large_red_square","large_blue_square","large_orange_square","large_yellow_square","large_green_square","large_purple_square","large_brown_square","pinched_fingers","white_heart","brown_heart","pinching_hand","zipper_mouth_face","money_mouth_face","face_with_thermometer","nerd_face","thinking_face","face_with_head_bandage","robot_face","hugging_face","the_horns","call_me_hand","raised_back_of_hand","left-facing_fist","right-facing_fist","handshake","crossed_fingers","i_love_you_hand_sign","face_with_cowboy_hat","clown_face","nauseated_face","rolling_on_the_floor_laughing","drooling_face","lying_face","woman-facepalming","man-facepalming","face_palm","sneezing_face","face_with_raised_eyebrow","star-struck","zany_face","shushing_face","face_with_symbols_on_mouth","face_with_hand_over_mouth","face_vomiting","exploding_head","pregnant_woman","breast-feeding","palms_up_together","selfie","prince","woman_in_tuxedo","man_in_tuxedo","person_in_tuxedo","mrs_claus","woman-shrugging","man-shrugging","shrug","woman-cartwheeling","man-cartwheeling","person_doing_cartwheel","woman-juggling","man-juggling","juggling","fencer","woman-wrestling","man-wrestling","wrestlers","woman-playing-water-polo","man-playing-water-polo","water_polo","woman-playing-handball","man-playing-handball","handball","diving_mask","wilted_flower","drum_with_drumsticks","clinking_glasses","tumbler_glass","spoon","goal_net","first_place_medal","second_place_medal","third_place_medal","boxing_glove","martial_arts_uniform","curling_stone","lacrosse","softball","flying_disc","croissant","avocado","cucumber","bacon","potato","carrot","baguette_bread","green_salad","shallow_pan_of_food","stuffed_flatbread","egg","glass_of_milk","peanuts","kiwifruit","pancakes","dumpling","fortune_cookie","takeout_box","chopsticks","bowl_with_spoon","cup_with_straw","coconut","broccoli","pie","pretzel","cut_of_meat","sandwich","canned_food","leafy_green","mango","moon_cake","bagel","smiling_face_with_3_hearts","yawning_face","smiling_face_with_tear","partying_face","woozy_face","hot_face","cold_face","ninja","disguised_face","pleading_face","sari","lab_coat","goggles","hiking_boot","womans_flat_shoe","crab","lion_face","scorpion","turkey","unicorn_face","eagle","duck","bat","shark","owl","fox_face","butterfly","deer","gorilla","lizard","rhinoceros","shrimp","squid","giraffe_face","zebra_face","hedgehog","sauropod","t-rex","cricket","kangaroo","llama","peacock","hippopotamus","parrot","raccoon","lobster","mosquito","microbe","badger","swan","mammoth","dodo","sloth","otter","orangutan","skunk","flamingo","oyster","beaver","bison","seal","guide_dog","probing_cane","bone","leg","foot","tooth","female_superhero","male_superhero","superhero","female_supervillain","male_supervillain","supervillain","safety_vest","ear_with_hearing_aid","motorized_wheelchair","manual_wheelchair","mechanical_arm","mechanical_leg","cheese_wedge","cupcake","salt","beverage_box","garlic","onion","falafel","waffle","butter","mate_drink","ice_cube","bubble_tea","woman_standing","man_standing","standing_person","woman_kneeling","man_kneeling","kneeling_person","deaf_woman","deaf_man","deaf_person","face_with_monocle","farmer","cook","person_feeding_baby","mx_claus","student","singer","artist","teacher","factory_worker","technologist","office_worker","mechanic","scientist","astronaut","firefighter","people_holding_hands","person_with_probing_cane","red_haired_person","curly_haired_person","bald_person","white_haired_person","person_in_motorized_wheelchair","person_in_manual_wheelchair","health_worker","judge","pilot","adult","child","older_adult","bearded_person","person_with_headscarf","woman_in_steamy_room","man_in_steamy_room","person_in_steamy_room","woman_climbing","man_climbing","person_climbing","woman_in_lotus_position","man_in_lotus_position","person_in_lotus_position","female_mage","male_mage","mage","female_fairy","male_fairy","fairy","female_vampire","male_vampire","vampire","mermaid","merman","merperson","female_elf","male_elf","elf","female_genie","male_genie","genie","female_zombie","male_zombie","zombie","brain","orange_heart","billed_cap","scarf","gloves","coat","socks","red_envelope","firecracker","jigsaw","test_tube","petri_dish","dna","compass","abacus","fire_extinguisher","toolbox","bricks","magnet","luggage","lotion_bottle","thread","yarn","safety_pin","teddy_bear","broom","basket","roll_of_paper","soap","sponge","receipt","nazar_amulet","ballet_shoes","one-piece_swimsuit","briefs","shorts","thong_sandal","drop_of_blood","adhesive_bandage","stethoscope","yo-yo","kite","parachute","boomerang","magic_wand","pinata","nesting_dolls","ringed_planet","chair","razor","axe","diya_lamp","banjo","military_helmet","accordion","long_drum","coin","carpentry_saw","screwdriver","ladder","hook","mirror","window","plunger","sewing_needle","knot","bucket","mouse_trap","toothbrush","headstone","placard","rock","fly","worm","beetle","cockroach","potted_plant","wood","feather","anatomical_heart","lungs","people_hugging","blueberries","bell_pepper","olive","flatbread","tamale","fondue","teapot","bangbang","interrobang","tm","information_source","left_right_arrow","arrow_up_down","arrow_upper_left","arrow_upper_right","arrow_lower_right","arrow_lower_left","leftwards_arrow_with_hook","arrow_right_hook","watch","hourglass","keyboard","eject","fast_forward","rewind","arrow_double_up","arrow_double_down","black_right_pointing_double_triangle_with_vertical_bar","black_left_pointing_double_triangle_with_vertical_bar","black_right_pointing_triangle_with_double_vertical_bar","alarm_clock","stopwatch","timer_clock","hourglass_flowing_sand","double_vertical_bar","black_square_for_stop","black_circle_for_record","m","black_small_square","white_small_square","arrow_forward","arrow_backward","white_medium_square","black_medium_square","white_medium_small_square","black_medium_small_square","sunny","cloud","umbrella","snowman","comet","phone","ballot_box_with_check","umbrella_with_rain_drops","coffee","shamrock","point_up","skull_and_crossbones","radioactive_sign","biohazard_sign","orthodox_cross","star_and_crescent","peace_symbol","yin_yang","wheel_of_dharma","white_frowning_face","relaxed","female_sign","male_sign","aries","taurus","gemini","cancer","leo","virgo","libra","scorpius","sagittarius","capricorn","aquarius","pisces","chess_pawn","spades","clubs","hearts","diamonds","hotsprings","recycle","infinity","wheelchair","hammer_and_pick","anchor","crossed_swords","medical_symbol","scales","alembic","gear","atom_symbol","fleur_de_lis","warning","zap","transgender_symbol","white_circle","black_circle","coffin","funeral_urn","soccer","baseball","snowman_without_snow","partly_sunny","thunder_cloud_and_rain","ophiuchus","pick","helmet_with_white_cross","chains","no_entry","shinto_shrine","church","mountain","umbrella_on_ground","fountain","golf","ferry","boat","skier","ice_skate","woman-bouncing-ball","man-bouncing-ball","person_with_ball","tent","fuelpump","scissors","white_check_mark","airplane","email","fist","hand","v","writing_hand","pencil2","black_nib","heavy_check_mark","heavy_multiplication_x","latin_cross","star_of_david","sparkles","eight_spoked_asterisk","eight_pointed_black_star","snowflake","sparkle","x","negative_squared_cross_mark","question","grey_question","grey_exclamation","exclamation","heavy_heart_exclamation_mark_ornament","heart","heavy_plus_sign","heavy_minus_sign","heavy_division_sign","arrow_right","curly_loop","loop","arrow_heading_up","arrow_heading_down","arrow_left","arrow_up","arrow_down","black_large_square","white_large_square","star","o","wavy_dash","part_alternation_mark","congratulations","secret"],"keywords":{"100":["💯","hundred_points","score","perfect","numbers","century","exam","quiz","test","pass","hundred","100"],"1234":["🔢","input_numbers","numbers","blue-square","1234"],"neko":["neko","cat","cat butt","butt"],"hash":["hash"],"keycap_star":["keycap_star"],"zero":["zero"],"one":["one"],"two":["two"],"three":["three"],"four":["four"],"five":["five"],"six":["six"],"seven":["seven"],"eight":["eight"],"nine":["nine"],"copyright":["copyright"],"registered":["registered"],"mahjong":["🀄","mahjong_red_dragon","game","play","chinese","kanji","mahjong"],"black_joker":["🃏","joker","poker","cards","game","play","magic","black_joker"],"a":["🅰️","a_button","red-square","alphabet","letter","a"],"b":["🅱️","b_button","red-square","alphabet","letter","b"],"o2":["🅾️","o_button","alphabet","red-square","letter","o2"],"parking":["🅿️","p_button","cars","blue-square","alphabet","letter","parking"],"ab":["🆎","ab_button","red-square","alphabet","ab"],"cl":["🆑","cl_button","alphabet","words","red-square","cl"],"cool":["🆒","cool_button","words","blue-square","cool"],"free":["🆓","free_button","blue-square","words","free"],"id":["🆔","id_button","purple-square","words","id"],"new":["🆕","new_button","blue-square","words","start","new"],"ng":["🆖","ng_button","blue-square","words","shape","icon","ng"],"ok":["🆗","ok_button","good","agree","yes","blue-square","ok"],"sos":["🆘","sos_button","help","red-square","words","emergency","911","sos"],"up":["🆙","up_button","blue-square","above","high","up"],"vs":["🆚","vs_button","words","orange-square","vs"],"flag-ac":["🇦🇨","flag_ascension_island","flag-ac"],"flag-ad":["🇦🇨","flag_ascension_island","flag-ad"],"flag-ae":["🇦🇨","flag_ascension_island","flag-ae"],"flag-af":["🇦🇨","flag_ascension_island","flag-af"],"flag-ag":["🇦🇨","flag_ascension_island","flag-ag"],"flag-ai":["🇦🇨","flag_ascension_island","flag-ai"],"flag-al":["🇦🇨","flag_ascension_island","flag-al"],"flag-am":["🇦🇨","flag_ascension_island","flag-am"],"flag-ao":["🇦🇨","flag_ascension_island","flag-ao"],"flag-aq":["🇦🇨","flag_ascension_island","flag-aq"],"flag-ar":["🇦🇨","flag_ascension_island","flag-ar"],"flag-as":["🇦🇨","flag_ascension_island","flag-as"],"flag-at":["🇦🇨","flag_ascension_island","flag-at"],"flag-au":["🇦🇨","flag_ascension_island","flag-au"],"flag-aw":["🇦🇨","flag_ascension_island","flag-aw"],"flag-ax":["🇦🇨","flag_ascension_island","flag-ax"],"flag-az":["🇦🇨","flag_ascension_island","flag-az"],"flag-ba":["🇦🇨","flag_ascension_island","flag-ba"],"flag-bb":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bb"],"flag-bd":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bd"],"flag-be":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-be"],"flag-bf":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bf"],"flag-bg":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bg"],"flag-bh":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bh"],"flag-bi":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bi"],"flag-bj":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bj"],"flag-bl":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bl"],"flag-bm":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bm"],"flag-bn":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bn"],"flag-bo":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bo"],"flag-bq":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bq"],"flag-br":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-br"],"flag-bs":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bs"],"flag-bt":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bt"],"flag-bv":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bv"],"flag-bw":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bw"],"flag-by":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-by"],"flag-bz":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-bz"],"flag-ca":["🇦🇨","flag_ascension_island","flag-ca"],"flag-cc":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cc"],"flag-cd":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cd"],"flag-cf":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cf"],"flag-cg":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cg"],"flag-ch":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-ch"],"flag-ci":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-ci"],"flag-ck":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-ck"],"flag-cl":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cl"],"flag-cm":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cm"],"cn":["🇨🇦","flag_canada","ca","flag","nation","country","banner","cn","flag-cn"],"flag-co":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-co"],"flag-cp":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cp"],"flag-cr":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cr"],"flag-cu":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cu"],"flag-cv":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cv"],"flag-cw":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cw"],"flag-cx":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cx"],"flag-cy":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cy"],"flag-cz":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-cz"],"de":["🇩🇪","flag_germany","german","nation","flag","country","banner","de","flag-de"],"flag-dg":["🇩🇪","flag_germany","german","nation","flag","country","banner","flag-dg"],"flag-dj":["🇩🇪","flag_germany","german","nation","flag","country","banner","flag-dj"],"flag-dk":["🇩🇪","flag_germany","german","nation","flag","country","banner","flag-dk"],"flag-dm":["🇩🇪","flag_germany","german","nation","flag","country","banner","flag-dm"],"flag-do":["🇩🇪","flag_germany","german","nation","flag","country","banner","flag-do"],"flag-dz":["🇩🇪","flag_germany","german","nation","flag","country","banner","flag-dz"],"flag-ea":["🇦🇨","flag_ascension_island","flag-ea"],"flag-ec":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-ec"],"flag-ee":["🇪🇦","flag_ceuta_melilla","flag-ee"],"flag-eg":["🇪🇦","flag_ceuta_melilla","flag-eg"],"flag-eh":["🇪🇦","flag_ceuta_melilla","flag-eh"],"flag-er":["🇪🇦","flag_ceuta_melilla","flag-er"],"es":["🇪🇦","flag_ceuta_melilla","es","flag-es"],"flag-et":["🇪🇦","flag_ceuta_melilla","flag-et"],"flag-eu":["🇪🇦","flag_ceuta_melilla","flag-eu"],"flag-fi":["🇫🇮","flag_finland","fi","flag","nation","country","banner","flag-fi"],"flag-fj":["🇫🇮","flag_finland","fi","flag","nation","country","banner","flag-fj"],"flag-fk":["🇫🇮","flag_finland","fi","flag","nation","country","banner","flag-fk"],"flag-fm":["🇫🇮","flag_finland","fi","flag","nation","country","banner","flag-fm"],"flag-fo":["🇫🇮","flag_finland","fi","flag","nation","country","banner","flag-fo"],"fr":["🇫🇮","flag_finland","fi","flag","nation","country","banner","fr","flag-fr"],"flag-ga":["🇦🇨","flag_ascension_island","flag-ga"],"gb":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","gb","uk","flag-gb"],"flag-gd":["🇩🇪","flag_germany","german","nation","flag","country","banner","flag-gd"],"flag-ge":["🇪🇦","flag_ceuta_melilla","flag-ge"],"flag-gf":["🇫🇮","flag_finland","fi","flag","nation","country","banner","flag-gf"],"flag-gg":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gg"],"flag-gh":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gh"],"flag-gi":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gi"],"flag-gl":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gl"],"flag-gm":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gm"],"flag-gn":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gn"],"flag-gp":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gp"],"flag-gq":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gq"],"flag-gr":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gr"],"flag-gs":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gs"],"flag-gt":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gt"],"flag-gu":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gu"],"flag-gw":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gw"],"flag-gy":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-gy"],"flag-hk":["🇭🇰","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner","flag-hk"],"flag-hm":["🇭🇰","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner","flag-hm"],"flag-hn":["🇭🇰","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner","flag-hn"],"flag-hr":["🇭🇰","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner","flag-hr"],"flag-ht":["🇭🇰","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner","flag-ht"],"flag-hu":["🇭🇰","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner","flag-hu"],"flag-ic":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-ic"],"flag-id":["🇩🇪","flag_germany","german","nation","flag","country","banner","flag-id"],"flag-ie":["🇪🇦","flag_ceuta_melilla","flag-ie"],"flag-il":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-il"],"flag-im":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-im"],"flag-in":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-in"],"flag-io":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-io"],"flag-iq":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-iq"],"flag-ir":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-ir"],"flag-is":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-is"],"it":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","it","flag-it"],"flag-je":["🇪🇦","flag_ceuta_melilla","flag-je"],"flag-jm":["🇯🇪","flag_jersey","je","flag","nation","country","banner","flag-jm"],"flag-jo":["🇯🇪","flag_jersey","je","flag","nation","country","banner","flag-jo"],"jp":["🇯🇪","flag_jersey","je","flag","nation","country","banner","jp","flag-jp"],"flag-ke":["🇪🇦","flag_ceuta_melilla","flag-ke"],"flag-kg":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-kg"],"flag-kh":["🇭🇰","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner","flag-kh"],"flag-ki":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-ki"],"flag-km":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-km"],"flag-kn":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-kn"],"flag-kp":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-kp"],"kr":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","kr","flag-kr"],"flag-kw":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-kw"],"flag-ky":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-ky"],"flag-kz":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-kz"],"flag-la":["🇦🇨","flag_ascension_island","flag-la"],"flag-lb":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-lb"],"flag-lc":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-lc"],"flag-li":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-li"],"flag-lk":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-lk"],"flag-lr":["🇱🇦","flag_laos","lao","democratic","republic","flag","nation","country","banner","flag-lr"],"flag-ls":["🇱🇦","flag_laos","lao","democratic","republic","flag","nation","country","banner","flag-ls"],"flag-lt":["🇱🇦","flag_laos","lao","democratic","republic","flag","nation","country","banner","flag-lt"],"flag-lu":["🇱🇦","flag_laos","lao","democratic","republic","flag","nation","country","banner","flag-lu"],"flag-lv":["🇱🇦","flag_laos","lao","democratic","republic","flag","nation","country","banner","flag-lv"],"flag-ly":["🇱🇦","flag_laos","lao","democratic","republic","flag","nation","country","banner","flag-ly"],"flag-ma":["🇦🇨","flag_ascension_island","flag-ma"],"flag-mc":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-mc"],"flag-md":["🇩🇪","flag_germany","german","nation","flag","country","banner","flag-md"],"flag-me":["🇪🇦","flag_ceuta_melilla","flag-me"],"flag-mf":["🇫🇮","flag_finland","fi","flag","nation","country","banner","flag-mf"],"flag-mg":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-mg"],"flag-mh":["🇭🇰","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner","flag-mh"],"flag-mk":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-mk"],"flag-ml":["🇱🇦","flag_laos","lao","democratic","republic","flag","nation","country","banner","flag-ml"],"flag-mm":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mm"],"flag-mn":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mn"],"flag-mo":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mo"],"flag-mp":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mp"],"flag-mq":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mq"],"flag-mr":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mr"],"flag-ms":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-ms"],"flag-mt":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mt"],"flag-mu":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mu"],"flag-mv":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mv"],"flag-mw":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mw"],"flag-mx":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mx"],"flag-my":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-my"],"flag-mz":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-mz"],"flag-na":["🇦🇨","flag_ascension_island","flag-na"],"flag-nc":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-nc"],"flag-ne":["🇪🇦","flag_ceuta_melilla","flag-ne"],"flag-nf":["🇫🇮","flag_finland","fi","flag","nation","country","banner","flag-nf"],"flag-ng":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-ng"],"flag-ni":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-ni"],"flag-nl":["🇱🇦","flag_laos","lao","democratic","republic","flag","nation","country","banner","flag-nl"],"flag-no":["🇳🇦","flag_namibia","na","flag","nation","country","banner","flag-no"],"flag-np":["🇳🇦","flag_namibia","na","flag","nation","country","banner","flag-np"],"flag-nr":["🇳🇦","flag_namibia","na","flag","nation","country","banner","flag-nr"],"flag-nu":["🇳🇦","flag_namibia","na","flag","nation","country","banner","flag-nu"],"flag-nz":["🇳🇦","flag_namibia","na","flag","nation","country","banner","flag-nz"],"flag-om":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-om"],"flag-pa":["🇦🇨","flag_ascension_island","flag-pa"],"flag-pe":["🇪🇦","flag_ceuta_melilla","flag-pe"],"flag-pf":["🇫🇮","flag_finland","fi","flag","nation","country","banner","flag-pf"],"flag-pg":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-pg"],"flag-ph":["🇭🇰","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner","flag-ph"],"flag-pk":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-pk"],"flag-pl":["🇱🇦","flag_laos","lao","democratic","republic","flag","nation","country","banner","flag-pl"],"flag-pm":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-pm"],"flag-pn":["🇳🇦","flag_namibia","na","flag","nation","country","banner","flag-pn"],"flag-pr":["🇵🇦","flag_panama","pa","flag","nation","country","banner","flag-pr"],"flag-ps":["🇵🇦","flag_panama","pa","flag","nation","country","banner","flag-ps"],"flag-pt":["🇵🇦","flag_panama","pa","flag","nation","country","banner","flag-pt"],"flag-pw":["🇵🇦","flag_panama","pa","flag","nation","country","banner","flag-pw"],"flag-py":["🇵🇦","flag_panama","pa","flag","nation","country","banner","flag-py"],"flag-qa":["🇦🇨","flag_ascension_island","flag-qa"],"flag-re":["🇪🇦","flag_ceuta_melilla","flag-re"],"flag-ro":["🇴🇲","flag_oman","om_symbol","flag","nation","country","banner","flag-ro"],"flag-rs":["🇷🇪","flag_reunion","réunion","flag","nation","country","banner","flag-rs"],"ru":["🇷🇪","flag_reunion","réunion","flag","nation","country","banner","ru","flag-ru"],"flag-rw":["🇷🇪","flag_reunion","réunion","flag","nation","country","banner","flag-rw"],"flag-sa":["🇦🇨","flag_ascension_island","flag-sa"],"flag-sb":["🇧🇦","flag_bosnia_herzegovina","bosnia","herzegovina","flag","nation","country","banner","flag-sb"],"flag-sc":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-sc"],"flag-sd":["🇩🇪","flag_germany","german","nation","flag","country","banner","flag-sd"],"flag-se":["🇪🇦","flag_ceuta_melilla","flag-se"],"flag-sg":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-sg"],"flag-sh":["🇭🇰","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner","flag-sh"],"flag-si":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-si"],"flag-sj":["🇯🇪","flag_jersey","je","flag","nation","country","banner","flag-sj"],"flag-sk":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-sk"],"flag-sl":["🇱🇦","flag_laos","lao","democratic","republic","flag","nation","country","banner","flag-sl"],"flag-sm":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-sm"],"flag-sn":["🇳🇦","flag_namibia","na","flag","nation","country","banner","flag-sn"],"flag-so":["🇴🇲","flag_oman","om_symbol","flag","nation","country","banner","flag-so"],"flag-sr":["🇷🇪","flag_reunion","réunion","flag","nation","country","banner","flag-sr"],"flag-ss":["🇸🇦","flag_saudi_arabia","flag","nation","country","banner","flag-ss"],"flag-st":["🇸🇦","flag_saudi_arabia","flag","nation","country","banner","flag-st"],"flag-sv":["🇸🇦","flag_saudi_arabia","flag","nation","country","banner","flag-sv"],"flag-sx":["🇸🇦","flag_saudi_arabia","flag","nation","country","banner","flag-sx"],"flag-sy":["🇸🇦","flag_saudi_arabia","flag","nation","country","banner","flag-sy"],"flag-sz":["🇸🇦","flag_saudi_arabia","flag","nation","country","banner","flag-sz"],"flag-ta":["🇦🇨","flag_ascension_island","flag-ta"],"flag-tc":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-tc"],"flag-td":["🇩🇪","flag_germany","german","nation","flag","country","banner","flag-td"],"flag-tf":["🇫🇮","flag_finland","fi","flag","nation","country","banner","flag-tf"],"flag-tg":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-tg"],"flag-th":["🇭🇰","flag_hong_kong_sar_china","hong","kong","flag","nation","country","banner","flag-th"],"flag-tj":["🇯🇪","flag_jersey","je","flag","nation","country","banner","flag-tj"],"flag-tk":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-tk"],"flag-tl":["🇱🇦","flag_laos","lao","democratic","republic","flag","nation","country","banner","flag-tl"],"flag-tm":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-tm"],"flag-tn":["🇳🇦","flag_namibia","na","flag","nation","country","banner","flag-tn"],"flag-to":["🇴🇲","flag_oman","om_symbol","flag","nation","country","banner","flag-to"],"flag-tr":["🇷🇪","flag_reunion","réunion","flag","nation","country","banner","flag-tr"],"flag-tt":["🇹🇦","flag_tristan_da_cunha","flag-tt"],"flag-tv":["🇹🇦","flag_tristan_da_cunha","flag-tv"],"flag-tw":["🇹🇦","flag_tristan_da_cunha","flag-tw"],"flag-tz":["🇹🇦","flag_tristan_da_cunha","flag-tz"],"flag-ua":["🇦🇨","flag_ascension_island","flag-ua"],"flag-ug":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-ug"],"flag-um":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-um"],"flag-un":["🇳🇦","flag_namibia","na","flag","nation","country","banner","flag-un"],"us":["🇸🇦","flag_saudi_arabia","flag","nation","country","banner","us","flag-us"],"flag-uy":["🇺🇦","flag_ukraine","ua","flag","nation","country","banner","flag-uy"],"flag-uz":["🇺🇦","flag_ukraine","ua","flag","nation","country","banner","flag-uz"],"flag-va":["🇦🇨","flag_ascension_island","flag-va"],"flag-vc":["🇨🇦","flag_canada","ca","flag","nation","country","banner","flag-vc"],"flag-ve":["🇪🇦","flag_ceuta_melilla","flag-ve"],"flag-vg":["🇬🇦","flag_gabon","ga","flag","nation","country","banner","flag-vg"],"flag-vi":["🇮🇨","flag_canary_islands","canary","islands","flag","nation","country","banner","flag-vi"],"flag-vn":["🇳🇦","flag_namibia","na","flag","nation","country","banner","flag-vn"],"flag-vu":["🇺🇦","flag_ukraine","ua","flag","nation","country","banner","flag-vu"],"flag-wf":["🇫🇮","flag_finland","fi","flag","nation","country","banner","flag-wf"],"flag-ws":["🇸🇦","flag_saudi_arabia","flag","nation","country","banner","flag-ws"],"flag-xk":["🇰🇪","flag_kenya","ke","flag","nation","country","banner","flag-xk"],"flag-ye":["🇪🇦","flag_ceuta_melilla","flag-ye"],"flag-yt":["🇹🇦","flag_tristan_da_cunha","flag-yt"],"flag-za":["🇦🇨","flag_ascension_island","flag-za"],"flag-zm":["🇲🇦","flag_morocco","ma","flag","nation","country","banner","flag-zm"],"flag-zw":["🇼🇫","flag_wallis_futuna","wallis","futuna","flag","nation","country","banner","flag-zw"],"koko":["🈁","japanese_here_button","blue-square","here","katakana","japanese","destination","koko"],"sa":["🈂️","japanese_service_charge_button","japanese","blue-square","katakana","sa"],"u7121":["🈚","japanese_free_of_charge_button","nothing","chinese","kanji","japanese","orange-square","u7121"],"u6307":["🈯","japanese_reserved_button","chinese","point","green-square","kanji","u6307"],"u7981":["🈲","japanese_prohibited_button","kanji","japanese","chinese","forbidden","limit","restricted","red-square","u7981"],"u7a7a":["🈳","japanese_vacancy_button","kanji","japanese","chinese","empty","sky","blue-square","u7a7a"],"u5408":["🈴","japanese_passing_grade_button","japanese","chinese","join","kanji","red-square","u5408"],"u6e80":["🈵","japanese_no_vacancy_button","full","chinese","japanese","red-square","kanji","u6e80"],"u6709":["🈶","japanese_not_free_of_charge_button","orange-square","chinese","have","kanji","u6709"],"u6708":["🈷️","japanese_monthly_amount_button","chinese","month","moon","japanese","orange-square","kanji","u6708"],"u7533":["🈸","japanese_application_button","chinese","japanese","kanji","orange-square","u7533"],"u5272":["🈹","japanese_discount_button","cut","divide","chinese","kanji","pink-square","u5272"],"u55b6":["🈺","japanese_open_for_business_button","japanese","opening hours","orange-square","u55b6"],"ideograph_advantage":["🉐","japanese_bargain_button","chinese","kanji","obtain","get","circle","ideograph_advantage"],"accept":["🉑","japanese_acceptable_button","ok","good","chinese","kanji","agree","yes","orange-circle","accept"],"cyclone":["🌀","cyclone","weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],"foggy":["🌁","foggy","photo","mountain"],"closed_umbrella":["🌂","closed_umbrella","weather","rain","drizzle"],"night_with_stars":["🌃","night_with_stars","evening","city","downtown"],"sunrise_over_mountains":["🌄","sunrise_over_mountains","view","vacation","photo"],"sunrise":["🌅","sunrise","morning","view","vacation","photo"],"city_sunset":["🌆","cityscape_at_dusk","photo","evening","sky","buildings","city_sunset"],"city_sunrise":["🌇","sunset","photo","good morning","dawn","city_sunrise"],"rainbow":["🌈","rainbow","nature","happy","unicorn_face","photo","sky","spring"],"bridge_at_night":["🌉","bridge_at_night","photo","sanfrancisco"],"ocean":["🌊","water_wave","sea","water","wave","nature","tsunami","disaster","ocean"],"volcano":["🌋","volcano","photo","nature","disaster"],"milky_way":["🌌","milky_way","photo","space","stars"],"earth_africa":["🌍","globe_showing_europe_africa","globe","world","international","earth_africa"],"earth_americas":["🌎","globe_showing_americas","globe","world","USA","international","earth_americas"],"earth_asia":["🌏","globe_showing_asia_australia","globe","world","east","international","earth_asia"],"globe_with_meridians":["🌐","globe_with_meridians","earth","international","world","internet","interweb","i18n"],"new_moon":["🌑","new_moon","nature","twilight","planet","space","night","evening","sleep"],"waxing_crescent_moon":["🌒","waxing_crescent_moon","nature","twilight","planet","space","night","evening","sleep"],"first_quarter_moon":["🌓","first_quarter_moon","nature","twilight","planet","space","night","evening","sleep"],"moon":["🌔","waxing_gibbous_moon","nature","night","sky","gray","twilight","planet","space","evening","sleep","moon"],"full_moon":["🌕","full_moon","nature","yellow","twilight","planet","space","night","evening","sleep"],"waning_gibbous_moon":["🌖","waning_gibbous_moon","nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],"last_quarter_moon":["🌗","last_quarter_moon","nature","twilight","planet","space","night","evening","sleep"],"waning_crescent_moon":["🌘","waning_crescent_moon","nature","twilight","planet","space","night","evening","sleep"],"crescent_moon":["🌙","crescent_moon","night","sleep","sky","evening","magic"],"new_moon_with_face":["🌚","new_moon_face","nature","twilight","planet","space","night","evening","sleep","new_moon_with_face"],"first_quarter_moon_with_face":["🌛","first_quarter_moon_face","nature","twilight","planet","space","night","evening","sleep","first_quarter_moon_with_face"],"last_quarter_moon_with_face":["🌜","last_quarter_moon_face","nature","twilight","planet","space","night","evening","sleep","last_quarter_moon_with_face"],"full_moon_with_face":["🌝","full_moon_face","nature","twilight","planet","space","night","evening","sleep","full_moon_with_face"],"sun_with_face":["🌞","sun_with_face","nature","morning","sky"],"star2":["🌟","glowing_star","night","sparkle","awesome","good","magic","star2"],"stars":["🌠","shooting_star","night","photo","stars"],"thermometer":["🌡️","thermometer","weather","temperature","hot","cold"],"mostly_sunny":["🌤️","sun_behind_small_cloud","weather","mostly_sunny","sun_small_cloud"],"barely_sunny":["🌥️","sun_behind_large_cloud","weather","barely_sunny","sun_behind_cloud"],"partly_sunny_rain":["🌦️","sun_behind_rain_cloud","weather","partly_sunny_rain"],"rain_cloud":["🌧️","cloud_with_rain","weather","rain_cloud"],"snow_cloud":["🌨️","cloud_with_snow","weather","snow_cloud"],"lightning":["🌩️","cloud_with_lightning","weather","thunder","lightning","lightning_cloud"],"tornado":["🌪️","tornado","weather","cyclone","twister","tornado_cloud"],"fog":["🌫️","fog","weather"],"wind_blowing_face":["🌬️","wind_face","gust","air","wind_blowing_face"],"hotdog":["🌭","hot_dog","food","frankfurter","hotdog"],"taco":["🌮","taco","food","mexican"],"burrito":["🌯","burrito","food","mexican"],"chestnut":["🌰","chestnut","food","squirrel"],"seedling":["🌱","seedling","plant","nature","grass","lawn","spring"],"evergreen_tree":["🌲","evergreen_tree","plant","nature"],"deciduous_tree":["🌳","deciduous_tree","plant","nature"],"palm_tree":["🌴","palm_tree","plant","vegetable","nature","summer","beach","mojito","tropical"],"cactus":["🌵","cactus","vegetable","plant","nature"],"hot_pepper":["🌶️","hot_pepper","food","spicy","chilli","chili"],"tulip":["🌷","tulip","flowers","plant","nature","summer","spring"],"cherry_blossom":["🌸","cherry_blossom","nature","plant","spring","flower"],"rose":["🌹","rose","flowers","valentines","love","spring"],"hibiscus":["🌺","hibiscus","plant","vegetable","flowers","beach"],"sunflower":["🌻","sunflower","nature","plant","fall"],"blossom":["🌼","blossom","nature","flowers","yellow"],"corn":["🌽","ear_of_corn","food","vegetable","plant","corn"],"ear_of_rice":["🌾","sheaf_of_rice","nature","plant","ear_of_rice"],"herb":["🌿","herb","vegetable","plant","medicine","weed","grass","lawn"],"four_leaf_clover":["🍀","four_leaf_clover","vegetable","plant","nature","lucky","irish"],"maple_leaf":["🍁","maple_leaf","nature","plant","vegetable","ca","fall"],"fallen_leaf":["🍂","fallen_leaf","nature","plant","vegetable","leaves"],"leaves":["🍃","leaf_fluttering_in_wind","nature","plant","tree","vegetable","grass","lawn","spring","leaves"],"mushroom":["🍄","mushroom","plant","vegetable"],"tomato":["🍅","tomato","fruit","vegetable","nature","food"],"eggplant":["🍆","eggplant","vegetable","nature","food","aubergine"],"grapes":["🍇","grapes","fruit","food","wine"],"melon":["🍈","melon","fruit","nature","food"],"watermelon":["🍉","watermelon","fruit","food","picnic","summer"],"tangerine":["🍊","tangerine","food","fruit","nature","orange"],"lemon":["🍋","lemon","fruit","nature"],"banana":["🍌","banana","fruit","food","monkey"],"pineapple":["🍍","pineapple","fruit","nature","food"],"apple":["🍎","red_apple","fruit","mac","school","apple"],"green_apple":["🍏","green_apple","fruit","nature"],"pear":["🍐","pear","fruit","nature","food"],"peach":["🍑","peach","fruit","nature","food"],"cherries":["🍒","cherries","food","fruit"],"strawberry":["🍓","strawberry","fruit","food","nature"],"hamburger":["🍔","hamburger","meat","fast food","beef","cheeseburger","mcdonalds","burger king"],"pizza":["🍕","pizza","food","party"],"meat_on_bone":["🍖","meat_on_bone","good","food","drumstick"],"poultry_leg":["🍗","poultry_leg","food","meat","drumstick","bird","chicken","turkey"],"rice_cracker":["🍘","rice_cracker","food","japanese"],"rice_ball":["🍙","rice_ball","food","japanese"],"rice":["🍚","cooked_rice","food","china","asian","rice"],"curry":["🍛","curry_rice","food","spicy","hot","indian","curry"],"ramen":["🍜","steaming_bowl","food","japanese","noodle","chopsticks","ramen"],"spaghetti":["🍝","spaghetti","food","italian","noodle"],"bread":["🍞","bread","food","wheat","breakfast","toast"],"fries":["🍟","french_fries","chips","snack","fast food","fries"],"sweet_potato":["🍠","roasted_sweet_potato","food","nature","sweet_potato"],"dango":["🍡","dango","food","dessert","sweet","japanese","barbecue","meat"],"oden":["🍢","oden","food","japanese"],"sushi":["🍣","sushi","food","fish","japanese","rice"],"fried_shrimp":["🍤","fried_shrimp","food","animal","appetizer","summer"],"fish_cake":["🍥","fish_cake_with_swirl","food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen","fish_cake"],"icecream":["🍦","soft_ice_cream","food","hot","dessert","summer","icecream"],"shaved_ice":["🍧","shaved_ice","hot","dessert","summer"],"ice_cream":["🍨","ice_cream","food","hot","dessert"],"doughnut":["🍩","doughnut","food","dessert","snack","sweet","donut"],"cookie":["🍪","cookie","food","snack","oreo","chocolate","sweet","dessert"],"chocolate_bar":["🍫","chocolate_bar","food","snack","dessert","sweet"],"candy":["🍬","candy","snack","dessert","sweet","lolly"],"lollipop":["🍭","lollipop","food","snack","candy","sweet"],"custard":["🍮","custard","dessert","food"],"honey_pot":["🍯","honey_pot","bees","sweet","kitchen"],"cake":["🍰","shortcake","food","dessert","cake"],"bento":["🍱","bento_box","food","japanese","box","bento"],"stew":["🍲","pot_of_food","food","meat","soup","stew"],"fried_egg":["🍳","cooking","food","breakfast","kitchen","egg","fried_egg"],"fork_and_knife":["🍴","fork_and_knife","cutlery","kitchen"],"tea":["🍵","teacup_without_handle","drink","bowl","breakfast","green","british","tea"],"sake":["🍶","sake","wine","drink","drunk","beverage","japanese","alcohol","booze"],"wine_glass":["🍷","wine_glass","drink","beverage","drunk","alcohol","booze"],"cocktail":["🍸","cocktail_glass","drink","drunk","alcohol","beverage","booze","mojito","cocktail"],"tropical_drink":["🍹","tropical_drink","beverage","cocktail","summer","beach","alcohol","booze","mojito"],"beer":["🍺","beer_mug","relax","beverage","drink","drunk","party","pub","summer","alcohol","booze","beer"],"beers":["🍻","clinking_beer_mugs","relax","beverage","drink","drunk","party","pub","summer","alcohol","booze","beers"],"baby_bottle":["🍼","baby_bottle","food","container","milk"],"knife_fork_plate":["🍽️","fork_and_knife_with_plate","food","eat","meal","lunch","dinner","restaurant","knife_fork_plate"],"champagne":["🍾","bottle_with_popping_cork","drink","wine","bottle","celebration","champagne"],"popcorn":["🍿","popcorn","food","movie theater","films","snack"],"ribbon":["🎀","ribbon","decoration","pink","girl","bowtie"],"gift":["🎁","wrapped_gift","present","birthday","christmas","xmas","gift"],"birthday":["🎂","birthday_cake","food","dessert","cake","birthday"],"jack_o_lantern":["🎃","jack_o_lantern","halloween","light","pumpkin","creepy","fall"],"christmas_tree":["🎄","christmas_tree","festival","vacation","december","xmas","celebration"],"santa":["🎅","santa_claus","festival","man","male","xmas","father christmas","santa"],"fireworks":["🎆","fireworks","photo","festival","carnival","congratulations"],"sparkler":["🎇","sparkler","stars","night","shine"],"balloon":["🎈","balloon","party","celebration","birthday","circus"],"tada":["🎉","party_popper","party","congratulations","birthday","magic","circus","celebration","tada"],"confetti_ball":["🎊","confetti_ball","festival","party","birthday","circus"],"tanabata_tree":["🎋","tanabata_tree","plant","nature","branch","summer"],"crossed_flags":["🎌","crossed_flags","japanese","nation","country","border"],"bamboo":["🎍","pine_decoration","plant","nature","vegetable","panda","pine_decoration","bamboo"],"dolls":["🎎","japanese_dolls","japanese","toy","kimono","dolls"],"flags":["🎏","carp_streamer","fish","japanese","koinobori","carp","banner","flags"],"wind_chime":["🎐","wind_chime","nature","ding","spring","bell"],"rice_scene":["🎑","moon_viewing_ceremony","photo","japan","asia","tsukimi","rice_scene"],"school_satchel":["🎒","backpack","student","education","bag","backpack","school_satchel"],"mortar_board":["🎓","graduation_cap","school","college","degree","university","graduation","cap","hat","legal","learn","education","mortar_board"],"medal":["🎖️","military_medal","award","winning","army","medal"],"reminder_ribbon":["🎗️","reminder_ribbon","sports","cause","support","awareness"],"studio_microphone":["🎙️","studio_microphone","sing","recording","artist","talkshow"],"level_slider":["🎚️","level_slider","scale"],"control_knobs":["🎛️","control_knobs","dial"],"film_frames":["🎞️","film_frames","movie"],"admission_tickets":["🎟️","admission_tickets","sports","concert","entrance"],"carousel_horse":["🎠","carousel_horse","photo","carnival"],"ferris_wheel":["🎡","ferris_wheel","photo","carnival","londoneye"],"roller_coaster":["🎢","roller_coaster","carnival","playground","photo","fun"],"fishing_pole_and_fish":["🎣","fishing_pole","food","hobby","summer","fishing_pole_and_fish"],"microphone":["🎤","microphone","sound","music","PA","sing","talkshow"],"movie_camera":["🎥","movie_camera","film","record"],"cinema":["🎦","cinema","blue-square","record","film","movie","curtain","stage","theater"],"headphones":["🎧","headphone","music","score","gadgets","headphones"],"art":["🎨","artist_palette","design","paint","draw","colors","art"],"tophat":["🎩","top_hat","magic","gentleman","classy","circus","tophat"],"circus_tent":["🎪","circus_tent","festival","carnival","party"],"ticket":["🎫","ticket","event","concert","pass"],"clapper":["🎬","clapper_board","movie","film","record","clapper"],"performing_arts":["🎭","performing_arts","acting","theater","drama"],"video_game":["🎮","video_game","play","console","PS4","controller"],"dart":["🎯","direct_hit","game","play","bar","target","bullseye","dart"],"slot_machine":["🎰","slot_machine","bet","gamble","vegas","fruit machine","luck","casino"],"8ball":["🎱","pool_8_ball","pool","hobby","game","luck","magic","8ball"],"game_die":["🎲","game_die","dice","random","tabletop","play","luck"],"bowling":["🎳","bowling","sports","fun","play"],"flower_playing_cards":["🎴","flower_playing_cards","game","sunset","red"],"musical_note":["🎵","musical_note","score","tone","sound"],"notes":["🎶","musical_notes","music","score","notes"],"saxophone":["🎷","saxophone","music","instrument","jazz","blues"],"guitar":["🎸","guitar","music","instrument"],"musical_keyboard":["🎹","musical_keyboard","piano","instrument","compose"],"trumpet":["🎺","trumpet","music","brass"],"violin":["🎻","violin","music","instrument","orchestra","symphony"],"musical_score":["🎼","musical_score","treble","clef","compose"],"running_shirt_with_sash":["🎽","running_shirt","play","pageant","running_shirt_with_sash"],"tennis":["🎾","tennis","sports","balls","green"],"ski":["🎿","skis","sports","winter","cold","snow","ski"],"basketball":["🏀","basketball","sports","balls","NBA"],"checkered_flag":["🏁","chequered_flag","contest","finishline","race","gokart","checkered_flag"],"snowboarder":["🏂","snowboarder","sports","winter"],"woman-running":["🏃","person_running","move","woman-running"],"man-running":["🏃","person_running","move","man-running"],"runner":["🏃","person_running","move","runner","running"],"woman-surfing":["🏄","person_surfing","sport","sea","woman-surfing"],"man-surfing":["🏄","person_surfing","sport","sea","man-surfing"],"surfer":["🏄","person_surfing","sport","sea","surfer"],"sports_medal":["🏅","sports_medal","award","winning"],"trophy":["🏆","trophy","win","award","contest","place","ftw","ceremony"],"horse_racing":["🏇","horse_racing","animal","betting","competition","gambling","luck"],"football":["🏈","american_football","sports","balls","NFL","football"],"rugby_football":["🏉","rugby_football","sports","team"],"woman-swimming":["🏊","person_swimming","sport","pool","woman-swimming"],"man-swimming":["🏊","person_swimming","sport","pool","man-swimming"],"swimmer":["🏊","person_swimming","sport","pool","swimmer"],"woman-lifting-weights":["🏋️","person_lifting_weights","sports","training","exercise","woman-lifting-weights"],"man-lifting-weights":["🏋️","person_lifting_weights","sports","training","exercise","man-lifting-weights"],"weight_lifter":["🏋️","person_lifting_weights","sports","training","exercise","weight_lifter"],"woman-golfing":["🏌️","person_golfing","sports","business","woman-golfing"],"man-golfing":["🏌️","person_golfing","sports","business","man-golfing"],"golfer":["🏌️","person_golfing","sports","business","golfer"],"racing_motorcycle":["🏍️","motorcycle","race","sports","fast","racing_motorcycle"],"racing_car":["🏎️","racing_car","sports","race","fast","formula","f1"],"cricket_bat_and_ball":["🏏","cricket_game","sports","cricket_bat_and_ball"],"volleyball":["🏐","volleyball","sports","balls"],"field_hockey_stick_and_ball":["🏑","field_hockey","sports","field_hockey_stick_and_ball"],"ice_hockey_stick_and_puck":["🏒","ice_hockey","sports","ice_hockey_stick_and_puck"],"table_tennis_paddle_and_ball":["🏓","ping_pong","sports","pingpong","table_tennis_paddle_and_ball"],"snow_capped_mountain":["🏔️","snow_capped_mountain","photo","nature","environment","winter","cold"],"camping":["🏕️","camping","photo","outdoors","tent"],"beach_with_umbrella":["🏖️","beach_with_umbrella","weather","summer","sunny","sand","mojito"],"building_construction":["🏗️","building_construction","wip","working","progress"],"house_buildings":["🏘️","houses","buildings","photo","house_buildings"],"cityscape":["🏙️","cityscape","photo","night life","urban"],"derelict_house_building":["🏚️","derelict_house","abandon","evict","broken","building","derelict_house_building"],"classical_building":["🏛️","classical_building","art","culture","history"],"desert":["🏜️","desert","photo","warm","saharah"],"desert_island":["🏝️","desert_island","photo","tropical","mojito"],"national_park":["🏞️","national_park","photo","environment","nature"],"stadium":["🏟️","stadium","photo","place","sports","concert","venue"],"house":["🏠","house","building","home"],"house_with_garden":["🏡","house_with_garden","home","plant","nature"],"office":["🏢","office_building","building","bureau","work","office"],"post_office":["🏣","japanese_post_office","building","envelope","communication","post_office"],"european_post_office":["🏤","post_office","building","email","european_post_office"],"hospital":["🏥","hospital","building","health","surgery","doctor"],"bank":["🏦","bank","building","money","sales","cash","business","enterprise"],"atm":["🏧","atm_sign","money","sales","cash","blue-square","payment","bank","atm"],"hotel":["🏨","hotel","building","accomodation","checkin"],"love_hotel":["🏩","love_hotel","like","affection","dating"],"convenience_store":["🏪","convenience_store","building","shopping","groceries"],"school":["🏫","school","building","student","education","learn","teach"],"department_store":["🏬","department_store","building","shopping","mall"],"factory":["🏭","factory","building","industry","pollution","smoke"],"izakaya_lantern":["🏮","red_paper_lantern","light","paper","halloween","spooky","izakaya_lantern","lantern"],"japanese_castle":["🏯","japanese_castle","photo","building"],"european_castle":["🏰","castle","building","royalty","history","european_castle"],"rainbow-flag":["🌈","rainbow","nature","happy","unicorn_face","photo","sky","spring","rainbow-flag"],"transgender_flag":["🏳️","white_flag","losing","loser","lost","surrender","give up","fail","transgender_flag"],"waving_white_flag":["🏳️","white_flag","losing","loser","lost","surrender","give up","fail","waving_white_flag"],"pirate_flag":["☠️","skull_and_crossbones","poison","danger","deadly","scary","death","pirate","evil","pirate_flag"],"flag-england":["🏴","black_flag","pirate","flag-england"],"flag-scotland":["🏴","black_flag","pirate","flag-scotland"],"flag-wales":["🏴","black_flag","pirate","flag-wales"],"waving_black_flag":["🏴","black_flag","pirate","waving_black_flag"],"rosette":["🏵️","rosette","flower","decoration","military"],"label":["🏷️","label","sale","tag"],"badminton_racquet_and_shuttlecock":["🏸","badminton","sports","badminton_racquet_and_shuttlecock"],"bow_and_arrow":["🏹","bow_and_arrow","sports"],"amphora":["🏺","amphora","vase","jar"],"skin-tone-2":["skin-tone-2"],"skin-tone-3":["skin-tone-3"],"skin-tone-4":["skin-tone-4"],"skin-tone-5":["skin-tone-5"],"skin-tone-6":["skin-tone-6"],"rat":["🐀","rat","animal","mouse","rodent"],"mouse2":["🐁","mouse","animal","nature","rodent","mouse2"],"ox":["🐂","ox","animal","cow","beef"],"water_buffalo":["🐃","water_buffalo","animal","nature","ox","cow"],"cow2":["🐄","cow","beef","ox","animal","nature","moo","milk","cow2"],"tiger2":["🐅","tiger","animal","nature","roar","tiger2"],"leopard":["🐆","leopard","animal","nature"],"rabbit2":["🐇","rabbit","animal","nature","pet","magic","spring","rabbit2"],"black_cat":["🐈","cat","animal","meow","pet","cats","black_cat"],"cat2":["🐈","cat","animal","meow","pet","cats","cat2"],"dragon":["🐉","dragon","animal","myth","nature","chinese","green"],"crocodile":["🐊","crocodile","animal","nature","reptile","lizard","alligator"],"whale2":["🐋","whale","animal","nature","sea","ocean","whale2"],"snail":["🐌","snail","slow","animal","shell"],"snake":["🐍","snake","animal","evil","nature","hiss","python"],"racehorse":["🐎","horse","animal","gamble","luck","racehorse"],"ram":["🐏","ram","animal","sheep","nature"],"goat":["🐐","goat","animal","nature"],"sheep":["🐑","ewe","animal","nature","wool","shipit","sheep"],"monkey":["🐒","monkey","animal","nature","banana","circus"],"rooster":["🐓","rooster","animal","nature","chicken"],"chicken":["🐔","chicken","animal","cluck","nature","bird"],"service_dog":["🐕","dog","animal","nature","friend","doge","pet","faithful","service_dog"],"dog2":["🐕","dog","animal","nature","friend","doge","pet","faithful","dog2"],"pig2":["🐖","pig","animal","nature","pig2"],"boar":["🐗","boar","animal","nature"],"elephant":["🐘","elephant","animal","nature","nose","th","circus"],"octopus":["🐙","octopus","animal","creature","ocean","sea","nature","beach"],"shell":["🐚","spiral_shell","nature","sea","beach","shell"],"bug":["🐛","bug","animal","insect","nature","worm"],"ant":["🐜","ant","animal","insect","nature","bug"],"bee":["🐝","honeybee","animal","insect","nature","bug","spring","honey","bee"],"ladybug":["🐞","lady_beetle","animal","insect","nature","ladybug"],"fish":["🐟","fish","animal","food","nature"],"tropical_fish":["🐠","tropical_fish","animal","swim","ocean","beach","nemo"],"blowfish":["🐡","blowfish","animal","nature","food","sea","ocean"],"turtle":["🐢","turtle","animal","slow","nature","tortoise"],"hatching_chick":["🐣","hatching_chick","animal","chicken","egg","born","baby","bird"],"baby_chick":["🐤","baby_chick","animal","chicken","bird"],"hatched_chick":["🐥","front_facing_baby_chick","animal","chicken","baby","bird","hatched_chick"],"bird":["🐦","bird","animal","nature","fly","tweet","spring"],"penguin":["🐧","penguin","animal","nature"],"koala":["🐨","koala","animal","nature"],"poodle":["🐩","poodle","dog","animal","101","nature","pet"],"dromedary_camel":["🐪","camel","animal","hot","desert","hump","dromedary_camel"],"camel":["🐫","two_hump_camel","animal","nature","hot","desert","hump","camel"],"dolphin":["🐬","dolphin","animal","nature","fish","sea","ocean","flipper","fins","beach"],"mouse":["🐭","mouse_face","animal","nature","cheese_wedge","rodent","mouse"],"cow":["🐮","cow_face","beef","ox","animal","nature","moo","milk","cow"],"tiger":["🐯","tiger_face","animal","cat","danger","wild","nature","roar","tiger"],"rabbit":["🐰","rabbit_face","animal","nature","pet","spring","magic","bunny","rabbit"],"cat":["🐱","cat_face","animal","meow","nature","pet","kitten","cat"],"dragon_face":["🐲","dragon_face","animal","myth","nature","chinese","green"],"whale":["🐳","spouting_whale","animal","nature","sea","ocean","whale"],"horse":["🐴","horse_face","animal","brown","nature","horse"],"monkey_face":["🐵","monkey_face","animal","nature","circus"],"dog":["🐶","dog_face","animal","friend","nature","woof","puppy","pet","faithful","dog"],"pig":["🐷","pig_face","animal","oink","nature","pig"],"frog":["🐸","frog","animal","nature","croak","toad"],"hamster":["🐹","hamster","animal","nature"],"wolf":["🐺","wolf","animal","nature","wild"],"polar_bear":["🐻","bear","animal","nature","wild","polar_bear"],"bear":["🐻","bear","animal","nature","wild"],"panda_face":["🐼","panda","animal","nature","panda","panda_face"],"pig_nose":["🐽","pig_nose","animal","oink"],"feet":["🐾","paw_prints","animal","tracking","footprints","dog","cat","pet","feet"],"chipmunk":["🐿️","chipmunk","animal","nature","rodent","squirrel"],"eyes":["👀","eyes","look","watch","stalk","peek","see"],"eye":["👁️‍🗨️","eye_in_speech_bubble","info","eye"],"ear":["👂","ear","face","hear","sound","listen"],"nose":["👃","nose","smell","sniff"],"lips":["👄","mouth","mouth","kiss","lips"],"tongue":["👅","tongue","mouth","playful"],"point_up_2":["👆","backhand_index_pointing_up","fingers","hand","direction","up","point_up_2"],"point_down":["👇","backhand_index_pointing_down","fingers","hand","direction","down","point_down"],"point_left":["👈","backhand_index_pointing_left","direction","fingers","hand","left","point_left"],"point_right":["👉","backhand_index_pointing_right","fingers","hand","direction","right","point_right"],"facepunch":["👊","oncoming_fist","angry","violence","fist","hit","attack","hand","facepunch","punch"],"wave":["👋","waving_hand","hands","gesture","goodbye","solong","farewell","hello","hi","palm","wave"],"ok_hand":["👌","ok_hand","fingers","limbs","perfect","ok","okay"],"+1":["👍","thumbs_up","thumbsup","yes","awesome","good","agree","accept","cool","hand","like","+1"],"-1":["👎","thumbs_down","thumbsdown","no","dislike","hand","-1"],"clap":["👏","clapping_hands","hands","praise","applause","congrats","yay","clap"],"open_hands":["👐","open_hands","fingers","butterfly","hands","open"],"crown":["👑","crown","king","kod","leader","royalty","lord"],"womans_hat":["👒","woman_s_hat","fashion","accessories","female","lady","spring","womans_hat"],"eyeglasses":["👓","glasses","fashion","accessories","eyesight","nerdy","dork","geek","eyeglasses"],"necktie":["👔","necktie","shirt","suitup","formal","fashion","cloth","business"],"shirt":["👕","t_shirt","fashion","cloth","casual","shirt","tee","tshirt"],"jeans":["👖","jeans","fashion","shopping"],"dress":["👗","dress","clothes","fashion","shopping"],"kimono":["👘","kimono","dress","fashion","women","female","japanese"],"bikini":["👙","bikini","swimming","female","woman","girl","fashion","beach","summer"],"womans_clothes":["👚","woman_s_clothes","fashion","shopping_bags","female","womans_clothes"],"purse":["👛","purse","fashion","accessories","money","sales","shopping"],"handbag":["👜","handbag","fashion","accessory","accessories","shopping"],"pouch":["👝","clutch_bag","bag","accessories","shopping","pouch"],"mans_shoe":["👞","man_s_shoe","fashion","male","mans_shoe","shoe"],"athletic_shoe":["👟","running_shoe","shoes","sports","sneakers","athletic_shoe"],"high_heel":["👠","high_heeled_shoe","fashion","shoes","female","pumps","stiletto","high_heel"],"sandal":["👡","woman_s_sandal","shoes","fashion","flip flops","sandal"],"boot":["👢","woman_s_boot","shoes","fashion","boot"],"footprints":["👣","footprints","feet","tracking","walking","beach"],"bust_in_silhouette":["👤","bust_in_silhouette","user","person","human"],"busts_in_silhouette":["👥","busts_in_silhouette","user","person","human","group","team"],"boy":["👦","boy","man","male","guy","teenager"],"girl":["👧","girl","female","woman","teenager"],"male-farmer":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-farmer"],"male-cook":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-cook"],"man_feeding_baby":["👨","man","mustache","father","dad","guy","classy","sir","moustache","man_feeding_baby"],"male-student":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-student"],"male-singer":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-singer"],"male-artist":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-artist"],"male-teacher":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-teacher"],"male-factory-worker":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-factory-worker"],"man-boy-boy":["👦","boy","man","male","guy","teenager","man-boy-boy"],"man-boy":["👦","boy","man","male","guy","teenager","man-boy"],"man-girl-boy":["👦","boy","man","male","guy","teenager","man-girl-boy"],"man-girl-girl":["👧","girl","female","woman","teenager","man-girl-girl"],"man-girl":["👧","girl","female","woman","teenager","man-girl"],"man-man-boy":["👦","boy","man","male","guy","teenager","man-man-boy"],"man-man-boy-boy":["👦","boy","man","male","guy","teenager","man-man-boy-boy"],"man-man-girl":["👧","girl","female","woman","teenager","man-man-girl"],"man-man-girl-boy":["👦","boy","man","male","guy","teenager","man-man-girl-boy"],"man-man-girl-girl":["👧","girl","female","woman","teenager","man-man-girl-girl"],"man-woman-boy":["👦","boy","man","male","guy","teenager","man-woman-boy"],"man-woman-boy-boy":["👦","boy","man","male","guy","teenager","man-woman-boy-boy"],"man-woman-girl":["👧","girl","female","woman","teenager","man-woman-girl"],"man-woman-girl-boy":["👦","boy","man","male","guy","teenager","man-woman-girl-boy"],"man-woman-girl-girl":["👧","girl","female","woman","teenager","man-woman-girl-girl"],"male-technologist":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-technologist"],"male-office-worker":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-office-worker"],"male-mechanic":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-mechanic"],"male-scientist":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-scientist"],"male-astronaut":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-astronaut"],"male-firefighter":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-firefighter"],"man_with_probing_cane":["👨","man","mustache","father","dad","guy","classy","sir","moustache","man_with_probing_cane"],"red_haired_man":["👨","man","mustache","father","dad","guy","classy","sir","moustache","red_haired_man"],"curly_haired_man":["👨","man","mustache","father","dad","guy","classy","sir","moustache","curly_haired_man"],"bald_man":["👨","man","mustache","father","dad","guy","classy","sir","moustache","bald_man"],"white_haired_man":["👨","man","mustache","father","dad","guy","classy","sir","moustache","white_haired_man"],"man_in_motorized_wheelchair":["👨","man","mustache","father","dad","guy","classy","sir","moustache","man_in_motorized_wheelchair"],"man_in_manual_wheelchair":["👨","man","mustache","father","dad","guy","classy","sir","moustache","man_in_manual_wheelchair"],"male-doctor":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-doctor"],"male-judge":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-judge"],"male-pilot":["👨","man","mustache","father","dad","guy","classy","sir","moustache","male-pilot"],"man-heart-man":["❤️","red_heart","love","like","valentines","man-heart-man"],"man-kiss-man":["💋","kiss_mark","face","lips","love","like","affection","valentines","man-kiss-man"],"man":["👨","man","mustache","father","dad","guy","classy","sir","moustache"],"female-farmer":["👩","woman","female","girls","lady","female-farmer"],"female-cook":["👩","woman","female","girls","lady","female-cook"],"woman_feeding_baby":["👩","woman","female","girls","lady","woman_feeding_baby"],"female-student":["👩","woman","female","girls","lady","female-student"],"female-singer":["👩","woman","female","girls","lady","female-singer"],"female-artist":["👩","woman","female","girls","lady","female-artist"],"female-teacher":["👩","woman","female","girls","lady","female-teacher"],"female-factory-worker":["👩","woman","female","girls","lady","female-factory-worker"],"woman-boy-boy":["👦","boy","man","male","guy","teenager","woman-boy-boy"],"woman-boy":["👦","boy","man","male","guy","teenager","woman-boy"],"woman-girl-boy":["👦","boy","man","male","guy","teenager","woman-girl-boy"],"woman-girl-girl":["👧","girl","female","woman","teenager","woman-girl-girl"],"woman-girl":["👧","girl","female","woman","teenager","woman-girl"],"woman-woman-boy":["👦","boy","man","male","guy","teenager","woman-woman-boy"],"woman-woman-boy-boy":["👦","boy","man","male","guy","teenager","woman-woman-boy-boy"],"woman-woman-girl":["👧","girl","female","woman","teenager","woman-woman-girl"],"woman-woman-girl-boy":["👦","boy","man","male","guy","teenager","woman-woman-girl-boy"],"woman-woman-girl-girl":["👧","girl","female","woman","teenager","woman-woman-girl-girl"],"female-technologist":["👩","woman","female","girls","lady","female-technologist"],"female-office-worker":["👩","woman","female","girls","lady","female-office-worker"],"female-mechanic":["👩","woman","female","girls","lady","female-mechanic"],"female-scientist":["👩","woman","female","girls","lady","female-scientist"],"female-astronaut":["👩","woman","female","girls","lady","female-astronaut"],"female-firefighter":["👩","woman","female","girls","lady","female-firefighter"],"woman_with_probing_cane":["👩","woman","female","girls","lady","woman_with_probing_cane"],"red_haired_woman":["👩","woman","female","girls","lady","red_haired_woman"],"curly_haired_woman":["👩","woman","female","girls","lady","curly_haired_woman"],"bald_woman":["👩","woman","female","girls","lady","bald_woman"],"white_haired_woman":["👩","woman","female","girls","lady","white_haired_woman"],"woman_in_motorized_wheelchair":["👩","woman","female","girls","lady","woman_in_motorized_wheelchair"],"woman_in_manual_wheelchair":["👩","woman","female","girls","lady","woman_in_manual_wheelchair"],"female-doctor":["👩","woman","female","girls","lady","female-doctor"],"female-judge":["👩","woman","female","girls","lady","female-judge"],"female-pilot":["👩","woman","female","girls","lady","female-pilot"],"woman-heart-man":["❤️","red_heart","love","like","valentines","woman-heart-man"],"woman-heart-woman":["❤️","red_heart","love","like","valentines","woman-heart-woman"],"woman-kiss-man":["💋","kiss_mark","face","lips","love","like","affection","valentines","woman-kiss-man"],"woman-kiss-woman":["💋","kiss_mark","face","lips","love","like","affection","valentines","woman-kiss-woman"],"woman":["👩","woman","female","girls","lady"],"family":["👪","family","home","parents","child","mom","dad","father","mother","people","human"],"man_and_woman_holding_hands":["👫","woman_and_man_holding_hands","pair","people","human","love","date","dating","like","affection","valentines","marriage","man_and_woman_holding_hands","couple"],"two_men_holding_hands":["👬","men_holding_hands","pair","couple","love","like","bromance","friendship","people","human","two_men_holding_hands"],"two_women_holding_hands":["👭","women_holding_hands","pair","friendship","couple","love","like","female","people","human","two_women_holding_hands"],"female-police-officer":["👮","police_officer","cop","female-police-officer"],"male-police-officer":["👮","police_officer","cop","male-police-officer"],"cop":["👮","police_officer","cop"],"woman-with-bunny-ears-partying":["👯","people_with_bunny_ears","perform","costume","woman-with-bunny-ears-partying"],"man-with-bunny-ears-partying":["👯","people_with_bunny_ears","perform","costume","man-with-bunny-ears-partying"],"dancers":["👯","people_with_bunny_ears","perform","costume","dancers"],"woman_with_veil":["👰","bride_with_veil","couple","marriage","wedding","woman","bride","woman_with_veil"],"man_with_veil":["👰","bride_with_veil","couple","marriage","wedding","woman","bride","man_with_veil"],"bride_with_veil":["👰","bride_with_veil","couple","marriage","wedding","woman","bride"],"blond-haired-woman":["👱","person_blond_hair","hairstyle","blond-haired-woman"],"blond-haired-man":["👱","person_blond_hair","hairstyle","blond-haired-man"],"person_with_blond_hair":["👱","person_blond_hair","hairstyle","person_with_blond_hair"],"man_with_gua_pi_mao":["👲","man_with_skullcap","male","boy","chinese","man_with_gua_pi_mao"],"woman-wearing-turban":["👳","person_wearing_turban","headdress","woman-wearing-turban"],"man-wearing-turban":["👳","person_wearing_turban","headdress","man-wearing-turban"],"man_with_turban":["👳","person_wearing_turban","headdress","man_with_turban"],"older_man":["👴","old_man","human","male","men","old","elder","senior","older_man"],"older_woman":["👵","old_woman","human","female","women","lady","old","elder","senior","older_woman"],"baby":["👶","baby","child","boy","girl","toddler"],"female-construction-worker":["👷","construction_worker","labor","build","female-construction-worker"],"male-construction-worker":["👷","construction_worker","labor","build","male-construction-worker"],"construction_worker":["👷","construction_worker","labor","build"],"princess":["👸","princess","girl","woman","female","blond","crown","royal","queen"],"japanese_ogre":["👹","ogre","monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre","japanese_ogre"],"japanese_goblin":["👺","goblin","red","evil","mask","monster","scary","creepy","japanese","goblin","japanese_goblin"],"ghost":["👻","ghost","halloween","spooky","scary"],"angel":["👼","baby_angel","heaven","wings","halo","angel"],"alien":["👽","alien","UFO","paul","weird","outer_space"],"space_invader":["👾","alien_monster","game","arcade","play","space_invader"],"imp":["👿","angry_face_with_horns","devil","angry","horns","imp"],"skull":["💀","skull","dead","skeleton","creepy","death"],"woman-tipping-hand":["💁","person_tipping_hand","information","woman-tipping-hand"],"man-tipping-hand":["💁","person_tipping_hand","information","man-tipping-hand"],"information_desk_person":["💁","person_tipping_hand","information","information_desk_person"],"female-guard":["💂","guard","protect","female-guard"],"male-guard":["💂","guard","protect","male-guard"],"guardsman":["💂","guard","protect","guardsman"],"dancer":["💃","woman_dancing","female","girl","woman","fun","dancer"],"lipstick":["💄","lipstick","female","girl","fashion","woman"],"nail_care":["💅","nail_polish","beauty","manicure","finger","fashion","nail","nail_care"],"woman-getting-massage":["💆","person_getting_massage","relax","woman-getting-massage"],"man-getting-massage":["💆","person_getting_massage","relax","man-getting-massage"],"massage":["💆","person_getting_massage","relax","massage"],"woman-getting-haircut":["💇","person_getting_haircut","hairstyle","woman-getting-haircut"],"man-getting-haircut":["💇","person_getting_haircut","hairstyle","man-getting-haircut"],"haircut":["💇","person_getting_haircut","hairstyle","haircut"],"barber":["💈","barber_pole","hair","salon","style","barber"],"syringe":["💉","syringe","health","hospital","drugs","blood","medicine","needle","doctor","nurse"],"pill":["💊","pill","health","medicine","doctor","pharmacy","drug"],"kiss":["💋","kiss_mark","face","lips","love","like","affection","valentines","kiss"],"love_letter":["💌","love_letter","email","like","affection","envelope","valentines"],"ring":["💍","ring","wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],"gem":["💎","gem_stone","blue","ruby","diamond","jewelry","gem"],"couplekiss":["💏","kiss","pair","valentines","love","like","dating","marriage","couplekiss"],"bouquet":["💐","bouquet","flowers","nature","spring"],"couple_with_heart":["💑","couple_with_heart","pair","love","like","affection","human","dating","valentines","marriage"],"wedding":["💒","wedding","love","like","affection","couple","marriage","bride","groom"],"heartbeat":["💓","beating_heart","love","like","affection","valentines","pink","heart","heartbeat"],"broken_heart":["💔","broken_heart","sad","sorry","break","heart","heartbreak"],"two_hearts":["💕","two_hearts","love","like","affection","valentines","heart"],"sparkling_heart":["💖","sparkling_heart","love","like","affection","valentines"],"heartpulse":["💗","growing_heart","like","love","affection","valentines","pink","heartpulse"],"cupid":["💘","heart_with_arrow","love","like","heart","affection","valentines","cupid"],"blue_heart":["💙","blue_heart","love","like","affection","valentines"],"green_heart":["💚","green_heart","love","like","affection","valentines"],"yellow_heart":["💛","yellow_heart","love","like","affection","valentines"],"purple_heart":["💜","purple_heart","love","like","affection","valentines"],"gift_heart":["💝","heart_with_ribbon","love","valentines","gift_heart"],"revolving_hearts":["💞","revolving_hearts","love","like","affection","valentines"],"heart_decoration":["💟","heart_decoration","purple-square","love","like"],"diamond_shape_with_a_dot_inside":["💠","diamond_with_a_dot","jewel","blue","gem","crystal","fancy","diamond_shape_with_a_dot_inside"],"bulb":["💡","light_bulb","light","electricity","idea","bulb"],"anger":["💢","anger_symbol","angry","mad","anger"],"bomb":["💣","bomb","boom","explode","explosion","terrorism"],"zzz":["💤","zzz","sleepy","tired","dream"],"boom":["💥","collision","bomb","explode","explosion","collision","blown","boom"],"sweat_drops":["💦","sweat_droplets","water","drip","oops","sweat_drops"],"droplet":["💧","droplet","water","drip","faucet","spring"],"dash":["💨","dashing_away","wind","air","fast","shoo","fart","smoke","puff","dash"],"hankey":["💩","pile_of_poo","hankey","shitface","fail","turd","shit","poop"],"muscle":["💪","flexed_biceps","arm","flex","hand","summer","strong","biceps","muscle"],"dizzy":["💫","dizzy","star","sparkle","shoot","magic"],"speech_balloon":["💬","speech_balloon","bubble","words","message","talk","chatting"],"thought_balloon":["💭","thought_balloon","bubble","cloud","speech","thinking","dream"],"white_flower":["💮","white_flower","japanese","spring"],"moneybag":["💰","money_bag","dollar","payment","coins","sale","moneybag"],"currency_exchange":["💱","currency_exchange","money","sales","dollar","travel"],"heavy_dollar_sign":["💲","heavy_dollar_sign","money","sales","payment","currency","buck"],"credit_card":["💳","credit_card","money","sales","dollar","bill","payment","shopping"],"yen":["💴","yen_banknote","money","sales","japanese","dollar","currency","yen"],"dollar":["💵","dollar_banknote","money","sales","bill","currency","dollar"],"euro":["💶","euro_banknote","money","sales","dollar","currency","euro"],"pound":["💷","pound_banknote","british","sterling","money","sales","bills","uk","england","currency","pound"],"money_with_wings":["💸","money_with_wings","dollar","bills","payment","sale"],"chart":["💹","chart_increasing_with_yen","green-square","graph","presentation","stats","chart"],"seat":["💺","seat","sit","airplane","transport","bus","flight","fly"],"computer":["💻","laptop","technology","laptop","screen","display","monitor","computer"],"briefcase":["💼","briefcase","business","documents","work","law","legal","job","career"],"minidisc":["💽","computer_disk","technology","record","data","disk","90s","minidisc"],"floppy_disk":["💾","floppy_disk","oldschool","technology","save","90s","80s"],"cd":["💿","optical_disk","technology","dvd","disk","disc","90s","cd"],"dvd":["📀","dvd","cd","disk","disc"],"file_folder":["📁","file_folder","documents","business","office"],"open_file_folder":["📂","open_file_folder","documents","load"],"page_with_curl":["📃","page_with_curl","documents","office","paper"],"page_facing_up":["📄","page_facing_up","documents","office","paper","information"],"date":["📅","calendar","calendar","schedule","date"],"calendar":["📆","tear_off_calendar","schedule","date","planning","calendar"],"card_index":["📇","card_index","business","stationery"],"chart_with_upwards_trend":["📈","chart_increasing","graph","presentation","stats","recovery","business","economics","money","sales","good","success","chart_with_upwards_trend"],"chart_with_downwards_trend":["📉","chart_decreasing","graph","presentation","stats","recession","business","economics","money","sales","bad","failure","chart_with_downwards_trend"],"bar_chart":["📊","bar_chart","graph","presentation","stats"],"clipboard":["📋","clipboard","stationery","documents"],"pushpin":["📌","pushpin","stationery","mark","here"],"round_pushpin":["📍","round_pushpin","stationery","location","map","here"],"paperclip":["📎","paperclip","documents","stationery"],"straight_ruler":["📏","straight_ruler","stationery","calculate","length","math","school","drawing","architect","sketch"],"triangular_ruler":["📐","triangular_ruler","stationery","math","architect","sketch"],"bookmark_tabs":["📑","bookmark_tabs","favorite","save","order","tidy"],"ledger":["📒","ledger","notes","paper"],"notebook":["📓","notebook","stationery","record","notes","paper","study"],"notebook_with_decorative_cover":["📔","notebook_with_decorative_cover","classroom","notes","record","paper","study"],"closed_book":["📕","closed_book","read","library","knowledge","textbook","learn"],"book":["📖","open_book","book","read","library","knowledge","literature","learn","study"],"green_book":["📗","green_book","read","library","knowledge","study"],"blue_book":["📘","blue_book","read","library","knowledge","learn","study"],"orange_book":["📙","orange_book","read","library","knowledge","textbook","study"],"books":["📚","books","literature","library","study"],"name_badge":["📛","name_badge","fire","forbid"],"scroll":["📜","scroll","documents","ancient","history","paper"],"memo":["📝","memo","write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],"telephone_receiver":["📞","telephone_receiver","technology","communication","dial"],"pager":["📟","pager","bbcall","oldschool","90s"],"fax":["📠","fax_machine","communication","technology","fax"],"satellite_antenna":["📡","satellite_antenna","communication","future","radio","space"],"loudspeaker":["📢","loudspeaker","volume","sound"],"mega":["📣","megaphone","sound","speaker","volume","mega"],"outbox_tray":["📤","outbox_tray","inbox","email"],"inbox_tray":["📥","inbox_tray","email","documents"],"package":["📦","package","mail","gift","cardboard","box","moving"],"e-mail":["📧","e_mail","communication","inbox","e-mail"],"incoming_envelope":["📨","incoming_envelope","email","inbox"],"envelope_with_arrow":["📩","envelope_with_arrow","email","communication"],"mailbox_closed":["📪","closed_mailbox_with_lowered_flag","email","communication","inbox","mailbox_closed"],"mailbox":["📫","closed_mailbox_with_raised_flag","email","inbox","communication","mailbox"],"mailbox_with_mail":["📬","open_mailbox_with_raised_flag","email","inbox","communication","mailbox_with_mail"],"mailbox_with_no_mail":["📭","open_mailbox_with_lowered_flag","email","inbox","mailbox_with_no_mail"],"postbox":["📮","postbox","email","letter","envelope"],"postal_horn":["📯","postal_horn","instrument","music"],"newspaper":["📰","newspaper","press","headline"],"iphone":["📱","mobile_phone","technology","apple","gadgets","dial","iphone"],"calling":["📲","mobile_phone_with_arrow","iphone","incoming","calling"],"vibration_mode":["📳","vibration_mode","orange-square","phone"],"mobile_phone_off":["📴","mobile_phone_off","mute","orange-square","silence","quiet"],"no_mobile_phones":["📵","no_mobile_phones","iphone","mute","circle"],"signal_strength":["📶","antenna_bars","blue-square","reception","phone","internet","connection","wifi","bluetooth","bars","signal_strength"],"camera":["📷","camera","gadgets","photography"],"camera_with_flash":["📸","camera_with_flash","photography","gadgets"],"video_camera":["📹","video_camera","film","record"],"tv":["📺","television","technology","program","oldschool","show","television","tv"],"radio":["📻","radio","communication","music","podcast","program"],"vhs":["📼","videocassette","record","video","oldschool","90s","80s","vhs"],"film_projector":["📽️","film_projector","video","tape","record","movie"],"prayer_beads":["📿","prayer_beads","dhikr","religious"],"twisted_rightwards_arrows":["🔀","shuffle_tracks_button","blue-square","shuffle","music","random","twisted_rightwards_arrows"],"repeat":["🔁","repeat_button","loop","record","repeat"],"repeat_one":["🔂","repeat_single_button","blue-square","loop","repeat_one"],"arrows_clockwise":["🔃","clockwise_vertical_arrows","sync","cycle","round","repeat","arrows_clockwise"],"arrows_counterclockwise":["🔄","counterclockwise_arrows_button","blue-square","sync","cycle","arrows_counterclockwise"],"low_brightness":["🔅","dim_button","sun","afternoon","warm","summer","low_brightness"],"high_brightness":["🔆","bright_button","sun","light","high_brightness"],"mute":["🔇","muted_speaker","sound","volume","silence","quiet","mute"],"speaker":["🔈","speaker_low_volume","sound","volume","silence","broadcast","speaker"],"sound":["🔉","speaker_medium_volume","volume","speaker","broadcast","sound"],"loud_sound":["🔊","speaker_high_volume","volume","noise","noisy","speaker","broadcast","loud_sound"],"battery":["🔋","battery","power","energy","sustain"],"electric_plug":["🔌","electric_plug","charger","power"],"mag":["🔍","magnifying_glass_tilted_left","search","zoom","find","detective","mag"],"mag_right":["🔎","magnifying_glass_tilted_right","search","zoom","find","detective","mag_right"],"lock_with_ink_pen":["🔏","locked_with_pen","security","secret","lock_with_ink_pen"],"closed_lock_with_key":["🔐","locked_with_key","security","privacy","closed_lock_with_key"],"key":["🔑","key","lock","door","password"],"lock":["🔒","locked","security","password","padlock","lock"],"unlock":["🔓","unlocked","privacy","security","unlock"],"bell":["🔔","bell","sound","notification","christmas","xmas","chime"],"no_bell":["🔕","bell_with_slash","sound","volume","mute","quiet","silent","no_bell"],"bookmark":["🔖","bookmark","favorite","label","save"],"link":["🔗","link","rings","url"],"radio_button":["🔘","radio_button","input","old","music","circle"],"back":["🔙","back_arrow","arrow","words","return","back"],"end":["🔚","end_arrow","words","arrow","end"],"on":["🔛","on_arrow","arrow","words","on"],"soon":["🔜","soon_arrow","arrow","words","soon"],"top":["🔝","top_arrow","words","blue-square","top"],"underage":["🔞","no_one_under_eighteen","18","drink","pub","night","minor","circle","underage"],"keycap_ten":["🔟","keycap_10","numbers","10","blue-square","keycap_ten"],"capital_abcd":["🔠","input_latin_uppercase","alphabet","words","blue-square","capital_abcd"],"abcd":["🔡","input_latin_lowercase","blue-square","alphabet","abcd"],"symbols":["🔣","input_symbols","blue-square","music","note","ampersand","percent","glyphs","characters","symbols"],"abc":["🔤","input_latin_letters","blue-square","alphabet","abc"],"fire":["🔥","fire","hot","cook","flame"],"flashlight":["🔦","flashlight","dark","camping","sight","night"],"wrench":["🔧","wrench","tools","diy","ikea","fix","maintainer"],"hammer":["🔨","hammer","tools","build","create"],"nut_and_bolt":["🔩","nut_and_bolt","handy","tools","fix"],"hocho":["🔪","kitchen_knife","knife","blade","cutlery","kitchen","weapon","hocho"],"gun":["🔫","pistol","violence","weapon","pistol","revolver","gun"],"microscope":["🔬","microscope","laboratory","experiment","zoomin","science","study"],"telescope":["🔭","telescope","stars","space","zoom","science","astronomy"],"crystal_ball":["🔮","crystal_ball","disco","party","magic","circus","fortune_teller"],"six_pointed_star":["🔯","dotted_six_pointed_star","purple-square","religion","jewish","hexagram","six_pointed_star"],"beginner":["🔰","japanese_symbol_for_beginner","badge","shield","beginner"],"trident":["🔱","trident_emblem","weapon","spear","trident"],"black_square_button":["🔲","black_square_button","shape","input","frame"],"white_square_button":["🔳","white_square_button","shape","input"],"red_circle":["🔴","red_circle","shape","error","danger"],"large_blue_circle":["🔵","blue_circle","shape","icon","button","large_blue_circle"],"large_orange_diamond":["🔶","large_orange_diamond","shape","jewel","gem"],"large_blue_diamond":["🔷","large_blue_diamond","shape","jewel","gem"],"small_orange_diamond":["🔸","small_orange_diamond","shape","jewel","gem"],"small_blue_diamond":["🔹","small_blue_diamond","shape","jewel","gem"],"small_red_triangle":["🔺","red_triangle_pointed_up","shape","direction","up","top","small_red_triangle"],"small_red_triangle_down":["🔻","red_triangle_pointed_down","shape","direction","bottom","small_red_triangle_down"],"arrow_up_small":["🔼","upwards_button","blue-square","triangle","direction","point","forward","top","arrow_up_small"],"arrow_down_small":["🔽","downwards_button","blue-square","direction","bottom","arrow_down_small"],"om_symbol":["🕉️","om","hinduism","buddhism","sikhism","jainism","om_symbol"],"dove_of_peace":["🕊️","dove","animal","bird","dove_of_peace"],"kaaba":["🕋","kaaba","mecca","mosque","islam"],"mosque":["🕌","mosque","islam","worship","minaret"],"synagogue":["🕍","synagogue","judaism","worship","temple","jewish"],"menorah_with_nine_branches":["🕎","menorah","hanukkah","candles","jewish","menorah_with_nine_branches"],"clock1":["🕐","one_o_clock","time","late","early","schedule","clock1"],"clock2":["🕑","two_o_clock","time","late","early","schedule","clock2"],"clock3":["🕒","three_o_clock","time","late","early","schedule","clock3"],"clock4":["🕓","four_o_clock","time","late","early","schedule","clock4"],"clock5":["🕔","five_o_clock","time","late","early","schedule","clock5"],"clock6":["🕕","six_o_clock","time","late","early","schedule","dawn","dusk","clock6"],"clock7":["🕖","seven_o_clock","time","late","early","schedule","clock7"],"clock8":["🕗","eight_o_clock","time","late","early","schedule","clock8"],"clock9":["🕘","nine_o_clock","time","late","early","schedule","clock9"],"clock10":["🕙","ten_o_clock","time","late","early","schedule","clock10"],"clock11":["🕚","eleven_o_clock","time","late","early","schedule","clock11"],"clock12":["🕛","twelve_o_clock","time","noon","midnight","midday","late","early","schedule","clock12"],"clock130":["🕜","one_thirty","time","late","early","schedule","clock130"],"clock230":["🕝","two_thirty","time","late","early","schedule","clock230"],"clock330":["🕞","three_thirty","time","late","early","schedule","clock330"],"clock430":["🕟","four_thirty","time","late","early","schedule","clock430"],"clock530":["🕠","five_thirty","time","late","early","schedule","clock530"],"clock630":["🕡","six_thirty","time","late","early","schedule","clock630"],"clock730":["🕢","seven_thirty","time","late","early","schedule","clock730"],"clock830":["🕣","eight_thirty","time","late","early","schedule","clock830"],"clock930":["🕤","nine_thirty","time","late","early","schedule","clock930"],"clock1030":["🕥","ten_thirty","time","late","early","schedule","clock1030"],"clock1130":["🕦","eleven_thirty","time","late","early","schedule","clock1130"],"clock1230":["🕧","twelve_thirty","time","late","early","schedule","clock1230"],"candle":["🕯️","candle","fire","wax"],"mantelpiece_clock":["🕰️","mantelpiece_clock","time"],"hole":["🕳️","hole","embarrassing"],"man_in_business_suit_levitating":["🕴️","man_in_suit_levitating","suit","business","levitate","hover","jump","man_in_business_suit_levitating"],"female-detective":["🕵️","detective","human","spy","detective","female-detective"],"male-detective":["🕵️","detective","human","spy","detective","male-detective"],"sleuth_or_spy":["🕵️","detective","human","spy","detective","sleuth_or_spy"],"dark_sunglasses":["🕶️","sunglasses","face","cool","accessories","dark_sunglasses"],"spider":["🕷️","spider","animal","arachnid"],"spider_web":["🕸️","spider_web","animal","insect","arachnid","silk"],"joystick":["🕹️","joystick","game","play"],"man_dancing":["🕺","man_dancing","male","boy","fun","dancer"],"linked_paperclips":["🖇️","linked_paperclips","documents","stationery"],"lower_left_ballpoint_pen":["🖊️","pen","stationery","writing","write","lower_left_ballpoint_pen"],"lower_left_fountain_pen":["🖋️","fountain_pen","stationery","writing","write","lower_left_fountain_pen"],"lower_left_paintbrush":["🖌️","paintbrush","drawing","creativity","art","lower_left_paintbrush"],"lower_left_crayon":["🖍️","crayon","drawing","creativity","lower_left_crayon"],"raised_hand_with_fingers_splayed":["🖐️","hand_with_fingers_splayed","hand","fingers","palm","raised_hand_with_fingers_splayed"],"middle_finger":["🖕","middle_finger","hand","fingers","rude","middle","flipping","reversed_hand_with_middle_finger_extended"],"spock-hand":["🖖","vulcan_salute","hand","fingers","spock","star trek","spock-hand"],"black_heart":["🖤","black_heart","evil"],"desktop_computer":["🖥️","desktop_computer","technology","computing","screen"],"printer":["🖨️","printer","paper","ink"],"three_button_mouse":["🖱️","computer_mouse","click","three_button_mouse"],"trackball":["🖲️","trackball","technology","trackpad"],"frame_with_picture":["🖼️","framed_picture","photography","frame_with_picture"],"card_index_dividers":["🗂️","card_index_dividers","organizing","business","stationery"],"card_file_box":["🗃️","card_file_box","business","stationery"],"file_cabinet":["🗄️","file_cabinet","filing","organizing"],"wastebasket":["🗑️","wastebasket","bin","trash","rubbish","garbage","toss"],"spiral_note_pad":["🗒️","spiral_notepad","memo","stationery","spiral_note_pad"],"spiral_calendar_pad":["🗓️","spiral_calendar","date","schedule","planning","spiral_calendar_pad"],"compression":["🗜️","clamp","tool","compression"],"old_key":["🗝️","old_key","lock","door","password"],"rolled_up_newspaper":["🗞️","rolled_up_newspaper","press","headline"],"dagger_knife":["🗡️","dagger","weapon","dagger_knife"],"speaking_head_in_silhouette":["🗣️","speaking_head","user","person","human","sing","say","talk","speaking_head_in_silhouette"],"left_speech_bubble":["🗨️","left_speech_bubble","words","message","talk","chatting"],"right_anger_bubble":["🗯️","right_anger_bubble","caption","speech","thinking","mad"],"ballot_box_with_ballot":["🗳️","ballot_box_with_ballot","election","vote"],"world_map":["🗺️","world_map","location","direction"],"mount_fuji":["🗻","mount_fuji","photo","mountain","nature","japanese"],"tokyo_tower":["🗼","tokyo_tower","photo","japanese"],"statue_of_liberty":["🗽","statue_of_liberty","american","newyork"],"japan":["🗾","map_of_japan","nation","country","japanese","asia","japan"],"moyai":["🗿","moai","rock","easter island","moai","moyai"],"grinning":["😀","grinning_face","face","smile","happy","joy",":D","grin","grinning"],"grin":["😁","beaming_face_with_smiling_eyes","face","happy","smile","joy","kawaii","grin"],"joy":["😂","face_with_tears_of_joy","face","cry","tears","weep","happy","happytears","haha","joy"],"smiley":["😃","grinning_face_with_big_eyes","face","happy","joy","haha",":D",":)","smile","funny","smiley"],"smile":["😄","grinning_face_with_smiling_eyes","face","happy","joy","funny","haha","laugh","like",":D",":)","smile"],"sweat_smile":["😅","grinning_face_with_sweat","face","hot","happy","laugh","sweat","smile","relief","sweat_smile"],"laughing":["😆","grinning_squinting_face","happy","joy","lol","satisfied","haha","face","glad","XD","laugh","laughing"],"innocent":["😇","smiling_face_with_halo","face","angel","heaven","halo","innocent"],"smiling_imp":["😈","smiling_face_with_horns","devil","horns","smiling_imp"],"wink":["😉","winking_face","face","happy","mischievous","secret",";)","smile","eye","wink"],"blush":["😊","smiling_face_with_smiling_eyes","face","smile","happy","flushed","crush","embarrassed","shy","joy","blush"],"yum":["😋","face_savoring_food","happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring","yum"],"relieved":["😌","relieved_face","face","relaxed","phew","massage","happiness","relieved"],"heart_eyes":["😍","smiling_face_with_heart_eyes","face","love","like","affection","valentines","infatuation","crush","heart","heart_eyes"],"sunglasses":["😎","smiling_face_with_sunglasses","face","cool","smile","summer","beach","sunglass","sunglasses"],"smirk":["😏","smirking_face","face","smile","mean","prank","smug","sarcasm","smirk"],"neutral_face":["😐","neutral_face","indifference","meh",":|","neutral"],"expressionless":["😑","expressionless_face","face","indifferent","-_-","meh","deadpan","expressionless"],"unamused":["😒","unamused_face","indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye","unamused"],"sweat":["😓","downcast_face_with_sweat","face","hot","sad","tired","exercise","sweat"],"pensive":["😔","pensive_face","face","sad","depressed","upset","pensive"],"confused":["😕","confused_face","face","indifference","huh","weird","hmmm",":/","confused"],"confounded":["😖","confounded_face","face","confused","sick","unwell","oops",":S","confounded"],"kissing":["😗","kissing_face","love","like","face","3","valentines","infatuation","kiss","kissing"],"kissing_heart":["😘","face_blowing_a_kiss","face","love","like","affection","valentines","infatuation","kiss","kissing_heart"],"kissing_smiling_eyes":["😙","kissing_face_with_smiling_eyes","face","affection","valentines","infatuation","kiss","kissing_smiling_eyes"],"kissing_closed_eyes":["😚","kissing_face_with_closed_eyes","face","love","like","affection","valentines","infatuation","kiss","kissing_closed_eyes"],"stuck_out_tongue":["😛","face_with_tongue","face","prank","childish","playful","mischievous","smile","tongue","stuck_out_tongue"],"stuck_out_tongue_winking_eye":["😜","winking_face_with_tongue","face","prank","childish","playful","mischievous","smile","wink","tongue","stuck_out_tongue_winking_eye"],"stuck_out_tongue_closed_eyes":["😝","squinting_face_with_tongue","face","prank","playful","mischievous","smile","tongue","stuck_out_tongue_closed_eyes"],"disappointed":["😞","disappointed_face","face","sad","upset","depressed",":(","disappointed"],"worried":["😟","worried_face","face","concern","nervous",":(","worried"],"angry":["😠","angry_face","mad","face","annoyed","frustrated","angry"],"rage":["😡","pouting_face","angry","mad","hate","despise","rage"],"cry":["😢","crying_face","face","tears","sad","depressed","upset",":'(","cry"],"persevere":["😣","persevering_face","face","sick","no","upset","oops","persevere"],"triumph":["😤","face_with_steam_from_nose","face","gas","phew","proud","pride","triumph"],"disappointed_relieved":["😥","sad_but_relieved_face","face","phew","sweat","nervous","disappointed_relieved"],"frowning":["😦","frowning_face_with_open_mouth","face","aw","what","frowning"],"anguished":["😧","anguished_face","face","stunned","nervous","anguished"],"fearful":["😨","fearful_face","face","scared","terrified","nervous","oops","huh","fearful"],"weary":["😩","weary_face","face","tired","sleepy","sad","frustrated","upset","weary"],"sleepy":["😪","sleepy_face","face","tired","rest","nap","sleepy"],"tired_face":["😫","tired_face","sick","whine","upset","frustrated"],"grimacing":["😬","grimacing_face","face","grimace","teeth","grimacing"],"sob":["😭","loudly_crying_face","face","cry","tears","sad","upset","depressed","sob"],"open_mouth":["😮","face_with_open_mouth","face","surprise","impressed","wow","whoa",":O","open_mouth"],"hushed":["😯","hushed_face","face","woo","shh","hushed"],"cold_sweat":["😰","anxious_face_with_sweat","face","nervous","sweat","cold_sweat"],"scream":["😱","face_screaming_in_fear","face","munch","scared","omg","scream"],"astonished":["😲","astonished_face","face","xox","surprised","poisoned","astonished"],"flushed":["😳","flushed_face","face","blush","shy","flattered","flushed"],"sleeping":["😴","sleeping_face","face","tired","sleepy","night","zzz","sleeping"],"dizzy_face":["😵","dizzy_face","spent","unconscious","xox","dizzy"],"no_mouth":["😶","face_without_mouth","face","hellokitty","no_mouth"],"mask":["😷","face_with_medical_mask","face","sick","ill","disease","mask"],"smile_cat":["😸","grinning_cat_with_smiling_eyes","animal","cats","smile","smile_cat"],"joy_cat":["😹","cat_with_tears_of_joy","animal","cats","haha","happy","tears","joy_cat"],"smiley_cat":["😺","grinning_cat","animal","cats","happy","smile","smiley_cat"],"heart_eyes_cat":["😻","smiling_cat_with_heart_eyes","animal","love","like","affection","cats","valentines","heart","heart_eyes_cat"],"smirk_cat":["😼","cat_with_wry_smile","animal","cats","smirk","smirk_cat"],"kissing_cat":["😽","kissing_cat","animal","cats","kiss"],"pouting_cat":["😾","pouting_cat","animal","cats"],"crying_cat_face":["😿","crying_cat","animal","tears","weep","sad","cats","upset","cry","crying_cat_face"],"scream_cat":["🙀","weary_cat","animal","cats","munch","scared","scream","scream_cat"],"slightly_frowning_face":["🙁","slightly_frowning_face","face","frowning","disappointed","sad","upset"],"slightly_smiling_face":["🙂","slightly_smiling_face","face","smile"],"upside_down_face":["🙃","upside_down_face","face","flipped","silly","smile"],"face_with_rolling_eyes":["🙄","face_with_rolling_eyes","face","eyeroll","frustrated"],"woman-gesturing-no":["🙅","person_gesturing_no","decline","woman-gesturing-no"],"man-gesturing-no":["🙅","person_gesturing_no","decline","man-gesturing-no"],"no_good":["🙅","person_gesturing_no","decline","no_good"],"woman-gesturing-ok":["🙆","person_gesturing_ok","agree","woman-gesturing-ok"],"man-gesturing-ok":["🙆","person_gesturing_ok","agree","man-gesturing-ok"],"ok_woman":["🙆","person_gesturing_ok","agree","ok_woman"],"woman-bowing":["🙇","person_bowing","respectiful","woman-bowing"],"man-bowing":["🙇","person_bowing","respectiful","man-bowing"],"bow":["🙇","person_bowing","respectiful","bow"],"see_no_evil":["🙈","see_no_evil_monkey","monkey","animal","nature","haha","see_no_evil"],"hear_no_evil":["🙉","hear_no_evil_monkey","animal","monkey","nature","hear_no_evil"],"speak_no_evil":["🙊","speak_no_evil_monkey","monkey","animal","nature","omg","speak_no_evil"],"woman-raising-hand":["🙋","person_raising_hand","question","woman-raising-hand"],"man-raising-hand":["🙋","person_raising_hand","question","man-raising-hand"],"raising_hand":["🙋","person_raising_hand","question","raising_hand"],"raised_hands":["🙌","raising_hands","gesture","hooray","yea","celebration","hands","raised_hands"],"woman-frowning":["🙍","person_frowning","worried","woman-frowning"],"man-frowning":["🙍","person_frowning","worried","man-frowning"],"person_frowning":["🙍","person_frowning","worried"],"woman-pouting":["🙎","person_pouting","upset","woman-pouting"],"man-pouting":["🙎","person_pouting","upset","man-pouting"],"person_with_pouting_face":["🙎","person_pouting","upset","person_with_pouting_face"],"pray":["🙏","folded_hands","please","hope","wish","namaste","highfive","pray"],"rocket":["🚀","rocket","launch","ship","staffmode","NASA","outer space","outer_space","fly"],"helicopter":["🚁","helicopter","transportation","vehicle","fly"],"steam_locomotive":["🚂","locomotive","transportation","vehicle","train","steam_locomotive"],"railway_car":["🚃","railway_car","transportation","vehicle"],"bullettrain_side":["🚄","high_speed_train","transportation","vehicle","bullettrain_side"],"bullettrain_front":["🚅","bullet_train","transportation","vehicle","speed","fast","public","travel","bullettrain_front"],"train2":["🚆","train","transportation","vehicle","train2"],"metro":["🚇","metro","transportation","blue-square","mrt","underground","tube"],"light_rail":["🚈","light_rail","transportation","vehicle"],"station":["🚉","station","transportation","vehicle","public"],"tram":["🚊","tram","transportation","vehicle"],"train":["🚋","tram_car","transportation","vehicle","carriage","public","travel","train"],"bus":["🚌","bus","car","vehicle","transportation"],"oncoming_bus":["🚍","oncoming_bus","vehicle","transportation"],"trolleybus":["🚎","trolleybus","bart","transportation","vehicle"],"busstop":["🚏","bus_stop","transportation","wait","busstop"],"minibus":["🚐","minibus","vehicle","car","transportation"],"ambulance":["🚑","ambulance","health","911","hospital"],"fire_engine":["🚒","fire_engine","transportation","cars","vehicle"],"police_car":["🚓","police_car","vehicle","cars","transportation","law","legal","enforcement"],"oncoming_police_car":["🚔","oncoming_police_car","vehicle","law","legal","enforcement","911"],"taxi":["🚕","taxi","uber","vehicle","cars","transportation"],"oncoming_taxi":["🚖","oncoming_taxi","vehicle","cars","uber"],"car":["🚗","automobile","red","transportation","vehicle","car","red_car"],"oncoming_automobile":["🚘","oncoming_automobile","car","vehicle","transportation"],"blue_car":["🚙","sport_utility_vehicle","transportation","vehicle","blue_car"],"truck":["🚚","delivery_truck","cars","transportation","truck"],"articulated_lorry":["🚛","articulated_lorry","vehicle","cars","transportation","express"],"tractor":["🚜","tractor","vehicle","car","farming","agriculture"],"monorail":["🚝","monorail","transportation","vehicle"],"mountain_railway":["🚞","mountain_railway","transportation","vehicle"],"suspension_railway":["🚟","suspension_railway","vehicle","transportation"],"mountain_cableway":["🚠","mountain_cableway","transportation","vehicle","ski"],"aerial_tramway":["🚡","aerial_tramway","transportation","vehicle","ski"],"ship":["🚢","ship","transportation","titanic","deploy"],"woman-rowing-boat":["🚣","person_rowing_boat","sport","move","woman-rowing-boat"],"man-rowing-boat":["🚣","person_rowing_boat","sport","move","man-rowing-boat"],"rowboat":["🚣","person_rowing_boat","sport","move","rowboat"],"speedboat":["🚤","speedboat","ship","transportation","vehicle","summer"],"traffic_light":["🚥","horizontal_traffic_light","transportation","signal","traffic_light"],"vertical_traffic_light":["🚦","vertical_traffic_light","transportation","driving"],"construction":["🚧","construction","wip","progress","caution","warning"],"rotating_light":["🚨","police_car_light","police","ambulance","911","emergency","alert","error","pinged","law","legal","rotating_light"],"triangular_flag_on_post":["🚩","triangular_flag","mark","milestone","place","triangular_flag_on_post"],"door":["🚪","door","house","entry","exit"],"no_entry_sign":["🚫","prohibited","forbid","stop","limit","denied","disallow","circle","no_entry_sign"],"smoking":["🚬","cigarette","kills","tobacco","cigarette","joint","smoke","smoking"],"no_smoking":["🚭","no_smoking","cigarette","blue-square","smell","smoke"],"put_litter_in_its_place":["🚮","litter_in_bin_sign","blue-square","sign","human","info","put_litter_in_its_place"],"do_not_litter":["🚯","no_littering","trash","bin","garbage","circle","do_not_litter"],"potable_water":["🚰","potable_water","blue-square","liquid","restroom","cleaning","faucet"],"non-potable_water":["🚱","non_potable_water","drink","faucet","tap","circle","non-potable_water"],"bike":["🚲","bicycle","sports","bicycle","exercise","hipster","bike"],"no_bicycles":["🚳","no_bicycles","cyclist","prohibited","circle"],"woman-biking":["🚴","person_biking","sport","move","woman-biking"],"man-biking":["🚴","person_biking","sport","move","man-biking"],"bicyclist":["🚴","person_biking","sport","move","bicyclist"],"woman-mountain-biking":["🚵","person_mountain_biking","sport","move","woman-mountain-biking"],"man-mountain-biking":["🚵","person_mountain_biking","sport","move","man-mountain-biking"],"mountain_bicyclist":["🚵","person_mountain_biking","sport","move","mountain_bicyclist"],"woman-walking":["🚶","person_walking","move","woman-walking"],"man-walking":["🚶","person_walking","move","man-walking"],"walking":["🚶","person_walking","move","walking"],"no_pedestrians":["🚷","no_pedestrians","rules","crossing","walking","circle"],"children_crossing":["🚸","children_crossing","school","warning","danger","sign","driving","yellow-diamond"],"mens":["🚹","men_s_room","toilet","restroom","wc","blue-square","gender","male","mens"],"womens":["🚺","women_s_room","purple-square","woman","female","toilet","loo","restroom","gender","womens"],"restroom":["🚻","restroom","blue-square","toilet","refresh","wc","gender"],"baby_symbol":["🚼","baby_symbol","orange-square","child"],"toilet":["🚽","toilet","restroom","wc","washroom","bathroom","potty"],"wc":["🚾","water_closet","toilet","restroom","blue-square","wc"],"shower":["🚿","shower","clean","water","bathroom"],"bath":["🛀","person_taking_bath","clean","shower","bathroom","bath"],"bathtub":["🛁","bathtub","clean","shower","bathroom"],"passport_control":["🛂","passport_control","custom","blue-square"],"customs":["🛃","customs","passport","border","blue-square"],"baggage_claim":["🛄","baggage_claim","blue-square","airport","transport"],"left_luggage":["🛅","left_luggage","blue-square","travel"],"couch_and_lamp":["🛋️","couch_and_lamp","read","chill"],"sleeping_accommodation":["🛌","person_in_bed","bed","rest","sleeping_accommodation"],"shopping_bags":["🛍️","shopping_bags","mall","buy","purchase"],"bellhop_bell":["🛎️","bellhop_bell","service"],"bed":["🛏️","bed","sleep","rest"],"place_of_worship":["🛐","place_of_worship","religion","church","temple","prayer"],"octagonal_sign":["🛑","stop_sign","stop","octagonal_sign"],"shopping_trolley":["🛒","shopping_cart","trolley","shopping_trolley"],"hindu_temple":["🛕","hindu_temple","religion"],"hut":["🛖","hut","house","structure"],"elevator":["🛗","elevator","lift"],"hammer_and_wrench":["🛠️","hammer_and_wrench","tools","build","create"],"shield":["🛡️","shield","protection","security"],"oil_drum":["🛢️","oil_drum","barrell"],"motorway":["🛣️","motorway","road","cupertino","interstate","highway"],"railway_track":["🛤️","railway_track","train","transportation"],"motor_boat":["🛥️","motor_boat","ship"],"small_airplane":["🛩️","small_airplane","flight","transportation","fly","vehicle"],"airplane_departure":["🛫","airplane_departure","airport","flight","landing"],"airplane_arriving":["🛬","airplane_arrival","airport","flight","boarding","airplane_arriving"],"satellite":["🛰️","satellite","communication","gps","orbit","spaceflight","NASA","ISS"],"passenger_ship":["🛳️","passenger_ship","yacht","cruise","ferry"],"scooter":["🛴","kick_scooter","vehicle","kick","razor","scooter"],"motor_scooter":["🛵","motor_scooter","vehicle","vespa","sasha"],"canoe":["🛶","canoe","boat","paddle","water","ship"],"sled":["🛷","sled","sleigh","luge","toboggan"],"flying_saucer":["🛸","flying_saucer","transportation","vehicle","ufo"],"skateboard":["🛹","skateboard","board"],"auto_rickshaw":["🛺","auto_rickshaw","move","transportation"],"pickup_truck":["🛻","pickup truck","car","transportation","pickup_truck"],"roller_skate":["🛼","roller skate","footwear","sports","roller_skate"],"large_orange_circle":["🟠","orange_circle","round","large_orange_circle"],"large_yellow_circle":["🟡","yellow_circle","round","large_yellow_circle"],"large_green_circle":["🟢","green_circle","round","large_green_circle"],"large_purple_circle":["🟣","purple_circle","round","large_purple_circle"],"large_brown_circle":["🟤","brown_circle","round","large_brown_circle"],"large_red_square":["🟥","red_square","large_red_square"],"large_blue_square":["🟦","blue_square","large_blue_square"],"large_orange_square":["🟧","orange_square","large_orange_square"],"large_yellow_square":["🟨","yellow_square","large_yellow_square"],"large_green_square":["🟩","green_square","large_green_square"],"large_purple_square":["🟪","purple_square","large_purple_square"],"large_brown_square":["🟫","brown_square","large_brown_square"],"pinched_fingers":["🤌","pinched fingers","size","tiny","small","pinched_fingers"],"white_heart":["🤍","white_heart","pure"],"brown_heart":["🤎","brown_heart","coffee"],"pinching_hand":["🤏","pinching_hand","tiny","small","size"],"zipper_mouth_face":["🤐","zipper_mouth_face","face","sealed","zipper","secret"],"money_mouth_face":["🤑","money_mouth_face","face","rich","dollar","money"],"face_with_thermometer":["🤒","face_with_thermometer","sick","temperature","thermometer","cold","fever"],"nerd_face":["🤓","nerd_face","face","nerdy","geek","dork"],"thinking_face":["🤔","thinking_face","face","hmmm","think","consider"],"face_with_head_bandage":["🤕","face_with_head_bandage","injured","clumsy","bandage","hurt"],"robot_face":["🤖","robot","computer","machine","bot","robot_face"],"hugging_face":["🤗","hugging_face","face","smile","hug"],"the_horns":["🤘","sign_of_the_horns","hand","fingers","evil_eye","sign_of_horns","rock_on","the_horns"],"call_me_hand":["🤙","call_me_hand","hands","gesture"],"raised_back_of_hand":["🤚","raised_back_of_hand","fingers","raised","backhand"],"left-facing_fist":["🤛","left_facing_fist","hand","fistbump","left-facing_fist"],"right-facing_fist":["🤜","right_facing_fist","hand","fistbump","right-facing_fist"],"handshake":["🤝","handshake","agreement","shake"],"crossed_fingers":["🤞","crossed_fingers","good","lucky","hand_with_index_and_middle_fingers_crossed"],"i_love_you_hand_sign":["🤟","love_you_gesture","hand","fingers","gesture","i_love_you_hand_sign"],"face_with_cowboy_hat":["🤠","cowboy_hat_face","face","cowgirl","hat","face_with_cowboy_hat"],"clown_face":["🤡","clown_face","face"],"nauseated_face":["🤢","nauseated_face","face","vomit","gross","green","sick","throw up","ill"],"rolling_on_the_floor_laughing":["🤣","rolling_on_the_floor_laughing","face","rolling","floor","laughing","lol","haha"],"drooling_face":["🤤","drooling_face","face"],"lying_face":["🤥","lying_face","face","lie","pinocchio"],"woman-facepalming":["🤦","person_facepalming","disappointed","woman-facepalming"],"man-facepalming":["🤦","person_facepalming","disappointed","man-facepalming"],"face_palm":["🤦","person_facepalming","disappointed","face_palm"],"sneezing_face":["🤧","sneezing_face","face","gesundheit","sneeze","sick","allergy"],"face_with_raised_eyebrow":["🤨","face_with_raised_eyebrow","face","distrust","scepticism","disapproval","disbelief","surprise","face_with_one_eyebrow_raised"],"star-struck":["🤩","star_struck","face","smile","starry","eyes","grinning","star-struck","grinning_face_with_star_eyes"],"zany_face":["🤪","zany_face","face","goofy","crazy","grinning_face_with_one_large_and_one_small_eye"],"shushing_face":["🤫","shushing_face","face","quiet","shhh","face_with_finger_covering_closed_lips"],"face_with_symbols_on_mouth":["🤬","face_with_symbols_on_mouth","face","swearing","cursing","cussing","profanity","expletive","serious_face_with_symbols_covering_mouth"],"face_with_hand_over_mouth":["🤭","face_with_hand_over_mouth","face","whoops","shock","surprise","smiling_face_with_smiling_eyes_and_hand_covering_mouth"],"face_vomiting":["🤮","face_vomiting","face","sick","face_with_open_mouth_vomiting"],"exploding_head":["🤯","exploding_head","face","shocked","mind","blown","shocked_face_with_exploding_head"],"pregnant_woman":["🤰","pregnant_woman","baby"],"breast-feeding":["🤱","breast_feeding","nursing","baby","breast-feeding"],"palms_up_together":["🤲","palms_up_together","hands","gesture","cupped","prayer"],"selfie":["🤳","selfie","camera","phone"],"prince":["🤴","prince","boy","man","male","crown","royal","king"],"woman_in_tuxedo":["🤵","man_in_tuxedo","couple","marriage","wedding","groom","woman_in_tuxedo"],"man_in_tuxedo":["🤵","man_in_tuxedo","couple","marriage","wedding","groom"],"person_in_tuxedo":["🤵","man_in_tuxedo","couple","marriage","wedding","groom","person_in_tuxedo"],"mrs_claus":["🤶","mrs_claus","woman","female","xmas","mother christmas","mother_christmas"],"woman-shrugging":["🤷","person_shrugging","regardless","woman-shrugging"],"man-shrugging":["🤷","person_shrugging","regardless","man-shrugging"],"shrug":["🤷","person_shrugging","regardless","shrug"],"woman-cartwheeling":["🤸","person_cartwheeling","sport","gymnastic","woman-cartwheeling"],"man-cartwheeling":["🤸","person_cartwheeling","sport","gymnastic","man-cartwheeling"],"person_doing_cartwheel":["🤸","person_cartwheeling","sport","gymnastic","person_doing_cartwheel"],"woman-juggling":["🤹","person_juggling","performance","balance","woman-juggling"],"man-juggling":["🤹","person_juggling","performance","balance","man-juggling"],"juggling":["🤹","person_juggling","performance","balance","juggling"],"fencer":["🤺","person_fencing","sports","fencing","sword","fencer"],"woman-wrestling":["🤼","people_wrestling","sport","woman-wrestling"],"man-wrestling":["🤼","people_wrestling","sport","man-wrestling"],"wrestlers":["🤼","people_wrestling","sport","wrestlers"],"woman-playing-water-polo":["🤽","person_playing_water_polo","sport","woman-playing-water-polo"],"man-playing-water-polo":["🤽","person_playing_water_polo","sport","man-playing-water-polo"],"water_polo":["🤽","person_playing_water_polo","sport","water_polo"],"woman-playing-handball":["🤾","person_playing_handball","sport","woman-playing-handball"],"man-playing-handball":["🤾","person_playing_handball","sport","man-playing-handball"],"handball":["🤾","person_playing_handball","sport","handball"],"diving_mask":["🤿","diving_mask","sport","ocean"],"wilted_flower":["🥀","wilted_flower","plant","nature","flower"],"drum_with_drumsticks":["🥁","drum","music","instrument","drumsticks","snare","drum_with_drumsticks"],"clinking_glasses":["🥂","clinking_glasses","beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],"tumbler_glass":["🥃","tumbler_glass","drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],"spoon":["🥄","spoon","cutlery","kitchen","tableware"],"goal_net":["🥅","goal_net","sports"],"first_place_medal":["🥇","1st_place_medal","award","winning","first","first_place_medal"],"second_place_medal":["🥈","2nd_place_medal","award","second","second_place_medal"],"third_place_medal":["🥉","3rd_place_medal","award","third","third_place_medal"],"boxing_glove":["🥊","boxing_glove","sports","fighting"],"martial_arts_uniform":["🥋","martial_arts_uniform","judo","karate","taekwondo"],"curling_stone":["🥌","curling_stone","sports"],"lacrosse":["🥍","lacrosse","sports","ball","stick"],"softball":["🥎","softball","sports","balls"],"flying_disc":["🥏","flying_disc","sports","frisbee","ultimate"],"croissant":["🥐","croissant","food","bread","french"],"avocado":["🥑","avocado","fruit","food"],"cucumber":["🥒","cucumber","fruit","food","pickle"],"bacon":["🥓","bacon","food","breakfast","pork","pig","meat"],"potato":["🥔","potato","food","tuber","vegatable","starch"],"carrot":["🥕","carrot","vegetable","food","orange"],"baguette_bread":["🥖","baguette_bread","food","bread","french"],"green_salad":["🥗","green_salad","food","healthy","lettuce"],"shallow_pan_of_food":["🥘","shallow_pan_of_food","food","cooking","casserole","paella"],"stuffed_flatbread":["🥙","stuffed_flatbread","food","flatbread","stuffed","gyro"],"egg":["🥚","egg","food","chicken","breakfast"],"glass_of_milk":["🥛","glass_of_milk","beverage","drink","cow"],"peanuts":["🥜","peanuts","food","nut"],"kiwifruit":["🥝","kiwi_fruit","fruit","food","kiwifruit"],"pancakes":["🥞","pancakes","food","breakfast","flapjacks","hotcakes"],"dumpling":["🥟","dumpling","food","empanada","pierogi","potsticker"],"fortune_cookie":["🥠","fortune_cookie","food","prophecy"],"takeout_box":["🥡","takeout_box","food","leftovers"],"chopsticks":["🥢","chopsticks","food"],"bowl_with_spoon":["🥣","bowl_with_spoon","food","breakfast","cereal","oatmeal","porridge"],"cup_with_straw":["🥤","cup_with_straw","drink","soda"],"coconut":["🥥","coconut","fruit","nature","food","palm"],"broccoli":["🥦","broccoli","fruit","food","vegetable"],"pie":["🥧","pie","food","dessert","pastry"],"pretzel":["🥨","pretzel","food","bread","twisted"],"cut_of_meat":["🥩","cut_of_meat","food","cow","meat","cut","chop","lambchop","porkchop"],"sandwich":["🥪","sandwich","food","lunch","bread"],"canned_food":["🥫","canned_food","food","soup"],"leafy_green":["🥬","leafy_green","food","vegetable","plant","bok choy","cabbage","kale","lettuce"],"mango":["🥭","mango","fruit","food","tropical"],"moon_cake":["🥮","moon_cake","food","autumn"],"bagel":["🥯","bagel","food","bread","bakery","schmear"],"smiling_face_with_3_hearts":["🥰","smiling_face_with_hearts","face","love","like","affection","valentines","infatuation","crush","hearts","adore","smiling_face_with_3_hearts"],"yawning_face":["🥱","yawning_face","tired","sleepy",""],"smiling_face_with_tear":["🥲","smiling face with tear","sad","cry","pretend","smiling_face_with_tear"],"partying_face":["🥳","partying_face","face","celebration","woohoo"],"woozy_face":["🥴","woozy_face","face","dizzy","intoxicated","tipsy","wavy"],"hot_face":["🥵","hot_face","face","feverish","heat","red","sweating"],"cold_face":["🥶","cold_face","face","blue","freezing","frozen","frostbite","icicles"],"ninja":["🥷","ninja","ninjutsu","skills","japanese"],"disguised_face":["🥸","disguised face","pretent","brows","glasses","moustache","disguised_face"],"pleading_face":["🥺","pleading_face","face","begging","mercy"],"sari":["🥻","sari","dress"],"lab_coat":["🥼","lab_coat","doctor","experiment","scientist","chemist"],"goggles":["🥽","goggles","eyes","protection","safety"],"hiking_boot":["🥾","hiking_boot","backpacking","camping","hiking"],"womans_flat_shoe":["🥿","flat_shoe","ballet","slip-on","slipper","womans_flat_shoe"],"crab":["🦀","crab","animal","crustacean"],"lion_face":["🦁","lion","animal","nature","lion_face"],"scorpion":["🦂","scorpion","animal","arachnid"],"turkey":["🦃","turkey","animal","bird"],"unicorn_face":["🦄","unicorn","animal","nature","mystical","unicorn_face"],"eagle":["🦅","eagle","animal","nature","bird"],"duck":["🦆","duck","animal","nature","bird","mallard"],"bat":["🦇","bat","animal","nature","blind","vampire"],"shark":["🦈","shark","animal","nature","fish","sea","ocean","jaws","fins","beach"],"owl":["🦉","owl","animal","nature","bird","hoot"],"fox_face":["🦊","fox","animal","nature","face","fox_face"],"butterfly":["🦋","butterfly","animal","insect","nature","caterpillar"],"deer":["🦌","deer","animal","nature","horns","venison"],"gorilla":["🦍","gorilla","animal","nature","circus"],"lizard":["🦎","lizard","animal","nature","reptile"],"rhinoceros":["🦏","rhinoceros","animal","nature","horn"],"shrimp":["🦐","shrimp","animal","ocean","nature","seafood"],"squid":["🦑","squid","animal","nature","ocean","sea"],"giraffe_face":["🦒","giraffe","animal","nature","spots","safari","giraffe_face"],"zebra_face":["🦓","zebra","animal","nature","stripes","safari","zebra_face"],"hedgehog":["🦔","hedgehog","animal","nature","spiny"],"sauropod":["🦕","sauropod","animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],"t-rex":["🦖","t_rex","animal","nature","dinosaur","tyrannosaurus","extinct","t-rex"],"cricket":["🦗","cricket","animal","cricket","chirp"],"kangaroo":["🦘","kangaroo","animal","nature","australia","joey","hop","marsupial"],"llama":["🦙","llama","animal","nature","alpaca"],"peacock":["🦚","peacock","animal","nature","peahen","bird"],"hippopotamus":["🦛","hippopotamus","animal","nature"],"parrot":["🦜","parrot","animal","nature","bird","pirate","talk"],"raccoon":["🦝","raccoon","animal","nature"],"lobster":["🦞","lobster","animal","nature","bisque","claws","seafood"],"mosquito":["🦟","mosquito","animal","nature","insect","malaria"],"microbe":["🦠","microbe","amoeba","bacteria","germs"],"badger":["🦡","badger","animal","nature","honey"],"swan":["🦢","swan","animal","nature","bird"],"mammoth":["🦣","mammoth","elephant","tusks"],"dodo":["🦤","dodo","animal","bird"],"sloth":["🦥","sloth","animal"],"otter":["🦦","otter","animal"],"orangutan":["🦧","orangutan","animal"],"skunk":["🦨","skunk","animal"],"flamingo":["🦩","flamingo","animal"],"oyster":["🦪","oyster","food"],"beaver":["🦫","beaver","animal","rodent"],"bison":["🦬","bison","ox"],"seal":["🦭","seal","animal","creature","sea"],"guide_dog":["🦮","guide_dog","animal","blind"],"probing_cane":["🦯","probing_cane","accessibility"],"bone":["🦴","bone","skeleton"],"leg":["🦵","leg","kick","limb"],"foot":["🦶","foot","kick","stomp"],"tooth":["🦷","tooth","teeth","dentist"],"female_superhero":["🦸","superhero","marvel","female_superhero"],"male_superhero":["🦸","superhero","marvel","male_superhero"],"superhero":["🦸","superhero","marvel"],"female_supervillain":["🦹","supervillain","marvel","female_supervillain"],"male_supervillain":["🦹","supervillain","marvel","male_supervillain"],"supervillain":["🦹","supervillain","marvel"],"safety_vest":["🦺","safety_vest","protection"],"ear_with_hearing_aid":["🦻","ear_with_hearing_aid","accessibility"],"motorized_wheelchair":["🦼","motorized_wheelchair","accessibility"],"manual_wheelchair":["🦽","manual_wheelchair","accessibility"],"mechanical_arm":["🦾","mechanical_arm","accessibility"],"mechanical_leg":["🦿","mechanical_leg","accessibility"],"cheese_wedge":["🧀","cheese_wedge","food","chadder"],"cupcake":["🧁","cupcake","food","dessert","bakery","sweet"],"salt":["🧂","salt","condiment","shaker"],"beverage_box":["🧃","beverage_box","drink"],"garlic":["🧄","garlic","food","spice","cook"],"onion":["🧅","onion","cook","food","spice"],"falafel":["🧆","falafel","food"],"waffle":["🧇","waffle","food","breakfast"],"butter":["🧈","butter","food","cook"],"mate_drink":["🧉","mate","drink","tea","beverage","mate_drink"],"ice_cube":["🧊","ice","water","cold","ice_cube"],"bubble_tea":["🧋","bubble tea","taiwan","boba","milk tea","straw","bubble_tea"],"woman_standing":["🧍","person_standing","still","woman_standing"],"man_standing":["🧍","person_standing","still","man_standing"],"standing_person":["🧍","person_standing","still","standing_person"],"woman_kneeling":["🧎","person_kneeling","pray","respectful","woman_kneeling"],"man_kneeling":["🧎","person_kneeling","pray","respectful","man_kneeling"],"kneeling_person":["🧎","person_kneeling","pray","respectful","kneeling_person"],"deaf_woman":["🧏","deaf_person","accessibility","deaf_woman"],"deaf_man":["🧏","deaf_person","accessibility","deaf_man"],"deaf_person":["🧏","deaf_person","accessibility"],"face_with_monocle":["🧐","face_with_monocle","face","stuffy","wealthy"],"farmer":["🧑","person","gender-neutral","person","farmer"],"cook":["🧑","person","gender-neutral","person","cook"],"person_feeding_baby":["🧑","person","gender-neutral","person","person_feeding_baby"],"mx_claus":["🧑","person","gender-neutral","person","mx_claus"],"student":["🧑","person","gender-neutral","person","student"],"singer":["🧑","person","gender-neutral","person","singer"],"artist":["🧑","person","gender-neutral","person","artist"],"teacher":["🧑","person","gender-neutral","person","teacher"],"factory_worker":["🧑","person","gender-neutral","person","factory_worker"],"technologist":["🧑","person","gender-neutral","person","technologist"],"office_worker":["🧑","person","gender-neutral","person","office_worker"],"mechanic":["🧑","person","gender-neutral","person","mechanic"],"scientist":["🧑","person","gender-neutral","person","scientist"],"astronaut":["🧑","person","gender-neutral","person","astronaut"],"firefighter":["🧑","person","gender-neutral","person","firefighter"],"people_holding_hands":["🤝","handshake","agreement","shake","people_holding_hands"],"person_with_probing_cane":["🧑","person","gender-neutral","person","person_with_probing_cane"],"red_haired_person":["🧑","person","gender-neutral","person","red_haired_person"],"curly_haired_person":["🧑","person","gender-neutral","person","curly_haired_person"],"bald_person":["🧑","person","gender-neutral","person","bald_person"],"white_haired_person":["🧑","person","gender-neutral","person","white_haired_person"],"person_in_motorized_wheelchair":["🧑","person","gender-neutral","person","person_in_motorized_wheelchair"],"person_in_manual_wheelchair":["🧑","person","gender-neutral","person","person_in_manual_wheelchair"],"health_worker":["🧑","person","gender-neutral","person","health_worker"],"judge":["🧑","person","gender-neutral","person","judge"],"pilot":["🧑","person","gender-neutral","person","pilot"],"adult":["🧑","person","gender-neutral","person","adult"],"child":["🧒","child","gender-neutral","young"],"older_adult":["🧓","older_person","human","elder","senior","gender-neutral","older_adult"],"bearded_person":["🧔","man_beard","person","bewhiskered","bearded_person"],"person_with_headscarf":["🧕","woman_with_headscarf","female","hijab","mantilla","tichel","person_with_headscarf"],"woman_in_steamy_room":["🧖","person_in_steamy_room","relax","spa","woman_in_steamy_room"],"man_in_steamy_room":["🧖","person_in_steamy_room","relax","spa","man_in_steamy_room"],"person_in_steamy_room":["🧖","person_in_steamy_room","relax","spa"],"woman_climbing":["🧗","person_climbing","sport","woman_climbing"],"man_climbing":["🧗","person_climbing","sport","man_climbing"],"person_climbing":["🧗","person_climbing","sport"],"woman_in_lotus_position":["🧘","person_in_lotus_position","meditate","woman_in_lotus_position"],"man_in_lotus_position":["🧘","person_in_lotus_position","meditate","man_in_lotus_position"],"person_in_lotus_position":["🧘","person_in_lotus_position","meditate"],"female_mage":["🧙","mage","magic","female_mage"],"male_mage":["🧙","mage","magic","male_mage"],"mage":["🧙","mage","magic"],"female_fairy":["🧚","fairy","wings","magical","female_fairy"],"male_fairy":["🧚","fairy","wings","magical","male_fairy"],"fairy":["🧚","fairy","wings","magical"],"female_vampire":["🧛","vampire","blood","twilight","female_vampire"],"male_vampire":["🧛","vampire","blood","twilight","male_vampire"],"vampire":["🧛","vampire","blood","twilight"],"mermaid":["🧜","merperson","sea","mermaid"],"merman":["🧜","merperson","sea","merman"],"merperson":["🧜","merperson","sea"],"female_elf":["🧝","elf","magical","female_elf"],"male_elf":["🧝","elf","magical","male_elf"],"elf":["🧝","elf","magical"],"female_genie":["🧞","genie","magical","wishes","female_genie"],"male_genie":["🧞","genie","magical","wishes","male_genie"],"genie":["🧞","genie","magical","wishes"],"female_zombie":["🧟","zombie","dead","female_zombie"],"male_zombie":["🧟","zombie","dead","male_zombie"],"zombie":["🧟","zombie","dead"],"brain":["🧠","brain","smart","intelligent"],"orange_heart":["🧡","orange_heart","love","like","affection","valentines"],"billed_cap":["🧢","billed_cap","cap","baseball"],"scarf":["🧣","scarf","neck","winter","clothes"],"gloves":["🧤","gloves","hands","winter","clothes"],"coat":["🧥","coat","jacket"],"socks":["🧦","socks","stockings","clothes"],"red_envelope":["🧧","red_envelope","gift"],"firecracker":["🧨","firecracker","dynamite","boom","explode","explosion","explosive"],"jigsaw":["🧩","puzzle_piece","interlocking","puzzle","piece","jigsaw"],"test_tube":["🧪","test_tube","chemistry","experiment","lab","science"],"petri_dish":["🧫","petri_dish","bacteria","biology","culture","lab"],"dna":["🧬","dna","biologist","genetics","life"],"compass":["🧭","compass","magnetic","navigation","orienteering"],"abacus":["🧮","abacus","calculation"],"fire_extinguisher":["🧯","fire_extinguisher","quench"],"toolbox":["🧰","toolbox","tools","diy","fix","maintainer","mechanic"],"bricks":["🧱","brick","bricks"],"magnet":["🧲","magnet","attraction","magnetic"],"luggage":["🧳","luggage","packing","travel"],"lotion_bottle":["🧴","lotion_bottle","moisturizer","sunscreen"],"thread":["🧵","thread","needle","sewing","spool","string"],"yarn":["🧶","yarn","ball","crochet","knit"],"safety_pin":["🧷","safety_pin","diaper"],"teddy_bear":["🧸","teddy_bear","plush","stuffed"],"broom":["🧹","broom","cleaning","sweeping","witch"],"basket":["🧺","basket","laundry"],"roll_of_paper":["🧻","roll_of_paper","roll"],"soap":["🧼","soap","bar","bathing","cleaning","lather"],"sponge":["🧽","sponge","absorbing","cleaning","porous"],"receipt":["🧾","receipt","accounting","expenses"],"nazar_amulet":["🧿","nazar_amulet","bead","charm"],"ballet_shoes":["🩰","ballet_shoes","dance"],"one-piece_swimsuit":["🩱","one_piece_swimsuit","fashion","one-piece_swimsuit"],"briefs":["🩲","briefs","clothing"],"shorts":["🩳","shorts","clothing"],"thong_sandal":["🩴","thong sandal","footwear","summer","thong_sandal"],"drop_of_blood":["🩸","drop_of_blood","period","hurt","harm","wound"],"adhesive_bandage":["🩹","adhesive_bandage","heal"],"stethoscope":["🩺","stethoscope","health"],"yo-yo":["🪀","yo_yo","toy","yo-yo"],"kite":["🪁","kite","wind","fly"],"parachute":["🪂","parachute","fly","glide"],"boomerang":["🪃","boomerang","weapon"],"magic_wand":["🪄","magic wand","supernature","power","magic_wand"],"pinata":["🪅","pinata","mexico","candy","celebration"],"nesting_dolls":["🪆","nesting dolls","matryoshka","toy","nesting_dolls"],"ringed_planet":["🪐","ringed_planet","outerspace"],"chair":["🪑","chair","sit","furniture"],"razor":["🪒","razor","cut"],"axe":["🪓","axe","tool","chop","cut"],"diya_lamp":["🪔","diya_lamp","lighting"],"banjo":["🪕","banjo","music","instructment"],"military_helmet":["🪖","military helmet","army","protection","military_helmet"],"accordion":["🪗","accordion","music"],"long_drum":["🪘","long drum","music","long_drum"],"coin":["🪙","coin","money","currency"],"carpentry_saw":["🪚","carpentry saw","cut","chop","carpentry_saw"],"screwdriver":["🪛","screwdriver","tools"],"ladder":["🪜","ladder","tools"],"hook":["🪝","hook","tools"],"mirror":["🪞","mirror","reflection"],"window":["🪟","window","scenery"],"plunger":["🪠","plunger","toilet"],"sewing_needle":["🪡","sewing needle","stitches","sewing_needle"],"knot":["🪢","knot","rope","scout"],"bucket":["🪣","bucket","water","container"],"mouse_trap":["🪤","mouse trap","cheese","mouse_trap"],"toothbrush":["🪥","toothbrush","hygiene","dental"],"headstone":["🪦","headstone","death","rip","grave"],"placard":["🪧","placard","announcement"],"rock":["🪨","rock","stone"],"fly":["🪰","fly","insect"],"worm":["🪱","worm","animal"],"beetle":["🪲","beetle","insect"],"cockroach":["🪳","cockroach","insect","pests"],"potted_plant":["🪴","potted plant","greenery","house","potted_plant"],"wood":["🪵","wood","nature","timber","trunk"],"feather":["🪶","feather","bird","fly"],"anatomical_heart":["🫀","anatomical heart","health","heartbeat","anatomical_heart"],"lungs":["🫁","lungs","breathe"],"people_hugging":["🫂","people hugging","care","people_hugging"],"blueberries":["🫐","blueberries","fruit"],"bell_pepper":["🫑","bell pepper","fruit","plant","bell_pepper"],"olive":["🫒","olive","fruit"],"flatbread":["🫓","flatbread","flour","food"],"tamale":["🫔","tamale","food","masa"],"fondue":["🫕","fondue","cheese","pot","food"],"teapot":["🫖","teapot","drink","hot"],"bangbang":["‼️","double_exclamation_mark","exclamation","surprise","bangbang"],"interrobang":["⁉️","exclamation_question_mark","wat","punctuation","surprise","interrobang"],"tm":["™️","trade_mark","trademark","brand","law","legal","tm"],"information_source":["ℹ️","information","blue-square","alphabet","letter","information_source"],"left_right_arrow":["↔️","left_right_arrow","shape","direction","horizontal","sideways"],"arrow_up_down":["↕️","up_down_arrow","blue-square","direction","way","vertical","arrow_up_down"],"arrow_upper_left":["↖️","up_left_arrow","blue-square","point","direction","diagonal","northwest","arrow_upper_left"],"arrow_upper_right":["↗️","up_right_arrow","blue-square","point","direction","diagonal","northeast","arrow_upper_right"],"arrow_lower_right":["↘️","down_right_arrow","blue-square","direction","diagonal","southeast","arrow_lower_right"],"arrow_lower_left":["↙️","down_left_arrow","blue-square","direction","diagonal","southwest","arrow_lower_left"],"leftwards_arrow_with_hook":["↩️","right_arrow_curving_left","back","return","blue-square","undo","enter","leftwards_arrow_with_hook"],"arrow_right_hook":["↪️","left_arrow_curving_right","blue-square","return","rotate","direction","arrow_right_hook"],"watch":["⌚","watch","time","accessories"],"hourglass":["⌛","hourglass_done","time","clock","oldschool","limit","exam","quiz","test","hourglass"],"keyboard":["⌨️","keyboard","technology","computer","type","input","text"],"eject":["⏏️","eject_button","blue-square","eject"],"fast_forward":["⏩","fast_forward_button","blue-square","play","speed","continue","fast_forward"],"rewind":["⏪","fast_reverse_button","play","blue-square","rewind"],"arrow_double_up":["⏫","fast_up_button","blue-square","direction","top","arrow_double_up"],"arrow_double_down":["⏬","fast_down_button","blue-square","direction","bottom","arrow_double_down"],"black_right_pointing_double_triangle_with_vertical_bar":["⏭️","next_track_button","forward","next","blue-square","black_right_pointing_double_triangle_with_vertical_bar"],"black_left_pointing_double_triangle_with_vertical_bar":["⏮️","last_track_button","backward","black_left_pointing_double_triangle_with_vertical_bar"],"black_right_pointing_triangle_with_double_vertical_bar":["⏯️","play_or_pause_button","blue-square","play","pause","black_right_pointing_triangle_with_double_vertical_bar"],"alarm_clock":["⏰","alarm_clock","time","wake"],"stopwatch":["⏱️","stopwatch","time","deadline"],"timer_clock":["⏲️","timer_clock","alarm"],"hourglass_flowing_sand":["⏳","hourglass_not_done","oldschool","time","countdown","hourglass_flowing_sand"],"double_vertical_bar":["⏸️","pause_button","pause","blue-square","double_vertical_bar"],"black_square_for_stop":["⏹️","stop_button","blue-square","black_square_for_stop"],"black_circle_for_record":["⏺️","record_button","blue-square","black_circle_for_record"],"m":["Ⓜ️","circled_m","alphabet","blue-circle","letter","m"],"black_small_square":["▪️","black_small_square","shape","icon"],"white_small_square":["▫️","white_small_square","shape","icon"],"arrow_forward":["▶️","play_button","blue-square","right","direction","play","arrow_forward"],"arrow_backward":["◀️","reverse_button","blue-square","left","direction","arrow_backward"],"white_medium_square":["◻️","white_medium_square","shape","stone","icon"],"black_medium_square":["◼️","black_medium_square","shape","button","icon"],"white_medium_small_square":["◽","white_medium_small_square","shape","stone","icon","button"],"black_medium_small_square":["◾","black_medium_small_square","icon","shape","button"],"sunny":["☀️","sun","weather","nature","brightness","summer","beach","spring","sunny"],"cloud":["☁️","cloud","weather","sky"],"umbrella":["☂️","umbrella","weather","spring"],"snowman":["☃️","snowman","winter","season","cold","weather","christmas","xmas","frozen"],"comet":["☄️","comet","space"],"phone":["☎️","telephone","technology","communication","dial","telephone","phone"],"ballot_box_with_check":["☑️","check_box_with_check","ok","agree","confirm","black-square","vote","election","yes","tick","ballot_box_with_check"],"umbrella_with_rain_drops":["☔","umbrella_with_rain_drops","rainy","weather","spring"],"coffee":["☕","hot_beverage","beverage","caffeine","latte","espresso","coffee"],"shamrock":["☘️","shamrock","vegetable","plant","nature","irish","clover"],"point_up":["☝️","index_pointing_up","hand","fingers","direction","up","point_up"],"skull_and_crossbones":["☠️","skull_and_crossbones","poison","danger","deadly","scary","death","pirate","evil"],"radioactive_sign":["☢️","radioactive","nuclear","danger","radioactive_sign"],"biohazard_sign":["☣️","biohazard","danger","biohazard_sign"],"orthodox_cross":["☦️","orthodox_cross","suppedaneum","religion"],"star_and_crescent":["☪️","star_and_crescent","islam"],"peace_symbol":["☮️","peace_symbol","hippie"],"yin_yang":["☯️","yin_yang","balance"],"wheel_of_dharma":["☸️","wheel_of_dharma","hinduism","buddhism","sikhism","jainism"],"white_frowning_face":["☹️","frowning_face","face","sad","upset","frown","white_frowning_face"],"relaxed":["☺️","smiling_face","face","blush","massage","happiness","relaxed"],"female_sign":["♀️","female_sign","woman","women","lady","girl"],"male_sign":["♂️","male_sign","man","boy","men"],"aries":["♈","aries","sign","purple-square","zodiac","astrology"],"taurus":["♉","taurus","purple-square","sign","zodiac","astrology"],"gemini":["♊","gemini","sign","zodiac","purple-square","astrology"],"cancer":["♋","cancer","sign","zodiac","purple-square","astrology"],"leo":["♌","leo","sign","purple-square","zodiac","astrology"],"virgo":["♍","virgo","sign","zodiac","purple-square","astrology"],"libra":["♎","libra","sign","purple-square","zodiac","astrology"],"scorpius":["♏","scorpio","sign","zodiac","purple-square","astrology","scorpio","scorpius"],"sagittarius":["♐","sagittarius","sign","zodiac","purple-square","astrology"],"capricorn":["♑","capricorn","sign","zodiac","purple-square","astrology"],"aquarius":["♒","aquarius","sign","purple-square","zodiac","astrology"],"pisces":["♓","pisces","purple-square","sign","zodiac","astrology"],"chess_pawn":["♟️","chess_pawn","expendable"],"spades":["♠️","spade_suit","poker","cards","suits","magic","spades"],"clubs":["♣️","club_suit","poker","cards","magic","suits","clubs"],"hearts":["♥️","heart_suit","poker","cards","magic","suits","hearts"],"diamonds":["♦️","diamond_suit","poker","cards","magic","suits","diamonds"],"hotsprings":["♨️","hot_springs","bath","warm","relax","hotsprings"],"recycle":["♻️","recycling_symbol","arrow","environment","garbage","trash","recycle"],"infinity":["♾️","infinity","forever"],"wheelchair":["♿","wheelchair_symbol","blue-square","disabled","accessibility","wheelchair"],"hammer_and_pick":["⚒️","hammer_and_pick","tools","build","create"],"anchor":["⚓","anchor","ship","ferry","sea","boat"],"crossed_swords":["⚔️","crossed_swords","weapon"],"medical_symbol":["⚕️","medical_symbol","health","hospital","staff_of_aesculapius"],"scales":["⚖️","balance_scale","law","fairness","weight","scales"],"alembic":["⚗️","alembic","distilling","science","experiment","chemistry"],"gear":["⚙️","gear","cog"],"atom_symbol":["⚛️","atom_symbol","science","physics","chemistry"],"fleur_de_lis":["⚜️","fleur_de_lis","decorative","scout"],"warning":["⚠️","warning","exclamation","wip","alert","error","problem","issue"],"zap":["⚡","high_voltage","thunder","weather","lightning bolt","fast","zap"],"transgender_symbol":["⚧️","transgender symbol","lgbtq","transgender_symbol"],"white_circle":["⚪","white_circle","shape","round"],"black_circle":["⚫","black_circle","shape","button","round"],"coffin":["⚰️","coffin","vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],"funeral_urn":["⚱️","funeral_urn","dead","die","death","rip","ashes"],"soccer":["⚽","soccer_ball","sports","football","soccer"],"baseball":["⚾","baseball","sports","balls"],"snowman_without_snow":["⛄","snowman_without_snow","winter","season","cold","weather","christmas","xmas","frozen","without_snow"],"partly_sunny":["⛅","sun_behind_cloud","weather","nature","cloudy","morning","fall","spring","partly_sunny"],"thunder_cloud_and_rain":["⛈️","cloud_with_lightning_and_rain","weather","lightning","thunder_cloud_and_rain"],"ophiuchus":["⛎","ophiuchus","sign","purple-square","constellation","astrology"],"pick":["⛏️","pick","tools","dig"],"helmet_with_white_cross":["⛑️","rescue_worker_s_helmet","construction","build","helmet_with_white_cross"],"chains":["⛓️","chains","lock","arrest"],"no_entry":["⛔","no_entry","limit","security","privacy","bad","denied","stop","circle"],"shinto_shrine":["⛩️","shinto_shrine","temple","japan","kyoto"],"church":["⛪","church","building","religion","christ"],"mountain":["⛰️","mountain","photo","nature","environment"],"umbrella_on_ground":["⛱️","umbrella_on_ground","weather","summer"],"fountain":["⛲","fountain","photo","summer","water","fresh"],"golf":["⛳","flag_in_hole","sports","business","flag","hole","summer","golf"],"ferry":["⛴️","ferry","boat","ship","yacht"],"boat":["⛵","sailboat","ship","summer","transportation","water","sailing","boat"],"skier":["⛷️","skier","sports","winter","snow"],"ice_skate":["⛸️","ice_skate","sports"],"woman-bouncing-ball":["⛹️","person_bouncing_ball","sports","human","woman-bouncing-ball"],"man-bouncing-ball":["⛹️","person_bouncing_ball","sports","human","man-bouncing-ball"],"person_with_ball":["⛹️","person_bouncing_ball","sports","human","person_with_ball"],"tent":["⛺","tent","photo","camping","outdoors"],"fuelpump":["⛽","fuel_pump","gas station","petroleum","fuelpump"],"scissors":["✂️","scissors","stationery","cut"],"white_check_mark":["✅","check_mark_button","green-square","ok","agree","vote","election","answer","tick","white_check_mark"],"airplane":["✈️","airplane","vehicle","transportation","flight","fly"],"email":["✉️","envelope","letter","postal","inbox","communication","email"],"fist":["✊","raised_fist","fingers","hand","grasp","fist"],"hand":["✋","raised_hand","fingers","stop","highfive","palm","ban","hand"],"v":["✌️","victory_hand","fingers","ohyeah","hand","peace","victory","two","v"],"writing_hand":["✍️","writing_hand","lower_left_ballpoint_pen","stationery","write","compose"],"pencil2":["✏️","pencil","stationery","write","paper","writing","school","study","pencil2"],"black_nib":["✒️","black_nib","pen","stationery","writing","write"],"heavy_check_mark":["✔️","check_mark","ok","nike","answer","yes","tick","heavy_check_mark"],"heavy_multiplication_x":["✖️","multiplication_sign","math","calculation","heavy_multiplication_x"],"latin_cross":["✝️","latin_cross","christianity"],"star_of_david":["✡️","star_of_david","judaism"],"sparkles":["✨","sparkles","stars","shine","shiny","cool","awesome","good","magic"],"eight_spoked_asterisk":["✳️","eight_spoked_asterisk","star","sparkle","green-square"],"eight_pointed_black_star":["✴️","eight_pointed_star","orange-square","shape","polygon","eight_pointed_black_star"],"snowflake":["❄️","snowflake","winter","season","cold","weather","christmas","xmas"],"sparkle":["❇️","sparkle","stars","green-square","awesome","good","fireworks"],"x":["❌","cross_mark","no","delete","remove","cancel","red","x"],"negative_squared_cross_mark":["❎","cross_mark_button","x","green-square","no","deny","negative_squared_cross_mark"],"question":["❓","question_mark","doubt","confused","question"],"grey_question":["❔","white_question_mark","doubts","gray","huh","confused","grey_question"],"grey_exclamation":["❕","white_exclamation_mark","surprise","punctuation","gray","wow","warning","grey_exclamation"],"exclamation":["❗","exclamation_mark","heavy_exclamation_mark","danger","surprise","punctuation","wow","warning","exclamation"],"heavy_heart_exclamation_mark_ornament":["❣️","heart_exclamation","decoration","love","heavy_heart_exclamation_mark_ornament"],"heart":["❤️","red_heart","love","like","valentines","heart"],"heavy_plus_sign":["➕","plus_sign","math","calculation","addition","more","increase","heavy_plus_sign"],"heavy_minus_sign":["➖","minus_sign","math","calculation","subtract","less","heavy_minus_sign"],"heavy_division_sign":["➗","division_sign","divide","math","calculation","heavy_division_sign"],"arrow_right":["➡️","right_arrow","blue-square","next","arrow_right"],"curly_loop":["➰","curly_loop","scribble","draw","shape","squiggle"],"loop":["➿","double_curly_loop","tape","cassette","loop"],"arrow_heading_up":["⤴️","right_arrow_curving_up","blue-square","direction","top","arrow_heading_up"],"arrow_heading_down":["⤵️","right_arrow_curving_down","blue-square","direction","bottom","arrow_heading_down"],"arrow_left":["⬅️","left_arrow","blue-square","previous","back","arrow_left"],"arrow_up":["⬆️","up_arrow","blue-square","continue","top","direction","arrow_up"],"arrow_down":["⬇️","down_arrow","blue-square","direction","bottom","arrow_down"],"black_large_square":["⬛","black_large_square","shape","icon","button"],"white_large_square":["⬜","white_large_square","shape","icon","stone","button"],"star":["⭐","star","night","yellow"],"o":["⭕","hollow_red_circle","circle","round","o"],"wavy_dash":["〰️","wavy_dash","draw","line","moustache","mustache","squiggle","scribble"],"part_alternation_mark":["〽️","part_alternation_mark","graph","presentation","stats","business","economics","bad"],"congratulations":["㊗️","japanese_congratulations_button","chinese","kanji","japanese","red-circle","congratulations"],"secret":["㊙️","japanese_secret_button","privacy","chinese","sshh","kanji","red-circle","secret"]}} ================================================ FILE: client/public/index.html ================================================ n.eko

A self hosted virtual browser (m1k1o/neko) that runs in docker.

================================================ FILE: client/public/keyboard_layouts.json ================================================ {"af":"Afghani","al":"Albanian","et":"Amharic","ma":"Arabic (Morocco)","sy":"Arabic (Syria)","am":"Armenian","az":"Azerbaijani","ml":"Bambara","bd":"Bangla","by":"Belarusian","be":"Belgian","dz":"Berber (Algeria, Latin characters)","ba":"Bosnian","bg":"Bulgarian","mm":"Burmese","hr":"Croatian","cz":"Czech","dk":"Danish","mv":"Dhivehi","nl":"Dutch","bt":"Dzongkha","au":"English (Australian)","cm":"English (Cameroon)","gh":"English (Ghana)","ng":"English (Nigeria)","za":"English (South Africa)","us":"English (US)","gb":"English (UK)","ee":"Estonian","fo":"Faroese","ph":"Filipino","fi":"Finnish","fr":"French","ca":"French (Canada)","cd":"French (Democratic Republic of the Congo)","gn":"French (Guinea)","tg":"French (Togo)","ge":"Georgian","de":"German","at":"German (Austria)","ch":"German (Switzerland)","gr":"Greek","il":"Hebrew","hu":"Hungarian","cn":"Chinese","is":"Icelandic","in":"Indian","id":"Indonesian (Jawi)","iq":"Iraqi","ie":"Irish","it":"Italian","jp":"Japanese","kz":"Kazakh","kh":"Khmer (Cambodia)","kr":"Korean","kg":"Kyrgyz","la":"Lao","lv":"Latvian","lt":"Lithuanian","mk":"Macedonian","my":"Malay (Jawi)","mt":"Maltese","md":"Moldavian","mn":"Mongolian","me":"Montenegrin","np":"Nepali","no":"Norwegian","ir":"Persian","pl":"Polish","pt":"Portuguese","br":"Portuguese (Brazil)","ro":"Romanian","ru":"Russian","rs":"Serbian","lk":"Sinhala (phonetic)","sk":"Slovak","si":"Slovenian","es":"Spanish","ke":"Swahili (Kenya)","tz":"Swahili (Tanzania)","se":"Swedish","tw":"Taiwanese","tj":"Tajik","th":"Thai","bw":"Tswana","tr":"Turkish","tm":"Turkmen","ua":"Ukrainian","pk":"Urdu (Pakistan)","uz":"Uzbek","vn":"Vietnamese","sn":"Wolof"} ================================================ FILE: client/public/site.webmanifest ================================================ { "name": "n.eko", "short_name": "n.eko", "icons": [ { "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } ], "theme_color": "#19bd9c", "background_color": "#19bd9c", "display": "standalone" } ================================================ FILE: client/src/app.vue ================================================ ================================================ FILE: client/src/assets/styles/_reset.scss ================================================ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font: inherit; font-size: 100%; vertical-align: baseline; } /* make sure to set some focus styles for accessibility */ :focus { outline: 0; } /* HTML5 display-role reset for older browsers */ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } table { border-collapse: collapse; border-spacing: 0; } input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration, input[type=search]::-webkit-search-results-button, input[type=search]::-webkit-search-results-decoration { -webkit-appearance: none; -moz-appearance: none; } input[type=search] { -webkit-appearance: none; -moz-appearance: none; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } textarea { overflow: auto; vertical-align: top; resize: vertical; } /** * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. */ audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; max-width: 100%; } /** * Prevent modern browsers from displaying `audio` without controls. * Remove excess height in iOS 5 devices. */ audio:not([controls]) { display: none; height: 0; } /** * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. * Known issue: no IE 6 support. */ [hidden] { display: none; } /** * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using * `em` units. * 2. Prevent iOS text size adjust after orientation change, without disabling * user zoom. */ html { font-size: 100%; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ -ms-text-size-adjust: 100%; /* 2 */ } /** * Address `outline` inconsistency between Chrome and other browsers. */ a:focus { outline: none; } /** * Improve readability when focused and also mouse hovered in all browsers. */ a:active, a:hover { outline: 0; } /** * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. * 2. Improve image quality when scaled in IE 7. */ img { border: 0; /* 1 */ -ms-interpolation-mode: bicubic; /* 2 */ } /** * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. */ figure { margin: 0; } /** * Correct margin displayed oddly in IE 6/7. */ form { margin: 0; } /** * Define consistent border, margin, and padding. */ fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } /** * 1. Correct color not being inherited in IE 6/7/8/9. * 2. Correct text not wrapping in Firefox 3. * 3. Correct alignment displayed oddly in IE 6/7. */ legend { border: 0; /* 1 */ padding: 0; white-space: normal; /* 2 */ *margin-left: -7px; /* 3 */ } /** * 1. Correct font size not being inherited in all browsers. * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, * and Chrome. * 3. Improve appearance and consistency in all browsers. */ button, input, select, textarea { font-size: 100%; /* 1 */ margin: 0; /* 2 */ vertical-align: baseline; /* 3 */ *vertical-align: middle; /* 3 */ } /** * Address Firefox 3+ setting `line-height` on `input` using `!important` in * the UA stylesheet. */ button, input { line-height: normal; } /** * Address inconsistent `text-transform` inheritance for `button` and `select`. * All other form control elements do not inherit `text-transform` values. * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. * Correct `select` style inheritance in Firefox 4+ and Opera. */ button, select { text-transform: none; } /** * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` * and `video` controls. * 2. Correct inability to style clickable `input` types in iOS. * 3. Improve usability and consistency of cursor style between image-type * `input` and others. * 4. Remove inner spacing in IE 7 without affecting normal text inputs. * Known issue: inner spacing remains in IE 6. */ button, html input[type="button"], /* 1 */ input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ *overflow: visible; /* 4 */ } /** * Re-set default cursor for disabled elements. */ button[disabled], html input[disabled] { cursor: default; } /** * 1. Address box sizing set to content-box in IE 8/9. * 2. Remove excess padding in IE 8/9. * 3. Remove excess padding in IE 7. * Known issue: excess padding remains in IE 6. */ input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ *height: 13px; /* 3 */ *width: 13px; /* 3 */ } /** * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome * (include `-moz` to future-proof). */ input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } /** * Remove inner padding and search cancel button in Safari 5 and Chrome * on OS X. */ input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } /** * Remove inner padding and border in Firefox 3+. */ button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } /** * 1. Remove default vertical scrollbar in IE 6/7/8/9. * 2. Improve readability and alignment in all browsers. */ textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ } /** * Remove most spacing between table cells. */ table { border-collapse: collapse; border-spacing: 0; } html, button, input, select, textarea { color: #222; } ::-moz-selection { text-shadow: none; } ::selection { text-shadow: none; } img { vertical-align: middle; } fieldset { border: 0; margin: 0; padding: 0; } textarea { resize: vertical; } .chromeframe { margin: 0.2em 0; background: #ccc; color: #000; padding: 0.2em 0; } ================================================ FILE: client/src/assets/styles/_variables.scss ================================================ $text-family: Whitney, Helvetica Neue, Helvetica, Arial, sans-serif;; $text-size: 14px; $text-normal: #dcddde; $text-muted: #72767d; $text-link: #00b0f4; $interactive-normal: #b9bbbe; $interactive-hover: #dcddde; $interactive-muted: #4f545c; $background-primary: #36393f; $background-secondary: #2f3136; $background-tertiary: #202225; $background-accent: #4f545c; $background-floating: #18191c; $background-modifier-hover: rgba(79, 84, 92, 0.16); $background-modifier-active: rgba(79, 84, 92, 0.24); $background-modifier-selected: rgba(79, 84, 92, 0.32); $background-modifier-accent: hsla(0, 0%, 100%, 0.06); $elevation-low: 0 1px 0 rgba(4, 4, 5, 0.2), 0 1.5px 0 rgba(6, 6, 7, 0.05), 0 2px 0 rgba(4, 4, 5, 0.05); $elevation-high: 0 8px 16px rgba(0, 0, 0, 0.24); $style-primary: #19bd9c; $style-error: #d32f2f; $menu-height: 40px; $controls-height: 125px; $side-width: 400px; ================================================ FILE: client/src/assets/styles/main.scss ================================================ @charset "utf-8"; // Import variables @import "variables"; // Reset CSS @import "reset"; // Import Vendor @import "vendor/font-awesome"; @import "vendor/font-whitney"; @import "vendor/swal"; @import "vendor/tooltip"; @import "vendor/github"; @import "vendor/emoji"; @import "vendor/emote"; html, body { -webkit-font-smoothing: subpixel-antialiased; background-color: $background-tertiary; font-family: $text-family; font-size: $text-size; color: $text-normal; overflow: hidden; width: 100vw; height: 100vh; min-width: 320px; } ================================================ FILE: client/src/assets/styles/vendor/_emoji.scss ================================================ .emoji { display: inline-block; background-size: 5800%; background-image: url('~emoji-datasource/img/twitter/sheets/32.png'); background-repeat: no-repeat; vertical-align: bottom; height: 22px; width: 22px; &[data-emoji='neko'] { background-size: contain; background-image: url('../images/emoji/neko.png'); } &[data-emoji='hash'] { background-position: 0% 0% } &[data-emoji='keycap_star'] { background-position: 0% 1.7543859649122806% } &[data-emoji='zero'] { background-position: 0% 3.508771929824561% } &[data-emoji='one'] { background-position: 0% 5.263157894736842% } &[data-emoji='two'] { background-position: 0% 7.017543859649122% } &[data-emoji='three'] { background-position: 0% 8.771929824561402% } &[data-emoji='four'] { background-position: 0% 10.526315789473683% } &[data-emoji='five'] { background-position: 0% 12.280701754385964% } &[data-emoji='six'] { background-position: 0% 14.035087719298245% } &[data-emoji='seven'] { background-position: 0% 15.789473684210526% } &[data-emoji='eight'] { background-position: 0% 17.543859649122805% } &[data-emoji='nine'] { background-position: 0% 19.298245614035086% } &[data-emoji='copyright'] { background-position: 0% 21.052631578947366% } &[data-emoji='registered'] { background-position: 0% 22.807017543859647% } &[data-emoji='mahjong'] { background-position: 0% 24.561403508771928% } &[data-emoji='black_joker'] { background-position: 0% 26.31578947368421% } &[data-emoji='a'] { background-position: 0% 28.07017543859649% } &[data-emoji='b'] { background-position: 0% 29.82456140350877% } &[data-emoji='o2'] { background-position: 0% 31.57894736842105% } &[data-emoji='parking'] { background-position: 0% 33.33333333333333% } &[data-emoji='ab'] { background-position: 0% 35.08771929824561% } &[data-emoji='cl'] { background-position: 0% 36.84210526315789% } &[data-emoji='cool'] { background-position: 0% 38.59649122807017% } &[data-emoji='free'] { background-position: 0% 40.35087719298245% } &[data-emoji='id'] { background-position: 0% 42.10526315789473% } &[data-emoji='new'] { background-position: 0% 43.859649122807014% } &[data-emoji='ng'] { background-position: 0% 45.614035087719294% } &[data-emoji='ok'] { background-position: 0% 47.368421052631575% } &[data-emoji='sos'] { background-position: 0% 49.122807017543856% } &[data-emoji='up'] { background-position: 0% 50.87719298245614% } &[data-emoji='vs'] { background-position: 0% 52.63157894736842% } &[data-emoji='flag-ac'] { background-position: 0% 54.3859649122807% } &[data-emoji='flag-ad'] { background-position: 0% 56.14035087719298% } &[data-emoji='flag-ae'] { background-position: 0% 57.89473684210526% } &[data-emoji='flag-af'] { background-position: 0% 59.64912280701754% } &[data-emoji='flag-ag'] { background-position: 0% 61.40350877192982% } &[data-emoji='flag-ai'] { background-position: 0% 63.1578947368421% } &[data-emoji='flag-al'] { background-position: 0% 64.91228070175438% } &[data-emoji='flag-am'] { background-position: 0% 66.66666666666666% } &[data-emoji='flag-ao'] { background-position: 0% 68.42105263157895% } &[data-emoji='flag-aq'] { background-position: 0% 70.17543859649122% } &[data-emoji='flag-ar'] { background-position: 0% 71.9298245614035% } &[data-emoji='flag-as'] { background-position: 0% 73.68421052631578% } &[data-emoji='flag-at'] { background-position: 0% 75.43859649122807% } &[data-emoji='flag-au'] { background-position: 0% 77.19298245614034% } &[data-emoji='flag-aw'] { background-position: 0% 78.94736842105263% } &[data-emoji='flag-ax'] { background-position: 0% 80.7017543859649% } &[data-emoji='flag-az'] { background-position: 0% 82.45614035087719% } &[data-emoji='flag-ba'] { background-position: 0% 84.21052631578947% } &[data-emoji='flag-bb'] { background-position: 0% 85.96491228070175% } &[data-emoji='flag-bd'] { background-position: 0% 87.71929824561403% } &[data-emoji='flag-be'] { background-position: 0% 89.47368421052632% } &[data-emoji='flag-bf'] { background-position: 0% 91.22807017543859% } &[data-emoji='flag-bg'] { background-position: 0% 92.98245614035088% } &[data-emoji='flag-bh'] { background-position: 0% 94.73684210526315% } &[data-emoji='flag-bi'] { background-position: 0% 96.49122807017544% } &[data-emoji='flag-bj'] { background-position: 0% 98.24561403508771% } &[data-emoji='flag-bl'] { background-position: 0% 100% } &[data-emoji='flag-bm'] { background-position: 1.7543859649122806% 0% } &[data-emoji='flag-bn'] { background-position: 1.7543859649122806% 1.7543859649122806% } &[data-emoji='flag-bo'] { background-position: 1.7543859649122806% 3.508771929824561% } &[data-emoji='flag-bq'] { background-position: 1.7543859649122806% 5.263157894736842% } &[data-emoji='flag-br'] { background-position: 1.7543859649122806% 7.017543859649122% } &[data-emoji='flag-bs'] { background-position: 1.7543859649122806% 8.771929824561402% } &[data-emoji='flag-bt'] { background-position: 1.7543859649122806% 10.526315789473683% } &[data-emoji='flag-bv'] { background-position: 1.7543859649122806% 12.280701754385964% } &[data-emoji='flag-bw'] { background-position: 1.7543859649122806% 14.035087719298245% } &[data-emoji='flag-by'] { background-position: 1.7543859649122806% 15.789473684210526% } &[data-emoji='flag-bz'] { background-position: 1.7543859649122806% 17.543859649122805% } &[data-emoji='flag-ca'] { background-position: 1.7543859649122806% 19.298245614035086% } &[data-emoji='flag-cc'] { background-position: 1.7543859649122806% 21.052631578947366% } &[data-emoji='flag-cd'] { background-position: 1.7543859649122806% 22.807017543859647% } &[data-emoji='flag-cf'] { background-position: 1.7543859649122806% 24.561403508771928% } &[data-emoji='flag-cg'] { background-position: 1.7543859649122806% 26.31578947368421% } &[data-emoji='flag-ch'] { background-position: 1.7543859649122806% 28.07017543859649% } &[data-emoji='flag-ci'] { background-position: 1.7543859649122806% 29.82456140350877% } &[data-emoji='flag-ck'] { background-position: 1.7543859649122806% 31.57894736842105% } &[data-emoji='flag-cl'] { background-position: 1.7543859649122806% 33.33333333333333% } &[data-emoji='flag-cm'] { background-position: 1.7543859649122806% 35.08771929824561% } &[data-emoji='cn'] { background-position: 1.7543859649122806% 36.84210526315789% } &[data-emoji='flag-co'] { background-position: 1.7543859649122806% 38.59649122807017% } &[data-emoji='flag-cp'] { background-position: 1.7543859649122806% 40.35087719298245% } &[data-emoji='flag-cr'] { background-position: 1.7543859649122806% 42.10526315789473% } &[data-emoji='flag-cu'] { background-position: 1.7543859649122806% 43.859649122807014% } &[data-emoji='flag-cv'] { background-position: 1.7543859649122806% 45.614035087719294% } &[data-emoji='flag-cw'] { background-position: 1.7543859649122806% 47.368421052631575% } &[data-emoji='flag-cx'] { background-position: 1.7543859649122806% 49.122807017543856% } &[data-emoji='flag-cy'] { background-position: 1.7543859649122806% 50.87719298245614% } &[data-emoji='flag-cz'] { background-position: 1.7543859649122806% 52.63157894736842% } &[data-emoji='de'] { background-position: 1.7543859649122806% 54.3859649122807% } &[data-emoji='flag-dg'] { background-position: 1.7543859649122806% 56.14035087719298% } &[data-emoji='flag-dj'] { background-position: 1.7543859649122806% 57.89473684210526% } &[data-emoji='flag-dk'] { background-position: 1.7543859649122806% 59.64912280701754% } &[data-emoji='flag-dm'] { background-position: 1.7543859649122806% 61.40350877192982% } &[data-emoji='flag-do'] { background-position: 1.7543859649122806% 63.1578947368421% } &[data-emoji='flag-dz'] { background-position: 1.7543859649122806% 64.91228070175438% } &[data-emoji='flag-ea'] { background-position: 1.7543859649122806% 66.66666666666666% } &[data-emoji='flag-ec'] { background-position: 1.7543859649122806% 68.42105263157895% } &[data-emoji='flag-ee'] { background-position: 1.7543859649122806% 70.17543859649122% } &[data-emoji='flag-eg'] { background-position: 1.7543859649122806% 71.9298245614035% } &[data-emoji='flag-eh'] { background-position: 1.7543859649122806% 73.68421052631578% } &[data-emoji='flag-er'] { background-position: 1.7543859649122806% 75.43859649122807% } &[data-emoji='es'] { background-position: 1.7543859649122806% 77.19298245614034% } &[data-emoji='flag-et'] { background-position: 1.7543859649122806% 78.94736842105263% } &[data-emoji='flag-eu'] { background-position: 1.7543859649122806% 80.7017543859649% } &[data-emoji='flag-fi'] { background-position: 1.7543859649122806% 82.45614035087719% } &[data-emoji='flag-fj'] { background-position: 1.7543859649122806% 84.21052631578947% } &[data-emoji='flag-fk'] { background-position: 1.7543859649122806% 85.96491228070175% } &[data-emoji='flag-fm'] { background-position: 1.7543859649122806% 87.71929824561403% } &[data-emoji='flag-fo'] { background-position: 1.7543859649122806% 89.47368421052632% } &[data-emoji='fr'] { background-position: 1.7543859649122806% 91.22807017543859% } &[data-emoji='flag-ga'] { background-position: 1.7543859649122806% 92.98245614035088% } &[data-emoji='gb'] { background-position: 1.7543859649122806% 94.73684210526315% } &[data-emoji='flag-gd'] { background-position: 1.7543859649122806% 96.49122807017544% } &[data-emoji='flag-ge'] { background-position: 1.7543859649122806% 98.24561403508771% } &[data-emoji='flag-gf'] { background-position: 1.7543859649122806% 100% } &[data-emoji='flag-gg'] { background-position: 3.508771929824561% 0% } &[data-emoji='flag-gh'] { background-position: 3.508771929824561% 1.7543859649122806% } &[data-emoji='flag-gi'] { background-position: 3.508771929824561% 3.508771929824561% } &[data-emoji='flag-gl'] { background-position: 3.508771929824561% 5.263157894736842% } &[data-emoji='flag-gm'] { background-position: 3.508771929824561% 7.017543859649122% } &[data-emoji='flag-gn'] { background-position: 3.508771929824561% 8.771929824561402% } &[data-emoji='flag-gp'] { background-position: 3.508771929824561% 10.526315789473683% } &[data-emoji='flag-gq'] { background-position: 3.508771929824561% 12.280701754385964% } &[data-emoji='flag-gr'] { background-position: 3.508771929824561% 14.035087719298245% } &[data-emoji='flag-gs'] { background-position: 3.508771929824561% 15.789473684210526% } &[data-emoji='flag-gt'] { background-position: 3.508771929824561% 17.543859649122805% } &[data-emoji='flag-gu'] { background-position: 3.508771929824561% 19.298245614035086% } &[data-emoji='flag-gw'] { background-position: 3.508771929824561% 21.052631578947366% } &[data-emoji='flag-gy'] { background-position: 3.508771929824561% 22.807017543859647% } &[data-emoji='flag-hk'] { background-position: 3.508771929824561% 24.561403508771928% } &[data-emoji='flag-hm'] { background-position: 3.508771929824561% 26.31578947368421% } &[data-emoji='flag-hn'] { background-position: 3.508771929824561% 28.07017543859649% } &[data-emoji='flag-hr'] { background-position: 3.508771929824561% 29.82456140350877% } &[data-emoji='flag-ht'] { background-position: 3.508771929824561% 31.57894736842105% } &[data-emoji='flag-hu'] { background-position: 3.508771929824561% 33.33333333333333% } &[data-emoji='flag-ic'] { background-position: 3.508771929824561% 35.08771929824561% } &[data-emoji='flag-id'] { background-position: 3.508771929824561% 36.84210526315789% } &[data-emoji='flag-ie'] { background-position: 3.508771929824561% 38.59649122807017% } &[data-emoji='flag-il'] { background-position: 3.508771929824561% 40.35087719298245% } &[data-emoji='flag-im'] { background-position: 3.508771929824561% 42.10526315789473% } &[data-emoji='flag-in'] { background-position: 3.508771929824561% 43.859649122807014% } &[data-emoji='flag-io'] { background-position: 3.508771929824561% 45.614035087719294% } &[data-emoji='flag-iq'] { background-position: 3.508771929824561% 47.368421052631575% } &[data-emoji='flag-ir'] { background-position: 3.508771929824561% 49.122807017543856% } &[data-emoji='flag-is'] { background-position: 3.508771929824561% 50.87719298245614% } &[data-emoji='it'] { background-position: 3.508771929824561% 52.63157894736842% } &[data-emoji='flag-je'] { background-position: 3.508771929824561% 54.3859649122807% } &[data-emoji='flag-jm'] { background-position: 3.508771929824561% 56.14035087719298% } &[data-emoji='flag-jo'] { background-position: 3.508771929824561% 57.89473684210526% } &[data-emoji='jp'] { background-position: 3.508771929824561% 59.64912280701754% } &[data-emoji='flag-ke'] { background-position: 3.508771929824561% 61.40350877192982% } &[data-emoji='flag-kg'] { background-position: 3.508771929824561% 63.1578947368421% } &[data-emoji='flag-kh'] { background-position: 3.508771929824561% 64.91228070175438% } &[data-emoji='flag-ki'] { background-position: 3.508771929824561% 66.66666666666666% } &[data-emoji='flag-km'] { background-position: 3.508771929824561% 68.42105263157895% } &[data-emoji='flag-kn'] { background-position: 3.508771929824561% 70.17543859649122% } &[data-emoji='flag-kp'] { background-position: 3.508771929824561% 71.9298245614035% } &[data-emoji='kr'] { background-position: 3.508771929824561% 73.68421052631578% } &[data-emoji='flag-kw'] { background-position: 3.508771929824561% 75.43859649122807% } &[data-emoji='flag-ky'] { background-position: 3.508771929824561% 77.19298245614034% } &[data-emoji='flag-kz'] { background-position: 3.508771929824561% 78.94736842105263% } &[data-emoji='flag-la'] { background-position: 3.508771929824561% 80.7017543859649% } &[data-emoji='flag-lb'] { background-position: 3.508771929824561% 82.45614035087719% } &[data-emoji='flag-lc'] { background-position: 3.508771929824561% 84.21052631578947% } &[data-emoji='flag-li'] { background-position: 3.508771929824561% 85.96491228070175% } &[data-emoji='flag-lk'] { background-position: 3.508771929824561% 87.71929824561403% } &[data-emoji='flag-lr'] { background-position: 3.508771929824561% 89.47368421052632% } &[data-emoji='flag-ls'] { background-position: 3.508771929824561% 91.22807017543859% } &[data-emoji='flag-lt'] { background-position: 3.508771929824561% 92.98245614035088% } &[data-emoji='flag-lu'] { background-position: 3.508771929824561% 94.73684210526315% } &[data-emoji='flag-lv'] { background-position: 3.508771929824561% 96.49122807017544% } &[data-emoji='flag-ly'] { background-position: 3.508771929824561% 98.24561403508771% } &[data-emoji='flag-ma'] { background-position: 3.508771929824561% 100% } &[data-emoji='flag-mc'] { background-position: 5.263157894736842% 0% } &[data-emoji='flag-md'] { background-position: 5.263157894736842% 1.7543859649122806% } &[data-emoji='flag-me'] { background-position: 5.263157894736842% 3.508771929824561% } &[data-emoji='flag-mf'] { background-position: 5.263157894736842% 5.263157894736842% } &[data-emoji='flag-mg'] { background-position: 5.263157894736842% 7.017543859649122% } &[data-emoji='flag-mh'] { background-position: 5.263157894736842% 8.771929824561402% } &[data-emoji='flag-mk'] { background-position: 5.263157894736842% 10.526315789473683% } &[data-emoji='flag-ml'] { background-position: 5.263157894736842% 12.280701754385964% } &[data-emoji='flag-mm'] { background-position: 5.263157894736842% 14.035087719298245% } &[data-emoji='flag-mn'] { background-position: 5.263157894736842% 15.789473684210526% } &[data-emoji='flag-mo'] { background-position: 5.263157894736842% 17.543859649122805% } &[data-emoji='flag-mp'] { background-position: 5.263157894736842% 19.298245614035086% } &[data-emoji='flag-mq'] { background-position: 5.263157894736842% 21.052631578947366% } &[data-emoji='flag-mr'] { background-position: 5.263157894736842% 22.807017543859647% } &[data-emoji='flag-ms'] { background-position: 5.263157894736842% 24.561403508771928% } &[data-emoji='flag-mt'] { background-position: 5.263157894736842% 26.31578947368421% } &[data-emoji='flag-mu'] { background-position: 5.263157894736842% 28.07017543859649% } &[data-emoji='flag-mv'] { background-position: 5.263157894736842% 29.82456140350877% } &[data-emoji='flag-mw'] { background-position: 5.263157894736842% 31.57894736842105% } &[data-emoji='flag-mx'] { background-position: 5.263157894736842% 33.33333333333333% } &[data-emoji='flag-my'] { background-position: 5.263157894736842% 35.08771929824561% } &[data-emoji='flag-mz'] { background-position: 5.263157894736842% 36.84210526315789% } &[data-emoji='flag-na'] { background-position: 5.263157894736842% 38.59649122807017% } &[data-emoji='flag-nc'] { background-position: 5.263157894736842% 40.35087719298245% } &[data-emoji='flag-ne'] { background-position: 5.263157894736842% 42.10526315789473% } &[data-emoji='flag-nf'] { background-position: 5.263157894736842% 43.859649122807014% } &[data-emoji='flag-ng'] { background-position: 5.263157894736842% 45.614035087719294% } &[data-emoji='flag-ni'] { background-position: 5.263157894736842% 47.368421052631575% } &[data-emoji='flag-nl'] { background-position: 5.263157894736842% 49.122807017543856% } &[data-emoji='flag-no'] { background-position: 5.263157894736842% 50.87719298245614% } &[data-emoji='flag-np'] { background-position: 5.263157894736842% 52.63157894736842% } &[data-emoji='flag-nr'] { background-position: 5.263157894736842% 54.3859649122807% } &[data-emoji='flag-nu'] { background-position: 5.263157894736842% 56.14035087719298% } &[data-emoji='flag-nz'] { background-position: 5.263157894736842% 57.89473684210526% } &[data-emoji='flag-om'] { background-position: 5.263157894736842% 59.64912280701754% } &[data-emoji='flag-pa'] { background-position: 5.263157894736842% 61.40350877192982% } &[data-emoji='flag-pe'] { background-position: 5.263157894736842% 63.1578947368421% } &[data-emoji='flag-pf'] { background-position: 5.263157894736842% 64.91228070175438% } &[data-emoji='flag-pg'] { background-position: 5.263157894736842% 66.66666666666666% } &[data-emoji='flag-ph'] { background-position: 5.263157894736842% 68.42105263157895% } &[data-emoji='flag-pk'] { background-position: 5.263157894736842% 70.17543859649122% } &[data-emoji='flag-pl'] { background-position: 5.263157894736842% 71.9298245614035% } &[data-emoji='flag-pm'] { background-position: 5.263157894736842% 73.68421052631578% } &[data-emoji='flag-pn'] { background-position: 5.263157894736842% 75.43859649122807% } &[data-emoji='flag-pr'] { background-position: 5.263157894736842% 77.19298245614034% } &[data-emoji='flag-ps'] { background-position: 5.263157894736842% 78.94736842105263% } &[data-emoji='flag-pt'] { background-position: 5.263157894736842% 80.7017543859649% } &[data-emoji='flag-pw'] { background-position: 5.263157894736842% 82.45614035087719% } &[data-emoji='flag-py'] { background-position: 5.263157894736842% 84.21052631578947% } &[data-emoji='flag-qa'] { background-position: 5.263157894736842% 85.96491228070175% } &[data-emoji='flag-re'] { background-position: 5.263157894736842% 87.71929824561403% } &[data-emoji='flag-ro'] { background-position: 5.263157894736842% 89.47368421052632% } &[data-emoji='flag-rs'] { background-position: 5.263157894736842% 91.22807017543859% } &[data-emoji='ru'] { background-position: 5.263157894736842% 92.98245614035088% } &[data-emoji='flag-rw'] { background-position: 5.263157894736842% 94.73684210526315% } &[data-emoji='flag-sa'] { background-position: 5.263157894736842% 96.49122807017544% } &[data-emoji='flag-sb'] { background-position: 5.263157894736842% 98.24561403508771% } &[data-emoji='flag-sc'] { background-position: 5.263157894736842% 100% } &[data-emoji='flag-sd'] { background-position: 7.017543859649122% 0% } &[data-emoji='flag-se'] { background-position: 7.017543859649122% 1.7543859649122806% } &[data-emoji='flag-sg'] { background-position: 7.017543859649122% 3.508771929824561% } &[data-emoji='flag-sh'] { background-position: 7.017543859649122% 5.263157894736842% } &[data-emoji='flag-si'] { background-position: 7.017543859649122% 7.017543859649122% } &[data-emoji='flag-sj'] { background-position: 7.017543859649122% 8.771929824561402% } &[data-emoji='flag-sk'] { background-position: 7.017543859649122% 10.526315789473683% } &[data-emoji='flag-sl'] { background-position: 7.017543859649122% 12.280701754385964% } &[data-emoji='flag-sm'] { background-position: 7.017543859649122% 14.035087719298245% } &[data-emoji='flag-sn'] { background-position: 7.017543859649122% 15.789473684210526% } &[data-emoji='flag-so'] { background-position: 7.017543859649122% 17.543859649122805% } &[data-emoji='flag-sr'] { background-position: 7.017543859649122% 19.298245614035086% } &[data-emoji='flag-ss'] { background-position: 7.017543859649122% 21.052631578947366% } &[data-emoji='flag-st'] { background-position: 7.017543859649122% 22.807017543859647% } &[data-emoji='flag-sv'] { background-position: 7.017543859649122% 24.561403508771928% } &[data-emoji='flag-sx'] { background-position: 7.017543859649122% 26.31578947368421% } &[data-emoji='flag-sy'] { background-position: 7.017543859649122% 28.07017543859649% } &[data-emoji='flag-sz'] { background-position: 7.017543859649122% 29.82456140350877% } &[data-emoji='flag-ta'] { background-position: 7.017543859649122% 31.57894736842105% } &[data-emoji='flag-tc'] { background-position: 7.017543859649122% 33.33333333333333% } &[data-emoji='flag-td'] { background-position: 7.017543859649122% 35.08771929824561% } &[data-emoji='flag-tf'] { background-position: 7.017543859649122% 36.84210526315789% } &[data-emoji='flag-tg'] { background-position: 7.017543859649122% 38.59649122807017% } &[data-emoji='flag-th'] { background-position: 7.017543859649122% 40.35087719298245% } &[data-emoji='flag-tj'] { background-position: 7.017543859649122% 42.10526315789473% } &[data-emoji='flag-tk'] { background-position: 7.017543859649122% 43.859649122807014% } &[data-emoji='flag-tl'] { background-position: 7.017543859649122% 45.614035087719294% } &[data-emoji='flag-tm'] { background-position: 7.017543859649122% 47.368421052631575% } &[data-emoji='flag-tn'] { background-position: 7.017543859649122% 49.122807017543856% } &[data-emoji='flag-to'] { background-position: 7.017543859649122% 50.87719298245614% } &[data-emoji='flag-tr'] { background-position: 7.017543859649122% 52.63157894736842% } &[data-emoji='flag-tt'] { background-position: 7.017543859649122% 54.3859649122807% } &[data-emoji='flag-tv'] { background-position: 7.017543859649122% 56.14035087719298% } &[data-emoji='flag-tw'] { background-position: 7.017543859649122% 57.89473684210526% } &[data-emoji='flag-tz'] { background-position: 7.017543859649122% 59.64912280701754% } &[data-emoji='flag-ua'] { background-position: 7.017543859649122% 61.40350877192982% } &[data-emoji='flag-ug'] { background-position: 7.017543859649122% 63.1578947368421% } &[data-emoji='flag-um'] { background-position: 7.017543859649122% 64.91228070175438% } &[data-emoji='flag-un'] { background-position: 7.017543859649122% 66.66666666666666% } &[data-emoji='us'] { background-position: 7.017543859649122% 68.42105263157895% } &[data-emoji='flag-uy'] { background-position: 7.017543859649122% 70.17543859649122% } &[data-emoji='flag-uz'] { background-position: 7.017543859649122% 71.9298245614035% } &[data-emoji='flag-va'] { background-position: 7.017543859649122% 73.68421052631578% } &[data-emoji='flag-vc'] { background-position: 7.017543859649122% 75.43859649122807% } &[data-emoji='flag-ve'] { background-position: 7.017543859649122% 77.19298245614034% } &[data-emoji='flag-vg'] { background-position: 7.017543859649122% 78.94736842105263% } &[data-emoji='flag-vi'] { background-position: 7.017543859649122% 80.7017543859649% } &[data-emoji='flag-vn'] { background-position: 7.017543859649122% 82.45614035087719% } &[data-emoji='flag-vu'] { background-position: 7.017543859649122% 84.21052631578947% } &[data-emoji='flag-wf'] { background-position: 7.017543859649122% 85.96491228070175% } &[data-emoji='flag-ws'] { background-position: 7.017543859649122% 87.71929824561403% } &[data-emoji='flag-xk'] { background-position: 7.017543859649122% 89.47368421052632% } &[data-emoji='flag-ye'] { background-position: 7.017543859649122% 91.22807017543859% } &[data-emoji='flag-yt'] { background-position: 7.017543859649122% 92.98245614035088% } &[data-emoji='flag-za'] { background-position: 7.017543859649122% 94.73684210526315% } &[data-emoji='flag-zm'] { background-position: 7.017543859649122% 96.49122807017544% } &[data-emoji='flag-zw'] { background-position: 7.017543859649122% 98.24561403508771% } &[data-emoji='koko'] { background-position: 7.017543859649122% 100% } &[data-emoji='sa'] { background-position: 8.771929824561402% 0% } &[data-emoji='u7121'] { background-position: 8.771929824561402% 1.7543859649122806% } &[data-emoji='u6307'] { background-position: 8.771929824561402% 3.508771929824561% } &[data-emoji='u7981'] { background-position: 8.771929824561402% 5.263157894736842% } &[data-emoji='u7a7a'] { background-position: 8.771929824561402% 7.017543859649122% } &[data-emoji='u5408'] { background-position: 8.771929824561402% 8.771929824561402% } &[data-emoji='u6e80'] { background-position: 8.771929824561402% 10.526315789473683% } &[data-emoji='u6709'] { background-position: 8.771929824561402% 12.280701754385964% } &[data-emoji='u6708'] { background-position: 8.771929824561402% 14.035087719298245% } &[data-emoji='u7533'] { background-position: 8.771929824561402% 15.789473684210526% } &[data-emoji='u5272'] { background-position: 8.771929824561402% 17.543859649122805% } &[data-emoji='u55b6'] { background-position: 8.771929824561402% 19.298245614035086% } &[data-emoji='ideograph_advantage'] { background-position: 8.771929824561402% 21.052631578947366% } &[data-emoji='accept'] { background-position: 8.771929824561402% 22.807017543859647% } &[data-emoji='cyclone'] { background-position: 8.771929824561402% 24.561403508771928% } &[data-emoji='foggy'] { background-position: 8.771929824561402% 26.31578947368421% } &[data-emoji='closed_umbrella'] { background-position: 8.771929824561402% 28.07017543859649% } &[data-emoji='night_with_stars'] { background-position: 8.771929824561402% 29.82456140350877% } &[data-emoji='sunrise_over_mountains'] { background-position: 8.771929824561402% 31.57894736842105% } &[data-emoji='sunrise'] { background-position: 8.771929824561402% 33.33333333333333% } &[data-emoji='city_sunset'] { background-position: 8.771929824561402% 35.08771929824561% } &[data-emoji='city_sunrise'] { background-position: 8.771929824561402% 36.84210526315789% } &[data-emoji='rainbow'] { background-position: 8.771929824561402% 38.59649122807017% } &[data-emoji='bridge_at_night'] { background-position: 8.771929824561402% 40.35087719298245% } &[data-emoji='ocean'] { background-position: 8.771929824561402% 42.10526315789473% } &[data-emoji='volcano'] { background-position: 8.771929824561402% 43.859649122807014% } &[data-emoji='milky_way'] { background-position: 8.771929824561402% 45.614035087719294% } &[data-emoji='earth_africa'] { background-position: 8.771929824561402% 47.368421052631575% } &[data-emoji='earth_americas'] { background-position: 8.771929824561402% 49.122807017543856% } &[data-emoji='earth_asia'] { background-position: 8.771929824561402% 50.87719298245614% } &[data-emoji='globe_with_meridians'] { background-position: 8.771929824561402% 52.63157894736842% } &[data-emoji='new_moon'] { background-position: 8.771929824561402% 54.3859649122807% } &[data-emoji='waxing_crescent_moon'] { background-position: 8.771929824561402% 56.14035087719298% } &[data-emoji='first_quarter_moon'] { background-position: 8.771929824561402% 57.89473684210526% } &[data-emoji='moon'] { background-position: 8.771929824561402% 59.64912280701754% } &[data-emoji='full_moon'] { background-position: 8.771929824561402% 61.40350877192982% } &[data-emoji='waning_gibbous_moon'] { background-position: 8.771929824561402% 63.1578947368421% } &[data-emoji='last_quarter_moon'] { background-position: 8.771929824561402% 64.91228070175438% } &[data-emoji='waning_crescent_moon'] { background-position: 8.771929824561402% 66.66666666666666% } &[data-emoji='crescent_moon'] { background-position: 8.771929824561402% 68.42105263157895% } &[data-emoji='new_moon_with_face'] { background-position: 8.771929824561402% 70.17543859649122% } &[data-emoji='first_quarter_moon_with_face'] { background-position: 8.771929824561402% 71.9298245614035% } &[data-emoji='last_quarter_moon_with_face'] { background-position: 8.771929824561402% 73.68421052631578% } &[data-emoji='full_moon_with_face'] { background-position: 8.771929824561402% 75.43859649122807% } &[data-emoji='sun_with_face'] { background-position: 8.771929824561402% 77.19298245614034% } &[data-emoji='star2'] { background-position: 8.771929824561402% 78.94736842105263% } &[data-emoji='stars'] { background-position: 8.771929824561402% 80.7017543859649% } &[data-emoji='thermometer'] { background-position: 8.771929824561402% 82.45614035087719% } &[data-emoji='mostly_sunny'] { background-position: 8.771929824561402% 84.21052631578947% } &[data-emoji='barely_sunny'] { background-position: 8.771929824561402% 85.96491228070175% } &[data-emoji='partly_sunny_rain'] { background-position: 8.771929824561402% 87.71929824561403% } &[data-emoji='rain_cloud'] { background-position: 8.771929824561402% 89.47368421052632% } &[data-emoji='snow_cloud'] { background-position: 8.771929824561402% 91.22807017543859% } &[data-emoji='lightning'] { background-position: 8.771929824561402% 92.98245614035088% } &[data-emoji='tornado'] { background-position: 8.771929824561402% 94.73684210526315% } &[data-emoji='fog'] { background-position: 8.771929824561402% 96.49122807017544% } &[data-emoji='wind_blowing_face'] { background-position: 8.771929824561402% 98.24561403508771% } &[data-emoji='hotdog'] { background-position: 8.771929824561402% 100% } &[data-emoji='taco'] { background-position: 10.526315789473683% 0% } &[data-emoji='burrito'] { background-position: 10.526315789473683% 1.7543859649122806% } &[data-emoji='chestnut'] { background-position: 10.526315789473683% 3.508771929824561% } &[data-emoji='seedling'] { background-position: 10.526315789473683% 5.263157894736842% } &[data-emoji='evergreen_tree'] { background-position: 10.526315789473683% 7.017543859649122% } &[data-emoji='deciduous_tree'] { background-position: 10.526315789473683% 8.771929824561402% } &[data-emoji='palm_tree'] { background-position: 10.526315789473683% 10.526315789473683% } &[data-emoji='cactus'] { background-position: 10.526315789473683% 12.280701754385964% } &[data-emoji='hot_pepper'] { background-position: 10.526315789473683% 14.035087719298245% } &[data-emoji='tulip'] { background-position: 10.526315789473683% 15.789473684210526% } &[data-emoji='cherry_blossom'] { background-position: 10.526315789473683% 17.543859649122805% } &[data-emoji='rose'] { background-position: 10.526315789473683% 19.298245614035086% } &[data-emoji='hibiscus'] { background-position: 10.526315789473683% 21.052631578947366% } &[data-emoji='sunflower'] { background-position: 10.526315789473683% 22.807017543859647% } &[data-emoji='blossom'] { background-position: 10.526315789473683% 24.561403508771928% } &[data-emoji='corn'] { background-position: 10.526315789473683% 26.31578947368421% } &[data-emoji='ear_of_rice'] { background-position: 10.526315789473683% 28.07017543859649% } &[data-emoji='herb'] { background-position: 10.526315789473683% 29.82456140350877% } &[data-emoji='four_leaf_clover'] { background-position: 10.526315789473683% 31.57894736842105% } &[data-emoji='maple_leaf'] { background-position: 10.526315789473683% 33.33333333333333% } &[data-emoji='fallen_leaf'] { background-position: 10.526315789473683% 35.08771929824561% } &[data-emoji='leaves'] { background-position: 10.526315789473683% 36.84210526315789% } &[data-emoji='mushroom'] { background-position: 10.526315789473683% 38.59649122807017% } &[data-emoji='tomato'] { background-position: 10.526315789473683% 40.35087719298245% } &[data-emoji='eggplant'] { background-position: 10.526315789473683% 42.10526315789473% } &[data-emoji='grapes'] { background-position: 10.526315789473683% 43.859649122807014% } &[data-emoji='melon'] { background-position: 10.526315789473683% 45.614035087719294% } &[data-emoji='watermelon'] { background-position: 10.526315789473683% 47.368421052631575% } &[data-emoji='tangerine'] { background-position: 10.526315789473683% 49.122807017543856% } &[data-emoji='lemon'] { background-position: 10.526315789473683% 50.87719298245614% } &[data-emoji='banana'] { background-position: 10.526315789473683% 52.63157894736842% } &[data-emoji='pineapple'] { background-position: 10.526315789473683% 54.3859649122807% } &[data-emoji='apple'] { background-position: 10.526315789473683% 56.14035087719298% } &[data-emoji='green_apple'] { background-position: 10.526315789473683% 57.89473684210526% } &[data-emoji='pear'] { background-position: 10.526315789473683% 59.64912280701754% } &[data-emoji='peach'] { background-position: 10.526315789473683% 61.40350877192982% } &[data-emoji='cherries'] { background-position: 10.526315789473683% 63.1578947368421% } &[data-emoji='strawberry'] { background-position: 10.526315789473683% 64.91228070175438% } &[data-emoji='hamburger'] { background-position: 10.526315789473683% 66.66666666666666% } &[data-emoji='pizza'] { background-position: 10.526315789473683% 68.42105263157895% } &[data-emoji='meat_on_bone'] { background-position: 10.526315789473683% 70.17543859649122% } &[data-emoji='poultry_leg'] { background-position: 10.526315789473683% 71.9298245614035% } &[data-emoji='rice_cracker'] { background-position: 10.526315789473683% 73.68421052631578% } &[data-emoji='rice_ball'] { background-position: 10.526315789473683% 75.43859649122807% } &[data-emoji='rice'] { background-position: 10.526315789473683% 77.19298245614034% } &[data-emoji='curry'] { background-position: 10.526315789473683% 78.94736842105263% } &[data-emoji='ramen'] { background-position: 10.526315789473683% 80.7017543859649% } &[data-emoji='spaghetti'] { background-position: 10.526315789473683% 82.45614035087719% } &[data-emoji='bread'] { background-position: 10.526315789473683% 84.21052631578947% } &[data-emoji='fries'] { background-position: 10.526315789473683% 85.96491228070175% } &[data-emoji='sweet_potato'] { background-position: 10.526315789473683% 87.71929824561403% } &[data-emoji='dango'] { background-position: 10.526315789473683% 89.47368421052632% } &[data-emoji='oden'] { background-position: 10.526315789473683% 91.22807017543859% } &[data-emoji='sushi'] { background-position: 10.526315789473683% 92.98245614035088% } &[data-emoji='fried_shrimp'] { background-position: 10.526315789473683% 94.73684210526315% } &[data-emoji='fish_cake'] { background-position: 10.526315789473683% 96.49122807017544% } &[data-emoji='icecream'] { background-position: 10.526315789473683% 98.24561403508771% } &[data-emoji='shaved_ice'] { background-position: 10.526315789473683% 100% } &[data-emoji='ice_cream'] { background-position: 12.280701754385964% 0% } &[data-emoji='doughnut'] { background-position: 12.280701754385964% 1.7543859649122806% } &[data-emoji='cookie'] { background-position: 12.280701754385964% 3.508771929824561% } &[data-emoji='chocolate_bar'] { background-position: 12.280701754385964% 5.263157894736842% } &[data-emoji='candy'] { background-position: 12.280701754385964% 7.017543859649122% } &[data-emoji='lollipop'] { background-position: 12.280701754385964% 8.771929824561402% } &[data-emoji='custard'] { background-position: 12.280701754385964% 10.526315789473683% } &[data-emoji='honey_pot'] { background-position: 12.280701754385964% 12.280701754385964% } &[data-emoji='cake'] { background-position: 12.280701754385964% 14.035087719298245% } &[data-emoji='bento'] { background-position: 12.280701754385964% 15.789473684210526% } &[data-emoji='stew'] { background-position: 12.280701754385964% 17.543859649122805% } &[data-emoji='fried_egg'] { background-position: 12.280701754385964% 19.298245614035086% } &[data-emoji='fork_and_knife'] { background-position: 12.280701754385964% 21.052631578947366% } &[data-emoji='tea'] { background-position: 12.280701754385964% 22.807017543859647% } &[data-emoji='sake'] { background-position: 12.280701754385964% 24.561403508771928% } &[data-emoji='wine_glass'] { background-position: 12.280701754385964% 26.31578947368421% } &[data-emoji='cocktail'] { background-position: 12.280701754385964% 28.07017543859649% } &[data-emoji='tropical_drink'] { background-position: 12.280701754385964% 29.82456140350877% } &[data-emoji='beer'] { background-position: 12.280701754385964% 31.57894736842105% } &[data-emoji='beers'] { background-position: 12.280701754385964% 33.33333333333333% } &[data-emoji='baby_bottle'] { background-position: 12.280701754385964% 35.08771929824561% } &[data-emoji='knife_fork_plate'] { background-position: 12.280701754385964% 36.84210526315789% } &[data-emoji='champagne'] { background-position: 12.280701754385964% 38.59649122807017% } &[data-emoji='popcorn'] { background-position: 12.280701754385964% 40.35087719298245% } &[data-emoji='ribbon'] { background-position: 12.280701754385964% 42.10526315789473% } &[data-emoji='gift'] { background-position: 12.280701754385964% 43.859649122807014% } &[data-emoji='birthday'] { background-position: 12.280701754385964% 45.614035087719294% } &[data-emoji='jack_o_lantern'] { background-position: 12.280701754385964% 47.368421052631575% } &[data-emoji='christmas_tree'] { background-position: 12.280701754385964% 49.122807017543856% } &[data-emoji='santa'] { background-position: 12.280701754385964% 50.87719298245614% } &[data-emoji='fireworks'] { background-position: 12.280701754385964% 61.40350877192982% } &[data-emoji='sparkler'] { background-position: 12.280701754385964% 63.1578947368421% } &[data-emoji='balloon'] { background-position: 12.280701754385964% 64.91228070175438% } &[data-emoji='tada'] { background-position: 12.280701754385964% 66.66666666666666% } &[data-emoji='confetti_ball'] { background-position: 12.280701754385964% 68.42105263157895% } &[data-emoji='tanabata_tree'] { background-position: 12.280701754385964% 70.17543859649122% } &[data-emoji='crossed_flags'] { background-position: 12.280701754385964% 71.9298245614035% } &[data-emoji='bamboo'] { background-position: 12.280701754385964% 73.68421052631578% } &[data-emoji='dolls'] { background-position: 12.280701754385964% 75.43859649122807% } &[data-emoji='flags'] { background-position: 12.280701754385964% 77.19298245614034% } &[data-emoji='wind_chime'] { background-position: 12.280701754385964% 78.94736842105263% } &[data-emoji='rice_scene'] { background-position: 12.280701754385964% 80.7017543859649% } &[data-emoji='school_satchel'] { background-position: 12.280701754385964% 82.45614035087719% } &[data-emoji='mortar_board'] { background-position: 12.280701754385964% 84.21052631578947% } &[data-emoji='medal'] { background-position: 12.280701754385964% 85.96491228070175% } &[data-emoji='reminder_ribbon'] { background-position: 12.280701754385964% 87.71929824561403% } &[data-emoji='studio_microphone'] { background-position: 12.280701754385964% 89.47368421052632% } &[data-emoji='level_slider'] { background-position: 12.280701754385964% 91.22807017543859% } &[data-emoji='control_knobs'] { background-position: 12.280701754385964% 92.98245614035088% } &[data-emoji='film_frames'] { background-position: 12.280701754385964% 94.73684210526315% } &[data-emoji='admission_tickets'] { background-position: 12.280701754385964% 96.49122807017544% } &[data-emoji='carousel_horse'] { background-position: 12.280701754385964% 98.24561403508771% } &[data-emoji='ferris_wheel'] { background-position: 12.280701754385964% 100% } &[data-emoji='roller_coaster'] { background-position: 14.035087719298245% 0% } &[data-emoji='fishing_pole_and_fish'] { background-position: 14.035087719298245% 1.7543859649122806% } &[data-emoji='microphone'] { background-position: 14.035087719298245% 3.508771929824561% } &[data-emoji='movie_camera'] { background-position: 14.035087719298245% 5.263157894736842% } &[data-emoji='cinema'] { background-position: 14.035087719298245% 7.017543859649122% } &[data-emoji='headphones'] { background-position: 14.035087719298245% 8.771929824561402% } &[data-emoji='art'] { background-position: 14.035087719298245% 10.526315789473683% } &[data-emoji='tophat'] { background-position: 14.035087719298245% 12.280701754385964% } &[data-emoji='circus_tent'] { background-position: 14.035087719298245% 14.035087719298245% } &[data-emoji='ticket'] { background-position: 14.035087719298245% 15.789473684210526% } &[data-emoji='clapper'] { background-position: 14.035087719298245% 17.543859649122805% } &[data-emoji='performing_arts'] { background-position: 14.035087719298245% 19.298245614035086% } &[data-emoji='video_game'] { background-position: 14.035087719298245% 21.052631578947366% } &[data-emoji='dart'] { background-position: 14.035087719298245% 22.807017543859647% } &[data-emoji='slot_machine'] { background-position: 14.035087719298245% 24.561403508771928% } &[data-emoji='8ball'] { background-position: 14.035087719298245% 26.31578947368421% } &[data-emoji='game_die'] { background-position: 14.035087719298245% 28.07017543859649% } &[data-emoji='bowling'] { background-position: 14.035087719298245% 29.82456140350877% } &[data-emoji='flower_playing_cards'] { background-position: 14.035087719298245% 31.57894736842105% } &[data-emoji='musical_note'] { background-position: 14.035087719298245% 33.33333333333333% } &[data-emoji='notes'] { background-position: 14.035087719298245% 35.08771929824561% } &[data-emoji='saxophone'] { background-position: 14.035087719298245% 36.84210526315789% } &[data-emoji='guitar'] { background-position: 14.035087719298245% 38.59649122807017% } &[data-emoji='musical_keyboard'] { background-position: 14.035087719298245% 40.35087719298245% } &[data-emoji='trumpet'] { background-position: 14.035087719298245% 42.10526315789473% } &[data-emoji='violin'] { background-position: 14.035087719298245% 43.859649122807014% } &[data-emoji='musical_score'] { background-position: 14.035087719298245% 45.614035087719294% } &[data-emoji='running_shirt_with_sash'] { background-position: 14.035087719298245% 47.368421052631575% } &[data-emoji='tennis'] { background-position: 14.035087719298245% 49.122807017543856% } &[data-emoji='ski'] { background-position: 14.035087719298245% 50.87719298245614% } &[data-emoji='basketball'] { background-position: 14.035087719298245% 52.63157894736842% } &[data-emoji='checkered_flag'] { background-position: 14.035087719298245% 54.3859649122807% } &[data-emoji='snowboarder'] { background-position: 14.035087719298245% 56.14035087719298% } &[data-emoji='woman-running'] { background-position: 14.035087719298245% 66.66666666666666% } &[data-emoji='man-running'] { background-position: 14.035087719298245% 77.19298245614034% } &[data-emoji='runner'] { background-position: 14.035087719298245% 87.71929824561403% } &[data-emoji='woman-surfing'] { background-position: 14.035087719298245% 98.24561403508771% } &[data-emoji='man-surfing'] { background-position: 15.789473684210526% 7.017543859649122% } &[data-emoji='surfer'] { background-position: 15.789473684210526% 17.543859649122805% } &[data-emoji='sports_medal'] { background-position: 15.789473684210526% 28.07017543859649% } &[data-emoji='trophy'] { background-position: 15.789473684210526% 29.82456140350877% } &[data-emoji='horse_racing'] { background-position: 15.789473684210526% 31.57894736842105% } &[data-emoji='football'] { background-position: 15.789473684210526% 42.10526315789473% } &[data-emoji='rugby_football'] { background-position: 15.789473684210526% 43.859649122807014% } &[data-emoji='woman-swimming'] { background-position: 15.789473684210526% 45.614035087719294% } &[data-emoji='man-swimming'] { background-position: 15.789473684210526% 56.14035087719298% } &[data-emoji='swimmer'] { background-position: 15.789473684210526% 66.66666666666666% } &[data-emoji='woman-lifting-weights'] { background-position: 15.789473684210526% 77.19298245614034% } &[data-emoji='man-lifting-weights'] { background-position: 15.789473684210526% 87.71929824561403% } &[data-emoji='weight_lifter'] { background-position: 15.789473684210526% 98.24561403508771% } &[data-emoji='woman-golfing'] { background-position: 17.543859649122805% 7.017543859649122% } &[data-emoji='man-golfing'] { background-position: 17.543859649122805% 17.543859649122805% } &[data-emoji='golfer'] { background-position: 17.543859649122805% 28.07017543859649% } &[data-emoji='racing_motorcycle'] { background-position: 17.543859649122805% 38.59649122807017% } &[data-emoji='racing_car'] { background-position: 17.543859649122805% 40.35087719298245% } &[data-emoji='cricket_bat_and_ball'] { background-position: 17.543859649122805% 42.10526315789473% } &[data-emoji='volleyball'] { background-position: 17.543859649122805% 43.859649122807014% } &[data-emoji='field_hockey_stick_and_ball'] { background-position: 17.543859649122805% 45.614035087719294% } &[data-emoji='ice_hockey_stick_and_puck'] { background-position: 17.543859649122805% 47.368421052631575% } &[data-emoji='table_tennis_paddle_and_ball'] { background-position: 17.543859649122805% 49.122807017543856% } &[data-emoji='snow_capped_mountain'] { background-position: 17.543859649122805% 50.87719298245614% } &[data-emoji='camping'] { background-position: 17.543859649122805% 52.63157894736842% } &[data-emoji='beach_with_umbrella'] { background-position: 17.543859649122805% 54.3859649122807% } &[data-emoji='building_construction'] { background-position: 17.543859649122805% 56.14035087719298% } &[data-emoji='house_buildings'] { background-position: 17.543859649122805% 57.89473684210526% } &[data-emoji='cityscape'] { background-position: 17.543859649122805% 59.64912280701754% } &[data-emoji='derelict_house_building'] { background-position: 17.543859649122805% 61.40350877192982% } &[data-emoji='classical_building'] { background-position: 17.543859649122805% 63.1578947368421% } &[data-emoji='desert'] { background-position: 17.543859649122805% 64.91228070175438% } &[data-emoji='desert_island'] { background-position: 17.543859649122805% 66.66666666666666% } &[data-emoji='national_park'] { background-position: 17.543859649122805% 68.42105263157895% } &[data-emoji='stadium'] { background-position: 17.543859649122805% 70.17543859649122% } &[data-emoji='house'] { background-position: 17.543859649122805% 71.9298245614035% } &[data-emoji='house_with_garden'] { background-position: 17.543859649122805% 73.68421052631578% } &[data-emoji='office'] { background-position: 17.543859649122805% 75.43859649122807% } &[data-emoji='post_office'] { background-position: 17.543859649122805% 77.19298245614034% } &[data-emoji='european_post_office'] { background-position: 17.543859649122805% 78.94736842105263% } &[data-emoji='hospital'] { background-position: 17.543859649122805% 80.7017543859649% } &[data-emoji='bank'] { background-position: 17.543859649122805% 82.45614035087719% } &[data-emoji='atm'] { background-position: 17.543859649122805% 84.21052631578947% } &[data-emoji='hotel'] { background-position: 17.543859649122805% 85.96491228070175% } &[data-emoji='love_hotel'] { background-position: 17.543859649122805% 87.71929824561403% } &[data-emoji='convenience_store'] { background-position: 17.543859649122805% 89.47368421052632% } &[data-emoji='school'] { background-position: 17.543859649122805% 91.22807017543859% } &[data-emoji='department_store'] { background-position: 17.543859649122805% 92.98245614035088% } &[data-emoji='factory'] { background-position: 17.543859649122805% 94.73684210526315% } &[data-emoji='izakaya_lantern'] { background-position: 17.543859649122805% 96.49122807017544% } &[data-emoji='japanese_castle'] { background-position: 17.543859649122805% 98.24561403508771% } &[data-emoji='european_castle'] { background-position: 17.543859649122805% 100% } &[data-emoji='rainbow-flag'] { background-position: 19.298245614035086% 0% } &[data-emoji='transgender_flag'] { background-position: 19.298245614035086% 1.7543859649122806% } &[data-emoji='waving_white_flag'] { background-position: 19.298245614035086% 3.508771929824561% } &[data-emoji='pirate_flag'] { background-position: 19.298245614035086% 5.263157894736842% } &[data-emoji='flag-england'] { background-position: 19.298245614035086% 7.017543859649122% } &[data-emoji='flag-scotland'] { background-position: 19.298245614035086% 8.771929824561402% } &[data-emoji='flag-wales'] { background-position: 19.298245614035086% 10.526315789473683% } &[data-emoji='waving_black_flag'] { background-position: 19.298245614035086% 12.280701754385964% } &[data-emoji='rosette'] { background-position: 19.298245614035086% 14.035087719298245% } &[data-emoji='label'] { background-position: 19.298245614035086% 15.789473684210526% } &[data-emoji='badminton_racquet_and_shuttlecock'] { background-position: 19.298245614035086% 17.543859649122805% } &[data-emoji='bow_and_arrow'] { background-position: 19.298245614035086% 19.298245614035086% } &[data-emoji='amphora'] { background-position: 19.298245614035086% 21.052631578947366% } &[data-emoji='rat'] { background-position: 19.298245614035086% 31.57894736842105% } &[data-emoji='mouse2'] { background-position: 19.298245614035086% 33.33333333333333% } &[data-emoji='ox'] { background-position: 19.298245614035086% 35.08771929824561% } &[data-emoji='water_buffalo'] { background-position: 19.298245614035086% 36.84210526315789% } &[data-emoji='cow2'] { background-position: 19.298245614035086% 38.59649122807017% } &[data-emoji='tiger2'] { background-position: 19.298245614035086% 40.35087719298245% } &[data-emoji='leopard'] { background-position: 19.298245614035086% 42.10526315789473% } &[data-emoji='rabbit2'] { background-position: 19.298245614035086% 43.859649122807014% } &[data-emoji='black_cat'] { background-position: 19.298245614035086% 45.614035087719294% } &[data-emoji='cat2'] { background-position: 19.298245614035086% 47.368421052631575% } &[data-emoji='dragon'] { background-position: 19.298245614035086% 49.122807017543856% } &[data-emoji='crocodile'] { background-position: 19.298245614035086% 50.87719298245614% } &[data-emoji='whale2'] { background-position: 19.298245614035086% 52.63157894736842% } &[data-emoji='snail'] { background-position: 19.298245614035086% 54.3859649122807% } &[data-emoji='snake'] { background-position: 19.298245614035086% 56.14035087719298% } &[data-emoji='racehorse'] { background-position: 19.298245614035086% 57.89473684210526% } &[data-emoji='ram'] { background-position: 19.298245614035086% 59.64912280701754% } &[data-emoji='goat'] { background-position: 19.298245614035086% 61.40350877192982% } &[data-emoji='sheep'] { background-position: 19.298245614035086% 63.1578947368421% } &[data-emoji='monkey'] { background-position: 19.298245614035086% 64.91228070175438% } &[data-emoji='rooster'] { background-position: 19.298245614035086% 66.66666666666666% } &[data-emoji='chicken'] { background-position: 19.298245614035086% 68.42105263157895% } &[data-emoji='service_dog'] { background-position: 19.298245614035086% 70.17543859649122% } &[data-emoji='dog2'] { background-position: 19.298245614035086% 71.9298245614035% } &[data-emoji='pig2'] { background-position: 19.298245614035086% 73.68421052631578% } &[data-emoji='boar'] { background-position: 19.298245614035086% 75.43859649122807% } &[data-emoji='elephant'] { background-position: 19.298245614035086% 77.19298245614034% } &[data-emoji='octopus'] { background-position: 19.298245614035086% 78.94736842105263% } &[data-emoji='shell'] { background-position: 19.298245614035086% 80.7017543859649% } &[data-emoji='bug'] { background-position: 19.298245614035086% 82.45614035087719% } &[data-emoji='ant'] { background-position: 19.298245614035086% 84.21052631578947% } &[data-emoji='bee'] { background-position: 19.298245614035086% 85.96491228070175% } &[data-emoji='ladybug'] { background-position: 19.298245614035086% 87.71929824561403% } &[data-emoji='fish'] { background-position: 19.298245614035086% 89.47368421052632% } &[data-emoji='tropical_fish'] { background-position: 19.298245614035086% 91.22807017543859% } &[data-emoji='blowfish'] { background-position: 19.298245614035086% 92.98245614035088% } &[data-emoji='turtle'] { background-position: 19.298245614035086% 94.73684210526315% } &[data-emoji='hatching_chick'] { background-position: 19.298245614035086% 96.49122807017544% } &[data-emoji='baby_chick'] { background-position: 19.298245614035086% 98.24561403508771% } &[data-emoji='hatched_chick'] { background-position: 19.298245614035086% 100% } &[data-emoji='bird'] { background-position: 21.052631578947366% 0% } &[data-emoji='penguin'] { background-position: 21.052631578947366% 1.7543859649122806% } &[data-emoji='koala'] { background-position: 21.052631578947366% 3.508771929824561% } &[data-emoji='poodle'] { background-position: 21.052631578947366% 5.263157894736842% } &[data-emoji='dromedary_camel'] { background-position: 21.052631578947366% 7.017543859649122% } &[data-emoji='camel'] { background-position: 21.052631578947366% 8.771929824561402% } &[data-emoji='dolphin'] { background-position: 21.052631578947366% 10.526315789473683% } &[data-emoji='mouse'] { background-position: 21.052631578947366% 12.280701754385964% } &[data-emoji='cow'] { background-position: 21.052631578947366% 14.035087719298245% } &[data-emoji='tiger'] { background-position: 21.052631578947366% 15.789473684210526% } &[data-emoji='rabbit'] { background-position: 21.052631578947366% 17.543859649122805% } &[data-emoji='cat'] { background-position: 21.052631578947366% 19.298245614035086% } &[data-emoji='dragon_face'] { background-position: 21.052631578947366% 21.052631578947366% } &[data-emoji='whale'] { background-position: 21.052631578947366% 22.807017543859647% } &[data-emoji='horse'] { background-position: 21.052631578947366% 24.561403508771928% } &[data-emoji='monkey_face'] { background-position: 21.052631578947366% 26.31578947368421% } &[data-emoji='dog'] { background-position: 21.052631578947366% 28.07017543859649% } &[data-emoji='pig'] { background-position: 21.052631578947366% 29.82456140350877% } &[data-emoji='frog'] { background-position: 21.052631578947366% 31.57894736842105% } &[data-emoji='hamster'] { background-position: 21.052631578947366% 33.33333333333333% } &[data-emoji='wolf'] { background-position: 21.052631578947366% 35.08771929824561% } &[data-emoji='polar_bear'] { background-position: 21.052631578947366% 36.84210526315789% } &[data-emoji='bear'] { background-position: 21.052631578947366% 38.59649122807017% } &[data-emoji='panda_face'] { background-position: 21.052631578947366% 40.35087719298245% } &[data-emoji='pig_nose'] { background-position: 21.052631578947366% 42.10526315789473% } &[data-emoji='feet'] { background-position: 21.052631578947366% 43.859649122807014% } &[data-emoji='chipmunk'] { background-position: 21.052631578947366% 45.614035087719294% } &[data-emoji='eyes'] { background-position: 21.052631578947366% 47.368421052631575% } &[data-emoji='eye'] { background-position: 21.052631578947366% 50.87719298245614% } &[data-emoji='ear'] { background-position: 21.052631578947366% 52.63157894736842% } &[data-emoji='nose'] { background-position: 21.052631578947366% 63.1578947368421% } &[data-emoji='lips'] { background-position: 21.052631578947366% 73.68421052631578% } &[data-emoji='tongue'] { background-position: 21.052631578947366% 75.43859649122807% } &[data-emoji='point_up_2'] { background-position: 21.052631578947366% 77.19298245614034% } &[data-emoji='point_down'] { background-position: 21.052631578947366% 87.71929824561403% } &[data-emoji='point_left'] { background-position: 21.052631578947366% 98.24561403508771% } &[data-emoji='point_right'] { background-position: 22.807017543859647% 7.017543859649122% } &[data-emoji='facepunch'] { background-position: 22.807017543859647% 17.543859649122805% } &[data-emoji='wave'] { background-position: 22.807017543859647% 28.07017543859649% } &[data-emoji='ok_hand'] { background-position: 22.807017543859647% 38.59649122807017% } &[data-emoji='+1'] { background-position: 22.807017543859647% 49.122807017543856% } &[data-emoji='-1'] { background-position: 22.807017543859647% 59.64912280701754% } &[data-emoji='clap'] { background-position: 22.807017543859647% 70.17543859649122% } &[data-emoji='open_hands'] { background-position: 22.807017543859647% 80.7017543859649% } &[data-emoji='crown'] { background-position: 22.807017543859647% 91.22807017543859% } &[data-emoji='womans_hat'] { background-position: 22.807017543859647% 92.98245614035088% } &[data-emoji='eyeglasses'] { background-position: 22.807017543859647% 94.73684210526315% } &[data-emoji='necktie'] { background-position: 22.807017543859647% 96.49122807017544% } &[data-emoji='shirt'] { background-position: 22.807017543859647% 98.24561403508771% } &[data-emoji='jeans'] { background-position: 22.807017543859647% 100% } &[data-emoji='dress'] { background-position: 24.561403508771928% 0% } &[data-emoji='kimono'] { background-position: 24.561403508771928% 1.7543859649122806% } &[data-emoji='bikini'] { background-position: 24.561403508771928% 3.508771929824561% } &[data-emoji='womans_clothes'] { background-position: 24.561403508771928% 5.263157894736842% } &[data-emoji='purse'] { background-position: 24.561403508771928% 7.017543859649122% } &[data-emoji='handbag'] { background-position: 24.561403508771928% 8.771929824561402% } &[data-emoji='pouch'] { background-position: 24.561403508771928% 10.526315789473683% } &[data-emoji='mans_shoe'] { background-position: 24.561403508771928% 12.280701754385964% } &[data-emoji='athletic_shoe'] { background-position: 24.561403508771928% 14.035087719298245% } &[data-emoji='high_heel'] { background-position: 24.561403508771928% 15.789473684210526% } &[data-emoji='sandal'] { background-position: 24.561403508771928% 17.543859649122805% } &[data-emoji='boot'] { background-position: 24.561403508771928% 19.298245614035086% } &[data-emoji='footprints'] { background-position: 24.561403508771928% 21.052631578947366% } &[data-emoji='bust_in_silhouette'] { background-position: 24.561403508771928% 22.807017543859647% } &[data-emoji='busts_in_silhouette'] { background-position: 24.561403508771928% 24.561403508771928% } &[data-emoji='boy'] { background-position: 24.561403508771928% 26.31578947368421% } &[data-emoji='girl'] { background-position: 24.561403508771928% 36.84210526315789% } &[data-emoji='male-farmer'] { background-position: 24.561403508771928% 47.368421052631575% } &[data-emoji='male-cook'] { background-position: 24.561403508771928% 57.89473684210526% } &[data-emoji='man_feeding_baby'] { background-position: 24.561403508771928% 68.42105263157895% } &[data-emoji='male-student'] { background-position: 24.561403508771928% 78.94736842105263% } &[data-emoji='male-singer'] { background-position: 24.561403508771928% 89.47368421052632% } &[data-emoji='male-artist'] { background-position: 24.561403508771928% 100% } &[data-emoji='male-teacher'] { background-position: 26.31578947368421% 8.771929824561402% } &[data-emoji='male-factory-worker'] { background-position: 26.31578947368421% 19.298245614035086% } &[data-emoji='man-boy-boy'] { background-position: 26.31578947368421% 29.82456140350877% } &[data-emoji='man-boy'] { background-position: 26.31578947368421% 31.57894736842105% } &[data-emoji='man-girl-boy'] { background-position: 26.31578947368421% 33.33333333333333% } &[data-emoji='man-girl-girl'] { background-position: 26.31578947368421% 35.08771929824561% } &[data-emoji='man-girl'] { background-position: 26.31578947368421% 36.84210526315789% } &[data-emoji='man-man-boy'] { background-position: 26.31578947368421% 38.59649122807017% } &[data-emoji='man-man-boy-boy'] { background-position: 26.31578947368421% 40.35087719298245% } &[data-emoji='man-man-girl'] { background-position: 26.31578947368421% 42.10526315789473% } &[data-emoji='man-man-girl-boy'] { background-position: 26.31578947368421% 43.859649122807014% } &[data-emoji='man-man-girl-girl'] { background-position: 26.31578947368421% 45.614035087719294% } &[data-emoji='man-woman-boy'] { background-position: 26.31578947368421% 47.368421052631575% } &[data-emoji='man-woman-boy-boy'] { background-position: 26.31578947368421% 49.122807017543856% } &[data-emoji='man-woman-girl'] { background-position: 26.31578947368421% 50.87719298245614% } &[data-emoji='man-woman-girl-boy'] { background-position: 26.31578947368421% 52.63157894736842% } &[data-emoji='man-woman-girl-girl'] { background-position: 26.31578947368421% 54.3859649122807% } &[data-emoji='male-technologist'] { background-position: 26.31578947368421% 56.14035087719298% } &[data-emoji='male-office-worker'] { background-position: 26.31578947368421% 66.66666666666666% } &[data-emoji='male-mechanic'] { background-position: 26.31578947368421% 77.19298245614034% } &[data-emoji='male-scientist'] { background-position: 26.31578947368421% 87.71929824561403% } &[data-emoji='male-astronaut'] { background-position: 26.31578947368421% 98.24561403508771% } &[data-emoji='male-firefighter'] { background-position: 28.07017543859649% 7.017543859649122% } &[data-emoji='man_with_probing_cane'] { background-position: 28.07017543859649% 17.543859649122805% } &[data-emoji='red_haired_man'] { background-position: 28.07017543859649% 28.07017543859649% } &[data-emoji='curly_haired_man'] { background-position: 28.07017543859649% 38.59649122807017% } &[data-emoji='bald_man'] { background-position: 28.07017543859649% 49.122807017543856% } &[data-emoji='white_haired_man'] { background-position: 28.07017543859649% 59.64912280701754% } &[data-emoji='man_in_motorized_wheelchair'] { background-position: 28.07017543859649% 70.17543859649122% } &[data-emoji='man_in_manual_wheelchair'] { background-position: 28.07017543859649% 80.7017543859649% } &[data-emoji='male-doctor'] { background-position: 28.07017543859649% 91.22807017543859% } &[data-emoji='male-judge'] { background-position: 29.82456140350877% 0% } &[data-emoji='male-pilot'] { background-position: 29.82456140350877% 10.526315789473683% } &[data-emoji='man-heart-man'] { background-position: 29.82456140350877% 21.052631578947366% } &[data-emoji='man-kiss-man'] { background-position: 29.82456140350877% 22.807017543859647% } &[data-emoji='man'] { background-position: 29.82456140350877% 24.561403508771928% } &[data-emoji='female-farmer'] { background-position: 29.82456140350877% 35.08771929824561% } &[data-emoji='female-cook'] { background-position: 29.82456140350877% 45.614035087719294% } &[data-emoji='woman_feeding_baby'] { background-position: 29.82456140350877% 56.14035087719298% } &[data-emoji='female-student'] { background-position: 29.82456140350877% 66.66666666666666% } &[data-emoji='female-singer'] { background-position: 29.82456140350877% 77.19298245614034% } &[data-emoji='female-artist'] { background-position: 29.82456140350877% 87.71929824561403% } &[data-emoji='female-teacher'] { background-position: 29.82456140350877% 98.24561403508771% } &[data-emoji='female-factory-worker'] { background-position: 31.57894736842105% 7.017543859649122% } &[data-emoji='woman-boy-boy'] { background-position: 31.57894736842105% 17.543859649122805% } &[data-emoji='woman-boy'] { background-position: 31.57894736842105% 19.298245614035086% } &[data-emoji='woman-girl-boy'] { background-position: 31.57894736842105% 21.052631578947366% } &[data-emoji='woman-girl-girl'] { background-position: 31.57894736842105% 22.807017543859647% } &[data-emoji='woman-girl'] { background-position: 31.57894736842105% 24.561403508771928% } &[data-emoji='woman-woman-boy'] { background-position: 31.57894736842105% 26.31578947368421% } &[data-emoji='woman-woman-boy-boy'] { background-position: 31.57894736842105% 28.07017543859649% } &[data-emoji='woman-woman-girl'] { background-position: 31.57894736842105% 29.82456140350877% } &[data-emoji='woman-woman-girl-boy'] { background-position: 31.57894736842105% 31.57894736842105% } &[data-emoji='woman-woman-girl-girl'] { background-position: 31.57894736842105% 33.33333333333333% } &[data-emoji='female-technologist'] { background-position: 31.57894736842105% 35.08771929824561% } &[data-emoji='female-office-worker'] { background-position: 31.57894736842105% 45.614035087719294% } &[data-emoji='female-mechanic'] { background-position: 31.57894736842105% 56.14035087719298% } &[data-emoji='female-scientist'] { background-position: 31.57894736842105% 66.66666666666666% } &[data-emoji='female-astronaut'] { background-position: 31.57894736842105% 77.19298245614034% } &[data-emoji='female-firefighter'] { background-position: 31.57894736842105% 87.71929824561403% } &[data-emoji='woman_with_probing_cane'] { background-position: 31.57894736842105% 98.24561403508771% } &[data-emoji='red_haired_woman'] { background-position: 33.33333333333333% 7.017543859649122% } &[data-emoji='curly_haired_woman'] { background-position: 33.33333333333333% 17.543859649122805% } &[data-emoji='bald_woman'] { background-position: 33.33333333333333% 28.07017543859649% } &[data-emoji='white_haired_woman'] { background-position: 33.33333333333333% 38.59649122807017% } &[data-emoji='woman_in_motorized_wheelchair'] { background-position: 33.33333333333333% 49.122807017543856% } &[data-emoji='woman_in_manual_wheelchair'] { background-position: 33.33333333333333% 59.64912280701754% } &[data-emoji='female-doctor'] { background-position: 33.33333333333333% 70.17543859649122% } &[data-emoji='female-judge'] { background-position: 33.33333333333333% 80.7017543859649% } &[data-emoji='female-pilot'] { background-position: 33.33333333333333% 91.22807017543859% } &[data-emoji='woman-heart-man'] { background-position: 35.08771929824561% 0% } &[data-emoji='woman-heart-woman'] { background-position: 35.08771929824561% 1.7543859649122806% } &[data-emoji='woman-kiss-man'] { background-position: 35.08771929824561% 3.508771929824561% } &[data-emoji='woman-kiss-woman'] { background-position: 35.08771929824561% 5.263157894736842% } &[data-emoji='woman'] { background-position: 35.08771929824561% 7.017543859649122% } &[data-emoji='family'] { background-position: 35.08771929824561% 17.543859649122805% } &[data-emoji='man_and_woman_holding_hands'] { background-position: 35.08771929824561% 19.298245614035086% } &[data-emoji='two_men_holding_hands'] { background-position: 35.08771929824561% 64.91228070175438% } &[data-emoji='two_women_holding_hands'] { background-position: 36.84210526315789% 8.771929824561402% } &[data-emoji='female-police-officer'] { background-position: 36.84210526315789% 54.3859649122807% } &[data-emoji='male-police-officer'] { background-position: 36.84210526315789% 64.91228070175438% } &[data-emoji='cop'] { background-position: 36.84210526315789% 75.43859649122807% } &[data-emoji='woman-with-bunny-ears-partying'] { background-position: 36.84210526315789% 85.96491228070175% } &[data-emoji='man-with-bunny-ears-partying'] { background-position: 36.84210526315789% 87.71929824561403% } &[data-emoji='dancers'] { background-position: 36.84210526315789% 89.47368421052632% } &[data-emoji='woman_with_veil'] { background-position: 36.84210526315789% 91.22807017543859% } &[data-emoji='man_with_veil'] { background-position: 38.59649122807017% 0% } &[data-emoji='bride_with_veil'] { background-position: 38.59649122807017% 10.526315789473683% } &[data-emoji='blond-haired-woman'] { background-position: 38.59649122807017% 21.052631578947366% } &[data-emoji='blond-haired-man'] { background-position: 38.59649122807017% 31.57894736842105% } &[data-emoji='person_with_blond_hair'] { background-position: 38.59649122807017% 42.10526315789473% } &[data-emoji='man_with_gua_pi_mao'] { background-position: 38.59649122807017% 52.63157894736842% } &[data-emoji='woman-wearing-turban'] { background-position: 38.59649122807017% 63.1578947368421% } &[data-emoji='man-wearing-turban'] { background-position: 38.59649122807017% 73.68421052631578% } &[data-emoji='man_with_turban'] { background-position: 38.59649122807017% 84.21052631578947% } &[data-emoji='older_man'] { background-position: 38.59649122807017% 94.73684210526315% } &[data-emoji='older_woman'] { background-position: 40.35087719298245% 3.508771929824561% } &[data-emoji='baby'] { background-position: 40.35087719298245% 14.035087719298245% } &[data-emoji='female-construction-worker'] { background-position: 40.35087719298245% 24.561403508771928% } &[data-emoji='male-construction-worker'] { background-position: 40.35087719298245% 35.08771929824561% } &[data-emoji='construction_worker'] { background-position: 40.35087719298245% 45.614035087719294% } &[data-emoji='princess'] { background-position: 40.35087719298245% 56.14035087719298% } &[data-emoji='japanese_ogre'] { background-position: 40.35087719298245% 66.66666666666666% } &[data-emoji='japanese_goblin'] { background-position: 40.35087719298245% 68.42105263157895% } &[data-emoji='ghost'] { background-position: 40.35087719298245% 70.17543859649122% } &[data-emoji='angel'] { background-position: 40.35087719298245% 71.9298245614035% } &[data-emoji='alien'] { background-position: 40.35087719298245% 82.45614035087719% } &[data-emoji='space_invader'] { background-position: 40.35087719298245% 84.21052631578947% } &[data-emoji='imp'] { background-position: 40.35087719298245% 85.96491228070175% } &[data-emoji='skull'] { background-position: 40.35087719298245% 87.71929824561403% } &[data-emoji='woman-tipping-hand'] { background-position: 40.35087719298245% 89.47368421052632% } &[data-emoji='man-tipping-hand'] { background-position: 40.35087719298245% 100% } &[data-emoji='information_desk_person'] { background-position: 42.10526315789473% 8.771929824561402% } &[data-emoji='female-guard'] { background-position: 42.10526315789473% 19.298245614035086% } &[data-emoji='male-guard'] { background-position: 42.10526315789473% 29.82456140350877% } &[data-emoji='guardsman'] { background-position: 42.10526315789473% 40.35087719298245% } &[data-emoji='dancer'] { background-position: 42.10526315789473% 50.87719298245614% } &[data-emoji='lipstick'] { background-position: 42.10526315789473% 61.40350877192982% } &[data-emoji='nail_care'] { background-position: 42.10526315789473% 63.1578947368421% } &[data-emoji='woman-getting-massage'] { background-position: 42.10526315789473% 73.68421052631578% } &[data-emoji='man-getting-massage'] { background-position: 42.10526315789473% 84.21052631578947% } &[data-emoji='massage'] { background-position: 42.10526315789473% 94.73684210526315% } &[data-emoji='woman-getting-haircut'] { background-position: 43.859649122807014% 3.508771929824561% } &[data-emoji='man-getting-haircut'] { background-position: 43.859649122807014% 14.035087719298245% } &[data-emoji='haircut'] { background-position: 43.859649122807014% 24.561403508771928% } &[data-emoji='barber'] { background-position: 43.859649122807014% 35.08771929824561% } &[data-emoji='syringe'] { background-position: 43.859649122807014% 36.84210526315789% } &[data-emoji='pill'] { background-position: 43.859649122807014% 38.59649122807017% } &[data-emoji='kiss'] { background-position: 43.859649122807014% 40.35087719298245% } &[data-emoji='love_letter'] { background-position: 43.859649122807014% 42.10526315789473% } &[data-emoji='ring'] { background-position: 43.859649122807014% 43.859649122807014% } &[data-emoji='gem'] { background-position: 43.859649122807014% 45.614035087719294% } &[data-emoji='couplekiss'] { background-position: 43.859649122807014% 47.368421052631575% } &[data-emoji='bouquet'] { background-position: 43.859649122807014% 49.122807017543856% } &[data-emoji='couple_with_heart'] { background-position: 43.859649122807014% 50.87719298245614% } &[data-emoji='wedding'] { background-position: 43.859649122807014% 52.63157894736842% } &[data-emoji='heartbeat'] { background-position: 43.859649122807014% 54.3859649122807% } &[data-emoji='broken_heart'] { background-position: 43.859649122807014% 56.14035087719298% } &[data-emoji='two_hearts'] { background-position: 43.859649122807014% 57.89473684210526% } &[data-emoji='sparkling_heart'] { background-position: 43.859649122807014% 59.64912280701754% } &[data-emoji='heartpulse'] { background-position: 43.859649122807014% 61.40350877192982% } &[data-emoji='cupid'] { background-position: 43.859649122807014% 63.1578947368421% } &[data-emoji='blue_heart'] { background-position: 43.859649122807014% 64.91228070175438% } &[data-emoji='green_heart'] { background-position: 43.859649122807014% 66.66666666666666% } &[data-emoji='yellow_heart'] { background-position: 43.859649122807014% 68.42105263157895% } &[data-emoji='purple_heart'] { background-position: 43.859649122807014% 70.17543859649122% } &[data-emoji='gift_heart'] { background-position: 43.859649122807014% 71.9298245614035% } &[data-emoji='revolving_hearts'] { background-position: 43.859649122807014% 73.68421052631578% } &[data-emoji='heart_decoration'] { background-position: 43.859649122807014% 75.43859649122807% } &[data-emoji='diamond_shape_with_a_dot_inside'] { background-position: 43.859649122807014% 77.19298245614034% } &[data-emoji='bulb'] { background-position: 43.859649122807014% 78.94736842105263% } &[data-emoji='anger'] { background-position: 43.859649122807014% 80.7017543859649% } &[data-emoji='bomb'] { background-position: 43.859649122807014% 82.45614035087719% } &[data-emoji='zzz'] { background-position: 43.859649122807014% 84.21052631578947% } &[data-emoji='boom'] { background-position: 43.859649122807014% 85.96491228070175% } &[data-emoji='sweat_drops'] { background-position: 43.859649122807014% 87.71929824561403% } &[data-emoji='droplet'] { background-position: 43.859649122807014% 89.47368421052632% } &[data-emoji='dash'] { background-position: 43.859649122807014% 91.22807017543859% } &[data-emoji='hankey'] { background-position: 43.859649122807014% 92.98245614035088% } &[data-emoji='muscle'] { background-position: 43.859649122807014% 94.73684210526315% } &[data-emoji='dizzy'] { background-position: 45.614035087719294% 3.508771929824561% } &[data-emoji='speech_balloon'] { background-position: 45.614035087719294% 5.263157894736842% } &[data-emoji='thought_balloon'] { background-position: 45.614035087719294% 7.017543859649122% } &[data-emoji='white_flower'] { background-position: 45.614035087719294% 8.771929824561402% } &[data-emoji='100'] { background-position: 45.614035087719294% 10.526315789473683% } &[data-emoji='moneybag'] { background-position: 45.614035087719294% 12.280701754385964% } &[data-emoji='currency_exchange'] { background-position: 45.614035087719294% 14.035087719298245% } &[data-emoji='heavy_dollar_sign'] { background-position: 45.614035087719294% 15.789473684210526% } &[data-emoji='credit_card'] { background-position: 45.614035087719294% 17.543859649122805% } &[data-emoji='yen'] { background-position: 45.614035087719294% 19.298245614035086% } &[data-emoji='dollar'] { background-position: 45.614035087719294% 21.052631578947366% } &[data-emoji='euro'] { background-position: 45.614035087719294% 22.807017543859647% } &[data-emoji='pound'] { background-position: 45.614035087719294% 24.561403508771928% } &[data-emoji='money_with_wings'] { background-position: 45.614035087719294% 26.31578947368421% } &[data-emoji='chart'] { background-position: 45.614035087719294% 28.07017543859649% } &[data-emoji='seat'] { background-position: 45.614035087719294% 29.82456140350877% } &[data-emoji='computer'] { background-position: 45.614035087719294% 31.57894736842105% } &[data-emoji='briefcase'] { background-position: 45.614035087719294% 33.33333333333333% } &[data-emoji='minidisc'] { background-position: 45.614035087719294% 35.08771929824561% } &[data-emoji='floppy_disk'] { background-position: 45.614035087719294% 36.84210526315789% } &[data-emoji='cd'] { background-position: 45.614035087719294% 38.59649122807017% } &[data-emoji='dvd'] { background-position: 45.614035087719294% 40.35087719298245% } &[data-emoji='file_folder'] { background-position: 45.614035087719294% 42.10526315789473% } &[data-emoji='open_file_folder'] { background-position: 45.614035087719294% 43.859649122807014% } &[data-emoji='page_with_curl'] { background-position: 45.614035087719294% 45.614035087719294% } &[data-emoji='page_facing_up'] { background-position: 45.614035087719294% 47.368421052631575% } &[data-emoji='date'] { background-position: 45.614035087719294% 49.122807017543856% } &[data-emoji='calendar'] { background-position: 45.614035087719294% 50.87719298245614% } &[data-emoji='card_index'] { background-position: 45.614035087719294% 52.63157894736842% } &[data-emoji='chart_with_upwards_trend'] { background-position: 45.614035087719294% 54.3859649122807% } &[data-emoji='chart_with_downwards_trend'] { background-position: 45.614035087719294% 56.14035087719298% } &[data-emoji='bar_chart'] { background-position: 45.614035087719294% 57.89473684210526% } &[data-emoji='clipboard'] { background-position: 45.614035087719294% 59.64912280701754% } &[data-emoji='pushpin'] { background-position: 45.614035087719294% 61.40350877192982% } &[data-emoji='round_pushpin'] { background-position: 45.614035087719294% 63.1578947368421% } &[data-emoji='paperclip'] { background-position: 45.614035087719294% 64.91228070175438% } &[data-emoji='straight_ruler'] { background-position: 45.614035087719294% 66.66666666666666% } &[data-emoji='triangular_ruler'] { background-position: 45.614035087719294% 68.42105263157895% } &[data-emoji='bookmark_tabs'] { background-position: 45.614035087719294% 70.17543859649122% } &[data-emoji='ledger'] { background-position: 45.614035087719294% 71.9298245614035% } &[data-emoji='notebook'] { background-position: 45.614035087719294% 73.68421052631578% } &[data-emoji='notebook_with_decorative_cover'] { background-position: 45.614035087719294% 75.43859649122807% } &[data-emoji='closed_book'] { background-position: 45.614035087719294% 77.19298245614034% } &[data-emoji='book'] { background-position: 45.614035087719294% 78.94736842105263% } &[data-emoji='green_book'] { background-position: 45.614035087719294% 80.7017543859649% } &[data-emoji='blue_book'] { background-position: 45.614035087719294% 82.45614035087719% } &[data-emoji='orange_book'] { background-position: 45.614035087719294% 84.21052631578947% } &[data-emoji='books'] { background-position: 45.614035087719294% 85.96491228070175% } &[data-emoji='name_badge'] { background-position: 45.614035087719294% 87.71929824561403% } &[data-emoji='scroll'] { background-position: 45.614035087719294% 89.47368421052632% } &[data-emoji='memo'] { background-position: 45.614035087719294% 91.22807017543859% } &[data-emoji='telephone_receiver'] { background-position: 45.614035087719294% 92.98245614035088% } &[data-emoji='pager'] { background-position: 45.614035087719294% 94.73684210526315% } &[data-emoji='fax'] { background-position: 45.614035087719294% 96.49122807017544% } &[data-emoji='satellite_antenna'] { background-position: 45.614035087719294% 98.24561403508771% } &[data-emoji='loudspeaker'] { background-position: 45.614035087719294% 100% } &[data-emoji='mega'] { background-position: 47.368421052631575% 0% } &[data-emoji='outbox_tray'] { background-position: 47.368421052631575% 1.7543859649122806% } &[data-emoji='inbox_tray'] { background-position: 47.368421052631575% 3.508771929824561% } &[data-emoji='package'] { background-position: 47.368421052631575% 5.263157894736842% } &[data-emoji='e-mail'] { background-position: 47.368421052631575% 7.017543859649122% } &[data-emoji='incoming_envelope'] { background-position: 47.368421052631575% 8.771929824561402% } &[data-emoji='envelope_with_arrow'] { background-position: 47.368421052631575% 10.526315789473683% } &[data-emoji='mailbox_closed'] { background-position: 47.368421052631575% 12.280701754385964% } &[data-emoji='mailbox'] { background-position: 47.368421052631575% 14.035087719298245% } &[data-emoji='mailbox_with_mail'] { background-position: 47.368421052631575% 15.789473684210526% } &[data-emoji='mailbox_with_no_mail'] { background-position: 47.368421052631575% 17.543859649122805% } &[data-emoji='postbox'] { background-position: 47.368421052631575% 19.298245614035086% } &[data-emoji='postal_horn'] { background-position: 47.368421052631575% 21.052631578947366% } &[data-emoji='newspaper'] { background-position: 47.368421052631575% 22.807017543859647% } &[data-emoji='iphone'] { background-position: 47.368421052631575% 24.561403508771928% } &[data-emoji='calling'] { background-position: 47.368421052631575% 26.31578947368421% } &[data-emoji='vibration_mode'] { background-position: 47.368421052631575% 28.07017543859649% } &[data-emoji='mobile_phone_off'] { background-position: 47.368421052631575% 29.82456140350877% } &[data-emoji='no_mobile_phones'] { background-position: 47.368421052631575% 31.57894736842105% } &[data-emoji='signal_strength'] { background-position: 47.368421052631575% 33.33333333333333% } &[data-emoji='camera'] { background-position: 47.368421052631575% 35.08771929824561% } &[data-emoji='camera_with_flash'] { background-position: 47.368421052631575% 36.84210526315789% } &[data-emoji='video_camera'] { background-position: 47.368421052631575% 38.59649122807017% } &[data-emoji='tv'] { background-position: 47.368421052631575% 40.35087719298245% } &[data-emoji='radio'] { background-position: 47.368421052631575% 42.10526315789473% } &[data-emoji='vhs'] { background-position: 47.368421052631575% 43.859649122807014% } &[data-emoji='film_projector'] { background-position: 47.368421052631575% 45.614035087719294% } &[data-emoji='prayer_beads'] { background-position: 47.368421052631575% 47.368421052631575% } &[data-emoji='twisted_rightwards_arrows'] { background-position: 47.368421052631575% 49.122807017543856% } &[data-emoji='repeat'] { background-position: 47.368421052631575% 50.87719298245614% } &[data-emoji='repeat_one'] { background-position: 47.368421052631575% 52.63157894736842% } &[data-emoji='arrows_clockwise'] { background-position: 47.368421052631575% 54.3859649122807% } &[data-emoji='arrows_counterclockwise'] { background-position: 47.368421052631575% 56.14035087719298% } &[data-emoji='low_brightness'] { background-position: 47.368421052631575% 57.89473684210526% } &[data-emoji='high_brightness'] { background-position: 47.368421052631575% 59.64912280701754% } &[data-emoji='mute'] { background-position: 47.368421052631575% 61.40350877192982% } &[data-emoji='speaker'] { background-position: 47.368421052631575% 63.1578947368421% } &[data-emoji='sound'] { background-position: 47.368421052631575% 64.91228070175438% } &[data-emoji='loud_sound'] { background-position: 47.368421052631575% 66.66666666666666% } &[data-emoji='battery'] { background-position: 47.368421052631575% 68.42105263157895% } &[data-emoji='electric_plug'] { background-position: 47.368421052631575% 70.17543859649122% } &[data-emoji='mag'] { background-position: 47.368421052631575% 71.9298245614035% } &[data-emoji='mag_right'] { background-position: 47.368421052631575% 73.68421052631578% } &[data-emoji='lock_with_ink_pen'] { background-position: 47.368421052631575% 75.43859649122807% } &[data-emoji='closed_lock_with_key'] { background-position: 47.368421052631575% 77.19298245614034% } &[data-emoji='key'] { background-position: 47.368421052631575% 78.94736842105263% } &[data-emoji='lock'] { background-position: 47.368421052631575% 80.7017543859649% } &[data-emoji='unlock'] { background-position: 47.368421052631575% 82.45614035087719% } &[data-emoji='bell'] { background-position: 47.368421052631575% 84.21052631578947% } &[data-emoji='no_bell'] { background-position: 47.368421052631575% 85.96491228070175% } &[data-emoji='bookmark'] { background-position: 47.368421052631575% 87.71929824561403% } &[data-emoji='link'] { background-position: 47.368421052631575% 89.47368421052632% } &[data-emoji='radio_button'] { background-position: 47.368421052631575% 91.22807017543859% } &[data-emoji='back'] { background-position: 47.368421052631575% 92.98245614035088% } &[data-emoji='end'] { background-position: 47.368421052631575% 94.73684210526315% } &[data-emoji='on'] { background-position: 47.368421052631575% 96.49122807017544% } &[data-emoji='soon'] { background-position: 47.368421052631575% 98.24561403508771% } &[data-emoji='top'] { background-position: 47.368421052631575% 100% } &[data-emoji='underage'] { background-position: 49.122807017543856% 0% } &[data-emoji='keycap_ten'] { background-position: 49.122807017543856% 1.7543859649122806% } &[data-emoji='capital_abcd'] { background-position: 49.122807017543856% 3.508771929824561% } &[data-emoji='abcd'] { background-position: 49.122807017543856% 5.263157894736842% } &[data-emoji='1234'] { background-position: 49.122807017543856% 7.017543859649122% } &[data-emoji='symbols'] { background-position: 49.122807017543856% 8.771929824561402% } &[data-emoji='abc'] { background-position: 49.122807017543856% 10.526315789473683% } &[data-emoji='fire'] { background-position: 49.122807017543856% 12.280701754385964% } &[data-emoji='flashlight'] { background-position: 49.122807017543856% 14.035087719298245% } &[data-emoji='wrench'] { background-position: 49.122807017543856% 15.789473684210526% } &[data-emoji='hammer'] { background-position: 49.122807017543856% 17.543859649122805% } &[data-emoji='nut_and_bolt'] { background-position: 49.122807017543856% 19.298245614035086% } &[data-emoji='hocho'] { background-position: 49.122807017543856% 21.052631578947366% } &[data-emoji='gun'] { background-position: 49.122807017543856% 22.807017543859647% } &[data-emoji='microscope'] { background-position: 49.122807017543856% 24.561403508771928% } &[data-emoji='telescope'] { background-position: 49.122807017543856% 26.31578947368421% } &[data-emoji='crystal_ball'] { background-position: 49.122807017543856% 28.07017543859649% } &[data-emoji='six_pointed_star'] { background-position: 49.122807017543856% 29.82456140350877% } &[data-emoji='beginner'] { background-position: 49.122807017543856% 31.57894736842105% } &[data-emoji='trident'] { background-position: 49.122807017543856% 33.33333333333333% } &[data-emoji='black_square_button'] { background-position: 49.122807017543856% 35.08771929824561% } &[data-emoji='white_square_button'] { background-position: 49.122807017543856% 36.84210526315789% } &[data-emoji='red_circle'] { background-position: 49.122807017543856% 38.59649122807017% } &[data-emoji='large_blue_circle'] { background-position: 49.122807017543856% 40.35087719298245% } &[data-emoji='large_orange_diamond'] { background-position: 49.122807017543856% 42.10526315789473% } &[data-emoji='large_blue_diamond'] { background-position: 49.122807017543856% 43.859649122807014% } &[data-emoji='small_orange_diamond'] { background-position: 49.122807017543856% 45.614035087719294% } &[data-emoji='small_blue_diamond'] { background-position: 49.122807017543856% 47.368421052631575% } &[data-emoji='small_red_triangle'] { background-position: 49.122807017543856% 49.122807017543856% } &[data-emoji='small_red_triangle_down'] { background-position: 49.122807017543856% 50.87719298245614% } &[data-emoji='arrow_up_small'] { background-position: 49.122807017543856% 52.63157894736842% } &[data-emoji='arrow_down_small'] { background-position: 49.122807017543856% 54.3859649122807% } &[data-emoji='om_symbol'] { background-position: 49.122807017543856% 56.14035087719298% } &[data-emoji='dove_of_peace'] { background-position: 49.122807017543856% 57.89473684210526% } &[data-emoji='kaaba'] { background-position: 49.122807017543856% 59.64912280701754% } &[data-emoji='mosque'] { background-position: 49.122807017543856% 61.40350877192982% } &[data-emoji='synagogue'] { background-position: 49.122807017543856% 63.1578947368421% } &[data-emoji='menorah_with_nine_branches'] { background-position: 49.122807017543856% 64.91228070175438% } &[data-emoji='clock1'] { background-position: 49.122807017543856% 66.66666666666666% } &[data-emoji='clock2'] { background-position: 49.122807017543856% 68.42105263157895% } &[data-emoji='clock3'] { background-position: 49.122807017543856% 70.17543859649122% } &[data-emoji='clock4'] { background-position: 49.122807017543856% 71.9298245614035% } &[data-emoji='clock5'] { background-position: 49.122807017543856% 73.68421052631578% } &[data-emoji='clock6'] { background-position: 49.122807017543856% 75.43859649122807% } &[data-emoji='clock7'] { background-position: 49.122807017543856% 77.19298245614034% } &[data-emoji='clock8'] { background-position: 49.122807017543856% 78.94736842105263% } &[data-emoji='clock9'] { background-position: 49.122807017543856% 80.7017543859649% } &[data-emoji='clock10'] { background-position: 49.122807017543856% 82.45614035087719% } &[data-emoji='clock11'] { background-position: 49.122807017543856% 84.21052631578947% } &[data-emoji='clock12'] { background-position: 49.122807017543856% 85.96491228070175% } &[data-emoji='clock130'] { background-position: 49.122807017543856% 87.71929824561403% } &[data-emoji='clock230'] { background-position: 49.122807017543856% 89.47368421052632% } &[data-emoji='clock330'] { background-position: 49.122807017543856% 91.22807017543859% } &[data-emoji='clock430'] { background-position: 49.122807017543856% 92.98245614035088% } &[data-emoji='clock530'] { background-position: 49.122807017543856% 94.73684210526315% } &[data-emoji='clock630'] { background-position: 49.122807017543856% 96.49122807017544% } &[data-emoji='clock730'] { background-position: 49.122807017543856% 98.24561403508771% } &[data-emoji='clock830'] { background-position: 49.122807017543856% 100% } &[data-emoji='clock930'] { background-position: 50.87719298245614% 0% } &[data-emoji='clock1030'] { background-position: 50.87719298245614% 1.7543859649122806% } &[data-emoji='clock1130'] { background-position: 50.87719298245614% 3.508771929824561% } &[data-emoji='clock1230'] { background-position: 50.87719298245614% 5.263157894736842% } &[data-emoji='candle'] { background-position: 50.87719298245614% 7.017543859649122% } &[data-emoji='mantelpiece_clock'] { background-position: 50.87719298245614% 8.771929824561402% } &[data-emoji='hole'] { background-position: 50.87719298245614% 10.526315789473683% } &[data-emoji='man_in_business_suit_levitating'] { background-position: 50.87719298245614% 12.280701754385964% } &[data-emoji='female-detective'] { background-position: 50.87719298245614% 22.807017543859647% } &[data-emoji='male-detective'] { background-position: 50.87719298245614% 33.33333333333333% } &[data-emoji='sleuth_or_spy'] { background-position: 50.87719298245614% 43.859649122807014% } &[data-emoji='dark_sunglasses'] { background-position: 50.87719298245614% 54.3859649122807% } &[data-emoji='spider'] { background-position: 50.87719298245614% 56.14035087719298% } &[data-emoji='spider_web'] { background-position: 50.87719298245614% 57.89473684210526% } &[data-emoji='joystick'] { background-position: 50.87719298245614% 59.64912280701754% } &[data-emoji='man_dancing'] { background-position: 50.87719298245614% 61.40350877192982% } &[data-emoji='linked_paperclips'] { background-position: 50.87719298245614% 71.9298245614035% } &[data-emoji='lower_left_ballpoint_pen'] { background-position: 50.87719298245614% 73.68421052631578% } &[data-emoji='lower_left_fountain_pen'] { background-position: 50.87719298245614% 75.43859649122807% } &[data-emoji='lower_left_paintbrush'] { background-position: 50.87719298245614% 77.19298245614034% } &[data-emoji='lower_left_crayon'] { background-position: 50.87719298245614% 78.94736842105263% } &[data-emoji='raised_hand_with_fingers_splayed'] { background-position: 50.87719298245614% 80.7017543859649% } &[data-emoji='middle_finger'] { background-position: 50.87719298245614% 91.22807017543859% } &[data-emoji='spock-hand'] { background-position: 52.63157894736842% 0% } &[data-emoji='black_heart'] { background-position: 52.63157894736842% 10.526315789473683% } &[data-emoji='desktop_computer'] { background-position: 52.63157894736842% 12.280701754385964% } &[data-emoji='printer'] { background-position: 52.63157894736842% 14.035087719298245% } &[data-emoji='three_button_mouse'] { background-position: 52.63157894736842% 15.789473684210526% } &[data-emoji='trackball'] { background-position: 52.63157894736842% 17.543859649122805% } &[data-emoji='frame_with_picture'] { background-position: 52.63157894736842% 19.298245614035086% } &[data-emoji='card_index_dividers'] { background-position: 52.63157894736842% 21.052631578947366% } &[data-emoji='card_file_box'] { background-position: 52.63157894736842% 22.807017543859647% } &[data-emoji='file_cabinet'] { background-position: 52.63157894736842% 24.561403508771928% } &[data-emoji='wastebasket'] { background-position: 52.63157894736842% 26.31578947368421% } &[data-emoji='spiral_note_pad'] { background-position: 52.63157894736842% 28.07017543859649% } &[data-emoji='spiral_calendar_pad'] { background-position: 52.63157894736842% 29.82456140350877% } &[data-emoji='compression'] { background-position: 52.63157894736842% 31.57894736842105% } &[data-emoji='old_key'] { background-position: 52.63157894736842% 33.33333333333333% } &[data-emoji='rolled_up_newspaper'] { background-position: 52.63157894736842% 35.08771929824561% } &[data-emoji='dagger_knife'] { background-position: 52.63157894736842% 36.84210526315789% } &[data-emoji='speaking_head_in_silhouette'] { background-position: 52.63157894736842% 38.59649122807017% } &[data-emoji='left_speech_bubble'] { background-position: 52.63157894736842% 40.35087719298245% } &[data-emoji='right_anger_bubble'] { background-position: 52.63157894736842% 42.10526315789473% } &[data-emoji='ballot_box_with_ballot'] { background-position: 52.63157894736842% 43.859649122807014% } &[data-emoji='world_map'] { background-position: 52.63157894736842% 45.614035087719294% } &[data-emoji='mount_fuji'] { background-position: 52.63157894736842% 47.368421052631575% } &[data-emoji='tokyo_tower'] { background-position: 52.63157894736842% 49.122807017543856% } &[data-emoji='statue_of_liberty'] { background-position: 52.63157894736842% 50.87719298245614% } &[data-emoji='japan'] { background-position: 52.63157894736842% 52.63157894736842% } &[data-emoji='moyai'] { background-position: 52.63157894736842% 54.3859649122807% } &[data-emoji='grinning'] { background-position: 52.63157894736842% 56.14035087719298% } &[data-emoji='grin'] { background-position: 52.63157894736842% 57.89473684210526% } &[data-emoji='joy'] { background-position: 52.63157894736842% 59.64912280701754% } &[data-emoji='smiley'] { background-position: 52.63157894736842% 61.40350877192982% } &[data-emoji='smile'] { background-position: 52.63157894736842% 63.1578947368421% } &[data-emoji='sweat_smile'] { background-position: 52.63157894736842% 64.91228070175438% } &[data-emoji='laughing'] { background-position: 52.63157894736842% 66.66666666666666% } &[data-emoji='innocent'] { background-position: 52.63157894736842% 68.42105263157895% } &[data-emoji='smiling_imp'] { background-position: 52.63157894736842% 70.17543859649122% } &[data-emoji='wink'] { background-position: 52.63157894736842% 71.9298245614035% } &[data-emoji='blush'] { background-position: 52.63157894736842% 73.68421052631578% } &[data-emoji='yum'] { background-position: 52.63157894736842% 75.43859649122807% } &[data-emoji='relieved'] { background-position: 52.63157894736842% 77.19298245614034% } &[data-emoji='heart_eyes'] { background-position: 52.63157894736842% 78.94736842105263% } &[data-emoji='sunglasses'] { background-position: 52.63157894736842% 80.7017543859649% } &[data-emoji='smirk'] { background-position: 52.63157894736842% 82.45614035087719% } &[data-emoji='neutral_face'] { background-position: 52.63157894736842% 84.21052631578947% } &[data-emoji='expressionless'] { background-position: 52.63157894736842% 85.96491228070175% } &[data-emoji='unamused'] { background-position: 52.63157894736842% 87.71929824561403% } &[data-emoji='sweat'] { background-position: 52.63157894736842% 89.47368421052632% } &[data-emoji='pensive'] { background-position: 52.63157894736842% 91.22807017543859% } &[data-emoji='confused'] { background-position: 52.63157894736842% 92.98245614035088% } &[data-emoji='confounded'] { background-position: 52.63157894736842% 94.73684210526315% } &[data-emoji='kissing'] { background-position: 52.63157894736842% 96.49122807017544% } &[data-emoji='kissing_heart'] { background-position: 52.63157894736842% 98.24561403508771% } &[data-emoji='kissing_smiling_eyes'] { background-position: 52.63157894736842% 100% } &[data-emoji='kissing_closed_eyes'] { background-position: 54.3859649122807% 0% } &[data-emoji='stuck_out_tongue'] { background-position: 54.3859649122807% 1.7543859649122806% } &[data-emoji='stuck_out_tongue_winking_eye'] { background-position: 54.3859649122807% 3.508771929824561% } &[data-emoji='stuck_out_tongue_closed_eyes'] { background-position: 54.3859649122807% 5.263157894736842% } &[data-emoji='disappointed'] { background-position: 54.3859649122807% 7.017543859649122% } &[data-emoji='worried'] { background-position: 54.3859649122807% 8.771929824561402% } &[data-emoji='angry'] { background-position: 54.3859649122807% 10.526315789473683% } &[data-emoji='rage'] { background-position: 54.3859649122807% 12.280701754385964% } &[data-emoji='cry'] { background-position: 54.3859649122807% 14.035087719298245% } &[data-emoji='persevere'] { background-position: 54.3859649122807% 15.789473684210526% } &[data-emoji='triumph'] { background-position: 54.3859649122807% 17.543859649122805% } &[data-emoji='disappointed_relieved'] { background-position: 54.3859649122807% 19.298245614035086% } &[data-emoji='frowning'] { background-position: 54.3859649122807% 21.052631578947366% } &[data-emoji='anguished'] { background-position: 54.3859649122807% 22.807017543859647% } &[data-emoji='fearful'] { background-position: 54.3859649122807% 24.561403508771928% } &[data-emoji='weary'] { background-position: 54.3859649122807% 26.31578947368421% } &[data-emoji='sleepy'] { background-position: 54.3859649122807% 28.07017543859649% } &[data-emoji='tired_face'] { background-position: 54.3859649122807% 29.82456140350877% } &[data-emoji='grimacing'] { background-position: 54.3859649122807% 31.57894736842105% } &[data-emoji='sob'] { background-position: 54.3859649122807% 33.33333333333333% } &[data-emoji='open_mouth'] { background-position: 54.3859649122807% 35.08771929824561% } &[data-emoji='hushed'] { background-position: 54.3859649122807% 36.84210526315789% } &[data-emoji='cold_sweat'] { background-position: 54.3859649122807% 38.59649122807017% } &[data-emoji='scream'] { background-position: 54.3859649122807% 40.35087719298245% } &[data-emoji='astonished'] { background-position: 54.3859649122807% 42.10526315789473% } &[data-emoji='flushed'] { background-position: 54.3859649122807% 43.859649122807014% } &[data-emoji='sleeping'] { background-position: 54.3859649122807% 45.614035087719294% } &[data-emoji='dizzy_face'] { background-position: 54.3859649122807% 47.368421052631575% } &[data-emoji='no_mouth'] { background-position: 54.3859649122807% 49.122807017543856% } &[data-emoji='mask'] { background-position: 54.3859649122807% 50.87719298245614% } &[data-emoji='smile_cat'] { background-position: 54.3859649122807% 52.63157894736842% } &[data-emoji='joy_cat'] { background-position: 54.3859649122807% 54.3859649122807% } &[data-emoji='smiley_cat'] { background-position: 54.3859649122807% 56.14035087719298% } &[data-emoji='heart_eyes_cat'] { background-position: 54.3859649122807% 57.89473684210526% } &[data-emoji='smirk_cat'] { background-position: 54.3859649122807% 59.64912280701754% } &[data-emoji='kissing_cat'] { background-position: 54.3859649122807% 61.40350877192982% } &[data-emoji='pouting_cat'] { background-position: 54.3859649122807% 63.1578947368421% } &[data-emoji='crying_cat_face'] { background-position: 54.3859649122807% 64.91228070175438% } &[data-emoji='scream_cat'] { background-position: 54.3859649122807% 66.66666666666666% } &[data-emoji='slightly_frowning_face'] { background-position: 54.3859649122807% 68.42105263157895% } &[data-emoji='slightly_smiling_face'] { background-position: 54.3859649122807% 70.17543859649122% } &[data-emoji='upside_down_face'] { background-position: 54.3859649122807% 71.9298245614035% } &[data-emoji='face_with_rolling_eyes'] { background-position: 54.3859649122807% 73.68421052631578% } &[data-emoji='woman-gesturing-no'] { background-position: 54.3859649122807% 75.43859649122807% } &[data-emoji='man-gesturing-no'] { background-position: 54.3859649122807% 85.96491228070175% } &[data-emoji='no_good'] { background-position: 54.3859649122807% 96.49122807017544% } &[data-emoji='woman-gesturing-ok'] { background-position: 56.14035087719298% 5.263157894736842% } &[data-emoji='man-gesturing-ok'] { background-position: 56.14035087719298% 15.789473684210526% } &[data-emoji='ok_woman'] { background-position: 56.14035087719298% 26.31578947368421% } &[data-emoji='woman-bowing'] { background-position: 56.14035087719298% 36.84210526315789% } &[data-emoji='man-bowing'] { background-position: 56.14035087719298% 47.368421052631575% } &[data-emoji='bow'] { background-position: 56.14035087719298% 57.89473684210526% } &[data-emoji='see_no_evil'] { background-position: 56.14035087719298% 68.42105263157895% } &[data-emoji='hear_no_evil'] { background-position: 56.14035087719298% 70.17543859649122% } &[data-emoji='speak_no_evil'] { background-position: 56.14035087719298% 71.9298245614035% } &[data-emoji='woman-raising-hand'] { background-position: 56.14035087719298% 73.68421052631578% } &[data-emoji='man-raising-hand'] { background-position: 56.14035087719298% 84.21052631578947% } &[data-emoji='raising_hand'] { background-position: 56.14035087719298% 94.73684210526315% } &[data-emoji='raised_hands'] { background-position: 57.89473684210526% 3.508771929824561% } &[data-emoji='woman-frowning'] { background-position: 57.89473684210526% 14.035087719298245% } &[data-emoji='man-frowning'] { background-position: 57.89473684210526% 24.561403508771928% } &[data-emoji='person_frowning'] { background-position: 57.89473684210526% 35.08771929824561% } &[data-emoji='woman-pouting'] { background-position: 57.89473684210526% 45.614035087719294% } &[data-emoji='man-pouting'] { background-position: 57.89473684210526% 56.14035087719298% } &[data-emoji='person_with_pouting_face'] { background-position: 57.89473684210526% 66.66666666666666% } &[data-emoji='pray'] { background-position: 57.89473684210526% 77.19298245614034% } &[data-emoji='rocket'] { background-position: 57.89473684210526% 87.71929824561403% } &[data-emoji='helicopter'] { background-position: 57.89473684210526% 89.47368421052632% } &[data-emoji='steam_locomotive'] { background-position: 57.89473684210526% 91.22807017543859% } &[data-emoji='railway_car'] { background-position: 57.89473684210526% 92.98245614035088% } &[data-emoji='bullettrain_side'] { background-position: 57.89473684210526% 94.73684210526315% } &[data-emoji='bullettrain_front'] { background-position: 57.89473684210526% 96.49122807017544% } &[data-emoji='train2'] { background-position: 57.89473684210526% 98.24561403508771% } &[data-emoji='metro'] { background-position: 57.89473684210526% 100% } &[data-emoji='light_rail'] { background-position: 59.64912280701754% 0% } &[data-emoji='station'] { background-position: 59.64912280701754% 1.7543859649122806% } &[data-emoji='tram'] { background-position: 59.64912280701754% 3.508771929824561% } &[data-emoji='train'] { background-position: 59.64912280701754% 5.263157894736842% } &[data-emoji='bus'] { background-position: 59.64912280701754% 7.017543859649122% } &[data-emoji='oncoming_bus'] { background-position: 59.64912280701754% 8.771929824561402% } &[data-emoji='trolleybus'] { background-position: 59.64912280701754% 10.526315789473683% } &[data-emoji='busstop'] { background-position: 59.64912280701754% 12.280701754385964% } &[data-emoji='minibus'] { background-position: 59.64912280701754% 14.035087719298245% } &[data-emoji='ambulance'] { background-position: 59.64912280701754% 15.789473684210526% } &[data-emoji='fire_engine'] { background-position: 59.64912280701754% 17.543859649122805% } &[data-emoji='police_car'] { background-position: 59.64912280701754% 19.298245614035086% } &[data-emoji='oncoming_police_car'] { background-position: 59.64912280701754% 21.052631578947366% } &[data-emoji='taxi'] { background-position: 59.64912280701754% 22.807017543859647% } &[data-emoji='oncoming_taxi'] { background-position: 59.64912280701754% 24.561403508771928% } &[data-emoji='car'] { background-position: 59.64912280701754% 26.31578947368421% } &[data-emoji='oncoming_automobile'] { background-position: 59.64912280701754% 28.07017543859649% } &[data-emoji='blue_car'] { background-position: 59.64912280701754% 29.82456140350877% } &[data-emoji='truck'] { background-position: 59.64912280701754% 31.57894736842105% } &[data-emoji='articulated_lorry'] { background-position: 59.64912280701754% 33.33333333333333% } &[data-emoji='tractor'] { background-position: 59.64912280701754% 35.08771929824561% } &[data-emoji='monorail'] { background-position: 59.64912280701754% 36.84210526315789% } &[data-emoji='mountain_railway'] { background-position: 59.64912280701754% 38.59649122807017% } &[data-emoji='suspension_railway'] { background-position: 59.64912280701754% 40.35087719298245% } &[data-emoji='mountain_cableway'] { background-position: 59.64912280701754% 42.10526315789473% } &[data-emoji='aerial_tramway'] { background-position: 59.64912280701754% 43.859649122807014% } &[data-emoji='ship'] { background-position: 59.64912280701754% 45.614035087719294% } &[data-emoji='woman-rowing-boat'] { background-position: 59.64912280701754% 47.368421052631575% } &[data-emoji='man-rowing-boat'] { background-position: 59.64912280701754% 57.89473684210526% } &[data-emoji='rowboat'] { background-position: 59.64912280701754% 68.42105263157895% } &[data-emoji='speedboat'] { background-position: 59.64912280701754% 78.94736842105263% } &[data-emoji='traffic_light'] { background-position: 59.64912280701754% 80.7017543859649% } &[data-emoji='vertical_traffic_light'] { background-position: 59.64912280701754% 82.45614035087719% } &[data-emoji='construction'] { background-position: 59.64912280701754% 84.21052631578947% } &[data-emoji='rotating_light'] { background-position: 59.64912280701754% 85.96491228070175% } &[data-emoji='triangular_flag_on_post'] { background-position: 59.64912280701754% 87.71929824561403% } &[data-emoji='door'] { background-position: 59.64912280701754% 89.47368421052632% } &[data-emoji='no_entry_sign'] { background-position: 59.64912280701754% 91.22807017543859% } &[data-emoji='smoking'] { background-position: 59.64912280701754% 92.98245614035088% } &[data-emoji='no_smoking'] { background-position: 59.64912280701754% 94.73684210526315% } &[data-emoji='put_litter_in_its_place'] { background-position: 59.64912280701754% 96.49122807017544% } &[data-emoji='do_not_litter'] { background-position: 59.64912280701754% 98.24561403508771% } &[data-emoji='potable_water'] { background-position: 59.64912280701754% 100% } &[data-emoji='non-potable_water'] { background-position: 61.40350877192982% 0% } &[data-emoji='bike'] { background-position: 61.40350877192982% 1.7543859649122806% } &[data-emoji='no_bicycles'] { background-position: 61.40350877192982% 3.508771929824561% } &[data-emoji='woman-biking'] { background-position: 61.40350877192982% 5.263157894736842% } &[data-emoji='man-biking'] { background-position: 61.40350877192982% 15.789473684210526% } &[data-emoji='bicyclist'] { background-position: 61.40350877192982% 26.31578947368421% } &[data-emoji='woman-mountain-biking'] { background-position: 61.40350877192982% 36.84210526315789% } &[data-emoji='man-mountain-biking'] { background-position: 61.40350877192982% 47.368421052631575% } &[data-emoji='mountain_bicyclist'] { background-position: 61.40350877192982% 57.89473684210526% } &[data-emoji='woman-walking'] { background-position: 61.40350877192982% 68.42105263157895% } &[data-emoji='man-walking'] { background-position: 61.40350877192982% 78.94736842105263% } &[data-emoji='walking'] { background-position: 61.40350877192982% 89.47368421052632% } &[data-emoji='no_pedestrians'] { background-position: 61.40350877192982% 100% } &[data-emoji='children_crossing'] { background-position: 63.1578947368421% 0% } &[data-emoji='mens'] { background-position: 63.1578947368421% 1.7543859649122806% } &[data-emoji='womens'] { background-position: 63.1578947368421% 3.508771929824561% } &[data-emoji='restroom'] { background-position: 63.1578947368421% 5.263157894736842% } &[data-emoji='baby_symbol'] { background-position: 63.1578947368421% 7.017543859649122% } &[data-emoji='toilet'] { background-position: 63.1578947368421% 8.771929824561402% } &[data-emoji='wc'] { background-position: 63.1578947368421% 10.526315789473683% } &[data-emoji='shower'] { background-position: 63.1578947368421% 12.280701754385964% } &[data-emoji='bath'] { background-position: 63.1578947368421% 14.035087719298245% } &[data-emoji='bathtub'] { background-position: 63.1578947368421% 24.561403508771928% } &[data-emoji='passport_control'] { background-position: 63.1578947368421% 26.31578947368421% } &[data-emoji='customs'] { background-position: 63.1578947368421% 28.07017543859649% } &[data-emoji='baggage_claim'] { background-position: 63.1578947368421% 29.82456140350877% } &[data-emoji='left_luggage'] { background-position: 63.1578947368421% 31.57894736842105% } &[data-emoji='couch_and_lamp'] { background-position: 63.1578947368421% 33.33333333333333% } &[data-emoji='sleeping_accommodation'] { background-position: 63.1578947368421% 35.08771929824561% } &[data-emoji='shopping_bags'] { background-position: 63.1578947368421% 45.614035087719294% } &[data-emoji='bellhop_bell'] { background-position: 63.1578947368421% 47.368421052631575% } &[data-emoji='bed'] { background-position: 63.1578947368421% 49.122807017543856% } &[data-emoji='place_of_worship'] { background-position: 63.1578947368421% 50.87719298245614% } &[data-emoji='octagonal_sign'] { background-position: 63.1578947368421% 52.63157894736842% } &[data-emoji='shopping_trolley'] { background-position: 63.1578947368421% 54.3859649122807% } &[data-emoji='hindu_temple'] { background-position: 63.1578947368421% 56.14035087719298% } &[data-emoji='hut'] { background-position: 63.1578947368421% 57.89473684210526% } &[data-emoji='elevator'] { background-position: 63.1578947368421% 59.64912280701754% } &[data-emoji='hammer_and_wrench'] { background-position: 63.1578947368421% 61.40350877192982% } &[data-emoji='shield'] { background-position: 63.1578947368421% 63.1578947368421% } &[data-emoji='oil_drum'] { background-position: 63.1578947368421% 64.91228070175438% } &[data-emoji='motorway'] { background-position: 63.1578947368421% 66.66666666666666% } &[data-emoji='railway_track'] { background-position: 63.1578947368421% 68.42105263157895% } &[data-emoji='motor_boat'] { background-position: 63.1578947368421% 70.17543859649122% } &[data-emoji='small_airplane'] { background-position: 63.1578947368421% 71.9298245614035% } &[data-emoji='airplane_departure'] { background-position: 63.1578947368421% 73.68421052631578% } &[data-emoji='airplane_arriving'] { background-position: 63.1578947368421% 75.43859649122807% } &[data-emoji='satellite'] { background-position: 63.1578947368421% 77.19298245614034% } &[data-emoji='passenger_ship'] { background-position: 63.1578947368421% 78.94736842105263% } &[data-emoji='scooter'] { background-position: 63.1578947368421% 80.7017543859649% } &[data-emoji='motor_scooter'] { background-position: 63.1578947368421% 82.45614035087719% } &[data-emoji='canoe'] { background-position: 63.1578947368421% 84.21052631578947% } &[data-emoji='sled'] { background-position: 63.1578947368421% 85.96491228070175% } &[data-emoji='flying_saucer'] { background-position: 63.1578947368421% 87.71929824561403% } &[data-emoji='skateboard'] { background-position: 63.1578947368421% 89.47368421052632% } &[data-emoji='auto_rickshaw'] { background-position: 63.1578947368421% 91.22807017543859% } &[data-emoji='pickup_truck'] { background-position: 63.1578947368421% 92.98245614035088% } &[data-emoji='roller_skate'] { background-position: 63.1578947368421% 94.73684210526315% } &[data-emoji='large_orange_circle'] { background-position: 63.1578947368421% 96.49122807017544% } &[data-emoji='large_yellow_circle'] { background-position: 63.1578947368421% 98.24561403508771% } &[data-emoji='large_green_circle'] { background-position: 63.1578947368421% 100% } &[data-emoji='large_purple_circle'] { background-position: 64.91228070175438% 0% } &[data-emoji='large_brown_circle'] { background-position: 64.91228070175438% 1.7543859649122806% } &[data-emoji='large_red_square'] { background-position: 64.91228070175438% 3.508771929824561% } &[data-emoji='large_blue_square'] { background-position: 64.91228070175438% 5.263157894736842% } &[data-emoji='large_orange_square'] { background-position: 64.91228070175438% 7.017543859649122% } &[data-emoji='large_yellow_square'] { background-position: 64.91228070175438% 8.771929824561402% } &[data-emoji='large_green_square'] { background-position: 64.91228070175438% 10.526315789473683% } &[data-emoji='large_purple_square'] { background-position: 64.91228070175438% 12.280701754385964% } &[data-emoji='large_brown_square'] { background-position: 64.91228070175438% 14.035087719298245% } &[data-emoji='pinched_fingers'] { background-position: 64.91228070175438% 15.789473684210526% } &[data-emoji='white_heart'] { background-position: 64.91228070175438% 26.31578947368421% } &[data-emoji='brown_heart'] { background-position: 64.91228070175438% 28.07017543859649% } &[data-emoji='pinching_hand'] { background-position: 64.91228070175438% 29.82456140350877% } &[data-emoji='zipper_mouth_face'] { background-position: 64.91228070175438% 40.35087719298245% } &[data-emoji='money_mouth_face'] { background-position: 64.91228070175438% 42.10526315789473% } &[data-emoji='face_with_thermometer'] { background-position: 64.91228070175438% 43.859649122807014% } &[data-emoji='nerd_face'] { background-position: 64.91228070175438% 45.614035087719294% } &[data-emoji='thinking_face'] { background-position: 64.91228070175438% 47.368421052631575% } &[data-emoji='face_with_head_bandage'] { background-position: 64.91228070175438% 49.122807017543856% } &[data-emoji='robot_face'] { background-position: 64.91228070175438% 50.87719298245614% } &[data-emoji='hugging_face'] { background-position: 64.91228070175438% 52.63157894736842% } &[data-emoji='the_horns'] { background-position: 64.91228070175438% 54.3859649122807% } &[data-emoji='call_me_hand'] { background-position: 64.91228070175438% 64.91228070175438% } &[data-emoji='raised_back_of_hand'] { background-position: 64.91228070175438% 75.43859649122807% } &[data-emoji='left-facing_fist'] { background-position: 64.91228070175438% 85.96491228070175% } &[data-emoji='right-facing_fist'] { background-position: 64.91228070175438% 96.49122807017544% } &[data-emoji='handshake'] { background-position: 66.66666666666666% 5.263157894736842% } &[data-emoji='crossed_fingers'] { background-position: 66.66666666666666% 7.017543859649122% } &[data-emoji='i_love_you_hand_sign'] { background-position: 66.66666666666666% 17.543859649122805% } &[data-emoji='face_with_cowboy_hat'] { background-position: 66.66666666666666% 28.07017543859649% } &[data-emoji='clown_face'] { background-position: 66.66666666666666% 29.82456140350877% } &[data-emoji='nauseated_face'] { background-position: 66.66666666666666% 31.57894736842105% } &[data-emoji='rolling_on_the_floor_laughing'] { background-position: 66.66666666666666% 33.33333333333333% } &[data-emoji='drooling_face'] { background-position: 66.66666666666666% 35.08771929824561% } &[data-emoji='lying_face'] { background-position: 66.66666666666666% 36.84210526315789% } &[data-emoji='woman-facepalming'] { background-position: 66.66666666666666% 38.59649122807017% } &[data-emoji='man-facepalming'] { background-position: 66.66666666666666% 49.122807017543856% } &[data-emoji='face_palm'] { background-position: 66.66666666666666% 59.64912280701754% } &[data-emoji='sneezing_face'] { background-position: 66.66666666666666% 70.17543859649122% } &[data-emoji='face_with_raised_eyebrow'] { background-position: 66.66666666666666% 71.9298245614035% } &[data-emoji='star-struck'] { background-position: 66.66666666666666% 73.68421052631578% } &[data-emoji='zany_face'] { background-position: 66.66666666666666% 75.43859649122807% } &[data-emoji='shushing_face'] { background-position: 66.66666666666666% 77.19298245614034% } &[data-emoji='face_with_symbols_on_mouth'] { background-position: 66.66666666666666% 78.94736842105263% } &[data-emoji='face_with_hand_over_mouth'] { background-position: 66.66666666666666% 80.7017543859649% } &[data-emoji='face_vomiting'] { background-position: 66.66666666666666% 82.45614035087719% } &[data-emoji='exploding_head'] { background-position: 66.66666666666666% 84.21052631578947% } &[data-emoji='pregnant_woman'] { background-position: 66.66666666666666% 85.96491228070175% } &[data-emoji='breast-feeding'] { background-position: 66.66666666666666% 96.49122807017544% } &[data-emoji='palms_up_together'] { background-position: 68.42105263157895% 5.263157894736842% } &[data-emoji='selfie'] { background-position: 68.42105263157895% 15.789473684210526% } &[data-emoji='prince'] { background-position: 68.42105263157895% 26.31578947368421% } &[data-emoji='woman_in_tuxedo'] { background-position: 68.42105263157895% 36.84210526315789% } &[data-emoji='man_in_tuxedo'] { background-position: 68.42105263157895% 47.368421052631575% } &[data-emoji='person_in_tuxedo'] { background-position: 68.42105263157895% 57.89473684210526% } &[data-emoji='mrs_claus'] { background-position: 68.42105263157895% 68.42105263157895% } &[data-emoji='woman-shrugging'] { background-position: 68.42105263157895% 78.94736842105263% } &[data-emoji='man-shrugging'] { background-position: 68.42105263157895% 89.47368421052632% } &[data-emoji='shrug'] { background-position: 68.42105263157895% 100% } &[data-emoji='woman-cartwheeling'] { background-position: 70.17543859649122% 8.771929824561402% } &[data-emoji='man-cartwheeling'] { background-position: 70.17543859649122% 19.298245614035086% } &[data-emoji='person_doing_cartwheel'] { background-position: 70.17543859649122% 29.82456140350877% } &[data-emoji='woman-juggling'] { background-position: 70.17543859649122% 40.35087719298245% } &[data-emoji='man-juggling'] { background-position: 70.17543859649122% 50.87719298245614% } &[data-emoji='juggling'] { background-position: 70.17543859649122% 61.40350877192982% } &[data-emoji='fencer'] { background-position: 70.17543859649122% 71.9298245614035% } &[data-emoji='woman-wrestling'] { background-position: 70.17543859649122% 73.68421052631578% } &[data-emoji='man-wrestling'] { background-position: 70.17543859649122% 75.43859649122807% } &[data-emoji='wrestlers'] { background-position: 70.17543859649122% 77.19298245614034% } &[data-emoji='woman-playing-water-polo'] { background-position: 70.17543859649122% 78.94736842105263% } &[data-emoji='man-playing-water-polo'] { background-position: 70.17543859649122% 89.47368421052632% } &[data-emoji='water_polo'] { background-position: 70.17543859649122% 100% } &[data-emoji='woman-playing-handball'] { background-position: 71.9298245614035% 8.771929824561402% } &[data-emoji='man-playing-handball'] { background-position: 71.9298245614035% 19.298245614035086% } &[data-emoji='handball'] { background-position: 71.9298245614035% 29.82456140350877% } &[data-emoji='diving_mask'] { background-position: 71.9298245614035% 40.35087719298245% } &[data-emoji='wilted_flower'] { background-position: 71.9298245614035% 42.10526315789473% } &[data-emoji='drum_with_drumsticks'] { background-position: 71.9298245614035% 43.859649122807014% } &[data-emoji='clinking_glasses'] { background-position: 71.9298245614035% 45.614035087719294% } &[data-emoji='tumbler_glass'] { background-position: 71.9298245614035% 47.368421052631575% } &[data-emoji='spoon'] { background-position: 71.9298245614035% 49.122807017543856% } &[data-emoji='goal_net'] { background-position: 71.9298245614035% 50.87719298245614% } &[data-emoji='first_place_medal'] { background-position: 71.9298245614035% 52.63157894736842% } &[data-emoji='second_place_medal'] { background-position: 71.9298245614035% 54.3859649122807% } &[data-emoji='third_place_medal'] { background-position: 71.9298245614035% 56.14035087719298% } &[data-emoji='boxing_glove'] { background-position: 71.9298245614035% 57.89473684210526% } &[data-emoji='martial_arts_uniform'] { background-position: 71.9298245614035% 59.64912280701754% } &[data-emoji='curling_stone'] { background-position: 71.9298245614035% 61.40350877192982% } &[data-emoji='lacrosse'] { background-position: 71.9298245614035% 63.1578947368421% } &[data-emoji='softball'] { background-position: 71.9298245614035% 64.91228070175438% } &[data-emoji='flying_disc'] { background-position: 71.9298245614035% 66.66666666666666% } &[data-emoji='croissant'] { background-position: 71.9298245614035% 68.42105263157895% } &[data-emoji='avocado'] { background-position: 71.9298245614035% 70.17543859649122% } &[data-emoji='cucumber'] { background-position: 71.9298245614035% 71.9298245614035% } &[data-emoji='bacon'] { background-position: 71.9298245614035% 73.68421052631578% } &[data-emoji='potato'] { background-position: 71.9298245614035% 75.43859649122807% } &[data-emoji='carrot'] { background-position: 71.9298245614035% 77.19298245614034% } &[data-emoji='baguette_bread'] { background-position: 71.9298245614035% 78.94736842105263% } &[data-emoji='green_salad'] { background-position: 71.9298245614035% 80.7017543859649% } &[data-emoji='shallow_pan_of_food'] { background-position: 71.9298245614035% 82.45614035087719% } &[data-emoji='stuffed_flatbread'] { background-position: 71.9298245614035% 84.21052631578947% } &[data-emoji='egg'] { background-position: 71.9298245614035% 85.96491228070175% } &[data-emoji='glass_of_milk'] { background-position: 71.9298245614035% 87.71929824561403% } &[data-emoji='peanuts'] { background-position: 71.9298245614035% 89.47368421052632% } &[data-emoji='kiwifruit'] { background-position: 71.9298245614035% 91.22807017543859% } &[data-emoji='pancakes'] { background-position: 71.9298245614035% 92.98245614035088% } &[data-emoji='dumpling'] { background-position: 71.9298245614035% 94.73684210526315% } &[data-emoji='fortune_cookie'] { background-position: 71.9298245614035% 96.49122807017544% } &[data-emoji='takeout_box'] { background-position: 71.9298245614035% 98.24561403508771% } &[data-emoji='chopsticks'] { background-position: 71.9298245614035% 100% } &[data-emoji='bowl_with_spoon'] { background-position: 73.68421052631578% 0% } &[data-emoji='cup_with_straw'] { background-position: 73.68421052631578% 1.7543859649122806% } &[data-emoji='coconut'] { background-position: 73.68421052631578% 3.508771929824561% } &[data-emoji='broccoli'] { background-position: 73.68421052631578% 5.263157894736842% } &[data-emoji='pie'] { background-position: 73.68421052631578% 7.017543859649122% } &[data-emoji='pretzel'] { background-position: 73.68421052631578% 8.771929824561402% } &[data-emoji='cut_of_meat'] { background-position: 73.68421052631578% 10.526315789473683% } &[data-emoji='sandwich'] { background-position: 73.68421052631578% 12.280701754385964% } &[data-emoji='canned_food'] { background-position: 73.68421052631578% 14.035087719298245% } &[data-emoji='leafy_green'] { background-position: 73.68421052631578% 15.789473684210526% } &[data-emoji='mango'] { background-position: 73.68421052631578% 17.543859649122805% } &[data-emoji='moon_cake'] { background-position: 73.68421052631578% 19.298245614035086% } &[data-emoji='bagel'] { background-position: 73.68421052631578% 21.052631578947366% } &[data-emoji='smiling_face_with_3_hearts'] { background-position: 73.68421052631578% 22.807017543859647% } &[data-emoji='yawning_face'] { background-position: 73.68421052631578% 24.561403508771928% } &[data-emoji='smiling_face_with_tear'] { background-position: 73.68421052631578% 26.31578947368421% } &[data-emoji='partying_face'] { background-position: 73.68421052631578% 28.07017543859649% } &[data-emoji='woozy_face'] { background-position: 73.68421052631578% 29.82456140350877% } &[data-emoji='hot_face'] { background-position: 73.68421052631578% 31.57894736842105% } &[data-emoji='cold_face'] { background-position: 73.68421052631578% 33.33333333333333% } &[data-emoji='ninja'] { background-position: 73.68421052631578% 35.08771929824561% } &[data-emoji='disguised_face'] { background-position: 73.68421052631578% 45.614035087719294% } &[data-emoji='pleading_face'] { background-position: 73.68421052631578% 47.368421052631575% } &[data-emoji='sari'] { background-position: 73.68421052631578% 49.122807017543856% } &[data-emoji='lab_coat'] { background-position: 73.68421052631578% 50.87719298245614% } &[data-emoji='goggles'] { background-position: 73.68421052631578% 52.63157894736842% } &[data-emoji='hiking_boot'] { background-position: 73.68421052631578% 54.3859649122807% } &[data-emoji='womans_flat_shoe'] { background-position: 73.68421052631578% 56.14035087719298% } &[data-emoji='crab'] { background-position: 73.68421052631578% 57.89473684210526% } &[data-emoji='lion_face'] { background-position: 73.68421052631578% 59.64912280701754% } &[data-emoji='scorpion'] { background-position: 73.68421052631578% 61.40350877192982% } &[data-emoji='turkey'] { background-position: 73.68421052631578% 63.1578947368421% } &[data-emoji='unicorn_face'] { background-position: 73.68421052631578% 64.91228070175438% } &[data-emoji='eagle'] { background-position: 73.68421052631578% 66.66666666666666% } &[data-emoji='duck'] { background-position: 73.68421052631578% 68.42105263157895% } &[data-emoji='bat'] { background-position: 73.68421052631578% 70.17543859649122% } &[data-emoji='shark'] { background-position: 73.68421052631578% 71.9298245614035% } &[data-emoji='owl'] { background-position: 73.68421052631578% 73.68421052631578% } &[data-emoji='fox_face'] { background-position: 73.68421052631578% 75.43859649122807% } &[data-emoji='butterfly'] { background-position: 73.68421052631578% 77.19298245614034% } &[data-emoji='deer'] { background-position: 73.68421052631578% 78.94736842105263% } &[data-emoji='gorilla'] { background-position: 73.68421052631578% 80.7017543859649% } &[data-emoji='lizard'] { background-position: 73.68421052631578% 82.45614035087719% } &[data-emoji='rhinoceros'] { background-position: 73.68421052631578% 84.21052631578947% } &[data-emoji='shrimp'] { background-position: 73.68421052631578% 85.96491228070175% } &[data-emoji='squid'] { background-position: 73.68421052631578% 87.71929824561403% } &[data-emoji='giraffe_face'] { background-position: 73.68421052631578% 89.47368421052632% } &[data-emoji='zebra_face'] { background-position: 73.68421052631578% 91.22807017543859% } &[data-emoji='hedgehog'] { background-position: 73.68421052631578% 92.98245614035088% } &[data-emoji='sauropod'] { background-position: 73.68421052631578% 94.73684210526315% } &[data-emoji='t-rex'] { background-position: 73.68421052631578% 96.49122807017544% } &[data-emoji='cricket'] { background-position: 73.68421052631578% 98.24561403508771% } &[data-emoji='kangaroo'] { background-position: 73.68421052631578% 100% } &[data-emoji='llama'] { background-position: 75.43859649122807% 0% } &[data-emoji='peacock'] { background-position: 75.43859649122807% 1.7543859649122806% } &[data-emoji='hippopotamus'] { background-position: 75.43859649122807% 3.508771929824561% } &[data-emoji='parrot'] { background-position: 75.43859649122807% 5.263157894736842% } &[data-emoji='raccoon'] { background-position: 75.43859649122807% 7.017543859649122% } &[data-emoji='lobster'] { background-position: 75.43859649122807% 8.771929824561402% } &[data-emoji='mosquito'] { background-position: 75.43859649122807% 10.526315789473683% } &[data-emoji='microbe'] { background-position: 75.43859649122807% 12.280701754385964% } &[data-emoji='badger'] { background-position: 75.43859649122807% 14.035087719298245% } &[data-emoji='swan'] { background-position: 75.43859649122807% 15.789473684210526% } &[data-emoji='mammoth'] { background-position: 75.43859649122807% 17.543859649122805% } &[data-emoji='dodo'] { background-position: 75.43859649122807% 19.298245614035086% } &[data-emoji='sloth'] { background-position: 75.43859649122807% 21.052631578947366% } &[data-emoji='otter'] { background-position: 75.43859649122807% 22.807017543859647% } &[data-emoji='orangutan'] { background-position: 75.43859649122807% 24.561403508771928% } &[data-emoji='skunk'] { background-position: 75.43859649122807% 26.31578947368421% } &[data-emoji='flamingo'] { background-position: 75.43859649122807% 28.07017543859649% } &[data-emoji='oyster'] { background-position: 75.43859649122807% 29.82456140350877% } &[data-emoji='beaver'] { background-position: 75.43859649122807% 31.57894736842105% } &[data-emoji='bison'] { background-position: 75.43859649122807% 33.33333333333333% } &[data-emoji='seal'] { background-position: 75.43859649122807% 35.08771929824561% } &[data-emoji='guide_dog'] { background-position: 75.43859649122807% 36.84210526315789% } &[data-emoji='probing_cane'] { background-position: 75.43859649122807% 38.59649122807017% } &[data-emoji='bone'] { background-position: 75.43859649122807% 40.35087719298245% } &[data-emoji='leg'] { background-position: 75.43859649122807% 42.10526315789473% } &[data-emoji='foot'] { background-position: 75.43859649122807% 52.63157894736842% } &[data-emoji='tooth'] { background-position: 75.43859649122807% 63.1578947368421% } &[data-emoji='female_superhero'] { background-position: 75.43859649122807% 64.91228070175438% } &[data-emoji='male_superhero'] { background-position: 75.43859649122807% 75.43859649122807% } &[data-emoji='superhero'] { background-position: 75.43859649122807% 85.96491228070175% } &[data-emoji='female_supervillain'] { background-position: 75.43859649122807% 96.49122807017544% } &[data-emoji='male_supervillain'] { background-position: 77.19298245614034% 5.263157894736842% } &[data-emoji='supervillain'] { background-position: 77.19298245614034% 15.789473684210526% } &[data-emoji='safety_vest'] { background-position: 77.19298245614034% 26.31578947368421% } &[data-emoji='ear_with_hearing_aid'] { background-position: 77.19298245614034% 28.07017543859649% } &[data-emoji='motorized_wheelchair'] { background-position: 77.19298245614034% 38.59649122807017% } &[data-emoji='manual_wheelchair'] { background-position: 77.19298245614034% 40.35087719298245% } &[data-emoji='mechanical_arm'] { background-position: 77.19298245614034% 42.10526315789473% } &[data-emoji='mechanical_leg'] { background-position: 77.19298245614034% 43.859649122807014% } &[data-emoji='cheese_wedge'] { background-position: 77.19298245614034% 45.614035087719294% } &[data-emoji='cupcake'] { background-position: 77.19298245614034% 47.368421052631575% } &[data-emoji='salt'] { background-position: 77.19298245614034% 49.122807017543856% } &[data-emoji='beverage_box'] { background-position: 77.19298245614034% 50.87719298245614% } &[data-emoji='garlic'] { background-position: 77.19298245614034% 52.63157894736842% } &[data-emoji='onion'] { background-position: 77.19298245614034% 54.3859649122807% } &[data-emoji='falafel'] { background-position: 77.19298245614034% 56.14035087719298% } &[data-emoji='waffle'] { background-position: 77.19298245614034% 57.89473684210526% } &[data-emoji='butter'] { background-position: 77.19298245614034% 59.64912280701754% } &[data-emoji='mate_drink'] { background-position: 77.19298245614034% 61.40350877192982% } &[data-emoji='ice_cube'] { background-position: 77.19298245614034% 63.1578947368421% } &[data-emoji='bubble_tea'] { background-position: 77.19298245614034% 64.91228070175438% } &[data-emoji='woman_standing'] { background-position: 77.19298245614034% 66.66666666666666% } &[data-emoji='man_standing'] { background-position: 77.19298245614034% 77.19298245614034% } &[data-emoji='standing_person'] { background-position: 77.19298245614034% 87.71929824561403% } &[data-emoji='woman_kneeling'] { background-position: 77.19298245614034% 98.24561403508771% } &[data-emoji='man_kneeling'] { background-position: 78.94736842105263% 7.017543859649122% } &[data-emoji='kneeling_person'] { background-position: 78.94736842105263% 17.543859649122805% } &[data-emoji='deaf_woman'] { background-position: 78.94736842105263% 28.07017543859649% } &[data-emoji='deaf_man'] { background-position: 78.94736842105263% 38.59649122807017% } &[data-emoji='deaf_person'] { background-position: 78.94736842105263% 49.122807017543856% } &[data-emoji='face_with_monocle'] { background-position: 78.94736842105263% 59.64912280701754% } &[data-emoji='farmer'] { background-position: 78.94736842105263% 61.40350877192982% } &[data-emoji='cook'] { background-position: 78.94736842105263% 71.9298245614035% } &[data-emoji='person_feeding_baby'] { background-position: 78.94736842105263% 82.45614035087719% } &[data-emoji='mx_claus'] { background-position: 78.94736842105263% 92.98245614035088% } &[data-emoji='student'] { background-position: 80.7017543859649% 1.7543859649122806% } &[data-emoji='singer'] { background-position: 80.7017543859649% 12.280701754385964% } &[data-emoji='artist'] { background-position: 80.7017543859649% 22.807017543859647% } &[data-emoji='teacher'] { background-position: 80.7017543859649% 33.33333333333333% } &[data-emoji='factory_worker'] { background-position: 80.7017543859649% 43.859649122807014% } &[data-emoji='technologist'] { background-position: 80.7017543859649% 54.3859649122807% } &[data-emoji='office_worker'] { background-position: 80.7017543859649% 64.91228070175438% } &[data-emoji='mechanic'] { background-position: 80.7017543859649% 75.43859649122807% } &[data-emoji='scientist'] { background-position: 80.7017543859649% 85.96491228070175% } &[data-emoji='astronaut'] { background-position: 80.7017543859649% 96.49122807017544% } &[data-emoji='firefighter'] { background-position: 82.45614035087719% 5.263157894736842% } &[data-emoji='people_holding_hands'] { background-position: 82.45614035087719% 15.789473684210526% } &[data-emoji='person_with_probing_cane'] { background-position: 82.45614035087719% 61.40350877192982% } &[data-emoji='red_haired_person'] { background-position: 82.45614035087719% 71.9298245614035% } &[data-emoji='curly_haired_person'] { background-position: 82.45614035087719% 82.45614035087719% } &[data-emoji='bald_person'] { background-position: 82.45614035087719% 92.98245614035088% } &[data-emoji='white_haired_person'] { background-position: 84.21052631578947% 1.7543859649122806% } &[data-emoji='person_in_motorized_wheelchair'] { background-position: 84.21052631578947% 12.280701754385964% } &[data-emoji='person_in_manual_wheelchair'] { background-position: 84.21052631578947% 22.807017543859647% } &[data-emoji='health_worker'] { background-position: 84.21052631578947% 33.33333333333333% } &[data-emoji='judge'] { background-position: 84.21052631578947% 43.859649122807014% } &[data-emoji='pilot'] { background-position: 84.21052631578947% 54.3859649122807% } &[data-emoji='adult'] { background-position: 84.21052631578947% 64.91228070175438% } &[data-emoji='child'] { background-position: 84.21052631578947% 75.43859649122807% } &[data-emoji='older_adult'] { background-position: 84.21052631578947% 85.96491228070175% } &[data-emoji='bearded_person'] { background-position: 84.21052631578947% 96.49122807017544% } &[data-emoji='person_with_headscarf'] { background-position: 85.96491228070175% 5.263157894736842% } &[data-emoji='woman_in_steamy_room'] { background-position: 85.96491228070175% 15.789473684210526% } &[data-emoji='man_in_steamy_room'] { background-position: 85.96491228070175% 26.31578947368421% } &[data-emoji='person_in_steamy_room'] { background-position: 85.96491228070175% 36.84210526315789% } &[data-emoji='woman_climbing'] { background-position: 85.96491228070175% 47.368421052631575% } &[data-emoji='man_climbing'] { background-position: 85.96491228070175% 57.89473684210526% } &[data-emoji='person_climbing'] { background-position: 85.96491228070175% 68.42105263157895% } &[data-emoji='woman_in_lotus_position'] { background-position: 85.96491228070175% 78.94736842105263% } &[data-emoji='man_in_lotus_position'] { background-position: 85.96491228070175% 89.47368421052632% } &[data-emoji='person_in_lotus_position'] { background-position: 85.96491228070175% 100% } &[data-emoji='female_mage'] { background-position: 87.71929824561403% 8.771929824561402% } &[data-emoji='male_mage'] { background-position: 87.71929824561403% 19.298245614035086% } &[data-emoji='mage'] { background-position: 87.71929824561403% 29.82456140350877% } &[data-emoji='female_fairy'] { background-position: 87.71929824561403% 40.35087719298245% } &[data-emoji='male_fairy'] { background-position: 87.71929824561403% 50.87719298245614% } &[data-emoji='fairy'] { background-position: 87.71929824561403% 61.40350877192982% } &[data-emoji='female_vampire'] { background-position: 87.71929824561403% 71.9298245614035% } &[data-emoji='male_vampire'] { background-position: 87.71929824561403% 82.45614035087719% } &[data-emoji='vampire'] { background-position: 87.71929824561403% 92.98245614035088% } &[data-emoji='mermaid'] { background-position: 89.47368421052632% 1.7543859649122806% } &[data-emoji='merman'] { background-position: 89.47368421052632% 12.280701754385964% } &[data-emoji='merperson'] { background-position: 89.47368421052632% 22.807017543859647% } &[data-emoji='female_elf'] { background-position: 89.47368421052632% 33.33333333333333% } &[data-emoji='male_elf'] { background-position: 89.47368421052632% 43.859649122807014% } &[data-emoji='elf'] { background-position: 89.47368421052632% 54.3859649122807% } &[data-emoji='female_genie'] { background-position: 89.47368421052632% 64.91228070175438% } &[data-emoji='male_genie'] { background-position: 89.47368421052632% 66.66666666666666% } &[data-emoji='genie'] { background-position: 89.47368421052632% 68.42105263157895% } &[data-emoji='female_zombie'] { background-position: 89.47368421052632% 70.17543859649122% } &[data-emoji='male_zombie'] { background-position: 89.47368421052632% 71.9298245614035% } &[data-emoji='zombie'] { background-position: 89.47368421052632% 73.68421052631578% } &[data-emoji='brain'] { background-position: 89.47368421052632% 75.43859649122807% } &[data-emoji='orange_heart'] { background-position: 89.47368421052632% 77.19298245614034% } &[data-emoji='billed_cap'] { background-position: 89.47368421052632% 78.94736842105263% } &[data-emoji='scarf'] { background-position: 89.47368421052632% 80.7017543859649% } &[data-emoji='gloves'] { background-position: 89.47368421052632% 82.45614035087719% } &[data-emoji='coat'] { background-position: 89.47368421052632% 84.21052631578947% } &[data-emoji='socks'] { background-position: 89.47368421052632% 85.96491228070175% } &[data-emoji='red_envelope'] { background-position: 89.47368421052632% 87.71929824561403% } &[data-emoji='firecracker'] { background-position: 89.47368421052632% 89.47368421052632% } &[data-emoji='jigsaw'] { background-position: 89.47368421052632% 91.22807017543859% } &[data-emoji='test_tube'] { background-position: 89.47368421052632% 92.98245614035088% } &[data-emoji='petri_dish'] { background-position: 89.47368421052632% 94.73684210526315% } &[data-emoji='dna'] { background-position: 89.47368421052632% 96.49122807017544% } &[data-emoji='compass'] { background-position: 89.47368421052632% 98.24561403508771% } &[data-emoji='abacus'] { background-position: 89.47368421052632% 100% } &[data-emoji='fire_extinguisher'] { background-position: 91.22807017543859% 0% } &[data-emoji='toolbox'] { background-position: 91.22807017543859% 1.7543859649122806% } &[data-emoji='bricks'] { background-position: 91.22807017543859% 3.508771929824561% } &[data-emoji='magnet'] { background-position: 91.22807017543859% 5.263157894736842% } &[data-emoji='luggage'] { background-position: 91.22807017543859% 7.017543859649122% } &[data-emoji='lotion_bottle'] { background-position: 91.22807017543859% 8.771929824561402% } &[data-emoji='thread'] { background-position: 91.22807017543859% 10.526315789473683% } &[data-emoji='yarn'] { background-position: 91.22807017543859% 12.280701754385964% } &[data-emoji='safety_pin'] { background-position: 91.22807017543859% 14.035087719298245% } &[data-emoji='teddy_bear'] { background-position: 91.22807017543859% 15.789473684210526% } &[data-emoji='broom'] { background-position: 91.22807017543859% 17.543859649122805% } &[data-emoji='basket'] { background-position: 91.22807017543859% 19.298245614035086% } &[data-emoji='roll_of_paper'] { background-position: 91.22807017543859% 21.052631578947366% } &[data-emoji='soap'] { background-position: 91.22807017543859% 22.807017543859647% } &[data-emoji='sponge'] { background-position: 91.22807017543859% 24.561403508771928% } &[data-emoji='receipt'] { background-position: 91.22807017543859% 26.31578947368421% } &[data-emoji='nazar_amulet'] { background-position: 91.22807017543859% 28.07017543859649% } &[data-emoji='ballet_shoes'] { background-position: 91.22807017543859% 29.82456140350877% } &[data-emoji='one-piece_swimsuit'] { background-position: 91.22807017543859% 31.57894736842105% } &[data-emoji='briefs'] { background-position: 91.22807017543859% 33.33333333333333% } &[data-emoji='shorts'] { background-position: 91.22807017543859% 35.08771929824561% } &[data-emoji='thong_sandal'] { background-position: 91.22807017543859% 36.84210526315789% } &[data-emoji='drop_of_blood'] { background-position: 91.22807017543859% 38.59649122807017% } &[data-emoji='adhesive_bandage'] { background-position: 91.22807017543859% 40.35087719298245% } &[data-emoji='stethoscope'] { background-position: 91.22807017543859% 42.10526315789473% } &[data-emoji='yo-yo'] { background-position: 91.22807017543859% 43.859649122807014% } &[data-emoji='kite'] { background-position: 91.22807017543859% 45.614035087719294% } &[data-emoji='parachute'] { background-position: 91.22807017543859% 47.368421052631575% } &[data-emoji='boomerang'] { background-position: 91.22807017543859% 49.122807017543856% } &[data-emoji='magic_wand'] { background-position: 91.22807017543859% 50.87719298245614% } &[data-emoji='pinata'] { background-position: 91.22807017543859% 52.63157894736842% } &[data-emoji='nesting_dolls'] { background-position: 91.22807017543859% 54.3859649122807% } &[data-emoji='ringed_planet'] { background-position: 91.22807017543859% 56.14035087719298% } &[data-emoji='chair'] { background-position: 91.22807017543859% 57.89473684210526% } &[data-emoji='razor'] { background-position: 91.22807017543859% 59.64912280701754% } &[data-emoji='axe'] { background-position: 91.22807017543859% 61.40350877192982% } &[data-emoji='diya_lamp'] { background-position: 91.22807017543859% 63.1578947368421% } &[data-emoji='banjo'] { background-position: 91.22807017543859% 64.91228070175438% } &[data-emoji='military_helmet'] { background-position: 91.22807017543859% 66.66666666666666% } &[data-emoji='accordion'] { background-position: 91.22807017543859% 68.42105263157895% } &[data-emoji='long_drum'] { background-position: 91.22807017543859% 70.17543859649122% } &[data-emoji='coin'] { background-position: 91.22807017543859% 71.9298245614035% } &[data-emoji='carpentry_saw'] { background-position: 91.22807017543859% 73.68421052631578% } &[data-emoji='screwdriver'] { background-position: 91.22807017543859% 75.43859649122807% } &[data-emoji='ladder'] { background-position: 91.22807017543859% 77.19298245614034% } &[data-emoji='hook'] { background-position: 91.22807017543859% 78.94736842105263% } &[data-emoji='mirror'] { background-position: 91.22807017543859% 80.7017543859649% } &[data-emoji='window'] { background-position: 91.22807017543859% 82.45614035087719% } &[data-emoji='plunger'] { background-position: 91.22807017543859% 84.21052631578947% } &[data-emoji='sewing_needle'] { background-position: 91.22807017543859% 85.96491228070175% } &[data-emoji='knot'] { background-position: 91.22807017543859% 87.71929824561403% } &[data-emoji='bucket'] { background-position: 91.22807017543859% 89.47368421052632% } &[data-emoji='mouse_trap'] { background-position: 91.22807017543859% 91.22807017543859% } &[data-emoji='toothbrush'] { background-position: 91.22807017543859% 92.98245614035088% } &[data-emoji='headstone'] { background-position: 91.22807017543859% 94.73684210526315% } &[data-emoji='placard'] { background-position: 91.22807017543859% 96.49122807017544% } &[data-emoji='rock'] { background-position: 91.22807017543859% 98.24561403508771% } &[data-emoji='fly'] { background-position: 91.22807017543859% 100% } &[data-emoji='worm'] { background-position: 92.98245614035088% 0% } &[data-emoji='beetle'] { background-position: 92.98245614035088% 1.7543859649122806% } &[data-emoji='cockroach'] { background-position: 92.98245614035088% 3.508771929824561% } &[data-emoji='potted_plant'] { background-position: 92.98245614035088% 5.263157894736842% } &[data-emoji='wood'] { background-position: 92.98245614035088% 7.017543859649122% } &[data-emoji='feather'] { background-position: 92.98245614035088% 8.771929824561402% } &[data-emoji='anatomical_heart'] { background-position: 92.98245614035088% 10.526315789473683% } &[data-emoji='lungs'] { background-position: 92.98245614035088% 12.280701754385964% } &[data-emoji='people_hugging'] { background-position: 92.98245614035088% 14.035087719298245% } &[data-emoji='blueberries'] { background-position: 92.98245614035088% 15.789473684210526% } &[data-emoji='bell_pepper'] { background-position: 92.98245614035088% 17.543859649122805% } &[data-emoji='olive'] { background-position: 92.98245614035088% 19.298245614035086% } &[data-emoji='flatbread'] { background-position: 92.98245614035088% 21.052631578947366% } &[data-emoji='tamale'] { background-position: 92.98245614035088% 22.807017543859647% } &[data-emoji='fondue'] { background-position: 92.98245614035088% 24.561403508771928% } &[data-emoji='teapot'] { background-position: 92.98245614035088% 26.31578947368421% } &[data-emoji='bangbang'] { background-position: 92.98245614035088% 28.07017543859649% } &[data-emoji='interrobang'] { background-position: 92.98245614035088% 29.82456140350877% } &[data-emoji='tm'] { background-position: 92.98245614035088% 31.57894736842105% } &[data-emoji='information_source'] { background-position: 92.98245614035088% 33.33333333333333% } &[data-emoji='left_right_arrow'] { background-position: 92.98245614035088% 35.08771929824561% } &[data-emoji='arrow_up_down'] { background-position: 92.98245614035088% 36.84210526315789% } &[data-emoji='arrow_upper_left'] { background-position: 92.98245614035088% 38.59649122807017% } &[data-emoji='arrow_upper_right'] { background-position: 92.98245614035088% 40.35087719298245% } &[data-emoji='arrow_lower_right'] { background-position: 92.98245614035088% 42.10526315789473% } &[data-emoji='arrow_lower_left'] { background-position: 92.98245614035088% 43.859649122807014% } &[data-emoji='leftwards_arrow_with_hook'] { background-position: 92.98245614035088% 45.614035087719294% } &[data-emoji='arrow_right_hook'] { background-position: 92.98245614035088% 47.368421052631575% } &[data-emoji='watch'] { background-position: 92.98245614035088% 49.122807017543856% } &[data-emoji='hourglass'] { background-position: 92.98245614035088% 50.87719298245614% } &[data-emoji='keyboard'] { background-position: 92.98245614035088% 52.63157894736842% } &[data-emoji='eject'] { background-position: 92.98245614035088% 54.3859649122807% } &[data-emoji='fast_forward'] { background-position: 92.98245614035088% 56.14035087719298% } &[data-emoji='rewind'] { background-position: 92.98245614035088% 57.89473684210526% } &[data-emoji='arrow_double_up'] { background-position: 92.98245614035088% 59.64912280701754% } &[data-emoji='arrow_double_down'] { background-position: 92.98245614035088% 61.40350877192982% } &[data-emoji='black_right_pointing_double_triangle_with_vertical_bar'] { background-position: 92.98245614035088% 63.1578947368421% } &[data-emoji='black_left_pointing_double_triangle_with_vertical_bar'] { background-position: 92.98245614035088% 64.91228070175438% } &[data-emoji='black_right_pointing_triangle_with_double_vertical_bar'] { background-position: 92.98245614035088% 66.66666666666666% } &[data-emoji='alarm_clock'] { background-position: 92.98245614035088% 68.42105263157895% } &[data-emoji='stopwatch'] { background-position: 92.98245614035088% 70.17543859649122% } &[data-emoji='timer_clock'] { background-position: 92.98245614035088% 71.9298245614035% } &[data-emoji='hourglass_flowing_sand'] { background-position: 92.98245614035088% 73.68421052631578% } &[data-emoji='double_vertical_bar'] { background-position: 92.98245614035088% 75.43859649122807% } &[data-emoji='black_square_for_stop'] { background-position: 92.98245614035088% 77.19298245614034% } &[data-emoji='black_circle_for_record'] { background-position: 92.98245614035088% 78.94736842105263% } &[data-emoji='m'] { background-position: 92.98245614035088% 80.7017543859649% } &[data-emoji='black_small_square'] { background-position: 92.98245614035088% 82.45614035087719% } &[data-emoji='white_small_square'] { background-position: 92.98245614035088% 84.21052631578947% } &[data-emoji='arrow_forward'] { background-position: 92.98245614035088% 85.96491228070175% } &[data-emoji='arrow_backward'] { background-position: 92.98245614035088% 87.71929824561403% } &[data-emoji='white_medium_square'] { background-position: 92.98245614035088% 89.47368421052632% } &[data-emoji='black_medium_square'] { background-position: 92.98245614035088% 91.22807017543859% } &[data-emoji='white_medium_small_square'] { background-position: 92.98245614035088% 92.98245614035088% } &[data-emoji='black_medium_small_square'] { background-position: 92.98245614035088% 94.73684210526315% } &[data-emoji='sunny'] { background-position: 92.98245614035088% 96.49122807017544% } &[data-emoji='cloud'] { background-position: 92.98245614035088% 98.24561403508771% } &[data-emoji='umbrella'] { background-position: 92.98245614035088% 100% } &[data-emoji='snowman'] { background-position: 94.73684210526315% 0% } &[data-emoji='comet'] { background-position: 94.73684210526315% 1.7543859649122806% } &[data-emoji='phone'] { background-position: 94.73684210526315% 3.508771929824561% } &[data-emoji='ballot_box_with_check'] { background-position: 94.73684210526315% 5.263157894736842% } &[data-emoji='umbrella_with_rain_drops'] { background-position: 94.73684210526315% 7.017543859649122% } &[data-emoji='coffee'] { background-position: 94.73684210526315% 8.771929824561402% } &[data-emoji='shamrock'] { background-position: 94.73684210526315% 10.526315789473683% } &[data-emoji='point_up'] { background-position: 94.73684210526315% 12.280701754385964% } &[data-emoji='skull_and_crossbones'] { background-position: 94.73684210526315% 22.807017543859647% } &[data-emoji='radioactive_sign'] { background-position: 94.73684210526315% 24.561403508771928% } &[data-emoji='biohazard_sign'] { background-position: 94.73684210526315% 26.31578947368421% } &[data-emoji='orthodox_cross'] { background-position: 94.73684210526315% 28.07017543859649% } &[data-emoji='star_and_crescent'] { background-position: 94.73684210526315% 29.82456140350877% } &[data-emoji='peace_symbol'] { background-position: 94.73684210526315% 31.57894736842105% } &[data-emoji='yin_yang'] { background-position: 94.73684210526315% 33.33333333333333% } &[data-emoji='wheel_of_dharma'] { background-position: 94.73684210526315% 35.08771929824561% } &[data-emoji='white_frowning_face'] { background-position: 94.73684210526315% 36.84210526315789% } &[data-emoji='relaxed'] { background-position: 94.73684210526315% 38.59649122807017% } &[data-emoji='female_sign'] { background-position: 94.73684210526315% 40.35087719298245% } &[data-emoji='male_sign'] { background-position: 94.73684210526315% 42.10526315789473% } &[data-emoji='aries'] { background-position: 94.73684210526315% 43.859649122807014% } &[data-emoji='taurus'] { background-position: 94.73684210526315% 45.614035087719294% } &[data-emoji='gemini'] { background-position: 94.73684210526315% 47.368421052631575% } &[data-emoji='cancer'] { background-position: 94.73684210526315% 49.122807017543856% } &[data-emoji='leo'] { background-position: 94.73684210526315% 50.87719298245614% } &[data-emoji='virgo'] { background-position: 94.73684210526315% 52.63157894736842% } &[data-emoji='libra'] { background-position: 94.73684210526315% 54.3859649122807% } &[data-emoji='scorpius'] { background-position: 94.73684210526315% 56.14035087719298% } &[data-emoji='sagittarius'] { background-position: 94.73684210526315% 57.89473684210526% } &[data-emoji='capricorn'] { background-position: 94.73684210526315% 59.64912280701754% } &[data-emoji='aquarius'] { background-position: 94.73684210526315% 61.40350877192982% } &[data-emoji='pisces'] { background-position: 94.73684210526315% 63.1578947368421% } &[data-emoji='chess_pawn'] { background-position: 94.73684210526315% 64.91228070175438% } &[data-emoji='spades'] { background-position: 94.73684210526315% 66.66666666666666% } &[data-emoji='clubs'] { background-position: 94.73684210526315% 68.42105263157895% } &[data-emoji='hearts'] { background-position: 94.73684210526315% 70.17543859649122% } &[data-emoji='diamonds'] { background-position: 94.73684210526315% 71.9298245614035% } &[data-emoji='hotsprings'] { background-position: 94.73684210526315% 73.68421052631578% } &[data-emoji='recycle'] { background-position: 94.73684210526315% 75.43859649122807% } &[data-emoji='infinity'] { background-position: 94.73684210526315% 77.19298245614034% } &[data-emoji='wheelchair'] { background-position: 94.73684210526315% 78.94736842105263% } &[data-emoji='hammer_and_pick'] { background-position: 94.73684210526315% 80.7017543859649% } &[data-emoji='anchor'] { background-position: 94.73684210526315% 82.45614035087719% } &[data-emoji='crossed_swords'] { background-position: 94.73684210526315% 84.21052631578947% } &[data-emoji='medical_symbol'] { background-position: 94.73684210526315% 85.96491228070175% } &[data-emoji='scales'] { background-position: 94.73684210526315% 87.71929824561403% } &[data-emoji='alembic'] { background-position: 94.73684210526315% 89.47368421052632% } &[data-emoji='gear'] { background-position: 94.73684210526315% 91.22807017543859% } &[data-emoji='atom_symbol'] { background-position: 94.73684210526315% 92.98245614035088% } &[data-emoji='fleur_de_lis'] { background-position: 94.73684210526315% 94.73684210526315% } &[data-emoji='warning'] { background-position: 94.73684210526315% 96.49122807017544% } &[data-emoji='zap'] { background-position: 94.73684210526315% 98.24561403508771% } &[data-emoji='transgender_symbol'] { background-position: 94.73684210526315% 100% } &[data-emoji='white_circle'] { background-position: 96.49122807017544% 0% } &[data-emoji='black_circle'] { background-position: 96.49122807017544% 1.7543859649122806% } &[data-emoji='coffin'] { background-position: 96.49122807017544% 3.508771929824561% } &[data-emoji='funeral_urn'] { background-position: 96.49122807017544% 5.263157894736842% } &[data-emoji='soccer'] { background-position: 96.49122807017544% 7.017543859649122% } &[data-emoji='baseball'] { background-position: 96.49122807017544% 8.771929824561402% } &[data-emoji='snowman_without_snow'] { background-position: 96.49122807017544% 10.526315789473683% } &[data-emoji='partly_sunny'] { background-position: 96.49122807017544% 12.280701754385964% } &[data-emoji='thunder_cloud_and_rain'] { background-position: 96.49122807017544% 14.035087719298245% } &[data-emoji='ophiuchus'] { background-position: 96.49122807017544% 15.789473684210526% } &[data-emoji='pick'] { background-position: 96.49122807017544% 17.543859649122805% } &[data-emoji='helmet_with_white_cross'] { background-position: 96.49122807017544% 19.298245614035086% } &[data-emoji='chains'] { background-position: 96.49122807017544% 21.052631578947366% } &[data-emoji='no_entry'] { background-position: 96.49122807017544% 22.807017543859647% } &[data-emoji='shinto_shrine'] { background-position: 96.49122807017544% 24.561403508771928% } &[data-emoji='church'] { background-position: 96.49122807017544% 26.31578947368421% } &[data-emoji='mountain'] { background-position: 96.49122807017544% 28.07017543859649% } &[data-emoji='umbrella_on_ground'] { background-position: 96.49122807017544% 29.82456140350877% } &[data-emoji='fountain'] { background-position: 96.49122807017544% 31.57894736842105% } &[data-emoji='golf'] { background-position: 96.49122807017544% 33.33333333333333% } &[data-emoji='ferry'] { background-position: 96.49122807017544% 35.08771929824561% } &[data-emoji='boat'] { background-position: 96.49122807017544% 36.84210526315789% } &[data-emoji='skier'] { background-position: 96.49122807017544% 38.59649122807017% } &[data-emoji='ice_skate'] { background-position: 96.49122807017544% 40.35087719298245% } &[data-emoji='woman-bouncing-ball'] { background-position: 96.49122807017544% 42.10526315789473% } &[data-emoji='man-bouncing-ball'] { background-position: 96.49122807017544% 52.63157894736842% } &[data-emoji='person_with_ball'] { background-position: 96.49122807017544% 63.1578947368421% } &[data-emoji='tent'] { background-position: 96.49122807017544% 73.68421052631578% } &[data-emoji='fuelpump'] { background-position: 96.49122807017544% 75.43859649122807% } &[data-emoji='scissors'] { background-position: 96.49122807017544% 77.19298245614034% } &[data-emoji='white_check_mark'] { background-position: 96.49122807017544% 78.94736842105263% } &[data-emoji='airplane'] { background-position: 96.49122807017544% 80.7017543859649% } &[data-emoji='email'] { background-position: 96.49122807017544% 82.45614035087719% } &[data-emoji='fist'] { background-position: 96.49122807017544% 84.21052631578947% } &[data-emoji='hand'] { background-position: 96.49122807017544% 94.73684210526315% } &[data-emoji='v'] { background-position: 98.24561403508771% 3.508771929824561% } &[data-emoji='writing_hand'] { background-position: 98.24561403508771% 14.035087719298245% } &[data-emoji='pencil2'] { background-position: 98.24561403508771% 24.561403508771928% } &[data-emoji='black_nib'] { background-position: 98.24561403508771% 26.31578947368421% } &[data-emoji='heavy_check_mark'] { background-position: 98.24561403508771% 28.07017543859649% } &[data-emoji='heavy_multiplication_x'] { background-position: 98.24561403508771% 29.82456140350877% } &[data-emoji='latin_cross'] { background-position: 98.24561403508771% 31.57894736842105% } &[data-emoji='star_of_david'] { background-position: 98.24561403508771% 33.33333333333333% } &[data-emoji='sparkles'] { background-position: 98.24561403508771% 35.08771929824561% } &[data-emoji='eight_spoked_asterisk'] { background-position: 98.24561403508771% 36.84210526315789% } &[data-emoji='eight_pointed_black_star'] { background-position: 98.24561403508771% 38.59649122807017% } &[data-emoji='snowflake'] { background-position: 98.24561403508771% 40.35087719298245% } &[data-emoji='sparkle'] { background-position: 98.24561403508771% 42.10526315789473% } &[data-emoji='x'] { background-position: 98.24561403508771% 43.859649122807014% } &[data-emoji='negative_squared_cross_mark'] { background-position: 98.24561403508771% 45.614035087719294% } &[data-emoji='question'] { background-position: 98.24561403508771% 47.368421052631575% } &[data-emoji='grey_question'] { background-position: 98.24561403508771% 49.122807017543856% } &[data-emoji='grey_exclamation'] { background-position: 98.24561403508771% 50.87719298245614% } &[data-emoji='exclamation'] { background-position: 98.24561403508771% 52.63157894736842% } &[data-emoji='heavy_heart_exclamation_mark_ornament'] { background-position: 98.24561403508771% 54.3859649122807% } &[data-emoji='heart'] { background-position: 98.24561403508771% 56.14035087719298% } &[data-emoji='heavy_plus_sign'] { background-position: 98.24561403508771% 57.89473684210526% } &[data-emoji='heavy_minus_sign'] { background-position: 98.24561403508771% 59.64912280701754% } &[data-emoji='heavy_division_sign'] { background-position: 98.24561403508771% 61.40350877192982% } &[data-emoji='arrow_right'] { background-position: 98.24561403508771% 63.1578947368421% } &[data-emoji='curly_loop'] { background-position: 98.24561403508771% 64.91228070175438% } &[data-emoji='loop'] { background-position: 98.24561403508771% 66.66666666666666% } &[data-emoji='arrow_heading_up'] { background-position: 98.24561403508771% 68.42105263157895% } &[data-emoji='arrow_heading_down'] { background-position: 98.24561403508771% 70.17543859649122% } &[data-emoji='arrow_left'] { background-position: 98.24561403508771% 71.9298245614035% } &[data-emoji='arrow_up'] { background-position: 98.24561403508771% 73.68421052631578% } &[data-emoji='arrow_down'] { background-position: 98.24561403508771% 75.43859649122807% } &[data-emoji='black_large_square'] { background-position: 98.24561403508771% 77.19298245614034% } &[data-emoji='white_large_square'] { background-position: 98.24561403508771% 78.94736842105263% } &[data-emoji='star'] { background-position: 98.24561403508771% 80.7017543859649% } &[data-emoji='o'] { background-position: 98.24561403508771% 82.45614035087719% } &[data-emoji='wavy_dash'] { background-position: 98.24561403508771% 84.21052631578947% } &[data-emoji='part_alternation_mark'] { background-position: 98.24561403508771% 85.96491228070175% } &[data-emoji='congratulations'] { background-position: 98.24561403508771% 87.71929824561403% } &[data-emoji='secret'] { background-position: 98.24561403508771% 89.47368421052632% } } ================================================ FILE: client/src/assets/styles/vendor/_emote.scss ================================================ .emote { width: 24px; height: 24px; background-size: contain; background-repeat: no-repeat; background-position: center center; &.anger { background-image: url('../images/emote/1f4a2.svg'); } &.bomb { background-image: url('../images/emote/1f4a3.svg'); } &.sleep { background-image: url('../images/emote/1f4a4.svg'); } &.explode { background-image: url('../images/emote/1f4a5.svg'); } &.sweat { background-image: url('../images/emote/1f4a6.svg'); } &.poo { background-image: url('../images/emote/1f4a9.svg'); } &.hundred { background-image: url('../images/emote/1f4af.svg'); } &.alert { background-image: url('../images/emote/1f6a8.svg'); } &.punch { background-image: url('../images/emote/1f44a.svg'); } &.wave { background-image: url('../images/emote/1f44b.svg'); } &.okay { background-image: url('../images/emote/1f44c.svg'); } &.thumbs-up { background-image: url('../images/emote/1f44d.svg'); } &.clap { background-image: url('../images/emote/1f44f.svg'); } &.prey { background-image: url('../images/emote/1f64f.svg'); } &.celebrate { background-image: url('../images/emote/1f389.svg'); } &.flame { background-image: url('../images/emote/1f525.svg'); } &.goof { background-image: url('../images/emote/1f60b.svg'); } &.love { background-image: url('../images/emote/1f60d.svg'); } &.cool { background-image: url('../images/emote/1f60e.svg'); } &.smerk { background-image: url('../images/emote/1f60f.svg'); } &.worry { background-image: url('../images/emote/1f61f.svg'); } &.ouch { background-image: url('../images/emote/1f62c.svg'); } &.cry { background-image: url('../images/emote/1f62d.svg'); } &.surprised { background-image: url('../images/emote/1f62e.svg'); } &.quiet { background-image: url('../images/emote/1f92b.svg'); } &.rage { background-image: url('../images/emote/1f92c.svg'); } &.annoy { background-image: url('../images/emote/1f611.svg'); } &.steamed { background-image: url('../images/emote/1f624.svg'); } &.scared { background-image: url('../images/emote/1f628.svg'); } &.terrified { background-image: url('../images/emote/1f631.svg'); } &.sleepy { background-image: url('../images/emote/1f634.svg'); } &.dead { background-image: url('../images/emote/1f635.svg'); } &.happy { background-image: url('../images/emote/1f642.svg'); } &.roll-eyes { background-image: url('../images/emote/1f644.svg'); } &.thinking { background-image: url('../images/emote/1f914.svg'); } &.clown { background-image: url('../images/emote/1f921.svg'); } &.sick { background-image: url('../images/emote/1f922.svg'); } &.rofl { background-image: url('../images/emote/1f923.svg'); } &.drule { background-image: url('../images/emote/1f924.svg'); } &.sniff { background-image: url('../images/emote/1f927.svg'); } &.sus { background-image: url('../images/emote/1f928.svg'); } &.party { background-image: url('../images/emote/1f973.svg'); } &.odd { background-image: url('../images/emote/1f974.svg'); } &.hot { background-image: url('../images/emote/1f975.svg'); } &.cold { background-image: url('../images/emote/1f976.svg'); } &.blush { background-image: url('../images/emote/263a.svg'); } &.sad { background-image: url('../images/emote/2639.svg'); } } ================================================ FILE: client/src/assets/styles/vendor/_font-awesome.scss ================================================ // Variables @use "sass:math"; $fa-font-path: "~@fortawesome/fontawesome-free/webfonts"; $fa-font-size-base: 16px; $fa-font-display: auto; $fa-css-prefix: fa; $fa-border-color: #eee; $fa-inverse: #fff; $fa-li-width: 2em; $fa-fw-width: math.div(20em, 16); $fa-primary-opacity: 1; $fa-secondary-opacity: .4; $fa-family-default: 'Font Awesome 6 Free'; // Import FA source files @import "~@fortawesome/fontawesome-free/scss/brands"; @import "~@fortawesome/fontawesome-free/scss/solid"; @import "~@fortawesome/fontawesome-free/scss/regular"; @import "~@fortawesome/fontawesome-free/scss/fontawesome"; ================================================ FILE: client/src/assets/styles/vendor/_font-whitney.scss ================================================ @font-face{ font-family:Whitney; font-weight:300; src:url("fonts/whitney-300.woff") format("woff") } @font-face{ font-family:Whitney; font-weight:400; src:url("fonts/whitney-400.woff") format("woff") } @font-face{ font-family:Whitney; font-weight:500; src:url("fonts/whitney-500.woff") format("woff") } @font-face{ font-family:Whitney; font-weight:600; src:url("fonts/whitney-600.woff") format("woff") } @font-face{ font-family:Whitney; font-weight:700; src:url("fonts/whitney-700.woff") format("woff") } ================================================ FILE: client/src/assets/styles/vendor/_github.scss ================================================ @font-face { font-family: octicons-link; src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff'); } .markdown-body .octicon { display: inline-block; fill: currentColor; vertical-align: text-bottom; } .markdown-body .anchor { float: left; line-height: 1; margin-left: -20px; padding-right: 4px; } .markdown-body .anchor:focus { outline: none; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: $text-normal; vertical-align: middle; visibility: hidden; } .markdown-body h1:hover .anchor, .markdown-body h2:hover .anchor, .markdown-body h3:hover .anchor, .markdown-body h4:hover .anchor, .markdown-body h5:hover .anchor, .markdown-body h6:hover .anchor { text-decoration: none; } .markdown-body h1:hover .anchor .octicon-link, .markdown-body h2:hover .anchor .octicon-link, .markdown-body h3:hover .anchor .octicon-link, .markdown-body h4:hover .anchor .octicon-link, .markdown-body h5:hover .anchor .octicon-link, .markdown-body h6:hover .anchor .octicon-link { visibility: visible; } .markdown-body { -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; color: $text-normal; line-height: 1.5; font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol; font-size: 16px; line-height: 1.5; word-wrap: break-word; } .markdown-body .pl-c { color: #6a737d; } .markdown-body .pl-c1, .markdown-body .pl-s .pl-v { color: #005cc5; } .markdown-body .pl-e, .markdown-body .pl-en { color: #6f42c1; } .markdown-body .pl-s .pl-s1, .markdown-body .pl-smi { color: #24292e; } .markdown-body .pl-ent { color: #22863a; } .markdown-body .pl-k { color: #d73a49; } .markdown-body .pl-pds, .markdown-body .pl-s, .markdown-body .pl-s .pl-pse .pl-s1, .markdown-body .pl-sr, .markdown-body .pl-sr .pl-cce, .markdown-body .pl-sr .pl-sra, .markdown-body .pl-sr .pl-sre { color: #032f62; } .markdown-body .pl-smw, .markdown-body .pl-v { color: #e36209; } .markdown-body .pl-bu { color: #b31d28; } .markdown-body .pl-ii { background-color: #b31d28; color: #fafbfc; } .markdown-body .pl-c2 { background-color: #d73a49; color: #fafbfc; } .markdown-body .pl-c2:before { content: "^M"; } .markdown-body .pl-sr .pl-cce { color: #22863a; font-weight: 700; } .markdown-body .pl-ml { color: #735c0f; } .markdown-body .pl-mh, .markdown-body .pl-mh .pl-en, .markdown-body .pl-ms { color: #005cc5; font-weight: 700; } .markdown-body .pl-mi { color: #24292e; font-style: italic; } .markdown-body .pl-mb { color: #24292e; font-weight: 700; } .markdown-body .pl-md { background-color: #ffeef0; color: #b31d28; } .markdown-body .pl-mi1 { background-color: #f0fff4; color: #22863a; } .markdown-body .pl-mc { background-color: #ffebda; color: #e36209; } .markdown-body .pl-mi2 { background-color: #005cc5; color: #f6f8fa; } .markdown-body .pl-mdr { color: #6f42c1; font-weight: 700; } .markdown-body .pl-ba { color: #586069; } .markdown-body .pl-sg { color: #959da5; } .markdown-body .pl-corl { color: #032f62; text-decoration: underline; } .markdown-body details { display: block; } .markdown-body summary { display: list-item; } .markdown-body a { background-color: transparent; } .markdown-body a:active, .markdown-body a:hover { outline-width: 0; } .markdown-body strong { font-weight: inherit; font-weight: bolder; } .markdown-body h1 { font-size: 2em; margin: .67em 0; } .markdown-body img { border-style: none; } .markdown-body code, .markdown-body kbd, .markdown-body pre { font-family: monospace,monospace; font-size: 1em; } .markdown-body hr { box-sizing: content-box; height: 0; overflow: visible; } .markdown-body input { font: inherit; margin: 0; } .markdown-body input { overflow: visible; } .markdown-body [type=checkbox] { box-sizing: border-box; padding: 0; } .markdown-body * { box-sizing: border-box; } .markdown-body input { font-family: inherit; font-size: inherit; line-height: inherit; } .markdown-body a { color: $text-link; text-decoration: none; } .markdown-body a:hover { text-decoration: underline; } .markdown-body strong { font-weight: 600; } .markdown-body hr { background: transparent; border: 0; border-bottom: 1px solid $background-primary; height: 0; margin: 15px 0; overflow: hidden; } .markdown-body hr:before { content: ""; display: table; } .markdown-body hr:after { clear: both; content: ""; display: table; } .markdown-body table { border-collapse: collapse; border-spacing: 0; } .markdown-body td, .markdown-body th { padding: 0; } .markdown-body details summary { cursor: pointer; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { margin-bottom: 0; margin-top: 0; } .markdown-body h1 { font-size: 32px; } .markdown-body h1, .markdown-body h2 { font-weight: 600; } .markdown-body h2 { font-size: 24px; } .markdown-body h3 { font-size: 20px; } .markdown-body h3, .markdown-body h4 { font-weight: 600; } .markdown-body h4 { font-size: 16px; } .markdown-body h5 { font-size: 14px; } .markdown-body h5, .markdown-body h6 { font-weight: 600; } .markdown-body h6 { font-size: 12px; } .markdown-body p { margin-bottom: 10px; margin-top: 0; } .markdown-body blockquote { margin: 0; } .markdown-body ol, .markdown-body ul { margin-bottom: 0; margin-top: 0; padding-left: 0; } .markdown-body ol ol, .markdown-body ul ol { list-style-type: lower-roman; } .markdown-body ol ol ol, .markdown-body ol ul ol, .markdown-body ul ol ol, .markdown-body ul ul ol { list-style-type: lower-alpha; } .markdown-body dd { margin-left: 0; } .markdown-body code, .markdown-body pre { font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace; font-size: 12px; } .markdown-body pre { margin-bottom: 0; margin-top: 0; } .markdown-body input::-webkit-inner-spin-button, .markdown-body input::-webkit-outer-spin-button { -webkit-appearance: none; appearance: none; margin: 0; } .markdown-body .border { border: 1px solid #e1e4e8!important; } .markdown-body .border-0 { border: 0!important; } .markdown-body .border-bottom { border-bottom: 1px solid #e1e4e8!important; } .markdown-body .rounded-1 { border-radius: 3px!important; } .markdown-body .bg-white { background-color: #fff!important; } .markdown-body .bg-gray-light { background-color: #fafbfc!important; } .markdown-body .text-gray-light { color: $text-normal!important; } .markdown-body .mb-0 { margin-bottom: 0!important; } .markdown-body .my-2 { margin-bottom: 8px!important; margin-top: 8px!important; } .markdown-body .pl-0 { padding-left: 0!important; } .markdown-body .py-0 { padding-bottom: 0!important; padding-top: 0!important; } .markdown-body .pl-1 { padding-left: 4px!important; } .markdown-body .pl-2 { padding-left: 8px!important; } .markdown-body .py-2 { padding-bottom: 8px!important; padding-top: 8px!important; } .markdown-body .pl-3, .markdown-body .px-3 { padding-left: 16px!important; } .markdown-body .px-3 { padding-right: 16px!important; } .markdown-body .pl-4 { padding-left: 24px!important; } .markdown-body .pl-5 { padding-left: 32px!important; } .markdown-body .pl-6 { padding-left: 40px!important; } .markdown-body .f6 { font-size: 12px!important; } .markdown-body .lh-condensed { line-height: 1.25!important; } .markdown-body .text-bold { font-weight: 600!important; } .markdown-body:before { content: ""; display: table; } .markdown-body:after { clear: both; content: ""; display: table; } .markdown-body>:first-child { margin-top: 0!important; } .markdown-body>:last-child { margin-bottom: 0!important; } .markdown-body a:not([href]) { color: inherit; text-decoration: none; } .markdown-body blockquote, .markdown-body dl, .markdown-body ol, .markdown-body p, .markdown-body pre, .markdown-body table, .markdown-body ul { margin-bottom: 16px; margin-top: 0; } .markdown-body hr { background-color: #e1e4e8; border: 0; height: .25em; margin: 24px 0; padding: 0; } .markdown-body blockquote { background-color: $background-primary; border-left: .25em solid $style-primary; color: $text-normal; padding: 0 1em; } .markdown-body blockquote>:first-child { margin-top: 0; } .markdown-body blockquote>:last-child { margin-bottom: 0; } .markdown-body kbd { background-color: #fafbfc; border: 1px solid #c6cbd1; border-bottom-color: #959da5; border-radius: 3px; box-shadow: inset 0 -1px 0 #959da5; color: #444d56; display: inline-block; font-size: 11px; line-height: 10px; padding: 3px 5px; vertical-align: middle; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { font-weight: 600; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; } .markdown-body h1 { font-size: 2em; } .markdown-body h1, .markdown-body h2 { border-bottom: 1px solid #eaecef; padding-bottom: .3em; } .markdown-body h2 { font-size: 1.5em; } .markdown-body h3 { font-size: 1.25em; } .markdown-body h4 { font-size: 1em; } .markdown-body h5 { font-size: .875em; } .markdown-body h6 { color: #6a737d; font-size: .85em; } .markdown-body ol, .markdown-body ul { padding-left: 2em; } .markdown-body ol ol, .markdown-body ol ul, .markdown-body ul ol, .markdown-body ul ul { margin-bottom: 0; margin-top: 0; } .markdown-body li { word-wrap: break-all; } .markdown-body li>p { margin-top: 16px; } .markdown-body li+li { margin-top: .25em; } .markdown-body dl { padding: 0; } .markdown-body dl dt { font-size: 1em; font-style: italic; font-weight: 600; margin-top: 16px; padding: 0; } .markdown-body dl dd { margin-bottom: 16px; padding: 0 16px; } .markdown-body table { display: block; overflow: auto; width: 100%; } .markdown-body table th { font-weight: 600; } .markdown-body table td, .markdown-body table th { border: 1px solid $background-floating; padding: 6px 13px; } .markdown-body table tr { background-color: $background-primary; border-top: 1px solid #c6cbd1; } .markdown-body table tr:nth-child(2n) { background-color: $background-secondary; } .markdown-body img { box-sizing: content-box; max-width: 100%; } .markdown-body img[align=right] { padding-left: 20px; } .markdown-body img[align=left] { padding-right: 20px; } .markdown-body code { background-color: rgba(27,31,35,.05); border-radius: 3px; font-size: 85%; margin: 0; padding: .2em .4em; } .markdown-body pre { word-wrap: normal; } .markdown-body pre>code { background: transparent; border: 0; font-size: 100%; margin: 0; padding: 0; white-space: pre; word-break: normal; } .markdown-body .highlight { margin-bottom: 16px; } .markdown-body .highlight pre { margin-bottom: 0; word-break: normal; } .markdown-body .highlight pre, .markdown-body pre { background-color: $background-primary; border-radius: 3px; font-size: 85%; line-height: 1.45; overflow: auto; padding: 16px; } .markdown-body pre code { background-color: transparent; border: 0; display: inline; line-height: inherit; margin: 0; max-width: auto; overflow: visible; padding: 0; word-wrap: normal; } .markdown-body .commit-tease-sha { color: #444d56; display: inline-block; font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace; font-size: 90%; } .markdown-body .blob-wrapper { border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; overflow-x: auto; overflow-y: hidden; } .markdown-body .blob-wrapper-embedded { max-height: 240px; overflow-y: auto; } .markdown-body .blob-num { -moz-user-select: none; -ms-user-select: none; -webkit-user-select: none; color: rgba(27,31,35,.3); cursor: pointer; font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace; font-size: 12px; line-height: 20px; min-width: 50px; padding-left: 10px; padding-right: 10px; text-align: right; user-select: none; vertical-align: top; white-space: nowrap; width: 1%; } .markdown-body .blob-num:hover { color: rgba(27,31,35,.6); } .markdown-body .blob-num:before { content: attr(data-line-number); } .markdown-body .blob-code { line-height: 20px; padding-left: 10px; padding-right: 10px; position: relative; vertical-align: top; } .markdown-body .blob-code-inner { color: #24292e; font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace; font-size: 12px; overflow: visible; white-space: pre; word-wrap: normal; } .markdown-body .pl-token.active, .markdown-body .pl-token:hover { background: #ffea7f; cursor: pointer; } .markdown-body kbd { background-color: #fafbfc; border: 1px solid #d1d5da; border-bottom-color: #c6cbd1; border-radius: 3px; box-shadow: inset 0 -1px 0 #c6cbd1; color: #444d56; display: inline-block; font: 11px SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace; line-height: 10px; padding: 3px 5px; vertical-align: middle; } .markdown-body :checked+.radio-label { border-color: #0366d6; position: relative; z-index: 1; } .markdown-body .tab-size[data-tab-size="1"] { -moz-tab-size: 1; tab-size: 1; } .markdown-body .tab-size[data-tab-size="2"] { -moz-tab-size: 2; tab-size: 2; } .markdown-body .tab-size[data-tab-size="3"] { -moz-tab-size: 3; tab-size: 3; } .markdown-body .tab-size[data-tab-size="4"] { -moz-tab-size: 4; tab-size: 4; } .markdown-body .tab-size[data-tab-size="5"] { -moz-tab-size: 5; tab-size: 5; } .markdown-body .tab-size[data-tab-size="6"] { -moz-tab-size: 6; tab-size: 6; } .markdown-body .tab-size[data-tab-size="7"] { -moz-tab-size: 7; tab-size: 7; } .markdown-body .tab-size[data-tab-size="8"] { -moz-tab-size: 8; tab-size: 8; } .markdown-body .tab-size[data-tab-size="9"] { -moz-tab-size: 9; tab-size: 9; } .markdown-body .tab-size[data-tab-size="10"] { -moz-tab-size: 10; tab-size: 10; } .markdown-body .tab-size[data-tab-size="11"] { -moz-tab-size: 11; tab-size: 11; } .markdown-body .tab-size[data-tab-size="12"] { -moz-tab-size: 12; tab-size: 12; } .markdown-body .task-list-item { list-style-type: none; } .markdown-body .task-list-item+.task-list-item { margin-top: 3px; } .markdown-body .task-list-item input { margin: 0 .2em .25em -1.6em; vertical-align: middle; } .markdown-body hr { border-bottom-color: #eee; } .markdown-body .pl-0 { padding-left: 0!important; } .markdown-body .pl-1 { padding-left: 4px!important; } .markdown-body .pl-2 { padding-left: 8px!important; } .markdown-body .pl-3 { padding-left: 16px!important; } .markdown-body .pl-4 { padding-left: 24px!important; } .markdown-body .pl-5 { padding-left: 32px!important; } .markdown-body .pl-6 { padding-left: 40px!important; } .markdown-body .pl-7 { padding-left: 48px!important; } .markdown-body .pl-8 { padding-left: 64px!important; } .markdown-body .pl-9 { padding-left: 80px!important; } .markdown-body .pl-10 { padding-left: 96px!important; } .markdown-body .pl-11 { padding-left: 112px!important; } .markdown-body .pl-12 { padding-left: 128px!important; } ================================================ FILE: client/src/assets/styles/vendor/_swal.scss ================================================ @import '~sweetalert2/src/variables'; $swal2-outline-color: transparent; // POPUP $swal2-padding: 1.25em; $swal2-border-radius: .3125em; // BACKGROUND $swal2-background: $background-secondary; // ICONS $swal2-icon-margin: 1.25em auto 1.875em; // IMAGE $swal2-image-margin: 1.25em auto; // TITLE $swal2-title-margin: 0 0 .4em; $swal2-title-color: $interactive-hover; // HTML CONTAINER $swal2-html-container-margin: 0; $swal2-html-container-color: $interactive-hover; // INPUT $swal2-input-margin: 1em auto; $swal2-input-width: 100%; $swal2-input-box-shadow: inset 0 1px 1px rgba($swal2-black, .06); $swal2-input-focus-box-shadow: 0 0 3px #c4e6f5; // PROGRESS STEPS $swal2-progress-steps-background: inherit; $swal2-progress-steps-margin: 0 0 1.25em; $swal2-active-step-background: #3085d6; // FOOTER $swal2-footer-margin: 1.25em 0 0; $swal2-footer-padding: 1em 0 0; $swal2-footer-color: lighten($swal2-black, 33); // CLOSE BUTTON $swal2-close-button-transition: color .1s ease-out; $swal2-close-button-border-radius: 0; $swal2-close-button-outline: initial; $swal2-close-button-color: lighten($swal2-black, 80); // ACTIONS $swal2-actions-width: 100%; // COMMON VARIABLES FOR CONFIRM AND CANCEL BUTTONS $swal2-button-focus-box-shadow: 0 0 0 1px $swal2-background, 0 0 0 3px $swal2-outline-color; // CONFIRM BUTTON $swal2-confirm-button-background-color: $background-tertiary; $swal2-confirm-button-font-size: 1.0625em; $swal2-confirm-button-focus-box-shadow: 0 0 0 3px rgba($swal2-confirm-button-background-color, .5); // CANCEL BUTTON $swal2-cancel-button-background-color: $background-floating; $swal2-cancel-button-font-size: 1.0625em; $swal2-cancel-button-focus-box-shadow: 0 0 0 3px rgba($swal2-cancel-button-background-color, .5); // TOASTS $swal2-toast-box-shadow: 0 0 .625em #d9d9d9; $swal2-toast-width: auto; $swal2-toast-padding: .625em; $swal2-toast-title-margin: 0 .6em; @import "~sweetalert2/src/sweetalert2.scss"; ================================================ FILE: client/src/assets/styles/vendor/_tooltip.scss ================================================ .tooltip { display: block !important; z-index: 10000; .tooltip-inner { background: darken($background-floating, $amount: 5); color: $text-normal; border-radius: 3px; padding: 5px 10px 4px; } .tooltip-arrow { width: 0; height: 0; border-style: solid; position: absolute; margin: 5px; border-color: darken($background-floating, $amount: 5); z-index: 1; } &[x-placement^="top"] { margin-bottom: 5px; .tooltip-arrow { border-width: 5px 5px 0 5px; border-left-color: transparent !important; border-right-color: transparent !important; border-bottom-color: transparent !important; bottom: -5px; left: calc(50% - 5px); margin-top: 0; margin-bottom: 0; } } &[x-placement^="bottom"] { margin-top: 5px; .tooltip-arrow { border-width: 0 5px 5px 5px; border-left-color: transparent !important; border-right-color: transparent !important; border-top-color: transparent !important; top: -5px; left: calc(50% - 5px); margin-top: 0; margin-bottom: 0; } } &[x-placement^="right"] { margin-left: 5px; .tooltip-arrow { border-width: 5px 5px 5px 0; border-left-color: transparent !important; border-top-color: transparent !important; border-bottom-color: transparent !important; left: -5px; top: calc(50% - 5px); margin-left: 0; margin-right: 0; } } &[x-placement^="left"] { margin-right: 5px; .tooltip-arrow { border-width: 5px 0 5px 5px; border-top-color: transparent !important; border-right-color: transparent !important; border-bottom-color: transparent !important; right: -5px; top: calc(50% - 5px); margin-left: 0; margin-right: 0; } } &.popover { $color: $text-normal; .popover-inner { background: $color; color: $background-floating; padding: 24px; border-radius: 3px; box-shadow: 0 5px 30px rgba(black, .1); } .popover-arrow { border-color: $color; } } &[aria-hidden='true'] { visibility: hidden; opacity: 0; transition: opacity .15s, visibility .15s; } &[aria-hidden='false'] { visibility: visible; opacity: 1; transition: opacity .15s; } } ================================================ FILE: client/src/components/about.vue ================================================ ================================================ FILE: client/src/components/avatar.vue ================================================ ================================================ FILE: client/src/components/chat.vue ================================================