├── .editorconfig ├── .github └── workflows │ ├── composer-normalize.yml │ ├── markdown-normalize.yml │ ├── run-tests.yml │ └── stale-issues.yml ├── .styleci.yml ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── composer.json └── src ├── Concerns └── Configurable.php ├── EmojiText.php ├── Replacer.php ├── Twemoji.php └── emoji_bytes.regexp /.editorconfig: -------------------------------------------------------------------------------- 1 | ; This file is for unifying the coding style for different editors and IDEs. 2 | ; More information at http://editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | charset = utf-8 8 | indent_size = 4 9 | indent_style = space 10 | end_of_line = lf 11 | insert_final_newline = true 12 | trim_trailing_whitespace = true 13 | 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.github/workflows/composer-normalize.yml: -------------------------------------------------------------------------------- 1 | name: normalize composer.json 2 | 3 | on: 4 | push: 5 | paths: 6 | - 'composer.json' 7 | 8 | jobs: 9 | normalize: 10 | timeout-minutes: 1 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Git checkout 14 | uses: actions/checkout@v2 15 | 16 | - name: Validate Composer configuration 17 | run: composer validate --strict 18 | 19 | - name: Normalize composer.json 20 | run: | 21 | composer global require ergebnis/composer-normalize 22 | composer normalize --indent-style=space --indent-size=4 --no-check-lock --no-update-lock --no-interaction --ansi 23 | 24 | - uses: stefanzweifel/git-auto-commit-action@v4.0.0 25 | with: 26 | commit_message: normalize composer.json 27 | -------------------------------------------------------------------------------- /.github/workflows/markdown-normalize.yml: -------------------------------------------------------------------------------- 1 | name: normalize markdown 2 | 3 | on: 4 | push: 5 | paths: 6 | - '*.md' 7 | 8 | jobs: 9 | normalize: 10 | timeout-minutes: 1 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Git checkout 14 | uses: actions/checkout@v2 15 | 16 | - name: Prettify markdown 17 | uses: creyD/prettier_action@v3.0 18 | with: 19 | prettier_options: --write **/*.md 20 | -------------------------------------------------------------------------------- /.github/workflows/run-tests.yml: -------------------------------------------------------------------------------- 1 | name: run-tests 2 | 3 | on: 4 | push: 5 | pull_request: 6 | schedule: 7 | - cron: '0 0 * * *' 8 | 9 | jobs: 10 | test: 11 | if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository 12 | 13 | runs-on: ubuntu-latest 14 | 15 | strategy: 16 | fail-fast: true 17 | matrix: 18 | php: [7.4, 8.0] 19 | dependency-version: [prefer-lowest, prefer-stable] 20 | 21 | name: P${{ matrix.php }} - ${{ matrix.dependency-version }} 22 | 23 | steps: 24 | - name: Checkout code 25 | uses: actions/checkout@v2 26 | 27 | - name: Setup PHP 28 | uses: shivammathur/setup-php@v2 29 | with: 30 | php-version: ${{ matrix.php }} 31 | extensions: mbstring, json 32 | 33 | - name: Cache dependencies 34 | uses: actions/cache@v2 35 | with: 36 | path: ~/.composer/cache/files 37 | key: dependencies-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }} 38 | restore-keys: | 39 | dependencies-php-${{ matrix.php }}-composer- 40 | dependencies-php- 41 | 42 | - name: Install dependencies 43 | run: composer update --${{ matrix.dependency-version }} --prefer-dist --no-interaction --no-suggest 44 | 45 | - name: Execute tests 46 | run: vendor/bin/pest 47 | -------------------------------------------------------------------------------- /.github/workflows/stale-issues.yml: -------------------------------------------------------------------------------- 1 | name: "Close stale issues" 2 | on: 3 | schedule: 4 | - cron: "0 0 * * *" 5 | 6 | jobs: 7 | default: 8 | timeout-minutes: 1 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/stale@v2.0.0 12 | with: 13 | repo-token: ${{ secrets.GITHUB_TOKEN }} 14 | stale-issue-message: 'This issue is stale because it has been open 21 days with no activity. Remove stale label or comment or this will be closed in 7 days' 15 | stale-issue-label: 'stale' 16 | exempt-issue-labels: 'bug,enhancement,documentation,help wanted,next release,next major release' 17 | days-before-stale: 21 18 | days-before-close: 7 19 | 20 | invalid: 21 | timeout-minutes: 1 22 | runs-on: ubuntu-latest 23 | steps: 24 | - uses: actions/stale@v2.0.0 25 | with: 26 | repo-token: ${{ secrets.GITHUB_TOKEN }} 27 | stale-issue-message: 'This issue is stale because it has been labeled as invalid.' 28 | stale-issue-label: 'stale' 29 | only-labels: 'invalid' 30 | days-before-stale: 1 31 | days-before-close: 2 32 | 33 | duplicate: 34 | timeout-minutes: 1 35 | runs-on: ubuntu-latest 36 | steps: 37 | - uses: actions/stale@v2.0.0 38 | with: 39 | repo-token: ${{ secrets.GITHUB_TOKEN }} 40 | stale-issue-message: 'This issue is stale because it has been labeled as duplicate.' 41 | stale-issue-label: 'stale' 42 | only-labels: 'duplicate' 43 | days-before-stale: 1 44 | days-before-close: 2 45 | 46 | wontfix: 47 | timeout-minutes: 1 48 | runs-on: ubuntu-latest 49 | steps: 50 | - uses: actions/stale@v2.0.0 51 | with: 52 | repo-token: ${{ secrets.GITHUB_TOKEN }} 53 | stale-issue-message: 'This issue is stale because it has been labeled as wontfix.' 54 | stale-issue-label: 'stale' 55 | only-labels: 'wontfix' 56 | days-before-stale: 1 57 | days-before-close: 2 58 | -------------------------------------------------------------------------------- /.styleci.yml: -------------------------------------------------------------------------------- 1 | preset: laravel 2 | 3 | risky: true 4 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to `php-twemoj` will be documented in this file 4 | 5 | ## v0.2.2 - 2022-02-05 6 | 7 | - fix Emoji RegEx to match Emojis. - [#6](https://github.com/Astrotomic/php-twemoji/pull/6) & [#9](https://github.com/Astrotomic/php-twemoji/pull/9) 8 | 9 | ## v0.2.1 - 2021-08-25 10 | 11 | - fix `\Astrotomic\Twemoji\EmojiText` internal declaration - [#5](https://github.com/Astrotomic/php-twemoji/pull/5) 12 | 13 | ## v0.2.0 - 2021-05-11 14 | 15 | - add `\Astrotomic\Twemoji\Twemoji::text()` method and underlying `\Astrotomic\Twemoji\Replacer` class - [#8](https://github.com/Astrotomic/php-twemoji/pull/8) 16 | 17 | ## v0.1.1 - 2021-01-02 18 | 19 | - add PHP 8.0 support - [#1](https://github.com/Astrotomic/php-twemoji/pull/1) 20 | 21 | ## v0.1.0 - 2020-11-17 22 | 23 | - initial release 24 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Astrotomic 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PHP Twemoji 2 | 3 | [![Latest Version](http://img.shields.io/packagist/v/astrotomic/php-twemoji.svg?label=Release&style=for-the-badge)](https://packagist.org/packages/astrotomic/php-twemoji) 4 | [![MIT License](https://img.shields.io/github/license/Astrotomic/php-twemoji.svg?label=License&color=blue&style=for-the-badge)](https://github.com/Astrotomic/php-twemoji/blob/master/LICENSE) 5 | [![Offset Earth](https://img.shields.io/badge/Treeware-%F0%9F%8C%B3-green?style=for-the-badge)](https://plant.treeware.earth/Astrotomic/php-twemoji) 6 | [![Larabelles](https://img.shields.io/badge/Larabelles-%F0%9F%A6%84-lightpink?style=for-the-badge)](https://www.larabelles.com/) 7 | 8 | [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/Astrotomic/php-twemoji/run-tests?style=flat-square&logoColor=white&logo=github&label=Tests)](https://github.com/Astrotomic/php-twemoji/actions?query=workflow%3Arun-tests) 9 | [![StyleCI](https://styleci.io/repos/307185950/shield)](https://styleci.io/repos/307185950) 10 | [![Total Downloads](https://img.shields.io/packagist/dt/astrotomic/php-twemoji.svg?label=Downloads&style=flat-square)](https://packagist.org/packages/astrotomic/php-twemoji) 11 | 12 | This package provides a fluent PHP OOP builder for [Twemoji](https://twemoji.twitter.com) URLs. 13 | 14 | ## Installation 15 | 16 | You can install the package via composer: 17 | 18 | ```bash 19 | composer require astrotomic/php-twemoji 20 | ``` 21 | 22 | ## Usage 23 | 24 | ### Single Emojis 25 | 26 | You can use the `Twemoji::emoji()` method to get the Twemoji image URL for a single emoji. 27 | 28 | ```php 29 | use Astrotomic\Twemoji\Twemoji; 30 | 31 | Twemoji::emoji('🎉')->url(); 32 | // https://cdn.jsdelivr.net/gh/twitter/twemoji@latest/assets/svg/1f389.svg 33 | 34 | Twemoji::emoji('🎉')->png()->url(); 35 | // https://cdn.jsdelivr.net/gh/twitter/twemoji@latest/assets/72x72/1f389.png 36 | 37 | Twemoji::emoji('🎉')->base('https://twemoji.astrotomic.info')->url(); 38 | // https://twemoji.astrotomic.info/svg/1f389.svg 39 | ``` 40 | 41 | ### Multiple Emojis in Text 42 | 43 | If you have a text and want to replace all emojis with Twemoji image tags (Markdown or HTML) you can use the `Twemoji::text()` method. 44 | This isn't aware of emojis in attributes or anything - it just finds and replaces all Emojis in the given string. 45 | 46 | ```php 47 | use Astrotomic\Twemoji\Twemoji; 48 | 49 | Twemoji::text("Hello 👋🏿")->toMarkdown(); 50 | // Hello ![👋🏿](https://cdn.jsdelivr.net/gh/twitter/twemoji@latest/assets/svg/1f44b-1f3ff.svg) 51 | 52 | Twemoji::text("Hello 👋🏿")->png()->toMarkdown(); 53 | // Hello ![👋🏿](https://cdn.jsdelivr.net/gh/twitter/twemoji@latest/assets/72x72/1f44b-1f3ff.png) 54 | ``` 55 | 56 | In case you want to configure the replacer once and bind it to your container for example you can do that as well. 57 | 58 | ```php 59 | use Astrotomic\Twemoji\Replacer; 60 | 61 | $replacer = (new Replacer())->png(); 62 | 63 | $replacer->text("Hello 👋🏿")->toMarkdown(); 64 | // Hello ![👋🏿](https://cdn.jsdelivr.net/gh/twitter/twemoji@latest/assets/72x72/1f44b-1f3ff.png) 65 | ``` 66 | 67 | You can also override the replacer configuration for the specific replace operation without altering the replacer configuration. 68 | 69 | ```php 70 | $replacer->text("Hello 👋🏿")->svg()->toMarkdown(); 71 | // Hello ![👋🏿](https://cdn.jsdelivr.net/gh/twitter/twemoji@latest/assets/1f44b-1f3ff.svg) 72 | ``` 73 | 74 | ## Testing 75 | 76 | ```bash 77 | composer test 78 | ``` 79 | 80 | ## Changelog 81 | 82 | Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. 83 | 84 | ## Contributing 85 | 86 | Please see [CONTRIBUTING](https://github.com/Astrotomic/.github/blob/master/CONTRIBUTING.md) for details. You could also be interested in [CODE OF CONDUCT](https://github.com/Astrotomic/.github/blob/master/CODE_OF_CONDUCT.md). 87 | 88 | ### Security 89 | 90 | If you discover any security related issues, please check [SECURITY](https://github.com/Astrotomic/.github/blob/master/SECURITY.md) for steps to report it. 91 | 92 | ## Credits 93 | 94 | - [Tom Witkowski](https://github.com/Gummibeer) 95 | - [All Contributors](../../contributors) 96 | 97 | ## License 98 | 99 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 100 | 101 | ## Treeware 102 | 103 | You're free to use this package, but if it makes it to your production environment I would highly appreciate you buying the world a tree. 104 | 105 | It’s now common knowledge that one of the best tools to tackle the climate crisis and keep our temperatures from rising above 1.5C is to [plant trees](https://www.bbc.co.uk/news/science-environment-48870920). If you contribute to my forest you’ll be creating employment for local families and restoring wildlife habitats. 106 | 107 | You can buy trees at [offset.earth/treeware](https://plant.treeware.earth/Astrotomic/php-twemoji) 108 | 109 | Read more about Treeware at [treeware.earth](https://treeware.earth) 110 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "astrotomic/php-twemoji", 3 | "description": "Easily generate Twemoji URLs", 4 | "license": "MIT", 5 | "keywords": [ 6 | "emoji", 7 | "twemoji", 8 | "unicode" 9 | ], 10 | "authors": [ 11 | { 12 | "name": "Tom Witkowski", 13 | "email": "gummibeer@astrotomic.info", 14 | "homepage": "https://astrotomic.info", 15 | "role": "Developer" 16 | } 17 | ], 18 | "homepage": "https://github.com/Astrotomic/php-twemoji", 19 | "require": { 20 | "php": "^7.4 || ^8.0", 21 | "ext-json": "*", 22 | "ext-mbstring": "*" 23 | }, 24 | "require-dev": { 25 | "pestphp/pest": "^0.3.0", 26 | "s9e/regexp-builder": "^1.4", 27 | "spatie/emoji": "^2.3.0", 28 | "spatie/pest-plugin-snapshots": "^1.0" 29 | }, 30 | "suggest": { 31 | "spatie/emoji": "*" 32 | }, 33 | "minimum-stability": "dev", 34 | "prefer-stable": true, 35 | "autoload": { 36 | "psr-4": { 37 | "Astrotomic\\Twemoji\\": "src" 38 | } 39 | }, 40 | "config": { 41 | "sort-packages": true 42 | }, 43 | "scripts": { 44 | "generate": "php ./generate.php", 45 | "test": "vendor/bin/pest" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/Concerns/Configurable.php: -------------------------------------------------------------------------------- 1 | base = rtrim($base, '/'); 16 | 17 | return $this; 18 | } 19 | 20 | public function type(string $type): self 21 | { 22 | $this->type = $type; 23 | 24 | return $this; 25 | } 26 | 27 | public function svg(): self 28 | { 29 | $this->type = Twemoji::SVG; 30 | 31 | return $this; 32 | } 33 | 34 | public function png(): self 35 | { 36 | $this->type = Twemoji::PNG; 37 | 38 | return $this; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/EmojiText.php: -------------------------------------------------------------------------------- 1 | text = $text; 17 | } 18 | 19 | public function toMarkdown(?Closure $alt = null): string 20 | { 21 | return $this->replace('![%{alt}](%{src})', $alt); 22 | } 23 | 24 | public function toHtml(?Closure $alt = null, array $attributes = []): string 25 | { 26 | $attributes = array_merge([ 27 | 'width' => 72, 28 | 'height' => 72, 29 | 'loading' => 'lazy', 30 | 'class' => 'twemoji', 31 | ], $attributes); 32 | 33 | $attrs = implode(' ', array_map( 34 | fn (string $key, string $value): string => "{$key}=\"{$value}\"", 35 | array_keys($attributes), 36 | array_values($attributes) 37 | )); 38 | 39 | return $this->replace('%{alt}', $alt); 40 | } 41 | 42 | protected function replace(string $replacement, ?Closure $alt = null): string 43 | { 44 | $text = $this->text; 45 | 46 | $text = preg_replace_callback( 47 | $this->regexp(), 48 | fn (array $matches): string => str_replace( 49 | ['%{alt}', '%{src}'], 50 | [ 51 | $alt 52 | ? $alt($matches[0]) 53 | : $matches[0], 54 | Twemoji::emoji($matches[0]) 55 | ->base($this->base) 56 | ->type($this->type) 57 | ->url(), 58 | ], 59 | $replacement 60 | ), 61 | $text 62 | ); 63 | 64 | return $text; 65 | } 66 | 67 | protected function regexp(): string 68 | { 69 | return '/'.file_get_contents(__DIR__.'/emoji_bytes.regexp').'/'; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/Replacer.php: -------------------------------------------------------------------------------- 1 | base($this->base) 15 | ->type($this->type); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/Twemoji.php: -------------------------------------------------------------------------------- 1 | codepoints = $codepoints; 24 | } 25 | 26 | public static function emoji(string $emoji): self 27 | { 28 | $chars = preg_split('//u', $emoji, -1, PREG_SPLIT_NO_EMPTY); 29 | 30 | $codepoints = array_map( 31 | fn (string $code): string => dechex(mb_ord($code)), 32 | $chars 33 | ); 34 | 35 | // Normalize codepoints for Twemoji 36 | $codepoints[0] = ltrim($codepoints[0], '0'); 37 | 38 | if (! in_array('200d', $codepoints)) { 39 | $codepoints = array_diff($codepoints, ['fe0f']); 40 | } 41 | 42 | return new static($codepoints); 43 | } 44 | 45 | public static function text(string $text): EmojiText 46 | { 47 | return new EmojiText($text); 48 | } 49 | 50 | public function url(): string 51 | { 52 | return sprintf( 53 | '%s/%s/%s.%s', 54 | $this->base, 55 | $this->type === self::PNG ? '72x72' : 'svg', 56 | implode('-', $this->codepoints), 57 | $this->type 58 | ); 59 | } 60 | 61 | #[\ReturnTypeWillChange] 62 | public function jsonSerialize() 63 | { 64 | return $this->url(); 65 | } 66 | 67 | public function __toString(): string 68 | { 69 | return $this->url(); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/emoji_bytes.regexp: -------------------------------------------------------------------------------- 1 | (?:[#*0-9]\xE2\x83\xA3|\xC2[\xA9\xAE]|\xE2(?:\x80\xBC|\x81\x89|\x84[\xA2\xB9]|\x86[\x94-\x99\xA9\xAA]|\x8C[\x9A\x9B\xA8]|\x8F[\x8F\xA9-\xB3\xB8-\xBA]|\x93\x82|\x96[\xAA\xAB\xB6]|\x97[\x80\xBB-\xBE]|\x98(?:[\x80-\x84\x8E\x91\x94\x95\x98\xA0\xA2\xA3\xA6\xAA\xAE\xAF\xB8-\xBA]|\x9D(?:\xF0\x9F\x8F[\xBB-\xBF])?)|\x99[\x80\x82\x88-\x93\x9F\xA0\xA3\xA5\xA6\xA8\xBB\xBE\xBF]|\x9A[\x92-\x97\x99\x9B\x9C\xA0\xA1\xA7\xAA\xAB\xB0\xB1\xBD\xBE]|\x9B(?:[\x84\x85\x88\x8E\x8F\x91\x93\x94\xA9\xAA\xB0-\xB5\xB7\xB8\xBA\xBD]|\xB9(?:\xEF\xB8\x8F\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F|\xF0\x9F\x8F[\xBB-\xBF](?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?)?)|\x9C(?:[\x8A-\x8D](?:\xF0\x9F\x8F[\xBB-\xBF])?|[\x82\x85\x88\x89\x8F\x92\x94\x96\x9D\xA1\xA8\xB3\xB4])|\x9D(?:[\x84\x87\x8C\x8E\x93-\x95\x97\xA3]|\xA4(?:\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x94\xA5|\xA9\xB9))?)|\x9E[\x95-\x97\xA1\xB0\xBF]|\xA4[\xB4\xB5]|\xAC[\x85-\x87\x9B\x9C]|\xAD[\x90\x95])|\xE3(?:\x80[\xB0\xBD]|\x8A[\x97\x99])|\xF0\x9F(?:\x80\x84|\x83\x8F|\x85[\xB0\xB1\xBE\xBF]|\x86[\x8E\x91-\x9A]|\x87(?:\xA6\xF0\x9F\x87[\xA8-\xAC\xAE\xB1\xB2\xB4\xB6-\xBA\xBC\xBD\xBF]|\xA7\xF0\x9F\x87[\xA6\xA7\xA9-\xAF\xB1-\xB4\xB6-\xB9\xBB\xBC\xBE\xBF]|\xA8\xF0\x9F\x87[\xA6\xA8\xA9\xAB-\xAE\xB0-\xB5\xB7\xBA-\xBF]|\xA9\xF0\x9F\x87[\xAA\xAC\xAF\xB0\xB2\xB4\xBF]|\xAA\xF0\x9F\x87[\xA6\xA8\xAA\xAC\xAD\xB7-\xBA]|\xAB\xF0\x9F\x87[\xAE-\xB0\xB2\xB4\xB7]|\xAC\xF0\x9F\x87[\xA6\xA7\xA9-\xAE\xB1-\xB3\xB5-\xBA\xBC\xBE]|\xAD\xF0\x9F\x87[\xB0\xB2\xB3\xB7\xB9\xBA]|\xAE\xF0\x9F\x87[\xA8-\xAA\xB1-\xB4\xB6-\xB9]|\xAF\xF0\x9F\x87[\xAA\xB2\xB4\xB5]|\xB0\xF0\x9F\x87[\xAA\xAC-\xAE\xB2\xB3\xB5\xB7\xBC\xBE\xBF]|\xB1\xF0\x9F\x87[\xA6-\xA8\xAE\xB0\xB7-\xBB\xBE]|\xB2\xF0\x9F\x87[\xA6\xA8-\xAD\xB0-\xBF]|\xB3\xF0\x9F\x87[\xA6\xA8\xAA-\xAC\xAE\xB1\xB4\xB5\xB7\xBA\xBF]|\xB4\xF0\x9F\x87\xB2|\xB5\xF0\x9F\x87[\xA6\xAA-\xAD\xB0-\xB3\xB7-\xB9\xBC\xBE]|\xB6\xF0\x9F\x87\xA6|\xB7\xF0\x9F\x87[\xAA\xB4\xB8\xBA\xBC]|\xB8\xF0\x9F\x87[\xA6-\xAA\xAC-\xB4\xB7-\xB9\xBB\xBD-\xBF]|\xB9\xF0\x9F\x87[\xA6\xA8\xA9\xAB-\xAD\xAF-\xB4\xB7\xB9\xBB\xBC\xBF]|\xBA\xF0\x9F\x87[\xA6\xAC\xB2\xB3\xB8\xBE\xBF]|\xBB\xF0\x9F\x87[\xA6\xA8\xAA\xAC\xAE\xB3\xBA]|\xBC\xF0\x9F\x87[\xAB\xB8]|\xBD\xF0\x9F\x87\xB0|\xBE\xF0\x9F\x87[\xAA\xB9]|\xBF\xF0\x9F\x87[\xA6\xB2\xBC])|\x88[\x81\x82\x9A\xAF\xB2-\xBA]|\x89[\x90\x91]|\x8C[\x80-\xA1\xA4-\xBF]|\x8D[\x80-\xBF]|\x8E(?:[\x80-\x84\x86-\x93\x96\x97\x99-\x9B\x9E-\xBF]|\x85(?:\xF0\x9F\x8F[\xBB-\xBF])?)|\x8F(?:[\x82\x87](?:\xF0\x9F\x8F[\xBB-\xBF])?|[\x83\x84\x8A](?:\xF0\x9F\x8F[\xBB-\xBF])?(?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?|[\x8B\x8C](?:\xEF\xB8\x8F\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F|\xF0\x9F\x8F[\xBB-\xBF](?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?)?|[\x80\x81\x85\x86\x88\x89\x8D-\xB0\xB5\xB7-\xBF]|\xB3(?:\xEF\xB8\x8F\xE2\x80\x8D(?:\xE2\x9A\xA7\xEF\xB8\x8F|\xF0\x9F\x8C\x88))?|\xB4(?:\xE2\x80\x8D\xE2\x98\xA0\xEF\xB8\x8F|\xF3\xA0\x81\xA7\xF3\xA0\x81\xA2\xF3\xA0\x81(?:\xA5\xF3\xA0\x81\xAE\xF3\xA0\x81\xA7|\xB3\xF3\xA0\x81\xA3\xF3\xA0\x81\xB4|\xB7\xF3\xA0\x81\xAC\xF3\xA0\x81\xB3)\xF3\xA0\x81\xBF)?)|\x90(?:[\x80-\x87\x89-\x94\x96-\xBA\xBC-\xBF]|\x88(?:\xE2\x80\x8D\xE2\xAC\x9B)?|\x95(?:\xE2\x80\x8D\xF0\x9F\xA6\xBA)?|\xBB(?:\xE2\x80\x8D\xE2\x9D\x84\xEF\xB8\x8F)?)|\x91(?:[\x82\x83\x86-\x90\xA6\xA7\xAB-\xAD\xB2\xB4-\xB6\xB8\xBC](?:\xF0\x9F\x8F[\xBB-\xBF])?|[\xAE\xB0\xB1\xB3\xB7](?:\xF0\x9F\x8F[\xBB-\xBF])?(?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?|[\x80\x84\x85\x91-\xA5\xAA\xB9-\xBB\xBD-\xBF]|\x81(?:\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F\x97\xA8\xEF\xB8\x8F)?|\xA8(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91\xA8)|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x91(?:[\xA8\xA9]\xE2\x80\x8D\xF0\x9F\x91(?:\xA6(?:\xE2\x80\x8D\xF0\x9F\x91\xA6)?|\xA7(?:\xE2\x80\x8D\xF0\x9F\x91[\xA6\xA7])?)|\xA6(?:\xE2\x80\x8D\xF0\x9F\x91\xA6)?|\xA7(?:\xE2\x80\x8D\xF0\x9F\x91[\xA6\xA7])?)|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA6[\xAF-\xB3\xBC\xBD]))|\xF0\x9F\x8F(?:\xBB(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91\xA8\xF0\x9F\x8F[\xBB-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\x91\xA8\xF0\x9F\x8F[\xBC-\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBC(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91\xA8\xF0\x9F\x8F[\xBB-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\x91\xA8\xF0\x9F\x8F[\xBB\xBD-\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBD(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91\xA8\xF0\x9F\x8F[\xBB-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\x91\xA8\xF0\x9F\x8F[\xBB\xBC\xBE\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBE(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91\xA8\xF0\x9F\x8F[\xBB-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\x91\xA8\xF0\x9F\x8F[\xBB-\xBD\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBF(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91\xA8\xF0\x9F\x8F[\xBB-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\x91\xA8\xF0\x9F\x8F[\xBB-\xBE]|\xA6[\xAF-\xB3\xBC\xBD])))?))?|\xA9(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91[\xA8\xA9])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x91(?:\xA6(?:\xE2\x80\x8D\xF0\x9F\x91\xA6)?|\xA7(?:\xE2\x80\x8D\xF0\x9F\x91[\xA6\xA7])?|\xA9\xE2\x80\x8D\xF0\x9F\x91(?:\xA6(?:\xE2\x80\x8D\xF0\x9F\x91\xA6)?|\xA7(?:\xE2\x80\x8D\xF0\x9F\x91[\xA6\xA7])?))|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA6[\xAF-\xB3\xBC\xBD]))|\xF0\x9F\x8F(?:\xBB(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91[\xA8\xA9]\xF0\x9F\x8F[\xBB-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\x91[\xA8\xA9]\xF0\x9F\x8F[\xBC-\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBC(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91[\xA8\xA9]\xF0\x9F\x8F[\xBB-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\x91[\xA8\xA9]\xF0\x9F\x8F[\xBB\xBD-\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBD(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91[\xA8\xA9]\xF0\x9F\x8F[\xBB-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\x91[\xA8\xA9]\xF0\x9F\x8F[\xBB\xBC\xBE\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBE(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91[\xA8\xA9]\xF0\x9F\x8F[\xBB-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\x91[\xA8\xA9]\xF0\x9F\x8F[\xBB-\xBD\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBF(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\x91[\xA8\xA9]\xF0\x9F\x8F[\xBB-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\x91[\xA8\xA9]\xF0\x9F\x8F[\xBB-\xBE]|\xA6[\xAF-\xB3\xBC\xBD])))?))?|\xAF(?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?)|\x92(?:[\x81\x82\x86\x87](?:\xF0\x9F\x8F[\xBB-\xBF])?(?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?|[\x83\x85\x8F\x91\xAA](?:\xF0\x9F\x8F[\xBB-\xBF])?|[\x80\x84\x88-\x8E\x90\x92-\xA9\xAB-\xBF])|\x93[\x80-\xBD\xBF]|\x94[\x80-\xBD]|\x95(?:[\xB4\xBA](?:\xF0\x9F\x8F[\xBB-\xBF])?|[\x89-\x8E\x90-\xA7\xAF\xB0\xB3\xB6-\xB9]|\xB5(?:\xEF\xB8\x8F\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F|\xF0\x9F\x8F[\xBB-\xBF](?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?)?)|\x96(?:[\x90\x95\x96](?:\xF0\x9F\x8F[\xBB-\xBF])?|[\x87\x8A-\x8D\xA4\xA5\xA8\xB1\xB2\xBC])|\x97[\x82-\x84\x91-\x93\x9C-\x9E\xA1\xA3\xA8\xAF\xB3\xBA-\xBF]|\x98(?:[\x80-\xAD\xAF-\xB4\xB7-\xBF]|\xAE(?:\xE2\x80\x8D\xF0\x9F\x92\xA8)?|\xB5(?:\xE2\x80\x8D\xF0\x9F\x92\xAB)?|\xB6(?:\xE2\x80\x8D\xF0\x9F\x8C\xAB\xEF\xB8\x8F)?)|\x99(?:[\x85-\x87\x8B\x8D\x8E](?:\xF0\x9F\x8F[\xBB-\xBF])?(?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?|[\x8C\x8F](?:\xF0\x9F\x8F[\xBB-\xBF])?|[\x80-\x84\x88-\x8A])|\x9A(?:[\xA3\xB4-\xB6](?:\xF0\x9F\x8F[\xBB-\xBF])?(?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?|[\x80-\xA2\xA4-\xB3\xB7-\xBF])|\x9B(?:[\x80\x8C](?:\xF0\x9F\x8F[\xBB-\xBF])?|[\x81-\x85\x8B\x8D-\x92\x95-\x97\xA0-\xA5\xA9\xAB\xAC\xB0\xB3-\xBC])|\x9F[\xA0-\xAB]|\xA4(?:[\x8C\x8F\x98-\x9C\x9E\x9F\xB0-\xB4\xB6](?:\xF0\x9F\x8F[\xBB-\xBF])?|[\xA6\xB5\xB7-\xB9\xBD\xBE](?:\xF0\x9F\x8F[\xBB-\xBF])?(?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?|[\x8D\x8E\x90-\x97\x9D\xA0-\xA5\xA7-\xAF\xBA\xBF]|\xBC(?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?)|\xA5(?:[\x80-\x85\x87-\xB6\xB8\xBA-\xBF]|\xB7(?:\xF0\x9F\x8F[\xBB-\xBF])?)|\xA6(?:[\xB5\xB6\xBB](?:\xF0\x9F\x8F[\xBB-\xBF])?|[\xB8\xB9](?:\xF0\x9F\x8F[\xBB-\xBF])?(?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?|[\x80-\xB4\xB7\xBA\xBC-\xBF])|\xA7(?:[\x8D-\x8F\x94\x96-\x9D](?:\xF0\x9F\x8F[\xBB-\xBF])?(?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?|[\x92\x93\x95](?:\xF0\x9F\x8F[\xBB-\xBF])?|[\x9E\x9F](?:\xE2\x80\x8D\xE2\x99[\x80\x82]\xEF\xB8\x8F)?|[\x80-\x8B\x90\xA0-\xBF]|\x91(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]|\x9C\x88)\xEF\xB8\x8F|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x84\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\xA7\x91|\xA6[\xAF-\xB3\xBC\xBD]))|\xF0\x9F\x8F(?:\xBB(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\xA7\x91\xF0\x9F\x8F[\xBC-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x84\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\xA7\x91\xF0\x9F\x8F[\xBB-\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBC(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\xA7\x91\xF0\x9F\x8F[\xBB\xBD-\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x84\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\xA7\x91\xF0\x9F\x8F[\xBB-\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBD(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\xA7\x91\xF0\x9F\x8F[\xBB\xBC\xBE\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x84\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\xA7\x91\xF0\x9F\x8F[\xBB-\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBE(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\xA7\x91\xF0\x9F\x8F[\xBB-\xBD\xBF])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x84\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\xA7\x91\xF0\x9F\x8F[\xBB-\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?|\xBF(?:\xE2\x80\x8D(?:\xE2(?:\x9A[\x95\x96]\xEF\xB8\x8F|\x9C\x88\xEF\xB8\x8F|\x9D\xA4\xEF\xB8\x8F\xE2\x80\x8D\xF0\x9F(?:\x92\x8B\xE2\x80\x8D\xF0\x9F)?\xA7\x91\xF0\x9F\x8F[\xBB-\xBE])|\xF0\x9F(?:\x8C\xBE|\x8D[\xB3\xBC]|\x8E[\x84\x93\xA4\xA8]|\x8F[\xAB\xAD]|\x92[\xBB\xBC]|\x94[\xA7\xAC]|\x9A[\x80\x92]|\xA4\x9D\xE2\x80\x8D\xF0\x9F\xA7\x91\xF0\x9F\x8F[\xBB-\xBF]|\xA6[\xAF-\xB3\xBC\xBD])))?))?)|\xA9[\xB0-\xB4\xB8-\xBA]|\xAA[\x80-\x86\x90-\xA8\xB0-\xB6]|\xAB[\x80-\x82\x90-\x96])) --------------------------------------------------------------------------------