From ed2082e075904350e5965ceff43a5f81068b665b Mon Sep 17 00:00:00 2001 From: Syahran Saputra Date: Fri, 13 Jan 2023 15:38:58 +0800 Subject: [PATCH 01/60] Update header.blade.php (#610) Fix bug Foto & Nama Camat di Menu Profil --- resources/views/layouts/frontends/header.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/layouts/frontends/header.blade.php b/resources/views/layouts/frontends/header.blade.php index 73f21eaed..4f5307634 100644 --- a/resources/views/layouts/frontends/header.blade.php +++ b/resources/views/layouts/frontends/header.blade.php @@ -32,8 +32,8 @@ {{ strip_tags($profil->sambutan) }}
  • - -
    {{ $profil->nama_camat }}
    + +
    {{ $camat->namaGelar }}
    {{ $sebutan_kepala_wilayah }} {{ $profil->nama_kecamatan }}
  • From 33c111d8f4014422cbf074c3b864e507d3400fb7 Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Fri, 13 Jan 2023 14:41:44 +0700 Subject: [PATCH 02/60] Mutakhirkan catatan rilis --- catatan_rilis.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/catatan_rilis.md b/catatan_rilis.md index c86c902e9..ef683270f 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -3,12 +3,7 @@ Di rilis v23.01.01, menyediakan fitur Widget Perangkat Kecamatan dan Tombol Reset Peta. Rilis ini juga berisi perbaikan lain yang diminta Komunitas OpenDK. #### Penambahan Fitur -1. [#579](https://github.com/OpenSID/OpenDK/issues/579) Penambahan fitur tombol reset peta kecamatan. -2. [#574](https://github.com/OpenSID/OpenDK/issues/574) Penambahan widget untuk menampilkan daftar perangkat kecamatan. -3. [#576](https://github.com/OpenSID/OpenDK/issues/576) Penambahan daftar perangkat-perangkat kecamatan pada menu Struktur Pemerintahan + #### Perbaikan bug -1. [#577](https://github.com/OpenSID/OpenDK/issues/577) Perbaikan Gelar tidak muncul di widget camat. -2. [#575](https://github.com/OpenSID/OpenDK/issues/575) Perbaikan Halaman struktur pemerintahan tidak menampilkan data perangkat saat ini. -3. [#598](https://github.com/OpenSID/OpenDK/issues/598) Perbaikan gagal menjalankan seeder profil ketika install baru. -4. [#598](https://github.com/OpenSID/OpenDK/issues/601) Perbaikan Error Saat menambahkan data pengurus. +1. [#609](https://github.com/OpenSID/OpenDK/issues/609) Perbaikan foto dan nama camat di menu profil tidak tampil. From 6dc687f2dab6c48a85d1f9e26c614f5de6f79db0 Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Sat, 14 Jan 2023 11:39:00 +0700 Subject: [PATCH 03/60] Perbaiki panjang slug prosedur (#606) * Perbaiki panjang slug prosedur * Sesuaikan migrasi * Fix styling * Update header.blade.php (#610) Fix bug Foto & Nama Camat di Menu Profil * Mutakhirkan catatan rilis * mutakhirkan catatan rilis Co-authored-by: yogiperdana Co-authored-by: Syahran Saputra Co-authored-by: sarwono --- catatan_rilis.md | 3 +- .../2022_06_22_205014_add_slug_prosedur.php | 2 +- ...2023_01_12_151140_change_slug_prosedur.php | 61 +++++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 database/migrations/2023_01_12_151140_change_slug_prosedur.php diff --git a/catatan_rilis.md b/catatan_rilis.md index ef683270f..b9fab8438 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -4,6 +4,7 @@ Di rilis v23.01.01, menyediakan fitur Widget Perangkat Kecamatan dan Tombol Rese #### Penambahan Fitur - #### Perbaikan bug + 1. [#609](https://github.com/OpenSID/OpenDK/issues/609) Perbaikan foto dan nama camat di menu profil tidak tampil. +2. [#605](https://github.com/OpenSID/OpenDK/issues/605) Perbaikan eror migrasi pada tabel prosedur. diff --git a/database/migrations/2022_06_22_205014_add_slug_prosedur.php b/database/migrations/2022_06_22_205014_add_slug_prosedur.php index 1cb5525d4..08c8a819f 100644 --- a/database/migrations/2022_06_22_205014_add_slug_prosedur.php +++ b/database/migrations/2022_06_22_205014_add_slug_prosedur.php @@ -44,7 +44,7 @@ class AddSlugProsedur extends Migration public function up() { Schema::table('das_prosedur', function (Blueprint $table) { - $table->char('slug', 50)->after('judul_prosedur')->nullable(false); + $table->char('slug', 150)->after('judul_prosedur')->nullable(false); }); // update data slug pada das prosedur diff --git a/database/migrations/2023_01_12_151140_change_slug_prosedur.php b/database/migrations/2023_01_12_151140_change_slug_prosedur.php new file mode 100644 index 000000000..2dd7817b1 --- /dev/null +++ b/database/migrations/2023_01_12_151140_change_slug_prosedur.php @@ -0,0 +1,61 @@ +string('slug', 150)->change(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('das_prosedur', function (Blueprint $table) { + $table->string('slug', 150)->change(); + }); + } +} From 16f9c31cd8d76e44a86b3fbf60ee17738b34f4d1 Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Mon, 16 Jan 2023 18:07:16 +0700 Subject: [PATCH 04/60] Perbaiki validasi prosedur (#616) * Perbaiki validasi prosedur * Update catatan_rilis.md Co-authored-by: Afila --- app/Http/Requests/ProsedurRequest.php | 2 +- catatan_rilis.md | 1 + resources/views/informasi/prosedur/form_create.blade.php | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/Http/Requests/ProsedurRequest.php b/app/Http/Requests/ProsedurRequest.php index 36e9ebb6c..e66cf5036 100644 --- a/app/Http/Requests/ProsedurRequest.php +++ b/app/Http/Requests/ProsedurRequest.php @@ -53,7 +53,7 @@ public function authorize() public function rules() { return [ - 'judul_prosedur' => 'required|string|min:5|max:255', + 'judul_prosedur' => 'required|string|min:5|max:150', 'file_prosedur' => 'file|mimes:jpg,jpeg,png,gif,pdf|max:2048', ]; } diff --git a/catatan_rilis.md b/catatan_rilis.md index b9fab8438..c2ecf16a4 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -8,3 +8,4 @@ Di rilis v23.01.01, menyediakan fitur Widget Perangkat Kecamatan dan Tombol Rese 1. [#609](https://github.com/OpenSID/OpenDK/issues/609) Perbaikan foto dan nama camat di menu profil tidak tampil. 2. [#605](https://github.com/OpenSID/OpenDK/issues/605) Perbaikan eror migrasi pada tabel prosedur. +3. [#605](https://github.com/OpenSID/OpenDK/issues/615) Perbaikan validasi prosedur, judul prosedur tidak boleh lebih dari 150 karakter. diff --git a/resources/views/informasi/prosedur/form_create.blade.php b/resources/views/informasi/prosedur/form_create.blade.php index a488e74cd..67afec52e 100755 --- a/resources/views/informasi/prosedur/form_create.blade.php +++ b/resources/views/informasi/prosedur/form_create.blade.php @@ -17,3 +17,10 @@
    + +@include('partials.asset_jqueryvalidation') + +@push('scripts') +{!! JsValidator::formRequest('App\Http\Requests\ProsedurRequest', '#form-prosedur') !!} +@endpush + From 39ab6b46d05b2ab2793d758ad356deb072e86f0a Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Wed, 1 Feb 2023 06:09:27 +0700 Subject: [PATCH 05/60] Perbaiki jika camat belum diisi (#623) * Perbaiki jika camat belum diisi * mutakhirkan catatan rilis --------- Co-authored-by: sarwono --- catatan_rilis.md | 1 + resources/views/layouts/frontends/header.blade.php | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/catatan_rilis.md b/catatan_rilis.md index c2ecf16a4..cdf859c97 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -9,3 +9,4 @@ Di rilis v23.01.01, menyediakan fitur Widget Perangkat Kecamatan dan Tombol Rese 1. [#609](https://github.com/OpenSID/OpenDK/issues/609) Perbaikan foto dan nama camat di menu profil tidak tampil. 2. [#605](https://github.com/OpenSID/OpenDK/issues/605) Perbaikan eror migrasi pada tabel prosedur. 3. [#605](https://github.com/OpenSID/OpenDK/issues/615) Perbaikan validasi prosedur, judul prosedur tidak boleh lebih dari 150 karakter. +4. [#622](https://github.com/OpenSID/OpenDK/issues/622) Perbaikan eror nama gelar ketika menjalankan di halaman beranda. diff --git a/resources/views/layouts/frontends/header.blade.php b/resources/views/layouts/frontends/header.blade.php index 4f5307634..a904d1269 100644 --- a/resources/views/layouts/frontends/header.blade.php +++ b/resources/views/layouts/frontends/header.blade.php @@ -32,9 +32,11 @@ {{ strip_tags($profil->sambutan) }}
  • - -
    {{ $camat->namaGelar }}
    -
    {{ $sebutan_kepala_wilayah }} {{ $profil->nama_kecamatan }}
    + @if ($camat) + +
    {{ $camat->namaGelar }}
    +
    {{ $sebutan_kepala_wilayah }} {{ $profil->nama_kecamatan }}
    + @endif
  • From 8d2c426c8e21c3c54566661337d876f63165595e Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Wed, 1 Feb 2023 10:06:55 +0700 Subject: [PATCH 06/60] Custom error 500 (#621) * Custom error 5000 * mutakhirkan catatan rilis --------- Co-authored-by: sarwono --- catatan_rilis.md | 1 + resources/views/errors/500.blade.php | 10 ++++++++++ resources/views/errors/minimal.blade.php | 17 +++++++++++------ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/catatan_rilis.md b/catatan_rilis.md index cdf859c97..560991fd8 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -10,3 +10,4 @@ Di rilis v23.01.01, menyediakan fitur Widget Perangkat Kecamatan dan Tombol Rese 2. [#605](https://github.com/OpenSID/OpenDK/issues/605) Perbaikan eror migrasi pada tabel prosedur. 3. [#605](https://github.com/OpenSID/OpenDK/issues/615) Perbaikan validasi prosedur, judul prosedur tidak boleh lebih dari 150 karakter. 4. [#622](https://github.com/OpenSID/OpenDK/issues/622) Perbaikan eror nama gelar ketika menjalankan di halaman beranda. +5. [#614](https://github.com/OpenSID/OpenDK/issues/614) Perbaikan informasi eror 500. diff --git a/resources/views/errors/500.blade.php b/resources/views/errors/500.blade.php index d9e95d9b9..e918a5a74 100644 --- a/resources/views/errors/500.blade.php +++ b/resources/views/errors/500.blade.php @@ -3,3 +3,13 @@ @section('title', __('Server Error')) @section('code', '500') @section('message', __('Server Error')) + +@section('custom-message') +

    + Mohon Periksa Log Error dan Laporkan Masalah di + Github + atau + Forum + dengan Melampirkan Log Error +

    +@endsection \ No newline at end of file diff --git a/resources/views/errors/minimal.blade.php b/resources/views/errors/minimal.blade.php index b63ac2b37..9269f1a5a 100644 --- a/resources/views/errors/minimal.blade.php +++ b/resources/views/errors/minimal.blade.php @@ -22,7 +22,7 @@ } .full-height { - height: 100vh; + padding: 40vh 0; } .flex-center { @@ -49,13 +49,18 @@ -
    -
    - @yield('code') +
    +
    +
    + @yield('code') +
    + +
    + @yield('message') +
    -
    - @yield('message') + @yield('custom-message')
    From 844f5653b36eeb3a5ddd3810bfa7065be43c059d Mon Sep 17 00:00:00 2001 From: sarwono <68048807+scqolbu24@users.noreply.github.com> Date: Tue, 7 Feb 2023 11:12:25 +0700 Subject: [PATCH 07/60] perbaiki eror menu keluarga (#627) * perbaiki eror menu keluarga * hapus name * meringkas script * Mutakhirkan catatan rilis --------- Co-authored-by: Yogi Perdana --- catatan_rilis.md | 6 +----- resources/views/data/keluarga/index.blade.php | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/catatan_rilis.md b/catatan_rilis.md index 31ac1f35c..0993318ca 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -6,8 +6,4 @@ Terima kasih pada syahransaputra yang baru mulai berkontribusi. #### Perbaikan bug -1. [#609](https://github.com/OpenSID/OpenDK/issues/609) Perbaikan foto dan nama camat di menu profil tidak tampil. -2. [#605](https://github.com/OpenSID/OpenDK/issues/605) Perbaikan eror migrasi pada tabel prosedur. -3. [#605](https://github.com/OpenSID/OpenDK/issues/615) Perbaikan validasi prosedur, judul prosedur tidak boleh lebih dari 150 karakter. -4. [#622](https://github.com/OpenSID/OpenDK/issues/622) Perbaikan eror nama gelar ketika menjalankan di halaman beranda. -5. [#614](https://github.com/OpenSID/OpenDK/issues/614) Perbaikan informasi eror 500. +1. [#627](https://github.com/OpenSID/OpenDK/pull/627) Perbaiki eror menu keluarga. diff --git a/resources/views/data/keluarga/index.blade.php b/resources/views/data/keluarga/index.blade.php index a16e6b9c6..af1d687d0 100755 --- a/resources/views/data/keluarga/index.blade.php +++ b/resources/views/data/keluarga/index.blade.php @@ -59,7 +59,7 @@ {data: 'kepala_kk.nama', name: 'kepala_kk.nama'}, {data: 'tgl_daftar', name: 'tgl_daftar'}, {data: 'tgl_cetak_kk', name: 'tgl_cetak_kk'}, - {data: 'desa.nama', name: 'desa.nama'}, + {data: 'desa.nama', name: 'desa.nama', render: (data) => data == null ? '' : data}, {data: 'alamat', name: 'alamat'}, {data: 'rw', name: 'rw'}, {data: 'rt', name: 'rt'}, From 88fd179e87cdb67f8b2300ce3d5b866d98ecf780 Mon Sep 17 00:00:00 2001 From: Suyadi Date: Sun, 12 Feb 2023 11:46:51 +0700 Subject: [PATCH 08/60] Fix demo data #628 (#631) * Fix #628 * Enum jabatan_id, command bahasa indonesia * Force migrate & seed demo data * Command bahasa indonesia --- .../Commands/{dev.php => InstallDev.php} | 21 +++- app/Models/Pengurus.php | 4 + ..._add_back_missing_das_pengurus_columns.php | 98 +++++++++++++++++++ .../seeds/Demo/DemoDasPengurusTableSeeder.php | 72 ++++++++++++++ database/seeds/DemoDatabaseSeeder.php | 2 + 5 files changed, 192 insertions(+), 5 deletions(-) rename app/Console/Commands/{dev.php => InstallDev.php} (82%) create mode 100644 database/migrations/2023_02_06_061656_add_back_missing_das_pengurus_columns.php create mode 100644 database/seeds/Demo/DemoDasPengurusTableSeeder.php diff --git a/app/Console/Commands/dev.php b/app/Console/Commands/InstallDev.php similarity index 82% rename from app/Console/Commands/dev.php rename to app/Console/Commands/InstallDev.php index 5e2c0bbdd..bdacada97 100644 --- a/app/Console/Commands/dev.php +++ b/app/Console/Commands/InstallDev.php @@ -34,7 +34,7 @@ use Illuminate\Console\Command; use Illuminate\Support\Facades\Artisan; -class dev extends Command +class InstallDev extends Command { /** * The name and signature of the console command. @@ -57,16 +57,27 @@ class dev extends Command */ public function handle() { - Artisan::call('key:generate'); $this->line('Menambahkan key'); + Artisan::call('key:generate'); - Artisan::call('storage:link'); $this->line('Menambahkan storage ke public'); + Artisan::call('storage:link'); - Artisan::call('migrate'); $this->line('Menambahkan migrasi'); + Artisan::call('migrate:fresh --force'); - Artisan::call('db:seed --class="DemoDatabaseSeeder"'); $this->line('Menambahkan data demo'); + Artisan::call('db:seed --class="DemoDatabaseSeeder" --force'); + + $this->line('Kunci akses penginstal web'); + + if (!is_file($file = storage_path('installed'))) { + file_put_contents( + $file, + sprintf('%s berhasil DIPASANG pada %s', config('app.name'), now()) + ); + } + + $this->line('Selesai.'); } } diff --git a/app/Models/Pengurus.php b/app/Models/Pengurus.php index 48be18983..580bc2c46 100644 --- a/app/Models/Pengurus.php +++ b/app/Models/Pengurus.php @@ -48,6 +48,10 @@ class Pengurus extends Model 'pendidikan', ]; + protected $appends = [ + 'namaGelar' + ]; + public function getFotoAttribute() { return $this->attributes['foto'] ? Storage::url('pengurus/' . $this->attributes['foto']) : null; diff --git a/database/migrations/2023_02_06_061656_add_back_missing_das_pengurus_columns.php b/database/migrations/2023_02_06_061656_add_back_missing_das_pengurus_columns.php new file mode 100644 index 000000000..a7cffca9d --- /dev/null +++ b/database/migrations/2023_02_06_061656_add_back_missing_das_pengurus_columns.php @@ -0,0 +1,98 @@ +string('nama_camat', 150) + ->nullable() + ->after('dasar_pembentukan'); + + $table->string('sekretaris_camat', 150) + ->nullable() + ->after('nama_camat'); + + $table->string('kepsek_pemerintahan_umum', 150) + ->nullable() + ->after('sekretaris_camat'); + + $table->string('kepsek_kesejahteraan_masyarakat', 150) + ->nullable() + ->after('kepsek_pemerintahan_umum'); + + $table->string('kepsek_pemberdayaan_masyarakat', 150) + ->nullable() + ->after('kepsek_kesejahteraan_masyarakat'); + + $table->string('kepsek_pelayanan_umum', 150) + ->nullable() + ->after('kepsek_pemberdayaan_masyarakat'); + + $table->string('kepsek_trantib', 150) + ->nullable() + ->after('kepsek_pelayanan_umum'); + + $table->longText('foto_kepala_wilayah') + ->nullable() + ->after('misi'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('das_profil', function (Blueprint $table) { + $table->dropColumn('nama_camat'); + $table->dropColumn('sekretaris_camat'); + $table->dropColumn('kepsek_pemerintahan_umum'); + $table->dropColumn('kepsek_kesejahteraan_masyarakat'); + $table->dropColumn('kepsek_pemberdayaan_masyarakat'); + $table->dropColumn('kepsek_pelayanan_umum'); + $table->dropColumn('kepsek_trantib'); + $table->dropColumn('foto_kepala_wilayah'); + }); + } +} diff --git a/database/seeds/Demo/DemoDasPengurusTableSeeder.php b/database/seeds/Demo/DemoDasPengurusTableSeeder.php new file mode 100644 index 000000000..2544300da --- /dev/null +++ b/database/seeds/Demo/DemoDasPengurusTableSeeder.php @@ -0,0 +1,72 @@ + 'H. Hadi Fathurrahman, S.Sos, M.AP', + 'gelar_depan' => null, + 'gelar_belakang' => null, + 'nip' => null, + 'nik' => random_int(16, 16), + 'status' => 1, + 'foto' => null, + 'tempat_lahir' => 'Mangsit', + 'tanggal_lahir' => now(), + 'sex' => 1, + 'pendidikan_id' => 1, + 'agama_id' => 1, + 'no_sk' => null, + 'tanggal_sk' => now(), + 'masa_jabatan' => 5, + 'pangkat' => 'Camat', + 'no_henti' => null, + 'tanggal_henti' => null, + 'jabatan_id' => JenisJabatan::Camat, + 'created_at' => now(), + ]; + + DB::table('das_pengurus')->insert($data); + } +} diff --git a/database/seeds/DemoDatabaseSeeder.php b/database/seeds/DemoDatabaseSeeder.php index 4653dbcb1..932a69e97 100644 --- a/database/seeds/DemoDatabaseSeeder.php +++ b/database/seeds/DemoDatabaseSeeder.php @@ -42,6 +42,7 @@ use Database\Seeds\Demo\DemoPutusSekolahSeeder; use Database\Seeds\Demo\DemoTingkatPendidikanSeeder; use Database\Seeds\Demo\DemoToiletSanitasiSeeder; +use Database\Seeds\Demo\DemoDasPengurusTableSeeder; use Illuminate\Database\Seeder; class DemoDatabaseSeeder extends Seeder @@ -69,5 +70,6 @@ public function run() $this->call(DemoPutusSekolahSeeder::class); $this->call(DemoTingkatPendidikanSeeder::class); $this->call(DemoToiletSanitasiSeeder::class); + $this->call(DemoDasPengurusTableSeeder::class); } } From 82354e008ef279a34d427949d6f54f76599845de Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Sun, 12 Feb 2023 11:48:16 +0700 Subject: [PATCH 09/60] Mutakhirkan catatan rilis --- catatan_rilis.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/catatan_rilis.md b/catatan_rilis.md index 0993318ca..ab6e529fe 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -6,4 +6,5 @@ Terima kasih pada syahransaputra yang baru mulai berkontribusi. #### Perbaikan bug -1. [#627](https://github.com/OpenSID/OpenDK/pull/627) Perbaiki eror menu keluarga. +1. [#627](https://github.com/OpenSID/OpenDK/pull/627) Perbaikan eror menu keluarga. +1. [#628](https://github.com/OpenSID/OpenDK/issues/628) Perbaikan eror data demo. From 89b459f0d37d033b0b0ec4dc18f26a1649b4acad Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Tue, 28 Feb 2023 02:32:54 +0700 Subject: [PATCH 10/60] Perbaiki sambutan camat kosong (#642) * Perbaiki sambutan camat kosong * Fix styling * Update catatan_rilis.md --------- Co-authored-by: yogiperdana Co-authored-by: Afila --- catatan_rilis.md | 3 ++- database/seeds/DemoDatabaseSeeder.php | 2 +- resources/views/layouts/frontends/header.blade.php | 6 ++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/catatan_rilis.md b/catatan_rilis.md index ab6e529fe..a3a86ca3f 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -7,4 +7,5 @@ Terima kasih pada syahransaputra yang baru mulai berkontribusi. #### Perbaikan bug 1. [#627](https://github.com/OpenSID/OpenDK/pull/627) Perbaikan eror menu keluarga. -1. [#628](https://github.com/OpenSID/OpenDK/issues/628) Perbaikan eror data demo. +2. [#628](https://github.com/OpenSID/OpenDK/issues/628) Perbaikan eror data demo. +3. [#641](https://github.com/OpenSID/OpenDK/issues/641) Perbaiki sambutan camat kosong #642 diff --git a/database/seeds/DemoDatabaseSeeder.php b/database/seeds/DemoDatabaseSeeder.php index 932a69e97..21ff5b106 100644 --- a/database/seeds/DemoDatabaseSeeder.php +++ b/database/seeds/DemoDatabaseSeeder.php @@ -34,6 +34,7 @@ use Database\Seeds\Demo\DemoAPBDesaSeeder; use Database\Seeds\Demo\DemoDasDataDesaTableSeeder; use Database\Seeds\Demo\DemoDasDataUmumTableSeeder; +use Database\Seeds\Demo\DemoDasPengurusTableSeeder; use Database\Seeds\Demo\DemoDasProfilTableSeeder; use Database\Seeds\Demo\DemoEpidemiPenyakitSeeder; use Database\Seeds\Demo\DemoFasilitasPaudSeeder; @@ -42,7 +43,6 @@ use Database\Seeds\Demo\DemoPutusSekolahSeeder; use Database\Seeds\Demo\DemoTingkatPendidikanSeeder; use Database\Seeds\Demo\DemoToiletSanitasiSeeder; -use Database\Seeds\Demo\DemoDasPengurusTableSeeder; use Illuminate\Database\Seeder; class DemoDatabaseSeeder extends Seeder diff --git a/resources/views/layouts/frontends/header.blade.php b/resources/views/layouts/frontends/header.blade.php index a904d1269..eec87f0b3 100644 --- a/resources/views/layouts/frontends/header.blade.php +++ b/resources/views/layouts/frontends/header.blade.php @@ -28,8 +28,10 @@
  • -

    Sambutan {{ $sebutan_kepala_wilayah }} {{ $profil->nama_kecamatan }}

    - {{ strip_tags($profil->sambutan) }} + @if ($profil->sambutan) +

    Sambutan {{ $sebutan_kepala_wilayah }} {{ $profil->nama_kecamatan }}

    + {{ strip_tags($profil->sambutan) }} + @endif
  • @if ($camat) From aa98b5766171d1ec6176359e8430905c4030f74e Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Tue, 28 Feb 2023 05:36:51 +0700 Subject: [PATCH 11/60] Perbaiki preview gambar slider (#644) * Perbaiki preview gambar tidak muncul * Fix styling * Update catatan_rilis.md --------- Co-authored-by: yogiperdana Co-authored-by: Afila --- .../Controllers/Setting/SlideController.php | 3 +- catatan_rilis.md | 3 +- resources/views/setting/slide/form.blade.php | 44 +++++++++++++++++-- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/Setting/SlideController.php b/app/Http/Controllers/Setting/SlideController.php index 8f816a490..1cdc23b6b 100644 --- a/app/Http/Controllers/Setting/SlideController.php +++ b/app/Http/Controllers/Setting/SlideController.php @@ -63,10 +63,11 @@ public function getData() public function create() { + $slide = null; $page_title = 'Slide'; $page_description = 'Tambah Slide'; - return view('setting.slide.create', compact('page_title', 'page_description')); + return view('setting.slide.create', compact('page_title', 'page_description', 'slide')); } public function store(SlideRequest $request) diff --git a/catatan_rilis.md b/catatan_rilis.md index a3a86ca3f..6361789bd 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -8,4 +8,5 @@ Terima kasih pada syahransaputra yang baru mulai berkontribusi. 1. [#627](https://github.com/OpenSID/OpenDK/pull/627) Perbaikan eror menu keluarga. 2. [#628](https://github.com/OpenSID/OpenDK/issues/628) Perbaikan eror data demo. -3. [#641](https://github.com/OpenSID/OpenDK/issues/641) Perbaiki sambutan camat kosong #642 +3. [#641](https://github.com/OpenSID/OpenDK/issues/641) Perbaiki sambutan camat kosong +4. [#637](https://github.com/OpenSID/OpenDK/issues/637) Perbaiki preview gambar slider diff --git a/resources/views/setting/slide/form.blade.php b/resources/views/setting/slide/form.blade.php index 1a20aa527..a94c4ab29 100644 --- a/resources/views/setting/slide/form.blade.php +++ b/resources/views/setting/slide/form.blade.php @@ -12,13 +12,49 @@
  • - +
    - gambar) 'required' @endisset> + Dimensi gambar 1360 x 400 Piksel
    - + + +
    + +@push('scripts') + +@endpush From 866b97d9ca5fb54e82b27d7743dac9defb67631a Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Tue, 28 Feb 2023 06:28:03 +0700 Subject: [PATCH 12/60] Perbaiki halaman sejarah (#645) * Perbaiki halaman sejarah * Fix styling * mutakhirkan catatan rilis --------- Co-authored-by: yogiperdana Co-authored-by: sarwono --- .../Controllers/Data/DataUmumController.php | 2 +- app/Models/DataUmum.php | 2 +- catatan_rilis.md | 1 + ...02_27_122959_rename_data_umum_tipologi.php | 61 +++++++++++++++++++ database/seeds/DasDataUmumTableSeeder.php | 2 +- .../seeds/Demo/DemoDasDataUmumTableSeeder.php | 2 +- .../views/data/data_umum/form_edit.blade.php | 4 +- .../views/pages/profil/sejarah.blade.php | 2 +- 8 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 database/migrations/2023_02_27_122959_rename_data_umum_tipologi.php diff --git a/app/Http/Controllers/Data/DataUmumController.php b/app/Http/Controllers/Data/DataUmumController.php index 83e148e54..ef2d9459b 100644 --- a/app/Http/Controllers/Data/DataUmumController.php +++ b/app/Http/Controllers/Data/DataUmumController.php @@ -62,7 +62,7 @@ public function index() public function update(Request $request, $id) { request()->validate([ - 'tipologi' => 'required', + 'sejarah' => 'required', 'sumber_luas_wilayah' => 'required', 'luas_wilayah' => 'required', 'bts_wil_utara' => 'required', diff --git a/app/Models/DataUmum.php b/app/Models/DataUmum.php index 8138282bb..39117220d 100755 --- a/app/Models/DataUmum.php +++ b/app/Models/DataUmum.php @@ -39,7 +39,7 @@ class DataUmum extends Model protected $table = 'das_data_umum'; protected $fillable = [ - 'tipologi', + 'sejarah', 'ketinggian', 'sumber_luas_wilayah', 'luas_wilayah', diff --git a/catatan_rilis.md b/catatan_rilis.md index 6361789bd..1cb15db71 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -10,3 +10,4 @@ Terima kasih pada syahransaputra yang baru mulai berkontribusi. 2. [#628](https://github.com/OpenSID/OpenDK/issues/628) Perbaikan eror data demo. 3. [#641](https://github.com/OpenSID/OpenDK/issues/641) Perbaiki sambutan camat kosong 4. [#637](https://github.com/OpenSID/OpenDK/issues/637) Perbaiki preview gambar slider +5. [#639](https://github.com/OpenSID/OpenDK/issues/639) Perbaiki pengisian kolom sejarah. diff --git a/database/migrations/2023_02_27_122959_rename_data_umum_tipologi.php b/database/migrations/2023_02_27_122959_rename_data_umum_tipologi.php new file mode 100644 index 000000000..42f3e2066 --- /dev/null +++ b/database/migrations/2023_02_27_122959_rename_data_umum_tipologi.php @@ -0,0 +1,61 @@ +renameColumn('tipologi', 'sejarah'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('das_data_umum', function (Blueprint $table) { + $table->renameColumn('sejarah', 'tipologi'); + }); + } +} diff --git a/database/seeds/DasDataUmumTableSeeder.php b/database/seeds/DasDataUmumTableSeeder.php index fa4118337..fbf250bc0 100755 --- a/database/seeds/DasDataUmumTableSeeder.php +++ b/database/seeds/DasDataUmumTableSeeder.php @@ -46,7 +46,7 @@ public function run() DB::table('das_data_umum')->insert([ 'id' => 1, 'profil_id' => 1, - 'tipologi' => null, + 'sejarah' => null, 'ketinggian' => 1, 'luas_wilayah' => 2.0, 'bts_wil_utara' => null, diff --git a/database/seeds/Demo/DemoDasDataUmumTableSeeder.php b/database/seeds/Demo/DemoDasDataUmumTableSeeder.php index 4b9823b2f..616a77ffc 100644 --- a/database/seeds/Demo/DemoDasDataUmumTableSeeder.php +++ b/database/seeds/Demo/DemoDasDataUmumTableSeeder.php @@ -49,7 +49,7 @@ public function run() DB::table('das_data_umum')->insert([ 'id' => 1, 'profil_id' => Profil::first()->id, - 'tipologi' => 'Kecamatan maju namun terpencil.', + 'sejarah' => 'Contoh sejarah kecamatan.', 'ketinggian' => 1, 'luas_wilayah' => 0.0, 'bts_wil_utara' => 'Kecamatan A', diff --git a/resources/views/data/data_umum/form_edit.blade.php b/resources/views/data/data_umum/form_edit.blade.php index cc277480e..8cf0d00aa 100644 --- a/resources/views/data/data_umum/form_edit.blade.php +++ b/resources/views/data/data_umum/form_edit.blade.php @@ -12,10 +12,10 @@ class="required">*
    - +
    - {!! Form::textarea('tipologi', null, ['placeholder' => 'Tipologi', 'class' => 'form-control', 'required', + {!! Form::textarea('sejarah', null, ['placeholder' => 'Sejarah', 'class' => 'form-control', 'required', 'rows'=>2]) !!}
    diff --git a/resources/views/pages/profil/sejarah.blade.php b/resources/views/pages/profil/sejarah.blade.php index 82c420bdf..cb17e2d0d 100644 --- a/resources/views/pages/profil/sejarah.blade.php +++ b/resources/views/pages/profil/sejarah.blade.php @@ -10,7 +10,7 @@
    -

    {!! $profil->dataumum->tipologi !!}

    +

    {!! $profil->dataumum->sejarah !!}

    From d52075a32d8d08671d73a7213c5fc4b94e424d91 Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Wed, 1 Mar 2023 10:27:39 +0700 Subject: [PATCH 13/60] Security artikel (#649) * Tambah validasi upload file * Sesuaikan validasi dengan database * mutakhirkan catatan rilis --------- Co-authored-by: sarwono --- app/Http/Requests/ArtikelRequest.php | 3 ++- catatan_rilis.md | 7 ++++--- resources/views/informasi/artikel/_form.blade.php | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/Http/Requests/ArtikelRequest.php b/app/Http/Requests/ArtikelRequest.php index 0a6bb1605..a274f1991 100644 --- a/app/Http/Requests/ArtikelRequest.php +++ b/app/Http/Requests/ArtikelRequest.php @@ -53,9 +53,10 @@ public function authorize() public function rules() { return [ - 'judul' => 'required', + 'judul' => 'required|string|max:191', 'isi' => 'required', 'status' => 'required', + 'gambar' => 'nullable|image|mimes:jpg,jpeg,png|max:1024', ]; } } diff --git a/catatan_rilis.md b/catatan_rilis.md index 1cb15db71..4f47164da 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -8,6 +8,7 @@ Terima kasih pada syahransaputra yang baru mulai berkontribusi. 1. [#627](https://github.com/OpenSID/OpenDK/pull/627) Perbaikan eror menu keluarga. 2. [#628](https://github.com/OpenSID/OpenDK/issues/628) Perbaikan eror data demo. -3. [#641](https://github.com/OpenSID/OpenDK/issues/641) Perbaiki sambutan camat kosong -4. [#637](https://github.com/OpenSID/OpenDK/issues/637) Perbaiki preview gambar slider -5. [#639](https://github.com/OpenSID/OpenDK/issues/639) Perbaiki pengisian kolom sejarah. +3. [#641](https://github.com/OpenSID/OpenDK/issues/641) Perbaikan sambutan camat kosong +4. [#637](https://github.com/OpenSID/OpenDK/issues/637) Perbaikan preview gambar slider +5. [#639](https://github.com/OpenSID/OpenDK/issues/639) Perbaikan pengisian kolom sejarah. +6. [#2089](https://github.com/OpenSID/premium/issues/2089) Perbaikan validasi saat unggah gambar di artikel. diff --git a/resources/views/informasi/artikel/_form.blade.php b/resources/views/informasi/artikel/_form.blade.php index 5225958e0..2e01c9e49 100644 --- a/resources/views/informasi/artikel/_form.blade.php +++ b/resources/views/informasi/artikel/_form.blade.php @@ -31,7 +31,7 @@ - {!! Form::file('gambar', ['placeholder' => 'Gambar', 'class' => 'form-control', 'id' => 'file-artikel']) !!} + {!! Form::file('gambar', ['placeholder' => 'Gambar', 'class' => 'form-control', 'id' => 'file-artikel', 'accept' => 'jpg,jpeg,png']) !!} @if ($errors->has('gambar')) {{ $errors->first('gambar') }} @endif @@ -58,7 +58,7 @@ $('.textarea').wysihtml5(); - var fileTypes = ['jpg', 'jpeg', 'png', 'jpg']; //acceptable file types + var fileTypes = ['jpg', 'jpeg', 'png']; //acceptable file types function readURL(input) { if (input.files && input.files[0]) { From 83de156e43899d4f3796d5855b5cb3790c947264 Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Mon, 6 Mar 2023 14:22:26 +0700 Subject: [PATCH 14/60] Perbaiki slider tidak bisa lebih dari 4 (#646) * Perbaiki slider tidak bisa lebih dari 4 * Fix styling * Pindah script ke controller * Sesuaikan deskripsi * Fix styling * Update catatan_rilis.md --------- Co-authored-by: yogiperdana Co-authored-by: Afila --- app/Http/Controllers/Controller.php | 28 ++ catatan_rilis.md | 10 +- public/css/slider.css | 384 ++---------------- .../views/layouts/frontends/slider.blade.php | 122 ++---- 4 files changed, 107 insertions(+), 437 deletions(-) diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index efedc93de..450a987fe 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -42,6 +42,7 @@ use App\Models\Program; use App\Models\SettingAplikasi; use App\Models\SinergiProgram; +use App\Models\Slide; use App\Models\TipePotensi; use Exception; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; @@ -93,6 +94,32 @@ public function __construct() $navdesa = DataDesa::all(); $navpotensi = TipePotensi::orderby('nama_kategori', 'ASC')->get(); $pengurus = Pengurus::status()->get(); + $slides = Slide::orderBy('created_at', 'DESC')->get(); + + if (count($slides) < 1) { + $slides = collect([ + (object) [ + 'judul' => 'Pantai Garassikang', + 'deskripsi' => 'Lokasi: Bulu Jaya, Kecamatan Bangkala Barat, Kabupaten Jeneponto, Sulawesi Selatan', + 'gambar' => '/slide/slide-1.png', + ], + (object) [ + 'judul' => 'Batu Siping', + 'deskripsi' => 'Lokasi: Karampuang, Desa Garassikang, Kecamatan Bangkala Barat, Kabupaten Jeneponto, Sulawesi Selatan', + 'gambar' => '/slide/slide-2.png', + ], + (object) [ + 'judul' => 'Bukit Sinalu Bulu Jaya', + 'deskripsi' => 'Lokasi: Bulu Jaya, Kecamatan Bangkala Barat, Kabupaten Jeneponto, Sulawesi Selatan', + 'gambar' => '/slide/slide-3.png', + ], + (object) [ + 'judul' => 'Pantai Tamarunang', + 'deskripsi' => 'Lokasi: Tamarunang, Pabiringa, Kecamatan Binamu, Kabupaten Jeneponto, Sulawesi Selatan', + 'gambar' => '/slide/slide-4.png', + ], + ]); + } View::share([ 'profil' => $this->profil, @@ -106,6 +133,7 @@ public function __construct() 'navpotensi' => $navpotensi, 'camat' => $this->nama_camat, 'pengurus' => $pengurus->sortBy('jabatan.jenis'), + 'slides' => $slides, ]); } diff --git a/catatan_rilis.md b/catatan_rilis.md index 0c7e5ef1a..3e4bf5a09 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -4,9 +4,7 @@ Di rilis v23.03.01 berisi perbaikan yang diminta Komunitas OpenDK. #### Perbaikan bug -1. [#626](https://github.com/OpenSID/OpenDK/issues/626) Perbaikan eror menu keluarga. -2. [#628](https://github.com/OpenSID/OpenDK/issues/628) Perbaikan eror data demo. -3. [#641](https://github.com/OpenSID/OpenDK/issues/641) Perbaikan sambutan camat kosong -4. [#637](https://github.com/OpenSID/OpenDK/issues/637) Perbaikan preview gambar slider -5. [#639](https://github.com/OpenSID/OpenDK/issues/639) Perbaikan pengisian kolom sejarah. -6. [#2089](https://github.com/OpenSID/premium/issues/2089) Perbaikan validasi saat unggah gambar di artikel. +1. [#638](https://github.com/OpenSID/OpenDK/issues/638) Perbaiki slider tidak bisa lebih dari 4. + +#### Teknis +1. [#2089](https://github.com/OpenSID/premium/issues/2089) Perbaikan validasi saat unggah gambar di artikel. diff --git a/public/css/slider.css b/public/css/slider.css index 87c117c22..34638c25e 100644 --- a/public/css/slider.css +++ b/public/css/slider.css @@ -1,22 +1,19 @@ /* @media only screen and (min-width:768px) { */ -#slider { +.swiper { width: 100%; - height: 160px; + height: 450px; position: relative; overflow: hidden; } -.slides { +.swiper-wrapper { width: 400%; height: 100%; position: relative; - -webkit-animation: slide 30s infinite; - -moz-animation: slide 30s infinite; - animation: slide 30s infinite; } .slider-class { - width: 25%; + width: 100%; height: 100%; float: left; position: relative; @@ -45,8 +42,8 @@ } .legend { - border: 220px solid transparent; - border-left: 220px solid rgba(52, 73, 94, 0.7); + border: 520px solid transparent; + border-left: 520px solid rgba(52, 73, 94, 0.7); border-bottom: 0; position: absolute; bottom: 0; @@ -65,22 +62,19 @@ height: 50px; float: left; position: relative; - top: 55px; - -webkit-animation: content-s 7.5s infinite; - -moz-animation: content-s 7.5s infinite; - animation: content-s 7.5s infinite; + top: 255px; } .content-txt h1 { font-family: "Avant Garde", Avantgarde, "Century Gothic", CenturyGothic, "AppleGothic", sans-serif; text-transform: uppercase; - font-size: 11px; + font-size: 24px; color: #f39c12; text-align: left; - margin-left: 10px; + margin-left: 20px; padding-bottom: 0px; - width: 125px; + width: 325px; text-shadow: 2px 2px 0 rgba(0, 0, 0, 0.2); } @@ -88,371 +82,57 @@ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; font-weight: normal; - font-size: 8.5px; + font-size: 18px; font-style: italic; color: #fff; text-align: left; - margin-left: 10px; + margin-left: 20px; margin-top: 10px; - width: 150px; - line-height: 12px; -} - -.switch { - width: 100px; - height: 10px; - position: absolute; - bottom: 10px; - z-index: 1; - left: 10px; -} - -.switch > ul { - list-style: none; -} - -.switch > ul > li { - width: 8px; - height: 8px; - border-radius: 50%; - background: #333; - float: left; - margin-right: 5px; - cursor: pointer; + width: 350px; + line-height: 16px; } -.switch ul { - overflow: hidden; +.swiper-pagination-bullet-active { + background: #ff4900 !important; } /* Desktop */ -@media screen and (min-width: 768px) { +@media screen and (max-width: 768px) { #slider { height: 400px; } + .swiper { + height: 180px; + } + + .content-slide { + width: 23%; + } + .content-txt { - top: 200px; + top: 60px; } .content-txt h1 { - font-size: 24px; - margin-left: 30px; - padding-bottom: 10px; + font-size: 12px; width: auto; } .content-txt h2 { - font-size: 14px; - margin-left: 30px; - margin-top: 20px; + font-size: 10px; + margin-top: 10px; width: auto; line-height: 18px; } .legend { - border: 500px solid transparent; - border-left: 500px solid rgba(52, 73, 94, 0.7); + border: 280px solid transparent; + border-left: 280px solid rgba(52, 73, 94, 0.7); border-bottom: 0; position: absolute; bottom: 0; } - - .switch { - width: 120px; - height: 10px; - left: 30px; - } - - .switch > ul { - list-style: none; - } - - .switch > ul > li { - width: 10px; - height: 10px; - } -} - -.on { - width: 100%; - height: 100%; - border-radius: 50%; - background: #ff4900; - position: relative; - -webkit-animation: on 30s infinite; - -moz-animation: on 30s infinite; - animation: on 30s infinite; -} - -@-webkit-keyframes slide { - 0%, - 100% { - margin-left: 0; - } - 21% { - margin-left: 0; - } - 25% { - margin-left: -100%; - } - 46% { - margin-left: -100%; - } - 50% { - margin-left: -200%; - } - 71% { - margin-left: -200%; - } - 75% { - margin-left: -300%; - } - 96% { - margin-left: -300%; - } -} - -@-moz-keyframes slide { - 0%, - 100% { - margin-left: 0; - } - 21% { - margin-left: 0; - } - 25% { - margin-left: -100%; - } - 46% { - margin-left: -100%; - } - 50% { - margin-left: -200%; - } - 71% { - margin-left: -200%; - } - 75% { - margin-left: -300%; - } - 96% { - margin-left: -300%; - } -} - -@keyframes slide { - 0%, - 100% { - margin-left: 0; - } - 21% { - margin-left: 0; - } - 25% { - margin-left: -100%; - } - 46% { - margin-left: -100%; - } - 50% { - margin-left: -200%; - } - 71% { - margin-left: -200%; - } - 75% { - margin-left: -300%; - } - 96% { - margin-left: -300%; - } -} - -@-webkit-keyframes content-s { - 0% { - left: -420px; - } - 10% { - left: 0; - } - 30% { - left: 0; - } - 40% { - left: 0; - } - 50% { - left: 0; - } - 60% { - left: 0; - } - 70% { - left: 0; - } - 80% { - left: -420px; - } - 90% { - left: -420px; - } - 100% { - left: -420px; - } -} - -@-moz-keyframes content-s { - 0% { - left: -420px; - } - 10% { - left: 0; - } - 30% { - left: 0; - } - 40% { - left: 0; - } - 50% { - left: 0; - } - 60% { - left: 0; - } - 70% { - left: 0; - } - 80% { - left: -420px; - } - 90% { - left: -420px; - } - 100% { - left: -420px; - } -} - -@keyframes content-s { - 0% { - left: -420px; - } - 10% { - left: 20px; - } - 15% { - left: 0; - } - 30% { - left: 0; - } - 40% { - left: 0; - } - 50% { - left: 0; - } - 60% { - left: 0; - } - 70% { - left: 0; - } - 80% { - left: -420px; - } - 90% { - left: -420px; - } - 100% { - left: -420px; - } -} - -@-webkit-keyframes on { - 0%, - 100% { - margin-left: 0; - } - 21% { - margin-left: 0; - } - 25% { - margin-left: 15px; - } - 46% { - margin-left: 15px; - } - 50% { - margin-left: 30px; - } - 71% { - margin-left: 30px; - } - 75% { - margin-left: 45px; - } - 96% { - margin-left: 45px; - } -} - -@-moz-keyframes on { - 0%, - 100% { - margin-left: 0; - } - 21% { - margin-left: 0; - } - 25% { - margin-left: 15px; - } - 46% { - margin-left: 15px; - } - 50% { - margin-left: 30px; - } - 71% { - margin-left: 30px; - } - 75% { - margin-left: 45px; - } - 96% { - margin-left: 45px; - } -} - -@keyframes on { - 0%, - 100% { - margin-left: 0; - } - 21% { - margin-left: 0; - } - 25% { - margin-left: 15px; - } - 46% { - margin-left: 15px; - } - 50% { - margin-left: 30px; - } - 71% { - margin-left: 30px; - } - 75% { - margin-left: 45px; - } - 96% { - margin-left: 45px; - } } .dk-line { @@ -460,4 +140,4 @@ background: #ff4900; position: relative; padding: 2px 10px; -} +} \ No newline at end of file diff --git a/resources/views/layouts/frontends/slider.blade.php b/resources/views/layouts/frontends/slider.blade.php index 6c577a8cd..d466522e1 100644 --- a/resources/views/layouts/frontends/slider.blade.php +++ b/resources/views/layouts/frontends/slider.blade.php @@ -1,86 +1,50 @@ @if (Route::currentRouteName() === 'beranda') -
    -
    - @php $slides = \App\Models\Slide::orderBy('created_at','DESC')->take(4)->get(); @endphp - @forelse ($slides as $slide) - -
    -
    -
    -
    -

    {{ $slide->judul }}

    -

    {{ $slide->deskripsi }}

    +
    +
    + @foreach ($slides as $slide) +
    +
    +
    +
    +
    +

    {{ $slide->judul }}

    +

    {{ $slide->deskripsi }}

    +
    -
    -
    - -
    -
    - @empty -
    -
    -
    -
    -

    Pantai Garassikang

    -

    Lokasi: Bulu Jaya, Kecamatan Bangkala Barat, Kabupaten Jeneponto, Sulawesi Selatan

    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -

    Batu Siping

    -

    Lokasi: Karampuang, Desa Garassikang, Kecamatan Bangkala Barat, Kabupaten Jeneponto, Sulawesi Selatan.

    +
    +
    -
    - -
    -
    -
    -
    -
    -

    Bukit Sinalu Bulu Jaya

    -

    Lokasi: Bulu Jaya, Kecamatan Bangkala Barat, Kabupaten Jeneponto, Sulawesi Selatan

    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -

    Pantai Tamarunang

    -

    Lokasi: Tamarunang, Pabiringa, Kecamatan Binamu, Kabupaten Jeneponto, Sulawesi Selatan

    -
    -
    -
    - -
    -
    - @endforelse - - + @endforeach
    -
    -
      -
    • -
      -
    • -
    • -
    • -
    • -
    -
    -
    -
    -
    -@endif \ No newline at end of file + +
    +
    + +
    +
    +
    +@endif + +@push('scripts') + + @endpush \ No newline at end of file From 5ba51ac4532506f40b0913cacc7b4d5723b05731 Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Mon, 6 Mar 2023 14:29:32 +0700 Subject: [PATCH 15/60] Buat validasi file valid (#651) * Buat validasi file valid * Fix styling * ubah pesan invalid * Update catatan_rilis.md --------- Co-authored-by: yogiperdana Co-authored-by: Afila --- app/Http/Requests/ArtikelRequest.php | 2 +- app/Providers/AppServiceProvider.php | 13 +++++++++++++ resources/lang/en/validation.php | 1 + resources/lang/id/validation.php | 2 +- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/Http/Requests/ArtikelRequest.php b/app/Http/Requests/ArtikelRequest.php index a274f1991..a749bb23e 100644 --- a/app/Http/Requests/ArtikelRequest.php +++ b/app/Http/Requests/ArtikelRequest.php @@ -56,7 +56,7 @@ public function rules() 'judul' => 'required|string|max:191', 'isi' => 'required', 'status' => 'required', - 'gambar' => 'nullable|image|mimes:jpg,jpeg,png|max:1024', + 'gambar' => 'nullable|image|mimes:jpg,jpeg,png|max:1024|valid_file', ]; } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index c788dc415..b1e8d3459 100755 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -37,6 +37,7 @@ use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Validator; use Illuminate\Support\ServiceProvider; @@ -55,6 +56,7 @@ public function boot() $this->penduduk(); $this->config(); $this->blade(); + $this->file(); } protected function penduduk() @@ -174,6 +176,17 @@ protected function blade() }); } + protected function file() + { + Validator::extend('valid_file', function ($attributes, $value, $parameters) { + $contains = preg_match('/<\?php| 'The :attribute has already been taken.', 'uploaded' => 'The :attribute failed to upload.', 'url' => 'The :attribute format is invalid.', + 'valid_file' => 'The :attribute format is invalid', /* |-------------------------------------------------------------------------- diff --git a/resources/lang/id/validation.php b/resources/lang/id/validation.php index d59756c39..dc1c06971 100644 --- a/resources/lang/id/validation.php +++ b/resources/lang/id/validation.php @@ -97,7 +97,7 @@ 'timezone' => 'Isian :attribute harus berupa zona waktu yang valid.', 'unique' => 'Isian :attribute sudah ada sebelumnya.', 'url' => 'Format isian :attribute tidak valid.', - + 'valid_file' => 'Format :Jenis berkas yang anda unggah berbahaya.', 'custom' => [ 'attribute-name' => [ 'rule-name' => 'custom-message', From 3fd1d139f60eed51ab7956d65f2bca2a73bd1a9d Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Sat, 11 Mar 2023 11:18:54 +0700 Subject: [PATCH 16/60] Perbaiki validasi file prosedur (#653) * Perbaiki validasi file prosedur * mutakhirkan cataatn rilis --------- Co-authored-by: sarwono --- app/Http/Requests/ProsedurRequest.php | 2 +- catatan_rilis.md | 3 ++- resources/views/informasi/prosedur/create.blade.php | 2 +- resources/views/informasi/prosedur/edit.blade.php | 2 +- resources/views/informasi/prosedur/form_create.blade.php | 2 +- resources/views/informasi/prosedur/form_edit.blade.php | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/Http/Requests/ProsedurRequest.php b/app/Http/Requests/ProsedurRequest.php index e66cf5036..16100033e 100644 --- a/app/Http/Requests/ProsedurRequest.php +++ b/app/Http/Requests/ProsedurRequest.php @@ -54,7 +54,7 @@ public function rules() { return [ 'judul_prosedur' => 'required|string|min:5|max:150', - 'file_prosedur' => 'file|mimes:jpg,jpeg,png,gif,pdf|max:2048', + 'file_prosedur' => 'file|mimes:jpg,jpeg,png,gif,pdf|max:2048|valid_file', ]; } } diff --git a/catatan_rilis.md b/catatan_rilis.md index 3e4bf5a09..bdc7a0c2a 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -7,4 +7,5 @@ Di rilis v23.03.01 berisi perbaikan yang diminta Komunitas OpenDK. 1. [#638](https://github.com/OpenSID/OpenDK/issues/638) Perbaiki slider tidak bisa lebih dari 4. #### Teknis -1. [#2089](https://github.com/OpenSID/premium/issues/2089) Perbaikan validasi saat unggah gambar di artikel. +1. [#2089](https://github.com/OpenSID/premium/issues/2089) Audit keamanan validasi saat unggah gambar di artikel. +2. [#2114](https://github.com/OpenSID/premium/issues/2114) Audit keamanan form prosedur. diff --git a/resources/views/informasi/prosedur/create.blade.php b/resources/views/informasi/prosedur/create.blade.php index e3c5526d1..270a23385 100755 --- a/resources/views/informasi/prosedur/create.blade.php +++ b/resources/views/informasi/prosedur/create.blade.php @@ -57,7 +57,7 @@ +@include('forms.datatable-vertical') +@endpush diff --git a/resources/views/surat/pengaturan.blade.php b/resources/views/surat/pengaturan.blade.php new file mode 100644 index 000000000..65cf72001 --- /dev/null +++ b/resources/views/surat/pengaturan.blade.php @@ -0,0 +1,166 @@ +@extends('layouts.dashboard_template') + +@section('content') +
    +

    + {{ $page_title ?? "Page Title" }} + {{ $page_description ?? '' }} +

    + +
    +
    +
    +

    Info Penting!

    + Fitur Sinkronisasi Surat TTE ke kecamatan saat ini masih berupa demo menunggu proses penyempurnaan dan terdapat kecamatan yang sudah mengimplentasikan TTE. + Kami juga menghimbau kepada seluruh pengguna memberikan masukan terkait penyempurnaan fitur ini baik dari sisi OpenSID maupun OpenDK. + Masukan dapat disampaikan di grup telegram, forum opendesa maupun issue di github. +
    + @include('partials.flash_message') +
    +
    +
    +
    +

    {{ $page_title }}

    +
    + +
    + @include('layouts.fragments.error_message') +
    + @if (!$camat) +
    +

    Pengaturan modul TTE dan pemeriksaan {{ $settings['sebutan_camat'] }} hanya bisa aktif jika akun {{ $settings['sebutan_camat'] }} sudah dibuat dan aktif.

    +
    + @endif + @if (!$sekretaris) +
    +

    Pemeriksaan {{ $settings['sebutan_sekretaris'] }} hanya bisa aktif jika akun {{ $settings['sebutan_sekretaris'] }} sudah dibuat dan aktif.

    +
    + @endif + @if ($settings['tte_api'] == 'demo') +
    +

    Info Penting!

    + Modul TTE ini hanya sebuah simulasi untuk persiapan penerapan TTE di + {{ $profil->nama_kecamatan }} +
    + @endif +
    +

    Info Penting!

    + Masukkan URL dengan nilai "demo" jika ingin mengaktifkan mode demo +
    + @include( 'flash::message' ) + {{ method_field('PUT') }} + @csrf +
    + +
    + + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + + +
    +
    +
    +
    + +
    + + +
    +
    +
    +
    +
    + +
    + +
    + +
    +
    +
    +@endsection +@include('partials.asset_jqueryvalidation') + +@push('scripts') +{!! JsValidator::formRequest('App\Http\Requests\PengaturanSuratRequest', '#form-pengaturan-surat') !!} + + +@endpush \ No newline at end of file diff --git a/resources/views/surat/permohonan/ditolak.blade.php b/resources/views/surat/permohonan/ditolak.blade.php new file mode 100644 index 000000000..815bab397 --- /dev/null +++ b/resources/views/surat/permohonan/ditolak.blade.php @@ -0,0 +1,72 @@ +@extends('layouts.dashboard_template') + +@section('title') Permohonan Surat @endsection + +@section('content') +
    +

    + {{ $page_title ?? "Page Title" }} + {{ $page_description ?? '' }} +

    + +
    + +
    +
    +

    Info Penting!

    + Fitur Sinkronisasi Surat TTE ke kecamatan saat ini masih berupa demo menunggu proses penyempurnaan dan terdapat kecamatan yang sudah mengimplentasikan TTE. + Kami juga menghimbau kepada seluruh pengguna memberikan masukan terkait penyempurnaan fitur ini baik dari sisi OpenSID maupun OpenDK. + Masukan dapat disampaikan di grup telegram, forum opendesa maupun issue di github. +
    + @include('surat.permohonan.widget') + +
    + + @include('partials.flash_message') +
    +
    + + + + + + + + + + + +
    DesaNama SuratNama PendudukDitandatangani olehTanggal SuratStatus
    +
    +
    +
    +
    +@endsection + +@include('partials.asset_datatables') + +@push('scripts') + +@include('forms.datatable-vertical') +@endpush diff --git a/resources/views/surat/permohonan/index.blade.php b/resources/views/surat/permohonan/index.blade.php new file mode 100644 index 000000000..d69c5945b --- /dev/null +++ b/resources/views/surat/permohonan/index.blade.php @@ -0,0 +1,73 @@ +@extends('layouts.dashboard_template') + +@section('title') Permohonan Surat @endsection + +@section('content') +
    +

    + {{ $page_title ?? "Page Title" }} + {{ $page_description ?? '' }} +

    + +
    + +
    +
    +

    Info Penting!

    + Fitur Sinkronisasi Surat TTE ke kecamatan saat ini masih berupa demo menunggu proses penyempurnaan dan terdapat kecamatan yang sudah mengimplentasikan TTE. + Kami juga menghimbau kepada seluruh pengguna memberikan masukan terkait penyempurnaan fitur ini baik dari sisi OpenSID maupun OpenDK. + Masukan dapat disampaikan di grup telegram, forum opendesa maupun issue di github. +
    + @include('surat.permohonan.widget') + +
    + @include('partials.flash_message') +
    +
    + + + + + + + + + + + + +
    AksiDesaNama SuratNama PendudukDitandatangani olehTanggal SuratStatus
    +
    +
    +
    +
    +@endsection + +@include('partials.asset_datatables') + +@push('scripts') + +@include('forms.datatable-vertical') +@endpush diff --git a/resources/views/surat/permohonan/show.blade.php b/resources/views/surat/permohonan/show.blade.php new file mode 100644 index 000000000..62ce98dfb --- /dev/null +++ b/resources/views/surat/permohonan/show.blade.php @@ -0,0 +1,218 @@ +@extends('layouts.dashboard_template') + +@section('title') Permohonan Surat @endsection + +@section('content') +
    +

    + {{ $page_title ?? "Page Title" }} + {{ $page_description ?? '' }} +

    + +
    + +
    + + @include('partials.flash_message') + +
    + +
    + +
    + +
    +
    +@endsection + +@include('partials.asset_sweetalert') + +@push('scripts') + +@endpush diff --git a/resources/views/surat/permohonan/widget.blade.php b/resources/views/surat/permohonan/widget.blade.php new file mode 100644 index 000000000..63f606955 --- /dev/null +++ b/resources/views/surat/permohonan/widget.blade.php @@ -0,0 +1,31 @@ +
    +
    +
    +
    +

    {{ App\Models\Surat::permohonan()->count() }}

    +

    Permohonan

    +
    +
    + +
    + + Selengkapnya + +
    +
    + +
    +
    +
    +

    {{ App\Models\Surat::ditolak()->count() }}

    +

    Ditolak

    +
    +
    + +
    + + Selengkapnya + +
    +
    +
    \ No newline at end of file diff --git a/resources/views/surat/qrcode.blade.php b/resources/views/surat/qrcode.blade.php new file mode 100644 index 000000000..50f5e77ed --- /dev/null +++ b/resources/views/surat/qrcode.blade.php @@ -0,0 +1,104 @@ + + + + + + {{ $page_title ?? config('app.name', 'Laravel') }} | {{ $browser_title }} + Document + + + + + + +
    +
    +
    + logo kecamatan +

    + + {{ strtoupper('Pemerintah Kabupaten ' . $profil->nama_kabupaten) }}
    + {{ strtoupper('Kecamatan ' . $profil->nama_kecamatan) }}
    +
    +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Menyatakan Bahwa :
    Nomor Surat:{{ $surat->nomor }}
    Tanggal Surat:{{ format_date($surat->tanggal) }}
    penduduk->nama; ?>
    Ditandatangani oleh :
    Nama:{{ $surat->pengurus->nama }}
    Jabatan:{{ $surat->pengurus->jabatan->nama }}
    +
    +
    +
    +
    Telah ditandatangani secara elektronik
    +
    +
    + logo bsre +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index 8fc3260c1..b72930a1c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -109,5 +109,12 @@ Route::post('/', 'Api\ProgamBantuanController@store'); Route::post('peserta', 'Api\ProgamBantuanController@storePeserta'); }); + + //Surat + Route::group(['prefix' => 'surat'], function () { + Route::get('/', 'Api\SuratController@index'); + Route::post('kirim', 'Api\SuratController@store'); + Route::get('download', 'Api\SuratController@download'); + }); }); }); diff --git a/routes/web.php b/routes/web.php index 010e382e1..997c44a40 100644 --- a/routes/web.php +++ b/routes/web.php @@ -537,6 +537,36 @@ }); }); + /** + * Group Routing for Pesan + */ + Route::namespace('Surat')->group(function () { + Route::group(['prefix' => 'surat', 'middleware' => ['role:super-admin|admin-kecamatan']], function () { + //permohonan + Route::group(['prefix' => 'permohonan'], function () { + Route::get('/', ['as' => 'surat.permohonan', 'uses' => 'PermohonanController@index']); + Route::get('getdata', ['as' => 'surat.permohonan.getdata', 'uses' => 'PermohonanController@getData']); + Route::get('show/{surat}', ['as' => 'surat.permohonan.show', 'uses' => 'PermohonanController@show']); + Route::get('download/{surat}', ['as' => 'surat.permohonan.download', 'uses' => 'PermohonanController@download']); + Route::get('setujui/{surat}', ['as' => 'surat.permohonan.setujui', 'uses' => 'PermohonanController@setujui']); + Route::post('tolak/{surat}', ['as' => 'surat.permohonan.tolak', 'uses' => 'PermohonanController@tolak']); + Route::get('ditolak', ['as' => 'surat.permohonan.ditolak', 'uses' => 'PermohonanController@ditolak']); + Route::get('getdataditolak', ['as' => 'surat.permohonan.getdataditolak', 'uses' => 'PermohonanController@getDataDitolak']); + Route::post('passphrase/{surat}', ['as' => 'surat.permohonan.passphrase', 'uses' => 'PermohonanController@passphrase']); + }); + + //arsip + Route::get('/arsip', ['as' => 'surat.arsip', 'uses' => 'SuratController@arsip']); + Route::get('/arsip/getdata', ['as' => 'surat.arsip.getdata', 'uses' => 'SuratController@getData']); + Route::get('/arsip/qrcode/{surat}', ['as' => 'surat.arsip.qrcode', 'uses' => 'SuratController@qrcode']); + Route::get('/arsip/download/{surat}', ['as' => 'surat.arsip.download', 'uses' => 'SuratController@download']); + + //pengaturan + Route::get('/pengaturan', ['as' => 'surat.pengaturan', 'uses' => 'SuratController@pengaturan']); + Route::put('/pengaturan/update', ['as' => 'surat.pengaturan.update', 'uses' => 'SuratController@pengaturan_update']); + }); + }); + /** * Group Routing for Setting */ From b95a9dd146c59141fd7f95fba19c73150970a8f3 Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Thu, 30 Mar 2023 14:27:46 +0700 Subject: [PATCH 23/60] Perbaikan jumlah penduduk tidak sinkron antara kecamatan dan desa karena perubahan NIK (kasus tertentu) (#663) * Perbaiki penduduk ganti nik ketika sinkronisasi * Update composer.json * Delete migrasi * Update SinkronPenduduk.php * Fix styling * [ci skip] catatan rilis * [ci skip] catatan rilis --------- Co-authored-by: Andi Fahruddin Akas Co-authored-by: andifahruddinakas --- app/Imports/SinkronPenduduk.php | 4 +- catatan_rilis.md | 6 +- composer.json | 5 +- ...03_29_224214_delete_duplicate_penduduk.php | 66 +++++++++++++++++++ 4 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 database/migrations/2023_03_29_224214_delete_duplicate_penduduk.php diff --git a/app/Imports/SinkronPenduduk.php b/app/Imports/SinkronPenduduk.php index 1eae7e5fa..1b1bdb2fd 100644 --- a/app/Imports/SinkronPenduduk.php +++ b/app/Imports/SinkronPenduduk.php @@ -122,8 +122,8 @@ public function collection(Collection $collection) ]; Penduduk::updateOrInsert([ - 'desa_id' => $insert['desa_id'], - 'nik' => $insert['nik'] + 'desa_id' => $insert['desa_id'], + 'id_pend_desa' => $insert['id_pend_desa'], ], $insert); } diff --git a/catatan_rilis.md b/catatan_rilis.md index 6e2ffeb05..cf305f34a 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -14,8 +14,8 @@ Di rilis v23.03.01 berisi perbaikan yang diminta Komunitas OpenDK. #### Perbaikan bug -1. [#638](https://github.com/OpenSID/OpenDK/issues/638) Perbaiki slider tidak bisa lebih dari 4. - +1. [#638](https://github.com/OpenSID/OpenDK/issues/638) Perbaikan slider tidak bisa lebih dari 4. +2. [#652](https://github.com/OpenSID/OpenDK/issues/652) Perbaikan jumlah penduduk tidak sinkron antara kecamatan dan desa karena perubahan NIK (kasus tertentu). #### Teknis @@ -25,4 +25,4 @@ Di rilis v23.03.01 berisi perbaikan yang diminta Komunitas OpenDK. 4. [#2116](https://github.com/OpenSID/premium/issues/2116) Audit keamanan form potensi. 5. [#2118](https://github.com/OpenSID/premium/issues/2118) Audit keamanan form dokumen. 6. [#2121](https://github.com/OpenSID/premium/issues/2121) Audit keamanan form pengurus. -7. [#2124](https://github.com/OpenSID/premium/issues/2124) Audit keamanan form keluhan. +7. [#2124](https://github.com/OpenSID/premium/issues/2124) Audit keamanan form keluhan. \ No newline at end of file diff --git a/composer.json b/composer.json index a1a5cda4c..58c0191b9 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,7 @@ "beyondcode/laravel-query-detector": "^1.5", "fakerphp/faker": "^1.10", "filp/whoops": "~2.0", - "friendsofphp/php-cs-fixer": "^3.0", + "friendsofphp/php-cs-fixer": "^3.9", "laravel/tinker": "^2.5", "mockery/mockery": "^1.3.1", "phpunit/phpunit": "^8.5", @@ -72,7 +72,8 @@ "preferred-install": "dist", "sort-packages": true, "allow-plugins": { - "symfony/thanks": true + "symfony/thanks": true, + "php-http/discovery": true } }, "extra": { diff --git a/database/migrations/2023_03_29_224214_delete_duplicate_penduduk.php b/database/migrations/2023_03_29_224214_delete_duplicate_penduduk.php new file mode 100644 index 000000000..bc6064b1b --- /dev/null +++ b/database/migrations/2023_03_29_224214_delete_duplicate_penduduk.php @@ -0,0 +1,66 @@ +select('id_pend_desa', 'desa_id', DB::raw('COUNT(*) as `count`')) + ->groupBy('id_pend_desa', 'desa_id') + ->having('count', '>', 1) + ->get(); + + foreach ($duplicates as $duplicate) { + $penduduk = Penduduk::where('id_pend_desa', $duplicate->id_pend_desa)->where('desa_id', $duplicate->desa_id)->latest('updated_at')->first('id'); + Penduduk::where('id_pend_desa', $duplicate->id_pend_desa)->where('desa_id', $duplicate->desa_id)->where('id', '!=', $penduduk->id)->delete(); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} From d1fb581b80405c376341b327f459e5d57c2998ed Mon Sep 17 00:00:00 2001 From: Syahran Saputra Date: Wed, 26 Apr 2023 12:06:07 +0800 Subject: [PATCH 24/60] Update lfm.php (#674) Fix bug UniSharp Laravel File Manager issue #673 --- config/lfm.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/lfm.php b/config/lfm.php index f1788e943..e19efbec5 100644 --- a/config/lfm.php +++ b/config/lfm.php @@ -41,7 +41,7 @@ // Middlewares which should be applied to all package routes. // For laravel 5.1 and before, remove 'web' from the array. - 'middlewares' => ['web'], + 'middlewares' => ['web','auth'], // The url to this package. Change it if necessary. 'url_prefix' => 'laravel-filemanager', From 5db6affac6782d1fbad4dc671e04784b0fed5c60 Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Wed, 26 Apr 2023 11:09:24 +0700 Subject: [PATCH 25/60] Mutakhirkan catatan rilis --- catatan_rilis.md | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/catatan_rilis.md b/catatan_rilis.md index 8d1291580..3f46aeb7b 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -1,32 +1,7 @@ #### [v23.04.00] -Di rilis v23.04.00 berisi penambahan fitur modul TTE dan permohonan surat dari OpendSID serta perbaikan yang diminta Komunitas OpenDK. - -#### Fitur -1. [#590](https://github.com/OpenSID/OpenDK/pull/590) Penambahan Modul Tte. -2. [#518](https://github.com/OpenSID/OpenDK/pull/518) Sediakan menu permohonan dan arsip surat dari opensid. - -#### Fitur -1. [#590](https://github.com/OpenSID/OpenDK/pull/590) Tambahkan Modul Tte. -2. [#534](https://github.com/OpenSID/OpenDK/pull/534) Sediakan API untuk untuk menerima surat TTE yang dikirim dari opensid. -3. [#518](https://github.com/OpenSID/OpenDK/pull/518) Sediakan menu permohonan dan arsip surat dari opensid. -4. [#532](https://github.com/OpenSID/OpenDK/pull/532) Sediakan notifikasi untuk setiap surat yang masuk dari opensid. -5. [#585](https://github.com/OpenSID/OpenDK/pull/585) Sediakan pengaturan pemeriksaan surat. -6. [#586](https://github.com/OpenSID/OpenDK/pull/586) Sediakan fungsi pemeriksaan surat. -7. [#587](https://github.com/OpenSID/OpenDK/pull/587) Sediakan fitur demo untuk proses TTE. -8. [#588](https://github.com/OpenSID/OpenDK/pull/588) Tambahkan logo bsre ke opendk. - -#### Perbaikan bug - -1. [#638](https://github.com/OpenSID/OpenDK/issues/638) Perbaikan slider tidak bisa lebih dari 4. -2. [#652](https://github.com/OpenSID/OpenDK/issues/652) Perbaikan jumlah penduduk tidak sinkron antara kecamatan dan desa karena perubahan NIK (kasus tertentu). +Di rilis v23.04.00 berisi perbaikan yang diminta Komunitas OpenDK. #### Teknis -1. [#2089](https://github.com/OpenSID/premium/issues/2089) Audit keamanan validasi saat unggah gambar di artikel. -2. [#2114](https://github.com/OpenSID/premium/issues/2114) Audit keamanan form prosedur. -3. [#2115](https://github.com/OpenSID/premium/issues/2115) Audit keamanan form regulasi. -4. [#2116](https://github.com/OpenSID/premium/issues/2116) Audit keamanan form potensi. -5. [#2118](https://github.com/OpenSID/premium/issues/2118) Audit keamanan form dokumen. -6. [#2121](https://github.com/OpenSID/premium/issues/2121) Audit keamanan form pengurus. -7. [#2124](https://github.com/OpenSID/premium/issues/2124) Audit keamanan form keluhan. +1. [#673](https://github.com/OpenSID/OpenDK/issues/673) Penyesuaian middleware laravel-filemanager agar hanya dapat diakses oleh admin. From ef9acc1152883d9b5681b64078fa40c1c0d65784 Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Wed, 10 May 2023 20:51:48 +0700 Subject: [PATCH 26/60] Audit keamanan form profil (#677) * Audit keamanan form profil * [ci skip] memutahirkan catatan rilis --------- Co-authored-by: vickyrolanda --- app/Http/Requests/ProfilRequest.php | 4 ++-- catatan_rilis.md | 4 ++++ resources/views/data/profil/form_edit.blade.php | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/Http/Requests/ProfilRequest.php b/app/Http/Requests/ProfilRequest.php index 8c25df2a5..4ccbc286d 100644 --- a/app/Http/Requests/ProfilRequest.php +++ b/app/Http/Requests/ProfilRequest.php @@ -65,8 +65,8 @@ public function rules() 'email' => 'required|email', 'tahun_pembentukan' => 'required|integer', 'dasar_pembentukan' => 'required|regex:/^[a-zA-Z0-9 \.\-\/]+$/|max:50', - 'file_logo' => 'image|mimes:jpg,jpeg,bmp,png,gif|max:1024', - 'file_struktur_organisasi' => 'image|mimes:jpg,jpeg,png,bmp,gif|max:1024', + 'file_logo' => 'image|mimes:jpg,jpeg,bmp,png,gif|max:1024|valid_file', + 'file_struktur_organisasi' => 'image|mimes:jpg,jpeg,png,bmp,gif|max:1024|valid_file', // 'visi' => 'required', // 'misi' => 'required', ]; diff --git a/catatan_rilis.md b/catatan_rilis.md index c873a14ff..5305a0e70 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -4,6 +4,10 @@ Di rilis v2305.0.0 berisi perbaikan yang diminta Komunitas OpenDK. Terima kasih pada syahransyaputra yang terus berkontribusi. +#### Perbaikan + +1. [#4](https://github.com/OpenSID/wiki-keamanan/issues/4) Perbaikan audit keamanan form profil. + #### Teknis 1. [#673](https://github.com/OpenSID/OpenDK/issues/673) Penyesuaian middleware laravel-filemanager agar hanya dapat diakses oleh admin. diff --git a/resources/views/data/profil/form_edit.blade.php b/resources/views/data/profil/form_edit.blade.php index 68fe6f362..5d8dc4b11 100644 --- a/resources/views/data/profil/form_edit.blade.php +++ b/resources/views/data/profil/form_edit.blade.php @@ -89,7 +89,7 @@
    - +
    @@ -101,7 +101,7 @@
    - +
    From 2518dc27a415be2a34771afd8bd9c6267d7e8f57 Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Wed, 10 May 2023 21:00:46 +0700 Subject: [PATCH 27/60] Audit keamanan form slide (#678) * Audit keamanan form slide * Sesuaikan * [ci skip[ memutahirkan catatan rilis --------- Co-authored-by: vickyrolanda --- app/Http/Controllers/Setting/SlideController.php | 4 ++-- app/Http/Requests/SlideRequest.php | 2 +- catatan_rilis.md | 1 + resources/views/setting/slide/form.blade.php | 8 ++++++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Setting/SlideController.php b/app/Http/Controllers/Setting/SlideController.php index 1cdc23b6b..a0e0cb681 100644 --- a/app/Http/Controllers/Setting/SlideController.php +++ b/app/Http/Controllers/Setting/SlideController.php @@ -73,7 +73,7 @@ public function create() public function store(SlideRequest $request) { try { - $input = $request->input(); + $input = $request->validated(); if ($request->hasFile('gambar')) { $file = $request->file('gambar'); @@ -110,7 +110,7 @@ public function edit(Slide $slide) public function update(SlideRequest $request, Slide $slide) { try { - $input = $request->all(); + $input = $request->validated(); if ($request->hasFile('gambar')) { $file = $request->file('gambar'); diff --git a/app/Http/Requests/SlideRequest.php b/app/Http/Requests/SlideRequest.php index dcca25fd7..413120a43 100644 --- a/app/Http/Requests/SlideRequest.php +++ b/app/Http/Requests/SlideRequest.php @@ -55,7 +55,7 @@ public function rules() return [ 'judul' => 'required', 'deskripsi' => 'required', - 'gambar' => 'file|mimes:jpg,jpeg,png|max:2048', + 'gambar' => 'file|mimes:jpg,jpeg,png|max:2048|valid_file', ]; } } diff --git a/catatan_rilis.md b/catatan_rilis.md index 5305a0e70..7e5f50d18 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -7,6 +7,7 @@ Terima kasih pada syahransyaputra yang terus berkontribusi. #### Perbaikan 1. [#4](https://github.com/OpenSID/wiki-keamanan/issues/4) Perbaikan audit keamanan form profil. +2. [#3](https://github.com/OpenSID/wiki-keamanan/issues/3) Perbaikan audit keamanan form slide. #### Teknis diff --git a/resources/views/setting/slide/form.blade.php b/resources/views/setting/slide/form.blade.php index a94c4ab29..d4945de6b 100644 --- a/resources/views/setting/slide/form.blade.php +++ b/resources/views/setting/slide/form.blade.php @@ -14,7 +14,7 @@
    - + Dimensi gambar 1360 x 400 Piksel
    @@ -24,11 +24,15 @@
    +@include('partials.asset_jqueryvalidation') + @push('scripts') +{!! JsValidator::formRequest('App\Http\Requests\SlideRequest', '#form-slide') !!} + diff --git a/resources/views/forms/aksi.blade.php b/resources/views/forms/aksi.blade.php index dd2f026e4..f413de6d3 100644 --- a/resources/views/forms/aksi.blade.php +++ b/resources/views/forms/aksi.blade.php @@ -61,7 +61,7 @@ @endif @if( isset( $agree_url ) ) - + diff --git a/resources/views/sistem_komplain/admin_komplain/index.blade.php b/resources/views/sistem_komplain/admin_komplain/index.blade.php index 8c250396a..bea6bb309 100755 --- a/resources/views/sistem_komplain/admin_komplain/index.blade.php +++ b/resources/views/sistem_komplain/admin_komplain/index.blade.php @@ -50,7 +50,7 @@ {data: 'judul', name: 'judul'}, {data: 'nama', name: 'nama'}, {data: 'kategori', name: 'kategori'}, - {data: 'status', name: 'status'}, + {data: 'status', name: 'status', class: 'status'}, ], order: [[1, 'asc']] }); diff --git a/resources/views/sistem_komplain/komplain/show.blade.php b/resources/views/sistem_komplain/komplain/show.blade.php index 9453dc1b2..a873860e6 100755 --- a/resources/views/sistem_komplain/komplain/show.blade.php +++ b/resources/views/sistem_komplain/komplain/show.blade.php @@ -99,21 +99,11 @@ @if($komplain->status != 'SELESAI') Jawab - @endif - Ubah - {!! Form::open(['method' => 'DELETE','route' => ['sistem-komplain.destroy', $komplain->id],'style' => 'display:inline']) !!} - - - - {!! Form::close() !!} - @else - @if($komplain->status != 'SELESAI') + @endif + @else + @if($komplain->status != 'SELESAI') Beri Komentar - @endif + @endif @endif
    diff --git a/routes/web.php b/routes/web.php index ce95854bb..fc20da13e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -150,10 +150,7 @@ Route::group(['prefix' => 'sistem-komplain'], function () { Route::get('/', ['as' => 'sistem-komplain.index', 'uses' => 'SistemKomplainController@index']); Route::get('kirim', ['as' => 'sistem-komplain.kirim', 'uses' => 'SistemKomplainController@kirim']); - Route::post('store', ['as' => 'sistem-komplain.store', 'uses' => 'SistemKomplainController@store']); - Route::get('edit/{id}', ['as' => 'sistem-komplain.edit', 'uses' => 'SistemKomplainController@edit']); - Route::put('update/{id}', ['as' => 'sistem-komplain.update', 'uses' => 'SistemKomplainController@update']); - Route::delete('destroy/{id}', ['as' => 'sistem-komplain.destroy', 'uses' => 'SistemKomplainController@destroy']); + Route::post('store', ['as' => 'sistem-komplain.store', 'uses' => 'SistemKomplainController@store']); Route::get('komplain/{slug}', ['as' => 'sistem-komplain.komplain', 'uses' => 'SistemKomplainController@show']); Route::get('komplain/kategori/{slug}', ['as' => 'sistem-komplain.kategori', 'uses' => 'SistemKomplainController@indexKategori']); Route::get('komplain-sukses', ['as' => 'sistem-komplain.komplain-sukses', 'uses' => 'SistemKomplainController@indexSukses']); From a7255db622cd69665008cacf7d80373ef54d674f Mon Sep 17 00:00:00 2001 From: vickyrolanda Date: Thu, 22 Jun 2023 08:34:06 +0700 Subject: [PATCH 41/60] [ci skip] memutahirkan catatan rilis --- catatan_rilis.md | 1 + 1 file changed, 1 insertion(+) diff --git a/catatan_rilis.md b/catatan_rilis.md index 6965527c0..3da41d348 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -6,6 +6,7 @@ Di rilis v2306.0.0 berisi perbaikan yang diminta Komunitas OpenDK. 1. [#692](https://github.com/OpenSID/OpenDK/issues/692) Perbaikan gagal impor penduduk ketika menjalankan install:dev. 2. [#503](https://github.com/OpenSID/OpenDK/issues/503) Perbaikan fitur keluhan web dan admin. +3. [#706](https://github.com/OpenSID/OpenDK/issues/706) Perbaikan validasi client-side pada form event agar lebih memudahkan pengguna. #### Teknis From 4c323f2767c97aaa1f110df5cfd8c1c8aae16bd8 Mon Sep 17 00:00:00 2001 From: Yogi Perdana Date: Thu, 22 Jun 2023 08:36:13 +0700 Subject: [PATCH 42/60] Tambah validasi client side form event agar memudahkan pengguna (#716) * Seragamkan form validasi dengan database * Fix styling --------- Co-authored-by: yogiperdana Co-authored-by: vickyrolanda --- app/Exceptions/Handler.php | 1 - app/Http/Controllers/User/UserController.php | 1 - app/Http/Requests/EventRequest.php | 11 ++++--- ...023_04_18_131637_update_status_keluhan.php | 31 ++++++++++++++++++- .../views/informasi/event/create.blade.php | 12 +------ .../views/informasi/event/edit.blade.php | 14 +-------- .../informasi/event/form_create.blade.php | 3 ++ .../views/informasi/event/form_edit.blade.php | 3 ++ routes/web.php | 2 +- 9 files changed, 45 insertions(+), 33 deletions(-) diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index feef17d95..89d2b9221 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -32,7 +32,6 @@ namespace App\Exceptions; use App\Models\Profil; -use Exception; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Illuminate\Support\Facades\Auth; use Throwable; diff --git a/app/Http/Controllers/User/UserController.php b/app/Http/Controllers/User/UserController.php index 0f8c871cd..2b66f4470 100755 --- a/app/Http/Controllers/User/UserController.php +++ b/app/Http/Controllers/User/UserController.php @@ -38,7 +38,6 @@ use App\Models\User; use Illuminate\Http\Request; use Illuminate\Http\Response; -use Illuminate\Support\Facades\Storage; use Spatie\Permission\Models\Role; use Yajra\DataTables\DataTables; diff --git a/app/Http/Requests/EventRequest.php b/app/Http/Requests/EventRequest.php index 7d538a5a1..b25a16d5c 100644 --- a/app/Http/Requests/EventRequest.php +++ b/app/Http/Requests/EventRequest.php @@ -53,11 +53,12 @@ public function authorize() public function rules() { return [ - 'event_name' => 'required', - 'start' => 'required', - 'end' => 'required', - 'attendants' => 'required', - 'attachment' => 'file|mimes:jpeg,png,jpg,gif,svg,xlsx,xls,doc,docx,pdf,ppt,pptx|max:2048', + 'event_name' => 'required|string|max:150', + 'start' => 'required', + 'end' => 'required', + 'attendants' => 'required|string|max:250', + 'description' => 'required', + 'attachment' => 'file|mimes:jpeg,png,jpg,gif,svg,xlsx,xls,doc,docx,pdf,ppt,pptx|max:2048', ]; } } diff --git a/database/migrations/2023_04_18_131637_update_status_keluhan.php b/database/migrations/2023_04_18_131637_update_status_keluhan.php index cdad07cbd..e5f26dd8e 100644 --- a/database/migrations/2023_04_18_131637_update_status_keluhan.php +++ b/database/migrations/2023_04_18_131637_update_status_keluhan.php @@ -1,5 +1,34 @@ update(['status' => 'PROSES']); + Komplain::whereStatus('BELUM')->update(['status' => 'PROSES']); } /** diff --git a/resources/views/informasi/event/create.blade.php b/resources/views/informasi/event/create.blade.php index a9ab65eb2..86f07efbf 100644 --- a/resources/views/informasi/event/create.blade.php +++ b/resources/views/informasi/event/create.blade.php @@ -19,20 +19,10 @@
    {!! Form::open( [ 'route' => 'informasi.event.store', 'method' => 'post','id' => 'form-event', 'class' => 'form-horizontal form-label-left' ] ) !!} + @include('layouts.fragments.error_message')
    - @if (count($errors) > 0) -
    - Ups! Ada beberapa masalah dengan masukan Anda.

    -
      - @foreach ($errors->all() as $error) -
    • {{ $error }}
    • - @endforeach -
    -
    - @endif - @include( 'flash::message' ) @include('informasi.event.form_create') diff --git a/resources/views/informasi/event/edit.blade.php b/resources/views/informasi/event/edit.blade.php index 322e72e1b..585a941a8 100755 --- a/resources/views/informasi/event/edit.blade.php +++ b/resources/views/informasi/event/edit.blade.php @@ -18,21 +18,9 @@
    - @if (count($errors) > 0) -
    - Ups! Ada beberapa masalah dengan masukan Anda.

    -
      - @foreach ($errors->all() as $error) -
    • {{ $error }}
    • - @endforeach -
    - -
    - - @endif - {!! Form::model($event, [ 'route' => ['informasi.event.update', $event->id], 'method' => 'post','id' => 'form-event', 'class' => 'form-horizontal form-label-left', 'files'=>true] ) !!} + @include('layouts.fragments.error_message')
    @include( 'flash::message' ) diff --git a/resources/views/informasi/event/form_create.blade.php b/resources/views/informasi/event/form_create.blade.php index b113212a1..954b8e914 100755 --- a/resources/views/informasi/event/form_create.blade.php +++ b/resources/views/informasi/event/form_create.blade.php @@ -31,7 +31,10 @@
    +@include('partials.asset_jqueryvalidation') + @push('scripts') +{!! JsValidator::formRequest('App\Http\Requests\EventRequest', '#form-event') !!} - + From 9ef3c4b4953be29781dfd1fe1df6caa5f5a32c4f Mon Sep 17 00:00:00 2001 From: Agung Sugiarto Date: Wed, 12 Jul 2023 04:09:06 +0700 Subject: [PATCH 55/60] Tambahakn Content-Security-Policy header (#736) * Tambahkan Header Anti-MIME-Sniffing * Fix styling * Tambahakn Content-Security-Policy header * [ci skip] memutahirkan catatan rilis --------- Co-authored-by: agungsugiarto Co-authored-by: Abah Roland --- app/Http/Middleware/SecurityHeaders.php | 1 + catatan_rilis.md | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Http/Middleware/SecurityHeaders.php b/app/Http/Middleware/SecurityHeaders.php index 8e9a0d237..f56f68511 100644 --- a/app/Http/Middleware/SecurityHeaders.php +++ b/app/Http/Middleware/SecurityHeaders.php @@ -50,6 +50,7 @@ public function handle($request, Closure $next) if (app()->environment('production')) { $response->headers->set('X-Content-Type-Options', 'nosniff'); + $response->headers->set('Content-Security-Policy', "default-src 'self';script-src 'self' platform.twitter.com unpkg.com 'unsafe-inline' 'unsafe-eval';style-src 'self' fonts.googleapis.com unpkg.com 'unsafe-inline';img-src 'self' * data:;font-src 'self' fonts.gstatic.com data:;connect-src 'self';media-src 'self';frame-src 'self' platform.twitter.com github.com *.youtube.com *.vimeo.com;object-src 'none';base-uri 'self';report-uri"); } return $response; diff --git a/catatan_rilis.md b/catatan_rilis.md index 776034298..b242cf12c 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -11,4 +11,5 @@ Di rilis v2307.0.1 berisi perbaikan yang diminta Komunitas OpenDK. 1. [#685](https://github.com/OpenSID/OpenDK/issues/685) Tambahkan flag HttpOnly pada setiap Cookie. 2. [#687](https://github.com/OpenSID/OpenDK/issues/687) Tambahkan Header Anti-MIME-Sniffing X-Content-Type-Options tidak disetel ke 'nosniff'. -3. [#686](https://github.com/OpenSID/OpenDK/issues/686) Memindahkan file sumber JavaScript dari domain yang berbeda. \ No newline at end of file +3. [#686](https://github.com/OpenSID/OpenDK/issues/686) Memindahkan file sumber JavaScript dari domain yang berbeda. +4. [#684](https://github.com/OpenSID/OpenDK/issues/684) Perbaikan terkait Content-Security-Policy header. \ No newline at end of file From 340b188c7f09ee3e449597841dc940bbad770ab9 Mon Sep 17 00:00:00 2001 From: Agung Sugiarto Date: Tue, 18 Jul 2023 10:59:10 +0700 Subject: [PATCH 56/60] rapikan css inline (#740) * rapikan css * [ci skip] catatan rilis --------- Co-authored-by: Andi Fahruddin Akas --- catatan_rilis.md | 3 +- public/css/desa.css | 107 ++++++++++++++++++++ resources/views/pages/berita/desa.blade.php | 102 +------------------ resources/views/pages/index.blade.php | 102 +------------------ 4 files changed, 111 insertions(+), 203 deletions(-) create mode 100644 public/css/desa.css diff --git a/catatan_rilis.md b/catatan_rilis.md index b242cf12c..bb9845a6e 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -12,4 +12,5 @@ Di rilis v2307.0.1 berisi perbaikan yang diminta Komunitas OpenDK. 1. [#685](https://github.com/OpenSID/OpenDK/issues/685) Tambahkan flag HttpOnly pada setiap Cookie. 2. [#687](https://github.com/OpenSID/OpenDK/issues/687) Tambahkan Header Anti-MIME-Sniffing X-Content-Type-Options tidak disetel ke 'nosniff'. 3. [#686](https://github.com/OpenSID/OpenDK/issues/686) Memindahkan file sumber JavaScript dari domain yang berbeda. -4. [#684](https://github.com/OpenSID/OpenDK/issues/684) Perbaikan terkait Content-Security-Policy header. \ No newline at end of file +4. [#684](https://github.com/OpenSID/OpenDK/issues/684) Perbaikan terkait Content-Security-Policy header. +5. [#737](https://github.com/OpenSID/OpenDK/issues/737) Rapikan css inline. \ No newline at end of file diff --git a/public/css/desa.css b/public/css/desa.css new file mode 100644 index 000000000..0bbe3b598 --- /dev/null +++ b/public/css/desa.css @@ -0,0 +1,107 @@ +.select2-container--default { + padding: 5px !important; + font-size: 12px !important; +} + +.card-body { + padding: 10px; + background-color: white; +} + +.page-header { + background: rgb(0, 43, 105); + background: linear-gradient(180deg, rgba(0, 43, 105, 1) 0%, rgba(0, 25, 142, 1) 50%, rgba(0, 43, 105, 1) 100%); + color: white; +} + +p { + font-family: 'Century Gothic', CenturyGothic, AppleGothic, sans-serif; + font-size: 14px; + font-style: normal; + font-variant: normal; + font-weight: 400; + line-height: 21px; +} + +.page-header strong { + padding-left: 90px; + font-family: 'Lato', sans-serif; +} + +@media(max-width:980px) { + .page-header strong { + font-size: 18px; + } + + .card-body p { + text-align: justify; + } +} + +.fat-arrow { + display: flex; + align-items: center; + width: 60px; + height: 40px; + position: absolute; + background: #ff4900; + margin-right: 20px; + color: white; + text-align: left; + line-height: 15px; + +} + +.fat-arrow:before { + content: ""; + position: absolute; + right: -20px; + bottom: 0; + width: 0; + height: 0; + border-left: 20px solid #ff4900; + border-top: 20px solid transparent; + border-bottom: 20px solid transparent; +} + +.flo-arrow { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + justify-content: center; + width: 30px; + height: 25px; + position: absolute; + left: 3px; + padding-left: 8px; + background: #fff; + color: #000; + font-weight: bold; + z-index: 2; + box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.75); +} + +.flo-arrow:before { + content: ""; + position: absolute; + right: -7px; + bottom: 0; + width: 0; + height: 0; + border-left: 7px solid #FFF; + border-top: 13px solid transparent; + border-bottom: 12px solid transparent; +} + +.title-artikel { + font-size: 14px; + font-family: 'Lato', sans-serif; + /* font-family: 'Varela', sans-serif; */ + /* font-family: 'Century Gothic', CenturyGothic, AppleGothic, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: 400; line-height: 21px; */ +} + +.card-horizontal { + display: flex; + flex: 1 1 auto; +} \ No newline at end of file diff --git a/resources/views/pages/berita/desa.blade.php b/resources/views/pages/berita/desa.blade.php index b45095e0d..d7312df80 100644 --- a/resources/views/pages/berita/desa.blade.php +++ b/resources/views/pages/berita/desa.blade.php @@ -1,106 +1,6 @@ @extends('layouts.app') @push('css') - + @endpush diff --git a/resources/views/pages/index.blade.php b/resources/views/pages/index.blade.php index 30a54ecd1..13608a5bc 100644 --- a/resources/views/pages/index.blade.php +++ b/resources/views/pages/index.blade.php @@ -1,107 +1,7 @@ @extends('layouts.app') @section('title','Beranda') @push('css') - + @endpush From 0dad436390c12ce8663c5e8a7b668d0b7207672a Mon Sep 17 00:00:00 2001 From: Agung Sugiarto Date: Tue, 18 Jul 2023 11:51:16 +0700 Subject: [PATCH 57/60] perbaikan notifikasi gagal kirim identitas desa menggunakan bahasa indonesia (#741) * translate pesan header validation * Fix styling * [ci skip] catatan rilis --------- Co-authored-by: agungsugiarto Co-authored-by: Andi Fahruddin Akas --- app/Exceptions/Handler.php | 16 ++++++++++++++++ catatan_rilis.md | 1 + resources/lang/id/validation.php | 1 + 3 files changed, 18 insertions(+) diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 89d2b9221..df4200a5f 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -34,6 +34,7 @@ use App\Models\Profil; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Illuminate\Support\Facades\Auth; +use Illuminate\Validation\ValidationException; use Throwable; class Handler extends ExceptionHandler @@ -110,4 +111,19 @@ public function render($request, Throwable $exception) { return parent::render($request, $exception); } + + /** + * Convert a validation exception into a JSON response. + * + * @param \Illuminate\Http\Request $request + * @param \Illuminate\Validation\ValidationException $exception + * @return \Illuminate\Http\JsonResponse + */ + protected function invalidJson($request, ValidationException $exception) + { + return response()->json([ + 'message' => __('validation.header'), + 'errors' => $exception->errors(), + ], $exception->status); + } } diff --git a/catatan_rilis.md b/catatan_rilis.md index bb9845a6e..eea0fff00 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -6,6 +6,7 @@ Di rilis v2307.0.1 berisi perbaikan yang diminta Komunitas OpenDK. 1. [#728](https://github.com/OpenSID/OpenDK/issues/728) Perbaikan pengurutan informasi artikel. 2. [#727](https://github.com/OpenSID/OpenDK/issues/727) Perbaikan terjadi error saat melakukan pencarian dan pengurutan nama perangkat kecamatan. +3. [#738](https://github.com/OpenSID/OpenDK/issues/738) Perbaikan notifikasi gagal kirim identitas desa menggunakan bahasa indonesia. #### Teknis diff --git a/resources/lang/id/validation.php b/resources/lang/id/validation.php index dc1c06971..648c0c112 100644 --- a/resources/lang/id/validation.php +++ b/resources/lang/id/validation.php @@ -30,6 +30,7 @@ */ return [ + 'header' => 'Data yang diberikan tidak valid.', 'accepted' => 'Isian :attribute harus diterima.', 'active_url' => 'Isian :attribute bukan URL yang sah.', 'after' => 'Isian :attribute harus tanggal setelah :date.', From 8c50ce1a6d55dcef47aaab7f1a9e77f8cb1ad60a Mon Sep 17 00:00:00 2001 From: Agung Sugiarto Date: Thu, 20 Jul 2023 00:09:11 +0700 Subject: [PATCH 58/60] [bug] default bahasa indonesia untuk datatable (#743) * [bug] default bahasa indonesia untuk datatable * [ci skip] memutahirkan catatan rilis --------- Co-authored-by: vickyrolanda --- catatan_rilis.md | 3 +- .../datatables.net/i18n/id.json | 227 ++++++++++++++++++ .../views/partials/asset_datatables.blade.php | 5 + 3 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 public/bower_components/datatables.net/i18n/id.json diff --git a/catatan_rilis.md b/catatan_rilis.md index eea0fff00..671a455ab 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -14,4 +14,5 @@ Di rilis v2307.0.1 berisi perbaikan yang diminta Komunitas OpenDK. 2. [#687](https://github.com/OpenSID/OpenDK/issues/687) Tambahkan Header Anti-MIME-Sniffing X-Content-Type-Options tidak disetel ke 'nosniff'. 3. [#686](https://github.com/OpenSID/OpenDK/issues/686) Memindahkan file sumber JavaScript dari domain yang berbeda. 4. [#684](https://github.com/OpenSID/OpenDK/issues/684) Perbaikan terkait Content-Security-Policy header. -5. [#737](https://github.com/OpenSID/OpenDK/issues/737) Rapikan css inline. \ No newline at end of file +5. [#737](https://github.com/OpenSID/OpenDK/issues/737) Rapikan css inline. +6. [#742](https://github.com/OpenSID/OpenDK/issues/742) Ubah bahasa bawaan untuk datatable ke bahasa indonesia. diff --git a/public/bower_components/datatables.net/i18n/id.json b/public/bower_components/datatables.net/i18n/id.json new file mode 100644 index 000000000..d8e745bc9 --- /dev/null +++ b/public/bower_components/datatables.net/i18n/id.json @@ -0,0 +1,227 @@ +{ + "emptyTable": "Tidak ada data yang tersedia pada tabel ini", + "info": "Menampilkan _START_ sampai _END_ dari _TOTAL_ entri", + "infoEmpty": "Menampilkan 0 sampai 0 dari 0 entri", + "infoFiltered": "(disaring dari _MAX_ entri keseluruhan)", + "lengthMenu": "Tampilkan _MENU_ entri", + "loadingRecords": "Sedang memuat...", + "processing": "Sedang memproses...", + "search": "Cari:", + "zeroRecords": "Tidak ditemukan data yang sesuai", + "thousands": "'", + "paginate": { + "first": "Pertama", + "last": "Terakhir", + "next": "Selanjutnya", + "previous": "Sebelumnya" + }, + "aria": { + "sortAscending": ": aktifkan untuk mengurutkan kolom ke atas", + "sortDescending": ": aktifkan untuk mengurutkan kolom menurun" + }, + "autoFill": { + "cancel": "Batalkan", + "fill": "Isi semua sel dengan %d<\/i>", + "fillHorizontal": "Isi sel secara horizontal", + "fillVertical": "Isi sel secara vertikal" + }, + "buttons": { + "collection": "Kumpulan ", + "colvis": "Visibilitas Kolom", + "colvisRestore": "Kembalikan visibilitas", + "copy": "Salin", + "copySuccess": { + "1": "1 baris disalin ke papan klip", + "_": "%d baris disalin ke papan klip" + }, + "copyTitle": "Salin ke Papan klip", + "csv": "CSV", + "excel": "Excel", + "pageLength": { + "-1": "Tampilkan semua baris", + "_": "Tampilkan %d baris" + }, + "pdf": "PDF", + "print": "Cetak", + "copyKeys": "Tekan ctrl atau u2318 + C untuk menyalin tabel ke papan klip.

    Untuk membatalkan, klik pesan ini atau tekan esc." + }, + "searchBuilder": { + "add": "Tambah Kondisi", + "button": { + "0": "Cari Builder", + "_": "Cari Builder (%d)" + }, + "clearAll": "Bersihkan Semua", + "condition": "Kondisi", + "data": "Data", + "deleteTitle": "Hapus filter", + "leftTitle": "Ke Kiri", + "logicAnd": "Dan", + "logicOr": "Atau", + "rightTitle": "Ke Kanan", + "title": { + "0": "Cari Builder", + "_": "Cari Builder (%d)" + }, + "value": "Nilai", + "conditions": { + "date": { + "after": "Setelah", + "before": "Sebelum", + "between": "Diantara", + "empty": "Kosong", + "equals": "Sama dengan", + "not": "Tidak sama", + "notBetween": "Tidak diantara", + "notEmpty": "Tidak kosong" + }, + "number": { + "between": "Diantara", + "empty": "Kosong", + "equals": "Sama dengan", + "gt": "Lebih besar dari", + "gte": "Lebih besar atau sama dengan", + "lt": "Lebih kecil dari", + "lte": "Lebih kecil atau sama dengan", + "not": "Tidak sama", + "notBetween": "Tidak diantara", + "notEmpty": "Tidak kosong" + }, + "string": { + "contains": "Berisi", + "empty": "Kosong", + "endsWith": "Diakhiri dengan", + "equals": "Sama Dengan", + "not": "Tidak sama", + "notEmpty": "Tidak kosong", + "startsWith": "Diawali dengan" + }, + "array": { + "equals": "Sama dengan", + "empty": "Kosong", + "contains": "Berisi", + "not": "Tidak", + "notEmpty": "Tidak kosong", + "without": "Tanpa" + } + } + }, + "searchPanes": { + "clearMessage": "Bersihkan Semua", + "count": "{total}", + "countFiltered": "{shown} ({total})", + "title": "Filter Aktif - %d", + "collapse": { + "0": "Panel Pencarian", + "_": "Panel Pencarian (%d)" + }, + "emptyPanes": "Tidak Ada Panel Pencarian", + "loadMessage": "Memuat Panel Pencarian" + }, + "infoThousands": ",", + "select": { + "cells": { + "1": "1 sel terpilih", + "_": "%d sel terpilih" + }, + "columns": { + "1": "1 kolom terpilih", + "_": "%d kolom terpilih" + } + }, + "datetime": { + "previous": "Sebelumnya", + "next": "Selanjutnya", + "hours": "Jam", + "minutes": "Menit", + "seconds": "Detik", + "unknown": "-", + "amPm": [ + "am", + "pm" + ], + "weekdays": [ + "Min", + "Sen", + "Sel", + "Rab", + "Kam", + "Jum", + "Sab" + ], + "months": [ + "Januari", + "Februari", + "Maret", + "April", + "Mei", + "Juni", + "Juli", + "Agustus", + "September", + "Oktober", + "November", + "Desember" + ] + }, + "editor": { + "close": "Tutup", + "create": { + "button": "Tambah", + "submit": "Tambah", + "title": "Tambah inputan baru" + }, + "remove": { + "button": "Hapus", + "submit": "Hapus", + "confirm": { + "_": "Apakah Anda yakin untuk menghapus %d baris?", + "1": "Apakah Anda yakin untuk menghapus 1 baris?" + }, + "title": "Hapus inputan" + }, + "multi": { + "title": "Beberapa Nilai", + "info": "Item yang dipilih berisi nilai yang berbeda untuk input ini. Untuk mengedit dan mengatur semua item untuk input ini ke nilai yang sama, klik atau tekan di sini, jika tidak maka akan mempertahankan nilai masing-masing.", + "restore": "Batalkan Perubahan", + "noMulti": "Masukan ini dapat diubah satu per satu, tetapi bukan bagian dari grup." + }, + "edit": { + "title": "Edit inputan", + "submit": "Edit", + "button": "Edit" + }, + "error": { + "system": "Terjadi kesalahan pada system. (Informasi Selebihnya<\/a>)." + } + }, + "stateRestore": { + "creationModal": { + "button": "Buat", + "columns": { + "search": "Pencarian Kolom", + "visible": "Visibilitas Kolom" + }, + "name": "Nama:", + "order": "Penyortiran", + "paging": "Penomoran", + "scroller": "Posisi Scroll", + "search": "Pencarian", + "searchBuilder": "Pembangun Pencarian", + "select": "Pemilihan", + "title": "Buat State Baru", + "toggleLabel": "Termasuk:" + }, + "duplicateError": "State dengan nama ini sudah ada.", + "emptyError": "Nama tidak boleh kosong.", + "emptyStates": "Tidak ada state yang disimpan.", + "removeConfirm": "Apakah Anda yakin ingin menghapus %s?", + "removeError": "Gagal menghapus state.", + "removeJoiner": "dan", + "removeSubmit": "Hapus", + "removeTitle": "Hapus State", + "renameButton": "Ganti Nama", + "renameLabel": "Nama Baru untuk %s:", + "renameTitle": "Ganti Nama State" + } +} \ No newline at end of file diff --git a/resources/views/partials/asset_datatables.blade.php b/resources/views/partials/asset_datatables.blade.php index 117587612..403c4cd01 100755 --- a/resources/views/partials/asset_datatables.blade.php +++ b/resources/views/partials/asset_datatables.blade.php @@ -7,4 +7,9 @@ + @endpush \ No newline at end of file From 4de4a8e22d58f3b1645b620f5c404dd4a697c3ef Mon Sep 17 00:00:00 2001 From: Agung Sugiarto Date: Thu, 20 Jul 2023 00:55:19 +0700 Subject: [PATCH 59/60] Issue#729 (#739) * wip: upgrade tinymce * tinymce * [ci skip] memutahirkan catatan rilis --------- Co-authored-by: vickyrolanda --- catatan_rilis.md | 1 + public/js/tinymce/.npmignore | 2 + public/js/tinymce/CHANGELOG.md | 3253 ++ public/js/tinymce/README.md | 71 + public/js/tinymce/bower.json | 27 + public/js/tinymce/composer.json | 52 + public/js/tinymce/icons/default/icons.js | 351 +- public/js/tinymce/icons/default/icons.min.js | 2 +- public/js/tinymce/jquery.tinymce.min.js | 91 - public/js/tinymce/license.txt | 21 + public/js/tinymce/models/dom/index.js | 7 + public/js/tinymce/models/dom/model.js | 8040 +++ public/js/tinymce/models/dom/model.min.js | 4 + public/js/tinymce/package.json | 32 + public/js/tinymce/plugins/accordion/index.js | 7 + public/js/tinymce/plugins/accordion/plugin.js | 1033 + .../tinymce/plugins/accordion/plugin.min.js | 4 + public/js/tinymce/plugins/advlist/plugin.js | 370 +- .../js/tinymce/plugins/advlist/plugin.min.js | 9 +- public/js/tinymce/plugins/anchor/plugin.js | 160 +- .../js/tinymce/plugins/anchor/plugin.min.js | 9 +- public/js/tinymce/plugins/autolink/plugin.js | 403 +- .../js/tinymce/plugins/autolink/plugin.min.js | 9 +- .../js/tinymce/plugins/autoresize/plugin.js | 212 +- .../tinymce/plugins/autoresize/plugin.min.js | 9 +- public/js/tinymce/plugins/autosave/plugin.js | 229 +- .../js/tinymce/plugins/autosave/plugin.min.js | 9 +- public/js/tinymce/plugins/bbcode/index.js | 7 - public/js/tinymce/plugins/bbcode/plugin.js | 99 - .../js/tinymce/plugins/bbcode/plugin.min.js | 2 +- public/js/tinymce/plugins/charmap/plugin.js | 588 +- .../js/tinymce/plugins/charmap/plugin.min.js | 9 +- public/js/tinymce/plugins/code/plugin.js | 42 +- public/js/tinymce/plugins/code/plugin.min.js | 9 +- .../js/tinymce/plugins/codesample/plugin.js | 4014 +- .../tinymce/plugins/codesample/plugin.min.js | 9 +- .../js/tinymce/plugins/colorpicker/index.js | 7 - .../js/tinymce/plugins/colorpicker/plugin.js | 21 - .../tinymce/plugins/colorpicker/plugin.min.js | 2 +- .../js/tinymce/plugins/contextmenu/index.js | 7 - .../js/tinymce/plugins/contextmenu/plugin.js | 21 - .../tinymce/plugins/contextmenu/plugin.min.js | 2 +- .../tinymce/plugins/directionality/plugin.js | 552 +- .../plugins/directionality/plugin.min.js | 9 +- .../plugins/emoticons/js/emojiimages.js | 9425 +-- .../plugins/emoticons/js/emojiimages.min.js | 2 +- .../js/tinymce/plugins/emoticons/js/emojis.js | 9424 +-- .../plugins/emoticons/js/emojis.min.js | 2 +- public/js/tinymce/plugins/emoticons/plugin.js | 707 +- .../tinymce/plugins/emoticons/plugin.min.js | 9 +- public/js/tinymce/plugins/fullpage/index.js | 7 - public/js/tinymce/plugins/fullpage/plugin.js | 544 - .../js/tinymce/plugins/fullpage/plugin.min.js | 2 +- .../js/tinymce/plugins/fullscreen/plugin.js | 1494 +- .../tinymce/plugins/fullscreen/plugin.min.js | 9 +- .../tinymce/plugins/help/js/i18n/keynav/ar.js | 90 + .../plugins/help/js/i18n/keynav/bg_BG.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/ca.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/cs.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/da.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/de.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/el.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/en.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/es.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/eu.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/fa.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/fi.js | 90 + .../plugins/help/js/i18n/keynav/fr_FR.js | 90 + .../plugins/help/js/i18n/keynav/he_IL.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/hi.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/hr.js | 90 + .../plugins/help/js/i18n/keynav/hu_HU.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/id.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/it.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/ja.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/kk.js | 90 + .../plugins/help/js/i18n/keynav/ko_KR.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/ms.js | 90 + .../plugins/help/js/i18n/keynav/nb_NO.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/nl.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/pl.js | 90 + .../plugins/help/js/i18n/keynav/pt_BR.js | 90 + .../plugins/help/js/i18n/keynav/pt_PT.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/ro.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/ru.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/sk.js | 90 + .../plugins/help/js/i18n/keynav/sl_SI.js | 90 + .../plugins/help/js/i18n/keynav/sv_SE.js | 90 + .../plugins/help/js/i18n/keynav/th_TH.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/tr.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/uk.js | 90 + .../tinymce/plugins/help/js/i18n/keynav/vi.js | 90 + .../plugins/help/js/i18n/keynav/zh_CN.js | 84 + .../plugins/help/js/i18n/keynav/zh_TW.js | 90 + public/js/tinymce/plugins/help/plugin.js | 719 +- public/js/tinymce/plugins/help/plugin.min.js | 9 +- public/js/tinymce/plugins/hr/index.js | 7 - public/js/tinymce/plugins/hr/plugin.js | 45 - public/js/tinymce/plugins/hr/plugin.min.js | 2 +- public/js/tinymce/plugins/image/plugin.js | 1910 +- public/js/tinymce/plugins/image/plugin.min.js | 9 +- public/js/tinymce/plugins/imagetools/index.js | 7 - .../js/tinymce/plugins/imagetools/plugin.js | 1531 - .../tinymce/plugins/imagetools/plugin.min.js | 2 +- public/js/tinymce/plugins/importcss/plugin.js | 288 +- .../tinymce/plugins/importcss/plugin.min.js | 9 +- .../tinymce/plugins/insertdatetime/plugin.js | 181 +- .../plugins/insertdatetime/plugin.min.js | 9 +- .../tinymce/plugins/kodeisian/plugin.min.js | 92 + .../plugins/laporan_keuangan/plugin.min.js | 342 + .../js/tinymce/plugins/legacyoutput/index.js | 7 - .../js/tinymce/plugins/legacyoutput/plugin.js | 199 - .../plugins/legacyoutput/plugin.min.js | 2 +- public/js/tinymce/plugins/link/plugin.js | 1480 +- public/js/tinymce/plugins/link/plugin.min.js | 9 +- public/js/tinymce/plugins/lists/plugin.js | 2381 +- public/js/tinymce/plugins/lists/plugin.min.js | 9 +- public/js/tinymce/plugins/media/plugin.js | 1348 +- public/js/tinymce/plugins/media/plugin.min.js | 9 +- .../js/tinymce/plugins/nonbreaking/plugin.js | 119 +- .../tinymce/plugins/nonbreaking/plugin.min.js | 9 +- .../js/tinymce/plugins/noneditable/index.js | 7 - .../js/tinymce/plugins/noneditable/plugin.js | 117 - .../tinymce/plugins/noneditable/plugin.min.js | 2 +- public/js/tinymce/plugins/pagebreak/plugin.js | 93 +- .../tinymce/plugins/pagebreak/plugin.min.js | 9 +- public/js/tinymce/plugins/paste/index.js | 7 - public/js/tinymce/plugins/paste/plugin.js | 1803 - public/js/tinymce/plugins/paste/plugin.min.js | 2 +- .../plugins/penerima_bantuan/plugin.min.js | 66 + public/js/tinymce/plugins/preview/plugin.js | 101 +- .../js/tinymce/plugins/preview/plugin.min.js | 9 +- public/js/tinymce/plugins/print/index.js | 7 - public/js/tinymce/plugins/print/plugin.js | 52 - public/js/tinymce/plugins/print/plugin.min.js | 2 +- public/js/tinymce/plugins/quickbars/plugin.js | 628 +- .../tinymce/plugins/quickbars/plugin.min.js | 9 +- .../responsivefilemanager/img/insertfile.gif | Bin 0 -> 3325 bytes .../responsivefilemanager/plugin.min.js | 132 + .../plugins/salintemplate/plugin.min.js | 59 + public/js/tinymce/plugins/save/plugin.js | 96 +- public/js/tinymce/plugins/save/plugin.min.js | 9 +- .../tinymce/plugins/searchreplace/plugin.js | 1067 +- .../plugins/searchreplace/plugin.min.js | 9 +- public/js/tinymce/plugins/sotk/plugin.min.js | 39 + .../js/tinymce/plugins/spellchecker/index.js | 7 - .../js/tinymce/plugins/spellchecker/plugin.js | 730 - .../plugins/spellchecker/plugin.min.js | 2 +- public/js/tinymce/plugins/tabfocus/index.js | 7 - public/js/tinymce/plugins/tabfocus/plugin.js | 130 - .../js/tinymce/plugins/tabfocus/plugin.min.js | 2 +- public/js/tinymce/plugins/table/plugin.js | 13178 +---- public/js/tinymce/plugins/table/plugin.min.js | 9 +- public/js/tinymce/plugins/template/plugin.js | 776 +- .../js/tinymce/plugins/template/plugin.min.js | 9 +- public/js/tinymce/plugins/textcolor/index.js | 7 - public/js/tinymce/plugins/textcolor/plugin.js | 21 - .../tinymce/plugins/textcolor/plugin.min.js | 2 +- .../js/tinymce/plugins/textpattern/index.js | 7 - .../js/tinymce/plugins/textpattern/plugin.js | 1374 - .../tinymce/plugins/textpattern/plugin.min.js | 2 +- public/js/tinymce/plugins/toc/index.js | 7 - public/js/tinymce/plugins/toc/plugin.js | 238 - public/js/tinymce/plugins/toc/plugin.min.js | 2 +- .../js/tinymce/plugins/visualblocks/plugin.js | 87 +- .../plugins/visualblocks/plugin.min.js | 9 +- .../js/tinymce/plugins/visualchars/plugin.js | 658 +- .../tinymce/plugins/visualchars/plugin.min.js | 9 +- public/js/tinymce/plugins/wordcount/plugin.js | 338 +- .../tinymce/plugins/wordcount/plugin.min.js | 9 +- .../js/tinymce/skins/content/dark/content.css | 10 +- .../skins/content/dark/content.min.css | 8 +- .../tinymce/skins/content/default/content.css | 6 - .../skins/content/default/content.min.css | 6 - .../skins/content/document/content.css | 6 - .../skins/content/document/content.min.css | 6 - .../skins/content/tinymce-5-dark/content.css | 66 + .../content/tinymce-5-dark/content.min.css | 1 + .../skins/content/tinymce-5/content.css | 61 + .../skins/content/tinymce-5/content.min.css | 1 + .../tinymce/skins/content/writer/content.css | 6 - .../skins/content/writer/content.min.css | 6 - .../tinymce/skins/ui/oxide-dark/content.css | 88 +- .../skins/ui/oxide-dark/content.inline.css | 91 +- .../ui/oxide-dark/content.inline.min.css | 8 +- .../skins/ui/oxide-dark/content.min.css | 8 +- .../skins/ui/oxide-dark/content.mobile.css | 29 - .../ui/oxide-dark/content.mobile.min.css | 7 - .../ui/oxide-dark/fonts/tinymce-mobile.woff | Bin 4624 -> 0 bytes .../js/tinymce/skins/ui/oxide-dark/skin.css | 1420 +- .../tinymce/skins/ui/oxide-dark/skin.min.css | 8 +- .../skins/ui/oxide-dark/skin.mobile.css | 673 - .../skins/ui/oxide-dark/skin.mobile.min.css | 7 - .../skins/ui/oxide-dark/skin.shadowdom.css | 9 +- .../ui/oxide-dark/skin.shadowdom.min.css | 8 +- public/js/tinymce/skins/ui/oxide/content.css | 91 +- .../tinymce/skins/ui/oxide/content.inline.css | 91 +- .../skins/ui/oxide/content.inline.min.css | 8 +- .../js/tinymce/skins/ui/oxide/content.min.css | 8 +- .../tinymce/skins/ui/oxide/content.mobile.css | 29 - .../skins/ui/oxide/content.mobile.min.css | 7 - .../skins/ui/oxide/fonts/tinymce-mobile.woff | Bin 4624 -> 0 bytes public/js/tinymce/skins/ui/oxide/skin.css | 1385 +- public/js/tinymce/skins/ui/oxide/skin.min.css | 8 +- .../js/tinymce/skins/ui/oxide/skin.mobile.css | 673 - .../skins/ui/oxide/skin.mobile.min.css | 7 - .../tinymce/skins/ui/oxide/skin.shadowdom.css | 9 +- .../skins/ui/oxide/skin.shadowdom.min.css | 8 +- .../skins/ui/tinymce-5-dark/content.css | 766 + .../ui/tinymce-5-dark/content.inline.css | 779 + .../ui/tinymce-5-dark/content.inline.min.css | 1 + .../skins/ui/tinymce-5-dark/content.min.css | 1 + .../tinymce/skins/ui/tinymce-5-dark/skin.css | 3782 ++ .../skins/ui/tinymce-5-dark/skin.min.css | 1 + .../ui/tinymce-5-dark/skin.shadowdom.css | 30 + .../ui/tinymce-5-dark/skin.shadowdom.min.css | 1 + .../js/tinymce/skins/ui/tinymce-5/content.css | 785 + .../skins/ui/tinymce-5/content.inline.css | 779 + .../skins/ui/tinymce-5/content.inline.min.css | 1 + .../skins/ui/tinymce-5/content.min.css | 1 + public/js/tinymce/skins/ui/tinymce-5/skin.css | 3782 ++ .../tinymce/skins/ui/tinymce-5/skin.min.css | 1 + .../skins/ui/tinymce-5/skin.shadowdom.css | 30 + .../skins/ui/tinymce-5/skin.shadowdom.min.css | 1 + public/js/tinymce/themes/mobile/index.js | 7 - public/js/tinymce/themes/mobile/theme.js | 13130 ----- public/js/tinymce/themes/mobile/theme.min.js | 9 - public/js/tinymce/themes/silver/theme.js | 47253 ++++++++-------- public/js/tinymce/themes/silver/theme.min.js | 9 +- public/js/tinymce/tinymce.d.ts | 3206 ++ public/js/tinymce/tinymce.js | 31297 ++++++++++ public/js/tinymce/tinymce.min.js | 9 +- .../views/partials/asset_tinymce.blade.php | 5 +- resources/views/pesan/compose_pesan.blade.php | 67 +- resources/views/pesan/read_pesan.blade.php | 86 +- 235 files changed, 99949 insertions(+), 88358 deletions(-) create mode 100644 public/js/tinymce/.npmignore create mode 100644 public/js/tinymce/CHANGELOG.md create mode 100644 public/js/tinymce/README.md create mode 100644 public/js/tinymce/bower.json create mode 100644 public/js/tinymce/composer.json delete mode 100644 public/js/tinymce/jquery.tinymce.min.js create mode 100644 public/js/tinymce/license.txt create mode 100644 public/js/tinymce/models/dom/index.js create mode 100644 public/js/tinymce/models/dom/model.js create mode 100644 public/js/tinymce/models/dom/model.min.js create mode 100644 public/js/tinymce/package.json create mode 100644 public/js/tinymce/plugins/accordion/index.js create mode 100644 public/js/tinymce/plugins/accordion/plugin.js create mode 100644 public/js/tinymce/plugins/accordion/plugin.min.js delete mode 100644 public/js/tinymce/plugins/bbcode/index.js delete mode 100644 public/js/tinymce/plugins/bbcode/plugin.js delete mode 100644 public/js/tinymce/plugins/colorpicker/index.js delete mode 100644 public/js/tinymce/plugins/colorpicker/plugin.js delete mode 100644 public/js/tinymce/plugins/contextmenu/index.js delete mode 100644 public/js/tinymce/plugins/contextmenu/plugin.js delete mode 100644 public/js/tinymce/plugins/fullpage/index.js delete mode 100644 public/js/tinymce/plugins/fullpage/plugin.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/ar.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/bg_BG.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/ca.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/cs.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/da.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/de.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/el.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/en.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/es.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/eu.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/fa.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/fi.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/fr_FR.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/he_IL.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/hi.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/hr.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/hu_HU.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/id.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/it.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/ja.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/kk.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/ko_KR.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/ms.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/nb_NO.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/nl.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/pl.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/pt_BR.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/pt_PT.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/ro.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/ru.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/sk.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/sl_SI.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/sv_SE.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/th_TH.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/tr.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/uk.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/vi.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/zh_CN.js create mode 100644 public/js/tinymce/plugins/help/js/i18n/keynav/zh_TW.js delete mode 100644 public/js/tinymce/plugins/hr/index.js delete mode 100644 public/js/tinymce/plugins/hr/plugin.js delete mode 100644 public/js/tinymce/plugins/imagetools/index.js delete mode 100644 public/js/tinymce/plugins/imagetools/plugin.js create mode 100644 public/js/tinymce/plugins/kodeisian/plugin.min.js create mode 100644 public/js/tinymce/plugins/laporan_keuangan/plugin.min.js delete mode 100644 public/js/tinymce/plugins/legacyoutput/index.js delete mode 100644 public/js/tinymce/plugins/legacyoutput/plugin.js delete mode 100644 public/js/tinymce/plugins/noneditable/index.js delete mode 100644 public/js/tinymce/plugins/noneditable/plugin.js delete mode 100644 public/js/tinymce/plugins/paste/index.js delete mode 100644 public/js/tinymce/plugins/paste/plugin.js create mode 100644 public/js/tinymce/plugins/penerima_bantuan/plugin.min.js delete mode 100644 public/js/tinymce/plugins/print/index.js delete mode 100644 public/js/tinymce/plugins/print/plugin.js create mode 100644 public/js/tinymce/plugins/responsivefilemanager/img/insertfile.gif create mode 100644 public/js/tinymce/plugins/responsivefilemanager/plugin.min.js create mode 100644 public/js/tinymce/plugins/salintemplate/plugin.min.js create mode 100644 public/js/tinymce/plugins/sotk/plugin.min.js delete mode 100644 public/js/tinymce/plugins/spellchecker/index.js delete mode 100644 public/js/tinymce/plugins/spellchecker/plugin.js delete mode 100644 public/js/tinymce/plugins/tabfocus/index.js delete mode 100644 public/js/tinymce/plugins/tabfocus/plugin.js delete mode 100644 public/js/tinymce/plugins/textcolor/index.js delete mode 100644 public/js/tinymce/plugins/textcolor/plugin.js delete mode 100644 public/js/tinymce/plugins/textpattern/index.js delete mode 100644 public/js/tinymce/plugins/textpattern/plugin.js delete mode 100644 public/js/tinymce/plugins/toc/index.js delete mode 100644 public/js/tinymce/plugins/toc/plugin.js create mode 100644 public/js/tinymce/skins/content/tinymce-5-dark/content.css create mode 100644 public/js/tinymce/skins/content/tinymce-5-dark/content.min.css create mode 100644 public/js/tinymce/skins/content/tinymce-5/content.css create mode 100644 public/js/tinymce/skins/content/tinymce-5/content.min.css delete mode 100644 public/js/tinymce/skins/ui/oxide-dark/content.mobile.css delete mode 100644 public/js/tinymce/skins/ui/oxide-dark/content.mobile.min.css delete mode 100644 public/js/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff delete mode 100644 public/js/tinymce/skins/ui/oxide-dark/skin.mobile.css delete mode 100644 public/js/tinymce/skins/ui/oxide-dark/skin.mobile.min.css delete mode 100644 public/js/tinymce/skins/ui/oxide/content.mobile.css delete mode 100644 public/js/tinymce/skins/ui/oxide/content.mobile.min.css delete mode 100644 public/js/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff delete mode 100644 public/js/tinymce/skins/ui/oxide/skin.mobile.css delete mode 100644 public/js/tinymce/skins/ui/oxide/skin.mobile.min.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5-dark/content.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5-dark/content.inline.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5-dark/content.min.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5-dark/skin.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5-dark/skin.min.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5/content.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5/content.inline.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5/content.inline.min.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5/content.min.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5/skin.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5/skin.min.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5/skin.shadowdom.css create mode 100644 public/js/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css delete mode 100644 public/js/tinymce/themes/mobile/index.js delete mode 100644 public/js/tinymce/themes/mobile/theme.js delete mode 100644 public/js/tinymce/themes/mobile/theme.min.js create mode 100644 public/js/tinymce/tinymce.d.ts create mode 100644 public/js/tinymce/tinymce.js diff --git a/catatan_rilis.md b/catatan_rilis.md index 671a455ab..531ce7dc3 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -16,3 +16,4 @@ Di rilis v2307.0.1 berisi perbaikan yang diminta Komunitas OpenDK. 4. [#684](https://github.com/OpenSID/OpenDK/issues/684) Perbaikan terkait Content-Security-Policy header. 5. [#737](https://github.com/OpenSID/OpenDK/issues/737) Rapikan css inline. 6. [#742](https://github.com/OpenSID/OpenDK/issues/742) Ubah bahasa bawaan untuk datatable ke bahasa indonesia. +7. [#729](https://github.com/OpenSID/OpenDK/issues/729) Upgrade tinymce 5.18.3 ke versi 6.5.1. diff --git a/public/js/tinymce/.npmignore b/public/js/tinymce/.npmignore new file mode 100644 index 000000000..45187ad43 --- /dev/null +++ b/public/js/tinymce/.npmignore @@ -0,0 +1,2 @@ +composer.json +bower.json diff --git a/public/js/tinymce/CHANGELOG.md b/public/js/tinymce/CHANGELOG.md new file mode 100644 index 000000000..835257dcd --- /dev/null +++ b/public/js/tinymce/CHANGELOG.md @@ -0,0 +1,3253 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Unreleased + +## 6.5.1 - 2023-06-19 + +### Fixed +- Fixed a regression where pasting an image url would result in the url being inserted as plain text instead of the image being inserted. #TINY-9997 +- It was not possible to press space to insert a space character inside a summary element on Firefox. #TINY-9964 + +## 6.5.0 - 2023-06-12 + +### Added +- Support for the `h` hash parameter in Vimeo video URLs in the Media plugin. #TINY-9830 +- New `table_merge_content_on_paste` option which disables the merging behaviour when pasting a table inside an existing table. #TINY-9808 +- New optional `defaultExpandedIds` and `onToggleExpand` options to the `tree` component config. #TINY-9653 +- New optional `defaultSelectedId` option to the `tree` component config. #TINY-9715 +- New `accordion` plugin with the `InsertAccordion` command. #TINY-9730 +- New `accordion` and `accordion-toggle` icons. #TINY-9789 +- New `details_initial_state` and `details_serialized_state` options. #TINY-9732 +- New `init_content_sync` option that initializes the editor iframe using `document.write` instead of `srcdoc`. #TINY-9818 +- New `newdocument_content` option that sets the content presented in the editor on choosing *File -> New document* or pressing the *New document* toolbar button. #TINY-9839 +- New `editable_root` option that can be set to `false` to prevent editing of the editor’s root element. #TINY-9839 +- New `editor.setEditableRoot` API that sets the editable state of the editor root element. #TINY-9839 +- New `editor.hasEditableRoot` API that returns `true` or `false` depending on the editable state of the editor root element. #TINY-9839 +- New `EditableRootStateChange` event that gets dispatched when the state of the editable root is changed. #TINY-9839 +- Added Oxide styles for `dl`, `dt`, `dd`, `ol`, and `strong` elements in dialog body content. #TINY-9919 + +### Improved +- Screen readers can now announce highlighted items listed in the Link dialog’s link combobox. #TINY-9280 +- The `icon` field for a dialog’s footer `togglebutton` is no longer mandatory. #TINY-9757 +- Toolbar buttons and menu items now present as disabled when they cannot be used because a selected element has a `contenteditable="false"` attribute. #TINY-9669 +- Help text displayed at *Help -> Help -> Keyboard Navigation* re-written. #DOC-1936 +- Translations added for Help text displayed at *Help > Help > Keyboard Navigation*. #TINY-9633 +- For word count purposes these characters are now considered punctuation marks: *$*, *~*, *+*, *|*, *№*, and *`*. They no longer increase a document’s word count. #TINY-8122 +- Updated the `codesample` plugin dialog and the `template` plugin dialog to use the `listbox` component to match other dialogs. #TINY-9630 +- If the selection contains more than one table cell, Quickbar toolbars are now positioned in the middle of the selection horizontally. #TINY-8297 +- Exposed `dataTransfer` property of drag and drop events for elements with a `contenteditable="false"` attribute. #TINY-9601 +- Screen readers now announce instructions for resizing the editor using arrow keys, when the resize handle is focused. #TINY-9793 +- Dialog `tabpanel` tab labels are now allowed to word wrap for better readability with long labels. #TINY-9947 +- Added newlines before and after `details` elements in the output HTML. #TINY-9959 +- Added padding for empty `summary` elements so that they can be properly edited. #TINY-9959 + +### Changed +- The `caption`, `address` and `dt` elements no longer incorrectly allow non-inline child elements when the editor schema is set to _HTML 4_. #TINY-9768 +- SVG icons for back and foreground colors now use `class` instead of `id` to identify SVG elements that should change color. #TINY-9844 +- Anchor tag elements — `` — no longer incorrectly allow non-inline child elements when the editor schema is set to _HTML 4_. #TINY-9805 +- Help dialog was restored to `medium` width for better readability. #TINY-9947 + +### Fixed +- Right-clicking on a merge tag instance presented different highlighting depending on the host browser. #TINY-9848 +- When macOS was the host operating system, pressing *Command+backspace* did not add an undo level. #TINY-8910 +- *Ctrl+backspace* and *Ctrl+delete* did not restore the correct insertion point position after a redo operation. #TINY-8910 +- In the `tree` component, a selected item in a directory would not stay selected after collapsing the directory. #TINY-9715 +- Enabling or Disabling checkboxes would not set the correct classes and attributes. #TINY-4189 +- Entering a newline would, in some setups, place the insertion point in the wrong paragraph. #TINY-9822 +- Redial would, in some situations, cause select elements not to have an initial value selected when they should have. #TINY-9679 +- The Table toolbar was visible even if the table was within a host element with a `contenteditable="false"` attribute set. #TINY-9664 +- Quickbar toolbars were incorrectly shown for elements with a `contenteditable="false"` attribute set in a root with a `contenteditable="false"` attribute set. #TINY-9460 +- When Chrome was the host browser, adding a newline when the insertion point was placed after a table could, in some specific situations, not generate the expected newline. #TINY-9813 +- Show the calculated height and width of Media Embed elements in the `media` plugin dialog. #TINY-8714 +- Removing an image that failed to upload from an empty paragraph left the paragraph without a padding `
    ` tag. #TINY-9696 +- Allow a Media Embed element to be correctly resized when using the `media` plugin dialog by converting the Media Embed element to a standalone iframe. #TINY-8714 +- In some circumstances, an inline alert in the _Search and Replace_ dialog persisted when it was not necessary. #TINY-9704 +- Context toolbars displayed the incorrect status for the `advlist` plugin buttons. #TINY-9680 +- In Safari running on iOS, Korean characters merged onto the previous line upon typing after inserting a newline by pressing Enter. #TINY-9746 +- Initiating the editor with a table as the first element resulted in resize handles being displayed around the table even when the editor did not have focus. #TINY-9748 +- If the insertion point was between two images, pressing the Backspace key would, in some situations, delete the image after the insertion point instead of the image before the insertion point. #TINY-9807 +- Directionality commands could set the `dir` attribute on elements with a `contenteditable="false"` attribute set when these elements were within a root with a `contenteditable="false"` attribute set. #TINY-9662 +- The content of the dialog body could not be scrolled. #TINY-9668 +- Some toolbar items, when in a not-enabled state, did not render the `not-allowed` mouse pointer. #TINY-9758 +- Formats were incorrectly applied to the closest editable element if the selection was in a `contenteditable="false"` context. #TINY-9678 +- Formats were incorrectly removed from the closest editable element if the selection was in a `contenteditable="false"` context. #TINY-9678 +- Formatter API, `canApply`, was not returning `false` when the selection was in a `contenteditable="false"` context. #TINY-9678 +- When dragging image elements and dropping the image in the editor the `dragend` event would sometimes not fire when Firefox was the host browser. #TINY-9694 +- It was possible to remove links in noneditable contents with the `unlink` editor command. #TINY-9739 +- Direction was not visually changing when using the Directionality plugin on an element which had the `direction` CSS property set. #TINY-9314 +- Whitespace between transparent elements was incorrectly converted into empty paragraphs. #TINY-9761 +- Popups were not constrained within the scrollable container when in a shadow root. #TINY-9743 +- Pressing arrow keys inside RTL elements would move the insertion point in an incorrect direction when moving over elements with the `contenteditable` attribute set to `false`. #TINY-9565 +- Inserting two tables consecutively without focus in the editor resulted in the second table being inserted at the wrong position. #TINY-3909 +- Pasting content into the editor did not fire `beforeinput` and `input` events. #TINY-9829 +- In some cases, exiting a `blockquote` element could fail when the insertion point was positioned at the end of the `blockquote`. #TINY-9794 +- Templates containing an `` tag were not parsed before being rendered for preview. #TINY-9867 +- Typing after deleting formatted content could remove a space at the start of the typing. #TINY-9310 +- Invalid markup in Notification and Dialog close buttons. #TINY-9849 +- In dialogs, an incorrect `aria-describedby` attribute caused the dialog body to be announced when using a screen reader. #TINY-9816 +- The sticky toolbar did not render correctly when transitioning from the custom editor view to the main view. #TINY-9814 +- Saving the Table Properties dialog after changing properties unrelated to cells would overwrite cell properties set by the Cell Properties dialog. #TINY-9837 +- Fixed the constrained bounds calculation for dismissal of the toolbar when using `toolbar_location: 'bottom'`. #TINY-9718 +- Pressing the Backspace or Delete key when the insertion point was within a `details` element resulted in broken markup. #TINY-9884 +- Making the selection into a list did not work if the selection included a block element with a `contenteditable="false"` attribute. #TINY-9823 +- Inserting elements in the middle of the summary caused two summaries to appear within `details` elements. #TINY-9885 + +## 6.4.2 - 2023-04-26 + +### Fixed +- The editor displayed a notification error when it failed to retrieve a blob image uri. #TINY-9604 +- Tab navigation no longer incorrectly stops at menu buttons within toolbar groups. #TINY-9723 +- The `urlinput` dialog component would not open the type-ahead dropdown when the input value was reset to an empty string. #TINY-9717 +- Redial would, in some circumstances, cause elements to not have an initial value selected when they should have. #TINY-9679 +- When hovering over tree dialog components the mouse pointer rendered incorrectly. #TINY-9692 +- The `tox-button` and `tox-button-secondary` buttons now support the `hover`, `active`, `focus`, and `disabled` states. #TINY-9713 +- Setting an invalid unit in the `fontsizeinput` changed it to the default value instead of reverting it to the previous, and valid, value. #TINY-9754 +- Selection was not correctly scrolled horizontally into view when using the `selection.scrollIntoView` API. #TINY-9747 +- The contextual toolbar displayed the status of Advanced List Premium plugin icons incorrectly. #TINY-9680 +- The `quickimage` toolbar button failed to insert images selected from the local computer when running on Google Chrome for macOS. #TINY-9769 + +## 6.4.1 - 2023-03-29 + +### Fixed +- The `fontsizeinput` increase and decrease size buttons now work on TinyMCE mobile. #TINY-9725 +- The TinyMCE editor toolbar is now accessible for all screen widths; it no longer collapses into an inaccessible vertical line when the screen is scrolled horizontally. #TINY-9646 +- Reverted the changes made, in TinyMCE 6.4.0, to UI button colors in focus, active, and enabled states. #TINY-9176 + +## 6.4.0 - 2023-03-15 + +### Added +- New `tree` component that can be used in dialog body panel. #TINY-9532 +- `renderUI` property in the `Theme` type can now return a `Promise` instead of `RenderResult`. #TINY-9556 +- New `isEditable` API to `editor.selection` that returns true or false if the current selection is editable. #TINY-9462 +- New `isEditable` API to `editor.dom` that returns true or false if the specified node is editable. #TINY-9462 +- New `setText` and `setIcon` methods added to menu button and toolbar button API. #TINY-9268 +- New `highlight_on_focus` option which enables highlighting the content area on focus. #TINY-9277 +- New `fontsizeinput` toolbar item which allows the user to set the size via input and also increase and decrease it with `+` and `-` buttons. #TINY-9429 +- Added `skipFocus` option to the `ToggleToolbarDrawer` command to preserve focus. #TINY-9337 +- New `font_size_input_default_unit` option allows entry of numbers without a unit in `fontsizeinput`. They are then parsed as the set unit. If `font_size_input_default_unit` is not set the default is `pt`. #TINY-9585 +- New `group` and `togglebutton` in view. #TINY-9523 +- New `togglebutton` in dialog footer buttons. #TINY-9523 +- Added `toggleFullscreen` to dialog API. #TINY-9528 +- New `text-size-increase` and `text-size-decrease` icons. #TINY-9530 +- New `xss_sanitization` option to allow disabling of XSS sanitization. #TINY-9600 +- Added the top right close button of modal dialogs to the tabbing order. The 'x' button in these dialogs can now be accessed using keyboard navigation. #TINY-9520 +- New `ui_mode` option for editor in scrollable containers support. #TINY-9414 +- The sidebar element now has the accessibility role `region` when visible and the accessibility role `presentation` when hidden. #TINY-9517 +- The `tox-custom-editor` class now has a border highlight when it is selected. #TINY-9673 +- An element could be dropped onto the decendants of an element with a `contenteditable="false"` attribute. #TINY-9364 +- Checkmark did not show in menu color swatches. #TINY-9395 +- Add support for navigating inside the tree component using arrow keys and shift key. #TINY-9614 + +### Improved +- Direct invalid child text nodes of list elements are now wrapped in list item elements. #TINY-4818 +- Templates are now be parsed before preview and insertion to make preview consistent with inserted template content and prevent XSS. #TINY-9244 +- Pressing backspace on an empty line now preserves formatting on the previous empty line. #TINY-9454 +- Pressing enter inside the `inputfontsize` input field now moves focus back into the editor content. #TINY-9598 +- Drag and drop events for elements with a `contenteditable="false"` attribute now includes target element details. #TINY-9599 +- Updated focus, active, and enabled colors of UI buttons for improved contrast against the UI color. #TINY-9176 + +### Changed +- The `link` plugins context menu items no longer appears for links that include elements with a `contenteditable="false"` attribute. #TINY-9491 +- The formatting of elements with a `contenteditable="false"` attribute are no longer cloned to new cells when new table rows are created. #TINY-9449 +- Changed the color of `@dialog-table-border-color`, and added right padding to the first cell of dialog table. #TINY-9380 + +### Fixed +- Sometimes the editor would finish initializing before the silver theme would have finished loading. #TINY-9556 +- The `searchreplace` modal closed incorrectly when clicking outside of the alert that pops up when no match is found. #TINY-9443 +- The text color or background color picker toolbar buttons did not update when the text color or background color was changed using the equivalent commands in the Format menu. #TINY-9439 +- The `onSetup` api function would not run when defining custom group toolbar button. #TINY-9496 +- The foreground and background menu icons would not properly update to display the last used color. #TINY-9497 +- Added new `setIconFill` function to `NestedMenuItemInstanceApi`. #TINY-9497 +- Pasting links to text would sometimes not generate the correct undo stack in Safari. #TINY-9489 +- Toolbar split buttons in `advlist` plugin now show the correct state when the cursor is in a checklist. #TINY-5167 +- Dragging transparent elements into transparent block elements could produce invalid nesting of transparents. #TINY-9231 +- The `editor.insertContent` API would insert contents inside elements with a `contenteditable="false"` attribute if the selection was inside the element. #TINY-9462 +- Closing a dialog would scroll down the document in Safari. #TINY-9148 +- Inline headers would not work in some situations when the editor was moved too far right horizontally. #TINY-8977 +- Quick toolbars were incorrectly rendered during the dragging of elements with a `contenteditable="false"` attribute. #TINY-9305 +- Selection of images, horizontal rules, tables or elements with a `contenteditable="false"` attribute was possible if they were within an element with a `contenteditable="false"` attribute. #TINY-9473 +- Ranged deletion of formatted text using selection or a keyboard shortcut would sometimes cause Blink- and Webkit-based browsers to insert interpreted tags upon typing. This could result in inconsistent tags. #TINY-9302 +- Visual characters were rendered inside elements with a `contenteditable="false"` attribute. #TINY-9474 +- Lists with an element with a `contenteditable="false"` attribute as their root were incorrectly editable using list API commands, toolbar buttons and menu items. #TINY-9458 +- Color picker dialog would not update the preview color if the hex input value was prefixed with the `#` character. #TINY-9457 +- Table cell selection was possible even if the element being selected was within an element with a `contenteditable="false"` attribute. #TINY-9459 +- Table commands were modifying tables that were within an element with a `contenteditable="false"` attribute. #TINY-9459 +- Fake carets were rendered for elements with a `contenteditable="false"` attribute and for tables within an element with a `contenteditable="false"` attribute. #TINY-9459 +- Textareas with scrollbars in dialogs would not render rounded corners correctly on some browsers. #TINY-9331 +- It was possible to open links inside the editor if the editor root was an element with a `contenteditable="false"` attribute. #TINY-9470 +- Inline boundary was rendered for boundary elements that had a `contenteditable="false"` attribute. #TINY-9471 +- Clicking on a disabled split button will no longer call the `onAction` callback. #TINY-9504 +- The *Edit Link* dialog incorrectly retrieved the URL value when opened immediately after the link insertion. #TINY-7993 +- The `ForwardDelete` and `Delete` editor commands were deleting content within elements with a `contenteditable="false"` attribute. #TINY-9477 +- The Backspace and Forward Delete keys were deleting content within elements with a `contenteditable="false"` attribute. #TINY-9477 +- Inserting newlines inside an editable element that was inside an element with a `contenteditable="false"` attribute root would sometimes try to split the editable element. #TINY-9461 +- Creating a list in a table cell when the caret is in front of an anchor element would not properly include the anchor in the list. #TINY-6853 +- Dragging and dropping elements with a `contenteditable="false"` attribute on table borders would remove the element on drop. #TINY-9021 +- Elements with a `contenteditable="false"` attribute would be removed when dragged and dropped within a root element with a `contenteditable="false"` attribute. #TINY-9558 +- Formatting could be applied or removed to list items with a `contenteditable="false"` attribute that were inside an element with a `contenteditable="false"` attribute. #TINY-9563 +- Annotation were not removed if the annotation was deleted immediately after being created. #TINY-9399 +- Inserting a link for a selection from quickbars did not preserve formatting. #TINY-9593 +- Inline dialog position was not correct when the editor was not inline and was contained in a `fixed` or `absolute` positioned element. #TINY-9554 +- Sticky toolbars did not fade transition when undocking in classic iframe mode. #TINY-9408 +- Inserting elements that were not valid within the closest editing host would incorrectly split the editing host. #TINY-9595 +- The `color_cols` option was not respected in the `forecolor` or `backcolor` color swatches. #TINY-9560 +- Drag and dropping the last element with a `contenteditable="false"` attribute out of its parent block would not properly pad the parent block element. #TINY-9606 +- Applying heading formats from `text_patterns` produced an invisible space before a word. #TINY-9603 +- Opening color swatches caused the browser tab to crash when `color_cols` or other column option was set to 0. #TINY-9649 +- Opening a menu button in the footer of a dialog after a redial threw an error. #TINY-9686 +- After closing a view, the `more...` toolbar button disappeared if the editor had `toolbar_mode: 'sliding'` and the toolbar was opened. #TINY-9419 +- Inline dialogs would open partially off screen when the toolbar had a small width. #TINY-9588 +- The `autoresize` plugin would cause infinite resizing when `content_css` was set to `document`. #TINY-8872 + +## 6.3.2 - 2023-02-22 + +### Fixed +- Removed a workaround for ensuring stylesheets are loaded in an outdated version of webkit. #TINY-9433 + +## 6.3.1 - 2022-12-06 + +### Fixed +- HTML in messages for the `WindowManager.alert` and `WindowManager.confirm` APIs were not properly sanitized. #TINY-3548 + +## 6.3.0 - 2022-11-23 + +### Added +- New `expand` function added to `tinymce.selection` which expands the selection around the nearest word. #TINY-9001 +- New `expand` function added to `tinymce.dom.RangeUtils` to return a new range expanded around the nearest word. #TINY-9001 +- New `color_map_background` and `color_map_foreground` options which set the base colors used in the `backcolor` and `forecolor` toolbar buttons and menu items. #TINY-9184 +- Added optional `storageKey` property to `colorinput` component and `colorswatch` fancy menu item. #TINY-9184 +- New `addView` function added to `editor.ui.registry` which makes it possible to register custom editor views. #TINY-9210 +- New `ToggleView` command which makes it possible to hide or show registered custom views. #TINY-9210 +- New `color_default_foreground` and `color_default_background` options to set the initial default color for the `forecolor` and `backcolor` toolbar buttons and menu items. #TINY-9183 +- New `getTransparentElements` function added to `tinymce.html.Schema` to return a map object of transparent HTML elements. #TINY-9172 +- Added `ToggleToolbarDrawer` event to subscribe to toolbar’s opening and closing. #TINY-9271 + +### Changed +- Transparent elements, like anchors, are now allowed in the root of the editor body if they contain blocks. #TINY-9172 +- Colorswatch keyboard navigation now starts on currently selected color if present in the colorswatch. #TINY-9283 +- `setContent` is now allowed to accept any custom keys and values as a second options argument. #TINY-9143 + +### Improved +- Transparent elements, like anchors, can now contain block elements. #TINY-9172 +- Colorswatch now displays a checkmark for selected color. #TINY-9283 +- Color picker dialog now starts on the appropriate color for the cursor position. #TINY-9213 + +### Fixed +- Parsing media content would cause a memory leak, which for example occurred when using the `getContent` API. #TINY-9186 +- Dragging a noneditable element toward the bottom edge would cause the page to scroll up. #TINY-9025 +- Range expanding capabilities would behave inconsistently depending on where the cursor was placed. #TINY-9029 +- Compilation errors were thrown when using TypeScript 4.8. #TINY-9161 +- Line separator scrolling in floating toolbars. #TINY-8948 +- A double bottom border appeared on inline mode editor for the `tinymce-5` skin. #TINY-9108 +- The editor header showed up even with no menubar and toolbar configured. #TINY-8819 +- Inline text pattern no longer triggers if it matches only the end but not the start. #TINY-8947 +- Matches of inline text patterns that are similar are now managed correctly. #TINY-8949 +- Using `editor.selection.getContent({ format: 'text' })` or `editor.getContent({ format: 'text' })` would sometimes deselect selected radio buttons. #TINY-9213 +- The context toolbar prevented the user from placing the cursor at the edges of the editor. #TINY-8890 +- The Quick Insert context toolbar provided by the `quickbars` plugin showed when the cursor was in a fake block caret. #TINY-9190 +- The `editor.selection.getRng()` API was not returning a proper range on hidden editors in Firefox. #TINY-9259 +- The `editor.selection.getBookmark()` API was not returning a proper bookmark on hidden editors in Firefox. #TINY-9259 +- Dragging a noneditable element before or after another noneditable element now works correctly. #TINY-9253 +- The restored selection after a redo or undo action was not scrolled into view. #TINY-9222 +- A newline could not be inserted when the selection was restored from a bookmark after an inline element with a `contenteditable="false"` attribute. #TINY-9194 +- The global `tinymce.dom.styleSheetLoader` was not affected by the `content_css_cors` option. #TINY-6037 +- The caret was moved to the previous line when a text pattern executed a `mceInsertContent` command on Enter key when running on Firefox. #TINY-9193 + +## 6.2.0 - 2022-09-08 + +### Added +- New `text_patterns_lookup` option to provide additional text patterns dynamically. #TINY-8778 +- New promotion element has been added to the default UI. It can be disabled using the new `promotion` option. #TINY-8840 +- New `format_noneditable_selector` option to specify the `contenteditable="false"` elements that can be wrapped in a format. #TINY-8905 +- Added `allow` as a valid attribute for the `iframe` element in the editor schema. #TINY-8939 +- New `search` field in the `MenuButton` that shows a search field at the top of the menu, and refetches items when the search field updates. #TINY-8952 + +### Improved +- The formatter can now apply a format to a `contenteditable="false"` element by wrapping it. Configurable using the `format_noneditable_selector` option. #TINY-8905 +- The autocompleter now supports a multiple character trigger using the new `trigger` configuration. #TINY-8887 +- The formatter now applies some inline formats, such as color and font size, to list item elements when the entire item content is selected. #TINY-8961 +- The installed and available plugin lists in the Help dialog are now sorted alphabetically. #TINY-9019 +- Alignment can now be applied to more types of embedded media elements. #TINY-8687 + +### Changed +- The `@menubar-row-separator-color` oxide variable no longer affects the divider between the Menubar and Toolbar. It only controls the color of the separator lines drawn in multiline Menubars. #TINY-8632 +- The `@toolbar-separator-color` oxide variable now affects the color of the separator between the Menubar and Toolbar only. #TINY-8632 +- Available Premium plugins, which are listed by name in the Help dialog, are no longer translated. #TINY-9019 + +### Fixed +- The Autolink plugin did not work when text nodes in the content were fragmented. #TINY-3723 +- Fixed multiple incorrect types on public APIs found while enabling TypeScript strict mode. #TINY-8806 +- The number of blank lines returned from `editor.getContent({format: 'text'})` differed between browsers. #TINY-8579 +- The editor focused via the `auto_focus` option was not scrolled into the viewport. #TINY-8785 +- Adding spaces immediately after a `contenteditable="false"` block did not work properly in some circumstances. #TINY-8814 +- Elements with only `data-*` custom attributes were sometimes removed when they should not be removed. #TINY-8755 +- Selecting a figure with `class="image"` incorrectly highlighted the link toolbar button. #TINY-8832 +- Specifying a single, non-default list style for the `advlist_bullet_styles` and `advlist_number_styles` options was not respected. #TINY-8721 +- Fixed multiple issues that occurred when formatting `contenteditable` elements. #TINY-8905 +- Spaces could be incorrectly added to `urlinput` dialog components (commonly but not exclusively presented in the *Insert/Edit Link* dialog) in certain cases. #TINY-8775 +- The text patterns logic threw an error when there were fragmented text nodes in a paragraph. #TINY-8779 +- Dragging a `contentEditable=false` element towards a document’s edge did not cause scrolling. #TINY-8874 +- Parsing large documents no longer throws a `Maximum call stack size exceeded` exception. #TINY-6945 +- DomParser filter matching was not checked between filters, which could lead to an exception in the parser. #TINY-8888 +- `contenteditable="false"` lists can no longer be toggled; and `contenteditable="true"` list elements within these lists can no longer be indented, split into another list element, or appended to the previous list element by deletion. #TINY-8920 +- Removed extra bottom padding in the context toolbar of the `tinymce-5` skin. #TINY-8980 +- Fixed a regression where pressing **Enter** added or deleted content outside the selection. #TINY-9101 +- Fixed a bug where pressing **Enter** deleted selected `contenteditable="false"` `
    ` elements. #TINY-9101
    +- The `editor.insertContent()` API did not respect the `no_events` argument. #TINY-9140
    +
    +### Deprecated
    +- The autocompleter configuration property, `ch`, has been deprecated. It will be removed in the next major release. Use the `trigger` property instead. #TINY-8887
    +
    +## 6.1.2 - 2022-07-29
    +
    +### Fixed
    +- Reverted the undo level fix in the `autolink` plugin as it caused duplicated content in some edge cases. #TINY-8936
    +
    +## 6.1.1 - 2022-07-27
    +
    +### Fixed
    +- Invalid special elements were not cleaned up correctly during sanitization. #TINY-8780
    +- An exception was thrown when deleting all content if the start or end of the document had a `contenteditable="false"` element. #TINY-8877
    +- When a sidebar was opened using the `sidebar_show` option, its associated toolbar button was not highlighted. #TINY-8873
    +- When converting a URL to a link, the `autolink` plugin did not fire an `ExecCommand` event, nor did it create an undo level. #TINY-8896
    +- Worked around a Firefox bug which resulted in cookies not being available inside the editor content. #TINY-8916
    +- `
    ` content pasted into a `
    ` block that had inline styles or was `noneditable` now merges correctly with the surrounding content. #TINY-8860
    +- After a `codesample` was pasted, the insertion point was placed incorrectly. #TINY-8861
    +
    +## 6.1.0 - 2022-06-29
    +
    +### Added
    +- New `sidebar_show` option to show the specified sidebar on initialization. #TINY-8710
    +- New `newline_behavior` option controls what happens when the Return or Enter key is pressed or the `mceInsertNewLine` command is used. #TINY-8458
    +- New `iframe_template_callback` option in the Media plugin. Patch provided by Namstel. #TINY-8684
    +- New `transparent` property for `iframe` dialog component. #TINY-8534
    +- New `removeAttributeFilter` and `removeNodeFilter` functions added to the DomParser and DOM Serializer APIs. #TINY-7847
    +- New `dispatchChange` function added to the UndoManager API to fire the change with current editor status as level and current undoManager layer as lastLevel. #TINY-8641
    +
    +### Improved
    +- Clearer focus states for buttons while navigating with a keyboard. #TINY-8557
    +- Support annotating certain block elements directly when using the editor's Annotation API. #TINY-8698
    +- The `mceLink` command can now take the value `{ dialog: true }` to always open the link dialog. #TINY-8057
    +- All help dialog links to `https://www.tiny.cloud` now include `rel="noopener"` to avoid potential security issues. #TINY-8834
    +
    +### Changed
    +- The `end_container_on_empty_block` option can now take a string of blocks, allowing the exiting of a blockquote element by pressing Enter or Return twice. #TINY-6559
    +- The default value for `end_container_on_empty_block` option has been changed to `'blockquote'`. #TINY-6559
    +- Link menu and toolbar buttons now always execute the `mceLink` command. #TINY-8057
    +- Toggling fullscreen mode when using the Fullscreen plugin now also fires the `ResizeEditor` event. #TINY-8701
    +- Getting the editor's text content now returns newlines instead of an empty string if more than one empty paragraph exists. #TINY-8578
    +- Custom elements are now treated as non-empty elements by the schema. #TINY-4784
    +- The autocompleter's menu HTML element is now positioned instead of the wrapper. #TINY-6476
    +- Choice menu items will now use the `'menuitemradio'` aria role to better reflect that only a single item can be active. #TINY-8602
    +
    +### Fixed
    +- Some Template plugin option values were not escaped properly when doing replacement lookups with Regular Expressions. #TINY-7433
    +- Copy events were not dispatched in readonly mode. #TINY-6800
    +- `
    ` tags were not preserved when copying and pasting. #TINY-7719
    +- The URL detection used for autolink and smart paste did not work if a path segment contained valid characters such as `!` and `:`. #TINY-8069
    +- In some cases pressing the Backspace or Delete key would incorrectly step into tables rather than remain outside. #TINY-8592
    +- Links opened when Alt+Enter or Option+Return was typed even when `preventDefault()` was called on the keydown event. #TINY-8661
    +- Inconsistent visual behavior between choosing Edit -> Select All and typing Ctrl+A or Cmd+A when a document contained an image. #TINY-4550
    +- Ctrl+Shift+Home/End or Cmd+Shift+Up-arrow/Down-arrow did not expand the selection to a `contenteditable="false"` element if the element was at the beginning or end of a document. #TINY-7795
    +- Triple-clicking did not select a paragraph in Google Chrome in some circumstances. #TINY-8215
    +- Images were not showing as selected when selected along with other content. #TINY-5947
    +- Selection direction was not stored or restored when getting or setting selection bookmarks. #TINY-8599
    +- When text within an inline boundary element was selected and the right-arrow key was pressed, the insertion point incorrectly moved to the left. #TINY-8601
    +- In some versions of Safari, the `editor.selection.isForward()` API could throw an exception due to an invalid selection. #TINY-8686
    +- The selection is no longer incorrectly moved inside a comment by the `editor.selection.normalize()` API. #TINY-7817
    +- The `InsertParagraph` or `mceInsertNewLine` commands did not delete the current selection like the native command does. #TINY-8606
    +- The `InsertLineBreak` command did not replace selected content. #TINY-8458
    +- If selected content straddled a parent and nested list, cutting the selection did not always set the list style to `'none'` on the parent list. #TINY-8078
    +- Delete operations could behave incorrectly if the selection contains a `contenteditable="false"` element located at the edge of content. #TINY-8729
    +- Spaces were not added correctly on some browsers when the insertion point was immediately before or after a `contenteditable="false"` block element. #TINY-8588
    +- Images that used a Data URI were corrupted when the data wasn't base64 encoded. #TINY-8337
    +- `uploadImages` no longer triggers two change events if there is a removal of images on upload. #TINY-8641
    +- Preview and Insert Template dialogs now display the correct content background color when using dark skins. #TINY-8534
    +- Dialogs no longer exceed window height on smaller screens. #TINY-8146
    +- UI components, such as dialogs, would in some cases cause the Esc keyup event to incorrectly trigger inside the editor. #TINY-7005
    +- Fixed incorrect word breaks in menus when the menu presented with a scrollbar. #TINY-8572
    +- Notifications did not properly reposition when toggling fullscreen mode. #TINY-8701
    +- Text alignments, such as flush left and centered, could not be applied to `
    ` elements. #TINY-7715
    +- Indenting or outdenting list items inside a block element that was inside another list item did not work. #TINY-7209
    +- Changing the list type of a list within another block element altered the parent element that contained that list. #TINY-8068
    +- Pasting columns in tables could, in some circumstances, result in an invalid table. #TINY-8040
    +- Copying columns in tables could sometimes result in an invalid copy. #TINY-8040
    +- Changing table properties with the `table_style_by_css` option set to `false` would sometimes reset the table width. #TINY-8758
    +- Custom elements added to otherwise blank lines were removed during serialization. #TINY-4784
    +- The editor's autocompleter was not triggered at the start of nested list items. #TINY-8759
    +- Some function types in the TreeWalker API missed that it could return `undefined`. #TINY-8592
    +- Nuget packages for .NET and .NET Core are now configured to copy TinyMCE into `/wwwroot/lib/` when TinyMCE is installed into a project. #TINY-8611
    +
    +## 6.0.3 - 2022-05-25
    +
    +### Fixed
    +- Could not remove values when multiple cells were selected with the cell properties dialog. #TINY-8625
    +- Could not remove values when multiple rows were selected with the row properties dialog. #TINY-8625
    +- Empty lines that were formatted in a ranged selection using the `format_empty_lines` option were not kept in the serialized content. #TINY-8639
    +- The `s` element was missing from the default schema text inline elements. #TINY-8639
    +- Some text inline elements specified via the schema were not removed when empty by default. #TINY-8639
    +
    +## 6.0.2 - 2022-04-27
    +
    +### Fixed
    +- Some media elements wouldn't update when changing the source URL. #TINY-8660
    +- Inline toolbars flickered when switching between editors. #TINY-8594
    +- Multiple inline toolbars were shown if focused too quickly. #TINY-8503
    +- Added background and additional spacing for the text labeled buttons in the toolbar to improve visual clarity. #TINY-8617
    +- Toolbar split buttons with text used an incorrect width on touch devices. #TINY-8647
    +
    +## 6.0.1 - 2022-03-23
    +
    +### Fixed
    +- Fixed the dev ZIP missing the required `bin` scripts to build from the source. #TINY-8542
    +- Fixed a regression whereby text patterns couldn't be updated at runtime. #TINY-8540
    +- Fixed an issue where tables with colgroups could be copied incorrectly in some cases. #TINY-8568
    +- Naked buttons better adapt to various background colors, improved text contrast in notifications. #TINY-8533
    +- The autocompleter would not fire the `AutocompleterStart` event nor close the menu in some cases. #TINY-8552
    +- It wasn't possible to select text right after an inline noneditable element. #TINY-8567
    +- Fixed a double border showing for the `tinymce-5` skin when using `toolbar_location: 'bottom'`. #TINY-8564
    +- Clipboard content was not generated correctly when cutting and copying `contenteditable="false"` elements. #TINY-8563
    +- Fixed the box-shadow getting clipped in autocompletor popups. #TINY-8573
    +- The `buttonType` property did not work for dialog footer buttons. #TINY-8582
    +- Fix contrast ratio for error messages. #TINY-8586
    +
    +## 6.0.0 - 2022-03-03
    +
    +### Added
    +- New `editor.options` API to replace the old `editor.settings` and `editor.getParam` APIs. #TINY-8206
    +- New `editor.annotator.removeAll` API to remove all annotations by name. #TINY-8195
    +- New `Resource.unload` API to make it possible to unload resources. #TINY-8431
    +- New `FakeClipboard` API on the `tinymce` global. #TINY-8353
    +- New `dispatch()` function to replace the now deprecated `fire()` function in various APIs. #TINY-8102
    +- New `AutocompleterStart`, `AutocompleterUpdate` and `AutocompleterEnd` events. #TINY-8279
    +- New `mceAutocompleterClose`, `mceAutocompleterReload` commands. #TINY-8279
    +- New `mceInsertTableDialog` command to open the insert table dialog. #TINY-8273
    +- New `slider` dialog component. #TINY-8304
    +- New `imagepreview` dialog component, allowing preview and zoom of any image URL. #TINY-8333
    +- New `buttonType` property on dialog button components, supporting `toolbar` style in addition to `primary` and `secondary`. #TINY-8304
    +- The `tabindex` attribute is now copied from the target element to the iframe. #TINY-8315
    +
    +### Improved
    +- New default theme styling for TinyMCE 6 facelift with old skin available as `tinymce-5` and `tinymce-5-dark`. #TINY-8373
    +- The default height of editor has been increased from `200px` to `400px` to improve the usability of the editor. #TINY-6860
    +- The upload results returned from the `editor.uploadImages()` API now includes a `removed` flag, reflecting if the image was removed after a failed upload. #TINY-7735
    +- The `ScriptLoader`, `StyleSheetLoader`, `AddOnManager`, `PluginManager` and `ThemeManager` APIs will now return a `Promise` when loading resources instead of using callbacks. #TINY-8325
    +- A `ThemeLoadError` event is now fired if the theme fails to load. #TINY-8325
    +- The `BeforeSetContent` event will now include the actual serialized content when passing in an `AstNode` to the `editor.setContent` API. #TINY-7996
    +- Improved support for placing the caret before or after noneditable elements within the editor. #TINY-8169
    +- Calls to `editor.selection.setRng` now update the caret position bookmark used when focus is returned to the editor. #TINY-8450
    +- The `emoticon` plugin dialog, toolbar and menu item has been updated to use the more accurate `Emojis` term. #TINY-7631
    +- The dialog `redial` API will now only rerender the changed components instead of the whole dialog. #TINY-8334
    +- The dialog API `setData` method now uses a deep merge algorithm to support partial nested objects. #TINY-8333
    +- The dialog spec `initialData` type is now `Partial` to match the underlying implementation details. #TINY-8334
    +- Notifications no longer require a timeout to disable the close button. #TINY-6679
    +- The editor theme is now fetched in parallel with the icons, language pack and plugins. #TINY-8453
    +
    +### Changed
    +- TinyMCE is now MIT licensed. #TINY-2316
    +- Moved the `paste` plugin's functionality to TinyMCE core. #TINY-8310
    +- The `paste_data_images` option now defaults to `true`. #TINY-8310
    +- Moved the `noneditable` plugin to TinyMCE core. #TINY-8311
    +- Renamed the `noneditable_noneditable_class` option to `noneditable_class`. #TINY-8311
    +- Renamed the `noneditable_editable_class` option to `editable_class`. #TINY-8311
    +- Moved the `textpattern` plugin to TinyMCE core. #TINY-8312
    +- Renamed the `textpattern_patterns` option to `text_patterns`. #TINY-8312
    +- Moved the `hr` plugin's functionality to TinyMCE core. #TINY-8313
    +- Moved the `print` plugin's functionality to TinyMCE core. #TINY-8314
    +- Moved non-UI table functionality to core. #TINY-8273
    +- The `DomParser` API no longer uses a custom parser internally and instead uses the native `DOMParser` API. #TINY-4627
    +- The `editor.getContent()` API can provide custom content by preventing and overriding `content` in the `BeforeGetContent` event. This makes it consistent with the `editor.selection.getContent()` API. #TINY-8018
    +- The `editor.setContent()` API can now be prevented using the `BeforeSetContent` event. This makes it consistent with the `editor.selection.setContent()` API. #TINY-8018
    +- Add-ons such as plugins and themes are no longer constructed using the `new` operator. #TINY-8256
    +- A number of APIs that were not proper classes, are no longer constructed using the `new` operator. #TINY-8322
    +- The Editor commands APIs will no longer fallback to executing the browsers native command functionality. #TINY-7829
    +- The Editor query command APIs will now return `false` or an empty string on removed editors. #TINY-7829
    +- The `mceAddEditor` and `mceToggleEditor` commands now take an object as their value to specify the id and editor options. #TINY-8138
    +- The `mceInsertTable` command can no longer open the insert table dialog. Use the `mceInsertTableDialog` command instead. #TINY-8273
    +- The `plugins` option now returns a `string` array instead of a space separated string. #TINY-8455
    +- The `media` plugin no longer treats `iframe`, `video`, `audio` or `object` elements as "special" and will validate the contents against the schema. #TINY-8382
    +- The `images_upload_handler` option is no longer passed a `success` or `failure` callback and instead requires a `Promise` to be returned with the upload result. #TINY-8325
    +- The `tinymce.settings` global property is no longer set upon initialization. #TINY-7359
    +- The `change` event is no longer fired on first modification. #TINY-6920
    +- The `GetContent` event will now always pass a `string` for the `content` property. #TINY-7996
    +- Changed the default tag for the strikethrough format to the `s` tag when using a html 5 schema. #TINY-8262
    +- The `strike` tag is automatically converted to the `s` tag when using a html 5 schema. #TINY-8262
    +- Aligning a table to the left or right will now use margin styling instead of float styling. #TINY-6558
    +- The `:` control character has been changed to `~` for the schema `valid_elements` and `extended_valid_elements` options. #TINY-6726
    +- The `primary` property on dialog buttons has been deprecated. Use the new `buttonType` property instead. #TINY-8304
    +- Changed the default statusbar element path delimiter from `»` to `›`. #TINY-8372
    +- Replaced the `Powered by Tiny` branding text with the Tiny logo. #TINY-8371
    +- The default minimum height of editor has been changed to 100px to prevent the UI disappearing while resizing. #TINY-6860
    +- RGB colors are no longer converted to hex values when parsing or serializing content. #TINY-8163
    +- Replaced the `isDisabled()` function with an `isEnabled()` function for various APIs. #TINY-8101
    +- Replaced the `enable()` and `disable()` functions with a `setEnabled(state)` function in various APIs. #TINY-8101
    +- Replaced the `disabled` property with an `enabled` property in various APIs. #TINY-8101
    +- Replaced the `disable(name)` and `enable(name)` functions with a `setEnabled(name, state)` function in the Dialog APIs. #TINY-8101
    +- Renamed the `tinymce.Env.os.isOSX` API to `tinymce.Env.os.isMacOS`. #TINY-8175
    +- Renamed the `tinymce.Env.browser.isChrome` API to `tinymce.Env.browser.isChromium` to better reflect its functionality. #TINY-8300
    +- Renamed the `getShortEndedElements` Schema API to `getVoidElements`. #TINY-8344
    +- Renamed the `font_formats` option to `font_family_formats`. #TINY-8328
    +- Renamed the `fontselect` toolbar button and `fontformats` menu item to `fontfamily`. #TINY-8328
    +- Renamed the `fontsize_formats` option to `font_size_formats`. #TINY-8328
    +- Renamed the `fontsizeselect` toolbar button and `fontsizes` menu item to `fontsize`. #TINY-8328
    +- Renamed the `formatselect` toolbar button and `blockformats` menu item to `blocks`. #TINY-8328
    +- Renamed the `styleselect` toolbar button and `formats` menu item to `styles`. #TINY-8328
    +- Renamed the `lineheight_formats` option to `line_height_formats`. #TINY-8328
    +- Renamed the `getWhiteSpaceElements()` function to `getWhitespaceElements()` in the `Schema` API. #TINY-8102
    +- Renamed the `mceInsertClipboardContent` command `content` property to `html` to better reflect what data is passed. #TINY-8310
    +- Renamed the `default_link_target` option to `link_default_target` for both `link` and `autolink` plugins. #TINY-4603
    +- Renamed the `rel_list` option to `link_rel_list` for the `link` plugin. #TINY-4603
    +- Renamed the `target_list` option to `link_target_list` for the `link` plugin. #TINY-4603
    +- The default value for the `link_default_protocol` option has been changed to `https` instead of `http`. #TINY-7824
    +- The default value for the `element_format` option has been changed to `html`. #TINY-8263
    +- The default value for the `schema` option has been changed to `html5`. #TINY-8261
    +- The default value for the `table_style_by_css` option has been changed to `true`. #TINY-8259
    +- The default value for the `table_use_colgroups` option has been changed to `true`. #TINY-8259
    +
    +### Fixed
    +- The object returned from the `editor.fire()` API was incorrect if the editor had been removed. #TINY-8018
    +- The `editor.selection.getContent()` API did not respect the `no_events` argument. #TINY-8018
    +- The `editor.annotator.remove` API did not keep selection when removing the annotation. #TINY-8195
    +- The `GetContent` event was not fired when getting `tree` or `text` formats using the `editor.selection.getContent()` API. #TINY-8018
    +- The `beforeinput` and `input` events would sometimes not fire as expected when deleting content. #TINY-8168 #TINY-8329
    +- The `table` plugin would sometimes not correctly handle headers in the `tfoot` section. #TINY-8104
    +- The `silver` theme UI was incorrectly rendered before plugins had initialized. #TINY-8288
    +- The aria labels for the color picker dialog were not translated. #TINY-8381
    +- Fixed sub-menu items not read by screen readers. Patch contributed by westonkd. #TINY-8417
    +- Dialog labels and other text-based UI properties did not escape HTML markup. #TINY-7524
    +- Anchor elements would render incorrectly when using the `allow_html_in_named_anchor` option. #TINY-3799
    +- The `AstNode` HTML serializer did not serialize `pre` or `textarea` elements correctly when they contained newlines. #TINY-8446
    +- Fixed sub-menu items not read by screen readers. Patch contributed by westonkd. #TINY-8417
    +- The Home or End keys would move out of a editable element contained within a noneditable element. #TINY-8201
    +- Dialogs could not be opened in inline mode before the editor had been rendered. #TINY-8397
    +- Clicking on menu items could cause an unexpected console warning if the `onAction` function caused the menu to close. #TINY-8513
    +- Fixed various color and contrast issues for the dark skins. #TINY-8527
    +
    +### Removed
    +- Removed support for Microsoft Internet Explorer 11. #TINY-8194 #TINY-8241
    +- Removed support for Microsoft Word from the opensource paste functionality. #TINY-7493
    +- Removed support for the `plugins` option allowing a mixture of a string array and of space separated strings. #TINY-8399
    +- Removed support for the deprecated `false` value for the `forced_root_block` option. #TINY-8260
    +- Removed the jQuery integration. #TINY-4519
    +- Removed the `imagetools` plugin, which is now classified as a Premium plugin. #TINY-8209
    +- Removed the `imagetools` dialog component. #TINY-8333
    +- Removed the `toc` plugin, which is now classified as a Premium plugin. #TINY-8250
    +- Removed the `tabfocus` plugin. #TINY-8315
    +- Removed the `textpattern` plugin's API as part of moving it to core. #TINY-8312
    +- Removed the `table` plugin's API. #TINY-8273
    +- Removed the callback for the `EditorUpload` API. #TINY-8325
    +- Removed the legacy browser detection properties from the `Env` API. #TINY-8162
    +- Removed the `filterNode` method from the `DomParser` API. #TINY-8249
    +- Removed the `SaxParser` API. #TINY-8218
    +- Removed the `tinymce.utils.Promise` API. #TINY-8241
    +- Removed the `toHex` function for the `DOMUtils` and `Styles` APIs. #TINY-8163
    +- Removed the `execCommand` handler function from the plugin and theme interfaces. #TINY-7829
    +- Removed the `editor.settings` property as it has been replaced by the new Options API. #TINY-8236
    +- Removed the `shortEnded` and `fixed` properties on `tinymce.html.Node` class. #TINY-8205
    +- Removed the `mceInsertRawHTML` command. #TINY-8214
    +- Removed the style field from the `image` plugin dialog advanced tab. #TINY-3422
    +- Removed the `paste_filter_drop` option as native drag and drop handling is no longer supported. #TINY-8511
    +- Removed the legacy `mobile` theme. #TINY-7832
    +- Removed the deprecated `$`, `Class`, `DomQuery` and `Sizzle` APIs. #TINY-4520 #TINY-8326
    +- Removed the deprecated `Color`, `JSON`, `JSONP` and `JSONRequest`. #TINY-8162
    +- Removed the deprecated `XHR` API. #TINY-8164
    +- Removed the deprecated `setIconStroke` Split Toolbar Button API. #TINY-8162
    +- Removed the deprecated `editors` property from `EditorManager`. #TINY-8162
    +- Removed the deprecated `execCallback` and `setMode` APIs from `Editor`. #TINY-8162
    +- Removed the deprecated `addComponents` and `dependencies` APIs from `AddOnManager`. #TINY-8162
    +- Removed the deprecated `clearInterval`, `clearTimeout`, `debounce`, `requestAnimationFrame`, `setInterval`, `setTimeout` and `throttle` APIs from `Delay`. #TINY-8162
    +- Removed the deprecated `Schema` options. #TINY-7821
    +- Removed the deprecated `file_browser_callback_types`, `force_hex_style_colors` and `images_dataimg_filter` options. #TINY-7823
    +- Removed the deprecated `filepicker_validator_handler`, `force_p_newlines`, `gecko_spellcheck`, `tab_focus`, `table_responsive_width` and `toolbar_drawer` options. #TINY-7820
    +- Removed the deprecated `media_scripts` option in the `media` plugin. #TINY-8421
    +- Removed the deprecated `editor_deselector`, `editor_selector`, `elements`, `mode` and `types` legacy TinyMCE init options. #TINY-7822
    +- Removed the deprecated `content_editable_state` and `padd_empty_with_br` options. #TINY-8400
    +- Removed the deprecated `autoresize_on_init` option from the `autoresize` plugin. #TINY-8400
    +- Removed the deprecated `fullpage`, `spellchecker`, `bbcode`, `legacyoutput`, `colorpicker`, `contextmenu` and `textcolor` plugins. #TINY-8192
    +- Removed the undocumented `editor.editorCommands.hasCustomCommand` API. #TINY-7829
    +- Removed the undocumented `mceResetDesignMode`, `mceRepaint` and `mceBeginUndoLevel` commands. #TINY-7829
    +
    +### Deprecated
    +- The dialog button component's `primary` property has been deprecated and will be removed in the next major release. Use the new `buttonType` property instead. #TINY-8304
    +- The `fire()` function of `tinymce.Editor`, `tinymce.dom.EventUtils`, `tinymce.dom.DOMUtils`, `tinymce.util.Observable` and `tinymce.util.EventDispatcher` has been deprecated and will be removed in the next major release. Use the `dispatch()` function instead. #TINY-8102
    +- The `content` property on the `SetContent` event has been deprecated and will be removed in the next major release. #TINY-8457
    +- The return value of the `editor.setContent` API has been deprecated and will be removed in the next major release. #TINY-8457
    +
    +## 5.10.3 - 2022-02-09
    +
    +### Fixed
    +- Alignment would sometimes be removed on parent elements when changing alignment on certain inline nodes, such as images. #TINY-8308
    +- The `fullscreen` plugin would reset the scroll position when exiting fullscreen mode. #TINY-8418
    +
    +## 5.10.2 - 2021-11-17
    +
    +### Fixed
    +- Internal selectors were appearing in the style list when using the `importcss` plugin. #TINY-8238
    +
    +## 5.10.1 - 2021-11-03
    +
    +### Fixed
    +- The iframe aria help text was not read by some screen readers. #TINY-8171
    +- Clicking the `forecolor` or `backcolor` toolbar buttons would do nothing until selecting a color. #TINY-7836
    +- Crop functionality did not work in the `imagetools` plugin when the editor was rendered in a shadow root. #TINY-6387
    +- Fixed an exception thrown on Safari when closing the `searchreplace` plugin dialog. #TINY-8166
    +- The `autolink` plugin did not convert URLs to links when starting with a bracket. #TINY-8091
    +- The `autolink` plugin incorrectly created nested links in some cases. #TINY-8091
    +- Tables could have an incorrect height set on rows when rendered outside of the editor. #TINY-7699
    +- In certain circumstances, the table of contents plugin would incorrectly add an extra empty list item. #TINY-4636
    +- The insert table grid menu displayed an incorrect size when re-opening the grid. #TINY-6532
    +- The word count plugin was treating the zero width space character (`​`) as a word. #TINY-7484
    +
    +## 5.10.0 - 2021-10-11
    +
    +### Added
    +- Added a new `URI.isDomSafe(uri)` API to check if a URI is considered safe to be inserted into the DOM. #TINY-7998
    +- Added the `ESC` key code constant to the `VK` API. #TINY-7917
    +- Added a new `deprecation_warnings` setting for turning off deprecation console warning messages. #TINY-8049
    +
    +### Improved
    +- The `element` argument of the `editor.selection.scrollIntoView()` API is now optional, and if it is not provided the current selection will be scrolled into view. #TINY-7291
    +
    +### Changed
    +- The deprecated `scope` attribute is no longer added to `td` cells when converting a row to a header row. #TINY-7731
    +- The number of `col` elements is normalized to match the number of columns in a table after a table action. #TINY-8011
    +
    +### Fixed
    +- Fixed a regression that caused block wrapper formats to apply and remove incorrectly when using a collapsed selection with multiple words. #TINY-8036
    +- Resizing table columns in some scenarios would resize the column to an incorrect position. #TINY-7731
    +- Inserting a table where the parent element had padding would cause the table width to be incorrect. #TINY-7991
    +- The resize backdrop element did not have the `data-mce-bogus="all"` attribute set to prevent it being included in output. #TINY-7854
    +- Resize handles appeared on top of dialogs and menus when using an inline editor. #TINY-3263
    +- Fixed the `autoresize` plugin incorrectly scrolling to the top of the editor content in some cases when changing content. #TINY-7291
    +- Fixed the `editor.selection.scrollIntoView()` type signature, as it incorrectly required an `Element` instead of `HTMLElement`. #TINY-7291
    +- Table cells that were both row and column headers did not retain the correct state when converting back to a regular row or column. #TINY-7709
    +- Clicking beside a non-editable element could cause the editor to incorrectly scroll to the top of the content. #TINY-7062
    +- Clicking in a table cell, with a non-editable element in an adjacent cell, incorrectly caused the non-editable element to be selected. #TINY-7736
    +- Split toolbar buttons incorrectly had nested `tabindex="-1"` attributes. #TINY-7879
    +- Fixed notifications rendering in the wrong place initially and when the page was scrolled. #TINY-7894
    +- Fixed an exception getting thrown when the number of `col` elements didn't match the number of columns in a table. #TINY-7041 #TINY-8011
    +- The table selection state could become incorrect after selecting a noneditable table cell. #TINY-8053
    +- As of Mozilla Firefox 91, toggling fullscreen mode with `toolbar_sticky` enabled would cause the toolbar to disappear. #TINY-7873
    +- Fixed URLs not cleaned correctly in some cases in the `link` and `image` plugins. #TINY-7998
    +- Fixed the `image` and `media` toolbar buttons incorrectly appearing to be in an inactive state in some cases. #TINY-3463
    +- Fixed the `editor.selection.selectorChanged` API not firing if the selector matched the current selection when registered in some cases. #TINY-3463
    +- Inserting content into a `contenteditable="true"` element that was contained within a `contenteditable="false"` element would move the selection to an incorrect location. #TINY-7842
    +- Dragging and dropping `contenteditable="false"` elements could result in the element being placed in an unexpected location. #TINY-7917
    +- Pressing the Escape key would not cancel a drag action that started on a `contenteditable="false"` element within the editor. #TINY-7917
    +- `video` and `audio` elements were unable to be played when the `media` plugin live embeds were enabled in some cases. #TINY-7674
    +- Pasting images would throw an exception if the clipboard `items` were not files (for example, screenshots taken from gnome-software). Patch contributed by cedric-anne. #TINY-8079
    +
    +### Deprecated
    +- Several APIs have been deprecated. See the release notes section for information. #TINY-8023 #TINY-8063
    +- Several Editor settings have been deprecated. See the release notes section for information. #TINY-8086
    +- The Table of Contents and Image Tools plugins will be classified as Premium plugins in the next major release. #TINY-8087
    +- Word support in the `paste` plugin has been deprecated and will be removed in the next major release. #TINY-8087
    +
    +## 5.9.2 - 2021-09-08
    +
    +### Fixed
    +- Fixed an exception getting thrown when disabling events and setting content. #TINY-7956
    +- Delete operations could behave incorrectly if the selection crossed a table boundary. #TINY-7596
    +
    +## 5.9.1 - 2021-08-27
    +
    +### Fixed
    +- Published TinyMCE types failed to compile in strict mode. #TINY-7915
    +- The `TableModified` event sometimes didn't fire when performing certain table actions. #TINY-7916
    +
    +## 5.9.0 - 2021-08-26
    +
    +### Added
    +- Added a new `mceFocus` command that focuses the editor. Equivalent to using `editor.focus()`. #TINY-7373
    +- Added a new `mceTableToggleClass` command which toggles the provided class on the currently selected table. #TINY-7476
    +- Added a new `mceTableCellToggleClass` command which toggles the provided class on the currently selected table cells. #TINY-7476
    +- Added a new `tablecellvalign` toolbar button and menu item for vertical table cell alignment. #TINY-7477
    +- Added a new `tablecellborderwidth` toolbar button and menu item to change table cell border width. #TINY-7478
    +- Added a new `tablecellborderstyle` toolbar button and menu item to change table cell border style. #TINY-7478
    +- Added a new `tablecaption` toolbar button and menu item to toggle captions on tables. #TINY-7479
    +- Added a new `mceTableToggleCaption` command that toggles captions on a selected table. #TINY-7479
    +- Added a new `tablerowheader` toolbar button and menu item to toggle the header state of row cells. #TINY-7478
    +- Added a new `tablecolheader` toolbar button and menu item to toggle the header state of column cells. #TINY-7482
    +- Added a new `tablecellbordercolor` toolbar button and menu item to select table cell border colors, with an accompanying setting `table_border_color_map` to customize the available values. #TINY-7480
    +- Added a new `tablecellbackgroundcolor` toolbar button and menu item to select table cell background colors, with an accompanying setting `table_background_color_map` to customize the available values. #TINY-7480
    +- Added a new `language` menu item and toolbar button to add `lang` attributes to content, with an accompanying `content_langs` setting to specify the languages available. #TINY-6149
    +- A new `lang` format is now available that can be used with `editor.formatter`, or applied with the `Lang` editor command. #TINY-6149
    +- Added a new `language` icon for the `language` toolbar button. #TINY-7670
    +- Added a new `table-row-numbering` icon. #TINY-7327
    +- Added new plugin commands: `mceEmoticons` (Emoticons), `mceWordCount` (Word Count), and `mceTemplate` (Template). #TINY-7619
    +- Added a new `iframe_aria_text` setting to set the iframe title attribute. #TINY-1264
    +- Added a new DomParser `Node.children()` API to return all the children of a `Node`. #TINY-7756
    +
    +### Improved
    +- Sticky toolbars can now be offset from the top of the page using the new `toolbar_sticky_offset` setting. #TINY-7337
    +- Fancy menu items now accept an `initData` property to allow custom initialization data. #TINY-7480
    +- Improved the load time of the `fullpage` plugin by using the existing editor schema rather than creating a new one. #TINY-6504
    +- Improved the performance when UI components are rendered. #TINY-7572
    +- The context toolbar no longer unnecessarily repositions to the top of large elements when scrolling. #TINY-7545
    +- The context toolbar will now move out of the way when it overlaps with the selection, such as in table cells. #TINY-7192
    +- The context toolbar now uses a short animation when transitioning between different locations. #TINY-7740
    +- `Env.browser` now uses the User-Agent Client Hints API where it is available. #TINY-7785
    +- Icons with a `-rtl` suffix in their name will now automatically be used when the UI is rendered in right-to-left mode. #TINY-7782
    +- The `formatter.match` API now accepts an optional `similar` parameter to check if the format partially matches. #TINY-7712
    +- The `formatter.formatChanged` API now supports providing format variables when listening for changes. #TINY-7713
    +- The formatter will now fire `FormatApply` and `FormatRemove` events for the relevant actions. #TINY-7713
    +- The `autolink` plugin link detection now permits custom protocols. #TINY-7714
    +- The `autolink` plugin valid link detection has been improved. #TINY-7714
    +
    +### Changed
    +- Changed the load order so content CSS is loaded before the editor is populated with content. #TINY-7249
    +- Changed the `emoticons`, `wordcount`, `code`, `codesample`, and `template` plugins to open dialogs using commands. #TINY-7619
    +- The context toolbar will no longer show an arrow when it overlaps the content, such as in table cells. #TINY-7665
    +- The context toolbar will no longer overlap the statusbar for toolbars using `node` or `selection` positions. #TINY-7666
    +
    +### Fixed
    +- The `editor.fire` API was incorrectly mutating the original `args` provided. #TINY-3254
    +- Unbinding an event handler did not take effect immediately while the event was firing. #TINY-7436
    +- Binding an event handler incorrectly took effect immediately while the event was firing. #TINY-7436
    +- Unbinding a native event handler inside the `remove` event caused an exception that blocked editor removal. #TINY-7730
    +- The `SetContent` event contained the incorrect `content` when using the `editor.selection.setContent()` API. #TINY-3254
    +- The editor content could be edited after calling `setProgressState(true)` in iframe mode. #TINY-7373
    +- Tabbing out of the editor after calling `setProgressState(true)` behaved inconsistently in iframe mode. #TINY-7373
    +- Flash of unstyled content while loading the editor because the content CSS was loaded after the editor content was rendered. #TINY-7249
    +- Partially transparent RGBA values provided in the `color_map` setting were given the wrong hex value. #TINY-7163
    +- HTML comments with mismatched quotes were parsed incorrectly under certain circumstances. #TINY-7589
    +- The editor could crash when inserting certain HTML content. #TINY-7756
    +- Inserting certain HTML content into the editor could result in invalid HTML once parsed. #TINY-7756
    +- Links in notification text did not show the correct mouse pointer. #TINY-7661
    +- Using the Tab key to navigate into the editor on Microsoft Internet Explorer 11 would incorrectly focus the toolbar. #TINY-3707
    +- The editor selection could be placed in an incorrect location when undoing or redoing changes in a document containing `contenteditable="false"` elements. #TINY-7663
    +- Menus and context menus were not closed when clicking into a different editor. #TINY-7399
    +- Context menus on Android were not displayed when more than one HTML element was selected. #TINY-7688
    +- Disabled nested menu items could still be opened. #TINY-7700
    +- The nested menu item chevron icon was not fading when the menu item was disabled. #TINY-7700
    +- `imagetools` buttons were incorrectly enabled for remote images without `imagetools_proxy` set. #TINY-7772
    +- Only table content would be deleted when partially selecting a table and content outside the table. #TINY-6044
    +- The table cell selection handling was incorrect in some cases when dealing with nested tables. #TINY-6298
    +- Removing a table row or column could result in the cursor getting placed in an invalid location. #TINY-7695
    +- Pressing the Tab key to navigate through table cells did not skip noneditable cells. #TINY-7705
    +- Clicking on a noneditable table cell did not show a visual selection like other noneditable elements. #TINY-7724
    +- Some table operations would incorrectly cause table row attributes and styles to be lost. #TINY-6666
    +- The selection was incorrectly lost when using the `mceTableCellType` and `mceTableRowType` commands. #TINY-6666
    +- The `mceTableRowType` was reversing the order of the rows when converting multiple header rows back to body rows. #TINY-6666
    +- The table dialog did not always respect the `table_style_with_css` option. #TINY-4926
    +- Pasting into a table with multiple cells selected could cause the content to be pasted in the wrong location. #TINY-7485
    +- The `TableModified` event was not fired when pasting cells into a table. #TINY-6939
    +- The table paste column before and after icons were not flipped in RTL mode. #TINY-7851
    +- Fixed table corruption when deleting a `contenteditable="false"` cell. #TINY-7891
    +- The `dir` attribute was being incorrectly applied to list items. #TINY-4589
    +- Applying selector formats would sometimes not apply the format correctly to elements in a list. #TINY-7393
    +- For formats that specify an attribute or style that should be removed, the formatter `match` API incorrectly returned `false`. #TINY-6149
    +- The type signature on the `formatter.matchNode` API had the wrong return type (was `boolean` but should have been `Formatter | undefined`). #TINY-6149
    +- The `formatter.formatChanged` API would ignore the `similar` parameter if another callback had already been registered for the same format. #TINY-7713
    +- The `formatter.formatChanged` API would sometimes not run the callback the first time the format was removed. #TINY-7713
    +- Base64 encoded images with spaces or line breaks in the data URI were not displayed correctly. Patch contributed by RoboBurned.
    +
    +### Deprecated
    +- The `bbcode`, `fullpage`, `legacyoutput`, and `spellchecker` plugins have been deprecated and marked for removal in the next major release. #TINY-7260
    +
    +## 5.8.2 - 2021-06-23
    +
    +### Fixed
    +- Fixed an issue when pasting cells from tables containing `colgroup`s into tables without `colgroup`s. #TINY-6675
    +- Fixed an issue that could cause an invalid toolbar button state when multiple inline editors were on a single page. #TINY-6297
    +
    +## 5.8.1 - 2021-05-20
    +
    +### Fixed
    +- An unexpected exception was thrown when switching to readonly mode and adjusting the editor width. #TINY-6383
    +- Content could be lost when the `pagebreak_split_block` setting was enabled. #TINY-3388
    +- The `list-style-type: none;` style on nested list items was incorrectly removed when clearing formatting. #TINY-6264
    +- URLs were not always detected when pasting over a selection. Patch contributed by jwcooper. #TINY-6997
    +- Properties on the `OpenNotification` event were incorrectly namespaced. #TINY-7486
    +
    +## 5.8.0 - 2021-05-06
    +
    +### Added
    +- Added the `PAGE_UP` and `PAGE_DOWN` key code constants to the `VK` API. #TINY-4612
    +- The editor resize handle can now be controlled using the keyboard. #TINY-4823
    +- Added a new `fixed_toolbar_container_target` setting which renders the toolbar in the specified `HTMLElement`. Patch contributed by pvrobays.
    +
    +### Improved
    +- The `inline_boundaries` feature now supports the `home`, `end`, `pageup`, and `pagedown` keys. #TINY-4612
    +- Updated the `formatter.matchFormat` API to support matching formats with variables in the `classes` property. #TINY-7227
    +- Added HTML5 `audio` and `video` elements to the default alignment formats. #TINY-6633
    +- Added support for alpha list numbering to the list properties dialog. #TINY-6891
    +
    +### Changed
    +- Updated the `image` dialog to display the class list dropdown as full-width if the caption checkbox is not present. #TINY-6400
    +- Renamed the "H Align" and "V Align" input labels in the Table Cell Properties dialog to "Horizontal align" and "Vertical align" respectively. #TINY-7285
    +
    +### Deprecated
    +- The undocumented `setIconStroke` Split Toolbar Button API has been deprecated and will be removed in a future release. #TINY-3551
    +
    +### Fixed
    +- Fixed a bug where it wasn't possible to align nested list items. #TINY-6567
    +- The RGB fields in the color picker dialog were not staying in sync with the color palette and hue slider. #TINY-6952
    +- The color preview box in the color picker dialog was not correctly displaying the saturation and value of the chosen color. #TINY-6952
    +- The color picker dialog will now show an alert if it is submitted with an invalid hex color code. #TINY-2814
    +- Fixed a bug where the `TableModified` event was not fired when adding a table row with the Tab key. #TINY-7006
    +- Added missing `images_file_types` setting to the exported TypeScript types. #GH-6607
    +- Fixed a bug where lists pasted from Word with Roman numeral markers were not displayed correctly. Patch contributed by aautio. #GH-6620
    +- The `editor.insertContent` API was incorrectly handling nested `span` elements with matching styles. #TINY-6263
    +- The HTML5 `small` element could not be removed when clearing text formatting. #TINY-6633
    +- The Oxide button text transform variable was incorrectly using `capitalize` instead of `none`. Patch contributed by dakur. #GH-6341
    +- Fix dialog button text that was using title-style capitalization. #TINY-6816
    +- Table plugin could perform operations on tables containing the inline editor. #TINY-6625
    +- Fixed Tab key navigation inside table cells with a ranged selection. #TINY-6638
    +- The foreground and background toolbar button color indicator is no longer blurry. #TINY-3551
    +- Fixed a regression in the `tinymce.create()` API that caused issues when multiple objects were created. #TINY-7358
    +- Fixed the `LineHeight` command causing the `change` event to be fired inconsistently. #TINY-7048
    +
    +## 5.7.1 - 2021-03-17
    +
    +### Fixed
    +- Fixed the `help` dialog incorrectly linking to the changelog of TinyMCE 4 instead of TinyMCE 5. #TINY-7031
    +- Fixed a bug where error messages were displayed incorrectly in the image dialog. #TINY-7099
    +- Fixed an issue where URLs were not correctly filtered in some cases. #TINY-7025
    +- Fixed a bug where context menu items with names that contained uppercase characters were not displayed. #TINY-7072
    +- Fixed context menu items lacking support for the `disabled` and `shortcut` properties. #TINY-7073
    +- Fixed a regression where the width and height were incorrectly set when embedding content using the `media` dialog. #TINY-7074
    +
    +## 5.7.0 - 2021-02-10
    +
    +### Added
    +- Added IPv6 address support to the URI API. Patch contributed by dev7355608. #GH-4409
    +- Added new `structure` and `style` properties to the `TableModified` event to indicate what kinds of modifications were made. #TINY-6643
    +- Added `video` and `audio` live embed support for the `media` plugin. #TINY-6229
    +- Added the ability to resize `video` and `iframe` media elements. #TINY-6229
    +- Added a new `font_css` setting for adding fonts to both the editor and the parent document. #TINY-6199
    +- Added a new `ImageUploader` API to simplify uploading image data to the configured `images_upload_url` or `images_upload_handler`. #TINY-4601
    +- Added an Oxide variable to define the container background color in fullscreen mode. #TINY-6903
    +- Added Oxide variables for setting the toolbar background colors for inline and sticky toolbars. #TINY-6009
    +- Added a new `AfterProgressState` event that is fired after `editor.setProgressState` calls complete. #TINY-6686
    +- Added support for `table_column_resizing` when inserting or deleting columns. #TINY-6711
    +
    +### Changed
    +- Changed table and table column copy behavior to retain an appropriate width when pasted. #TINY-6664
    +- Changed the `lists` plugin to apply list styles to all text blocks within a selection. #TINY-3755
    +- Changed the `advlist` plugin to log a console error message when the `list` plugin isn't enabled. #TINY-6585
    +- Changed the z-index of the `setProgressState(true)` throbber so it does not hide notifications. #TINY-6686
    +- Changed the type signature for `editor.selection.getRng()` incorrectly returning `null`. #TINY-6843
    +- Changed some `SaxParser` regular expressions to improve performance. #TINY-6823
    +- Changed `editor.setProgressState(true)` to close any open popups. #TINY-6686
    +
    +### Fixed
    +- Fixed `codesample` highlighting performance issues for some languages. #TINY-6996
    +- Fixed an issue where cell widths were lost when merging table cells. #TINY-6901
    +- Fixed `col` elements incorrectly transformed to `th` elements when converting columns to header columns. #TINY-6715
    +- Fixed a number of table operations not working when selecting 2 table cells on Mozilla Firefox. #TINY-3897
    +- Fixed a memory leak by backporting an upstream Sizzle fix. #TINY-6859
    +- Fixed table `width` style was removed when copying. #TINY-6664
    +- Fixed focus lost while typing in the `charmap` or `emoticons` dialogs when the editor is rendered in a shadow root. #TINY-6904
    +- Fixed corruption of base64 URLs used in style attributes when parsing HTML. #TINY-6828
    +- Fixed the order of CSS precedence of `content_style` and `content_css` in the `preview` and `template` plugins. `content_style` now has precedence. #TINY-6529
    +- Fixed an issue where the image dialog tried to calculate image dimensions for an empty image URL. #TINY-6611
    +- Fixed an issue where `scope` attributes on table cells would not change as expected when merging or unmerging cells. #TINY-6486
    +- Fixed the plugin documentation links in the `help` plugin. #DOC-703
    +- Fixed events bound using `DOMUtils` not returning the correct result for `isDefaultPrevented` in some cases. #TINY-6834
    +- Fixed the "Dropped file type is not supported" notification incorrectly showing when using an inline editor. #TINY-6834
    +- Fixed an issue with external styles bleeding into TinyMCE. #TINY-6735
    +- Fixed an issue where parsing malformed comments could cause an infinite loop. #TINY-6864
    +- Fixed incorrect return types on `editor.selection.moveToBookmark`. #TINY-6504
    +- Fixed the type signature for `editor.selection.setCursorLocation()` incorrectly allowing a node with no `offset`. #TINY-6843
    +- Fixed incorrect behavior when editor is destroyed while loading stylesheets. #INT-2282
    +- Fixed figure elements incorrectly splitting from a valid parent element when editing the image within. #TINY-6592
    +- Fixed inserting multiple rows or columns in a table cloning from the incorrect source row or column. #TINY-6906
    +- Fixed an issue where new lines were not scrolled into view when pressing Shift+Enter or Shift+Return. #TINY-6964
    +- Fixed an issue where list elements would not be removed when outdenting using the Enter or Return key. #TINY-5974
    +- Fixed an issue where file extensions with uppercase characters were treated as invalid. #TINY-6940
    +- Fixed dialog block messages were not passed through TinyMCE's translation system. #TINY-6971
    +
    +## 5.6.2 - 2020-12-08
    +
    +### Fixed
    +- Fixed a UI rendering regression when the document body is using `display: flex`. #TINY-6783
    +
    +## 5.6.1 - 2020-11-25
    +
    +### Fixed
    +- Fixed the `mceTableRowType` and `mceTableCellType` commands were not firing the `newCell` event. #TINY-6692
    +- Fixed the HTML5 `s` element was not recognized when editing or clearing text formatting. #TINY-6681
    +- Fixed an issue where copying and pasting table columns resulted in invalid HTML when using colgroups. #TINY-6684
    +- Fixed an issue where the toolbar would render with the wrong width for inline editors in some situations. #TINY-6683
    +
    +## 5.6.0 - 2020-11-18
    +
    +### Added
    +- Added new `BeforeOpenNotification` and `OpenNotification` events which allow internal notifications to be captured and modified before display. #TINY-6528
    +- Added support for `block` and `unblock` methods on inline dialogs. #TINY-6487
    +- Added new `TableModified` event which is fired whenever changes are made to a table. #TINY-6629
    +- Added new `images_file_types` setting to determine which image file formats will be automatically processed into `img` tags on paste when using the `paste` plugin. #TINY-6306
    +- Added support for `images_file_types` setting in the image file uploader to determine which image file extensions are valid for upload. #TINY-6224
    +- Added new `format_empty_lines` setting to control if empty lines are formatted in a ranged selection. #TINY-6483
    +- Added template support to the `autocompleter` for customizing the autocompleter items. #TINY-6505
    +- Added new user interface `enable`, `disable`, and `isDisabled` methods. #TINY-6397
    +- Added new `closest` formatter API to get the closest matching selection format from a set of formats. #TINY-6479
    +- Added new `emojiimages` emoticons database that uses the twemoji CDN by default. #TINY-6021
    +- Added new `emoticons_database` setting to configure which emoji database to use. #TINY-6021
    +- Added new `name` field to the `style_formats` setting object to enable specifying a name for the format. #TINY-4239
    +
    +### Changed
    +- Changed `readonly` mode to allow hyperlinks to be clickable. #TINY-6248
    +
    +### Fixed
    +- Fixed the `change` event not firing after a successful image upload. #TINY-6586
    +- Fixed the type signature for the `entity_encoding` setting not accepting delimited lists. #TINY-6648
    +- Fixed layout issues when empty `tr` elements were incorrectly removed from tables. #TINY-4679
    +- Fixed image file extensions lost when uploading an image with an alternative extension, such as `.jfif`. #TINY-6622
    +- Fixed a security issue where URLs in attributes weren't correctly sanitized. #TINY-6518
    +- Fixed `DOMUtils.getParents` incorrectly including the shadow root in the array of elements returned. #TINY-6540
    +- Fixed an issue where the root document could be scrolled while an editor dialog was open inside a shadow root. #TINY-6363
    +- Fixed `getContent` with text format returning a new line when the editor is empty. #TINY-6281
    +- Fixed table column and row resizers not respecting the `data-mce-resize` attribute. #TINY-6600
    +- Fixed inserting a table via the `mceInsertTable` command incorrectly creating 2 undo levels. #TINY-6656
    +- Fixed nested tables with `colgroup` elements incorrectly always resizing the inner table. #TINY-6623
    +- Fixed the `visualchars` plugin causing the editor to steal focus when initialized. #TINY-6282
    +- Fixed `fullpage` plugin altering text content in `editor.getContent()`. #TINY-6541
    +- Fixed `fullscreen` plugin not working correctly with multiple editors and shadow DOM. #TINY-6280
    +- Fixed font size keywords such as `medium` not displaying correctly in font size menus. #TINY-6291
    +- Fixed an issue where some attributes in table cells were not copied over to new rows or columns. #TINY-6485
    +- Fixed incorrectly removing formatting on adjacent spaces when removing formatting on a ranged selection. #TINY-6268
    +- Fixed the `Cut` menu item not working in the latest version of Mozilla Firefox. #TINY-6615
    +- Fixed some incorrect types in the new TypeScript declaration file. #TINY-6413
    +- Fixed a regression where a fake offscreen selection element was incorrectly created for the editor root node. #TINY-6555
    +- Fixed an issue where menus would incorrectly collapse in small containers. #TINY-3321
    +- Fixed an issue where only one table column at a time could be converted to a header. #TINY-6326
    +- Fixed some minor memory leaks that prevented garbage collection for editor instances. #TINY-6570
    +- Fixed resizing a `responsive` table not working when using the column resize handles. #TINY-6601
    +- Fixed incorrectly calculating table `col` widths when resizing responsive tables. #TINY-6646
    +- Fixed an issue where spaces were not preserved in pre-blocks when getting text content. #TINY-6448
    +- Fixed a regression that caused the selection to be difficult to see in tables with backgrounds. #TINY-6495
    +- Fixed content pasted multiple times in the editor when using Microsoft Internet Explorer 11. Patch contributed by mattford. #GH-4905
    +
    +## 5.5.1 - 2020-10-01
    +
    +### Fixed
    +- Fixed pressing the down key near the end of a document incorrectly raising an exception. #TINY-6471
    +- Fixed incorrect Typescript types for the `Tools` API. #TINY-6475
    +
    +## 5.5.0 - 2020-09-29
    +
    +### Added
    +- Added a TypeScript declaration file to the bundle output for TinyMCE core. #TINY-3785
    +- Added new `table_column_resizing` setting to control how table columns are resized when using the resize bars. #TINY-6001
    +- Added the ability to remove images on a failed upload using the `images_upload_handler` failure callback. #TINY-6011
    +- Added `hasPlugin` function to the editor API to determine if a plugin exists or not. #TINY-766
    +- Added new `ToggleToolbarDrawer` command and query state handler to allow the toolbar drawer to be programmatically toggled and the toggle state to be checked. #TINY-6032
    +- Added the ability to use `colgroup` elements in tables. #TINY-6050
    +- Added a new setting `table_use_colgroups` for toggling whether colgroups are used in new tables. #TINY-6050
    +- Added the ability to delete and navigate HTML media elements without the `media` plugin. #TINY-4211
    +- Added `fullscreen_native` setting to the `fullscreen` plugin to enable use of the entire monitor. #TINY-6284
    +- Added table related oxide variables to the Style API for more granular control over table cell selection appearance. #TINY-6311
    +- Added new `toolbar_persist` setting to control the visibility of the inline toolbar. #TINY-4847
    +- Added new APIs to allow for programmatic control of the inline toolbar visibility. #TINY-4847
    +- Added the `origin` property to the `ObjectResized` and `ObjectResizeStart` events, to specify which handle the resize was performed on. #TINY-6242
    +- Added new StyleSheetLoader `unload` and `unloadAll` APIs to allow loaded stylesheets to be removed. #TINY-3926
    +- Added the `LineHeight` query command and action to the editor. #TINY-4843
    +- Added the `lineheight` toolbar and menu items, and added `lineheight` to the default format menu. #TINY-4843
    +- Added a new `contextmenu_avoid_overlap` setting to allow context menus to avoid overlapping matched nodes. #TINY-6036
    +- Added new listbox dialog UI component for rendering a dropdown that allows nested options. #TINY-2236
    +- Added back the ability to use nested items in the `image_class_list`, `link_class_list`, `link_list`, `table_class_list`, `table_cell_class_list`, and `table_row_class_list` settings. #TINY-2236
    +
    +### Changed
    +- Changed how CSS manipulates table cells when selecting multiple cells to achieve a semi-transparent selection. #TINY-6311
    +- Changed the `target` property on fired events to use the native event target. The original target for an open shadow root can be obtained using `event.getComposedPath()`. #TINY-6128
    +- Changed the editor to clean-up loaded CSS stylesheets when all editors using the stylesheet have been removed. #TINY-3926
    +- Changed `imagetools` context menu icon for accessing the `image` dialog to use the `image` icon. #TINY-4141
    +- Changed the `editor.insertContent()` and `editor.selection.setContent()` APIs to retain leading and trailing whitespace. #TINY-5966
    +- Changed the `table` plugin `Column` menu to include the cut, copy and paste column menu items. #TINY-6374
    +- Changed the default table styles in the content CSS files to better support the styling options available in the `table` dialog. #TINY-6179
    +
    +### Deprecated
    +- Deprecated the `Env.experimentalShadowDom` flag. #TINY-6128
    +
    +### Fixed
    +- Fixed tables with no borders displaying with the default border styles in the `preview` dialog. #TINY-6179
    +- Fixed loss of whitespace when inserting content after a non-breaking space. #TINY-5966
    +- Fixed the `event.getComposedPath()` function throwing an exception for events fired from the editor. #TINY-6128
    +- Fixed notifications not appearing when the editor is within a ShadowRoot. #TINY-6354
    +- Fixed focus issues with inline dialogs when the editor is within a ShadowRoot. #TINY-6360
    +- Fixed the `template` plugin previews missing some content styles. #TINY-6115
    +- Fixed the `media` plugin not saving the alternative source url in some situations. #TINY-4113
    +- Fixed an issue where column resizing using the resize bars was inconsistent between fixed and relative table widths. #TINY-6001
    +- Fixed an issue where dragging and dropping within a table would select table cells. #TINY-5950
    +- Fixed up and down keyboard navigation not working for inline `contenteditable="false"` elements. #TINY-6226
    +- Fixed dialog not retrieving `close` icon from icon pack. #TINY-6445
    +- Fixed the `unlink` toolbar button not working when selecting multiple links. #TINY-4867
    +- Fixed the `link` dialog not showing the "Text to display" field in some valid cases. #TINY-5205
    +- Fixed the `DOMUtils.split()` API incorrectly removing some content. #TINY-6294
    +- Fixed pressing the escape key not focusing the editor when using multiple toolbars. #TINY-6230
    +- Fixed the `dirty` flag not being correctly set during an `AddUndo` event. #TINY-4707
    +- Fixed `editor.selection.setCursorLocation` incorrectly placing the cursor outside `pre` elements in some circumstances. #TINY-4058
    +- Fixed an exception being thrown when pressing the enter key inside pre elements while `br_in_pre` setting is false. #TINY-4058
    +
    +## 5.4.2 - 2020-08-17
    +
    +### Fixed
    +- Fixed the editor not resizing when resizing the browser window in fullscreen mode. #TINY-3511
    +- Fixed clicking on notifications causing inline editors to hide. #TINY-6058
    +- Fixed an issue where link URLs could not be deleted or edited in the link dialog in some cases. #TINY-4706
    +- Fixed a regression where setting the `anchor_top` or `anchor_bottom` options to `false` was not working. #TINY-6256
    +- Fixed the `anchor` plugin not supporting the `allow_html_in_named_anchor` option. #TINY-6236
    +- Fixed an exception thrown when removing inline formats that contained additional styles or classes. #TINY-6288
    +- Fixed an exception thrown when positioning the context toolbar on Internet Explorer 11 in some edge cases. #TINY-6271
    +- Fixed inline formats not removed when more than one `removeformat` format rule existed. #TINY-6216
    +- Fixed an issue where spaces were sometimes removed when removing formating on nearby text. #TINY-6251
    +- Fixed the list toolbar buttons not showing as active when a list is selected. #TINY-6286
    +- Fixed an issue where the UI would sometimes not be shown or hidden when calling the show or hide API methods on the editor. #TINY-6048
    +- Fixed the list type style not retained when copying list items. #TINY-6289
    +- Fixed the Paste plugin converting tabs in plain text to a single space character. A `paste_tab_spaces` option has been included for setting the number of spaces used to replace a tab character. #TINY-6237
    +
    +## 5.4.1 - 2020-07-08
    +
    +### Fixed
    +- Fixed the Search and Replace plugin incorrectly including zero-width caret characters in search results. #TINY-4599
    +- Fixed dragging and dropping unsupported files navigating the browser away from the editor. #TINY-6027
    +- Fixed undo levels not created on browser handled drop or paste events. #TINY-6027
    +- Fixed content in an iframe element parsing as DOM elements instead of text content. #TINY-5943
    +- Fixed Oxide checklist styles not showing when printing. #TINY-5139
    +- Fixed bug with `scope` attribute not being added to the cells of header rows. #TINY-6206
    +
    +## 5.4.0 - 2020-06-30
    +
    +### Added
    +- Added keyboard navigation support to menus and toolbars when the editor is in a ShadowRoot. #TINY-6152
    +- Added the ability for menus to be clicked when the editor is in an open shadow root. #TINY-6091
    +- Added the `Editor.ui.styleSheetLoader` API for loading stylesheets within the Document or ShadowRoot containing the editor UI. #TINY-6089
    +- Added the `StyleSheetLoader` module to the public API. #TINY-6100
    +- Added Oxide variables for styling the `select` element and headings in dialog content. #TINY-6070
    +- Added icons for `table` column and row cut, copy, and paste toolbar buttons. #TINY-6062
    +- Added all `table` menu items to the UI registry, so they can be used by name in other menus. #TINY-4866
    +- Added new `mceTableApplyCellStyle` command to the `table` plugin. #TINY-6004
    +- Added new `table` cut, copy, and paste column editor commands and menu items. #TINY-6006
    +- Added font related Oxide variables for secondary buttons, allowing for custom styling. #TINY-6061
    +- Added new `table_header_type` setting to control how table header rows are structured. #TINY-6007
    +- Added new `table_sizing_mode` setting to replace the `table_responsive_width` setting, which has now been deprecated. #TINY-6051
    +- Added new `mceTableSizingMode` command for changing the sizing mode of a table. #TINY-6000
    +- Added new `mceTableRowType`, `mceTableColType`, and `mceTableCellType` commands and value queries. #TINY-6150
    +
    +### Changed
    +- Changed `advlist` toolbar buttons to only show a dropdown list if there is more than one option. #TINY-3194
    +- Changed `mceInsertTable` command and `insertTable` API method to take optional header rows and columns arguments. #TINY-6012
    +- Changed stylesheet loading, so that UI skin stylesheets can load in a ShadowRoot if required. #TINY-6089
    +- Changed the DOM location of menus so that they display correctly when the editor is in a ShadowRoot. #TINY-6093
    +- Changed the table plugin to correctly detect all valid header row structures. #TINY-6007
    +
    +### Fixed
    +- Fixed tables with no defined width being converted to a `fixed` width table when modifying the table. #TINY-6051
    +- Fixed the `autosave` `isEmpty` API incorrectly detecting non-empty content as empty. #TINY-5953
    +- Fixed table `Paste row after` and `Paste row before` menu items not disabled when nothing was available to paste. #TINY-6006
    +- Fixed a selection performance issue with large tables on Microsoft Internet Explorer and Edge. #TINY-6057
    +- Fixed filters for screening commands from the undo stack to be case-insensitive. #TINY-5946
    +- Fixed `fullscreen` plugin now removes all classes when the editor is closed. #TINY-4048
    +- Fixed handling of mixed-case icon identifiers (names) for UI elements. #TINY-3854
    +- Fixed leading and trailing spaces lost when using `editor.selection.getContent({ format: 'text' })`. #TINY-5986
    +- Fixed an issue where changing the URL with the quicklink toolbar caused unexpected undo behavior. #TINY-5952
    +- Fixed an issue where removing formatting within a table cell would cause Internet Explorer 11 to scroll to the end of the table. #TINY-6049
    +- Fixed an issue where the `allow_html_data_urls` setting was not correctly applied. #TINY-5951
    +- Fixed the `autolink` feature so that it no longer treats a string with multiple "@" characters as an email address. #TINY-4773
    +- Fixed an issue where removing the editor would leave unexpected attributes on the target element. #TINY-4001
    +- Fixed the `link` plugin now suggest `mailto:` when the text contains an '@' and no slashes (`/`). #TINY-5941
    +- Fixed the `valid_children` check of custom elements now allows a wider range of characters in names. #TINY-5971
    +
    +## 5.3.2 - 2020-06-10
    +
    +### Fixed
    +- Fixed a regression introduced in 5.3.0, where `images_dataimg_filter` was no-longer called. #TINY-6086
    +
    +## 5.3.1 - 2020-05-27
    +
    +### Fixed
    +- Fixed the image upload error alert also incorrectly closing the image dialog. #TINY-6020
    +- Fixed editor content scrolling incorrectly on focus in Firefox by reverting default content CSS html and body heights added in 5.3.0. #TINY-6019
    +
    +## 5.3.0 - 2020-05-21
    +
    +### Added
    +- Added html and body height styles to the default oxide content CSS. #TINY-5978
    +- Added `uploadUri` and `blobInfo` to the data returned by `editor.uploadImages()`. #TINY-4579
    +- Added a new function to the `BlobCache` API to lookup a blob based on the base64 data and mime type. #TINY-5988
    +- Added the ability to search and replace within a selection. #TINY-4549
    +- Added the ability to set the list start position for ordered lists and added new `lists` context menu item. #TINY-3915
    +- Added `icon` as an optional config option to the toggle menu item API. #TINY-3345
    +- Added `auto` mode for `toolbar_location` which positions the toolbar and menu bar at the bottom if there is no space at the top. #TINY-3161
    +
    +### Changed
    +- Changed the default `toolbar_location` to `auto`. #TINY-3161
    +- Changed toggle menu items and choice menu items to have a dedicated icon with the checkmark displayed on the far right side of the menu item. #TINY-3345
    +- Changed the `link`, `image`, and `paste` plugins to use Promises to reduce the bundle size. #TINY-4710
    +- Changed the default icons to be lazy loaded during initialization. #TINY-4729
    +- Changed the parsing of content so base64 encoded urls are converted to blob urls. #TINY-4727
    +- Changed context toolbars so they concatenate when more than one is suitable for the current selection. #TINY-4495
    +- Changed inline style element formats (strong, b, em, i, u, strike) to convert to a span on format removal if a `style` or `class` attribute is present. #TINY-4741
    +
    +### Fixed
    +- Fixed the `selection.setContent()` API not running parser filters. #TINY-4002
    +- Fixed formats incorrectly applied or removed when table cells were selected. #TINY-4709
    +- Fixed the `quickimage` button not restricting the file types to images. #TINY-4715
    +- Fixed search and replace ignoring text in nested contenteditable elements. #TINY-5967
    +- Fixed resize handlers displaying in the wrong location sometimes for remote images. #TINY-4732
    +- Fixed table picker breaking in Firefox on low zoom levels. #TINY-4728
    +- Fixed issue with loading or pasting contents with large base64 encoded images on Safari. #TINY-4715
    +- Fixed supplementary special characters being truncated when inserted into the editor. Patch contributed by mlitwin. #TINY-4791
    +- Fixed toolbar buttons not set to disabled when the editor is in readonly mode. #TINY-4592
    +- Fixed the editor selection incorrectly changing when removing caret format containers. #TINY-3438
    +- Fixed bug where title, width, and height would be set to empty string values when updating an image and removing those attributes using the image dialog. #TINY-4786
    +- Fixed `ObjectResized` event firing when an object wasn't resized. #TINY-4161
    +- Fixed `ObjectResized` and `ObjectResizeStart` events incorrectly fired when adding or removing table rows and columns. #TINY-4829
    +- Fixed the placeholder not hiding when pasting content into the editor. #TINY-4828
    +- Fixed an issue where the editor would fail to load if local storage was disabled. #TINY-5935
    +- Fixed an issue where an uploaded image would reuse a cached image with a different mime type. #TINY-5988
    +- Fixed bug where toolbars and dialogs would not show if the body element was replaced (e.g. with Turbolinks). Patch contributed by spohlenz. #GH-5653
    +- Fixed an issue where multiple formats would be removed when removing a single format at the end of lines or on empty lines. #TINY-1170
    +- Fixed zero-width spaces incorrectly included in the `wordcount` plugin character count. #TINY-5991
    +- Fixed a regression introduced in 5.2.0 whereby the desktop `toolbar_mode` setting would incorrectly override the mobile default setting. #TINY-5998
    +- Fixed an issue where deleting all content in a single cell table would delete the entire table. #TINY-1044
    +
    +## 5.2.2 - 2020-04-23
    +
    +### Fixed
    +- Fixed an issue where anchors could not be inserted on empty lines. #TINY-2788
    +- Fixed text decorations (underline, strikethrough) not consistently inheriting the text color. #TINY-4757
    +- Fixed `format` menu alignment buttons inconsistently applying to images. #TINY-4057
    +- Fixed the floating toolbar drawer height collapsing when the editor is rendered in modal dialogs or floating containers. #TINY-4837
    +- Fixed `media` embed content not processing safely in some cases. #TINY-4857
    +
    +## 5.2.1 - 2020-03-25
    +
    +### Fixed
    +- Fixed the "is decorative" checkbox in the image dialog clearing after certain dialog events. #FOAM-11
    +- Fixed possible uncaught exception when a `style` attribute is removed using a content filter on `setContent`. #TINY-4742
    +- Fixed the table selection not functioning correctly in Microsoft Edge 44 or higher. #TINY-3862
    +- Fixed the table resize handles not functioning correctly in Microsoft Edge 44 or higher. #TINY-4160
    +- Fixed the floating toolbar drawer disconnecting from the toolbar when adding content in inline mode. #TINY-4725 #TINY-4765
    +- Fixed `readonly` mode not returning the appropriate boolean value. #TINY-3948
    +- Fixed the `forced_root_block_attrs` setting not applying attributes to new blocks consistently. #TINY-4564
    +- Fixed the editor incorrectly stealing focus during initialization in Microsoft Internet Explorer. #TINY-4697
    +- Fixed dialogs stealing focus when opening an alert or confirm dialog using an `onAction` callback. #TINY-4014
    +- Fixed inline dialogs incorrectly closing when clicking on an opened alert or confirm dialog. #TINY-4012
    +- Fixed the context toolbar overlapping the menu bar and toolbar. #TINY-4586
    +- Fixed notification and inline dialog positioning issues when using `toolbar_location: 'bottom'`. #TINY-4586
    +- Fixed the `colorinput` popup appearing offscreen on mobile devices. #TINY-4711
    +- Fixed special characters not being found when searching by "whole words only". #TINY-4522
    +- Fixed an issue where dragging images could cause them to be duplicated. #TINY-4195
    +- Fixed context toolbars activating without the editor having focus. #TINY-4754
    +- Fixed an issue where removing the background color of text did not always work. #TINY-4770
    +- Fixed an issue where new rows and columns in a table did not retain the style of the previous row or column. #TINY-4788
    +
    +## 5.2.0 - 2020-02-13
    +
    +### Added
    +- Added the ability to apply formats to spaces. #TINY-4200
    +- Added new `toolbar_location` setting to allow for positioning the menu and toolbar at the bottom of the editor. #TINY-4210
    +- Added new `toolbar_groups` setting to allow a custom floating toolbar group to be added to the toolbar when using `floating` toolbar mode. #TINY-4229
    +- Added new `link_default_protocol` setting to `link` and `autolink` plugin to allow a protocol to be used by default. #TINY-3328
    +- Added new `placeholder` setting to allow a placeholder to be shown when the editor is empty. #TINY-3917
    +- Added new `tinymce.dom.TextSeeker` API to allow searching text across different DOM nodes. #TINY-4200
    +- Added a drop shadow below the toolbar while in sticky mode and introduced Oxide variables to customize it when creating a custom skin. #TINY-4343
    +- Added `quickbars_image_toolbar` setting to allow for the image quickbar to be turned off. #TINY-4398
    +- Added iframe and img `loading` attribute to the default schema. Patch contributed by ataylor32. #GH-5112
    +- Added new `getNodeFilters`/`getAttributeFilters` functions to the `editor.serializer` instance. #TINY-4344
    +- Added new `a11y_advanced_options` setting to allow additional accessibility options to be added. #FOAM-11
    +- Added new accessibility options and behaviours to the image dialog using `a11y_advanced_options`. #FOAM-11
    +- Added the ability to use the window `PrismJS` instance for the `codesample` plugin instead of the bundled version to allow for styling custom languages. #TINY-4504
    +- Added error message events that fire when a resource loading error occurs. #TINY-4509
    +
    +### Changed
    +- Changed the default schema to disallow `onchange` for select elements. #TINY-4614
    +- Changed default `toolbar_mode` value from false to `wrap`. The value false has been deprecated. #TINY-4617
    +- Changed `toolbar_drawer` setting to `toolbar_mode`. `toolbar_drawer` has been deprecated. #TINY-4416
    +- Changed iframe mode to set selection on content init if selection doesn't exist. #TINY-4139
    +- Changed table related icons to align them with the visual style of the other icons. #TINY-4341
    +- Changed and improved the visual appearance of the color input field. #TINY-2917
    +- Changed fake caret container to use `forced_root_block` when possible. #TINY-4190
    +- Changed the `requireLangPack` API to wait until the plugin has been loaded before loading the language pack. #TINY-3716
    +- Changed the formatter so `style_formats` are registered before the initial content is loaded into the editor. #TINY-4238
    +- Changed media plugin to use https protocol for media urls by default. #TINY-4577
    +- Changed the parser to treat CDATA nodes as bogus HTML comments to match the HTML parsing spec. A new `preserve_cdata` setting has been added to preserve CDATA nodes if required. #TINY-4625
    +
    +### Fixed
    +- Fixed incorrect parsing of malformed/bogus HTML comments. #TINY-4625
    +- Fixed `quickbars` selection toolbar appearing on non-editable elements. #TINY-4359
    +- Fixed bug with alignment toolbar buttons sometimes not changing state correctly. #TINY-4139
    +- Fixed the `codesample` toolbar button not toggling when selecting code samples other than HTML. #TINY-4504
    +- Fixed content incorrectly scrolling to the top or bottom when pressing enter if when the content was already in view. #TINY-4162
    +- Fixed `scrollIntoView` potentially hiding elements behind the toolbar. #TINY-4162
    +- Fixed editor not respecting the `resize_img_proportional` setting due to legacy code. #TINY-4236
    +- Fixed flickering floating toolbar drawer in inline mode. #TINY-4210
    +- Fixed an issue where the template plugin dialog would be indefinitely blocked on a failed template load. #TINY-2766
    +- Fixed the `mscontrolselect` event not being unbound on IE/Edge. #TINY-4196
    +- Fixed Confirm dialog footer buttons so only the "Yes" button is highlighted. #TINY-4310
    +- Fixed `file_picker_callback` functionality for Image, Link and Media plugins. #TINY-4163
    +- Fixed issue where floating toolbar drawer sometimes would break if the editor is resized while the drawer is open. #TINY-4439
    +- Fixed incorrect `external_plugins` loading error message. #TINY-4503
    +- Fixed resize handler was not hidden for ARIA purposes. Patch contributed by Parent5446. #GH-5195
    +- Fixed an issue where content could be lost if a misspelled word was selected and spellchecking was disabled. #TINY-3899
    +- Fixed validation errors in the CSS where certain properties had the wrong default value. #TINY-4491
    +- Fixed an issue where forced root block attributes were not applied when removing a list. #TINY-4272
    +- Fixed an issue where the element path isn't being cleared when there are no parents. #TINY-4412
    +- Fixed an issue where width and height in svg icons containing `rect` elements were overridden by the CSS reset. #TINY-4408
    +- Fixed an issue where uploading images with `images_reuse_filename` enabled and that included a query parameter would generate an invalid URL. #TINY-4638
    +- Fixed the `closeButton` property not working when opening notifications. #TINY-4674
    +- Fixed keyboard flicker when opening a context menu on mobile. #TINY-4540
    +- Fixed issue where plus icon svg contained strokes. #TINY-4681
    +
    +## 5.1.6 - 2020-01-28
    +
    +### Fixed
    +- Fixed `readonly` mode not blocking all clicked links. #TINY-4572
    +- Fixed legacy font sizes being calculated inconsistently for the `FontSize` query command value. #TINY-4555
    +- Fixed changing a tables row from `Header` to `Body` incorrectly moving the row to the bottom of the table. #TINY-4593
    +- Fixed the context menu not showing in certain cases with hybrid devices. #TINY-4569
    +- Fixed the context menu opening in the wrong location when the target is the editor body. #TINY-4568
    +- Fixed the `image` plugin not respecting the `automatic_uploads` setting when uploading local images. #TINY-4287
    +- Fixed security issue related to parsing HTML comments and CDATA. #TINY-4544
    +
    +## 5.1.5 - 2019-12-19
    +
    +### Fixed
    +- Fixed the UI not working with hybrid devices that accept both touch and mouse events. #TNY-4521
    +- Fixed the `charmap` dialog initially focusing the first tab of the dialog instead of the search input field. #TINY-4342
    +- Fixed an exception being raised when inserting content if the caret was directly before or after a `contenteditable="false"` element. #TINY-4528
    +- Fixed a bug with pasting image URLs when paste as text is enabled. #TINY-4523
    +
    +## 5.1.4 - 2019-12-11
    +
    +### Fixed
    +- Fixed dialog contents disappearing when clicking a checkbox for right-to-left languages. #TINY-4518
    +- Fixed the `legacyoutput` plugin registering legacy formats after editor initialization, causing legacy content to be stripped on the initial load. #TINY-4447
    +- Fixed search and replace not cycling through results when searching using special characters. #TINY-4506
    +- Fixed the `visualchars` plugin converting HTML-like text to DOM elements in certain cases. #TINY-4507
    +- Fixed an issue with the `paste` plugin not sanitizing content in some cases. #TINY-4510
    +- Fixed HTML comments incorrectly being parsed in certain cases. #TINY-4511
    +
    +## 5.1.3 - 2019-12-04
    +
    +### Fixed
    +- Fixed sticky toolbar not undocking when fullscreen mode is activated. #TINY-4390
    +- Fixed the "Current Window" target not applying when updating links using the link dialog. #TINY-4063
    +- Fixed disabled menu items not highlighting when focused. #TINY-4339
    +- Fixed touch events passing through dialog collection items to the content underneath on Android devices. #TINY-4431
    +- Fixed keyboard navigation of the Help dialog's Keyboard Navigation tab. #TINY-4391
    +- Fixed search and replace dialog disappearing when finding offscreen matches on iOS devices. #TINY-4350
    +- Fixed performance issues where sticky toolbar was jumping while scrolling on slower browsers. #TINY-4475
    +
    +## 5.1.2 - 2019-11-19
    +
    +### Fixed
    +- Fixed desktop touch devices using `mobile` configuration overrides. #TINY-4345
    +- Fixed unable to disable the new scrolling toolbar feature. #TINY-4345
    +- Fixed touch events passing through any pop-up items to the content underneath on Android devices. #TINY-4367
    +- Fixed the table selector handles throwing JavaScript exceptions for non-table selections. #TINY-4338
    +- Fixed `cut` operations not removing selected content on Android devices when the `paste` plugin is enabled. #TINY-4362
    +- Fixed inline toolbar not constrained to the window width by default. #TINY-4314
    +- Fixed context toolbar split button chevrons pointing right when they should be pointing down. #TINY-4257
    +- Fixed unable to access the dialog footer in tabbed dialogs on small screens. #TINY-4360
    +- Fixed mobile table selectors were hard to select with touch by increasing the size. #TINY-4366
    +- Fixed mobile table selectors moving when moving outside the editor. #TINY-4366
    +- Fixed inline toolbars collapsing when using sliding toolbars. #TINY-4389
    +- Fixed block textpatterns not treating NBSPs as spaces. #TINY-4378
    +- Fixed backspace not merging blocks when the last element in the preceding block was a `contenteditable="false"` element. #TINY-4235
    +- Fixed toolbar buttons that only contain text labels overlapping on mobile devices. #TINY-4395
    +- Fixed quickbars quickimage picker not working on mobile. #TINY-4377
    +- Fixed fullscreen not resizing in an iOS WKWebView component. #TINY-4413
    +
    +## 5.1.1 - 2019-10-28
    +
    +### Fixed
    +- Fixed font formats containing spaces being wrapped in `"` entities instead of single quotes. #TINY-4275
    +- Fixed alert and confirm dialogs losing focus when clicked. #TINY-4248
    +- Fixed clicking outside a modal dialog focusing on the document body. #TINY-4249
    +- Fixed the context toolbar not hiding when scrolled out of view. #TINY-4265
    +
    +## 5.1.0 - 2019-10-17
    +
    +### Added
    +- Added touch selector handles for table selections on touch devices. #TINY-4097
    +- Added border width field to Table Cell dialog. #TINY-4028
    +- Added touch event listener to media plugin to make embeds playable. #TINY-4093
    +- Added oxide styling options to notifications and tweaked the default variables. #TINY-4153
    +- Added additional padding to split button chevrons on touch devices, to make them easier to interact with. #TINY-4223
    +- Added new platform detection functions to `Env` and deprecated older detection properties. #TINY-4184
    +- Added `inputMode` config field to specify inputmode attribute of `input` dialog components. #TINY-4062
    +- Added new `inputMode` property to relevant plugins/dialogs. #TINY-4102
    +- Added new `toolbar_sticky` setting to allow the iframe menubar/toolbar to stick to the top of the window when scrolling. #TINY-3982
    +
    +### Changed
    +- Changed default setting for `toolbar_drawer` to `floating`. #TINY-3634
    +- Changed mobile phones to use the `silver` theme by default. #TINY-3634
    +- Changed some editor settings to default to `false` on touch devices:
    +  - `menubar`(phones only). #TINY-4077
    +  - `table_grid`. #TINY-4075
    +  - `resize`. #TINY-4157
    +  - `object_resizing`. #TINY-4157
    +- Changed toolbars and context toolbars to sidescroll on mobile. #TINY-3894 #TINY-4107
    +- Changed context menus to render as horizontal menus on touch devices. #TINY-4107
    +- Changed the editor to use the `VisualViewport` API of the browser where possible. #TINY-4078
    +- Changed visualblocks toolbar button icon and renamed `paragraph` icon to `visualchars`. #TINY-4074
    +- Changed Oxide default for `@toolbar-button-chevron-color` to follow toolbar button icon color. #TINY-4153
    +- Changed the `urlinput` dialog component to use the `url` type attribute. #TINY-4102
    +
    +### Fixed
    +- Fixed Safari desktop visual viewport fires resize on fullscreen breaking the restore function. #TINY-3976
    +- Fixed scroll issues on mobile devices. #TINY-3976
    +- Fixed context toolbar unable to refresh position on iOS12. #TINY-4107
    +- Fixed ctrl+left click not opening links on readonly mode and the preview dialog. #TINY-4138
    +- Fixed Slider UI component not firing `onChange` event on touch devices. #TINY-4092
    +- Fixed notifications overlapping instead of stacking. #TINY-3478
    +- Fixed inline dialogs positioning incorrectly when the page is scrolled. #TINY-4018
    +- Fixed inline dialogs and menus not repositioning when resizing. #TINY-3227
    +- Fixed inline toolbar incorrectly stretching to the full width when a width value was provided. #TINY-4066
    +- Fixed menu chevrons color to follow the menu text color. #TINY-4153
    +- Fixed table menu selection grid from staying black when using dark skins, now follows border color. #TINY-4153
    +- Fixed Oxide using the wrong text color variable for menubar button focused state. #TINY-4146
    +- Fixed the autoresize plugin not keeping the selection in view when resizing. #TINY-4094
    +- Fixed textpattern plugin throwing exceptions when using `forced_root_block: false`. #TINY-4172
    +- Fixed missing CSS fill styles for toolbar button icon active state. #TINY-4147
    +- Fixed an issue where the editor selection could end up inside a short ended element (such as `br`). #TINY-3999
    +- Fixed browser selection being lost in inline mode when opening split dropdowns. #TINY-4197
    +- Fixed backspace throwing an exception when using `forced_root_block: false`. #TINY-4099
    +- Fixed floating toolbar drawer expanding outside the bounds of the editor. #TINY-3941
    +- Fixed the autocompleter not activating immediately after a `br` or `contenteditable=false` element. #TINY-4194
    +- Fixed an issue where the autocompleter would incorrectly close on IE 11 in certain edge cases. #TINY-4205
    +
    +## 5.0.16 - 2019-09-24
    +
    +### Added
    +- Added new `referrer_policy` setting to add the `referrerpolicy` attribute when loading scripts or stylesheets. #TINY-3978
    +- Added a slight background color to dialog tab links when focused to aid keyboard navigation. #TINY-3877
    +
    +### Fixed
    +- Fixed media poster value not updating on change. #TINY-4013
    +- Fixed openlink was not registered as a toolbar button. #TINY-4024
    +- Fixed failing to initialize if a script tag was used inside a SVG. #TINY-4087
    +- Fixed double top border showing on toolbar without menubar when toolbar_drawer is enabled. #TINY-4118
    +- Fixed unable to drag inline dialogs to the bottom of the screen when scrolled. #TINY-4154
    +- Fixed notifications appearing on top of the toolbar when scrolled in inline mode. #TINY-4159
    +- Fixed notifications displaying incorrectly on IE 11. #TINY-4169
    +
    +## 5.0.15 - 2019-09-02
    +
    +### Added
    +- Added a dark `content_css` skin to go with the dark UI skin. #TINY-3743
    +
    +### Changed
    +- Changed the enabled state on toolbar buttons so they don't get the hover effect. #TINY-3974
    +
    +### Fixed
    +- Fixed missing CSS active state on toolbar buttons. #TINY-3966
    +- Fixed `onChange` callback not firing for the colorinput dialog component. #TINY-3968
    +- Fixed context toolbars not showing in fullscreen mode. #TINY-4023
    +
    +## 5.0.14 - 2019-08-19
    +
    +### Added
    +- Added an API to reload the autocompleter menu with additional fetch metadata #MENTIONS-17
    +
    +### Fixed
    +- Fixed missing toolbar button border styling options. #TINY-3965
    +- Fixed image upload progress notification closing before the upload is complete. #TINY-3963
    +- Fixed inline dialogs not closing on escape when no dialog component is in focus. #TINY-3936
    +- Fixed plugins not being filtered when defaulting to mobile on phones. #TINY-3537
    +- Fixed toolbar more drawer showing the content behind it when transitioning between opened and closed states. #TINY-3878
    +- Fixed focus not returning to the dialog after pressing the "Replace all" button in the search and replace dialog. #TINY-3961
    +
    +### Removed
    +- Removed Oxide variable `@menubar-select-disabled-border-color` and replaced it with `@menubar-select-disabled-border`. #TINY-3965
    +
    +## 5.0.13 - 2019-08-06
    +
    +### Changed
    +- Changed modal dialogs to prevent dragging by default and added new `draggable_modal` setting to restore dragging. #TINY-3873
    +- Changed the nonbreaking plugin to insert nbsp characters wrapped in spans to aid in filtering. This can be disabled using the `nonbreaking_wrap` setting. #TINY-3647
    +- Changed backspace behaviour in lists to outdent nested list items when the cursor is at the start of the list item. #TINY-3651
    +
    +### Fixed
    +- Fixed sidebar growing beyond editor bounds in IE 11. #TINY-3937
    +- Fixed issue with being unable to keyboard navigate disabled toolbar buttons. #TINY-3350
    +- Fixed issues with backspace and delete in nested contenteditable true and false elements. #TINY-3868
    +- Fixed issue with losing keyboard navigation in dialogs due to disabled buttons. #TINY-3914
    +- Fixed `MouseEvent.mozPressure is deprecated` warning in Firefox. #TINY-3919
    +- Fixed `default_link_target` not being respected when `target_list` is disabled. #TINY-3757
    +- Fixed mobile plugin filter to only apply to the mobile theme, rather than all mobile platforms. #TINY-3405
    +- Fixed focus switching to another editor during mode changes. #TINY-3852
    +- Fixed an exception being thrown when clicking on an uninitialized inline editor. #TINY-3925
    +- Fixed unable to keyboard navigate to dialog menu buttons. #TINY-3933
    +- Fixed dialogs being able to be dragged outside the window viewport. #TINY-3787
    +- Fixed inline dialogs appearing above modal dialogs. #TINY-3932
    +
    +## 5.0.12 - 2019-07-18
    +
    +### Added
    +- Added ability to utilize UI dialog panels inside other panels. #TINY-3305
    +- Added help dialog tab explaining keyboard navigation of the editor. #TINY-3603
    +
    +### Changed
    +- Changed the "Find and Replace" design to an inline dialog. #TINY-3054
    +
    +### Fixed
    +- Fixed issue where autolink spacebar event was not being fired on Edge. #TINY-3891
    +- Fixed table selection missing the background color. #TINY-3892
    +- Fixed removing shortcuts not working for function keys. #TINY-3871
    +- Fixed non-descriptive UI component type names. #TINY-3349
    +- Fixed UI registry components rendering as the wrong type when manually specifying a different type. #TINY-3385
    +- Fixed an issue where dialog checkbox, input, selectbox, textarea and urlinput components couldn't be disabled. #TINY-3708
    +- Fixed the context toolbar not using viable screen space in inline/distraction free mode. #TINY-3717
    +- Fixed the context toolbar overlapping the toolbar in various conditions. #TINY-3205
    +- Fixed IE11 edge case where items were being inserted into the wrong location. #TINY-3884
    +
    +## 5.0.11 - 2019-07-04
    +
    +### Fixed
    +- Fixed packaging errors caused by a rollup treeshaking bug (https://github.com/rollup/rollup/issues/2970). #TINY-3866
    +- Fixed the customeditor component not able to get data from the dialog api. #TINY-3866
    +- Fixed collection component tooltips not being translated. #TINY-3855
    +
    +## 5.0.10 - 2019-07-02
    +
    +### Added
    +- Added support for all HTML color formats in `color_map` setting. #TINY-3837
    +
    +### Changed
    +- Changed backspace key handling to outdent content in appropriate circumstances. #TINY-3685
    +- Changed default palette for forecolor and backcolor to include some lighter colors suitable for highlights. #TINY-2865
    +- Changed the search and replace plugin to cycle through results. #TINY-3800
    +
    +### Fixed
    +- Fixed inconsistent types causing some properties to be unable to be used in dialog components. #TINY-3778
    +- Fixed an issue in the Oxide skin where dialog content like outlines and shadows were clipped because of overflow hidden. #TINY-3566
    +- Fixed the search and replace plugin not resetting state when changing the search query. #TINY-3800
    +- Fixed backspace in lists not creating an undo level. #TINY-3814
    +- Fixed the editor to cancel loading in quirks mode where the UI is not supported. #TINY-3391
    +- Fixed applying fonts not working when the name contained spaces and numbers. #TINY-3801
    +- Fixed so that initial content is retained when initializing on list items. #TINY-3796
    +- Fixed inefficient font name and font size current value lookup during rendering. #TINY-3813
    +- Fixed mobile font copied into the wrong folder for the oxide-dark skin. #TINY-3816
    +- Fixed an issue where resizing the width of tables would produce inaccurate results. #TINY-3827
    +- Fixed a memory leak in the Silver theme. #TINY-3797
    +- Fixed alert and confirm dialogs using incorrect markup causing inconsistent padding. #TINY-3835
    +- Fixed an issue in the Table plugin with `table_responsive_width` not enforcing units when resizing. #TINY-3790
    +- Fixed leading, trailing and sequential spaces being lost when pasting plain text. #TINY-3726
    +- Fixed exception being thrown when creating relative URIs. #TINY-3851
    +- Fixed focus is no longer set to the editor content during mode changes unless the editor already had focus. #TINY-3852
    +
    +## 5.0.9 - 2019-06-26
    +
    +### Fixed
    +- Fixed print plugin not working in Firefox. #TINY-3834
    +
    +## 5.0.8 - 2019-06-18
    +
    +### Added
    +- Added back support for multiple toolbars. #TINY-2195
    +- Added support for .m4a files to the media plugin. #TINY-3750
    +- Added new base_url and suffix editor init options. #TINY-3681
    +
    +### Fixed
    +- Fixed incorrect padding for select boxes with visible values. #TINY-3780
    +- Fixed selection incorrectly changing when programmatically setting selection on contenteditable false elements. #TINY-3766
    +- Fixed sidebar background being transparent. #TINY-3727
    +- Fixed the build to remove duplicate iife wrappers. #TINY-3689
    +- Fixed bogus autocompleter span appearing in content when the autocompleter menu is shown. #TINY-3752
    +- Fixed toolbar font size select not working with legacyoutput plugin. #TINY-2921
    +- Fixed the legacyoutput plugin incorrectly aligning images. #TINY-3660
    +- Fixed remove color not working when using the legacyoutput plugin. #TINY-3756
    +- Fixed the font size menu applying incorrect sizes when using the legacyoutput plugin. #TINY-3773
    +- Fixed scrollIntoView not working when the parent window was out of view. #TINY-3663
    +- Fixed the print plugin printing from the wrong window in IE11. #TINY-3762
    +- Fixed content CSS loaded over CORS not loading in the preview plugin with content_css_cors enabled. #TINY-3769
    +- Fixed the link plugin missing the default "None" option for link list. #TINY-3738
    +- Fixed small dot visible with menubar and toolbar disabled in inline mode. #TINY-3623
    +- Fixed space key properly inserts a nbsp before/after block elements. #TINY-3745
    +- Fixed native context menu not showing with images in IE11. #TINY-3392
    +- Fixed inconsistent browser context menu image selection. #TINY-3789
    +
    +## 5.0.7 - 2019-06-05
    +
    +### Added
    +- Added new toolbar button and menu item for inserting tables via dialog. #TINY-3636
    +- Added new API for adding/removing/changing tabs in the Help dialog. #TINY-3535
    +- Added highlighting of matched text in autocompleter items. #TINY-3687
    +- Added the ability for autocompleters to work with matches that include spaces. #TINY-3704
    +- Added new `imagetools_fetch_image` callback to allow custom implementations for cors loading of images. #TINY-3658
    +- Added `'http'` and `https` options to `link_assume_external_targets` to prepend `http://` or `https://` prefixes when URL does not contain a protocol prefix. Patch contributed by francoisfreitag. #GH-4335
    +
    +### Changed
    +- Changed annotations navigation to work the same as inline boundaries. #TINY-3396
    +- Changed tabpanel API by adding a `name` field and changing relevant methods to use it. #TINY-3535
    +
    +### Fixed
    +- Fixed text color not updating all color buttons when choosing a color. #TINY-3602
    +- Fixed the autocompleter not working with fragmented text. #TINY-3459
    +- Fixed the autosave plugin no longer overwrites window.onbeforeunload. #TINY-3688
    +- Fixed infinite loop in the paste plugin when IE11 takes a long time to process paste events. Patch contributed by lRawd. #GH-4987
    +- Fixed image handle locations when using `fixed_toolbar_container`. Patch contributed by t00. #GH-4966
    +- Fixed the autoresize plugin not firing `ResizeEditor` events. #TINY-3587
    +- Fixed editor in fullscreen mode not extending to the bottom of the screen. #TINY-3701
    +- Fixed list removal when pressing backspace after the start of the list item. #TINY-3697
    +- Fixed autocomplete not triggering from compositionend events. #TINY-3711
    +- Fixed `file_picker_callback` could not set the caption field on the insert image dialog. #TINY-3172
    +- Fixed the autocompleter menu showing up after a selection had been made. #TINY-3718
    +- Fixed an exception being thrown when a file or number input has focus during initialization. Patch contributed by t00. #GH-2194
    +
    +## 5.0.6 - 2019-05-22
    +
    +### Added
    +- Added `icons_url` editor settings to enable icon packs to be loaded from a custom url. #TINY-3585
    +- Added `image_uploadtab` editor setting to control the visibility of the upload tab in the image dialog. #TINY-3606
    +- Added new api endpoints to the wordcount plugin and improved character count logic. #TINY-3578
    +
    +### Changed
    +- Changed plugin, language and icon loading errors to log in the console instead of a notification. #TINY-3585
    +
    +### Fixed
    +- Fixed the textpattern plugin not working with fragmented text. #TINY-3089
    +- Fixed various toolbar drawer accessibility issues and added an animation. #TINY-3554
    +- Fixed issues with selection and ui components when toggling readonly mode. #TINY-3592
    +- Fixed so readonly mode works with inline editors. #TINY-3592
    +- Fixed docked inline toolbar positioning when scrolled. #TINY-3621
    +- Fixed initial value not being set on bespoke select in quickbars and toolbar drawer. #TINY-3591
    +- Fixed so that nbsp entities aren't trimmed in white-space: pre-line elements. #TINY-3642
    +- Fixed `mceInsertLink` command inserting spaces instead of url encoded characters. #GH-4990
    +- Fixed text content floating on top of dialogs in IE11. #TINY-3640
    +
    +## 5.0.5 - 2019-05-09
    +
    +### Added
    +- Added menu items to match the forecolor/backcolor toolbar buttons. #TINY-2878
    +- Added default directionality based on the configured language. #TINY-2621
    +- Added styles, icons and tests for rtl mode. #TINY-2621
    +
    +### Fixed
    +- Fixed autoresize not working with floating elements or when media elements finished loading. #TINY-3545
    +- Fixed incorrect vertical caret positioning in IE 11. #TINY-3188
    +- Fixed submenu anchoring hiding overflowed content. #TINY-3564
    +
    +### Removed
    +- Removed unused and hidden validation icons to avoid displaying phantom tooltips. #TINY-2329
    +
    +## 5.0.4 - 2019-04-23
    +
    +### Added
    +- Added back URL dialog functionality, which is now available via `editor.windowManager.openUrl()`. #TINY-3382
    +- Added the missing throbber functionality when calling `editor.setProgressState(true)`. #TINY-3453
    +- Added function to reset the editor content and undo/dirty state via `editor.resetContent()`. #TINY-3435
    +- Added the ability to set menu buttons as active. #TINY-3274
    +- Added `editor.mode` API, featuring a custom editor mode API. #TINY-3406
    +- Added better styling to floating toolbar drawer. #TINY-3479
    +- Added the new premium plugins to the Help dialog plugins tab. #TINY-3496
    +- Added the linkchecker context menu items to the default configuration. #TINY-3543
    +
    +### Fixed
    +- Fixed image context menu items showing on placeholder images. #TINY-3280
    +- Fixed dialog labels and text color contrast within notifications/alert banners to satisfy WCAG 4.5:1 contrast ratio for accessibility. #TINY-3351
    +- Fixed selectbox and colorpicker items not being translated. #TINY-3546
    +- Fixed toolbar drawer sliding mode to correctly focus the editor when tabbing via keyboard navigation. #TINY-3533
    +- Fixed positioning of the styleselect menu in iOS while using the mobile theme. #TINY-3505
    +- Fixed the menubutton `onSetup` callback to be correctly executed when rendering the menu buttons. #TINY-3547
    +- Fixed `default_link_target` setting to be correctly utilized when creating a link. #TINY-3508
    +- Fixed colorpicker floating marginally outside its container. #TINY-3026
    +- Fixed disabled menu items displaying as active when hovered. #TINY-3027
    +
    +### Removed
    +- Removed redundant mobile wrapper. #TINY-3480
    +
    +## 5.0.3 - 2019-03-19
    +
    +### Changed
    +- Changed empty nested-menu items within the style formats menu to be disabled or hidden if the value of `style_formats_autohide` is `true`. #TINY-3310
    +- Changed the entire phrase 'Powered by Tiny' in the status bar to be a link instead of just the word 'Tiny'. #TINY-3366
    +- Changed `formatselect`, `styleselect` and `align` menus to use the `mceToggleFormat` command internally. #TINY-3428
    +
    +### Fixed
    +- Fixed toolbar keyboard navigation to work as expected when `toolbar_drawer` is configured. #TINY-3432
    +- Fixed text direction buttons to display the correct pressed state in selections that have no explicit `dir` property. #TINY-3138
    +- Fixed the mobile editor to clean up properly when removed. #TINY-3445
    +- Fixed quickbar toolbars to add an empty box to the screen when it is set to `false`. #TINY-3439
    +- Fixed an issue where pressing the **Delete/Backspace** key at the edge of tables was creating incorrect selections. #TINY-3371
    +- Fixed an issue where dialog collection items (emoticon and special character dialogs) couldn't be selected with touch devices. #TINY-3444
    +- Fixed a type error introduced in TinyMCE version 5.0.2 when calling `editor.getContent()` with nested bookmarks. #TINY-3400
    +- Fixed an issue that prevented default icons from being overridden. #TINY-3449
    +- Fixed an issue where **Home/End** keys wouldn't move the caret correctly before or after `contenteditable=false` inline elements. #TINY-2995
    +- Fixed styles to be preserved in IE 11 when editing via the `fullpage` plugin. #TINY-3464
    +- Fixed the `link` plugin context toolbar missing the open link button. #TINY-3461
    +- Fixed inconsistent dialog component spacing. #TINY-3436
    +
    +## 5.0.2 - 2019-03-05
    +
    +### Added
    +- Added presentation and document presets to `htmlpanel` dialog component. #TINY-2694
    +- Added missing fixed_toolbar_container setting has been reimplemented in the Silver theme. #TINY-2712
    +- Added a new toolbar setting `toolbar_drawer` that moves toolbar groups which overflow the editor width into either a `sliding` or `floating` toolbar section. #TINY-2874
    +
    +### Changed
    +- Updated the build process to include package lock files in the dev distribution archive. #TINY-2870
    +
    +### Fixed
    +- Fixed inline dialogs did not have aria attributes. #TINY-2694
    +- Fixed default icons are now available in the UI registry, allowing use outside of toolbar buttons. #TINY-3307
    +- Fixed a memory leak related to select toolbar items. #TINY-2874
    +- Fixed a memory leak due to format changed listeners that were never unbound. #TINY-3191
    +- Fixed an issue where content may have been lost when using permanent bookmarks. #TINY-3400
    +- Fixed the quicklink toolbar button not rendering in the quickbars plugin. #TINY-3125
    +- Fixed an issue where menus were generating invalid HTML in some cases. #TINY-3323
    +- Fixed an issue that could cause the mobile theme to show a blank white screen when the editor was inside an `overflow:hidden` element. #TINY-3407
    +- Fixed mobile theme using a transparent background and not taking up the full width on iOS. #TINY-3414
    +- Fixed the template plugin dialog missing the description field. #TINY-3337
    +- Fixed input dialog components using an invalid default type attribute. #TINY-3424
    +- Fixed an issue where backspace/delete keys after/before pagebreak elements wouldn't move the caret. #TINY-3097
    +- Fixed an issue in the table plugin where menu items and toolbar buttons weren't showing correctly based on the selection. #TINY-3423
    +- Fixed inconsistent button focus styles in Firefox. #TINY-3377
    +- Fixed the resize icon floating left when all status bar elements were disabled. #TINY-3340
    +- Fixed the resize handle to not show in fullscreen mode. #TINY-3404
    +
    +## 5.0.1 - 2019-02-21
    +
    +### Added
    +- Added H1-H6 toggle button registration to the silver theme. #TINY-3070
    +- Added code sample toolbar button will now toggle on when the cursor is in a code section. #TINY-3040
    +- Added new settings to the emoticons plugin to allow additional emoticons to be added. #TINY-3088
    +
    +### Fixed
    +- Fixed an issue where adding links to images would replace the image with text. #TINY-3356
    +- Fixed an issue where the inline editor could use fractional pixels for positioning. #TINY-3202
    +- Fixed an issue where uploading non-image files in the Image Plugin upload tab threw an error. #TINY-3244
    +- Fixed an issue in the media plugin that was causing the source url and height/width to be lost in certain circumstances. #TINY-2858
    +- Fixed an issue with the Context Toolbar not being removed when clicking outside of the editor. #TINY-2804
    +- Fixed an issue where clicking 'Remove link' wouldn't remove the link in certain circumstances. #TINY-3199
    +- Fixed an issue where the media plugin would fail when parsing dialog data. #TINY-3218
    +- Fixed an issue where retrieving the selected content as text didn't create newlines. #TINY-3197
    +- Fixed incorrect keyboard shortcuts in the Help dialog for Windows. #TINY-3292
    +- Fixed an issue where JSON serialization could produce invalid JSON. #TINY-3281
    +- Fixed production CSS including references to source maps. #TINY-3920
    +- Fixed development CSS was not included in the development zip. #TINY-3920
    +- Fixed the autocompleter matches predicate not matching on the start of words by default. #TINY-3306
    +- Fixed an issue where the page could be scrolled with modal dialogs open. #TINY-2252
    +- Fixed an issue where autocomplete menus would show an icon margin when no items had icons. #TINY-3329
    +- Fixed an issue in the quickbars plugin where images incorrectly showed the text selection toolbar. #TINY-3338
    +- Fixed an issue that caused the inline editor to fail to render when the target element already had focus. #TINY-3353
    +
    +### Removed
    +- Removed paste as text notification banner and paste_plaintext_inform setting. #POW-102
    +
    +## 5.0.0 - 2019-02-04
    +
    +Full documentation for the version 5 features and changes is available at https://www.tiny.cloud/docs/tinymce/5/release-notes/release-notes50/
    +
    +### Added
    +- Added links and registered names with * to denote premium plugins in Plugins tab of Help dialog. #TINY-3223
    +
    +### Changed
    +- Changed Tiny 5 mobile skin to look more uniform with desktop. #TINY-2650
    +- Blacklisted table, th and td as inline editor target. #TINY-717
    +
    +### Fixed
    +- Fixed an issue where tab panel heights weren't sizing properly on smaller screens and weren't updating on resize. #TINY-3242
    +- Fixed image tools not having any padding between the label and slider. #TINY-3220
    +- Fixed context toolbar toggle buttons not showing the correct state. #TINY-3022
    +- Fixed missing separators in the spellchecker context menu between the suggestions and actions. #TINY-3217
    +- Fixed notification icon positioning in alert banners. #TINY-2196
    +- Fixed a typo in the word count plugin name. #TINY-3062
    +- Fixed charmap and emoticons dialogs not having a primary button. #TINY-3233
    +- Fixed an issue where resizing wouldn't work correctly depending on the box-sizing model. #TINY-3278
    +
    +## 5.0.0-rc-2 - 2019-01-22
    +
    +### Added
    +- Added screen reader accessibility for sidebar and statusbar. #TINY-2699
    +
    +### Changed
    +- Changed formatting menus so they are registered and made the align toolbar button use an icon instead of text. #TINY-2880
    +- Changed checkboxes to use a boolean for its state, instead of a string. #TINY-2848
    +- Updated the textpattern plugin to properly support nested patterns and to allow running a command with a value for a pattern with a start and an end. #TINY-2991
    +- Updated Emoticons and Charmap dialogs to be screen reader accessible. #TINY-2693
    +
    +### Fixed
    +- Fixed the link dialog such that it will now retain class attributes when updating links. #TINY-2825
    +- Fixed "Find and replace" not showing in the "Edit" menu by default. #TINY-3061
    +- Fixed dropdown buttons missing the 'type' attribute, which could cause forms to be incorrectly submitted. #TINY-2826
    +- Fixed emoticon and charmap search not returning expected results in certain cases. #TINY-3084
    +- Fixed blank rel_list values throwing an exception in the link plugin. #TINY-3149
    +
    +### Removed
    +- Removed unnecessary 'flex' and unused 'colspan' properties from the new dialog APIs. #TINY-2973
    +
    +## 5.0.0-rc-1 - 2019-01-08
    +
    +### Added
    +- Added editor settings functionality to specify title attributes for toolbar groups. #TINY-2690
    +- Added icons instead of button text to improve Search and Replace dialog footer appearance. #TINY-2654
    +- Added `tox-dialog__table` instead of `mce-table-striped` class to enhance Help dialog appearance. #TINY-2360
    +- Added title attribute to iframes so, screen readers can announce iframe labels. #TINY-2692
    +- Added a wordcount menu item, that defaults to appearing in the tools menu. #TINY-2877
    +
    +### Changed
    +- Updated the font select dropdown logic to try to detect the system font stack and show "System Font" as the font name. #TINY-2710
    +- Updated the autocompleter to only show when it has matched items. #TINY-2350
    +- Updated SizeInput labels to "Height" and "Width" instead of Dimensions. #TINY-2833
    +- Updated the build process to minify and generate ASCII only output for the emoticons database. #TINY-2744
    +
    +### Fixed
    +- Fixed readonly mode not fully disabling editing content. #TINY-2287
    +- Fixed accessibility issues with the font select, font size, style select and format select toolbar dropdowns. #TINY-2713
    +- Fixed accessibility issues with split dropdowns. #TINY-2697
    +- Fixed the legacyoutput plugin to be compatible with TinyMCE 5.0. #TINY-2301
    +- Fixed icons not showing correctly in the autocompleter popup. #TINY-3029
    +- Fixed an issue where preview wouldn't show anything in Edge under certain circumstances. #TINY-3035
    +- Fixed the height being incorrectly calculated for the autoresize plugin. #TINY-2807
    +
    +## 5.0.0-beta-1 - 2018-11-30
    +
    +### Added
    +- Added a new `addNestedMenuItem()` UI registry function and changed all nested menu items to use the new registry functions. #TINY-2230
    +- Added title attribute to color swatch colors. #TINY-2669
    +- Added anchorbar component to anchor inline toolbar dialogs to instead of the toolbar. #TINY-2040
    +- Added support for toolbar and toolbar array config options to be squashed into a single toolbar and not create multiple toolbars. #TINY-2195
    +- Added error handling for when forced_root_block config option is set to true. #TINY-2261
    +- Added functionality for the removed_menuitems config option. #TINY-2184
    +- Added the ability to use a string to reference menu items in menu buttons and submenu items. #TINY-2253
    +
    +### Changed
    +- Changed the name of the "inlite" plugin to "quickbars". #TINY-2831
    +- Changed the background color icon to highlight background icon. #TINY-2258
    +- Changed Help dialog to be accessible to screen readers. #TINY-2687
    +- Changed the color swatch to save selected custom colors to local storage for use across sessions. #TINY-2722
    +- Changed `WindowManager` API - methods `getParams`, `setParams` and `getWindows`, and the legacy `windows` property, have been removed. `alert` and `confirm` dialogs are no longer tracked in the window list. #TINY-2603
    +
    +### Fixed
    +- Fixed an inline mode issue where the save plugin upon saving can cause content loss. #TINY-2659
    +- Fixed an issue in IE 11 where calling selection.getContent() would return an empty string when the editor didn't have focus. #TINY-2325
    +
    +### Removed
    +- Removed compat3x plugin. #TINY-2815
    +
    +## 5.0.0-preview-4 - 2018-11-12
    +
    +### Added
    +- Added width and height placeholder text to image and media dialog dimensions input. #AP-296
    +- Added the ability to keyboard navigate through menus, toolbars, sidebar and the status bar sequentially. #AP-381
    +- Added translation capability back to the editor's UI. #AP-282
    +- Added `label` component type for dialogs to group components under a label.
    +
    +### Changed
    +- Changed the editor resize handle so that it should be disabled when the autoresize plugin is turned on. #AP-424
    +- Changed UI text for microcopy improvements. #TINY-2281
    +
    +### Fixed
    +- Fixed distraction free plugin. #AP-470
    +- Fixed contents of the input field being selected on focus instead of just recieving an outline highlight. #AP-464
    +- Fixed styling issues with dialogs and menus in IE 11. #AP-456
    +- Fixed custom style format control not honoring custom formats. #AP-393
    +- Fixed context menu not appearing when clicking an image with a caption. #AP-382
    +- Fixed directionality of UI when using an RTL language. #AP-423
    +- Fixed page responsiveness with multiple inline editors. #AP-430
    +- Fixed empty toolbar groups appearing through invalid configuration of the `toolbar` property. #AP-450
    +- Fixed text not being retained when updating links through the link dialog. #AP-293
    +- Fixed edit image context menu, context toolbar and toolbar items being incorrectly enabled when selecting invalid images. #AP-323
    +- Fixed emoji type ahead being shown when typing URLs. #AP-366
    +- Fixed toolbar configuration properties incorrectly expecting string arrays instead of strings. #AP-342
    +- Fixed the block formatting toolbar item not showing a "Formatting" title when there is no selection. #AP-321
    +- Fixed clicking disabled toolbar buttons hiding the toolbar in inline mode. #AP-380
    +- Fixed `EditorResize` event not being fired upon editor resize. #AP-327
    +- Fixed tables losing styles when updating through the dialog. #AP-368
    +- Fixed context toolbar positioning to be more consistent near the edges of the editor. #AP-318
    +- Fixed table of contents plugin now works with v5 toolbar APIs correctly. #AP-347
    +- Fixed the `link_context_toolbar` configuration not disabling the context toolbar. #AP-458
    +- Fixed the link context toolbar showing incorrect relative links. #AP-435
    +- Fixed the alignment of the icon in alert banner dialog components. #TINY-2220
    +- Fixed the visual blocks and visual char menu options not displaying their toggled state. #TINY-2238
    +- Fixed the editor not displaying as fullscreen when toggled. #TINY-2237
    +
    +### Removed
    +- Removed the tox-custom-editor class that was added to the wrapping element of codemirror. #TINY-2211
    +
    +## 5.0.0-preview-3 - 2018-10-18
    +
    +### Changed
    +- Changed editor layout to use modern CSS properties over manually calculating dimensions. #AP-324
    +- Changed `autoresize_min_height` and `autoresize_max_height` configurations to `min_height` and `max_height`. #AP-324
    +- Changed `Whole word` label in Search and Replace dialog to `Find whole words only`. #AP-387
    +
    +### Fixed
    +- Fixed bugs with editor width jumping when resizing and the iframe not resizing to smaller than 150px in height. #AP-324
    +- Fixed mobile theme bug that prevented the editor from loading. #AP-404
    +- Fixed long toolbar groups extending outside of the editor instead of wrapping.
    +- Fixed dialog titles so they are now proper case. #AP-384
    +- Fixed color picker default to be #000000 instead of #ff00ff. #AP-216
    +- Fixed "match case" option on the Find and Replace dialog is no longer selected by default. #AP-298
    +- Fixed vertical alignment of toolbar icons. #DES-134
    +- Fixed toolbar icons not appearing on IE11. #DES-133
    +
    +## 5.0.0-preview-2 - 2018-10-10
    +
    +### Added
    +- Added swatch is now shown for colorinput fields, instead of the colorpicker directly. #AP-328
    +- Added fontformats and fontsizes menu items. #AP-390
    +
    +### Changed
    +- Changed configuration of color options has been simplified to `color_map`, `color_cols`, and `custom_colors`. #AP-328
    +- Changed `height` configuration to apply to the editor frame (including menubar, toolbar, status bar) instead of the content area. #AP-324
    +
    +### Fixed
    +- Fixed styleselect not updating the displayed item as the cursor moved. #AP-388
    +- Fixed preview iframe not expanding to the dialog size. #AP-252
    +- Fixed 'meta' shortcuts not translated into platform-specific text. #AP-270
    +- Fixed tabbed dialogs (Charmap and Emoticons) shrinking when no search results returned.
    +- Fixed a bug where alert banner icons were not retrieved from icon pack. #AP-330
    +- Fixed component styles to flex so they fill large dialogs. #AP-252
    +- Fixed editor flashing unstyled during load (still in progress). #AP-349
    +
    +### Removed
    +- Removed `colorpicker` plugin, it is now in the theme. #AP-328
    +- Removed `textcolor` plugin, it is now in the theme. #AP-328
    +
    +## 5.0.0-preview-1 - 2018-10-01
    +
    +Developer preview 1.
    +
    +Initial list of features and changes is available at https://www.tiny.cloud/docs/tinymce/5/release-notes/release-notes50/.
    +
    +## 4.9.11 - 2020-07-13
    +
    +### Fixed
    +- Fixed the `selection.setContent()` API not running parser filters. #TINY-4002
    +- Fixed content in an iframe element parsing as DOM elements instead of text content. #TINY-5943
    +- Fixed up and down keyboard navigation not working for inline `contenteditable="false"` elements. #TINY-6226
    +
    +## 4.9.10 - 2020-04-23
    +
    +### Fixed
    +- Fixed an issue where the editor selection could end up inside a short ended element (eg br). #TINY-3999
    +- Fixed a security issue related to CDATA sanitization during parsing. #TINY-4669
    +- Fixed `media` embed content not processing safely in some cases. #TINY-4857
    +
    +## 4.9.9 - 2020-03-25
    +
    +### Fixed
    +- Fixed the table selection not functioning correctly in Microsoft Edge 44 or higher. #TINY-3862
    +- Fixed the table resize handles not functioning correctly in Microsoft Edge 44 or higher. #TINY-4160
    +- Fixed the `forced_root_block_attrs` setting not applying attributes to new blocks consistently. #TINY-4564
    +- Fixed the editor failing to initialize if a script tag was used inside an SVG. #TINY-4087
    +
    +## 4.9.8 - 2020-01-28
    +
    +### Fixed
    +- Fixed the `mobile` theme failing to load due to a bundling issue. #TINY-4613
    +- Fixed security issue related to parsing HTML comments and CDATA. #TINY-4544
    +
    +## 4.9.7 - 2019-12-19
    +
    +### Fixed
    +- Fixed the `visualchars` plugin converting HTML-like text to DOM elements in certain cases. #TINY-4507
    +- Fixed an issue with the `paste` plugin not sanitizing content in some cases. #TINY-4510
    +- Fixed HTML comments incorrectly being parsed in certain cases. #TINY-4511
    +
    +## 4.9.6 - 2019-09-02
    +
    +### Fixed
    +- Fixed image browse button sometimes displaying the browse window twice. #TINY-3959
    +
    +## 4.9.5 - 2019-07-02
    +
    +### Changed
    +- Changed annotations navigation to work the same as inline boundaries. #TINY-3396
    +
    +### Fixed
    +- Fixed the print plugin printing from the wrong window in IE11. #TINY-3762
    +- Fixed an exception being thrown when a file or number input has focus during initialization. Patch contributed by t00. #GH-2194
    +- Fixed positioning of the styleselect menu in iOS while using the mobile theme. #TINY-3505
    +- Fixed native context menu not showing with images in IE11. #TINY-3392
    +- Fixed selection incorrectly changing when programmatically setting selection on contenteditable false elements. #TINY-3766
    +- Fixed image browse button not working on touch devices. #TINY-3751
    +- Fixed so that nbsp entities aren't trimmed in white-space: pre-line elements. #TINY-3642
    +- Fixed space key properly inserts a nbsp before/after block elements. #TINY-3745
    +- Fixed infinite loop in the paste plugin when IE11 takes a long time to process paste events. Patch contributed by lRawd. #GH-4987
    +
    +## 4.9.4 - 2019-03-20
    +
    +### Fixed
    +- Fixed an issue where **Home/End** keys wouldn't move the caret correctly before or after `contenteditable=false` inline elements. #TINY-2995
    +- Fixed an issue where content may have been lost when using permanent bookmarks. #TINY-3400
    +- Fixed the mobile editor to clean up properly when removed. #TINY-3445
    +- Fixed an issue where retrieving the selected content as text didn't create newlines. #TINY-3197
    +- Fixed an issue where typing space between images would cause issues with nbsp not being inserted. #TINY-3346
    +
    +## 4.9.3 - 2019-01-31
    +
    +### Added
    +- Added a visualchars_default_state setting to the Visualchars Plugin. Patch contributed by mat3e.
    +
    +### Fixed
    +- Fixed a bug where scrolling on a page with more than one editor would cause a ResizeWindow event to fire. #TINY-3247
    +- Fixed a bug where if a plugin threw an error during initialisation the whole editor would fail to load. #TINY-3243
    +- Fixed a bug where getContent would include bogus elements when valid_elements setting was set up in a specific way. #TINY-3213
    +- Fixed a bug where only a few function key names could be used when creating keyboard shortcuts. #TINY-3146
    +- Fixed a bug where it wasn't possible to enter spaces into an editor after pressing shift+enter. #TINY-3099
    +- Fixed a bug where no caret would be rendered after backspacing to a contenteditable false element. #TINY-2998
    +- Fixed a bug where deletion to/from indented lists would leave list fragments in the editor. #TINY-2981
    +
    +## 4.9.2 - 2018-12-17
    +
    +### Fixed
    +- Fixed a bug with pressing the space key on IE 11 would result in nbsp characters being inserted between words at the end of a block. #TINY-2996
    +- Fixed a bug where character composition using quote and space on US International keyboards would produce a space instead of a quote. #TINY-2999
    +- Fixed a bug where remove format wouldn't remove the inner most inline element in some situations. #TINY-2982
    +- Fixed a bug where outdenting an list item would affect attributes on other list items within the same list. #TINY-2971
    +- Fixed a bug where the DomParser filters wouldn't be applied for elements created when parsing invalid html. #TINY-2978
    +- Fixed a bug where setProgressState wouldn't automatically close floating ui elements like menus. #TINY-2896
    +- Fixed a bug where it wasn't possible to navigate out of a figcaption element using the arrow keys. #TINY-2894
    +- Fixed a bug where enter key before an image inside a link would remove the image. #TINY-2780
    +
    +## 4.9.1 - 2018-12-04
    +
    +### Added
    +- Added functionality to insert html to the replacement feature of the Textpattern Plugin. #TINY-2839
    +
    +### Fixed
    +- Fixed a bug where `editor.selection.getContent({format: 'text'})` didn't work as expected in IE11 on an unfocused editor. #TINY-2862
    +- Fixed a bug in the Textpattern Plugin where the editor would get an incorrect selection after inserting a text pattern on Safari. #TINY-2838
    +- Fixed a bug where the space bar didn't work correctly in editors with the forced_root_block setting set to false. #TINY-2816
    +
    +## 4.9.0 - 2018-11-27
    +
    +### Added
    +- Added a replace feature to the Textpattern Plugin. #TINY-1908
    +- Added functionality to the Lists Plugin that improves the indentation logic. #TINY-1790
    +
    +### Fixed
    +- Fixed a bug where it wasn't possible to delete/backspace when the caret was between a contentEditable=false element and a BR. #TINY-2372
    +- Fixed a bug where copying table cells without a text selection would fail to copy anything. #TINY-1789
    +- Implemented missing `autosave_restore_when_empty` functionality in the Autosave Plugin. Patch contributed by gzzo. #GH-4447
    +- Reduced insertion of unnecessary nonbreaking spaces in the editor. #TINY-1879
    +
    +## 4.8.5 - 2018-10-30
    +
    +### Added
    +- Added a content_css_cors setting to the editor that adds the crossorigin="anonymous" attribute to link tags added by the StyleSheetLoader. #TINY-1909
    +
    +### Fixed
    +- Fixed a bug where trying to remove formatting with a collapsed selection range would throw an exception. #GH-4636
    +- Fixed a bug in the image plugin that caused updating figures to split contenteditable elements. #GH-4563
    +- Fixed a bug that was causing incorrect viewport calculations for fixed position UI elements. #TINY-1897
    +- Fixed a bug where inline formatting would cause the delete key to do nothing. #TINY-1900
    +
    +## 4.8.4 - 2018-10-23
    +
    +### Added
    +- Added support for the HTML5 `main` element. #TINY-1877
    +
    +### Changed
    +- Changed the keyboard shortcut to move focus to contextual toolbars to Ctrl+F9. #TINY-1812
    +
    +### Fixed
    +- Fixed a bug where content css could not be loaded from another domain. #TINY-1891
    +- Fixed a bug on FireFox where the cursor would get stuck between two contenteditable false inline elements located inside of the same block element divided by a BR. #TINY-1878
    +- Fixed a bug with the insertContent method where nonbreaking spaces would be inserted incorrectly. #TINY-1868
    +- Fixed a bug where the toolbar of the inline editor would not be visible in some scenarios. #TINY-1862
    +- Fixed a bug where removing the editor while more than one notification was open would throw an error. #TINY-1845
    +- Fixed a bug where the menubutton would be rendered on top of the menu if the viewport didn't have enough height. #TINY-1678
    +- Fixed a bug with the annotations api where annotating collapsed selections caused problems. #TBS-2449
    +- Fixed a bug where wbr elements were being transformed into whitespace when using the Paste Plugin's paste as text setting. #GH-4638
    +- Fixed a bug where the Search and Replace didn't replace spaces correctly. #GH-4632
    +- Fixed a bug with sublist items not persisting selection. #GH-4628
    +- Fixed a bug with mceInsertRawHTML command not working as expected. #GH-4625
    +
    +## 4.8.3 - 2018-09-13
    +
    +### Fixed
    +- Fixed a bug where the Wordcount Plugin didn't correctly count words within tables on IE11. #TINY-1770
    +- Fixed a bug where it wasn't possible to move the caret out of a table on IE11 and Firefox. #TINY-1682
    +- Fixed a bug where merging empty blocks didn't work as expected, sometimes causing content to be deleted. #TINY-1781
    +- Fixed a bug where the Textcolor Plugin didn't show the correct current color. #TINY-1810
    +- Fixed a bug where clear formatting with a collapsed selection would sometimes clear formatting from more content than expected. #TINY-1813 #TINY-1821
    +- Fixed a bug with the Table Plugin where it wasn't possible to keyboard navigate to the caption. #TINY-1818
    +
    +## 4.8.2 - 2018-08-09
    +
    +### Changed
    +- Moved annotator from "experimental" to "annotator" object on editor. #TBS-2398
    +- Improved the multiclick normalization across browsers. #TINY-1788
    +
    +### Fixed
    +- Fixed a bug where running getSelectedBlocks with a collapsed selection between block elements would produce incorrect results. #TINY-1787
    +- Fixed a bug where the ScriptLoaders loadScript method would not work as expected in FireFox when loaded on the same page as a ShadowDOM polyfill. #TINY-1786
    +- Removed reference to ShadowDOM event.path as Blink based browsers now support event.composedPath. #TINY-1785
    +- Fixed a bug where a reference to localStorage would throw an "access denied" error in IE11 with strict security settings. #TINY-1782
    +- Fixed a bug where pasting using the toolbar button on an inline editor in IE11 would cause a looping behaviour. #TINY-1768
    +
    +## 4.8.1 - 2018-07-26
    +
    +### Fixed
    +- Fixed a bug where the content of inline editors was being cleaned on every call of `editor.save()`. #TINY-1783
    +- Fixed a bug where the arrow of the Inlite Theme toolbar was being rendered incorrectly in RTL mode. #TINY-1776
    +- Fixed a bug with the Paste Plugin where pasting after inline contenteditable false elements moved the caret to the end of the line. #TINY-1758
    +
    +## 4.8.0 - 2018-06-27
    +
    +### Added
    +- Added new "experimental" object in editor, with initial Annotator API. #TBS-2374
    +
    +### Fixed
    +- Fixed a bug where deleting paragraphs inside of table cells would delete the whole table cell. #TINY-1759
    +- Fixed a bug in the Table Plugin where removing row height set on the row properties dialog did not update the table. #TINY-1730
    +- Fixed a bug with the font select toolbar item didn't update correctly. #TINY-1683
    +- Fixed a bug where all bogus elements would not be deleted when removing an inline editor. #TINY-1669
    +
    +## 4.7.13 - 2018-05-16
    +
    +### Added
    +- Added missing code menu item from the default menu config. #TINY-1648
    +- Added new align button for combining the separate align buttons into a menu button. #TINY-1652
    +
    +### Fixed
    +- Fixed a bug where Edge 17 wouldn't be able to select images or tables. #TINY-1679
    +- Fixed issue where whitespace wasn't preserved when the editor was initialized on pre elements. #TINY-1649
    +- Fixed a bug with the fontselect dropdowns throwing an error if the editor was hidden in Firefox. #TINY-1664
    +- Fixed a bug where it wasn't possible to merge table cells on IE 11. #TINY-1671
    +- Fixed a bug where textcolor wasn't applying properly on IE 11 in some situations. #TINY-1663
    +- Fixed a bug where the justifyfull command state wasn't working correctly. #TINY-1677
    +- Fixed a bug where the styles wasn't updated correctly when resizing some tables. #TINY-1668
    +
    +## 4.7.12 - 2018-05-03
    +
    +### Added
    +- Added an option to filter out image svg data urls.
    +- Added support for html5 details and summary elements.
    +
    +### Changed
    +- Changed so the mce-abs-layout-item css rule targets html instead of body. Patch contributed by nazar-pc.
    +
    +### Fixed
    +- Fixed a bug where the "read" step on the mobile theme was still present on android mobile browsers.
    +- Fixed a bug where all images in the editor document would reload on any editor change.
    +- Fixed a bug with the Table Plugin where ObjectResized event wasn't being triggered on column resize.
    +- Fixed so the selection is set to the first suitable caret position after editor.setContent called.
    +- Fixed so links with xlink:href attributes are filtered correctly to prevent XSS.
    +- Fixed a bug on IE11 where pasting content into an inline editor initialized on a heading element would create new editable elements.
    +- Fixed a bug where readonly mode would not work as expected when the editor contained contentEditable=true elements.
    +- Fixed a bug where the Link Plugin would throw an error when used together with the webcomponents polyfill. Patch contributed by 4esnog.
    +- Fixed a bug where the "Powered by TinyMCE" branding link would break on XHTML pages. Patch contributed by tistre.
    +- Fixed a bug where the same id would be used in the blobcache for all pasted images. Patch contributed by thorn0.
    +
    +## 4.7.11 - 2018-04-11
    +
    +### Added
    +- Added a new imagetools_credentials_hosts option to the Imagetools Plugin.
    +
    +### Fixed
    +- Fixed a bug where toggling a list containing empty LIs would throw an error. Patch contributed by bradleyke.
    +- Fixed a bug where applying block styles to a text with the caret at the end of the paragraph would select all text in the paragraph.
    +- Fixed a bug where toggling on the Spellchecker Plugin would trigger isDirty on the editor.
    +- Fixed a bug where it was possible to enter content into selection bookmark spans.
    +- Fixed a bug where if a non paragraph block was configured in forced_root_block the editor.getContent method would return incorrect values with an empty editor.
    +- Fixed a bug where dropdown menu panels stayed open and fixed in position when dragging dialog windows.
    +- Fixed a bug where it wasn't possible to extend table cells with the space button in Safari.
    +- Fixed a bug where the setupeditor event would thrown an error when using the Compat3x Plugin.
    +- Fixed a bug where an error was thrown in FontInfo when called on a detached element.
    +
    +## 4.7.10 - 2018-04-03
    +
    +### Added
    +- Added normalization of triple clicks across browsers in the editor.
    +- Added a `hasFocus` method to the editor that checks if the editor has focus.
    +- Added correct icon to the Nonbreaking Plugin menu item.
    +
    +### Fixed
    +- Fixed so the `getContent`/`setContent` methods work even if the editor is not initialized.
    +- Fixed a bug with the Media Plugin where query strings were being stripped from youtube links.
    +- Fixed a bug where image styles were changed/removed when opening and closing the Image Plugin dialog.
    +- Fixed a bug in the Table Plugin where some table cell styles were not correctly added to the content html.
    +- Fixed a bug in the Spellchecker Plugin where it wasn't possible to change the spellchecker language.
    +- Fixed so the the unlink action in the Link Plugin has a menu item and can be added to the contextmenu.
    +- Fixed a bug where it wasn't possible to keyboard navigate to the start of an inline element on a new line within the same block element.
    +- Fixed a bug with the Text Color Plugin where if used with an inline editor located at the bottom of the screen the colorpicker could appear off screen.
    +- Fixed a bug with the UndoManager where undo levels were being added for nbzwsp characters.
    +- Fixed a bug with the Table Plugin where the caret would sometimes be lost when keyboard navigating up through a table.
    +- Fixed a bug where FontInfo.getFontFamily would throw an error when called on a removed editor.
    +- Fixed a bug in Firefox where undo levels were not being added correctly for some specific operations.
    +- Fixed a bug where initializing an inline editor inside of a table would make the whole table resizeable.
    +- Fixed a bug where the fake cursor that appears next to tables on Firefox was positioned incorrectly when switching to fullscreen.
    +- Fixed a bug where zwsp's weren't trimmed from the output from `editor.getContent({ format: 'text' })`.
    +- Fixed a bug where the fontsizeselect/fontselect toolbar items showed the body info rather than the first possible caret position info on init.
    +- Fixed a bug where it wasn't possible to select all content if the editor only contained an inline boundary element.
    +- Fixed a bug where `content_css` urls with query strings wasn't working.
    +- Fixed a bug in the Table Plugin where some table row styles were removed when changing other styles in the row properties dialog.
    +
    +### Removed
    +- Removed the "read" step from the mobile theme.
    +
    +## 4.7.9 - 2018-02-27
    +
    +### Fixed
    +- Fixed a bug where the editor target element didn't get the correct style when removing the editor.
    +
    +## 4.7.8 - 2018-02-26
    +
    +### Fixed
    +- Fixed an issue with the Help Plugin where the menuitem name wasn't lowercase.
    +- Fixed an issue on MacOS where text and bold text did not have the same line-height in the autocomplete dropdown in the Link Plugin dialog.
    +- Fixed a bug where the "paste as text" option in the Paste Plugin didn't work.
    +- Fixed a bug where dialog list boxes didn't get positioned correctly in documents with scroll.
    +- Fixed a bug where the Inlite Theme didn't use the Table Plugin api to insert correct tables.
    +- Fixed a bug where the Inlite Theme panel didn't hide on blur in a correct way.
    +- Fixed a bug where placing the cursor before a table in Firefox would scroll to the bottom of the table.
    +- Fixed a bug where selecting partial text in table cells with rowspans and deleting would produce faulty tables.
    +- Fixed a bug where the Preview Plugin didn't work on Safari due to sandbox security.
    +- Fixed a bug where table cell selection using the keyboard threw an error.
    +- Fixed so the font size and font family doesn't toggle the text but only sets the selected format on the selected text.
    +- Fixed so the built-in spellchecking on Chrome and Safari creates an undo level when replacing words.
    +
    +## 4.7.7 - 2018-02-19
    +
    +### Added
    +- Added a border style selector to the advanced tab of the Image Plugin.
    +- Added better controls for default table inserted by the Table Plugin.
    +- Added new `table_responsive_width` option to the Table Plugin that controls whether to use pixel or percentage widths.
    +
    +### Fixed
    +- Fixed a bug where the Link Plugin text didn't update when a URL was pasted using the context menu.
    +- Fixed a bug with the Spellchecker Plugin where using "Add to dictionary" in the context menu threw an error.
    +- Fixed a bug in the Media Plugin where the preview node for iframes got default width and height attributes that interfered with width/height styles.
    +- Fixed a bug where backslashes were being added to some font family names in Firefox in the fontselect toolbar item.
    +- Fixed a bug where errors would be thrown when trying to remove an editor that had not yet been fully initialized.
    +- Fixed a bug where the Imagetools Plugin didn't update the images atomically.
    +- Fixed a bug where the Fullscreen Plugin was throwing errors when being used on an inline editor.
    +- Fixed a bug where drop down menus weren't positioned correctly in inline editors on scroll.
    +- Fixed a bug with a semicolon missing at the end of the bundled javascript files.
    +- Fixed a bug in the Table Plugin with cursor navigation inside of tables where the cursor would sometimes jump into an incorrect table cells.
    +- Fixed a bug where indenting a table that is a list item using the "Increase indent" button would create a nested table.
    +- Fixed a bug where text nodes containing only whitespace were being wrapped by paragraph elements.
    +- Fixed a bug where whitespace was being inserted after br tags inside of paragraph tags.
    +- Fixed a bug where converting an indented paragraph to a list item would cause the list item to have extra padding.
    +- Fixed a bug where Copy/Paste in an editor with a lot of content would cause the editor to scroll to the top of the content in IE11.
    +- Fixed a bug with a memory leak in the DragHelper. Path contributed by ben-mckernan.
    +- Fixed a bug where the advanced tab in the Media Plugin was being shown even if it didn't contain anything. Patch contributed by gabrieeel.
    +- Fixed an outdated eventname in the EventUtils. Patch contributed by nazar-pc.
    +- Fixed an issue where the Json.parse function would throw an error when being used on a page with strict CSP settings.
    +- Fixed so you can place the curser before and after table elements within the editor in Firefox and Edge/IE.
    +
    +## 4.7.6 - 2018-01-29
    +
    +### Fixed
    +- Fixed a bug in the jquery integration where it threw an error saying that "global is not defined".
    +- Fixed a bug where deleting a table cell whose previous sibling was set to contenteditable false would create a corrupted table.
    +- Fixed a bug where highlighting text in an unfocused editor did not work correctly in IE11/Edge.
    +- Fixed a bug where the table resize handles were not being repositioned when activating the Fullscreen Plugin.
    +- Fixed a bug where the Imagetools Plugin dialog didn't honor editor RTL settings.
    +- Fixed a bug where block elements weren't being merged correctly if you deleted from after a contenteditable false element to the beginning of another block element.
    +- Fixed a bug where TinyMCE didn't work with module loaders like webpack.
    +
    +## 4.7.5 - 2018-01-22
    +
    +### Fixed
    +- Fixed bug with the Codesample Plugin where it wasn't possible to edit codesamples when the editor was in inline mode.
    +- Fixed bug where focusing on the status bar broke the keyboard navigation functionality.
    +- Fixed bug where an error would be thrown on Edge by the Table Plugin when pasting using the PowerPaste Plugin.
    +- Fixed bug in the Table Plugin where selecting row border style from the dropdown menu in advanced row properties would throw an error.
    +- Fixed bug with icons being rendered incorrectly on Chrome on Mac OS.
    +- Fixed bug in the Textcolor Plugin where the font color and background color buttons wouldn't trigger an ExecCommand event.
    +- Fixed bug in the Link Plugin where the url field wasn't forced LTR.
    +- Fixed bug where the Nonbreaking Plugin incorrectly inserted spaces into tables.
    +- Fixed bug with the inline theme where the toolbar wasn't repositioned on window resize.
    +
    +## 4.7.4 - 2017-12-05
    +
    +### Fixed
    +- Fixed bug in the Nonbreaking Plugin where the nonbreaking_force_tab setting was being ignored.
    +- Fixed bug in the Table Plugin where changing row height incorrectly converted column widths to pixels.
    +- Fixed bug in the Table Plugin on Edge and IE11 where resizing the last column after resizing the table would cause invalid column heights.
    +- Fixed bug in the Table Plugin where keyboard navigation was not normalized between browsers.
    +- Fixed bug in the Table Plugin where the colorpicker button would show even without defining the colorpicker_callback.
    +- Fixed bug in the Table Plugin where it wasn't possible to set the cell background color.
    +- Fixed bug where Firefox would throw an error when intialising an editor on an element that is hidden or not yet added to the DOM.
    +- Fixed bug where Firefox would throw an error when intialising an editor inside of a hidden iframe.
    +
    +## 4.7.3 - 2017-11-23
    +
    +### Added
    +- Added functionality to open the Codesample Plugin dialog when double clicking on a codesample. Patch contributed by dakuzen.
    +
    +### Fixed
    +- Fixed bug where undo/redo didn't work correctly with some formats and caret positions.
    +- Fixed bug where the color picker didn't show up in Table Plugin dialogs.
    +- Fixed bug where it wasn't possible to change the width of a table through the Table Plugin dialog.
    +- Fixed bug where the Charmap Plugin couldn't insert some special characters.
    +- Fixed bug where editing a newly inserted link would not actually edit the link but insert a new link next to it.
    +- Fixed bug where deleting all content in a table cell made it impossible to place the caret into it.
    +- Fixed bug where the vertical alignment field in the Table Plugin cell properties dialog didn't do anything.
    +- Fixed bug where an image with a caption showed two sets of resize handles in IE11.
    +- Fixed bug where pressing the enter button inside of an h1 with contenteditable set to true would sometimes produce a p tag.
    +- Fixed bug with backspace not working as expected before a noneditable element.
    +- Fixed bug where operating on tables with invalid rowspans would cause an error to be thrown.
    +- Fixed so a real base64 representation of the image is available on the blobInfo that the images_upload_handler gets called with.
    +- Fixed so the image upload tab is available when the images_upload_handler is defined (and not only when the images_upload_url is defined).
    +
    +## 4.7.2 - 2017-11-07
    +
    +### Added
    +- Added newly rewritten Table Plugin.
    +- Added support for attributes with colon in valid_elements and addValidElements.
    +- Added support for dailymotion short url in the Media Plugin. Patch contributed by maat8.
    +- Added support for converting to half pt when converting font size from px to pt. Patch contributed by danny6514.
    +- Added support for location hash to the Autosave plugin to make it work better with SPAs using hash routing.
    +- Added support for merging table cells when pasting a table into another table.
    +
    +### Changed
    +- Changed so the language packs are only loaded once. Patch contributed by 0xor1.
    +- Simplified the css for inline boundaries selection by switching to an attribute selector.
    +
    +### Fixed
    +- Fixed bug where an error would be thrown on editor initialization if the window.getSelection() returned null.
    +- Fixed bug where holding down control or alt keys made the keyboard navigation inside an inline boundary not work as expected.
    +- Fixed bug where applying formats in IE11 produced extra, empty paragraphs in the editor.
    +- Fixed bug where the Word Count Plugin didn't count some mathematical operators correctly.
    +- Fixed bug where removing an inline editor removed the element that the editor had been initialized on.
    +- Fixed bug where setting the selection to the end of an editable container caused some formatting problems.
    +- Fixed bug where an error would be thrown sometimes when an editor was removed because of the selection bookmark was being stored asynchronously.
    +- Fixed a bug where an editor initialized on an empty list did not contain any valid cursor positions.
    +- Fixed a bug with the Context Menu Plugin and webkit browsers on Mac where right-clicking inside a table would produce an incorrect selection.
    +- Fixed bug where the Image Plugin constrain proportions setting wasn't working as expected.
    +- Fixed bug where deleting the last character in a span with decorations produced an incorrect element when typing.
    +- Fixed bug where focusing on inline editors made the toolbar flicker when moving between elements quickly.
    +- Fixed bug where the selection would be stored incorrectly in inline editors when the mouseup event was fired outside the editor body.
    +- Fixed bug where toggling bold at the end of an inline boundary would toggle off the whole word.
    +- Fixed bug where setting the skin to false would not stop the loading of some skin css files.
    +- Fixed bug in mobile theme where pinch-to-zoom would break after exiting the editor.
    +- Fixed bug where sublists of a fully selected list would not be switched correctly when changing list style.
    +- Fixed bug where inserting media by source would break the UndoManager.
    +- Fixed bug where inserting some content into the editor with a specific selection would replace some content incorrectly.
    +- Fixed bug where selecting all content with ctrl+a in IE11 caused problems with untoggling some formatting.
    +- Fixed bug where the Search and Replace Plugin left some marker spans in the editor when undoing and redoing after replacing some content.
    +- Fixed bug where the editor would not get a scrollbar when using the Fullscreen and Autoresize plugins together.
    +- Fixed bug where the font selector would stop working correctly after selecting fonts three times.
    +- Fixed so pressing the enter key inside of an inline boundary inserts a br after the inline boundary element.
    +- Fixed a bug where it wasn't possible to use tab navigation inside of a table that was inside of a list.
    +- Fixed bug where end_container_on_empty_block would incorrectly remove elements.
    +- Fixed bug where content_styles weren't added to the Preview Plugin iframe.
    +- Fixed so the beforeSetContent/beforeGetContent events are preventable.
    +- Fixed bug where changing height value in Table Plugin advanced tab didn't do anything.
    +- Fixed bug where it wasn't possible to remove formatting from content in beginning of table cell.
    +
    +## 4.7.1 - 2017-10-09
    +
    +### Fixed
    +- Fixed bug where theme set to false on an inline editor produced an extra div element after the target element.
    +- Fixed bug where the editor drag icon was misaligned with the branding set to false.
    +- Fixed bug where doubled menu items were not being removed as expected with the removed_menuitems setting.
    +- Fixed bug where the Table of contents plugin threw an error when initialized.
    +- Fixed bug where it wasn't possible to add inline formats to text selected right to left.
    +- Fixed bug where the paste from plain text mode did not work as expected.
    +- Fixed so the style previews do not set color and background color when selected.
    +- Fixed bug where the Autolink plugin didn't work as expected with some formats applied on an empty editor.
    +- Fixed bug where the Textpattern plugin were throwing errors on some patterns.
    +- Fixed bug where the Save plugin saved all editors instead of only the active editor. Patch contributed by dannoe.
    +
    +## 4.7.0 - 2017-10-03
    +
    +### Added
    +- Added new mobile ui that is specifically designed for mobile devices.
    +
    +### Changed
    +- Updated the default skin to be more modern and white since white is preferred by most implementations.
    +- Restructured the default menus to be more similar to common office suites like Google Docs.
    +
    +### Fixed
    +- Fixed so theme can be set to false on both inline and iframe editor modes.
    +- Fixed bug where inline editor would add/remove the visualblocks css multiple times.
    +- Fixed bug where selection wouldn't be properly restored when editor lost focus and commands where invoked.
    +- Fixed bug where toc plugin would generate id:s for headers even though a toc wasn't inserted into the content.
    +- Fixed bug where is wasn't possible to drag/drop contents within the editor if paste_data_images where set to true.
    +- Fixed bug where getParam and close in WindowManager would get the first opened window instead of the last opened window.
    +- Fixed bug where delete would delete between cells inside a table in Firefox.
    +
    +## 4.6.7 - 2017-09-18
    +
    +### Added
    +- Added some missing translations to Image, Link and Help plugins.
    +
    +### Fixed
    +- Fixed bug where paste wasn't working in IOS.
    +- Fixed bug where the Word Count Plugin didn't count some mathematical operators correctly.
    +- Fixed bug where inserting a list in a table caused the cell to expand in height.
    +- Fixed bug where pressing enter in a list located inside of a table deleted list items instead of inserting new list item.
    +- Fixed bug where copy and pasting table cells produced inconsistent results.
    +- Fixed bug where initializing an editor with an ID of 'length' would throw an exception.
    +- Fixed bug where it was possible to split a non merged table cell.
    +- Fixed bug where copy and pasting a list with a very specific selection into another list would produce a nested list.
    +- Fixed bug where copy and pasting ordered lists sometimes produced unordered lists.
    +- Fixed bug where padded elements inside other elements would be treated as empty.
    +- Fixed so you can resize images inside a figure element.
    +- Fixed bug where an inline TinyMCE editor initialized on a table did not set selection on load in Chrome.
    +- Fixed the positioning of the inlite toolbar when the target element wasn't big enough to fit the toolbar.
    +
    +## 4.6.6 - 2017-08-30
    +
    +### Fixed
    +- Fixed so that notifications wrap long text content instead of bleeding outside the notification element.
    +- Fixed so the content_style css is added after the skin and custom stylesheets.
    +- Fixed bug where it wasn't possible to remove a table with the Cut button.
    +- Fixed bug where the center format wasn't getting the same font size as the other formats in the format preview.
    +- Fixed bug where the wordcount plugin wasn't counting hyphenated words correctly.
    +- Fixed bug where all content pasted into the editor was added to the end of the editor.
    +- Fixed bug where enter keydown on list item selection only deleted content and didn't create a new line.
    +- Fixed bug where destroying the editor while the content css was still loading caused error notifications on Firefox.
    +- Fixed bug where undoing cut operation in IE11 left some unwanted html in the editor content.
    +- Fixed bug where enter keydown would throw an error in IE11.
    +- Fixed bug where duplicate instances of an editor were added to the editors array when using the createEditor API.
    +- Fixed bug where the formatter applied formats on the wrong content when spellchecker was activated.
    +- Fixed bug where switching formats would reset font size on child nodes.
    +- Fixed bug where the table caption element weren't always the first descendant to the table tag.
    +- Fixed bug where pasting some content into the editor on chrome some newlines were removed.
    +- Fixed bug where it wasn't possible to remove a list if a list item was a table element.
    +- Fixed bug where copy/pasting partial selections of tables wouldn't produce a proper table.
    +- Fixed bug where the searchreplace plugin could not find consecutive spaces.
    +- Fixed bug where background color wasn't applied correctly on some partially selected contents.
    +
    +## 4.6.5 - 2017-08-02
    +
    +### Added
    +- Added new inline_boundaries_selector that allows you to specify the elements that should have boundaries.
    +- Added new local upload feature this allows the user to upload images directly from the image dialog.
    +- Added a new api for providing meta data for plugins. It will show up in the help dialog if it's provided.
    +
    +### Fixed
    +- Fixed so that the notifications created by the notification manager are more screen reader accessible.
    +- Fixed bug where changing the list format on multiple selected lists didn't change all of the lists.
    +- Fixed bug where the nonbreaking plugin would insert multiple undo levels when pressing the tab key.
    +- Fixed bug where delete/backspace wouldn't render a caret when all editor contents where deleted.
    +- Fixed bug where delete/backspace wouldn't render a caret if the deleted element was a single contentEditable false element.
    +- Fixed bug where the wordcount plugin wouldn't count words correctly if word where typed after applying a style format.
    +- Fixed bug where the wordcount plugin would count mathematical formulas as multiple words for example 1+1=2.
    +- Fixed bug where formatting of triple clicked blocks on Chrome/Safari would result in styles being added outside the visual selection.
    +- Fixed bug where paste would add the contents to the end of the editor area when inline mode was used.
    +- Fixed bug where toggling off bold formatting on text entered in a new paragraph would add an extra line break.
    +- Fixed bug where autolink plugin would only produce a link on every other consecutive link on Firefox.
    +- Fixed bug where it wasn't possible to select all contents if the content only had one pre element.
    +- Fixed bug where sizzle would produce lagging behavior on some sites due to repaints caused by feature detection.
    +- Fixed bug where toggling off inline formats wouldn't include the space on selected contents with leading or trailing spaces.
    +- Fixed bug where the cut operation in UI wouldn't work in Chrome.
    +- Fixed bug where some legacy editor initialization logic would throw exceptions about editor settings not being defined.
    +- Fixed bug where it wasn't possible to apply text color to links if they where part of a non collapsed selection.
    +- Fixed bug where an exception would be thrown if the user selected a video element and then moved the focus outside the editor.
    +- Fixed bug where list operations didn't work if there where block elements inside the list items.
    +- Fixed bug where applying block formats to lists wrapped in block elements would apply to all elements in that wrapped block.
    +
    +## 4.6.4 - 2017-06-13
    +
    +### Fixed
    +- Fixed bug where the editor would move the caret when clicking on the scrollbar next to a content editable false block.
    +- Fixed bug where the text color select dropdowns wasn't placed correctly when they didn't fit the width of the screen.
    +- Fixed bug where the default editor line height wasn't working for mixed font size contents.
    +- Fixed bug where the content css files for inline editors were loaded multiple times for multiple editor instances.
    +- Fixed bug where the initial value of the font size/font family dropdowns wasn't displayed.
    +- Fixed bug where the I18n api was not supporting arrays as the translation replacement values.
    +- Fixed bug where chrome would display "The given range isn't in document." errors for invalid ranges passed to setRng.
    +- Fixed bug where the compat3x plugin wasn't working since the global tinymce references wasn't resolved correctly.
    +- Fixed bug where the preview plugin wasn't encoding the base url passed into the iframe contents producing a xss bug.
    +- Fixed bug where the dom parser/serializer wasn't handling some special elements like noframes, title and xmp.
    +- Fixed bug where the dom parser/serializer wasn't handling cdata sections with comments inside.
    +- Fixed bug where the editor would scroll to the top of the editable area if a dialog was closed in inline mode.
    +- Fixed bug where the link dialog would not display the right rel value if rel_list was configured.
    +- Fixed bug where the context menu would select images on some platforms but not others.
    +- Fixed bug where the filenames of images were not retained on dragged and drop into the editor from the desktop.
    +- Fixed bug where the paste plugin would misrepresent newlines when pasting plain text and having forced_root_block configured.
    +- Fixed so that the error messages for the imagetools plugin is more human readable.
    +- Fixed so the internal validate setting for the parser/serializer can't be set from editor initialization settings.
    +
    +## 4.6.3 - 2017-05-30
    +
    +### Fixed
    +- Fixed bug where the arrow keys didn't work correctly when navigating on nested inline boundary elements.
    +- Fixed bug where delete/backspace didn't work correctly on nested inline boundary elements.
    +- Fixed bug where image editing didn't work on subsequent edits of the same image.
    +- Fixed bug where charmap descriptions wouldn't properly wrap if they exceeded the width of the box.
    +- Fixed bug where the default image upload handler only accepted 200 as a valid http status code.
    +- Fixed so rel on target=_blank links gets forced with only noopener instead of both noopener and noreferrer.
    +
    +## 4.6.2 - 2017-05-23
    +
    +### Fixed
    +- Fixed bug where the SaxParser would run out of memory on very large documents.
    +- Fixed bug with formatting like font size wasn't applied to del elements.
    +- Fixed bug where various api calls would be throwing exceptions if they where invoked on a removed editor instance.
    +- Fixed bug where the branding position would be incorrect if the editor was inside a hidden tab and then later showed.
    +- Fixed bug where the color levels feature in the imagetools dialog wasn't working properly.
    +- Fixed bug where imagetools dialog wouldn't pre-load images from CORS domains, before trying to prepare them for editing.
    +- Fixed bug where the tab key would move the caret to the next table cell if being pressed inside a list inside a table.
    +- Fixed bug where the cut/copy operations would loose parent context like the current format etc.
    +- Fixed bug with format preview not working on invalid elements excluded by valid_elements.
    +- Fixed bug where blocks would be merged in incorrect order on backspace/delete.
    +- Fixed bug where zero length text nodes would cause issues with the undo logic if there where iframes present.
    +- Fixed bug where the font size/family select lists would throw errors if the first node was a comment.
    +- Fixed bug with csp having to allow local script evaluation since it was used to detect global scope.
    +- Fixed bug where CSP required a relaxed option for javascript: URLs in unsupported legacy browsers.
    +- Fixed bug where a fake caret would be rendered for td with the contenteditable=false.
    +- Fixed bug where typing would be blocked on IE 11 when within a nested contenteditable=true/false structure.
    +
    +## 4.6.1 - 2017-05-10
    +
    +### Added
    +- Added configuration option to list plugin to disable tab indentation.
    +
    +### Fixed
    +- Fixed bug where format change on very specific content could cause the selection to change.
    +- Fixed bug where TinyMCE could not be lazyloaded through jquery integration.
    +- Fixed bug where entities in style attributes weren't decoded correctly on paste in webkit.
    +- Fixed bug where fontsize_formats option had been renamed incorrectly.
    +- Fixed bug with broken backspace/delete behaviour between contenteditable=false blocks.
    +- Fixed bug where it wasn't possible to backspace to the previous line with the inline boundaries functionality turned on.
    +- Fixed bug where is wasn't possible to move caret left and right around a linked image with the inline boundaries functionality turned on.
    +- Fixed bug where pressing enter after/before hr element threw exception. Patch contributed bradleyke.
    +- Fixed so the CSS in the visualblocks plugin doesn't overwrite background color. Patch contributed by Christian Rank.
    +- Fixed bug where multibyte characters weren't encoded correctly. Patch contributed by James Tarkenton.
    +- Fixed bug where shift-click to select within contenteditable=true fields wasn't working.
    +
    +## 4.6.0 - 2017-05-04
    +
    +### Added
    +- Added an inline boundary caret position feature that makes it easier to type at the beginning/end of links/code elements.
    +- Added a help plugin that adds a button and a dialog showing the editor shortcuts and loaded plugins.
    +- Added an inline_boundaries option that allows you to disable the inline boundary feature if it's not desired.
    +- Added a new ScrollIntoView event that allows you to override the default scroll to element behavior.
    +- Added role and aria- attributes as valid elements in the default valid elements config.
    +- Added new internal flag for PastePreProcess/PastePostProcess this is useful to know if the paste was coming from an external source.
    +- Added new ignore function to UndoManager this works similar to transact except that it doesn't add an undo level by default.
    +
    +### Fixed
    +- Fixed so that urls gets retained for images when being edited. This url is then passed on to the upload handler.
    +- Fixed so that the editors would be initialized on readyState interactive instead of complete.
    +- Fixed so that the init event of the editor gets fired once all contentCSS files have been properly loaded.
    +- Fixed so that width/height of the editor gets taken from the textarea element if it's explicitly specified in styles.
    +- Fixed so that keep_styles set to false no longer clones class/style from the previous paragraph on enter.
    +- Fixed so that the default line-height is 1.2em to avoid zwnbsp characters from producing text rendering glitches on Windows.
    +- Fixed so that loading errors of content css gets presented by a notification message.
    +- Fixed so figure image elements can be linked when selected this wraps the figure image in a anchor element.
    +- Fixed bug where it wasn't possible to copy/paste rows with colspans by using the table copy/paste feature.
    +- Fixed bug where the protect setting wasn't properly applied to header/footer parts when using the fullpage plugin.
    +- Fixed bug where custom formats that specified upper case element names where not applied correctly.
    +- Fixed bug where some screen readers weren't reading buttons due to an aria specific fix for IE 8.
    +- Fixed bug where cut wasn't working correctly on iOS due to it's clipboard API not working correctly.
    +- Fixed bug where Edge would paste div elements instead of paragraphs when pasting plain text.
    +- Fixed bug where the textpattern plugin wasn't dealing with trailing punctuations correctly.
    +- Fixed bug where image editing would some times change the image format from jpg to png.
    +- Fixed bug where some UI elements could be inserted into the toolbar even if they where not registered.
    +- Fixed bug where it was possible to click the TD instead of the character in the character map and that caused an exception.
    +- Fixed bug where the font size/font family dropdowns would sometimes show an incorrect value due to css not being loaded in time.
    +- Fixed bug with the media plugin inserting undefined instead of retaining size when media_dimensions was set to false.
    +- Fixed bug with deleting images when forced_root_blocks where set to false.
    +- Fixed bug where input focus wasn't properly handled on nested content editable elements.
    +- Fixed bug where Chrome/Firefox would throw an exception when selecting images due to recent change of setBaseAndExtent support.
    +- Fixed bug where malformed blobs would throw exceptions now they are simply ignored.
    +- Fixed bug where backspace/delete wouldn't work properly in some cases where all contents was selected in WebKit.
    +- Fixed bug with Angular producing errors since it was expecting events objects to be patched with their custom properties.
    +- Fixed bug where the formatter would apply formatting to spellchecker errors now all bogus elements are excluded.
    +- Fixed bug with backspace/delete inside table caption elements wouldn't behave properly on IE 11.
    +- Fixed bug where typing after a contenteditable false inline element could move the caret to the end of that element.
    +- Fixed bug where backspace before/after contenteditable false blocks wouldn't properly remove the right element.
    +- Fixed bug where backspace before/after contenteditable false inline elements wouldn't properly empty the current block element.
    +- Fixed bug where vertical caret navigation with a custom line-height would sometimes match incorrect positions.
    +- Fixed bug with paste on Edge where character encoding wasn't handled properly due to a browser bug.
    +- Fixed bug with paste on Edge where extra fragment data was inserted into the contents when pasting.
    +- Fixed bug with pasting contents when having a whole block element selected on WebKit could cause WebKit spans to appear.
    +- Fixed bug where the visualchars plugin wasn't working correctly showing invisible nbsp characters.
    +- Fixed bug where browsers would hang if you tried to load some malformed html contents.
    +- Fixed bug where the init call promise wouldn't resolve if the specified selector didn't find any matching elements.
    +- Fixed bug where the Schema isValidChild function was case sensitive.
    +
    +### Removed
    +- Dropped support for IE 8-10 due to market share and lack of support from Microsoft. See tinymce docs for details.
    +
    +## 4.5.3 - 2017-02-01
    +
    +### Added
    +- Added keyboard navigation for menu buttons when the menu is in focus.
    +- Added api to the list plugin for setting custom classes/attributes on lists.
    +- Added validation for the anchor plugin input field according to W3C id naming specifications.
    +
    +### Fixed
    +- Fixed bug where media placeholders were removed after resize with the forced_root_block setting set to false.
    +- Fixed bug where deleting selections with similar sibling nodes sometimes deleted the whole document.
    +- Fixed bug with inlite theme where several toolbars would appear scrolling when more than one instance of the editor was in use.
    +- Fixed bug where the editor would throw error with the fontselect plugin on hidden editor instances in Firefox.
    +- Fixed bug where the background color would not stretch to the font size.
    +- Fixed bug where font size would be removed when changing background color.
    +- Fixed bug where the undomanager trimmed away whitespace between nodes on undo/redo.
    +- Fixed bug where media_dimensions=false in media plugin caused the editor to throw an error.
    +- Fixed bug where IE was producing font/u elements within links on paste.
    +- Fixed bug where some button tooltips were broken when compat3x was in use.
    +- Fixed bug where backspace/delete/typeover would remove the caption element.
    +- Fixed bug where powerspell failed to function when compat3x was enabled.
    +- Fixed bug where it wasn't possible to apply sub/sup on text with large font size.
    +- Fixed bug where pre tags with spaces weren't treated as content.
    +- Fixed bug where Meta+A would select the entire document instead of all contents in nested ce=true elements.
    +
    +## 4.5.2 - 2017-01-04
    +
    +### Fixed
    +- Added missing keyboard shortcut description for the underline menu item in the format menu.
    +- Fixed bug where external blob urls wasn't properly handled by editor upload logic. Patch contributed by David Oviedo.
    +- Fixed bug where urls wasn't treated as a single word by the wordcount plugin.
    +- Fixed bug where nbsp characters wasn't treated as word delimiters by the wordcount plugin.
    +- Fixed bug where editor instance wasn't properly passed to the format preview logic. Patch contributed by NullQuery.
    +- Fixed bug where the fake caret wasn't hidden when you moved selection to a cE=false element.
    +- Fixed bug where it wasn't possible to edit existing code sample blocks.
    +- Fixed bug where it wasn't possible to delete editor contents if the selection included an empty block.
    +- Fixed bug where the formatter wasn't expanding words on some international characters. Patch contributed by Martin Larochelle.
    +- Fixed bug where the open link feature wasn't working correctly on IE 11.
    +- Fixed bug where enter before/after a cE=false block wouldn't properly padd the paragraph with an br element.
    +- Fixed so font size and font family select boxes always displays a value by using the runtime style as a fallback.
    +- Fixed so missing plugins will be logged to console as warnings rather than halting the initialization of the editor.
    +- Fixed so splitbuttons become normal buttons in advlist plugin if styles are empty. Patch contributed by René Schleusner.
    +- Fixed so you can multi insert rows/cols by selecting table cells and using insert rows/columns.
    +
    +## 4.5.1 - 2016-12-07
    +
    +### Fixed
    +- Fixed bug where the lists plugin wouldn't initialize without the advlist plugins if served from cdn.
    +- Fixed bug where selectors with "*" would cause the style format preview to throw an error.
    +- Fixed bug with toggling lists off on lists with empty list items would throw an error.
    +- Fixed bug where editing images would produce non existing blob uris.
    +- Fixed bug where the offscreen toc selection would be treated as the real toc element.
    +- Fixed bug where the aria level attribute for element path would have an incorrect start index.
    +- Fixed bug where the offscreen selection of cE=false that where very wide would be shown onscreen. Patch contributed by Steven Bufton.
    +- Fixed so the default_link_target gets applied to links created by the autolink plugin.
    +- Fixed so that the name attribute gets removed by the anchor plugin if editing anchors.
    +
    +## 4.5.0 - 2016-11-23
    +
    +### Added
    +- Added new toc plugin allows you to insert table of contents based on editor headings.
    +- Added new auto complete menu to all url fields. Adds history, link to anchors etc.
    +- Added new sidebar api that allows you to add custom sidebar panels and buttons to toggle these.
    +- Added new insert menu button that allows you to have multiple insert functions under the same menu button.
    +- Added new open link feature to ctrl+click, alt+enter and context menu.
    +- Added new media_embed_handler option to allow the media plugin to be populated with custom embeds.
    +- Added new support for editing transparent images using the image tools dialog.
    +- Added new images_reuse_filename option to allow filenames of images to be retained for upload.
    +- Added new security feature where links with target="_blank" will by default get rel="noopener noreferrer".
    +- Added new allow_unsafe_link_target to allow you to opt-out of the target="_blank" security feature.
    +- Added new style_formats_autohide option to automatically hide styles based on context.
    +- Added new codesample_content_css option to specify where the code sample prism css is loaded from.
    +- Added new support for Japanese/Chinese word count following the unicode standards on this.
    +- Added new fragmented undo levels this dramatically reduces flicker on contents with iframes.
    +- Added new live previews for complex elements like table or lists.
    +
    +### Fixed
    +- Fixed bug where it wasn't possible to properly tab between controls in a dialog with a disabled form item control.
    +- Fixed bug where firefox would generate a rectangle on elements produced after/before a cE=false elements.
    +- Fixed bug with advlist plugin not switching list element format properly in some edge cases.
    +- Fixed bug where col/rowspans wasn't correctly computed by the table plugin in some cases.
    +- Fixed bug where the table plugin would thrown an error if object_resizing was disabled.
    +- Fixed bug where some invalid markup would cause issues when running in XHTML mode. Patch contributed by Charles Bourasseau.
    +- Fixed bug where the fullscreen class wouldn't be removed properly when closing dialogs.
    +- Fixed bug where the PastePlainTextToggle event wasn't fired by the paste plugin when the state changed.
    +- Fixed bug where table the row type wasn't properly updated in table row dialog. Patch contributed by Matthias Balmer.
    +- Fixed bug where select all and cut wouldn't place caret focus back to the editor in WebKit. Patch contributed by Daniel Jalkut.
    +- Fixed bug where applying cell/row properties to multiple cells/rows would reset other unchanged properties.
    +- Fixed bug where some elements in the schema would have redundant/incorrect children.
    +- Fixed bug where selector and target options would cause issues if used together.
    +- Fixed bug where drag/drop of images from desktop on chrome would thrown an error.
    +- Fixed bug where cut on WebKit/Blink wouldn't add an undo level.
    +- Fixed bug where IE 11 would scroll to the cE=false elements when they where selected.
    +- Fixed bug where keys like F5 wouldn't work when a cE=false element was selected.
    +- Fixed bug where the undo manager wouldn't stop the typing state when commands where executed.
    +- Fixed bug where unlink on wrapped links wouldn't work properly.
    +- Fixed bug with drag/drop of images on WebKit where the image would be deleted form the source editor.
    +- Fixed bug where the visual characters mode would be disabled when contents was extracted from the editor.
    +- Fixed bug where some browsers would toggle of formats applied to the caret when clicking in the editor toolbar.
    +- Fixed bug where the custom theme function wasn't working correctly.
    +- Fixed bug where image option for custom buttons required you to have icon specified as well.
    +- Fixed bug where the context menu and contextual toolbars would be visible at the same time and sometimes overlapping.
    +- Fixed bug where the noneditable plugin would double wrap elements when using the noneditable_regexp option.
    +- Fixed bug where tables would get padding instead of margin when you used the indent button.
    +- Fixed bug where the charmap plugin wouldn't properly insert non breaking spaces.
    +- Fixed bug where the color previews in color input boxes wasn't properly updated.
    +- Fixed bug where the list items of previous lists wasn't merged in the right order.
    +- Fixed bug where it wasn't possible to drag/drop inline-block cE=false elements on IE 11.
    +- Fixed bug where some table cell merges would produce incorrect rowspan/colspan.
    +- Fixed so the font size of the editor defaults to 14px instead of 11px this can be overridden by custom css.
    +- Fixed so wordcount is debounced to reduce cpu hogging on larger texts.
    +- Fixed so tinymce global gets properly exported as a module when used with some module bundlers.
    +- Fixed so it's possible to specify what css properties you want to preview on specific formats.
    +- Fixed so anchors are contentEditable=false while within the editor.
    +- Fixed so selected contents gets wrapped in a inline code element by the codesample plugin.
    +- Fixed so conditional comments gets properly stripped independent of case. Patch contributed by Georgii Dolzhykov.
    +- Fixed so some escaped css sequences gets properly handled. Patch contributed by Georgii Dolzhykov.
    +- Fixed so notifications with the same message doesn't get displayed at the same time.
    +- Fixed so F10 can be used as an alternative key to focus to the toolbar.
    +- Fixed various api documentation issues and typos.
    +
    +### Removed
    +- Removed layer plugin since it wasn't really ported from 3.x and there doesn't seem to be much use for it.
    +- Removed moxieplayer.swf from the media plugin since it wasn't used by the media plugin.
    +- Removed format state from the advlist plugin to be more consistent with common word processors.
    +
    +## 4.4.3 - 2016-09-01
    +
    +### Fixed
    +- Fixed bug where copy would produce an exception on Chrome.
    +- Fixed bug where deleting lists on IE 11 would merge in correct text nodes.
    +- Fixed bug where deleting partial lists with indentation wouldn't cause proper normalization.
    +
    +## 4.4.2 - 2016-08-25
    +
    +### Added
    +- Added new importcss_exclusive option to disable unique selectors per group.
    +- Added new group specific selector_converter option to importcss plugin.
    +- Added new codesample_languages option to apply custom languages to codesample plugin.
    +- Added new codesample_dialog_width/codesample_dialog_height options.
    +
    +### Fixed
    +- Fixed bug where fullscreen button had an incorrect keyboard shortcut.
    +- Fixed bug where backspace/delete wouldn't work correctly from a block to a cE=false element.
    +- Fixed bug where smartpaste wasn't detecting links with special characters in them like tilde.
    +- Fixed bug where the editor wouldn't get proper focus if you clicked on a cE=false element.
    +- Fixed bug where it wasn't possible to copy/paste table rows that had merged cells.
    +- Fixed bug where merging cells could some times produce invalid col/rowspan attibute values.
    +- Fixed bug where getBody would sometimes thrown an exception now it just returns null if the iframe is clobbered.
    +- Fixed bug where drag/drop of cE=false element wasn't properly constrained to viewport.
    +- Fixed bug where contextmenu on Mac would collapse any selection to a caret.
    +- Fixed bug where rtl mode wasn't rendered properly when loading a language pack with the rtl flag.
    +- Fixed bug where Kamer word bounderies would be stripped from contents.
    +- Fixed bug where lists would sometimes render two dots or numbers on the same line.
    +- Fixed bug where the skin_url wasn't used by the inlite theme.
    +- Fixed so data attributes are ignored when comparing formats in the formatter.
    +- Fixed so it's possible to disable inline toolbars in the inlite theme.
    +- Fixed so template dialog gets resized if it doesn't fit the window viewport.
    +
    +## 4.4.1 - 2016-07-26
    +
    +### Added
    +- Added smart_paste option to paste plugin to allow disabling the paste behavior if needed.
    +
    +### Fixed
    +- Fixed bug where png urls wasn't properly detected by the smart paste logic.
    +- Fixed bug where the element path wasn't working properly when multiple editor instances where used.
    +- Fixed bug with creating lists out of multiple paragraphs would just create one list item instead of multiple.
    +- Fixed bug where scroll position wasn't properly handled by the inlite theme to place the toolbar properly.
    +- Fixed bug where multiple instances of the editor using the inlite theme didn't render the toolbar properly.
    +- Fixed bug where the shortcut label for fullscreen mode didn't match the actual shortcut key.
    +- Fixed bug where it wasn't possible to select cE=false blocks using touch devices on for example iOS.
    +- Fixed bug where it was possible to select the child image within a cE=false on IE 11.
    +- Fixed so inserts of html containing lists doesn't merge with any existing lists unless it's a paste operation.
    +
    +## 4.4.0 - 2016-06-30
    +
    +### Added
    +- Added new inlite theme this is a more lightweight inline UI.
    +- Added smarter paste logic that auto detects urls in the clipboard and inserts images/links based on that.
    +- Added a better image resize algorithm for better image quality in the imagetools plugin.
    +
    +### Fixed
    +- Fixed bug where it wasn't possible to drag/dropping cE=false elements on FF.
    +- Fixed bug where backspace/delete before/after a cE=false block would produce a new paragraph.
    +- Fixed bug where list style type css property wasn't preserved when indenting lists.
    +- Fixed bug where merging of lists where done even if the list style type was different.
    +- Fixed bug where the image_dataimg_filter function wasn't used when pasting images.
    +- Fixed bug where nested editable within a non editable element would cause scroll on focus in Chrome.
    +- Fixed so invalid targets for inline mode is blocked on initialization. We only support elements that can have children.
    +
    +## 4.3.13 - 2016-06-08
    +
    +### Added
    +- Added characters with a diacritical mark to charmap plugin. Patch contributed by Dominik Schilling.
    +- Added better error handling if the image proxy service would produce errors.
    +
    +### Fixed
    +- Fixed issue with pasting list items into list items would produce nested list rather than a merged list.
    +- Fixed bug where table selection could get stuck in selection mode for inline editors.
    +- Fixed bug where it was possible to place the caret inside the resize grid elements.
    +- Fixed bug where it wasn't possible to place in elements horizontally adjacent cE=false blocks.
    +- Fixed bug where multiple notifications wouldn't be properly placed on screen.
    +- Fixed bug where multiple editor instance of the same id could be produces in some specific integrations.
    +
    +## 4.3.12 - 2016-05-10
    +
    +### Fixed
    +- Fixed bug where focus calls couldn't be made inside the editors PostRender event handler.
    +- Fixed bug where some translations wouldn't work as expected due to a bug in editor.translate.
    +- Fixed bug where the node change event could fire with a node out side the root of the editor.
    +- Fixed bug where Chrome wouldn't properly present the keyboard paste clipboard details when paste was clicked.
    +- Fixed bug where merged cells in tables couldn't be selected from right to left.
    +- Fixed bug where insert row wouldn't properly update a merged cells rowspan property.
    +- Fixed bug where the color input boxes preview field wasn't properly set on initialization.
    +- Fixed bug where IME composition inside table cells wouldn't work as expected on IE 11.
    +- Fixed so all shadow dom support is under and experimental flag due to flaky browser support.
    +
    +## 4.3.11 - 2016-04-25
    +
    +### Fixed
    +- Fixed bug where it wasn't possible to insert empty blocks though the API unless they where padded.
    +- Fixed bug where you couldn't type the Euro character on Windows.
    +- Fixed bug where backspace/delete from a cE=false element to a text block didn't work properly.
    +- Fixed bug where the text color default grid would render incorrectly.
    +- Fixed bug where the codesample plugin wouldn't load the css in the editor for multiple editors.
    +- Fixed so the codesample plugin textarea gets focused by default.
    +
    +## 4.3.10 - 2016-04-12
    +
    +### Fixed
    +- Fixed bug where the key "y" on WebKit couldn't be entered due to conflict with keycode for F10 on keypress.
    +
    +## 4.3.9 - 2016-04-12
    +
    +### Added
    +- Added support for focusing the contextual toolbars using keyboard.
    +- Added keyboard support for slider UI controls. You can no increase/decrease using arrow keys.
    +- Added url pattern matching for Dailymotion to media plugin. Patch contributed by Bertrand Darbon.
    +- Added body_class to template plugin preview. Patch contributed by Milen Petrinski.
    +- Added options to better override textcolor pickers with custom colors. Patch contributed by Xavier Boubert.
    +- Added visual arrows to inline contextual toolbars so that they point to the element being active.
    +
    +### Changed
    +- Changed the Meta+Shift+F shortcut to Ctrl+Shift+F since Czech, Slovak, Polish languages used the first one for input.
    +
    +### Fixed
    +- Fixed so toolbars for tables or other larger elements get better positioned below the scrollable viewport.
    +- Fixed bug where it was possible to click links inside cE=false blocks.
    +- Fixed bug where event targets wasn't properly handled in Safari Technical Preview.
    +- Fixed bug where drag/drop text in FF 45 would make the editor caret invisible.
    +- Fixed bug where the remove state wasn't properly set on editor instances when detected as clobbered.
    +- Fixed bug where offscreen selection of some cE=false elements would render onscreen. Patch contributed by Steven Bufton
    +- Fixed bug where enter would clone styles out side the root on editors inside a span. Patch contributed by ChristophKaser.
    +- Fixed bug where drag/drop of images into the editor didn't work correctly in FF.
    +- Fixed so the first item in panels for the imagetools dialog gets proper keyboard focus.
    +
    +## 4.3.8 - 2016-03-15
    +
    +### Fixed
    +- Fixed bug where inserting HR at the end of a block element would produce an extra empty block.
    +- Fixed bug where links would be clickable when readonly mode was enabled.
    +- Fixed bug where the formatter would normalize to the wrong node on very specific content.
    +- Fixed bug where some nested list items couldn't be indented properly.
    +- Fixed bug where links where clickable in the preview dialog.
    +- Fixed so the alt attribute doesn't get padded with an empty value by default.
    +- Fixed so nested alignment works more correctly. You will now alter the alignment to the closest block parent.
    +
    +## 4.3.7 - 2016-03-02
    +
    +### Fixed
    +- Fixed bug where incorrect icons would be rendered for imagetools edit and color levels.
    +- Fixed bug where navigation using arrow keys inside a SelectBox didn't move up/down.
    +- Fixed bug where the visualblocks plugin would render borders round internal UI elements.
    +
    +## 4.3.6 - 2016-03-01
    +
    +### Added
    +- Added new paste_remember_plaintext_info option to allow a global disable of the plain text mode notification.
    +- Added new PastePlainTextToggle event that fires when plain text mode toggles on/off.
    +
    +### Fixed
    +- Fixed bug where it wasn't possible to select media elements since the drag logic would snap it to mouse cursor.
    +- Fixed bug where it was hard to place the caret inside nested cE=true elements when the outer cE=false element was focused.
    +- Fixed bug where editors wouldn't properly initialize if both selector and mode where used.
    +- Fixed bug where IME input inside table cells would switch the IME off.
    +- Fixed bug where selection inside the first table cell would cause the whole table cell to get selected.
    +- Fixed bug where error handling of images being uploaded wouldn't properly handle faulty statuses.
    +- Fixed bug where inserting contents before a HR would cause an exception to be thrown.
    +- Fixed bug where copy/paste of Excel data would be inserted as an image.
    +- Fixed caret position issues with copy/paste of inline block cE=false elements.
    +- Fixed issues with various menu item focus bugs in Chrome. Where the focused menu bar item wasn't properly blurred.
    +- Fixed so the notifications have a solid background since it would be hard to read if there where text under it.
    +- Fixed so notifications gets animated similar to the ones used by dialogs.
    +- Fixed so larger images that gets pasted is handled better.
    +- Fixed so the window close button is more uniform on various platform and also increased it's hit area.
    +
    +## 4.3.5 - 2016-02-11
    +
    +Npm version bump due to package not being fully updated.
    +
    +## 4.3.4 - 2016-02-11
    +
    +### Added
    +- Added new OpenWindow/CloseWindow events that gets fired when windows open/close.
    +- Added new NewCell/NewRow events that gets fired when table cells/rows are created.
    +- Added new Promise return value to tinymce.init makes it easier to handle initialization.
    +
    +### Fixed
    +- Fixed various bugs with drag/drop of contentEditable:false elements.
    +- Fixed bug where deleting of very specific nested list items would result in an odd list.
    +- Fixed bug where lists would get merged with adjacent lists outside the editable inline root.
    +- Fixed bug where MS Edge would crash when closing a dialog then clicking a menu item.
    +- Fixed bug where table cell selection would add undo levels.
    +- Fixed bug where table cell selection wasn't removed when inline editor where removed.
    +- Fixed bug where table cell selection wouldn't work properly on nested tables.
    +- Fixed bug where table merge menu would be available when merging between thead and tbody.
    +- Fixed bug where table row/column resize wouldn't get properly removed when the editor was removed.
    +- Fixed bug where Chrome would scroll to the editor if there where a empty hash value in document url.
    +- Fixed bug where the cache suffix wouldn't work correctly with the importcss plugin.
    +- Fixed bug where selection wouldn't work properly on MS Edge on Windows Phone 10.
    +- Fixed so adjacent pre blocks gets joined into one pre block since that seems like the user intent.
    +- Fixed so events gets properly dispatched in shadow dom. Patch provided by Nazar Mokrynskyi.
    +
    +### Removed
    +- Removed the jQuery version the jQuery plugin is now moved into the main package.
    +- Removed jscs from build process since eslint can now handle code style checking.
    +
    +## 4.3.3 - 2016-01-14
    +
    +### Added
    +- Added new table_resize_bars configuration setting.  This setting allows you to disable the table resize bars.
    +- Added new beforeInitialize event to tinymce.util.XHR lets you modify XHR properties before open. Patch contributed by Brent Clintel.
    +- Added new autolink_pattern setting to autolink plugin. Enables you to override the default autolink formats. Patch contributed by Ben Tiedt.
    +- Added new charmap option that lets you override the default charmap of the charmap plugin.
    +- Added new charmap_append option that lets you add new characters to the default charmap of the charmap plugin.
    +- Added new insertCustomChar event that gets fired when a character is inserted by the charmap plugin.
    +
    +### Fixed
    +- Fixed bug where table cells started with a superfluous   in IE10+.
    +- Fixed bug where table plugin would retain all BR tags when cells were merged.
    +- Fixed bug where media plugin would strip underscores from youtube urls.
    +- Fixed bug where IME input would fail on IE 11 if you typed within a table.
    +- Fixed bug where double click selection of a word would remove the space before the word on insert contents.
    +- Fixed bug where table plugin would produce exceptions when hovering tables with invalid structure.
    +- Fixed bug where fullscreen wouldn't scroll back to it's original position when untoggled.
    +- Fixed so the template plugins templates setting can be a function that gets a callback that can provide templates.
    +
    +## 4.3.2 - 2015-12-14
    +
    +### Fixed
    +- Fixed bug where the resize bars for table cells were not affected by the object_resizing property.
    +- Fixed bug where the contextual table toolbar would appear incorrectly if TinyMCE was initialized inline inside a table.
    +- Fixed bug where resizing table cells did not fire a node change event or add an undo level.
    +- Fixed bug where double click selection of text on IE 11 wouldn't work properly.
    +- Fixed bug where codesample plugin would incorrectly produce br elements inside code elements.
    +- Fixed bug where media plugin would strip dashes from youtube urls.
    +- Fixed bug where it was possible to move the caret into the table resize bars.
    +- Fixed bug where drag/drop into a cE=false element was possible on IE.
    +
    +## 4.3.1 - 2015-11-30
    +
    +### Fixed
    +- Fixed so it's possible to disable the table inline toolbar by setting it to false or an empty string.
    +- Fixed bug where it wasn't possible to resize some tables using the drag handles.
    +- Fixed bug where unique id:s would clash for multiple editor instances and cE=false selections.
    +- Fixed bug where the same plugin could be initialized multiple times.
    +- Fixed bug where the table inline toolbars would be displayed at the same time as the image toolbars.
    +- Fixed bug where the table selection rect wouldn't be removed when selecting another control element.
    +
    +## 4.3.0 - 2015-11-23
    +
    +### Added
    +- Added new table column/row resize support. Makes it a lot more easy to resize the columns/rows in a table.
    +- Added new table inline toolbar. Makes it easier to for example add new rows or columns to a table.
    +- Added new notification API. Lets you display floating notifications to the end user.
    +- Added new codesample plugin that lets you insert syntax highlighted pre elements into the editor.
    +- Added new image_caption to images. Lets you create images with captions using a HTML5 figure/figcaption elements.
    +- Added new live previews of embeded videos. Lets you play the video right inside the editor.
    +- Added new setDirty method and "dirty" event to the editor. Makes it easier to track the dirty state change.
    +- Added new setMode method to Editor instances that lets you dynamically switch between design/readonly.
    +- Added new core support for contentEditable=false elements within the editor overrides the browsers broken behavior.
    +
    +### Changed
    +- Rewrote the noneditable plugin to use the new contentEditable false core logic.
    +
    +### Fixed
    +- Fixed so the dirty state doesn't set to false automatically when the undo index is set to 0.
    +- Fixed the Selection.placeCaretAt so it works better on IE when the coordinate is between paragraphs.
    +- Fixed bug where data-mce-bogus="all" element contents where counted by the word count plugin.
    +- Fixed bug where contentEditable=false elements would be indented by the indent buttons.
    +- Fixed bug where images within contentEditable=false would be selected in WebKit on mouse click.
    +- Fixed bug in DOMUntils split method where the replacement parameter wouldn't work on specific cases.
    +- Fixed bug where the importcss plugin would import classes from the skin content css file.
    +- Fixed so all button variants have a wrapping span for it's text to make it easier to skin.
    +- Fixed so it's easier to exit pre block using the arrow keys.
    +- Fixed bug where listboxes with fix widths didn't render correctly.
    +
    +## 4.2.8 - 2015-11-13
    +
    +### Fixed
    +- Fixed bug where it was possible to delete tables as the inline root element if all columns where selected.
    +- Fixed bug where the UI buttons active state wasn't properly updated due to recent refactoring of that logic.
    +
    +## 4.2.7 - 2015-10-27
    +
    +### Fixed
    +- Fixed bug where backspace/delete would remove all formats on the last paragraph character in WebKit/Blink.
    +- Fixed bug where backspace within a inline format element with a bogus caret container would move the caret.
    +- Fixed bug where backspace/delete on selected table cells wouldn't add an undo level.
    +- Fixed bug where script tags embedded within the editor could sometimes get a mce- prefix prepended to them
    +- Fixed bug where validate: false option could produce an error to be thrown from the Serialization step.
    +- Fixed bug where inline editing of a table as the root element could let the user delete that table.
    +- Fixed bug where inline editing of a table as the root element wouldn't properly handle enter key.
    +- Fixed bug where inline editing of a table as the root element would normalize the selection incorrectly.
    +- Fixed bug where inline editing of a list as the root element could let the user delete that list.
    +- Fixed bug where inline editing of a list as the root element could let the user split that list.
    +- Fixed bug where resize handles would be rendered on editable root elements such as table.
    +
    +## 4.2.6 - 2015-09-28
    +
    +### Added
    +- Added capability to set request headers when using XHRs.
    +- Added capability to upload local images automatically default delay is set to 30 seconds after editing images.
    +- Added commands ids mceEditImage, mceAchor and mceMedia to be avaiable from execCommand.
    +- Added Edge browser to saucelabs grunt task. Patch contributed by John-David Dalton.
    +
    +### Fixed
    +- Fixed bug where blob uris not produced by tinymce would produce HTML invalid markup.
    +- Fixed bug where selection of contents of a nearly empty editor in Edge would sometimes fail.
    +- Fixed bug where color styles woudln't be retained on copy/paste in Blink/Webkit.
    +- Fixed bug where the table plugin would throw an error when inserting rows after a child table.
    +- Fixed bug where the template plugin wouldn't handle functions as variable replacements.
    +- Fixed bug where undo/redo sometimes wouldn't work properly when applying formatting collapsed ranges.
    +- Fixed bug where shift+delete wouldn't do a cut operation on Blink/WebKit.
    +- Fixed bug where cut action wouldn't properly store the before selection bookmark for the undo level.
    +- Fixed bug where backspace in side an empty list element on IE would loose editor focus.
    +- Fixed bug where the save plugin wouldn't enable the buttons when a change occurred.
    +- Fixed bug where Edge wouldn't initialize the editor if a document.domain was specified.
    +- Fixed bug where enter key before nested images would sometimes not properly expand the previous block.
    +- Fixed bug where the inline toolbars wouldn't get properly hidden when blurring the editor instance.
    +- Fixed bug where Edge would paste Chinese characters on some Windows 10 installations.
    +- Fixed bug where IME would loose focus on IE 11 due to the double trailing br bug fix.
    +- Fixed bug where the proxy url in imagetools was incorrect. Patch contributed by Wong Ho Wang.
    +
    +## 4.2.5 - 2015-08-31
    +
    +### Added
    +- Added fullscreen capability to embedded youtube and vimeo videos.
    +
    +### Fixed
    +- Fixed bug where the uploadImages call didn't work on IE 10.
    +- Fixed bug where image place holders would be uploaded by uploadImages call.
    +- Fixed bug where images marked with bogus would be uploaded by the uploadImages call.
    +- Fixed bug where multiple calls to uploadImages would result in decreased performance.
    +- Fixed bug where pagebreaks were editable to imagetools patch contributed by Rasmus Wallin.
    +- Fixed bug where the element path could cause too much recursion exception.
    +- Fixed bug for domains containing ".min". Patch contributed by Loïc Février.
    +- Fixed so validation of external links to accept a number after www. Patch contributed by Victor Carvalho.
    +- Fixed so the charmap is exposed though execCommand. Patch contributed by Matthew Will.
    +- Fixed so that the image uploads are concurrent for improved performance.
    +- Fixed various grammar problems in inline documentation. Patches provided by nikolas.
    +
    +## 4.2.4 - 2015-08-17
    +
    +### Added
    +- Added picture as a valid element to the HTML 5 schema. Patch contributed by Adam Taylor.
    +
    +### Fixed
    +- Fixed bug where contents would be duplicated on drag/drop within the same editor.
    +- Fixed bug where floating/alignment of images on Edge wouldn't work properly.
    +- Fixed bug where it wasn't possible to drag images on IE 11.
    +- Fixed bug where image selection on Edge would sometimes fail.
    +- Fixed bug where contextual toolbars icons wasn't rendered properly when using the toolbar_items_size.
    +- Fixed bug where searchreplace dialog doesn't get prefilled with the selected text.
    +- Fixed bug where fragmented matches wouldn't get properly replaced by the searchreplace plugin.
    +- Fixed bug where enter key wouldn't place the caret if was after a trailing space within an inline element.
    +- Fixed bug where the autolink plugin could produce multiple links for the same text on Gecko.
    +- Fixed bug where EditorUpload could sometimes throw an exception if the blob wasn't found.
    +- Fixed xss issues with media plugin not properly filtering out some script attributes.
    +
    +## 4.2.3 - 2015-07-30
    +
    +### Fixed
    +- Fixed bug where image selection wasn't possible on Edge due to incompatible setBaseAndExtend API.
    +- Fixed bug where image blobs urls where not properly destroyed by the imagetools plugin.
    +- Fixed bug where keyboard shortcuts wasn't working correctly on IE 8.
    +- Fixed skin issue where the borders of panels where not visible on IE 8.
    +
    +## 4.2.2 - 2015-07-22
    +
    +### Fixed
    +- Fixed bug where float panels were not being hidden on inline editor blur when fixed_toolbar_container config option was in use.
    +- Fixed bug where combobox states wasn't properly updated if contents where updated without keyboard.
    +- Fixed bug where pasting into textbox or combobox would move the caret to the end of text.
    +- Fixed bug where removal of bogus span elements before block elements would remove whitespace between nodes.
    +- Fixed bug where repositioning of inline toolbars where async and producing errors if the editor was removed from DOM to early. Patch by iseulde.
    +- Fixed bug where element path wasn't working correctly. Patch contributed by iseulde.
    +- Fixed bug where menus wasn't rendered correctly when custom images where added to a menu. Patch contributed by Naim Hammadi.
    +
    +## 4.2.1 - 2015-06-29
    +
    +### Fixed
    +- Fixed bug where back/forward buttons in the browser would render blob images as broken images.
    +- Fixed bug where Firefox would throw regexp to big error when replacing huge base64 chunks.
    +- Fixed bug rendering issues with resize and context toolbars not being placed properly until next animation frame.
    +- Fixed bug where the rendering of the image while cropping would some times not be centered correctly.
    +- Fixed bug where listbox items with submenus would me selected as active.
    +- Fixed bug where context menu where throwing an error when rendering.
    +- Fixed bug where resize both option wasn't working due to resent addClass API change. Patch contributed by Jogai.
    +- Fixed bug where a hideAll call for container rendered inline toolbars would throw an error.
    +- Fixed bug where onclick event handler on combobox could cause issues if element.id was a function by some polluting libraries.
    +- Fixed bug where listboxes wouldn't get proper selected sub menu item when using link_list or image_list.
    +- Fixed so the UI controls are as wide as 4.1.x to avoid wrapping controls in toolbars.
    +- Fixed so the imagetools dialog is adaptive for smaller screen sizes.
    +
    +## 4.2.0 - 2015-06-25
    +
    +### Added
    +- Added new flat default skin to make the UI more modern.
    +- Added new imagetools plugin, lets you crop/resize and apply filters to images.
    +- Added new contextual toolbars support to the API lets you add floating toolbars for specific CSS selectors.
    +- Added new promise feature fill as tinymce.util.Promise.
    +- Added new built in image upload feature lets you upload any base64 encoded image within the editor as files.
    +
    +### Fixed
    +- Fixed bug where resize handles would appear in the right position in the wrong editor when switching between resizable content in different inline editors.
    +- Fixed bug where tables would not be inserted in inline mode due to previous float panel fix.
    +- Fixed bug where floating panels would remain open when focus was lost on inline editors.
    +- Fixed bug where cut command on Chrome would thrown a browser security exception.
    +- Fixed bug where IE 11 sometimes would report an incorrect size for images in the image dialog.
    +- Fixed bug where it wasn't possible to remove inline formatting at the end of block elements.
    +- Fixed bug where it wasn't possible to delete table cell contents when cell selection was vertical.
    +- Fixed bug where table cell wasn't emptied from block elements if delete/backspace where pressed in empty cell.
    +- Fixed bug where cmd+shift+arrow didn't work correctly on Firefox mac when selecting to start/end of line.
    +- Fixed bug where removal of bogus elements would sometimes remove whitespace between nodes.
    +- Fixed bug where the resize handles wasn't updated when the main window was resized.
    +- Fixed so script elements gets removed by default to prevent possible XSS issues in default config implementations.
    +- Fixed so the UI doesn't need manual reflows when using non native layout managers.
    +- Fixed so base64 encoded images doesn't slow down the editor on modern browsers while editing.
    +- Fixed so all UI elements uses touch events to improve mobile device support.
    +- Removed the touch click quirks patch for iOS since it did more harm than good.
    +- Removed the non proportional resize handles since. Unproportional resize can still be done by holding the shift key.
    +
    +## 4.1.10 - 2015-05-05
    +
    +### Fixed
    +- Fixed bug where plugins loaded with compat3x would sometimes throw errors when loading using the jQuery version.
    +- Fixed bug where extra empty paragraphs would get deleted in WebKit/Blink due to recent Quriks fix.
    +- Fixed bug where the editor wouldn't work properly on IE 12 due to some required browser sniffing.
    +- Fixed bug where formatting shortcut keys where interfering with Mac OS X screenshot keys.
    +- Fixed bug where the caret wouldn't move to the next/previous line boundary on Cmd+Left/Right on Gecko.
    +- Fixed bug where it wasn't possible to remove formats from very specific nested contents.
    +- Fixed bug where undo levels wasn't produced when typing letters using the shift or alt+ctrl modifiers.
    +- Fixed bug where the dirty state wasn't properly updated when typing using the shift or alt+ctrl modifiers.
    +- Fixed bug where an error would be thrown if an autofocused editor was destroyed quickly after its initialization. Patch provided by thorn0.
    +- Fixed issue with dirty state not being properly updated on redo operation.
    +- Fixed issue with entity decoder not handling incorrectly written numeric entities.
    +- Fixed issue where some PI element values wouldn't be properly encoded.
    +
    +## 4.1.9 - 2015-03-10
    +
    +### Fixed
    +- Fixed bug where indentation wouldn't work properly for non list elements.
    +- Fixed bug with image plugin not pulling the image dimensions out correctly if a custom document_base_url was used.
    +- Fixed bug where ctrl+alt+[1-9] would conflict with the AltGr+[1-9] on Windows. New shortcuts is ctrl+shift+[1-9].
    +- Fixed bug with removing formatting on nodes in inline mode would sometimes include nodes outside the editor body.
    +- Fixed bug where extra nbsp:s would be inserted when you replaced a word surrounded by spaces using insertContent.
    +- Fixed bug with pasting from Google Docs would produce extra strong elements and line feeds.
    +
    +## 4.1.8 - 2015-03-05
    +
    +### Added
    +- Added new html5 sizes attribute to img elements used together with srcset.
    +- Added new elementpath option that makes it possible to disable the element path but keep the statusbar.
    +- Added new option table_style_by_css for the table plugin to set table styling with css rather than table attributes.
    +- Added new link_assume_external_targets option to prompt the user to prepend http:// prefix if the supplied link does not contain a protocol prefix.
    +- Added new image_prepend_url option to allow a custom base path/url to be added to images.
    +- Added new table_appearance_options option to make it possible to disable some options.
    +- Added new image_title option to make it possible to alter the title of the image, disabled by default.
    +
    +### Fixed
    +- Fixed bug where selection starting from out side of the body wouldn't produce a proper selection range on IE 11.
    +- Fixed bug where pressing enter twice before a table moves the cursor in the table and causes a javascript error.
    +- Fixed bug where advanced image styles were not respected.
    +- Fixed bug where the less common Shift+Delete didn't produce a proper cut operation on WebKit browsers.
    +- Fixed bug where image/media size constrain logic would produce NaN when handling non number values.
    +- Fixed bug where internal classes where removed by the removeformat command.
    +- Fixed bug with creating links table cell contents with a specific selection would throw a exceptions on WebKit/Blink.
    +- Fixed bug where valid_classes option didn't work as expected according to docs. Patch provided by thorn0.
    +- Fixed bug where jQuery plugin would patch the internal methods multiple times. Patch provided by Drew Martin.
    +- Fixed bug where backspace key wouldn't delete the current selection of newly formatted content.
    +- Fixed bug where type over of inline formatting elements wouldn't properly keep the format on WebKit/Blink.
    +- Fixed bug where selection needed to be properly normalized on modern IE versions.
    +- Fixed bug where Command+Backspace didn't properly delete the whole line of text but the previous word.
    +- Fixed bug where UI active states wheren't properly updated on IE if you placed caret within the current range.
    +- Fixed bug where delete/backspace on WebKit/Blink would remove span elements created by the user.
    +- Fixed bug where delete/backspace would produce incorrect results when deleting between two text blocks with br elements.
    +- Fixed bug where captions where removed when pasting from MS Office.
    +- Fixed bug where lists plugin wouldn't properly remove fully selected nested lists.
    +- Fixed bug where the ttf font used for icons would throw an warning message on Gecko on Mac OS X.
    +- Fixed a bug where applying a color to text did not update the undo/redo history.
    +- Fixed so shy entities gets displayed when using the visualchars plugin.
    +- Fixed so removeformat removes ins/del by default since these might be used for strikethough.
    +- Fixed so multiple language packs can be loaded and added to the global I18n data structure.
    +- Fixed so transparent color selection gets treated as a normal color selection. Patch contributed by Alexander Hofbauer.
    +- Fixed so it's possible to disable autoresize_overflow_padding, autoresize_bottom_margin options by setting them to false.
    +- Fixed so the charmap plugin shows the description of the character in the dialog. Patch contributed by Jelle Hissink.
    +- Removed address from the default list of block formats since it tends to be missused.
    +- Fixed so the pre block format is called preformatted to make it more verbose.
    +- Fixed so it's possible to context scope translation strings this isn't needed most of the time.
    +- Fixed so the max length of the width/height input fields of the media dialog is 5 instead of 3.
    +- Fixed so drag/dropped contents gets properly processed by paste plugin since it's basically a paste. Patch contributed by Greg Fairbanks.
    +- Fixed so shortcut keys for headers is ctrl+alt+[1-9] instead of ctrl+[1-9] since these are for switching tabs in the browsers.
    +- Fixed so "u" doesn't get converted into a span element by the legacy input filter. Since this is now a valid HTML5 element.
    +- Fixed font families in order to provide appropriate web-safe fonts.
    +
    +## 4.1.7 - 2014-11-27
    +
    +### Added
    +- Added HTML5 schema support for srcset, source and picture. Patch contributed by mattheu.
    +- Added new cache_suffix setting to enable cache busting by producing unique urls.
    +- Added new paste_convert_word_fake_lists option to enable users to disable the fake lists convert logic.
    +
    +### Fixed
    +- Fixed so advlist style changes adds undo levels for each change.
    +- Fixed bug where WebKit would sometimes produce an exception when the autolink plugin where looking for URLs.
    +- Fixed bug where IE 7 wouldn't be rendered properly due to aggressive css compression.
    +- Fixed bug where DomQuery wouldn't accept window as constructor element.
    +- Fixed bug where the color picker in 3.x dialogs wouldn't work properly. Patch contributed by Callidior.
    +- Fixed bug where the image plugin wouldn't respect the document_base_url.
    +- Fixed bug where the jQuery plugin would fail to append to elements named array prototype names.
    +
    +## 4.1.6 - 2014-10-08
    +
    +### Changed
    +- Replaced jake with grunt since it is more mainstream and has better plugin support.
    +
    +### Fixed
    +- Fixed bug with clicking on the scrollbar of the iframe would cause a JS error to be thrown.
    +- Fixed bug where null would produce an exception if you passed it to selection.setRng.
    +- Fixed bug where Ctrl/Cmd+Tab would indent the current list item if you switched tabs in the browser.
    +- Fixed bug where pasting empty cells from Excel would result in a broken table.
    +- Fixed bug where it wasn't possible to switch back to default list style type.
    +- Fixed issue where the select all quirk fix would fire for other modifiers than Ctrl/Cmd combinations.
    +
    +
    +## 4.1.5 - 2014-09-09
    +
    +### Fixed
    +- Fixed bug where sometimes the resize rectangles wouldn't properly render on images on WebKit/Blink.
    +- Fixed bug in list plugin where delete/backspace would merge empty LI elements in lists incorrectly.
    +- Fixed bug where empty list elements would result in empty LI elements without it's parent container.
    +- Fixed bug where backspace in empty caret formatted element could produce an type error exception of Gecko.
    +- Fixed bug where lists pasted from word with a custom start index above 9 wouldn't be properly handled.
    +- Fixed bug where tabfocus plugin would tab out of the editor instance even if the default action was prevented.
    +- Fixed bug where tabfocus wouldn't tab properly to other adjacent editor instances.
    +- Fixed bug where the DOMUtils setStyles wouldn't properly removed or update the data-mce-style attribute.
    +- Fixed bug where dialog select boxes would be placed incorrectly if document.body wasn't statically positioned.
    +- Fixed bug where pasting would sometimes scroll to the top of page if the user was using the autoresize plugin.
    +- Fixed bug where caret wouldn't be properly rendered by Chrome when clicking on the iframes documentElement.
    +- Fixed so custom images for menubutton/splitbutton can be provided. Patch contributed by Naim Hammadi.
    +- Fixed so the default action of windows closing can be prevented by blocking the default action of the close event.
    +- Fixed so nodeChange and focus of the editor isn't automatically performed when opening sub dialogs.
    +
    +## 4.1.4 - 2014-08-21
    +
    +### Added
    +- Added new media_filter_html option to media plugin that blocks any conditional comments, scripts etc within a video element.
    +- Added new content_security_policy option allows you to set custom policy for iframe contents. Patch contributed by Francois Chagnon.
    +
    +### Fixed
    +- Fixed bug where activate/deactivate events wasn't firing properly when switching between editors.
    +- Fixed bug where placing the caret on iOS was difficult due to a WebKit bug with touch events.
    +- Fixed bug where the resize helper wouldn't render properly on older IE versions.
    +- Fixed bug where resizing images inside tables on older IE versions would sometimes fail depending mouse position.
    +- Fixed bug where editor.insertContent would produce an exception when inserting select/option elements.
    +- Fixed bug where extra empty paragraphs would be produced if block elements where inserted inside span elements.
    +- Fixed bug where the spellchecker menu item wouldn't be properly checked if spell checking was started before it was rendered.
    +- Fixed bug where the DomQuery filter function wouldn't remove non elements from collection.
    +- Fixed bug where document with custom document.domain wouldn't properly render the editor.
    +- Fixed bug where IE 8 would throw exception when trying to enter invalid color values into colorboxes.
    +- Fixed bug where undo manager could incorrectly add an extra undo level when custom resize handles was removed.
    +- Fixed bug where it wouldn't be possible to alter cell properties properly on table cells on IE 8.
    +- Fixed so the color picker button in table dialog isn't shown unless you include the colorpicker plugin or add your own custom color picker.
    +- Fixed so activate/deactivate events fire when windowManager opens a window since.
    +- Fixed so the table advtab options isn't separated by an underscore to normalize naming with image_advtab option.
    +- Fixed so the table cell dialog has proper padding when the advanced tab in disabled.
    +
    +## 4.1.3 - 2014-07-29
    +
    +### Added
    +- Added event binding logic to tinymce.util.XHR making it possible to override headers and settings before any request is made.
    +
    +### Fixed
    +- Fixed bug where drag events wasn't fireing properly on older IE versions since the event handlers where bound to document.
    +- Fixed bug where drag/dropping contents within the editor on IE would force the contents into plain text mode even if it was internal content.
    +- Fixed bug where IE 7 wouldn't open menus properly due to a resize bug in the browser auto closing them immediately.
    +- Fixed bug where the DOMUtils getPos logic wouldn't produce a valid coordinate inside the body if the body was positioned non static.
    +- Fixed bug where the element path and format state wasn't properly updated if you had the wordcount plugin enabled.
    +- Fixed bug where a comment at the beginning of source would produce an exception in the formatter logic.
    +- Fixed bug where setAttrib/getAttrib on null would throw exception together with any hooked attributes like style.
    +- Fixed bug where table sizes wasn't properly retained when copy/pasting on WebKit/Blink.
    +- Fixed bug where WebKit/Blink would produce colors in RGB format instead of the forced HEX format when deleting contents.
    +- Fixed bug where the width attribute wasn't updated on tables if you changed the size inside the table dialog.
    +- Fixed bug where control selection wasn't properly handled when the caret was placed directly after an image.
    +- Fixed bug where selecting the contents of table cells using the selection.select method wouldn't place the caret properly.
    +- Fixed bug where the selection state for images wasn't removed when placing the caret right after an image on WebKit/Blink.
    +- Fixed bug where all events wasn't properly unbound when and editor instance was removed or destroyed by some external innerHTML call.
    +- Fixed bug where it wasn't possible or very hard to select images on iOS when the onscreen keyboard was visible.
    +- Fixed so auto_focus can take a boolean argument this will auto focus the last initialized editor might be useful for single inits.
    +- Fixed so word auto detect lists logic works better for faked lists that doesn't have specific markup.
    +- Fixed so nodeChange gets fired on mouseup as it used to before 4.1.1 we optimized that event to fire less often.
    +
    +### Removed
    +- Removed the finish menu item from spellchecker menu since it's redundant you can stop spellchecking by toggling menu item or button.
    +
    +## 4.1.2 - 2014-07-15
    +
    +### Added
    +- Added offset/grep to DomQuery class works basically the same as it's jQuery equivalent.
    +
    +### Fixed
    +- Fixed bug where backspace/delete or setContent with an empty string would remove header data when using the fullpage plugin.
    +- Fixed bug where tinymce.remove with a selector not matching any editors would remove all editors.
    +- Fixed bug where resizing of the editor didn't work since the theme was calling setStyles instead of setStyle.
    +- Fixed bug where IE 7 would fail to append html fragments to iframe document when using DomQuery.
    +- Fixed bug where the getStyle DOMUtils method would produce an exception if it was called with null as it's element.
    +- Fixed bug where the paste plugin would remove the element if the none of the paste_webkit_styles rules matched the current style.
    +- Fixed bug where contextmenu table items wouldn't work properly on IE since it would some times fire an incorrect selection change.
    +- Fixed bug where the padding/border values wasn't used in the size calculation for the body size when using autoresize. Patch contributed by Matt Whelan.
    +- Fixed bug where conditional word comments wouldn't be properly removed when pasting plain text.
    +- Fixed bug where resizing would sometime fail on IE 11 when the mouseup occurred inside the resizable element.
    +- Fixed so the iframe gets initialized without any inline event handlers for better CSP support. Patch contributed by Matt Whelan.
    +- Fixed so the tinymce.dom.Sizzle is the latest version of sizzle this resolves the document context bug.
    +
    +## 4.1.1 - 2014-07-08
    +
    +### Fixed
    +- Fixed bug where pasting plain text on some WebKit versions would result in an empty line.
    +- Fixed bug where resizing images inside tables on IE 11 wouldn't work properly.
    +- Fixed bug where IE 11 would sometimes throw "Invalid argument" exception when editor contents was set to an empty string.
    +- Fixed bug where document.activeElement would throw exceptions on IE 9 when that element was hidden or removed from dom.
    +- Fixed bug where WebKit/Blink sometimes produced br elements with the Apple-interchange-newline class.
    +- Fixed bug where table cell selection wasn't properly removed when copy/pasting table cells.
    +- Fixed bug where pasting nested list items from Word wouldn't produce proper semantic nested lists.
    +- Fixed bug where right clicking using the contextmenu plugin on WebKit/Blink on Mac OS X would select the target current word or line.
    +- Fixed bug where it wasn't possible to alter table cell properties on IE 8 using the context menu.
    +- Fixed bug where the resize helper wouldn't be correctly positioned on older IE versions.
    +- Fixed bug where fullpage plugin would produce an error if you didn't specify a doctype encoding.
    +- Fixed bug where anchor plugin would get the name/id of the current element even if it wasn't anchor element.
    +- Fixed bug where visual aids for tables wouldn't be properly disabled when changing the border size.
    +- Fixed bug where some control selection events wasn't properly fired on older IE versions.
    +- Fixed bug where table cell selection on older IE versions would prevent resizing of images.
    +- Fixed bug with paste_data_images paste option not working properly on modern IE versions.
    +- Fixed bug where custom elements with underscores in the name wasn't properly parsed/serialized.
    +- Fixed bug where applying inline formats to nested list elements would produce an incorrect formatting result.
    +- Fixed so it's possible to hide items from elements path by using preventDefault/stopPropagation.
    +- Fixed so inline mode toolbar gets rendered right aligned if the editable element positioned to the documents right edge.
    +- Fixed so empty inline elements inside empty block elements doesn't get removed if configured to be kept intact.
    +- Fixed so DomQuery parentsUntil/prevUntil/nextUntil supports selectors/elements/filters etc.
    +- Fixed so legacyoutput plugin overrides fontselect and fontsizeselect controls and handles font elements properly.
    +
    +## 4.1.0 - 2014-06-18
    +
    +### Added
    +- Added new file_picker_callback option to replace the old file_browser_callback the latter will still work though.
    +- Added new custom colors to textcolor plugin will be displayed if a color picker is provided also shows the latest colors.
    +- Added new color_picker_callback option to enable you to add custom color pickers to the editor.
    +- Added new advanced tabs to table/cell/row dialogs to enable you to select colors for border/background.
    +- Added new colorpicker plugin that lets you select colors from a hsv color picker.
    +- Added new tinymce.util.Color class to handle color parsing and converting.
    +- Added new colorpicker UI widget element lets you add a hsv color picker to any form/window.
    +- Added new textpattern plugin that allows you to use markdown like text patterns to format contents.
    +- Added new resize helper element that shows the current width & height while resizing.
    +- Added new "once" method to Editor and EventDispatcher enables since callback execution events.
    +- Added new jQuery like class under tinymce.dom.DomQuery it's exposed on editor instances (editor.$) and globally under (tinymce.$).
    +
    +### Fixed
    +- Fixed so the default resize method for images are proportional shift/ctrl can be used to make an unproportional size.
    +- Fixed bug where the image_dimensions option of the image plugin would cause exceptions when it tried to update the size.
    +- Fixed bug where table cell dialog class field wasn't properly updated when editing an a table cell with an existing class.
    +- Fixed bug where Safari on Mac would produce webkit-fake-url for pasted images so these are now removed.
    +- Fixed bug where the nodeChange event would get fired before the selection was changed when clicking inside the current selection range.
    +- Fixed bug where valid_classes option would cause exception when it removed internal prefixed classes like mce-item-.
    +- Fixed bug where backspace would cause navigation in IE 8 on an inline element and after a caret formatting was applied.
    +- Fixed so placeholder images produced by the media plugin gets selected when inserted/edited.
    +- Fixed so it's possible to drag in images when the paste_data_images option is enabled. Might be useful for mail clients.
    +- Fixed so images doesn't get a width/height applied if the image_dimensions option is set to false useful for responsive contents.
    +- Fixed so it's possible to pass in an optional arguments object for the nodeChanged function to be passed to all nodechange event listeners.
    +- Fixed bug where media plugin embed code didn't update correctly.
    diff --git a/public/js/tinymce/README.md b/public/js/tinymce/README.md
    new file mode 100644
    index 000000000..efc77185c
    --- /dev/null
    +++ b/public/js/tinymce/README.md
    @@ -0,0 +1,71 @@
    +# TinyMCE
    +
    +The world's #1 open source rich text editor.
    +
    +Used and trusted by millions of developers, TinyMCE is the world’s most customizable, scalable, and flexible rich text editor. We’ve helped launch the likes of Atlassian, Medium, Evernote (and lots more that we can’t tell you), by empowering them to create exceptional content and experiences for their users.
    +
    +With more than 350M+ downloads every year, we’re also one of the most trusted enterprise-grade open source HTML editors on the internet. There’s currently more than 100M+ products worldwide, powered by Tiny. As a high powered WYSIWYG editor, TinyMCE is built to scale, designed to innovate, and thrives on delivering results to difficult edge-cases.
    +
    +You can access a [full featured demo of TinyMCE](https://www.tiny.cloud/docs/tinymce/6/premium-full-featured/) in the docs on the TinyMCE website.
    +
    +

    + Screenshot of the TinyMCE Editor +

    + +## Get started with TinyMCE + +Getting started with the TinyMCE rich text editor is easy, and for simple configurations can be done in less than 5 minutes. + +[TinyMCE Cloud Deployment Quick Start Guide](https://www.tiny.cloud/docs/tinymce/6/cloud-quick-start/) + +[TinyMCE Self-hosted Deployment Guide](https://www.tiny.cloud/docs/tinymce/6/npm-projects/) + +TinyMCE provides a range of configuration options that allow you to integrate it into your application. Start customizing with a [basic setup](https://www.tiny.cloud/docs/tinymce/6/basic-setup/). + +Configure it for one of three modes of editing: + +- [TinyMCE classic editing mode](https://www.tiny.cloud/docs/tinymce/6/use-tinymce-classic/). +- [TinyMCE inline editing mode](https://www.tiny.cloud/docs/tinymce/6/use-tinymce-inline/). +- [TinyMCE distraction-free editing mode](https://www.tiny.cloud/docs/tinymce/6/use-tinymce-distraction-free/). + +## Features + +### Integration + +TinyMCE is easily integrated into your projects with the help of components such as: + +- [tinymce-react](https://github.com/tinymce/tinymce-react) +- [tinymce-vue](https://github.com/tinymce/tinymce-vue) +- [tinymce-angular](https://github.com/tinymce/tinymce-angular) + +With over 29 integrations, and 400+ APIs, see the TinyMCE docs for a full list of editor [integrations](https://www.tiny.cloud/docs/tinymce/6/integrations/). + +### Customization + +It is easy to [configure the UI](https://www.tiny.cloud/docs/tinymce/6/customize-ui/) of your rich text editor to match the design of your site, product or application. Due to its flexibility, you can [configure the editor](https://www.tiny.cloud/docs/tinymce/6/basic-setup/) with as much or as little functionality as you like, depending on your requirements. + +With [50+ powerful plugins available](https://www.tiny.cloud/tinymce/features/), and content editable as the basis of TinyMCE, adding additional functionality is as simple as including a single line of code. + +Realizing the full power of most plugins requires only a few lines more. + +### Extensibility + +Sometimes your editor requirements can be quite unique, and you need the freedom and flexibility to innovate. Thanks to TinyMCE being open source, you can view the source code and develop your own extensions for custom functionality to meet your own requirements. + +The TinyMCE [API](https://www.tiny.cloud/docs/tinymce/6/apis/tinymce.root/) is exposed to make it easier for you to write custom functionality that fits within the existing framework of TinyMCE [UI components](https://www.tiny.cloud/docs/tinymce/6/custom-ui-components/). + +### Extended Features and Support + +For the professional software teams that require more in-depth efficiency, compliance or collaborative features built to enterprise-grade standards, please [get in touch with our team](https://www.tiny.cloud/contact/). + +Tiny also offers dedicated SLAs and support for professional development teams. + +## Compiling and contributing + +In 2019 the decision was made to transition our codebase to a monorepo. For information on compiling and contributing, see: [contribution guidelines](https://github.com/tinymce/tinymce/blob/master/CONTRIBUTING.md). + +As an open source product, we encourage and support the active development of our software. + +## Want more information? + +Visit the [TinyMCE website](https://tiny.cloud/) and check out the [TinyMCE documentation](https://www.tiny.cloud/docs/). diff --git a/public/js/tinymce/bower.json b/public/js/tinymce/bower.json new file mode 100644 index 000000000..0af3ccfec --- /dev/null +++ b/public/js/tinymce/bower.json @@ -0,0 +1,27 @@ +{ + "name": "tinymce", + "description": "Web based JavaScript HTML WYSIWYG editor control.", + "license": "MIT", + "keywords": [ + "wysiwyg", + "tinymce", + "richtext", + "javascript", + "html", + "text", + "rich editor", + "rich text editor", + "rte", + "rich text", + "contenteditable", + "editing" + ], + "homepage": "https://www.tiny.cloud/", + "ignore": [ + "README.md", + "composer.json", + "package.json", + ".npmignore", + "CHANGELOG.md" + ] +} \ No newline at end of file diff --git a/public/js/tinymce/composer.json b/public/js/tinymce/composer.json new file mode 100644 index 000000000..37d2050a0 --- /dev/null +++ b/public/js/tinymce/composer.json @@ -0,0 +1,52 @@ +{ + "name": "tinymce/tinymce", + "version": "6.5.1", + "description": "Web based JavaScript HTML WYSIWYG editor control.", + "license": [ + "MIT-only" + ], + "keywords": [ + "wysiwyg", + "tinymce", + "richtext", + "javascript", + "html", + "text", + "rich editor", + "rich text editor", + "rte", + "rich text", + "contenteditable", + "editing" + ], + "homepage": "https://www.tiny.cloud/", + "type": "component", + "extra": { + "component": { + "scripts": [ + "tinymce.js", + "plugins/*/plugin.js", + "themes/*/theme.js", + "models/*/model.js", + "icons/*/icons.js" + ], + "files": [ + "tinymce.min.js", + "plugins/*/plugin.min.js", + "themes/*/theme.min.js", + "models/*/model.min.js", + "skins/**", + "icons/*/icons.min.js" + ] + } + }, + "archive": { + "exclude": [ + "README.md", + "bower.js", + "package.json", + ".npmignore", + "CHANGELOG.md" + ] + } +} \ No newline at end of file diff --git a/public/js/tinymce/icons/default/icons.js b/public/js/tinymce/icons/default/icons.js index a240d41a9..309f025bc 100644 --- a/public/js/tinymce/icons/default/icons.js +++ b/public/js/tinymce/icons/default/icons.js @@ -1,182 +1,191 @@ tinymce.IconManager.add('default', { icons: { - 'accessibility-check': '', - 'action-next': '', - 'action-prev': '', - 'align-center': '', - 'align-justify': '', - 'align-left': '', - 'align-none': '', - 'align-right': '', - 'arrow-left': '', - 'arrow-right': '', - 'bold': '', - 'bookmark': '', + 'accessibility-check': '', + 'accordion-toggle': '', + 'accordion': '', + 'action-next': '', + 'action-prev': '', + 'addtag': '', + 'align-center': '', + 'align-justify': '', + 'align-left': '', + 'align-none': '', + 'align-right': '', + 'arrow-left': '', + 'arrow-right': '', + 'bold': '', + 'bookmark': '', 'border-style': '', 'border-width': '', - 'brightness': '', - 'browse': '', - 'cancel': '', - 'cell-background-color': '', - 'cell-border-color': '', - 'change-case': '', - 'character-count': '', - 'checklist-rtl': '', - 'checklist': '', - 'checkmark': '', - 'chevron-down': '', - 'chevron-left': '', - 'chevron-right': '', - 'chevron-up': '', - 'close': '', - 'code-sample': '', - 'color-levels': '', - 'color-picker': '', - 'color-swatch-remove-color': '', + 'brightness': '', + 'browse': '', + 'cancel': '', + 'cell-background-color': '', + 'cell-border-color': '', + 'change-case': '', + 'character-count': '', + 'checklist-rtl': '', + 'checklist': '', + 'checkmark': '', + 'chevron-down': '', + 'chevron-left': '', + 'chevron-right': '', + 'chevron-up': '', + 'close': '', + 'code-sample': '', + 'color-levels': '', + 'color-picker': '', + 'color-swatch-remove-color': '', 'color-swatch': '', - 'comment-add': '', - 'comment': '', - 'contrast': '', - 'copy': '', - 'crop': '', - 'cut-column': '', - 'cut-row': '', - 'cut': '', - 'document-properties': '', - 'drag': '', - 'duplicate-column': '', - 'duplicate-row': '', - 'duplicate': '', - 'edit-block': '', - 'edit-image': '', - 'embed-page': '', - 'embed': '', - 'emoji': '', - 'export': '', - 'fill': '', - 'flip-horizontally': '', - 'flip-vertically': '', - 'format-painter': '', - 'format': '', - 'fullscreen': '', - 'gallery': '', - 'gamma': '', - 'help': '', - 'highlight-bg-color': '', + 'comment-add': '', + 'comment': '', + 'contrast': '', + 'copy': '', + 'crop': '', + 'cut-column': '', + 'cut-row': '', + 'cut': '', + 'document-properties': '', + 'drag': '', + 'duplicate-column': '', + 'duplicate-row': '', + 'duplicate': '', + 'edit-block': '', + 'edit-image': '', + 'embed-page': '', + 'embed': '', + 'emoji': '', + 'export': '', + 'fill': '', + 'flip-horizontally': '', + 'flip-vertically': '', + 'footnote': '', + 'format-painter': '', + 'format': '', + 'fullscreen': '', + 'gallery': '', + 'gamma': '', + 'help': '', + 'highlight-bg-color': '', 'home': '', 'horizontal-rule': '', - 'image-options': '', - 'image': '', - 'indent': '', - 'info': '', - 'insert-character': '', - 'insert-time': '', - 'invert': '', - 'italic': '', - 'language': '', - 'line-height': '', - 'line': '', - 'link': '', - 'list-bull-circle': '', + 'image-options': '', + 'image': '', + 'indent': '', + 'info': '', + 'insert-character': '', + 'insert-time': '', + 'invert': '', + 'italic': '', + 'language': '', + 'line-height': '', + 'line': '', + 'link': '', + 'list-bull-circle': '', 'list-bull-default': '', 'list-bull-square': '', - 'list-num-default-rtl': '', - 'list-num-default': '', - 'list-num-lower-alpha-rtl': '', - 'list-num-lower-alpha': '', - 'list-num-lower-greek-rtl': '', - 'list-num-lower-greek': '', - 'list-num-lower-roman-rtl': '', - 'list-num-lower-roman': '', - 'list-num-upper-alpha-rtl': '', - 'list-num-upper-alpha': '', - 'list-num-upper-roman-rtl': '', - 'list-num-upper-roman': '', - 'lock': '', - 'ltr': '', - 'more-drawer': '', - 'new-document': '', - 'new-tab': '', - 'non-breaking': '', - 'notice': '', - 'ordered-list-rtl': '', - 'ordered-list': '', - 'orientation': '', - 'outdent': '', - 'page-break': '', - 'paragraph': '', - 'paste-column-after': '', - 'paste-column-before': '', - 'paste-row-after': '', - 'paste-row-before': '', - 'paste-text': '', - 'paste': '', - 'permanent-pen': '', - 'plus': '', - 'preferences': '', - 'preview': '', - 'print': '', - 'quote': '', - 'redo': '', - 'reload': '', - 'remove-formatting': '', - 'remove': '', - 'resize-handle': '', - 'resize': '', - 'restore-draft': '', - 'rotate-left': '', - 'rotate-right': '', - 'rtl': '', - 'save': '', - 'search': '', - 'select-all': '', - 'selected': '', - 'settings': '', - 'sharpen': '', - 'sourcecode': '', - 'spell-check': '', - 'strike-through': '', - 'subscript': '', - 'superscript': '', - 'table-caption': '', - 'table-cell-classes': '', - 'table-cell-properties': '', - 'table-cell-select-all': '', - 'table-cell-select-inner': '', - 'table-classes': '', - 'table-delete-column': '', - 'table-delete-row': '', - 'table-delete-table': '', - 'table-insert-column-after': '', - 'table-insert-column-before': '', - 'table-insert-row-above': '', - 'table-insert-row-after': '', - 'table-left-header': '', - 'table-merge-cells': '', - 'table-row-numbering-rtl': '', - 'table-row-numbering': '', - 'table-row-properties': '', - 'table-split-cells': '', - 'table-top-header': '', - 'table': '', - 'template': '', - 'temporary-placeholder': '', - 'text-color': '', - 'toc': '', - 'translate': '', - 'underline': '', - 'undo': '', - 'unlink': '', - 'unlock': '', - 'unordered-list': '', - 'unselected': '', - 'upload': '', - 'user': '', - 'vertical-align': '', - 'visualblocks': '', - 'visualchars': '', - 'warning': '', - 'zoom-in': '', - 'zoom-out': '', + 'list-num-default-rtl': '', + 'list-num-default': '', + 'list-num-lower-alpha-rtl': '', + 'list-num-lower-alpha': '', + 'list-num-lower-greek-rtl': '', + 'list-num-lower-greek': '', + 'list-num-lower-roman-rtl': '', + 'list-num-lower-roman': '', + 'list-num-upper-alpha-rtl': '', + 'list-num-upper-alpha': '', + 'list-num-upper-roman-rtl': '', + 'list-num-upper-roman': '', + 'lock': '', + 'ltr': '', + 'minus': '', + 'more-drawer': '', + 'new-document': '', + 'new-tab': '', + 'non-breaking': '', + 'notice': '', + 'ordered-list-rtl': '', + 'ordered-list': '', + 'orientation': '', + 'outdent': '', + 'page-break': '', + 'paragraph': '', + 'paste-column-after': '', + 'paste-column-before': '', + 'paste-row-after': '', + 'paste-row-before': '', + 'paste-text': '', + 'paste': '', + 'permanent-pen': '', + 'plus': '', + 'preferences': '', + 'preview': '', + 'print': '', + 'quote': '', + 'redo': '', + 'reload': '', + 'remove-formatting': '', + 'remove': '', + 'resize-handle': '', + 'resize': '', + 'restore-draft': '', + 'rotate-left': '', + 'rotate-right': '', + 'rtl': '', + 'save': '', + 'search': '', + 'select-all': '', + 'selected': '', + 'settings': '', + 'sharpen': '', + 'sourcecode': '', + 'spell-check': '', + 'strike-through': '', + 'subscript': '', + 'superscript': '', + 'table-caption': '', + 'table-cell-classes': '', + 'table-cell-properties': '', + 'table-cell-select-all': '', + 'table-cell-select-inner': '', + 'table-classes': '', + 'table-delete-column': '', + 'table-delete-row': '', + 'table-delete-table': '', + 'table-insert-column-after': '', + 'table-insert-column-before': '', + 'table-insert-row-above': '', + 'table-insert-row-after': '', + 'table-left-header': '', + 'table-merge-cells': '', + 'table-row-numbering-rtl': '', + 'table-row-numbering': '', + 'table-row-properties': '', + 'table-split-cells': '', + 'table-top-header': '', + 'table': '', + 'template-add': '', + 'template': '', + 'temporary-placeholder': '', + 'text-color': '', + 'text-size-decrease': '', + 'text-size-increase': '', + 'toc': '', + 'translate': '', + 'typography': '', + 'underline': '', + 'undo': '', + 'unlink': '', + 'unlock': '', + 'unordered-list': '', + 'unselected': '', + 'upload': '', + 'user': '', + 'vertical-align': '', + 'visualblocks': '', + 'visualchars': '', + 'warning': '', + 'zoom-in': '', + 'zoom-out': '', } }); \ No newline at end of file diff --git a/public/js/tinymce/icons/default/icons.min.js b/public/js/tinymce/icons/default/icons.min.js index 2cf9ef86d..252210cf5 100644 --- a/public/js/tinymce/icons/default/icons.min.js +++ b/public/js/tinymce/icons/default/icons.min.js @@ -1 +1 @@ -tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"action-next":'',"action-prev":'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-style":'',"border-width":'',brightness:'',browse:'',cancel:'',"cell-background-color":'',"cell-border-color":'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-properties":'',drag:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',export:'',fill:'',"flip-horizontally":'',"flip-vertically":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',language:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-caption":'',"table-cell-classes":'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-classes":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-numbering-rtl":'',"table-row-numbering":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',template:'',"temporary-placeholder":'',"text-color":'',toc:'',translate:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',"vertical-align":'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file +tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"accordion-toggle":'',accordion:'',"action-next":'',"action-prev":'',addtag:'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-style":'',"border-width":'',brightness:'',browse:'',cancel:'',"cell-background-color":'',"cell-border-color":'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-properties":'',drag:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',export:'',fill:'',"flip-horizontally":'',"flip-vertically":'',footnote:'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',language:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',minus:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-caption":'',"table-cell-classes":'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-classes":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-numbering-rtl":'',"table-row-numbering":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',"template-add":'',template:'',"temporary-placeholder":'',"text-color":'',"text-size-decrease":'',"text-size-increase":'',toc:'',translate:'',typography:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',"vertical-align":'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file diff --git a/public/js/tinymce/jquery.tinymce.min.js b/public/js/tinymce/jquery.tinymce.min.js deleted file mode 100644 index 46e24d268..000000000 --- a/public/js/tinymce/jquery.tinymce.min.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - */ -/** - * Jquery integration plugin. - * - * @class tinymce.core.JqueryIntegration - * @private - */ -!function(){function f(){ -// Reference to tinymce needs to be lazily evaluated since tinymce -// might be loaded through the compressor or other means -return d.tinymce}var p,c,u,s=[],d="undefined"!=typeof global?global:window,m=d.jQuery;m.fn.tinymce=function(o){var e,t,i,n,l=this,r=""; -// No match then just ignore the call -return l.length? -// Get editor instance -o?(l.css("visibility","hidden"), -// Load TinyMCE on demand, if we need to -d.tinymce||c||!(e=o.script_url)? -// Delay the init call until tinymce is loaded -1===c?s.push(a):a():(c=1,t=e.substring(0,e.lastIndexOf("/")), -// Check if it's a dev/src version they want to load then -// make sure that all plugins, themes etc are loaded in source mode as well --1!=e.indexOf(".min")&&(r=".min"), -// Setup tinyMCEPreInit object this will later be used by the TinyMCE -// core script to locate other resources like CSS files, dialogs etc -// You can also predefined a tinyMCEPreInit object and then it will use that instead -d.tinymce=d.tinyMCEPreInit||{base:t,suffix:r}, -// url contains gzip then we assume it's a compressor --1!=e.indexOf("gzip")&&(i=o.language||"en",e=e+(/\?/.test(e)?"&":"?")+"js=true&core=true&suffix="+escape(r)+"&themes="+escape(o.theme||"modern")+"&plugins="+escape(o.plugins||"")+"&languages="+(i||""), -// Check if compressor script is already loaded otherwise setup a basic one -d.tinyMCE_GZ||(d.tinyMCE_GZ={start:function(){function n(e){f().ScriptLoader.markDone(f().baseURI.toAbsolute(e))} -// Add core languages -n("langs/"+i+".js"), -// Add themes with languages -n("themes/"+o.theme+"/theme"+r+".js"),n("themes/"+o.theme+"/langs/"+i+".js"), -// Add plugins with languages -m.each(o.plugins.split(","),function(e,t){t&&(n("plugins/"+t+"/plugin"+r+".js"),n("plugins/"+t+"/langs/"+i+".js"))})},end:function(){}})),(n=document.createElement("script")).type="text/javascript",n.onload=n.onreadystatechange=function(e){e=e||window.event,2===c||"load"!=e.type&&!/complete|loaded/.test(n.readyState)||(f().dom.Event.domLoaded=1,c=2, -// Execute callback after mainscript has been loaded and before the initialization occurs -o.script_loaded&&o.script_loaded(),a(),m.each(s,function(e,t){t()}))},n.src=e,document.body.appendChild(n)),l):f()?f().get(l[0].id):null:l;function a(){var a=[],c=0; -// Apply patches to the jQuery object, only once -u||(v(),u=!0), -// Create an editor instance for each matched node -l.each(function(e,t){var n,i=t.id,r=o.oninit; -// Generate unique id for target element if needed -i||(t.id=i=f().DOM.uniqueId()), -// Only init the editor once -f().get(i)||( -// Create editor instance and render it -n=f().createEditor(i,o),a.push(n),n.on("init",function(){var e,t=r;l.css("visibility",""), -// Run this if the oninit setting is defined -// this logic will fire the oninit callback ones each -// matched editor instance is initialized -r&&++c==a.length&&("string"==typeof t&&(e=-1===t.indexOf(".")?null:f().resolve(t.replace(/\.\w+$/,"")),t=f().resolve(t)), -// Call the oninit function with the object -t.apply(e||f(),a))}))}), -// Render the editor instances in a separate loop since we -// need to have the full editors array used in the onInit calls -m.each(a,function(e,t){t.render()})}}, -// Add :tinymce pseudo selector this will select elements that has been converted into editor instances -// it's now possible to use things like $('*:tinymce') to get all TinyMCE bound elements. -m.extend(m.expr[":"],{tinymce:function(e){var t;return!!(e.id&&"tinymce"in d&&(t=f().get(e.id))&&t.editorManager===f())}}); -// This function patches internal jQuery functions so that if -// you for example remove an div element containing an editor it's -// automatically destroyed by the TinyMCE API -var v=function(){function r(e){ -// If the function is remove -"remove"===e&&this.each(function(e,t){var n=u(t);n&&n.remove()}),this.find("span.mceEditor,div.mceEditor").each(function(e,t){var n=f().get(t.id.replace(/_parent$/,""));n&&n.remove()})}function o(i){var e,t=this; -// Handle set value -/*jshint eqnull:true */if(null!=i)r.call(t), -// Saves the contents before get/set value of textarea/div -t.each(function(e,t){var n;(n=f().get(t.id))&&n.setContent(i)});else if(0])*>/g,""):n.getContent({save:!0}):a.apply(m(t),r)}),i}}), -// Makes it possible to use $('#id').append("content"); to append contents to the TinyMCE editor iframe -m.each(["append","prepend"],function(e,t){var n=s[t]=m.fn[t],r="prepend"===t;m.fn[t]=function(i){var e=this;return l(e)?i!==p?("string"==typeof i&&e.filter(":tinymce").each(function(e,t){var n=u(t);n&&n.setContent(r?i+n.getContent():n.getContent()+i)}),n.apply(e.not(":tinymce"),arguments),e):void 0:n.apply(e,arguments)}}), -// Makes sure that the editor instance gets properly destroyed when the parent element is removed -m.each(["remove","replaceWith","replaceAll","empty"],function(e,t){var n=s[t]=m.fn[t];m.fn[t]=function(){return r.call(this,t),n.apply(this,arguments)}}),s.attr=m.fn.attr, -// Makes sure that $('#tinymce_id').attr('value') gets the editors current HTML contents -m.fn.attr=function(e,t){var n=this,i=arguments;if(!e||"value"!==e||!l(n))return s.attr.apply(n,i);if(t!==p)return o.call(n.filter(":tinymce"),t),s.attr.apply(n.not(":tinymce"),i),n;// return original set for chaining -var r=n[0],a=u(r);return a?a.getContent({save:!0}):s.attr.apply(m(r),i)}}}(); \ No newline at end of file diff --git a/public/js/tinymce/license.txt b/public/js/tinymce/license.txt new file mode 100644 index 000000000..3a49f66fd --- /dev/null +++ b/public/js/tinymce/license.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/public/js/tinymce/models/dom/index.js b/public/js/tinymce/models/dom/index.js new file mode 100644 index 000000000..7ed634af9 --- /dev/null +++ b/public/js/tinymce/models/dom/index.js @@ -0,0 +1,7 @@ +// Exports the "dom" model for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/models/dom') +// ES2015: +// import 'tinymce/models/dom' +require('./model.js'); \ No newline at end of file diff --git a/public/js/tinymce/models/dom/model.js b/public/js/tinymce/models/dom/model.js new file mode 100644 index 000000000..bd02d5d80 --- /dev/null +++ b/public/js/tinymce/models/dom/model.js @@ -0,0 +1,8040 @@ +/** + * TinyMCE version 6.5.1 (2023-06-19) + */ + +(function () { + 'use strict'; + + var global$1 = tinymce.util.Tools.resolve('tinymce.ModelManager'); + + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } + }; + const typeOf = x => { + const t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && Array.isArray(x)) { + return 'array'; + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { + return 'string'; + } else { + return t; + } + }; + const isType$1 = type => value => typeOf(value) === type; + const isSimpleType = type => value => typeof value === type; + const eq$2 = t => a => t === a; + const isString = isType$1('string'); + const isObject = isType$1('object'); + const isArray = isType$1('array'); + const isNull = eq$2(null); + const isBoolean = isSimpleType('boolean'); + const isUndefined = eq$2(undefined); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); + const isFunction = isSimpleType('function'); + const isNumber = isSimpleType('number'); + + const noop = () => { + }; + const compose = (fa, fb) => { + return (...args) => { + return fa(fb.apply(null, args)); + }; + }; + const compose1 = (fbc, fab) => a => fbc(fab(a)); + const constant = value => { + return () => { + return value; + }; + }; + const identity = x => { + return x; + }; + const tripleEquals = (a, b) => { + return a === b; + }; + function curry(fn, ...initialArgs) { + return (...restArgs) => { + const all = initialArgs.concat(restArgs); + return fn.apply(null, all); + }; + } + const not = f => t => !f(t); + const die = msg => { + return () => { + throw new Error(msg); + }; + }; + const apply = f => { + return f(); + }; + const never = constant(false); + const always = constant(true); + + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); + } + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); + + const nativeSlice = Array.prototype.slice; + const nativeIndexOf = Array.prototype.indexOf; + const nativePush = Array.prototype.push; + const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t); + const contains$2 = (xs, x) => rawIndexOf(xs, x) > -1; + const exists = (xs, pred) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + if (pred(x, i)) { + return true; + } + } + return false; + }; + const range$1 = (num, f) => { + const r = []; + for (let i = 0; i < num; i++) { + r.push(f(i)); + } + return r; + }; + const map$1 = (xs, f) => { + const len = xs.length; + const r = new Array(len); + for (let i = 0; i < len; i++) { + const x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + const each$2 = (xs, f) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + f(x, i); + } + }; + const eachr = (xs, f) => { + for (let i = xs.length - 1; i >= 0; i--) { + const x = xs[i]; + f(x, i); + } + }; + const partition = (xs, pred) => { + const pass = []; + const fail = []; + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + const arr = pred(x, i) ? pass : fail; + arr.push(x); + } + return { + pass, + fail + }; + }; + const filter$2 = (xs, pred) => { + const r = []; + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + const foldr = (xs, f, acc) => { + eachr(xs, (x, i) => { + acc = f(acc, x, i); + }); + return acc; + }; + const foldl = (xs, f, acc) => { + each$2(xs, (x, i) => { + acc = f(acc, x, i); + }); + return acc; + }; + const findUntil = (xs, pred, until) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + if (pred(x, i)) { + return Optional.some(x); + } else if (until(x, i)) { + break; + } + } + return Optional.none(); + }; + const find$1 = (xs, pred) => { + return findUntil(xs, pred, never); + }; + const findIndex = (xs, pred) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + if (pred(x, i)) { + return Optional.some(i); + } + } + return Optional.none(); + }; + const flatten = xs => { + const r = []; + for (let i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + const bind$2 = (xs, f) => flatten(map$1(xs, f)); + const forall = (xs, pred) => { + for (let i = 0, len = xs.length; i < len; ++i) { + const x = xs[i]; + if (pred(x, i) !== true) { + return false; + } + } + return true; + }; + const reverse = xs => { + const r = nativeSlice.call(xs, 0); + r.reverse(); + return r; + }; + const mapToObject = (xs, f) => { + const r = {}; + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + r[String(x)] = f(x, i); + } + return r; + }; + const sort$1 = (xs, comparator) => { + const copy = nativeSlice.call(xs, 0); + copy.sort(comparator); + return copy; + }; + const get$d = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + const head = xs => get$d(xs, 0); + const last$2 = xs => get$d(xs, xs.length - 1); + const findMap = (arr, f) => { + for (let i = 0; i < arr.length; i++) { + const r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Optional.none(); + }; + + const keys = Object.keys; + const hasOwnProperty = Object.hasOwnProperty; + const each$1 = (obj, f) => { + const props = keys(obj); + for (let k = 0, len = props.length; k < len; k++) { + const i = props[k]; + const x = obj[i]; + f(x, i); + } + }; + const map = (obj, f) => { + return tupleMap(obj, (x, i) => ({ + k: i, + v: f(x, i) + })); + }; + const tupleMap = (obj, f) => { + const r = {}; + each$1(obj, (x, i) => { + const tuple = f(x, i); + r[tuple.k] = tuple.v; + }); + return r; + }; + const objAcc = r => (x, i) => { + r[i] = x; + }; + const internalFilter = (obj, pred, onTrue, onFalse) => { + each$1(obj, (x, i) => { + (pred(x, i) ? onTrue : onFalse)(x, i); + }); + }; + const filter$1 = (obj, pred) => { + const t = {}; + internalFilter(obj, pred, objAcc(t), noop); + return t; + }; + const mapToArray = (obj, f) => { + const r = []; + each$1(obj, (value, name) => { + r.push(f(value, name)); + }); + return r; + }; + const values = obj => { + return mapToArray(obj, identity); + }; + const get$c = (obj, key) => { + return has$1(obj, key) ? Optional.from(obj[key]) : Optional.none(); + }; + const has$1 = (obj, key) => hasOwnProperty.call(obj, key); + const hasNonNullableKey = (obj, key) => has$1(obj, key) && obj[key] !== undefined && obj[key] !== null; + const isEmpty = r => { + for (const x in r) { + if (hasOwnProperty.call(r, x)) { + return false; + } + } + return true; + }; + + const Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + const path = (parts, scope) => { + let o = scope !== undefined && scope !== null ? scope : Global; + for (let i = 0; i < parts.length && o !== undefined && o !== null; ++i) { + o = o[parts[i]]; + } + return o; + }; + const resolve$2 = (p, scope) => { + const parts = p.split('.'); + return path(parts, scope); + }; + + const unsafe = (name, scope) => { + return resolve$2(name, scope); + }; + const getOrDie = (name, scope) => { + const actual = unsafe(name, scope); + if (actual === undefined || actual === null) { + throw new Error(name + ' not available on this browser'); + } + return actual; + }; + + const getPrototypeOf = Object.getPrototypeOf; + const sandHTMLElement = scope => { + return getOrDie('HTMLElement', scope); + }; + const isPrototypeOf = x => { + const scope = resolve$2('ownerDocument.defaultView', x); + return isObject(x) && (sandHTMLElement(scope).prototype.isPrototypeOf(x) || /^HTML\w*Element$/.test(getPrototypeOf(x).constructor.name)); + }; + + const COMMENT = 8; + const DOCUMENT = 9; + const DOCUMENT_FRAGMENT = 11; + const ELEMENT = 1; + const TEXT = 3; + + const name = element => { + const r = element.dom.nodeName; + return r.toLowerCase(); + }; + const type = element => element.dom.nodeType; + const isType = t => element => type(element) === t; + const isComment = element => type(element) === COMMENT || name(element) === '#comment'; + const isHTMLElement = element => isElement(element) && isPrototypeOf(element.dom); + const isElement = isType(ELEMENT); + const isText = isType(TEXT); + const isDocument = isType(DOCUMENT); + const isDocumentFragment = isType(DOCUMENT_FRAGMENT); + const isTag = tag => e => isElement(e) && name(e) === tag; + + const rawSet = (dom, key, value) => { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + const set$2 = (element, key, value) => { + rawSet(element.dom, key, value); + }; + const setAll$1 = (element, attrs) => { + const dom = element.dom; + each$1(attrs, (v, k) => { + rawSet(dom, k, v); + }); + }; + const setOptions = (element, attrs) => { + each$1(attrs, (v, k) => { + v.fold(() => { + remove$7(element, k); + }, value => { + rawSet(element.dom, k, value); + }); + }); + }; + const get$b = (element, key) => { + const v = element.dom.getAttribute(key); + return v === null ? undefined : v; + }; + const getOpt = (element, key) => Optional.from(get$b(element, key)); + const remove$7 = (element, key) => { + element.dom.removeAttribute(key); + }; + const clone$2 = element => foldl(element.dom.attributes, (acc, attr) => { + acc[attr.name] = attr.value; + return acc; + }, {}); + + const fromHtml$1 = (html, scope) => { + const doc = scope || document; + const div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + const message = 'HTML does not have a single root node'; + console.error(message, html); + throw new Error(message); + } + return fromDom$1(div.childNodes[0]); + }; + const fromTag = (tag, scope) => { + const doc = scope || document; + const node = doc.createElement(tag); + return fromDom$1(node); + }; + const fromText = (text, scope) => { + const doc = scope || document; + const node = doc.createTextNode(text); + return fromDom$1(node); + }; + const fromDom$1 = node => { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + const fromPoint$1 = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$1); + const SugarElement = { + fromHtml: fromHtml$1, + fromTag, + fromText, + fromDom: fromDom$1, + fromPoint: fromPoint$1 + }; + + const is$2 = (element, selector) => { + const dom = element.dom; + if (dom.nodeType !== ELEMENT) { + return false; + } else { + const elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + const bypassSelector = dom => dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0; + const all$1 = (selector, scope) => { + const base = scope === undefined ? document : scope.dom; + return bypassSelector(base) ? [] : map$1(base.querySelectorAll(selector), SugarElement.fromDom); + }; + const one = (selector, scope) => { + const base = scope === undefined ? document : scope.dom; + return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom); + }; + + const eq$1 = (e1, e2) => e1.dom === e2.dom; + const contains$1 = (e1, e2) => { + const d1 = e1.dom; + const d2 = e2.dom; + return d1 === d2 ? false : d1.contains(d2); + }; + const is$1 = is$2; + + const owner = element => SugarElement.fromDom(element.dom.ownerDocument); + const documentOrOwner = dos => isDocument(dos) ? dos : owner(dos); + const documentElement = element => SugarElement.fromDom(documentOrOwner(element).dom.documentElement); + const defaultView = element => SugarElement.fromDom(documentOrOwner(element).dom.defaultView); + const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom); + const parentElement = element => Optional.from(element.dom.parentElement).map(SugarElement.fromDom); + const parents = (element, isRoot) => { + const stop = isFunction(isRoot) ? isRoot : never; + let dom = element.dom; + const ret = []; + while (dom.parentNode !== null && dom.parentNode !== undefined) { + const rawParent = dom.parentNode; + const p = SugarElement.fromDom(rawParent); + ret.push(p); + if (stop(p) === true) { + break; + } else { + dom = rawParent; + } + } + return ret; + }; + const prevSibling = element => Optional.from(element.dom.previousSibling).map(SugarElement.fromDom); + const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom); + const children$2 = element => map$1(element.dom.childNodes, SugarElement.fromDom); + const child$2 = (element, index) => { + const cs = element.dom.childNodes; + return Optional.from(cs[index]).map(SugarElement.fromDom); + }; + const firstChild = element => child$2(element, 0); + + const before$3 = (marker, element) => { + const parent$1 = parent(marker); + parent$1.each(v => { + v.dom.insertBefore(element.dom, marker.dom); + }); + }; + const after$5 = (marker, element) => { + const sibling = nextSibling(marker); + sibling.fold(() => { + const parent$1 = parent(marker); + parent$1.each(v => { + append$1(v, element); + }); + }, v => { + before$3(v, element); + }); + }; + const prepend = (parent, element) => { + const firstChild$1 = firstChild(parent); + firstChild$1.fold(() => { + append$1(parent, element); + }, v => { + parent.dom.insertBefore(element.dom, v.dom); + }); + }; + const append$1 = (parent, element) => { + parent.dom.appendChild(element.dom); + }; + const appendAt = (parent, element, index) => { + child$2(parent, index).fold(() => { + append$1(parent, element); + }, v => { + before$3(v, element); + }); + }; + const wrap = (element, wrapper) => { + before$3(element, wrapper); + append$1(wrapper, element); + }; + + const after$4 = (marker, elements) => { + each$2(elements, (x, i) => { + const e = i === 0 ? marker : elements[i - 1]; + after$5(e, x); + }); + }; + const append = (parent, elements) => { + each$2(elements, x => { + append$1(parent, x); + }); + }; + + const empty = element => { + element.dom.textContent = ''; + each$2(children$2(element), rogue => { + remove$6(rogue); + }); + }; + const remove$6 = element => { + const dom = element.dom; + if (dom.parentNode !== null) { + dom.parentNode.removeChild(dom); + } + }; + const unwrap = wrapper => { + const children = children$2(wrapper); + if (children.length > 0) { + after$4(wrapper, children); + } + remove$6(wrapper); + }; + + const clone$1 = (original, isDeep) => SugarElement.fromDom(original.dom.cloneNode(isDeep)); + const shallow = original => clone$1(original, false); + const deep = original => clone$1(original, true); + const shallowAs = (original, tag) => { + const nu = SugarElement.fromTag(tag); + const attributes = clone$2(original); + setAll$1(nu, attributes); + return nu; + }; + const copy$2 = (original, tag) => { + const nu = shallowAs(original, tag); + const cloneChildren = children$2(deep(original)); + append(nu, cloneChildren); + return nu; + }; + const mutate$1 = (original, tag) => { + const nu = shallowAs(original, tag); + after$5(original, nu); + const children = children$2(original); + append(nu, children); + remove$6(original); + return nu; + }; + + const validSectionList = [ + 'tfoot', + 'thead', + 'tbody', + 'colgroup' + ]; + const isValidSection = parentName => contains$2(validSectionList, parentName); + const grid = (rows, columns) => ({ + rows, + columns + }); + const address = (row, column) => ({ + row, + column + }); + const detail = (element, rowspan, colspan) => ({ + element, + rowspan, + colspan + }); + const detailnew = (element, rowspan, colspan, isNew) => ({ + element, + rowspan, + colspan, + isNew + }); + const extended = (element, rowspan, colspan, row, column, isLocked) => ({ + element, + rowspan, + colspan, + row, + column, + isLocked + }); + const rowdetail = (element, cells, section) => ({ + element, + cells, + section + }); + const rowdetailnew = (element, cells, section, isNew) => ({ + element, + cells, + section, + isNew + }); + const elementnew = (element, isNew, isLocked) => ({ + element, + isNew, + isLocked + }); + const rowcells = (element, cells, section, isNew) => ({ + element, + cells, + section, + isNew + }); + const bounds = (startRow, startCol, finishRow, finishCol) => ({ + startRow, + startCol, + finishRow, + finishCol + }); + const columnext = (element, colspan, column) => ({ + element, + colspan, + column + }); + const colgroup = (element, columns) => ({ + element, + columns + }); + + const isShadowRoot = dos => isDocumentFragment(dos) && isNonNullable(dos.dom.host); + const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); + const isSupported$1 = constant(supported); + const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner; + const getShadowRoot = e => { + const r = getRootNode(e); + return isShadowRoot(r) ? Optional.some(r) : Optional.none(); + }; + const getShadowHost = e => SugarElement.fromDom(e.dom.host); + const getOriginalEventTarget = event => { + if (isSupported$1() && isNonNullable(event.target)) { + const el = SugarElement.fromDom(event.target); + if (isElement(el) && isOpenShadowHost(el)) { + if (event.composed && event.composedPath) { + const composedPath = event.composedPath(); + if (composedPath) { + return head(composedPath); + } + } + } + } + return Optional.from(event.target); + }; + const isOpenShadowHost = element => isNonNullable(element.dom.shadowRoot); + + const inBody = element => { + const dom = isText(element) ? element.dom.parentNode : element.dom; + if (dom === undefined || dom === null || dom.ownerDocument === null) { + return false; + } + const doc = dom.ownerDocument; + return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost)); + }; + const body$1 = () => getBody$1(SugarElement.fromDom(document)); + const getBody$1 = doc => { + const b = doc.dom.body; + if (b === null || b === undefined) { + throw new Error('Body is not available yet'); + } + return SugarElement.fromDom(b); + }; + + const ancestors$4 = (scope, predicate, isRoot) => filter$2(parents(scope, isRoot), predicate); + const children$1 = (scope, predicate) => filter$2(children$2(scope), predicate); + const descendants$1 = (scope, predicate) => { + let result = []; + each$2(children$2(scope), x => { + if (predicate(x)) { + result = result.concat([x]); + } + result = result.concat(descendants$1(x, predicate)); + }); + return result; + }; + + const ancestors$3 = (scope, selector, isRoot) => ancestors$4(scope, e => is$2(e, selector), isRoot); + const children = (scope, selector) => children$1(scope, e => is$2(e, selector)); + const descendants = (scope, selector) => all$1(selector, scope); + + var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => { + if (is(scope, a)) { + return Optional.some(scope); + } else if (isFunction(isRoot) && isRoot(scope)) { + return Optional.none(); + } else { + return ancestor(scope, a, isRoot); + } + }; + + const ancestor$2 = (scope, predicate, isRoot) => { + let element = scope.dom; + const stop = isFunction(isRoot) ? isRoot : never; + while (element.parentNode) { + element = element.parentNode; + const el = SugarElement.fromDom(element); + if (predicate(el)) { + return Optional.some(el); + } else if (stop(el)) { + break; + } + } + return Optional.none(); + }; + const closest$2 = (scope, predicate, isRoot) => { + const is = (s, test) => test(s); + return ClosestOrAncestor(is, ancestor$2, scope, predicate, isRoot); + }; + const child$1 = (scope, predicate) => { + const pred = node => predicate(SugarElement.fromDom(node)); + const result = find$1(scope.dom.childNodes, pred); + return result.map(SugarElement.fromDom); + }; + const descendant$1 = (scope, predicate) => { + const descend = node => { + for (let i = 0; i < node.childNodes.length; i++) { + const child = SugarElement.fromDom(node.childNodes[i]); + if (predicate(child)) { + return Optional.some(child); + } + const res = descend(node.childNodes[i]); + if (res.isSome()) { + return res; + } + } + return Optional.none(); + }; + return descend(scope.dom); + }; + + const ancestor$1 = (scope, selector, isRoot) => ancestor$2(scope, e => is$2(e, selector), isRoot); + const child = (scope, selector) => child$1(scope, e => is$2(e, selector)); + const descendant = (scope, selector) => one(selector, scope); + const closest$1 = (scope, selector, isRoot) => { + const is = (element, selector) => is$2(element, selector); + return ClosestOrAncestor(is, ancestor$1, scope, selector, isRoot); + }; + + const is = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs)); + const cat = arr => { + const r = []; + const push = x => { + r.push(x); + }; + for (let i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + const bindFrom = (a, f) => a !== undefined && a !== null ? f(a) : Optional.none(); + const someIf = (b, a) => b ? Optional.some(a) : Optional.none(); + + const checkRange = (str, substr, start) => substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; + const contains = (str, substr, start = 0, end) => { + const idx = str.indexOf(substr, start); + if (idx !== -1) { + return isUndefined(end) ? true : idx + substr.length <= end; + } else { + return false; + } + }; + const startsWith = (str, prefix) => { + return checkRange(str, prefix, 0); + }; + const endsWith = (str, suffix) => { + return checkRange(str, suffix, str.length - suffix.length); + }; + const blank = r => s => s.replace(r, ''); + const trim = blank(/^\s+|\s+$/g); + const isNotEmpty = s => s.length > 0; + const toFloat = value => { + const num = parseFloat(value); + return isNaN(num) ? Optional.none() : Optional.some(num); + }; + + const isSupported = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue); + + const internalSet = (dom, property, value) => { + if (!isString(value)) { + console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + const internalRemove = (dom, property) => { + if (isSupported(dom)) { + dom.style.removeProperty(property); + } + }; + const set$1 = (element, property, value) => { + const dom = element.dom; + internalSet(dom, property, value); + }; + const setAll = (element, css) => { + const dom = element.dom; + each$1(css, (v, k) => { + internalSet(dom, k, v); + }); + }; + const get$a = (element, property) => { + const dom = element.dom; + const styles = window.getComputedStyle(dom); + const r = styles.getPropertyValue(property); + return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + }; + const getUnsafeProperty = (dom, property) => isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + const getRaw$2 = (element, property) => { + const dom = element.dom; + const raw = getUnsafeProperty(dom, property); + return Optional.from(raw).filter(r => r.length > 0); + }; + const remove$5 = (element, property) => { + const dom = element.dom; + internalRemove(dom, property); + if (is(getOpt(element, 'style').map(trim), '')) { + remove$7(element, 'style'); + } + }; + const copy$1 = (source, target) => { + const sourceDom = source.dom; + const targetDom = target.dom; + if (isSupported(sourceDom) && isSupported(targetDom)) { + targetDom.style.cssText = sourceDom.style.cssText; + } + }; + + const getAttrValue = (cell, name, fallback = 0) => getOpt(cell, name).map(value => parseInt(value, 10)).getOr(fallback); + const getSpan = (cell, type) => getAttrValue(cell, type, 1); + const hasColspan = cellOrCol => { + if (isTag('col')(cellOrCol)) { + return getAttrValue(cellOrCol, 'span', 1) > 1; + } else { + return getSpan(cellOrCol, 'colspan') > 1; + } + }; + const hasRowspan = cell => getSpan(cell, 'rowspan') > 1; + const getCssValue = (element, property) => parseInt(get$a(element, property), 10); + const minWidth = constant(10); + const minHeight = constant(10); + + const firstLayer = (scope, selector) => { + return filterFirstLayer(scope, selector, always); + }; + const filterFirstLayer = (scope, selector, predicate) => { + return bind$2(children$2(scope), x => { + if (is$2(x, selector)) { + return predicate(x) ? [x] : []; + } else { + return filterFirstLayer(x, selector, predicate); + } + }); + }; + + const lookup = (tags, element, isRoot = never) => { + if (isRoot(element)) { + return Optional.none(); + } + if (contains$2(tags, name(element))) { + return Optional.some(element); + } + const isRootOrUpperTable = elm => is$2(elm, 'table') || isRoot(elm); + return ancestor$1(element, tags.join(','), isRootOrUpperTable); + }; + const cell = (element, isRoot) => lookup([ + 'td', + 'th' + ], element, isRoot); + const cells$1 = ancestor => firstLayer(ancestor, 'th,td'); + const columns$1 = ancestor => { + if (is$2(ancestor, 'colgroup')) { + return children(ancestor, 'col'); + } else { + return bind$2(columnGroups(ancestor), columnGroup => children(columnGroup, 'col')); + } + }; + const table = (element, isRoot) => closest$1(element, 'table', isRoot); + const rows$1 = ancestor => firstLayer(ancestor, 'tr'); + const columnGroups = ancestor => table(ancestor).fold(constant([]), table => children(table, 'colgroup')); + + const fromRowsOrColGroups = (elems, getSection) => map$1(elems, row => { + if (name(row) === 'colgroup') { + const cells = map$1(columns$1(row), column => { + const colspan = getAttrValue(column, 'span', 1); + return detail(column, 1, colspan); + }); + return rowdetail(row, cells, 'colgroup'); + } else { + const cells = map$1(cells$1(row), cell => { + const rowspan = getAttrValue(cell, 'rowspan', 1); + const colspan = getAttrValue(cell, 'colspan', 1); + return detail(cell, rowspan, colspan); + }); + return rowdetail(row, cells, getSection(row)); + } + }); + const getParentSection = group => parent(group).map(parent => { + const parentName = name(parent); + return isValidSection(parentName) ? parentName : 'tbody'; + }).getOr('tbody'); + const fromTable$1 = table => { + const rows = rows$1(table); + const columnGroups$1 = columnGroups(table); + const elems = [ + ...columnGroups$1, + ...rows + ]; + return fromRowsOrColGroups(elems, getParentSection); + }; + const fromPastedRows = (elems, section) => fromRowsOrColGroups(elems, () => section); + + const cached = f => { + let called = false; + let r; + return (...args) => { + if (!called) { + called = true; + r = f.apply(null, args); + } + return r; + }; + }; + + const DeviceType = (os, browser, userAgent, mediaMatch) => { + const isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; + const isiPhone = os.isiOS() && !isiPad; + const isMobile = os.isiOS() || os.isAndroid(); + const isTouch = isMobile || mediaMatch('(pointer:coarse)'); + const isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); + const isPhone = isiPhone || isMobile && !isTablet; + const iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; + const isDesktop = !isPhone && !isTablet && !iOSwebview; + return { + isiPad: constant(isiPad), + isiPhone: constant(isiPhone), + isTablet: constant(isTablet), + isPhone: constant(isPhone), + isTouch: constant(isTouch), + isAndroid: os.isAndroid, + isiOS: os.isiOS, + isWebView: constant(iOSwebview), + isDesktop: constant(isDesktop) + }; + }; + + const firstMatch = (regexes, s) => { + for (let i = 0; i < regexes.length; i++) { + const x = regexes[i]; + if (x.test(s)) { + return x; + } + } + return undefined; + }; + const find = (regexes, agent) => { + const r = firstMatch(regexes, agent); + if (!r) { + return { + major: 0, + minor: 0 + }; + } + const group = i => { + return Number(agent.replace(r, '$' + i)); + }; + return nu$2(group(1), group(2)); + }; + const detect$5 = (versionRegexes, agent) => { + const cleanedAgent = String(agent).toLowerCase(); + if (versionRegexes.length === 0) { + return unknown$2(); + } + return find(versionRegexes, cleanedAgent); + }; + const unknown$2 = () => { + return nu$2(0, 0); + }; + const nu$2 = (major, minor) => { + return { + major, + minor + }; + }; + const Version = { + nu: nu$2, + detect: detect$5, + unknown: unknown$2 + }; + + const detectBrowser$1 = (browsers, userAgentData) => { + return findMap(userAgentData.brands, uaBrand => { + const lcBrand = uaBrand.brand.toLowerCase(); + return find$1(browsers, browser => { + var _a; + return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase()); + }).map(info => ({ + current: info.name, + version: Version.nu(parseInt(uaBrand.version, 10), 0) + })); + }); + }; + + const detect$4 = (candidates, userAgent) => { + const agent = String(userAgent).toLowerCase(); + return find$1(candidates, candidate => { + return candidate.search(agent); + }); + }; + const detectBrowser = (browsers, userAgent) => { + return detect$4(browsers, userAgent).map(browser => { + const version = Version.detect(browser.versionRegexes, userAgent); + return { + current: browser.name, + version + }; + }); + }; + const detectOs = (oses, userAgent) => { + return detect$4(oses, userAgent).map(os => { + const version = Version.detect(os.versionRegexes, userAgent); + return { + current: os.name, + version + }; + }); + }; + + const normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; + const checkContains = target => { + return uastring => { + return contains(uastring, target); + }; + }; + const browsers = [ + { + name: 'Edge', + versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], + search: uastring => { + return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); + } + }, + { + name: 'Chromium', + brand: 'Chromium', + versionRegexes: [ + /.*?chrome\/([0-9]+)\.([0-9]+).*/, + normalVersionRegex + ], + search: uastring => { + return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); + } + }, + { + name: 'IE', + versionRegexes: [ + /.*?msie\ ?([0-9]+)\.([0-9]+).*/, + /.*?rv:([0-9]+)\.([0-9]+).*/ + ], + search: uastring => { + return contains(uastring, 'msie') || contains(uastring, 'trident'); + } + }, + { + name: 'Opera', + versionRegexes: [ + normalVersionRegex, + /.*?opera\/([0-9]+)\.([0-9]+).*/ + ], + search: checkContains('opera') + }, + { + name: 'Firefox', + versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], + search: checkContains('firefox') + }, + { + name: 'Safari', + versionRegexes: [ + normalVersionRegex, + /.*?cpu os ([0-9]+)_([0-9]+).*/ + ], + search: uastring => { + return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit'); + } + } + ]; + const oses = [ + { + name: 'Windows', + search: checkContains('win'), + versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'iOS', + search: uastring => { + return contains(uastring, 'iphone') || contains(uastring, 'ipad'); + }, + versionRegexes: [ + /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, + /.*cpu os ([0-9]+)_([0-9]+).*/, + /.*cpu iphone os ([0-9]+)_([0-9]+).*/ + ] + }, + { + name: 'Android', + search: checkContains('android'), + versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'macOS', + search: checkContains('mac os x'), + versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] + }, + { + name: 'Linux', + search: checkContains('linux'), + versionRegexes: [] + }, + { + name: 'Solaris', + search: checkContains('sunos'), + versionRegexes: [] + }, + { + name: 'FreeBSD', + search: checkContains('freebsd'), + versionRegexes: [] + }, + { + name: 'ChromeOS', + search: checkContains('cros'), + versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] + } + ]; + const PlatformInfo = { + browsers: constant(browsers), + oses: constant(oses) + }; + + const edge = 'Edge'; + const chromium = 'Chromium'; + const ie = 'IE'; + const opera = 'Opera'; + const firefox = 'Firefox'; + const safari = 'Safari'; + const unknown$1 = () => { + return nu$1({ + current: undefined, + version: Version.unknown() + }); + }; + const nu$1 = info => { + const current = info.current; + const version = info.version; + const isBrowser = name => () => current === name; + return { + current, + version, + isEdge: isBrowser(edge), + isChromium: isBrowser(chromium), + isIE: isBrowser(ie), + isOpera: isBrowser(opera), + isFirefox: isBrowser(firefox), + isSafari: isBrowser(safari) + }; + }; + const Browser = { + unknown: unknown$1, + nu: nu$1, + edge: constant(edge), + chromium: constant(chromium), + ie: constant(ie), + opera: constant(opera), + firefox: constant(firefox), + safari: constant(safari) + }; + + const windows = 'Windows'; + const ios = 'iOS'; + const android = 'Android'; + const linux = 'Linux'; + const macos = 'macOS'; + const solaris = 'Solaris'; + const freebsd = 'FreeBSD'; + const chromeos = 'ChromeOS'; + const unknown = () => { + return nu({ + current: undefined, + version: Version.unknown() + }); + }; + const nu = info => { + const current = info.current; + const version = info.version; + const isOS = name => () => current === name; + return { + current, + version, + isWindows: isOS(windows), + isiOS: isOS(ios), + isAndroid: isOS(android), + isMacOS: isOS(macos), + isLinux: isOS(linux), + isSolaris: isOS(solaris), + isFreeBSD: isOS(freebsd), + isChromeOS: isOS(chromeos) + }; + }; + const OperatingSystem = { + unknown, + nu, + windows: constant(windows), + ios: constant(ios), + android: constant(android), + linux: constant(linux), + macos: constant(macos), + solaris: constant(solaris), + freebsd: constant(freebsd), + chromeos: constant(chromeos) + }; + + const detect$3 = (userAgent, userAgentDataOpt, mediaMatch) => { + const browsers = PlatformInfo.browsers(); + const oses = PlatformInfo.oses(); + const browser = userAgentDataOpt.bind(userAgentData => detectBrowser$1(browsers, userAgentData)).orThunk(() => detectBrowser(browsers, userAgent)).fold(Browser.unknown, Browser.nu); + const os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); + const deviceType = DeviceType(os, browser, userAgent, mediaMatch); + return { + browser, + os, + deviceType + }; + }; + const PlatformDetection = { detect: detect$3 }; + + const mediaMatch = query => window.matchMedia(query).matches; + let platform = cached(() => PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch)); + const detect$2 = () => platform(); + + const Dimension = (name, getOffset) => { + const set = (element, h) => { + if (!isNumber(h) && !h.match(/^[0-9]+$/)) { + throw new Error(name + '.set accepts only positive integer values. Value was ' + h); + } + const dom = element.dom; + if (isSupported(dom)) { + dom.style[name] = h + 'px'; + } + }; + const get = element => { + const r = getOffset(element); + if (r <= 0 || r === null) { + const css = get$a(element, name); + return parseFloat(css) || 0; + } + return r; + }; + const getOuter = get; + const aggregate = (element, properties) => foldl(properties, (acc, property) => { + const val = get$a(element, property); + const value = val === undefined ? 0 : parseInt(val, 10); + return isNaN(value) ? acc : acc + value; + }, 0); + const max = (element, value, properties) => { + const cumulativeInclusions = aggregate(element, properties); + const absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0; + return absoluteMax; + }; + return { + set, + get, + getOuter, + aggregate, + max + }; + }; + + const toNumber = (px, fallback) => toFloat(px).getOr(fallback); + const getProp = (element, name, fallback) => toNumber(get$a(element, name), fallback); + const calcContentBoxSize = (element, size, upper, lower) => { + const paddingUpper = getProp(element, `padding-${ upper }`, 0); + const paddingLower = getProp(element, `padding-${ lower }`, 0); + const borderUpper = getProp(element, `border-${ upper }-width`, 0); + const borderLower = getProp(element, `border-${ lower }-width`, 0); + return size - paddingUpper - paddingLower - borderUpper - borderLower; + }; + const getCalculatedWidth = (element, boxSizing) => { + const dom = element.dom; + const width = dom.getBoundingClientRect().width || dom.offsetWidth; + return boxSizing === 'border-box' ? width : calcContentBoxSize(element, width, 'left', 'right'); + }; + const getHeight$1 = element => getProp(element, 'height', element.dom.offsetHeight); + const getWidth = element => getProp(element, 'width', element.dom.offsetWidth); + const getInnerWidth = element => getCalculatedWidth(element, 'content-box'); + + const api$2 = Dimension('width', element => element.dom.offsetWidth); + const get$9 = element => api$2.get(element); + const getOuter$2 = element => api$2.getOuter(element); + const getInner = getInnerWidth; + const getRuntime$1 = getWidth; + + const addCells = (gridRow, index, cells) => { + const existingCells = gridRow.cells; + const before = existingCells.slice(0, index); + const after = existingCells.slice(index); + const newCells = before.concat(cells).concat(after); + return setCells(gridRow, newCells); + }; + const addCell = (gridRow, index, cell) => addCells(gridRow, index, [cell]); + const mutateCell = (gridRow, index, cell) => { + const cells = gridRow.cells; + cells[index] = cell; + }; + const setCells = (gridRow, cells) => rowcells(gridRow.element, cells, gridRow.section, gridRow.isNew); + const mapCells = (gridRow, f) => { + const cells = gridRow.cells; + const r = map$1(cells, f); + return rowcells(gridRow.element, r, gridRow.section, gridRow.isNew); + }; + const getCell = (gridRow, index) => gridRow.cells[index]; + const getCellElement = (gridRow, index) => getCell(gridRow, index).element; + const cellLength = gridRow => gridRow.cells.length; + const extractGridDetails = grid => { + const result = partition(grid, row => row.section === 'colgroup'); + return { + rows: result.fail, + cols: result.pass + }; + }; + const clone = (gridRow, cloneRow, cloneCell) => { + const newCells = map$1(gridRow.cells, cloneCell); + return rowcells(cloneRow(gridRow.element), newCells, gridRow.section, true); + }; + + const LOCKED_COL_ATTR = 'data-snooker-locked-cols'; + const getLockedColumnsFromTable = table => getOpt(table, LOCKED_COL_ATTR).bind(lockedColStr => Optional.from(lockedColStr.match(/\d+/g))).map(lockedCols => mapToObject(lockedCols, always)); + const getLockedColumnsFromGrid = grid => { + const locked = foldl(extractGridDetails(grid).rows, (acc, row) => { + each$2(row.cells, (cell, idx) => { + if (cell.isLocked) { + acc[idx] = true; + } + }); + return acc; + }, {}); + const lockedArr = mapToArray(locked, (_val, key) => parseInt(key, 10)); + return sort$1(lockedArr); + }; + + const key = (row, column) => { + return row + ',' + column; + }; + const getAt = (warehouse, row, column) => Optional.from(warehouse.access[key(row, column)]); + const findItem = (warehouse, item, comparator) => { + const filtered = filterItems(warehouse, detail => { + return comparator(item, detail.element); + }); + return filtered.length > 0 ? Optional.some(filtered[0]) : Optional.none(); + }; + const filterItems = (warehouse, predicate) => { + const all = bind$2(warehouse.all, r => { + return r.cells; + }); + return filter$2(all, predicate); + }; + const generateColumns = rowData => { + const columnsGroup = {}; + let index = 0; + each$2(rowData.cells, column => { + const colspan = column.colspan; + range$1(colspan, columnIndex => { + const colIndex = index + columnIndex; + columnsGroup[colIndex] = columnext(column.element, colspan, colIndex); + }); + index += colspan; + }); + return columnsGroup; + }; + const generate$1 = list => { + const access = {}; + const cells = []; + const tableOpt = head(list).map(rowData => rowData.element).bind(table); + const lockedColumns = tableOpt.bind(getLockedColumnsFromTable).getOr({}); + let maxRows = 0; + let maxColumns = 0; + let rowCount = 0; + const { + pass: colgroupRows, + fail: rows + } = partition(list, rowData => rowData.section === 'colgroup'); + each$2(rows, rowData => { + const currentRow = []; + each$2(rowData.cells, rowCell => { + let start = 0; + while (access[key(rowCount, start)] !== undefined) { + start++; + } + const isLocked = hasNonNullableKey(lockedColumns, start.toString()); + const current = extended(rowCell.element, rowCell.rowspan, rowCell.colspan, rowCount, start, isLocked); + for (let occupiedColumnPosition = 0; occupiedColumnPosition < rowCell.colspan; occupiedColumnPosition++) { + for (let occupiedRowPosition = 0; occupiedRowPosition < rowCell.rowspan; occupiedRowPosition++) { + const rowPosition = rowCount + occupiedRowPosition; + const columnPosition = start + occupiedColumnPosition; + const newpos = key(rowPosition, columnPosition); + access[newpos] = current; + maxColumns = Math.max(maxColumns, columnPosition + 1); + } + } + currentRow.push(current); + }); + maxRows++; + cells.push(rowdetail(rowData.element, currentRow, rowData.section)); + rowCount++; + }); + const {columns, colgroups} = last$2(colgroupRows).map(rowData => { + const columns = generateColumns(rowData); + const colgroup$1 = colgroup(rowData.element, values(columns)); + return { + colgroups: [colgroup$1], + columns + }; + }).getOrThunk(() => ({ + colgroups: [], + columns: {} + })); + const grid$1 = grid(maxRows, maxColumns); + return { + grid: grid$1, + access, + all: cells, + columns, + colgroups + }; + }; + const fromTable = table => { + const list = fromTable$1(table); + return generate$1(list); + }; + const justCells = warehouse => bind$2(warehouse.all, w => w.cells); + const justColumns = warehouse => values(warehouse.columns); + const hasColumns = warehouse => keys(warehouse.columns).length > 0; + const getColumnAt = (warehouse, columnIndex) => Optional.from(warehouse.columns[columnIndex]); + const Warehouse = { + fromTable, + generate: generate$1, + getAt, + findItem, + filterItems, + justCells, + justColumns, + hasColumns, + getColumnAt + }; + + const columns = (warehouse, isValidCell = always) => { + const grid = warehouse.grid; + const cols = range$1(grid.columns, identity); + const rowsArr = range$1(grid.rows, identity); + return map$1(cols, col => { + const getBlock = () => bind$2(rowsArr, r => Warehouse.getAt(warehouse, r, col).filter(detail => detail.column === col).toArray()); + const isValid = detail => detail.colspan === 1 && isValidCell(detail.element); + const getFallback = () => Warehouse.getAt(warehouse, 0, col); + return decide(getBlock, isValid, getFallback); + }); + }; + const decide = (getBlock, isValid, getFallback) => { + const inBlock = getBlock(); + const validInBlock = find$1(inBlock, isValid); + const detailOption = validInBlock.orThunk(() => Optional.from(inBlock[0]).orThunk(getFallback)); + return detailOption.map(detail => detail.element); + }; + const rows = warehouse => { + const grid = warehouse.grid; + const rowsArr = range$1(grid.rows, identity); + const cols = range$1(grid.columns, identity); + return map$1(rowsArr, row => { + const getBlock = () => bind$2(cols, c => Warehouse.getAt(warehouse, row, c).filter(detail => detail.row === row).fold(constant([]), detail => [detail])); + const isSingle = detail => detail.rowspan === 1; + const getFallback = () => Warehouse.getAt(warehouse, row, 0); + return decide(getBlock, isSingle, getFallback); + }); + }; + + const deduce = (xs, index) => { + if (index < 0 || index >= xs.length - 1) { + return Optional.none(); + } + const current = xs[index].fold(() => { + const rest = reverse(xs.slice(0, index)); + return findMap(rest, (a, i) => a.map(aa => ({ + value: aa, + delta: i + 1 + }))); + }, c => Optional.some({ + value: c, + delta: 0 + })); + const next = xs[index + 1].fold(() => { + const rest = xs.slice(index + 1); + return findMap(rest, (a, i) => a.map(aa => ({ + value: aa, + delta: i + 1 + }))); + }, n => Optional.some({ + value: n, + delta: 1 + })); + return current.bind(c => next.map(n => { + const extras = n.delta + c.delta; + return Math.abs(n.value - c.value) / extras; + })); + }; + + const onDirection = (isLtr, isRtl) => element => getDirection(element) === 'rtl' ? isRtl : isLtr; + const getDirection = element => get$a(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; + + const api$1 = Dimension('height', element => { + const dom = element.dom; + return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight; + }); + const get$8 = element => api$1.get(element); + const getOuter$1 = element => api$1.getOuter(element); + const getRuntime = getHeight$1; + + const r = (left, top) => { + const translate = (x, y) => r(left + x, top + y); + return { + left, + top, + translate + }; + }; + const SugarPosition = r; + + const boxPosition = dom => { + const box = dom.getBoundingClientRect(); + return SugarPosition(box.left, box.top); + }; + const firstDefinedOrZero = (a, b) => { + if (a !== undefined) { + return a; + } else { + return b !== undefined ? b : 0; + } + }; + const absolute = element => { + const doc = element.dom.ownerDocument; + const body = doc.body; + const win = doc.defaultView; + const html = doc.documentElement; + if (body === element.dom) { + return SugarPosition(body.offsetLeft, body.offsetTop); + } + const scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop); + const scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft); + const clientTop = firstDefinedOrZero(html.clientTop, body.clientTop); + const clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft); + return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop); + }; + const viewport = element => { + const dom = element.dom; + const doc = dom.ownerDocument; + const body = doc.body; + if (body === dom) { + return SugarPosition(body.offsetLeft, body.offsetTop); + } + if (!inBody(element)) { + return SugarPosition(0, 0); + } + return boxPosition(dom); + }; + + const rowInfo = (row, y) => ({ + row, + y + }); + const colInfo = (col, x) => ({ + col, + x + }); + const rtlEdge = cell => { + const pos = absolute(cell); + return pos.left + getOuter$2(cell); + }; + const ltrEdge = cell => { + return absolute(cell).left; + }; + const getLeftEdge = (index, cell) => { + return colInfo(index, ltrEdge(cell)); + }; + const getRightEdge = (index, cell) => { + return colInfo(index, rtlEdge(cell)); + }; + const getTop$1 = cell => { + return absolute(cell).top; + }; + const getTopEdge = (index, cell) => { + return rowInfo(index, getTop$1(cell)); + }; + const getBottomEdge = (index, cell) => { + return rowInfo(index, getTop$1(cell) + getOuter$1(cell)); + }; + const findPositions = (getInnerEdge, getOuterEdge, array) => { + if (array.length === 0) { + return []; + } + const lines = map$1(array.slice(1), (cellOption, index) => { + return cellOption.map(cell => { + return getInnerEdge(index, cell); + }); + }); + const lastLine = array[array.length - 1].map(cell => { + return getOuterEdge(array.length - 1, cell); + }); + return lines.concat([lastLine]); + }; + const negate = step => { + return -step; + }; + const height = { + delta: identity, + positions: optElements => findPositions(getTopEdge, getBottomEdge, optElements), + edge: getTop$1 + }; + const ltr$1 = { + delta: identity, + edge: ltrEdge, + positions: optElements => findPositions(getLeftEdge, getRightEdge, optElements) + }; + const rtl$1 = { + delta: negate, + edge: rtlEdge, + positions: optElements => findPositions(getRightEdge, getLeftEdge, optElements) + }; + const detect$1 = onDirection(ltr$1, rtl$1); + const width = { + delta: (amount, table) => detect$1(table).delta(amount, table), + positions: (cols, table) => detect$1(table).positions(cols, table), + edge: cell => detect$1(cell).edge(cell) + }; + + const units = { + unsupportedLength: [ + 'em', + 'ex', + 'cap', + 'ch', + 'ic', + 'rem', + 'lh', + 'rlh', + 'vw', + 'vh', + 'vi', + 'vb', + 'vmin', + 'vmax', + 'cm', + 'mm', + 'Q', + 'in', + 'pc', + 'pt', + 'px' + ], + fixed: [ + 'px', + 'pt' + ], + relative: ['%'], + empty: [''] + }; + const pattern = (() => { + const decimalDigits = '[0-9]+'; + const signedInteger = '[+-]?' + decimalDigits; + const exponentPart = '[eE]' + signedInteger; + const dot = '\\.'; + const opt = input => `(?:${ input })?`; + const unsignedDecimalLiteral = [ + 'Infinity', + decimalDigits + dot + opt(decimalDigits) + opt(exponentPart), + dot + decimalDigits + opt(exponentPart), + decimalDigits + opt(exponentPart) + ].join('|'); + const float = `[+-]?(?:${ unsignedDecimalLiteral })`; + return new RegExp(`^(${ float })(.*)$`); + })(); + const isUnit = (unit, accepted) => exists(accepted, acc => exists(units[acc], check => unit === check)); + const parse = (input, accepted) => { + const match = Optional.from(pattern.exec(input)); + return match.bind(array => { + const value = Number(array[1]); + const unitRaw = array[2]; + if (isUnit(unitRaw, accepted)) { + return Optional.some({ + value, + unit: unitRaw + }); + } else { + return Optional.none(); + } + }); + }; + + const rPercentageBasedSizeRegex = /(\d+(\.\d+)?)%/; + const rPixelBasedSizeRegex = /(\d+(\.\d+)?)px|em/; + const isCol$2 = isTag('col'); + const getPercentSize = (elm, outerGetter, innerGetter) => { + const relativeParent = parentElement(elm).getOrThunk(() => getBody$1(owner(elm))); + return outerGetter(elm) / innerGetter(relativeParent) * 100; + }; + const setPixelWidth = (cell, amount) => { + set$1(cell, 'width', amount + 'px'); + }; + const setPercentageWidth = (cell, amount) => { + set$1(cell, 'width', amount + '%'); + }; + const setHeight = (cell, amount) => { + set$1(cell, 'height', amount + 'px'); + }; + const getHeightValue = cell => getRuntime(cell) + 'px'; + const convert = (cell, number, getter, setter) => { + const newSize = table(cell).map(table => { + const total = getter(table); + return Math.floor(number / 100 * total); + }).getOr(number); + setter(cell, newSize); + return newSize; + }; + const normalizePixelSize = (value, cell, getter, setter) => { + const number = parseFloat(value); + return endsWith(value, '%') && name(cell) !== 'table' ? convert(cell, number, getter, setter) : number; + }; + const getTotalHeight = cell => { + const value = getHeightValue(cell); + if (!value) { + return get$8(cell); + } + return normalizePixelSize(value, cell, get$8, setHeight); + }; + const get$7 = (cell, type, f) => { + const v = f(cell); + const span = getSpan(cell, type); + return v / span; + }; + const getRaw$1 = (element, prop) => { + return getRaw$2(element, prop).orThunk(() => { + return getOpt(element, prop).map(val => val + 'px'); + }); + }; + const getRawWidth$1 = element => getRaw$1(element, 'width'); + const getRawHeight = element => getRaw$1(element, 'height'); + const getPercentageWidth = cell => getPercentSize(cell, get$9, getInner); + const getPixelWidth$1 = cell => isCol$2(cell) ? get$9(cell) : getRuntime$1(cell); + const getHeight = cell => { + return get$7(cell, 'rowspan', getTotalHeight); + }; + const getGenericWidth = cell => { + const width = getRawWidth$1(cell); + return width.bind(w => parse(w, [ + 'fixed', + 'relative', + 'empty' + ])); + }; + const setGenericWidth = (cell, amount, unit) => { + set$1(cell, 'width', amount + unit); + }; + const getPixelTableWidth = table => get$9(table) + 'px'; + const getPercentTableWidth = table => getPercentSize(table, get$9, getInner) + '%'; + const isPercentSizing$1 = table => getRawWidth$1(table).exists(size => rPercentageBasedSizeRegex.test(size)); + const isPixelSizing$1 = table => getRawWidth$1(table).exists(size => rPixelBasedSizeRegex.test(size)); + const isNoneSizing$1 = table => getRawWidth$1(table).isNone(); + const percentageBasedSizeRegex = constant(rPercentageBasedSizeRegex); + + const isCol$1 = isTag('col'); + const getRawW = cell => { + return getRawWidth$1(cell).getOrThunk(() => getPixelWidth$1(cell) + 'px'); + }; + const getRawH = cell => { + return getRawHeight(cell).getOrThunk(() => getHeight(cell) + 'px'); + }; + const justCols = warehouse => map$1(Warehouse.justColumns(warehouse), column => Optional.from(column.element)); + const isValidColumn = cell => { + const browser = detect$2().browser; + const supportsColWidths = browser.isChromium() || browser.isFirefox(); + return isCol$1(cell) ? supportsColWidths : true; + }; + const getDimension = (cellOpt, index, backups, filter, getter, fallback) => cellOpt.filter(filter).fold(() => fallback(deduce(backups, index)), cell => getter(cell)); + const getWidthFrom = (warehouse, table, getWidth, fallback) => { + const columnCells = columns(warehouse); + const columns$1 = Warehouse.hasColumns(warehouse) ? justCols(warehouse) : columnCells; + const backups = [Optional.some(width.edge(table))].concat(map$1(width.positions(columnCells, table), pos => pos.map(p => p.x))); + const colFilter = not(hasColspan); + return map$1(columns$1, (cellOption, c) => { + return getDimension(cellOption, c, backups, colFilter, column => { + if (isValidColumn(column)) { + return getWidth(column); + } else { + const cell = bindFrom(columnCells[c], identity); + return getDimension(cell, c, backups, colFilter, cell => fallback(Optional.some(get$9(cell))), fallback); + } + }, fallback); + }); + }; + const getDeduced = deduced => { + return deduced.map(d => { + return d + 'px'; + }).getOr(''); + }; + const getRawWidths = (warehouse, table) => { + return getWidthFrom(warehouse, table, getRawW, getDeduced); + }; + const getPercentageWidths = (warehouse, table, tableSize) => { + return getWidthFrom(warehouse, table, getPercentageWidth, deduced => { + return deduced.fold(() => { + return tableSize.minCellWidth(); + }, cellWidth => { + return cellWidth / tableSize.pixelWidth() * 100; + }); + }); + }; + const getPixelWidths = (warehouse, table, tableSize) => { + return getWidthFrom(warehouse, table, getPixelWidth$1, deduced => { + return deduced.getOrThunk(tableSize.minCellWidth); + }); + }; + const getHeightFrom = (warehouse, table, direction, getHeight, fallback) => { + const rows$1 = rows(warehouse); + const backups = [Optional.some(direction.edge(table))].concat(map$1(direction.positions(rows$1, table), pos => pos.map(p => p.y))); + return map$1(rows$1, (cellOption, c) => { + return getDimension(cellOption, c, backups, not(hasRowspan), getHeight, fallback); + }); + }; + const getPixelHeights = (warehouse, table, direction) => { + return getHeightFrom(warehouse, table, direction, getHeight, deduced => { + return deduced.getOrThunk(minHeight); + }); + }; + const getRawHeights = (warehouse, table, direction) => { + return getHeightFrom(warehouse, table, direction, getRawH, getDeduced); + }; + + const widthLookup = (table, getter) => () => { + if (inBody(table)) { + return getter(table); + } else { + return parseFloat(getRaw$2(table, 'width').getOr('0')); + } + }; + const noneSize = table => { + const getWidth = widthLookup(table, get$9); + const zero = constant(0); + const getWidths = (warehouse, tableSize) => getPixelWidths(warehouse, table, tableSize); + return { + width: getWidth, + pixelWidth: getWidth, + getWidths, + getCellDelta: zero, + singleColumnWidth: constant([0]), + minCellWidth: zero, + setElementWidth: noop, + adjustTableWidth: noop, + isRelative: true, + label: 'none' + }; + }; + const percentageSize = table => { + const getFloatWidth = widthLookup(table, elem => parseFloat(getPercentTableWidth(elem))); + const getWidth = widthLookup(table, get$9); + const getCellDelta = delta => delta / getWidth() * 100; + const singleColumnWidth = (w, _delta) => [100 - w]; + const minCellWidth = () => minWidth() / getWidth() * 100; + const adjustTableWidth = delta => { + const currentWidth = getFloatWidth(); + const change = delta / 100 * currentWidth; + const newWidth = currentWidth + change; + setPercentageWidth(table, newWidth); + }; + const getWidths = (warehouse, tableSize) => getPercentageWidths(warehouse, table, tableSize); + return { + width: getFloatWidth, + pixelWidth: getWidth, + getWidths, + getCellDelta, + singleColumnWidth, + minCellWidth, + setElementWidth: setPercentageWidth, + adjustTableWidth, + isRelative: true, + label: 'percent' + }; + }; + const pixelSize = table => { + const getWidth = widthLookup(table, get$9); + const getCellDelta = identity; + const singleColumnWidth = (w, delta) => { + const newNext = Math.max(minWidth(), w + delta); + return [newNext - w]; + }; + const adjustTableWidth = delta => { + const newWidth = getWidth() + delta; + setPixelWidth(table, newWidth); + }; + const getWidths = (warehouse, tableSize) => getPixelWidths(warehouse, table, tableSize); + return { + width: getWidth, + pixelWidth: getWidth, + getWidths, + getCellDelta, + singleColumnWidth, + minCellWidth: minWidth, + setElementWidth: setPixelWidth, + adjustTableWidth, + isRelative: false, + label: 'pixel' + }; + }; + const chooseSize = (element, width) => { + const percentMatch = percentageBasedSizeRegex().exec(width); + if (percentMatch !== null) { + return percentageSize(element); + } else { + return pixelSize(element); + } + }; + const getTableSize = table => { + const width = getRawWidth$1(table); + return width.fold(() => noneSize(table), w => chooseSize(table, w)); + }; + const TableSize = { + getTableSize, + pixelSize, + percentageSize, + noneSize + }; + + const statsStruct = (minRow, minCol, maxRow, maxCol, allCells, selectedCells) => ({ + minRow, + minCol, + maxRow, + maxCol, + allCells, + selectedCells + }); + const findSelectedStats = (house, isSelected) => { + const totalColumns = house.grid.columns; + const totalRows = house.grid.rows; + let minRow = totalRows; + let minCol = totalColumns; + let maxRow = 0; + let maxCol = 0; + const allCells = []; + const selectedCells = []; + each$1(house.access, detail => { + allCells.push(detail); + if (isSelected(detail)) { + selectedCells.push(detail); + const startRow = detail.row; + const endRow = startRow + detail.rowspan - 1; + const startCol = detail.column; + const endCol = startCol + detail.colspan - 1; + if (startRow < minRow) { + minRow = startRow; + } else if (endRow > maxRow) { + maxRow = endRow; + } + if (startCol < minCol) { + minCol = startCol; + } else if (endCol > maxCol) { + maxCol = endCol; + } + } + }); + return statsStruct(minRow, minCol, maxRow, maxCol, allCells, selectedCells); + }; + const makeCell = (list, seenSelected, rowIndex) => { + const row = list[rowIndex].element; + const td = SugarElement.fromTag('td'); + append$1(td, SugarElement.fromTag('br')); + const f = seenSelected ? append$1 : prepend; + f(row, td); + }; + const fillInGaps = (list, house, stats, isSelected) => { + const rows = filter$2(list, row => row.section !== 'colgroup'); + const totalColumns = house.grid.columns; + const totalRows = house.grid.rows; + for (let i = 0; i < totalRows; i++) { + let seenSelected = false; + for (let j = 0; j < totalColumns; j++) { + if (!(i < stats.minRow || i > stats.maxRow || j < stats.minCol || j > stats.maxCol)) { + const needCell = Warehouse.getAt(house, i, j).filter(isSelected).isNone(); + if (needCell) { + makeCell(rows, seenSelected, i); + } else { + seenSelected = true; + } + } + } + } + }; + const clean = (replica, stats, house, widthDelta) => { + each$1(house.columns, col => { + if (col.column < stats.minCol || col.column > stats.maxCol) { + remove$6(col.element); + } + }); + const emptyRows = filter$2(firstLayer(replica, 'tr'), row => row.dom.childElementCount === 0); + each$2(emptyRows, remove$6); + if (stats.minCol === stats.maxCol || stats.minRow === stats.maxRow) { + each$2(firstLayer(replica, 'th,td'), cell => { + remove$7(cell, 'rowspan'); + remove$7(cell, 'colspan'); + }); + } + remove$7(replica, LOCKED_COL_ATTR); + remove$7(replica, 'data-snooker-col-series'); + const tableSize = TableSize.getTableSize(replica); + tableSize.adjustTableWidth(widthDelta); + }; + const getTableWidthDelta = (table, warehouse, tableSize, stats) => { + if (stats.minCol === 0 && warehouse.grid.columns === stats.maxCol + 1) { + return 0; + } + const colWidths = getPixelWidths(warehouse, table, tableSize); + const allColsWidth = foldl(colWidths, (acc, width) => acc + width, 0); + const selectedColsWidth = foldl(colWidths.slice(stats.minCol, stats.maxCol + 1), (acc, width) => acc + width, 0); + const newWidth = selectedColsWidth / allColsWidth * tableSize.pixelWidth(); + const delta = newWidth - tableSize.pixelWidth(); + return tableSize.getCellDelta(delta); + }; + const extract$1 = (table, selectedSelector) => { + const isSelected = detail => is$2(detail.element, selectedSelector); + const replica = deep(table); + const list = fromTable$1(replica); + const tableSize = TableSize.getTableSize(table); + const replicaHouse = Warehouse.generate(list); + const replicaStats = findSelectedStats(replicaHouse, isSelected); + const selector = 'th:not(' + selectedSelector + ')' + ',td:not(' + selectedSelector + ')'; + const unselectedCells = filterFirstLayer(replica, 'th,td', cell => is$2(cell, selector)); + each$2(unselectedCells, remove$6); + fillInGaps(list, replicaHouse, replicaStats, isSelected); + const house = Warehouse.fromTable(table); + const widthDelta = getTableWidthDelta(table, house, tableSize, replicaStats); + clean(replica, replicaStats, replicaHouse, widthDelta); + return replica; + }; + + const nbsp = '\xA0'; + + const NodeValue = (is, name) => { + const get = element => { + if (!is(element)) { + throw new Error('Can only get ' + name + ' value of a ' + name + ' node'); + } + return getOption(element).getOr(''); + }; + const getOption = element => is(element) ? Optional.from(element.dom.nodeValue) : Optional.none(); + const set = (element, value) => { + if (!is(element)) { + throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node'); + } + element.dom.nodeValue = value; + }; + return { + get, + getOption, + set + }; + }; + + const api = NodeValue(isText, 'text'); + const get$6 = element => api.get(element); + const getOption = element => api.getOption(element); + const set = (element, value) => api.set(element, value); + + const getEnd = element => name(element) === 'img' ? 1 : getOption(element).fold(() => children$2(element).length, v => v.length); + const isTextNodeWithCursorPosition = el => getOption(el).filter(text => text.trim().length !== 0 || text.indexOf(nbsp) > -1).isSome(); + const isContentEditableFalse = elem => isHTMLElement(elem) && get$b(elem, 'contenteditable') === 'false'; + const elementsWithCursorPosition = [ + 'img', + 'br' + ]; + const isCursorPosition = elem => { + const hasCursorPosition = isTextNodeWithCursorPosition(elem); + return hasCursorPosition || contains$2(elementsWithCursorPosition, name(elem)) || isContentEditableFalse(elem); + }; + + const first = element => descendant$1(element, isCursorPosition); + const last$1 = element => descendantRtl(element, isCursorPosition); + const descendantRtl = (scope, predicate) => { + const descend = element => { + const children = children$2(element); + for (let i = children.length - 1; i >= 0; i--) { + const child = children[i]; + if (predicate(child)) { + return Optional.some(child); + } + const res = descend(child); + if (res.isSome()) { + return res; + } + } + return Optional.none(); + }; + return descend(scope); + }; + + const transferableAttributes = { + scope: [ + 'row', + 'col' + ] + }; + const createCell = doc => () => { + const td = SugarElement.fromTag('td', doc.dom); + append$1(td, SugarElement.fromTag('br', doc.dom)); + return td; + }; + const createCol = doc => () => { + return SugarElement.fromTag('col', doc.dom); + }; + const createColgroup = doc => () => { + return SugarElement.fromTag('colgroup', doc.dom); + }; + const createRow$1 = doc => () => { + return SugarElement.fromTag('tr', doc.dom); + }; + const replace$1 = (cell, tag, attrs) => { + const replica = copy$2(cell, tag); + each$1(attrs, (v, k) => { + if (v === null) { + remove$7(replica, k); + } else { + set$2(replica, k, v); + } + }); + return replica; + }; + const pasteReplace = cell => { + return cell; + }; + const cloneFormats = (oldCell, newCell, formats) => { + const first$1 = first(oldCell); + return first$1.map(firstText => { + const formatSelector = formats.join(','); + const parents = ancestors$3(firstText, formatSelector, element => { + return eq$1(element, oldCell); + }); + return foldr(parents, (last, parent) => { + const clonedFormat = shallow(parent); + append$1(last, clonedFormat); + return clonedFormat; + }, newCell); + }).getOr(newCell); + }; + const cloneAppropriateAttributes = (original, clone) => { + each$1(transferableAttributes, (validAttributes, attributeName) => getOpt(original, attributeName).filter(attribute => contains$2(validAttributes, attribute)).each(attribute => set$2(clone, attributeName, attribute))); + }; + const cellOperations = (mutate, doc, formatsToClone) => { + const cloneCss = (prev, clone) => { + copy$1(prev.element, clone); + remove$5(clone, 'height'); + if (prev.colspan !== 1) { + remove$5(clone, 'width'); + } + }; + const newCell = prev => { + const td = SugarElement.fromTag(name(prev.element), doc.dom); + const formats = formatsToClone.getOr([ + 'strong', + 'em', + 'b', + 'i', + 'span', + 'font', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'p', + 'div' + ]); + const lastNode = formats.length > 0 ? cloneFormats(prev.element, td, formats) : td; + append$1(lastNode, SugarElement.fromTag('br')); + cloneCss(prev, td); + cloneAppropriateAttributes(prev.element, td); + mutate(prev.element, td); + return td; + }; + const newCol = prev => { + const col = SugarElement.fromTag(name(prev.element), doc.dom); + cloneCss(prev, col); + mutate(prev.element, col); + return col; + }; + return { + col: newCol, + colgroup: createColgroup(doc), + row: createRow$1(doc), + cell: newCell, + replace: replace$1, + colGap: createCol(doc), + gap: createCell(doc) + }; + }; + const paste$1 = doc => { + return { + col: createCol(doc), + colgroup: createColgroup(doc), + row: createRow$1(doc), + cell: createCell(doc), + replace: pasteReplace, + colGap: createCol(doc), + gap: createCell(doc) + }; + }; + + const fromHtml = (html, scope) => { + const doc = scope || document; + const div = doc.createElement('div'); + div.innerHTML = html; + return children$2(SugarElement.fromDom(div)); + }; + const fromDom = nodes => map$1(nodes, SugarElement.fromDom); + + const option = name => editor => editor.options.get(name); + const defaultWidth = '100%'; + const getPixelForcedWidth = editor => { + var _a; + const dom = editor.dom; + const parentBlock = (_a = dom.getParent(editor.selection.getStart(), dom.isBlock)) !== null && _a !== void 0 ? _a : editor.getBody(); + return getInner(SugarElement.fromDom(parentBlock)) + 'px'; + }; + const determineDefaultTableStyles = (editor, defaultStyles) => { + if (isTableResponsiveForced(editor) || !shouldStyleWithCss(editor)) { + return defaultStyles; + } else if (isTablePixelsForced(editor)) { + return { + ...defaultStyles, + width: getPixelForcedWidth(editor) + }; + } else { + return { + ...defaultStyles, + width: defaultWidth + }; + } + }; + const determineDefaultTableAttributes = (editor, defaultAttributes) => { + if (isTableResponsiveForced(editor) || shouldStyleWithCss(editor)) { + return defaultAttributes; + } else if (isTablePixelsForced(editor)) { + return { + ...defaultAttributes, + width: getPixelForcedWidth(editor) + }; + } else { + return { + ...defaultAttributes, + width: defaultWidth + }; + } + }; + const register = editor => { + const registerOption = editor.options.register; + registerOption('table_clone_elements', { processor: 'string[]' }); + registerOption('table_use_colgroups', { + processor: 'boolean', + default: true + }); + registerOption('table_header_type', { + processor: value => { + const valid = contains$2([ + 'section', + 'cells', + 'sectionCells', + 'auto' + ], value); + return valid ? { + value, + valid + } : { + valid: false, + message: 'Must be one of: section, cells, sectionCells or auto.' + }; + }, + default: 'section' + }); + registerOption('table_sizing_mode', { + processor: 'string', + default: 'auto' + }); + registerOption('table_default_attributes', { + processor: 'object', + default: { border: '1' } + }); + registerOption('table_default_styles', { + processor: 'object', + default: { 'border-collapse': 'collapse' } + }); + registerOption('table_column_resizing', { + processor: value => { + const valid = contains$2([ + 'preservetable', + 'resizetable' + ], value); + return valid ? { + value, + valid + } : { + valid: false, + message: 'Must be preservetable, or resizetable.' + }; + }, + default: 'preservetable' + }); + registerOption('table_resize_bars', { + processor: 'boolean', + default: true + }); + registerOption('table_style_by_css', { + processor: 'boolean', + default: true + }); + registerOption('table_merge_content_on_paste', { + processor: 'boolean', + default: true + }); + }; + const getTableCloneElements = editor => { + return Optional.from(editor.options.get('table_clone_elements')); + }; + const hasTableObjectResizing = editor => { + const objectResizing = editor.options.get('object_resizing'); + return contains$2(objectResizing.split(','), 'table'); + }; + const getTableHeaderType = option('table_header_type'); + const getTableColumnResizingBehaviour = option('table_column_resizing'); + const isPreserveTableColumnResizing = editor => getTableColumnResizingBehaviour(editor) === 'preservetable'; + const isResizeTableColumnResizing = editor => getTableColumnResizingBehaviour(editor) === 'resizetable'; + const getTableSizingMode = option('table_sizing_mode'); + const isTablePercentagesForced = editor => getTableSizingMode(editor) === 'relative'; + const isTablePixelsForced = editor => getTableSizingMode(editor) === 'fixed'; + const isTableResponsiveForced = editor => getTableSizingMode(editor) === 'responsive'; + const hasTableResizeBars = option('table_resize_bars'); + const shouldStyleWithCss = option('table_style_by_css'); + const shouldMergeContentOnPaste = option('table_merge_content_on_paste'); + const getTableDefaultAttributes = editor => { + const options = editor.options; + const defaultAttributes = options.get('table_default_attributes'); + return options.isSet('table_default_attributes') ? defaultAttributes : determineDefaultTableAttributes(editor, defaultAttributes); + }; + const getTableDefaultStyles = editor => { + const options = editor.options; + const defaultStyles = options.get('table_default_styles'); + return options.isSet('table_default_styles') ? defaultStyles : determineDefaultTableStyles(editor, defaultStyles); + }; + const tableUseColumnGroup = option('table_use_colgroups'); + + const closest = target => closest$1(target, '[contenteditable]'); + const isEditable$1 = (element, assumeEditable = false) => { + if (inBody(element)) { + return element.dom.isContentEditable; + } else { + return closest(element).fold(constant(assumeEditable), editable => getRaw(editable) === 'true'); + } + }; + const getRaw = element => element.dom.contentEditable; + + const getBody = editor => SugarElement.fromDom(editor.getBody()); + const getIsRoot = editor => element => eq$1(element, getBody(editor)); + const removeDataStyle = table => { + remove$7(table, 'data-mce-style'); + const removeStyleAttribute = element => remove$7(element, 'data-mce-style'); + each$2(cells$1(table), removeStyleAttribute); + each$2(columns$1(table), removeStyleAttribute); + each$2(rows$1(table), removeStyleAttribute); + }; + const getSelectionStart = editor => SugarElement.fromDom(editor.selection.getStart()); + const getPixelWidth = elm => elm.getBoundingClientRect().width; + const getPixelHeight = elm => elm.getBoundingClientRect().height; + const getRawWidth = (editor, elm) => { + const raw = editor.dom.getStyle(elm, 'width') || editor.dom.getAttrib(elm, 'width'); + return Optional.from(raw).filter(isNotEmpty); + }; + const isPercentage$1 = value => /^(\d+(\.\d+)?)%$/.test(value); + const isPixel = value => /^(\d+(\.\d+)?)px$/.test(value); + const isInEditableContext$1 = cell => closest$2(cell, isTag('table')).exists(isEditable$1); + + const inSelection = (bounds, detail) => { + const leftEdge = detail.column; + const rightEdge = detail.column + detail.colspan - 1; + const topEdge = detail.row; + const bottomEdge = detail.row + detail.rowspan - 1; + return leftEdge <= bounds.finishCol && rightEdge >= bounds.startCol && (topEdge <= bounds.finishRow && bottomEdge >= bounds.startRow); + }; + const isWithin = (bounds, detail) => { + return detail.column >= bounds.startCol && detail.column + detail.colspan - 1 <= bounds.finishCol && detail.row >= bounds.startRow && detail.row + detail.rowspan - 1 <= bounds.finishRow; + }; + const isRectangular = (warehouse, bounds) => { + let isRect = true; + const detailIsWithin = curry(isWithin, bounds); + for (let i = bounds.startRow; i <= bounds.finishRow; i++) { + for (let j = bounds.startCol; j <= bounds.finishCol; j++) { + isRect = isRect && Warehouse.getAt(warehouse, i, j).exists(detailIsWithin); + } + } + return isRect ? Optional.some(bounds) : Optional.none(); + }; + + const getBounds = (detailA, detailB) => { + return bounds(Math.min(detailA.row, detailB.row), Math.min(detailA.column, detailB.column), Math.max(detailA.row + detailA.rowspan - 1, detailB.row + detailB.rowspan - 1), Math.max(detailA.column + detailA.colspan - 1, detailB.column + detailB.colspan - 1)); + }; + const getAnyBox = (warehouse, startCell, finishCell) => { + const startCoords = Warehouse.findItem(warehouse, startCell, eq$1); + const finishCoords = Warehouse.findItem(warehouse, finishCell, eq$1); + return startCoords.bind(sc => { + return finishCoords.map(fc => { + return getBounds(sc, fc); + }); + }); + }; + const getBox$1 = (warehouse, startCell, finishCell) => { + return getAnyBox(warehouse, startCell, finishCell).bind(bounds => { + return isRectangular(warehouse, bounds); + }); + }; + + const moveBy$1 = (warehouse, cell, row, column) => { + return Warehouse.findItem(warehouse, cell, eq$1).bind(detail => { + const startRow = row > 0 ? detail.row + detail.rowspan - 1 : detail.row; + const startCol = column > 0 ? detail.column + detail.colspan - 1 : detail.column; + const dest = Warehouse.getAt(warehouse, startRow + row, startCol + column); + return dest.map(d => { + return d.element; + }); + }); + }; + const intercepts$1 = (warehouse, start, finish) => { + return getAnyBox(warehouse, start, finish).map(bounds => { + const inside = Warehouse.filterItems(warehouse, curry(inSelection, bounds)); + return map$1(inside, detail => { + return detail.element; + }); + }); + }; + const parentCell = (warehouse, innerCell) => { + const isContainedBy = (c1, c2) => { + return contains$1(c2, c1); + }; + return Warehouse.findItem(warehouse, innerCell, isContainedBy).map(detail => { + return detail.element; + }); + }; + + const moveBy = (cell, deltaRow, deltaColumn) => { + return table(cell).bind(table => { + const warehouse = getWarehouse(table); + return moveBy$1(warehouse, cell, deltaRow, deltaColumn); + }); + }; + const intercepts = (table, first, last) => { + const warehouse = getWarehouse(table); + return intercepts$1(warehouse, first, last); + }; + const nestedIntercepts = (table, first, firstTable, last, lastTable) => { + const warehouse = getWarehouse(table); + const optStartCell = eq$1(table, firstTable) ? Optional.some(first) : parentCell(warehouse, first); + const optLastCell = eq$1(table, lastTable) ? Optional.some(last) : parentCell(warehouse, last); + return optStartCell.bind(startCell => optLastCell.bind(lastCell => intercepts$1(warehouse, startCell, lastCell))); + }; + const getBox = (table, first, last) => { + const warehouse = getWarehouse(table); + return getBox$1(warehouse, first, last); + }; + const getWarehouse = Warehouse.fromTable; + + var TagBoundaries = [ + 'body', + 'p', + 'div', + 'article', + 'aside', + 'figcaption', + 'figure', + 'footer', + 'header', + 'nav', + 'section', + 'ol', + 'ul', + 'li', + 'table', + 'thead', + 'tbody', + 'tfoot', + 'caption', + 'tr', + 'td', + 'th', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'blockquote', + 'pre', + 'address' + ]; + + var DomUniverse = () => { + const clone = element => { + return SugarElement.fromDom(element.dom.cloneNode(false)); + }; + const document = element => documentOrOwner(element).dom; + const isBoundary = element => { + if (!isElement(element)) { + return false; + } + if (name(element) === 'body') { + return true; + } + return contains$2(TagBoundaries, name(element)); + }; + const isEmptyTag = element => { + if (!isElement(element)) { + return false; + } + return contains$2([ + 'br', + 'img', + 'hr', + 'input' + ], name(element)); + }; + const isNonEditable = element => isElement(element) && get$b(element, 'contenteditable') === 'false'; + const comparePosition = (element, other) => { + return element.dom.compareDocumentPosition(other.dom); + }; + const copyAttributesTo = (source, destination) => { + const as = clone$2(source); + setAll$1(destination, as); + }; + const isSpecial = element => { + const tag = name(element); + return contains$2([ + 'script', + 'noscript', + 'iframe', + 'noframes', + 'noembed', + 'title', + 'style', + 'textarea', + 'xmp' + ], tag); + }; + const getLanguage = element => isElement(element) ? getOpt(element, 'lang') : Optional.none(); + return { + up: constant({ + selector: ancestor$1, + closest: closest$1, + predicate: ancestor$2, + all: parents + }), + down: constant({ + selector: descendants, + predicate: descendants$1 + }), + styles: constant({ + get: get$a, + getRaw: getRaw$2, + set: set$1, + remove: remove$5 + }), + attrs: constant({ + get: get$b, + set: set$2, + remove: remove$7, + copyTo: copyAttributesTo + }), + insert: constant({ + before: before$3, + after: after$5, + afterAll: after$4, + append: append$1, + appendAll: append, + prepend: prepend, + wrap: wrap + }), + remove: constant({ + unwrap: unwrap, + remove: remove$6 + }), + create: constant({ + nu: SugarElement.fromTag, + clone, + text: SugarElement.fromText + }), + query: constant({ + comparePosition, + prevSibling: prevSibling, + nextSibling: nextSibling + }), + property: constant({ + children: children$2, + name: name, + parent: parent, + document, + isText: isText, + isComment: isComment, + isElement: isElement, + isSpecial, + getLanguage, + getText: get$6, + setText: set, + isBoundary, + isEmptyTag, + isNonEditable + }), + eq: eq$1, + is: is$1 + }; + }; + + const all = (universe, look, elements, f) => { + const head = elements[0]; + const tail = elements.slice(1); + return f(universe, look, head, tail); + }; + const oneAll = (universe, look, elements) => { + return elements.length > 0 ? all(universe, look, elements, unsafeOne) : Optional.none(); + }; + const unsafeOne = (universe, look, head, tail) => { + const start = look(universe, head); + return foldr(tail, (b, a) => { + const current = look(universe, a); + return commonElement(universe, b, current); + }, start); + }; + const commonElement = (universe, start, end) => { + return start.bind(s => { + return end.filter(curry(universe.eq, s)); + }); + }; + + const eq = (universe, item) => { + return curry(universe.eq, item); + }; + const ancestors$2 = (universe, start, end, isRoot = never) => { + const ps1 = [start].concat(universe.up().all(start)); + const ps2 = [end].concat(universe.up().all(end)); + const prune = path => { + const index = findIndex(path, isRoot); + return index.fold(() => { + return path; + }, ind => { + return path.slice(0, ind + 1); + }); + }; + const pruned1 = prune(ps1); + const pruned2 = prune(ps2); + const shared = find$1(pruned1, x => { + return exists(pruned2, eq(universe, x)); + }); + return { + firstpath: pruned1, + secondpath: pruned2, + shared + }; + }; + + const sharedOne$1 = oneAll; + const ancestors$1 = ancestors$2; + + const universe$3 = DomUniverse(); + const sharedOne = (look, elements) => { + return sharedOne$1(universe$3, (_universe, element) => { + return look(element); + }, elements); + }; + const ancestors = (start, finish, isRoot) => { + return ancestors$1(universe$3, start, finish, isRoot); + }; + + const lookupTable = container => { + return ancestor$1(container, 'table'); + }; + const identify = (start, finish, isRoot) => { + const getIsRoot = rootTable => { + return element => { + return isRoot !== undefined && isRoot(element) || eq$1(element, rootTable); + }; + }; + if (eq$1(start, finish)) { + return Optional.some({ + boxes: Optional.some([start]), + start, + finish + }); + } else { + return lookupTable(start).bind(startTable => { + return lookupTable(finish).bind(finishTable => { + if (eq$1(startTable, finishTable)) { + return Optional.some({ + boxes: intercepts(startTable, start, finish), + start, + finish + }); + } else if (contains$1(startTable, finishTable)) { + const ancestorCells = ancestors$3(finish, 'td,th', getIsRoot(startTable)); + const finishCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : finish; + return Optional.some({ + boxes: nestedIntercepts(startTable, start, startTable, finish, finishTable), + start, + finish: finishCell + }); + } else if (contains$1(finishTable, startTable)) { + const ancestorCells = ancestors$3(start, 'td,th', getIsRoot(finishTable)); + const startCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : start; + return Optional.some({ + boxes: nestedIntercepts(finishTable, start, startTable, finish, finishTable), + start, + finish: startCell + }); + } else { + return ancestors(start, finish).shared.bind(lca => { + return closest$1(lca, 'table', isRoot).bind(lcaTable => { + const finishAncestorCells = ancestors$3(finish, 'td,th', getIsRoot(lcaTable)); + const finishCell = finishAncestorCells.length > 0 ? finishAncestorCells[finishAncestorCells.length - 1] : finish; + const startAncestorCells = ancestors$3(start, 'td,th', getIsRoot(lcaTable)); + const startCell = startAncestorCells.length > 0 ? startAncestorCells[startAncestorCells.length - 1] : start; + return Optional.some({ + boxes: nestedIntercepts(lcaTable, start, startTable, finish, finishTable), + start: startCell, + finish: finishCell + }); + }); + }); + } + }); + }); + } + }; + const retrieve$1 = (container, selector) => { + const sels = descendants(container, selector); + return sels.length > 0 ? Optional.some(sels) : Optional.none(); + }; + const getLast = (boxes, lastSelectedSelector) => { + return find$1(boxes, box => { + return is$2(box, lastSelectedSelector); + }); + }; + const getEdges = (container, firstSelectedSelector, lastSelectedSelector) => { + return descendant(container, firstSelectedSelector).bind(first => { + return descendant(container, lastSelectedSelector).bind(last => { + return sharedOne(lookupTable, [ + first, + last + ]).map(table => { + return { + first, + last, + table + }; + }); + }); + }); + }; + const expandTo = (finish, firstSelectedSelector) => { + return ancestor$1(finish, 'table').bind(table => { + return descendant(table, firstSelectedSelector).bind(start => { + return identify(start, finish).bind(identified => { + return identified.boxes.map(boxes => { + return { + boxes, + start: identified.start, + finish: identified.finish + }; + }); + }); + }); + }); + }; + const shiftSelection = (boxes, deltaRow, deltaColumn, firstSelectedSelector, lastSelectedSelector) => { + return getLast(boxes, lastSelectedSelector).bind(last => { + return moveBy(last, deltaRow, deltaColumn).bind(finish => { + return expandTo(finish, firstSelectedSelector); + }); + }); + }; + + const retrieve = (container, selector) => { + return retrieve$1(container, selector); + }; + const retrieveBox = (container, firstSelectedSelector, lastSelectedSelector) => { + return getEdges(container, firstSelectedSelector, lastSelectedSelector).bind(edges => { + const isRoot = ancestor => { + return eq$1(container, ancestor); + }; + const sectionSelector = 'thead,tfoot,tbody,table'; + const firstAncestor = ancestor$1(edges.first, sectionSelector, isRoot); + const lastAncestor = ancestor$1(edges.last, sectionSelector, isRoot); + return firstAncestor.bind(fA => { + return lastAncestor.bind(lA => { + return eq$1(fA, lA) ? getBox(edges.table, edges.first, edges.last) : Optional.none(); + }); + }); + }); + }; + + const selection = identity; + const unmergable = selectedCells => { + const hasSpan = (elem, type) => getOpt(elem, type).exists(span => parseInt(span, 10) > 1); + const hasRowOrColSpan = elem => hasSpan(elem, 'rowspan') || hasSpan(elem, 'colspan'); + return selectedCells.length > 0 && forall(selectedCells, hasRowOrColSpan) ? Optional.some(selectedCells) : Optional.none(); + }; + const mergable = (table, selectedCells, ephemera) => { + if (selectedCells.length <= 1) { + return Optional.none(); + } else { + return retrieveBox(table, ephemera.firstSelectedSelector, ephemera.lastSelectedSelector).map(bounds => ({ + bounds, + cells: selectedCells + })); + } + }; + + const strSelected = 'data-mce-selected'; + const strSelectedSelector = 'td[' + strSelected + '],th[' + strSelected + ']'; + const strAttributeSelector = '[' + strSelected + ']'; + const strFirstSelected = 'data-mce-first-selected'; + const strFirstSelectedSelector = 'td[' + strFirstSelected + '],th[' + strFirstSelected + ']'; + const strLastSelected = 'data-mce-last-selected'; + const strLastSelectedSelector = 'td[' + strLastSelected + '],th[' + strLastSelected + ']'; + const attributeSelector = strAttributeSelector; + const ephemera = { + selected: strSelected, + selectedSelector: strSelectedSelector, + firstSelected: strFirstSelected, + firstSelectedSelector: strFirstSelectedSelector, + lastSelected: strLastSelected, + lastSelectedSelector: strLastSelectedSelector + }; + + const forMenu = (selectedCells, table, cell) => ({ + element: cell, + mergable: mergable(table, selectedCells, ephemera), + unmergable: unmergable(selectedCells), + selection: selection(selectedCells) + }); + const paste = (element, clipboard, generators) => ({ + element, + clipboard, + generators + }); + const pasteRows = (selectedCells, _cell, clipboard, generators) => ({ + selection: selection(selectedCells), + clipboard, + generators + }); + + const getSelectionCellFallback = element => table(element).bind(table => retrieve(table, ephemera.firstSelectedSelector)).fold(constant(element), cells => cells[0]); + const getSelectionFromSelector = selector => (initCell, isRoot) => { + const cellName = name(initCell); + const cell = cellName === 'col' || cellName === 'colgroup' ? getSelectionCellFallback(initCell) : initCell; + return closest$1(cell, selector, isRoot); + }; + const getSelectionCellOrCaption = getSelectionFromSelector('th,td,caption'); + const getSelectionCell = getSelectionFromSelector('th,td'); + const getCellsFromSelection = editor => fromDom(editor.model.table.getSelectedCells()); + const getCellsFromFakeSelection = editor => filter$2(getCellsFromSelection(editor), cell => is$2(cell, ephemera.selectedSelector)); + + const extractSelected = cells => { + return table(cells[0]).map(table => { + const replica = extract$1(table, attributeSelector); + removeDataStyle(replica); + return [replica]; + }); + }; + const serializeElements = (editor, elements) => map$1(elements, elm => editor.selection.serializer.serialize(elm.dom, {})).join(''); + const getTextContent = elements => map$1(elements, element => element.dom.innerText).join(''); + const registerEvents = (editor, actions) => { + editor.on('BeforeGetContent', e => { + const multiCellContext = cells => { + e.preventDefault(); + extractSelected(cells).each(elements => { + e.content = e.format === 'text' ? getTextContent(elements) : serializeElements(editor, elements); + }); + }; + if (e.selection === true) { + const cells = getCellsFromFakeSelection(editor); + if (cells.length >= 1) { + multiCellContext(cells); + } + } + }); + editor.on('BeforeSetContent', e => { + if (e.selection === true && e.paste === true) { + const selectedCells = getCellsFromSelection(editor); + head(selectedCells).each(cell => { + table(cell).each(table => { + const elements = filter$2(fromHtml(e.content), content => { + return name(content) !== 'meta'; + }); + const isTable = isTag('table'); + if (shouldMergeContentOnPaste(editor) && elements.length === 1 && isTable(elements[0])) { + e.preventDefault(); + const doc = SugarElement.fromDom(editor.getDoc()); + const generators = paste$1(doc); + const targets = paste(cell, elements[0], generators); + actions.pasteCells(table, targets).each(() => { + editor.focus(); + }); + } + }); + }); + } + }); + }; + + const point = (element, offset) => ({ + element, + offset + }); + + const scan$1 = (universe, element, direction) => { + if (universe.property().isText(element) && universe.property().getText(element).trim().length === 0 || universe.property().isComment(element)) { + return direction(element).bind(elem => { + return scan$1(universe, elem, direction).orThunk(() => { + return Optional.some(elem); + }); + }); + } else { + return Optional.none(); + } + }; + const toEnd = (universe, element) => { + if (universe.property().isText(element)) { + return universe.property().getText(element).length; + } + const children = universe.property().children(element); + return children.length; + }; + const freefallRtl$2 = (universe, element) => { + const candidate = scan$1(universe, element, universe.query().prevSibling).getOr(element); + if (universe.property().isText(candidate)) { + return point(candidate, toEnd(universe, candidate)); + } + const children = universe.property().children(candidate); + return children.length > 0 ? freefallRtl$2(universe, children[children.length - 1]) : point(candidate, toEnd(universe, candidate)); + }; + + const freefallRtl$1 = freefallRtl$2; + + const universe$2 = DomUniverse(); + const freefallRtl = element => { + return freefallRtl$1(universe$2, element); + }; + + const halve = (main, other) => { + if (!hasColspan(main)) { + const width = getGenericWidth(main); + width.each(w => { + const newWidth = w.value / 2; + setGenericWidth(main, newWidth, w.unit); + setGenericWidth(other, newWidth, w.unit); + }); + } + }; + + const zero = array => map$1(array, constant(0)); + const surround = (sizes, startIndex, endIndex, results, f) => f(sizes.slice(0, startIndex)).concat(results).concat(f(sizes.slice(endIndex))); + const clampDeltaHelper = predicate => (sizes, index, delta, minCellSize) => { + if (!predicate(delta)) { + return delta; + } else { + const newSize = Math.max(minCellSize, sizes[index] - Math.abs(delta)); + const diff = Math.abs(newSize - sizes[index]); + return delta >= 0 ? diff : -diff; + } + }; + const clampNegativeDelta = clampDeltaHelper(delta => delta < 0); + const clampDelta = clampDeltaHelper(always); + const resizeTable = () => { + const calcFixedDeltas = (sizes, index, next, delta, minCellSize) => { + const clampedDelta = clampNegativeDelta(sizes, index, delta, minCellSize); + return surround(sizes, index, next + 1, [ + clampedDelta, + 0 + ], zero); + }; + const calcRelativeDeltas = (sizes, index, delta, minCellSize) => { + const ratio = (100 + delta) / 100; + const newThis = Math.max(minCellSize, (sizes[index] + delta) / ratio); + return map$1(sizes, (size, idx) => { + const newSize = idx === index ? newThis : size / ratio; + return newSize - size; + }); + }; + const calcLeftEdgeDeltas = (sizes, index, next, delta, minCellSize, isRelative) => { + if (isRelative) { + return calcRelativeDeltas(sizes, index, delta, minCellSize); + } else { + return calcFixedDeltas(sizes, index, next, delta, minCellSize); + } + }; + const calcMiddleDeltas = (sizes, _prev, index, next, delta, minCellSize, isRelative) => calcLeftEdgeDeltas(sizes, index, next, delta, minCellSize, isRelative); + const resizeTable = (resizer, delta) => resizer(delta); + const calcRightEdgeDeltas = (sizes, _prev, index, delta, minCellSize, isRelative) => { + if (isRelative) { + return calcRelativeDeltas(sizes, index, delta, minCellSize); + } else { + const clampedDelta = clampNegativeDelta(sizes, index, delta, minCellSize); + return zero(sizes.slice(0, index)).concat([clampedDelta]); + } + }; + const calcRedestributedWidths = (sizes, totalWidth, pixelDelta, isRelative) => { + if (isRelative) { + const tableWidth = totalWidth + pixelDelta; + const ratio = tableWidth / totalWidth; + const newSizes = map$1(sizes, size => size / ratio); + return { + delta: ratio * 100 - 100, + newSizes + }; + } else { + return { + delta: pixelDelta, + newSizes: sizes + }; + } + }; + return { + resizeTable, + clampTableDelta: clampNegativeDelta, + calcLeftEdgeDeltas, + calcMiddleDeltas, + calcRightEdgeDeltas, + calcRedestributedWidths + }; + }; + const preserveTable = () => { + const calcLeftEdgeDeltas = (sizes, index, next, delta, minCellSize) => { + const idx = delta >= 0 ? next : index; + const clampedDelta = clampDelta(sizes, idx, delta, minCellSize); + return surround(sizes, index, next + 1, [ + clampedDelta, + -clampedDelta + ], zero); + }; + const calcMiddleDeltas = (sizes, _prev, index, next, delta, minCellSize) => calcLeftEdgeDeltas(sizes, index, next, delta, minCellSize); + const resizeTable = (resizer, delta, isLastColumn) => { + if (isLastColumn) { + resizer(delta); + } + }; + const calcRightEdgeDeltas = (sizes, _prev, _index, delta, _minCellSize, isRelative) => { + if (isRelative) { + return zero(sizes); + } else { + const diff = delta / sizes.length; + return map$1(sizes, constant(diff)); + } + }; + const clampTableDelta = (sizes, index, delta, minCellSize, isLastColumn) => { + if (isLastColumn) { + if (delta >= 0) { + return delta; + } else { + const maxDelta = foldl(sizes, (a, b) => a + b - minCellSize, 0); + return Math.max(-maxDelta, delta); + } + } else { + return clampNegativeDelta(sizes, index, delta, minCellSize); + } + }; + const calcRedestributedWidths = (sizes, _totalWidth, _pixelDelta, _isRelative) => ({ + delta: 0, + newSizes: sizes + }); + return { + resizeTable, + clampTableDelta, + calcLeftEdgeDeltas, + calcMiddleDeltas, + calcRightEdgeDeltas, + calcRedestributedWidths + }; + }; + + const getGridSize = table => { + const warehouse = Warehouse.fromTable(table); + return warehouse.grid; + }; + + const isHeaderCell = isTag('th'); + const isHeaderCells = cells => forall(cells, cell => isHeaderCell(cell.element)); + const getRowHeaderType = (isHeaderRow, isHeaderCells) => { + if (isHeaderRow && isHeaderCells) { + return 'sectionCells'; + } else if (isHeaderRow) { + return 'section'; + } else { + return 'cells'; + } + }; + const getRowType = row => { + const isHeaderRow = row.section === 'thead'; + const isHeaderCells = is(findCommonCellType(row.cells), 'th'); + if (row.section === 'tfoot') { + return { type: 'footer' }; + } else if (isHeaderRow || isHeaderCells) { + return { + type: 'header', + subType: getRowHeaderType(isHeaderRow, isHeaderCells) + }; + } else { + return { type: 'body' }; + } + }; + const findCommonCellType = cells => { + const headerCells = filter$2(cells, cell => isHeaderCell(cell.element)); + if (headerCells.length === 0) { + return Optional.some('td'); + } else if (headerCells.length === cells.length) { + return Optional.some('th'); + } else { + return Optional.none(); + } + }; + const findCommonRowType = rows => { + const rowTypes = map$1(rows, row => getRowType(row).type); + const hasHeader = contains$2(rowTypes, 'header'); + const hasFooter = contains$2(rowTypes, 'footer'); + if (!hasHeader && !hasFooter) { + return Optional.some('body'); + } else { + const hasBody = contains$2(rowTypes, 'body'); + if (hasHeader && !hasBody && !hasFooter) { + return Optional.some('header'); + } else if (!hasHeader && !hasBody && hasFooter) { + return Optional.some('footer'); + } else { + return Optional.none(); + } + } + }; + const findTableRowHeaderType = warehouse => findMap(warehouse.all, row => { + const rowType = getRowType(row); + return rowType.type === 'header' ? Optional.from(rowType.subType) : Optional.none(); + }); + + const transformCell = (cell, comparator, substitution) => elementnew(substitution(cell.element, comparator), true, cell.isLocked); + const transformRow = (row, section) => row.section !== section ? rowcells(row.element, row.cells, section, row.isNew) : row; + const section = () => ({ + transformRow, + transformCell: (cell, comparator, substitution) => { + const newCell = substitution(cell.element, comparator); + const fixedCell = name(newCell) !== 'td' ? mutate$1(newCell, 'td') : newCell; + return elementnew(fixedCell, cell.isNew, cell.isLocked); + } + }); + const sectionCells = () => ({ + transformRow, + transformCell + }); + const cells = () => ({ + transformRow: (row, section) => { + const newSection = section === 'thead' ? 'tbody' : section; + return transformRow(row, newSection); + }, + transformCell + }); + const fallback = () => ({ + transformRow: identity, + transformCell + }); + const getTableSectionType = (table, fallback) => { + const warehouse = Warehouse.fromTable(table); + const type = findTableRowHeaderType(warehouse).getOr(fallback); + switch (type) { + case 'section': + return section(); + case 'sectionCells': + return sectionCells(); + case 'cells': + return cells(); + } + }; + const TableSection = { + getTableSectionType, + section, + sectionCells, + cells, + fallback + }; + + const setIfNot = (element, property, value, ignore) => { + if (value === ignore) { + remove$7(element, property); + } else { + set$2(element, property, value); + } + }; + const insert$1 = (table, selector, element) => { + last$2(children(table, selector)).fold(() => prepend(table, element), child => after$5(child, element)); + }; + const generateSection = (table, sectionName) => { + const section = child(table, sectionName).getOrThunk(() => { + const newSection = SugarElement.fromTag(sectionName, owner(table).dom); + if (sectionName === 'thead') { + insert$1(table, 'caption,colgroup', newSection); + } else if (sectionName === 'colgroup') { + insert$1(table, 'caption', newSection); + } else { + append$1(table, newSection); + } + return newSection; + }); + empty(section); + return section; + }; + const render$1 = (table, grid) => { + const newRows = []; + const newCells = []; + const syncRows = gridSection => map$1(gridSection, row => { + if (row.isNew) { + newRows.push(row.element); + } + const tr = row.element; + empty(tr); + each$2(row.cells, cell => { + if (cell.isNew) { + newCells.push(cell.element); + } + setIfNot(cell.element, 'colspan', cell.colspan, 1); + setIfNot(cell.element, 'rowspan', cell.rowspan, 1); + append$1(tr, cell.element); + }); + return tr; + }); + const syncColGroup = gridSection => bind$2(gridSection, colGroup => map$1(colGroup.cells, col => { + setIfNot(col.element, 'span', col.colspan, 1); + return col.element; + })); + const renderSection = (gridSection, sectionName) => { + const section = generateSection(table, sectionName); + const sync = sectionName === 'colgroup' ? syncColGroup : syncRows; + const sectionElems = sync(gridSection); + append(section, sectionElems); + }; + const removeSection = sectionName => { + child(table, sectionName).each(remove$6); + }; + const renderOrRemoveSection = (gridSection, sectionName) => { + if (gridSection.length > 0) { + renderSection(gridSection, sectionName); + } else { + removeSection(sectionName); + } + }; + const headSection = []; + const bodySection = []; + const footSection = []; + const columnGroupsSection = []; + each$2(grid, row => { + switch (row.section) { + case 'thead': + headSection.push(row); + break; + case 'tbody': + bodySection.push(row); + break; + case 'tfoot': + footSection.push(row); + break; + case 'colgroup': + columnGroupsSection.push(row); + break; + } + }); + renderOrRemoveSection(columnGroupsSection, 'colgroup'); + renderOrRemoveSection(headSection, 'thead'); + renderOrRemoveSection(bodySection, 'tbody'); + renderOrRemoveSection(footSection, 'tfoot'); + return { + newRows, + newCells + }; + }; + const copy = grid => map$1(grid, row => { + const tr = shallow(row.element); + each$2(row.cells, cell => { + const clonedCell = deep(cell.element); + setIfNot(clonedCell, 'colspan', cell.colspan, 1); + setIfNot(clonedCell, 'rowspan', cell.rowspan, 1); + append$1(tr, clonedCell); + }); + return tr; + }); + + const getColumn = (grid, index) => { + return map$1(grid, row => { + return getCell(row, index); + }); + }; + const getRow = (grid, index) => { + return grid[index]; + }; + const findDiff = (xs, comp) => { + if (xs.length === 0) { + return 0; + } + const first = xs[0]; + const index = findIndex(xs, x => { + return !comp(first.element, x.element); + }); + return index.getOr(xs.length); + }; + const subgrid = (grid, row, column, comparator) => { + const gridRow = getRow(grid, row); + const isColRow = gridRow.section === 'colgroup'; + const colspan = findDiff(gridRow.cells.slice(column), comparator); + const rowspan = isColRow ? 1 : findDiff(getColumn(grid.slice(row), column), comparator); + return { + colspan, + rowspan + }; + }; + + const toDetails = (grid, comparator) => { + const seen = map$1(grid, row => map$1(row.cells, never)); + const updateSeen = (rowIndex, columnIndex, rowspan, colspan) => { + for (let row = rowIndex; row < rowIndex + rowspan; row++) { + for (let column = columnIndex; column < columnIndex + colspan; column++) { + seen[row][column] = true; + } + } + }; + return map$1(grid, (row, rowIndex) => { + const details = bind$2(row.cells, (cell, columnIndex) => { + if (seen[rowIndex][columnIndex] === false) { + const result = subgrid(grid, rowIndex, columnIndex, comparator); + updateSeen(rowIndex, columnIndex, result.rowspan, result.colspan); + return [detailnew(cell.element, result.rowspan, result.colspan, cell.isNew)]; + } else { + return []; + } + }); + return rowdetailnew(row.element, details, row.section, row.isNew); + }); + }; + const toGrid = (warehouse, generators, isNew) => { + const grid = []; + each$2(warehouse.colgroups, colgroup => { + const colgroupCols = []; + for (let columnIndex = 0; columnIndex < warehouse.grid.columns; columnIndex++) { + const element = Warehouse.getColumnAt(warehouse, columnIndex).map(column => elementnew(column.element, isNew, false)).getOrThunk(() => elementnew(generators.colGap(), true, false)); + colgroupCols.push(element); + } + grid.push(rowcells(colgroup.element, colgroupCols, 'colgroup', isNew)); + }); + for (let rowIndex = 0; rowIndex < warehouse.grid.rows; rowIndex++) { + const rowCells = []; + for (let columnIndex = 0; columnIndex < warehouse.grid.columns; columnIndex++) { + const element = Warehouse.getAt(warehouse, rowIndex, columnIndex).map(item => elementnew(item.element, isNew, item.isLocked)).getOrThunk(() => elementnew(generators.gap(), true, false)); + rowCells.push(element); + } + const rowDetail = warehouse.all[rowIndex]; + const row = rowcells(rowDetail.element, rowCells, rowDetail.section, isNew); + grid.push(row); + } + return grid; + }; + + const fromWarehouse = (warehouse, generators) => toGrid(warehouse, generators, false); + const toDetailList = grid => toDetails(grid, eq$1); + const findInWarehouse = (warehouse, element) => findMap(warehouse.all, r => find$1(r.cells, e => eq$1(element, e.element))); + const extractCells = (warehouse, target, predicate) => { + const details = map$1(target.selection, cell$1 => { + return cell(cell$1).bind(lc => findInWarehouse(warehouse, lc)).filter(predicate); + }); + const cells = cat(details); + return someIf(cells.length > 0, cells); + }; + const run = (operation, extract, adjustment, postAction, genWrappers) => (table, target, generators, behaviours) => { + const warehouse = Warehouse.fromTable(table); + const tableSection = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.section).getOrThunk(TableSection.fallback); + const output = extract(warehouse, target).map(info => { + const model = fromWarehouse(warehouse, generators); + const result = operation(model, info, eq$1, genWrappers(generators), tableSection); + const lockedColumns = getLockedColumnsFromGrid(result.grid); + const grid = toDetailList(result.grid); + return { + info, + grid, + cursor: result.cursor, + lockedColumns + }; + }); + return output.bind(out => { + const newElements = render$1(table, out.grid); + const tableSizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.sizing).getOrThunk(() => TableSize.getTableSize(table)); + const resizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.resize).getOrThunk(preserveTable); + adjustment(table, out.grid, out.info, { + sizing: tableSizing, + resize: resizing, + section: tableSection + }); + postAction(table); + remove$7(table, LOCKED_COL_ATTR); + if (out.lockedColumns.length > 0) { + set$2(table, LOCKED_COL_ATTR, out.lockedColumns.join(',')); + } + return Optional.some({ + cursor: out.cursor, + newRows: newElements.newRows, + newCells: newElements.newCells + }); + }); + }; + const onPaste = (warehouse, target) => cell(target.element).bind(cell => findInWarehouse(warehouse, cell).map(details => { + const value = { + ...details, + generators: target.generators, + clipboard: target.clipboard + }; + return value; + })); + const onPasteByEditor = (warehouse, target) => extractCells(warehouse, target, always).map(cells => ({ + cells, + generators: target.generators, + clipboard: target.clipboard + })); + const onMergable = (_warehouse, target) => target.mergable; + const onUnmergable = (_warehouse, target) => target.unmergable; + const onCells = (warehouse, target) => extractCells(warehouse, target, always); + const onUnlockedCells = (warehouse, target) => extractCells(warehouse, target, detail => !detail.isLocked); + const isUnlockedTableCell = (warehouse, cell) => findInWarehouse(warehouse, cell).exists(detail => !detail.isLocked); + const allUnlocked = (warehouse, cells) => forall(cells, cell => isUnlockedTableCell(warehouse, cell)); + const onUnlockedMergable = (warehouse, target) => onMergable(warehouse, target).filter(mergeable => allUnlocked(warehouse, mergeable.cells)); + const onUnlockedUnmergable = (warehouse, target) => onUnmergable(warehouse, target).filter(cells => allUnlocked(warehouse, cells)); + + const merge$2 = (grid, bounds, comparator, substitution) => { + const rows = extractGridDetails(grid).rows; + if (rows.length === 0) { + return grid; + } + for (let i = bounds.startRow; i <= bounds.finishRow; i++) { + for (let j = bounds.startCol; j <= bounds.finishCol; j++) { + const row = rows[i]; + const isLocked = getCell(row, j).isLocked; + mutateCell(row, j, elementnew(substitution(), false, isLocked)); + } + } + return grid; + }; + const unmerge = (grid, target, comparator, substitution) => { + const rows = extractGridDetails(grid).rows; + let first = true; + for (let i = 0; i < rows.length; i++) { + for (let j = 0; j < cellLength(rows[0]); j++) { + const row = rows[i]; + const currentCell = getCell(row, j); + const currentCellElm = currentCell.element; + const isToReplace = comparator(currentCellElm, target); + if (isToReplace && !first) { + mutateCell(row, j, elementnew(substitution(), true, currentCell.isLocked)); + } else if (isToReplace) { + first = false; + } + } + } + return grid; + }; + const uniqueCells = (row, comparator) => { + return foldl(row, (rest, cell) => { + return exists(rest, currentCell => { + return comparator(currentCell.element, cell.element); + }) ? rest : rest.concat([cell]); + }, []); + }; + const splitCols = (grid, index, comparator, substitution) => { + if (index > 0 && index < grid[0].cells.length) { + each$2(grid, row => { + const prevCell = row.cells[index - 1]; + let offset = 0; + const substitute = substitution(); + while (row.cells.length > index + offset && comparator(prevCell.element, row.cells[index + offset].element)) { + mutateCell(row, index + offset, elementnew(substitute, true, row.cells[index + offset].isLocked)); + offset++; + } + }); + } + return grid; + }; + const splitRows = (grid, index, comparator, substitution) => { + const rows = extractGridDetails(grid).rows; + if (index > 0 && index < rows.length) { + const rowPrevCells = rows[index - 1].cells; + const cells = uniqueCells(rowPrevCells, comparator); + each$2(cells, cell => { + let replacement = Optional.none(); + for (let i = index; i < rows.length; i++) { + for (let j = 0; j < cellLength(rows[0]); j++) { + const row = rows[i]; + const current = getCell(row, j); + const isToReplace = comparator(current.element, cell.element); + if (isToReplace) { + if (replacement.isNone()) { + replacement = Optional.some(substitution()); + } + replacement.each(sub => { + mutateCell(row, j, elementnew(sub, true, current.isLocked)); + }); + } + } + } + }); + } + return grid; + }; + + const value$1 = value => { + const applyHelper = fn => fn(value); + const constHelper = constant(value); + const outputHelper = () => output; + const output = { + tag: true, + inner: value, + fold: (_onError, onValue) => onValue(value), + isValue: always, + isError: never, + map: mapper => Result.value(mapper(value)), + mapError: outputHelper, + bind: applyHelper, + exists: applyHelper, + forall: applyHelper, + getOr: constHelper, + or: outputHelper, + getOrThunk: constHelper, + orThunk: outputHelper, + getOrDie: constHelper, + each: fn => { + fn(value); + }, + toOptional: () => Optional.some(value) + }; + return output; + }; + const error = error => { + const outputHelper = () => output; + const output = { + tag: false, + inner: error, + fold: (onError, _onValue) => onError(error), + isValue: never, + isError: always, + map: outputHelper, + mapError: mapper => Result.error(mapper(error)), + bind: outputHelper, + exists: never, + forall: always, + getOr: identity, + or: identity, + getOrThunk: apply, + orThunk: apply, + getOrDie: die(String(error)), + each: noop, + toOptional: Optional.none + }; + return output; + }; + const fromOption = (optional, err) => optional.fold(() => error(err), value$1); + const Result = { + value: value$1, + error, + fromOption + }; + + const measure = (startAddress, gridA, gridB) => { + if (startAddress.row >= gridA.length || startAddress.column > cellLength(gridA[0])) { + return Result.error('invalid start address out of table bounds, row: ' + startAddress.row + ', column: ' + startAddress.column); + } + const rowRemainder = gridA.slice(startAddress.row); + const colRemainder = rowRemainder[0].cells.slice(startAddress.column); + const colRequired = cellLength(gridB[0]); + const rowRequired = gridB.length; + return Result.value({ + rowDelta: rowRemainder.length - rowRequired, + colDelta: colRemainder.length - colRequired + }); + }; + const measureWidth = (gridA, gridB) => { + const colLengthA = cellLength(gridA[0]); + const colLengthB = cellLength(gridB[0]); + return { + rowDelta: 0, + colDelta: colLengthA - colLengthB + }; + }; + const measureHeight = (gridA, gridB) => { + const rowLengthA = gridA.length; + const rowLengthB = gridB.length; + return { + rowDelta: rowLengthA - rowLengthB, + colDelta: 0 + }; + }; + const generateElements = (amount, row, generators, isLocked) => { + const generator = row.section === 'colgroup' ? generators.col : generators.cell; + return range$1(amount, idx => elementnew(generator(), true, isLocked(idx))); + }; + const rowFill = (grid, amount, generators, lockedColumns) => { + const exampleRow = grid[grid.length - 1]; + return grid.concat(range$1(amount, () => { + const generator = exampleRow.section === 'colgroup' ? generators.colgroup : generators.row; + const row = clone(exampleRow, generator, identity); + const elements = generateElements(row.cells.length, row, generators, idx => has$1(lockedColumns, idx.toString())); + return setCells(row, elements); + })); + }; + const colFill = (grid, amount, generators, startIndex) => map$1(grid, row => { + const newChildren = generateElements(amount, row, generators, never); + return addCells(row, startIndex, newChildren); + }); + const lockedColFill = (grid, generators, lockedColumns) => map$1(grid, row => { + return foldl(lockedColumns, (acc, colNum) => { + const newChild = generateElements(1, row, generators, always)[0]; + return addCell(acc, colNum, newChild); + }, row); + }); + const tailor = (gridA, delta, generators) => { + const fillCols = delta.colDelta < 0 ? colFill : identity; + const fillRows = delta.rowDelta < 0 ? rowFill : identity; + const lockedColumns = getLockedColumnsFromGrid(gridA); + const gridWidth = cellLength(gridA[0]); + const isLastColLocked = exists(lockedColumns, locked => locked === gridWidth - 1); + const modifiedCols = fillCols(gridA, Math.abs(delta.colDelta), generators, isLastColLocked ? gridWidth - 1 : gridWidth); + const newLockedColumns = getLockedColumnsFromGrid(modifiedCols); + return fillRows(modifiedCols, Math.abs(delta.rowDelta), generators, mapToObject(newLockedColumns, always)); + }; + + const isSpanning = (grid, row, col, comparator) => { + const candidate = getCell(grid[row], col); + const matching = curry(comparator, candidate.element); + const currentRow = grid[row]; + return grid.length > 1 && cellLength(currentRow) > 1 && (col > 0 && matching(getCellElement(currentRow, col - 1)) || col < currentRow.cells.length - 1 && matching(getCellElement(currentRow, col + 1)) || row > 0 && matching(getCellElement(grid[row - 1], col)) || row < grid.length - 1 && matching(getCellElement(grid[row + 1], col))); + }; + const mergeTables = (startAddress, gridA, gridBRows, generator, comparator, lockedColumns) => { + const startRow = startAddress.row; + const startCol = startAddress.column; + const mergeHeight = gridBRows.length; + const mergeWidth = cellLength(gridBRows[0]); + const endRow = startRow + mergeHeight; + const endCol = startCol + mergeWidth + lockedColumns.length; + const lockedColumnObj = mapToObject(lockedColumns, always); + for (let r = startRow; r < endRow; r++) { + let skippedCol = 0; + for (let c = startCol; c < endCol; c++) { + if (lockedColumnObj[c]) { + skippedCol++; + continue; + } + if (isSpanning(gridA, r, c, comparator)) { + unmerge(gridA, getCellElement(gridA[r], c), comparator, generator.cell); + } + const gridBColIndex = c - startCol - skippedCol; + const newCell = getCell(gridBRows[r - startRow], gridBColIndex); + const newCellElm = newCell.element; + const replacement = generator.replace(newCellElm); + mutateCell(gridA[r], c, elementnew(replacement, true, newCell.isLocked)); + } + } + return gridA; + }; + const getValidStartAddress = (currentStartAddress, grid, lockedColumns) => { + const gridColLength = cellLength(grid[0]); + const adjustedRowAddress = extractGridDetails(grid).cols.length + currentStartAddress.row; + const possibleColAddresses = range$1(gridColLength - currentStartAddress.column, num => num + currentStartAddress.column); + const validColAddress = find$1(possibleColAddresses, num => forall(lockedColumns, col => col !== num)).getOr(gridColLength - 1); + return { + row: adjustedRowAddress, + column: validColAddress + }; + }; + const getLockedColumnsWithinBounds = (startAddress, rows, lockedColumns) => filter$2(lockedColumns, colNum => colNum >= startAddress.column && colNum <= cellLength(rows[0]) + startAddress.column); + const merge$1 = (startAddress, gridA, gridB, generator, comparator) => { + const lockedColumns = getLockedColumnsFromGrid(gridA); + const validStartAddress = getValidStartAddress(startAddress, gridA, lockedColumns); + const gridBRows = extractGridDetails(gridB).rows; + const lockedColumnsWithinBounds = getLockedColumnsWithinBounds(validStartAddress, gridBRows, lockedColumns); + const result = measure(validStartAddress, gridA, gridBRows); + return result.map(diff => { + const delta = { + ...diff, + colDelta: diff.colDelta - lockedColumnsWithinBounds.length + }; + const fittedGrid = tailor(gridA, delta, generator); + const newLockedColumns = getLockedColumnsFromGrid(fittedGrid); + const newLockedColumnsWithinBounds = getLockedColumnsWithinBounds(validStartAddress, gridBRows, newLockedColumns); + return mergeTables(validStartAddress, fittedGrid, gridBRows, generator, comparator, newLockedColumnsWithinBounds); + }); + }; + const insertCols = (index, gridA, gridB, generator, comparator) => { + splitCols(gridA, index, comparator, generator.cell); + const delta = measureHeight(gridB, gridA); + const fittedNewGrid = tailor(gridB, delta, generator); + const secondDelta = measureHeight(gridA, fittedNewGrid); + const fittedOldGrid = tailor(gridA, secondDelta, generator); + return map$1(fittedOldGrid, (gridRow, i) => { + return addCells(gridRow, index, fittedNewGrid[i].cells); + }); + }; + const insertRows = (index, gridA, gridB, generator, comparator) => { + splitRows(gridA, index, comparator, generator.cell); + const locked = getLockedColumnsFromGrid(gridA); + const diff = measureWidth(gridA, gridB); + const delta = { + ...diff, + colDelta: diff.colDelta - locked.length + }; + const fittedOldGrid = tailor(gridA, delta, generator); + const { + cols: oldCols, + rows: oldRows + } = extractGridDetails(fittedOldGrid); + const newLocked = getLockedColumnsFromGrid(fittedOldGrid); + const secondDiff = measureWidth(gridB, gridA); + const secondDelta = { + ...secondDiff, + colDelta: secondDiff.colDelta + newLocked.length + }; + const fittedGridB = lockedColFill(gridB, generator, newLocked); + const fittedNewGrid = tailor(fittedGridB, secondDelta, generator); + return [ + ...oldCols, + ...oldRows.slice(0, index), + ...fittedNewGrid, + ...oldRows.slice(index, oldRows.length) + ]; + }; + + const cloneRow = (row, cloneCell, comparator, substitution) => clone(row, elem => substitution(elem, comparator), cloneCell); + const insertRowAt = (grid, index, example, comparator, substitution) => { + const {rows, cols} = extractGridDetails(grid); + const before = rows.slice(0, index); + const after = rows.slice(index); + const newRow = cloneRow(rows[example], (ex, c) => { + const withinSpan = index > 0 && index < rows.length && comparator(getCellElement(rows[index - 1], c), getCellElement(rows[index], c)); + const ret = withinSpan ? getCell(rows[index], c) : elementnew(substitution(ex.element, comparator), true, ex.isLocked); + return ret; + }, comparator, substitution); + return [ + ...cols, + ...before, + newRow, + ...after + ]; + }; + const getElementFor = (row, column, section, withinSpan, example, comparator, substitution) => { + if (section === 'colgroup' || !withinSpan) { + const cell = getCell(row, example); + return elementnew(substitution(cell.element, comparator), true, false); + } else { + return getCell(row, column); + } + }; + const insertColumnAt = (grid, index, example, comparator, substitution) => map$1(grid, row => { + const withinSpan = index > 0 && index < cellLength(row) && comparator(getCellElement(row, index - 1), getCellElement(row, index)); + const sub = getElementFor(row, index, row.section, withinSpan, example, comparator, substitution); + return addCell(row, index, sub); + }); + const deleteColumnsAt = (grid, columns) => bind$2(grid, row => { + const existingCells = row.cells; + const cells = foldr(columns, (acc, column) => column >= 0 && column < acc.length ? acc.slice(0, column).concat(acc.slice(column + 1)) : acc, existingCells); + return cells.length > 0 ? [rowcells(row.element, cells, row.section, row.isNew)] : []; + }); + const deleteRowsAt = (grid, start, finish) => { + const {rows, cols} = extractGridDetails(grid); + return [ + ...cols, + ...rows.slice(0, start), + ...rows.slice(finish + 1) + ]; + }; + + const notInStartRow = (grid, rowIndex, colIndex, comparator) => getCellElement(grid[rowIndex], colIndex) !== undefined && (rowIndex > 0 && comparator(getCellElement(grid[rowIndex - 1], colIndex), getCellElement(grid[rowIndex], colIndex))); + const notInStartColumn = (row, index, comparator) => index > 0 && comparator(getCellElement(row, index - 1), getCellElement(row, index)); + const isDuplicatedCell = (grid, rowIndex, colIndex, comparator) => notInStartRow(grid, rowIndex, colIndex, comparator) || notInStartColumn(grid[rowIndex], colIndex, comparator); + const rowReplacerPredicate = (targetRow, columnHeaders) => { + const entireTableIsHeader = forall(columnHeaders, identity) && isHeaderCells(targetRow.cells); + return entireTableIsHeader ? always : (cell, _rowIndex, colIndex) => { + const type = name(cell.element); + return !(type === 'th' && columnHeaders[colIndex]); + }; + }; + const columnReplacePredicate = (targetColumn, rowHeaders) => { + const entireTableIsHeader = forall(rowHeaders, identity) && isHeaderCells(targetColumn); + return entireTableIsHeader ? always : (cell, rowIndex, _colIndex) => { + const type = name(cell.element); + return !(type === 'th' && rowHeaders[rowIndex]); + }; + }; + const determineScope = (applyScope, cell, newScope, isInHeader) => { + const hasSpan = scope => scope === 'row' ? hasRowspan(cell) : hasColspan(cell); + const getScope = scope => hasSpan(scope) ? `${ scope }group` : scope; + if (applyScope) { + return isHeaderCell(cell) ? getScope(newScope) : null; + } else if (isInHeader && isHeaderCell(cell)) { + const oppositeScope = newScope === 'row' ? 'col' : 'row'; + return getScope(oppositeScope); + } else { + return null; + } + }; + const rowScopeGenerator = (applyScope, columnHeaders) => (cell, rowIndex, columnIndex) => Optional.some(determineScope(applyScope, cell.element, 'col', columnHeaders[columnIndex])); + const columnScopeGenerator = (applyScope, rowHeaders) => (cell, rowIndex) => Optional.some(determineScope(applyScope, cell.element, 'row', rowHeaders[rowIndex])); + const replace = (cell, comparator, substitute) => elementnew(substitute(cell.element, comparator), true, cell.isLocked); + const replaceIn = (grid, targets, comparator, substitute, replacer, genScope, shouldReplace) => { + const isTarget = cell => { + return exists(targets, target => { + return comparator(cell.element, target.element); + }); + }; + return map$1(grid, (row, rowIndex) => { + return mapCells(row, (cell, colIndex) => { + if (isTarget(cell)) { + const newCell = shouldReplace(cell, rowIndex, colIndex) ? replacer(cell, comparator, substitute) : cell; + genScope(newCell, rowIndex, colIndex).each(scope => { + setOptions(newCell.element, { scope: Optional.from(scope) }); + }); + return newCell; + } else { + return cell; + } + }); + }); + }; + const getColumnCells = (rows, columnIndex, comparator) => bind$2(rows, (row, i) => { + return isDuplicatedCell(rows, i, columnIndex, comparator) ? [] : [getCell(row, columnIndex)]; + }); + const getRowCells = (rows, rowIndex, comparator) => { + const targetRow = rows[rowIndex]; + return bind$2(targetRow.cells, (item, i) => { + return isDuplicatedCell(rows, rowIndex, i, comparator) ? [] : [item]; + }); + }; + const replaceColumns = (grid, indexes, applyScope, comparator, substitution) => { + const rows = extractGridDetails(grid).rows; + const targets = bind$2(indexes, index => getColumnCells(rows, index, comparator)); + const rowHeaders = map$1(rows, row => isHeaderCells(row.cells)); + const shouldReplaceCell = columnReplacePredicate(targets, rowHeaders); + const scopeGenerator = columnScopeGenerator(applyScope, rowHeaders); + return replaceIn(grid, targets, comparator, substitution, replace, scopeGenerator, shouldReplaceCell); + }; + const replaceRows = (grid, indexes, section, applyScope, comparator, substitution, tableSection) => { + const {cols, rows} = extractGridDetails(grid); + const targetRow = rows[indexes[0]]; + const targets = bind$2(indexes, index => getRowCells(rows, index, comparator)); + const columnHeaders = map$1(targetRow.cells, (_cell, index) => isHeaderCells(getColumnCells(rows, index, comparator))); + const newRows = [...rows]; + each$2(indexes, index => { + newRows[index] = tableSection.transformRow(rows[index], section); + }); + const newGrid = [ + ...cols, + ...newRows + ]; + const shouldReplaceCell = rowReplacerPredicate(targetRow, columnHeaders); + const scopeGenerator = rowScopeGenerator(applyScope, columnHeaders); + return replaceIn(newGrid, targets, comparator, substitution, tableSection.transformCell, scopeGenerator, shouldReplaceCell); + }; + const replaceCells = (grid, details, comparator, substitution) => { + const rows = extractGridDetails(grid).rows; + const targetCells = map$1(details, detail => getCell(rows[detail.row], detail.column)); + return replaceIn(grid, targetCells, comparator, substitution, replace, Optional.none, always); + }; + + const generate = cases => { + if (!isArray(cases)) { + throw new Error('cases must be an array'); + } + if (cases.length === 0) { + throw new Error('there must be at least one case'); + } + const constructors = []; + const adt = {}; + each$2(cases, (acase, count) => { + const keys$1 = keys(acase); + if (keys$1.length !== 1) { + throw new Error('one and only one name per case'); + } + const key = keys$1[0]; + const value = acase[key]; + if (adt[key] !== undefined) { + throw new Error('duplicate key detected:' + key); + } else if (key === 'cata') { + throw new Error('cannot have a case named cata (sorry)'); + } else if (!isArray(value)) { + throw new Error('case arguments must be an array'); + } + constructors.push(key); + adt[key] = (...args) => { + const argLength = args.length; + if (argLength !== value.length) { + throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength); + } + const match = branches => { + const branchKeys = keys(branches); + if (constructors.length !== branchKeys.length) { + throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(',')); + } + const allReqd = forall(constructors, reqKey => { + return contains$2(branchKeys, reqKey); + }); + if (!allReqd) { + throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', ')); + } + return branches[key].apply(null, args); + }; + return { + fold: (...foldArgs) => { + if (foldArgs.length !== cases.length) { + throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length); + } + const target = foldArgs[count]; + return target.apply(null, args); + }, + match, + log: label => { + console.log(label, { + constructors, + constructor: key, + params: args + }); + } + }; + }; + }); + return adt; + }; + const Adt = { generate }; + + const adt$6 = Adt.generate([ + { none: [] }, + { only: ['index'] }, + { + left: [ + 'index', + 'next' + ] + }, + { + middle: [ + 'prev', + 'index', + 'next' + ] + }, + { + right: [ + 'prev', + 'index' + ] + } + ]); + const ColumnContext = { ...adt$6 }; + + const neighbours = (input, index) => { + if (input.length === 0) { + return ColumnContext.none(); + } + if (input.length === 1) { + return ColumnContext.only(0); + } + if (index === 0) { + return ColumnContext.left(0, 1); + } + if (index === input.length - 1) { + return ColumnContext.right(index - 1, index); + } + if (index > 0 && index < input.length - 1) { + return ColumnContext.middle(index - 1, index, index + 1); + } + return ColumnContext.none(); + }; + const determine = (input, column, step, tableSize, resize) => { + const result = input.slice(0); + const context = neighbours(input, column); + const onNone = constant(map$1(result, constant(0))); + const onOnly = index => tableSize.singleColumnWidth(result[index], step); + const onLeft = (index, next) => resize.calcLeftEdgeDeltas(result, index, next, step, tableSize.minCellWidth(), tableSize.isRelative); + const onMiddle = (prev, index, next) => resize.calcMiddleDeltas(result, prev, index, next, step, tableSize.minCellWidth(), tableSize.isRelative); + const onRight = (prev, index) => resize.calcRightEdgeDeltas(result, prev, index, step, tableSize.minCellWidth(), tableSize.isRelative); + return context.fold(onNone, onOnly, onLeft, onMiddle, onRight); + }; + + const total = (start, end, measures) => { + let r = 0; + for (let i = start; i < end; i++) { + r += measures[i] !== undefined ? measures[i] : 0; + } + return r; + }; + const recalculateWidthForCells = (warehouse, widths) => { + const all = Warehouse.justCells(warehouse); + return map$1(all, cell => { + const width = total(cell.column, cell.column + cell.colspan, widths); + return { + element: cell.element, + width, + colspan: cell.colspan + }; + }); + }; + const recalculateWidthForColumns = (warehouse, widths) => { + const groups = Warehouse.justColumns(warehouse); + return map$1(groups, (column, index) => ({ + element: column.element, + width: widths[index], + colspan: column.colspan + })); + }; + const recalculateHeightForCells = (warehouse, heights) => { + const all = Warehouse.justCells(warehouse); + return map$1(all, cell => { + const height = total(cell.row, cell.row + cell.rowspan, heights); + return { + element: cell.element, + height, + rowspan: cell.rowspan + }; + }); + }; + const matchRowHeight = (warehouse, heights) => { + return map$1(warehouse.all, (row, i) => { + return { + element: row.element, + height: heights[i] + }; + }); + }; + + const sumUp = newSize => foldr(newSize, (b, a) => b + a, 0); + const recalculate = (warehouse, widths) => { + if (Warehouse.hasColumns(warehouse)) { + return recalculateWidthForColumns(warehouse, widths); + } else { + return recalculateWidthForCells(warehouse, widths); + } + }; + const recalculateAndApply = (warehouse, widths, tableSize) => { + const newSizes = recalculate(warehouse, widths); + each$2(newSizes, cell => { + tableSize.setElementWidth(cell.element, cell.width); + }); + }; + const adjustWidth = (table, delta, index, resizing, tableSize) => { + const warehouse = Warehouse.fromTable(table); + const step = tableSize.getCellDelta(delta); + const widths = tableSize.getWidths(warehouse, tableSize); + const isLastColumn = index === warehouse.grid.columns - 1; + const clampedStep = resizing.clampTableDelta(widths, index, step, tableSize.minCellWidth(), isLastColumn); + const deltas = determine(widths, index, clampedStep, tableSize, resizing); + const newWidths = map$1(deltas, (dx, i) => dx + widths[i]); + recalculateAndApply(warehouse, newWidths, tableSize); + resizing.resizeTable(tableSize.adjustTableWidth, clampedStep, isLastColumn); + }; + const adjustHeight = (table, delta, index, direction) => { + const warehouse = Warehouse.fromTable(table); + const heights = getPixelHeights(warehouse, table, direction); + const newHeights = map$1(heights, (dy, i) => index === i ? Math.max(delta + dy, minHeight()) : dy); + const newCellSizes = recalculateHeightForCells(warehouse, newHeights); + const newRowSizes = matchRowHeight(warehouse, newHeights); + each$2(newRowSizes, row => { + setHeight(row.element, row.height); + }); + each$2(newCellSizes, cell => { + setHeight(cell.element, cell.height); + }); + const total = sumUp(newHeights); + setHeight(table, total); + }; + const adjustAndRedistributeWidths$1 = (_table, list, details, tableSize, resizeBehaviour) => { + const warehouse = Warehouse.generate(list); + const sizes = tableSize.getWidths(warehouse, tableSize); + const tablePixelWidth = tableSize.pixelWidth(); + const {newSizes, delta} = resizeBehaviour.calcRedestributedWidths(sizes, tablePixelWidth, details.pixelDelta, tableSize.isRelative); + recalculateAndApply(warehouse, newSizes, tableSize); + tableSize.adjustTableWidth(delta); + }; + const adjustWidthTo = (_table, list, _info, tableSize) => { + const warehouse = Warehouse.generate(list); + const widths = tableSize.getWidths(warehouse, tableSize); + recalculateAndApply(warehouse, widths, tableSize); + }; + + const uniqueColumns = details => { + const uniqueCheck = (rest, detail) => { + const columnExists = exists(rest, currentDetail => currentDetail.column === detail.column); + return columnExists ? rest : rest.concat([detail]); + }; + return foldl(details, uniqueCheck, []).sort((detailA, detailB) => detailA.column - detailB.column); + }; + + const isCol = isTag('col'); + const isColgroup = isTag('colgroup'); + const isRow$1 = element => name(element) === 'tr' || isColgroup(element); + const elementToData = element => { + const colspan = getAttrValue(element, 'colspan', 1); + const rowspan = getAttrValue(element, 'rowspan', 1); + return { + element, + colspan, + rowspan + }; + }; + const modification = (generators, toData = elementToData) => { + const nuCell = data => isCol(data.element) ? generators.col(data) : generators.cell(data); + const nuRow = data => isColgroup(data.element) ? generators.colgroup(data) : generators.row(data); + const add = element => { + if (isRow$1(element)) { + return nuRow({ element }); + } else { + const cell = element; + const replacement = nuCell(toData(cell)); + recent = Optional.some({ + item: cell, + replacement + }); + return replacement; + } + }; + let recent = Optional.none(); + const getOrInit = (element, comparator) => { + return recent.fold(() => { + return add(element); + }, p => { + return comparator(element, p.item) ? p.replacement : add(element); + }); + }; + return { getOrInit }; + }; + const transform$1 = tag => { + return generators => { + const list = []; + const find = (element, comparator) => { + return find$1(list, x => { + return comparator(x.item, element); + }); + }; + const makeNew = element => { + const attrs = tag === 'td' ? { scope: null } : {}; + const cell = generators.replace(element, tag, attrs); + list.push({ + item: element, + sub: cell + }); + return cell; + }; + const replaceOrInit = (element, comparator) => { + if (isRow$1(element) || isCol(element)) { + return element; + } else { + const cell = element; + return find(cell, comparator).fold(() => { + return makeNew(cell); + }, p => { + return comparator(element, p.item) ? p.sub : makeNew(cell); + }); + } + }; + return { replaceOrInit }; + }; + }; + const getScopeAttribute = cell => getOpt(cell, 'scope').map(attribute => attribute.substr(0, 3)); + const merging = generators => { + const unmerge = cell => { + const scope = getScopeAttribute(cell); + scope.each(attribute => set$2(cell, 'scope', attribute)); + return () => { + const raw = generators.cell({ + element: cell, + colspan: 1, + rowspan: 1 + }); + remove$5(raw, 'width'); + remove$5(cell, 'width'); + scope.each(attribute => set$2(raw, 'scope', attribute)); + return raw; + }; + }; + const merge = cells => { + const getScopeProperty = () => { + const stringAttributes = cat(map$1(cells, getScopeAttribute)); + if (stringAttributes.length === 0) { + return Optional.none(); + } else { + const baseScope = stringAttributes[0]; + const scopes = [ + 'row', + 'col' + ]; + const isMixed = exists(stringAttributes, attribute => { + return attribute !== baseScope && contains$2(scopes, attribute); + }); + return isMixed ? Optional.none() : Optional.from(baseScope); + } + }; + remove$5(cells[0], 'width'); + getScopeProperty().fold(() => remove$7(cells[0], 'scope'), attribute => set$2(cells[0], 'scope', attribute + 'group')); + return constant(cells[0]); + }; + return { + unmerge, + merge + }; + }; + const Generators = { + modification, + transform: transform$1, + merging + }; + + const blockList = [ + 'body', + 'p', + 'div', + 'article', + 'aside', + 'figcaption', + 'figure', + 'footer', + 'header', + 'nav', + 'section', + 'ol', + 'ul', + 'table', + 'thead', + 'tfoot', + 'tbody', + 'caption', + 'tr', + 'td', + 'th', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'blockquote', + 'pre', + 'address' + ]; + const isList$1 = (universe, item) => { + const tagName = universe.property().name(item); + return contains$2([ + 'ol', + 'ul' + ], tagName); + }; + const isBlock$1 = (universe, item) => { + const tagName = universe.property().name(item); + return contains$2(blockList, tagName); + }; + const isEmptyTag$1 = (universe, item) => { + return contains$2([ + 'br', + 'img', + 'hr', + 'input' + ], universe.property().name(item)); + }; + + const universe$1 = DomUniverse(); + const isBlock = element => { + return isBlock$1(universe$1, element); + }; + const isList = element => { + return isList$1(universe$1, element); + }; + const isEmptyTag = element => { + return isEmptyTag$1(universe$1, element); + }; + + const merge = cells => { + const isBr = isTag('br'); + const advancedBr = children => { + return forall(children, c => { + return isBr(c) || isText(c) && get$6(c).trim().length === 0; + }); + }; + const isListItem = el => { + return name(el) === 'li' || ancestor$2(el, isList).isSome(); + }; + const siblingIsBlock = el => { + return nextSibling(el).map(rightSibling => { + if (isBlock(rightSibling)) { + return true; + } + if (isEmptyTag(rightSibling)) { + return name(rightSibling) === 'img' ? false : true; + } + return false; + }).getOr(false); + }; + const markCell = cell => { + return last$1(cell).bind(rightEdge => { + const rightSiblingIsBlock = siblingIsBlock(rightEdge); + return parent(rightEdge).map(parent => { + return rightSiblingIsBlock === true || isListItem(parent) || isBr(rightEdge) || isBlock(parent) && !eq$1(cell, parent) ? [] : [SugarElement.fromTag('br')]; + }); + }).getOr([]); + }; + const markContent = () => { + const content = bind$2(cells, cell => { + const children = children$2(cell); + return advancedBr(children) ? [] : children.concat(markCell(cell)); + }); + return content.length === 0 ? [SugarElement.fromTag('br')] : content; + }; + const contents = markContent(); + empty(cells[0]); + append(cells[0], contents); + }; + + const isEditable = elem => isEditable$1(elem, true); + const prune = table => { + const cells = cells$1(table); + if (cells.length === 0) { + remove$6(table); + } + }; + const outcome = (grid, cursor) => ({ + grid, + cursor + }); + const findEditableCursorPosition = rows => findMap(rows, row => findMap(row.cells, cell => { + const elem = cell.element; + return someIf(isEditable(elem), elem); + })); + const elementFromGrid = (grid, row, column) => { + var _a, _b; + const rows = extractGridDetails(grid).rows; + return Optional.from((_b = (_a = rows[row]) === null || _a === void 0 ? void 0 : _a.cells[column]) === null || _b === void 0 ? void 0 : _b.element).filter(isEditable).orThunk(() => findEditableCursorPosition(rows)); + }; + const bundle = (grid, row, column) => { + const cursorElement = elementFromGrid(grid, row, column); + return outcome(grid, cursorElement); + }; + const uniqueRows = details => { + const rowCompilation = (rest, detail) => { + const rowExists = exists(rest, currentDetail => currentDetail.row === detail.row); + return rowExists ? rest : rest.concat([detail]); + }; + return foldl(details, rowCompilation, []).sort((detailA, detailB) => detailA.row - detailB.row); + }; + const opInsertRowsBefore = (grid, details, comparator, genWrappers) => { + const targetIndex = details[0].row; + const rows = uniqueRows(details); + const newGrid = foldr(rows, (acc, row) => { + const newG = insertRowAt(acc.grid, targetIndex, row.row + acc.delta, comparator, genWrappers.getOrInit); + return { + grid: newG, + delta: acc.delta + 1 + }; + }, { + grid, + delta: 0 + }).grid; + return bundle(newGrid, targetIndex, details[0].column); + }; + const opInsertRowsAfter = (grid, details, comparator, genWrappers) => { + const rows = uniqueRows(details); + const target = rows[rows.length - 1]; + const targetIndex = target.row + target.rowspan; + const newGrid = foldr(rows, (newG, row) => { + return insertRowAt(newG, targetIndex, row.row, comparator, genWrappers.getOrInit); + }, grid); + return bundle(newGrid, targetIndex, details[0].column); + }; + const opInsertColumnsBefore = (grid, extractDetail, comparator, genWrappers) => { + const details = extractDetail.details; + const columns = uniqueColumns(details); + const targetIndex = columns[0].column; + const newGrid = foldr(columns, (acc, col) => { + const newG = insertColumnAt(acc.grid, targetIndex, col.column + acc.delta, comparator, genWrappers.getOrInit); + return { + grid: newG, + delta: acc.delta + 1 + }; + }, { + grid, + delta: 0 + }).grid; + return bundle(newGrid, details[0].row, targetIndex); + }; + const opInsertColumnsAfter = (grid, extractDetail, comparator, genWrappers) => { + const details = extractDetail.details; + const target = details[details.length - 1]; + const targetIndex = target.column + target.colspan; + const columns = uniqueColumns(details); + const newGrid = foldr(columns, (newG, col) => { + return insertColumnAt(newG, targetIndex, col.column, comparator, genWrappers.getOrInit); + }, grid); + return bundle(newGrid, details[0].row, targetIndex); + }; + const opMakeColumnsHeader = (initialGrid, details, comparator, genWrappers) => { + const columns = uniqueColumns(details); + const columnIndexes = map$1(columns, detail => detail.column); + const newGrid = replaceColumns(initialGrid, columnIndexes, true, comparator, genWrappers.replaceOrInit); + return bundle(newGrid, details[0].row, details[0].column); + }; + const opMakeCellsHeader = (initialGrid, details, comparator, genWrappers) => { + const newGrid = replaceCells(initialGrid, details, comparator, genWrappers.replaceOrInit); + return bundle(newGrid, details[0].row, details[0].column); + }; + const opUnmakeColumnsHeader = (initialGrid, details, comparator, genWrappers) => { + const columns = uniqueColumns(details); + const columnIndexes = map$1(columns, detail => detail.column); + const newGrid = replaceColumns(initialGrid, columnIndexes, false, comparator, genWrappers.replaceOrInit); + return bundle(newGrid, details[0].row, details[0].column); + }; + const opUnmakeCellsHeader = (initialGrid, details, comparator, genWrappers) => { + const newGrid = replaceCells(initialGrid, details, comparator, genWrappers.replaceOrInit); + return bundle(newGrid, details[0].row, details[0].column); + }; + const makeRowsSection = (section, applyScope) => (initialGrid, details, comparator, genWrappers, tableSection) => { + const rows = uniqueRows(details); + const rowIndexes = map$1(rows, detail => detail.row); + const newGrid = replaceRows(initialGrid, rowIndexes, section, applyScope, comparator, genWrappers.replaceOrInit, tableSection); + return bundle(newGrid, details[0].row, details[0].column); + }; + const opMakeRowsHeader = makeRowsSection('thead', true); + const opMakeRowsBody = makeRowsSection('tbody', false); + const opMakeRowsFooter = makeRowsSection('tfoot', false); + const opEraseColumns = (grid, extractDetail, _comparator, _genWrappers) => { + const columns = uniqueColumns(extractDetail.details); + const newGrid = deleteColumnsAt(grid, map$1(columns, column => column.column)); + const maxColIndex = newGrid.length > 0 ? newGrid[0].cells.length - 1 : 0; + return bundle(newGrid, columns[0].row, Math.min(columns[0].column, maxColIndex)); + }; + const opEraseRows = (grid, details, _comparator, _genWrappers) => { + const rows = uniqueRows(details); + const newGrid = deleteRowsAt(grid, rows[0].row, rows[rows.length - 1].row); + const maxRowIndex = newGrid.length > 0 ? newGrid.length - 1 : 0; + return bundle(newGrid, Math.min(details[0].row, maxRowIndex), details[0].column); + }; + const opMergeCells = (grid, mergable, comparator, genWrappers) => { + const cells = mergable.cells; + merge(cells); + const newGrid = merge$2(grid, mergable.bounds, comparator, genWrappers.merge(cells)); + return outcome(newGrid, Optional.from(cells[0])); + }; + const opUnmergeCells = (grid, unmergable, comparator, genWrappers) => { + const unmerge$1 = (b, cell) => unmerge(b, cell, comparator, genWrappers.unmerge(cell)); + const newGrid = foldr(unmergable, unmerge$1, grid); + return outcome(newGrid, Optional.from(unmergable[0])); + }; + const opPasteCells = (grid, pasteDetails, comparator, _genWrappers) => { + const gridify = (table, generators) => { + const wh = Warehouse.fromTable(table); + return toGrid(wh, generators, true); + }; + const gridB = gridify(pasteDetails.clipboard, pasteDetails.generators); + const startAddress = address(pasteDetails.row, pasteDetails.column); + const mergedGrid = merge$1(startAddress, grid, gridB, pasteDetails.generators, comparator); + return mergedGrid.fold(() => outcome(grid, Optional.some(pasteDetails.element)), newGrid => { + return bundle(newGrid, pasteDetails.row, pasteDetails.column); + }); + }; + const gridifyRows = (rows, generators, context) => { + const pasteDetails = fromPastedRows(rows, context.section); + const wh = Warehouse.generate(pasteDetails); + return toGrid(wh, generators, true); + }; + const opPasteColsBefore = (grid, pasteDetails, comparator, _genWrappers) => { + const rows = extractGridDetails(grid).rows; + const index = pasteDetails.cells[0].column; + const context = rows[pasteDetails.cells[0].row]; + const gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context); + const mergedGrid = insertCols(index, grid, gridB, pasteDetails.generators, comparator); + return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column); + }; + const opPasteColsAfter = (grid, pasteDetails, comparator, _genWrappers) => { + const rows = extractGridDetails(grid).rows; + const index = pasteDetails.cells[pasteDetails.cells.length - 1].column + pasteDetails.cells[pasteDetails.cells.length - 1].colspan; + const context = rows[pasteDetails.cells[0].row]; + const gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context); + const mergedGrid = insertCols(index, grid, gridB, pasteDetails.generators, comparator); + return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column); + }; + const opPasteRowsBefore = (grid, pasteDetails, comparator, _genWrappers) => { + const rows = extractGridDetails(grid).rows; + const index = pasteDetails.cells[0].row; + const context = rows[index]; + const gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context); + const mergedGrid = insertRows(index, grid, gridB, pasteDetails.generators, comparator); + return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column); + }; + const opPasteRowsAfter = (grid, pasteDetails, comparator, _genWrappers) => { + const rows = extractGridDetails(grid).rows; + const index = pasteDetails.cells[pasteDetails.cells.length - 1].row + pasteDetails.cells[pasteDetails.cells.length - 1].rowspan; + const context = rows[pasteDetails.cells[0].row]; + const gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context); + const mergedGrid = insertRows(index, grid, gridB, pasteDetails.generators, comparator); + return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column); + }; + const opGetColumnsType = (table, target) => { + const house = Warehouse.fromTable(table); + const details = onCells(house, target); + return details.bind(selectedCells => { + const lastSelectedCell = selectedCells[selectedCells.length - 1]; + const minColRange = selectedCells[0].column; + const maxColRange = lastSelectedCell.column + lastSelectedCell.colspan; + const selectedColumnCells = flatten(map$1(house.all, row => filter$2(row.cells, cell => cell.column >= minColRange && cell.column < maxColRange))); + return findCommonCellType(selectedColumnCells); + }).getOr(''); + }; + const opGetCellsType = (table, target) => { + const house = Warehouse.fromTable(table); + const details = onCells(house, target); + return details.bind(findCommonCellType).getOr(''); + }; + const opGetRowsType = (table, target) => { + const house = Warehouse.fromTable(table); + const details = onCells(house, target); + return details.bind(selectedCells => { + const lastSelectedCell = selectedCells[selectedCells.length - 1]; + const minRowRange = selectedCells[0].row; + const maxRowRange = lastSelectedCell.row + lastSelectedCell.rowspan; + const selectedRows = house.all.slice(minRowRange, maxRowRange); + return findCommonRowType(selectedRows); + }).getOr(''); + }; + const resize = (table, list, details, behaviours) => adjustWidthTo(table, list, details, behaviours.sizing); + const adjustAndRedistributeWidths = (table, list, details, behaviours) => adjustAndRedistributeWidths$1(table, list, details, behaviours.sizing, behaviours.resize); + const firstColumnIsLocked = (_warehouse, details) => exists(details, detail => detail.column === 0 && detail.isLocked); + const lastColumnIsLocked = (warehouse, details) => exists(details, detail => detail.column + detail.colspan >= warehouse.grid.columns && detail.isLocked); + const getColumnsWidth = (warehouse, details) => { + const columns$1 = columns(warehouse); + const uniqueCols = uniqueColumns(details); + return foldl(uniqueCols, (acc, detail) => { + const column = columns$1[detail.column]; + const colWidth = column.map(getOuter$2).getOr(0); + return acc + colWidth; + }, 0); + }; + const insertColumnsExtractor = before => (warehouse, target) => onCells(warehouse, target).filter(details => { + const checkLocked = before ? firstColumnIsLocked : lastColumnIsLocked; + return !checkLocked(warehouse, details); + }).map(details => ({ + details, + pixelDelta: getColumnsWidth(warehouse, details) + })); + const eraseColumnsExtractor = (warehouse, target) => onUnlockedCells(warehouse, target).map(details => ({ + details, + pixelDelta: -getColumnsWidth(warehouse, details) + })); + const pasteColumnsExtractor = before => (warehouse, target) => onPasteByEditor(warehouse, target).filter(details => { + const checkLocked = before ? firstColumnIsLocked : lastColumnIsLocked; + return !checkLocked(warehouse, details.cells); + }); + const headerCellGenerator = Generators.transform('th'); + const bodyCellGenerator = Generators.transform('td'); + const insertRowsBefore = run(opInsertRowsBefore, onCells, noop, noop, Generators.modification); + const insertRowsAfter = run(opInsertRowsAfter, onCells, noop, noop, Generators.modification); + const insertColumnsBefore = run(opInsertColumnsBefore, insertColumnsExtractor(true), adjustAndRedistributeWidths, noop, Generators.modification); + const insertColumnsAfter = run(opInsertColumnsAfter, insertColumnsExtractor(false), adjustAndRedistributeWidths, noop, Generators.modification); + const eraseColumns = run(opEraseColumns, eraseColumnsExtractor, adjustAndRedistributeWidths, prune, Generators.modification); + const eraseRows = run(opEraseRows, onCells, noop, prune, Generators.modification); + const makeColumnsHeader = run(opMakeColumnsHeader, onUnlockedCells, noop, noop, headerCellGenerator); + const unmakeColumnsHeader = run(opUnmakeColumnsHeader, onUnlockedCells, noop, noop, bodyCellGenerator); + const makeRowsHeader = run(opMakeRowsHeader, onUnlockedCells, noop, noop, headerCellGenerator); + const makeRowsBody = run(opMakeRowsBody, onUnlockedCells, noop, noop, bodyCellGenerator); + const makeRowsFooter = run(opMakeRowsFooter, onUnlockedCells, noop, noop, bodyCellGenerator); + const makeCellsHeader = run(opMakeCellsHeader, onUnlockedCells, noop, noop, headerCellGenerator); + const unmakeCellsHeader = run(opUnmakeCellsHeader, onUnlockedCells, noop, noop, bodyCellGenerator); + const mergeCells = run(opMergeCells, onUnlockedMergable, resize, noop, Generators.merging); + const unmergeCells = run(opUnmergeCells, onUnlockedUnmergable, resize, noop, Generators.merging); + const pasteCells = run(opPasteCells, onPaste, resize, noop, Generators.modification); + const pasteColsBefore = run(opPasteColsBefore, pasteColumnsExtractor(true), noop, noop, Generators.modification); + const pasteColsAfter = run(opPasteColsAfter, pasteColumnsExtractor(false), noop, noop, Generators.modification); + const pasteRowsBefore = run(opPasteRowsBefore, onPasteByEditor, noop, noop, Generators.modification); + const pasteRowsAfter = run(opPasteRowsAfter, onPasteByEditor, noop, noop, Generators.modification); + const getColumnsType = opGetColumnsType; + const getCellsType = opGetCellsType; + const getRowsType = opGetRowsType; + + const fireNewRow = (editor, row) => editor.dispatch('NewRow', { node: row }); + const fireNewCell = (editor, cell) => editor.dispatch('NewCell', { node: cell }); + const fireTableModified = (editor, table, data) => { + editor.dispatch('TableModified', { + ...data, + table + }); + }; + const fireTableSelectionChange = (editor, cells, start, finish, otherCells) => { + editor.dispatch('TableSelectionChange', { + cells, + start, + finish, + otherCells + }); + }; + const fireTableSelectionClear = editor => { + editor.dispatch('TableSelectionClear'); + }; + const fireObjectResizeStart = (editor, target, width, height, origin) => { + editor.dispatch('ObjectResizeStart', { + target, + width, + height, + origin + }); + }; + const fireObjectResized = (editor, target, width, height, origin) => { + editor.dispatch('ObjectResized', { + target, + width, + height, + origin + }); + }; + const styleModified = { + structure: false, + style: true + }; + const structureModified = { + structure: true, + style: false + }; + const styleAndStructureModified = { + structure: true, + style: true + }; + + const get$5 = (editor, table) => { + if (isTablePercentagesForced(editor)) { + return TableSize.percentageSize(table); + } else if (isTablePixelsForced(editor)) { + return TableSize.pixelSize(table); + } else { + return TableSize.getTableSize(table); + } + }; + + const TableActions = (editor, resizeHandler, cellSelectionHandler) => { + const isTableBody = editor => name(getBody(editor)) === 'table'; + const lastRowGuard = table => !isTableBody(editor) || getGridSize(table).rows > 1; + const lastColumnGuard = table => !isTableBody(editor) || getGridSize(table).columns > 1; + const cloneFormats = getTableCloneElements(editor); + const colMutationOp = isResizeTableColumnResizing(editor) ? noop : halve; + const getTableSectionType = table => { + switch (getTableHeaderType(editor)) { + case 'section': + return TableSection.section(); + case 'sectionCells': + return TableSection.sectionCells(); + case 'cells': + return TableSection.cells(); + default: + return TableSection.getTableSectionType(table, 'section'); + } + }; + const setSelectionFromAction = (table, result) => result.cursor.fold(() => { + const cells = cells$1(table); + return head(cells).filter(inBody).map(firstCell => { + cellSelectionHandler.clearSelectedCells(table.dom); + const rng = editor.dom.createRng(); + rng.selectNode(firstCell.dom); + editor.selection.setRng(rng); + set$2(firstCell, 'data-mce-selected', '1'); + return rng; + }); + }, cell => { + const des = freefallRtl(cell); + const rng = editor.dom.createRng(); + rng.setStart(des.element.dom, des.offset); + rng.setEnd(des.element.dom, des.offset); + editor.selection.setRng(rng); + cellSelectionHandler.clearSelectedCells(table.dom); + return Optional.some(rng); + }); + const execute = (operation, guard, mutate, effect) => (table, target, noEvents = false) => { + removeDataStyle(table); + const doc = SugarElement.fromDom(editor.getDoc()); + const generators = cellOperations(mutate, doc, cloneFormats); + const behaviours = { + sizing: get$5(editor, table), + resize: isResizeTableColumnResizing(editor) ? resizeTable() : preserveTable(), + section: getTableSectionType(table) + }; + return guard(table) ? operation(table, target, generators, behaviours).bind(result => { + resizeHandler.refresh(table.dom); + each$2(result.newRows, row => { + fireNewRow(editor, row.dom); + }); + each$2(result.newCells, cell => { + fireNewCell(editor, cell.dom); + }); + const range = setSelectionFromAction(table, result); + if (inBody(table)) { + removeDataStyle(table); + if (!noEvents) { + fireTableModified(editor, table.dom, effect); + } + } + return range.map(rng => ({ + rng, + effect + })); + }) : Optional.none(); + }; + const deleteRow = execute(eraseRows, lastRowGuard, noop, structureModified); + const deleteColumn = execute(eraseColumns, lastColumnGuard, noop, structureModified); + const insertRowsBefore$1 = execute(insertRowsBefore, always, noop, structureModified); + const insertRowsAfter$1 = execute(insertRowsAfter, always, noop, structureModified); + const insertColumnsBefore$1 = execute(insertColumnsBefore, always, colMutationOp, structureModified); + const insertColumnsAfter$1 = execute(insertColumnsAfter, always, colMutationOp, structureModified); + const mergeCells$1 = execute(mergeCells, always, noop, structureModified); + const unmergeCells$1 = execute(unmergeCells, always, noop, structureModified); + const pasteColsBefore$1 = execute(pasteColsBefore, always, noop, structureModified); + const pasteColsAfter$1 = execute(pasteColsAfter, always, noop, structureModified); + const pasteRowsBefore$1 = execute(pasteRowsBefore, always, noop, structureModified); + const pasteRowsAfter$1 = execute(pasteRowsAfter, always, noop, structureModified); + const pasteCells$1 = execute(pasteCells, always, noop, styleAndStructureModified); + const makeCellsHeader$1 = execute(makeCellsHeader, always, noop, structureModified); + const unmakeCellsHeader$1 = execute(unmakeCellsHeader, always, noop, structureModified); + const makeColumnsHeader$1 = execute(makeColumnsHeader, always, noop, structureModified); + const unmakeColumnsHeader$1 = execute(unmakeColumnsHeader, always, noop, structureModified); + const makeRowsHeader$1 = execute(makeRowsHeader, always, noop, structureModified); + const makeRowsBody$1 = execute(makeRowsBody, always, noop, structureModified); + const makeRowsFooter$1 = execute(makeRowsFooter, always, noop, structureModified); + const getTableCellType = getCellsType; + const getTableColType = getColumnsType; + const getTableRowType = getRowsType; + return { + deleteRow, + deleteColumn, + insertRowsBefore: insertRowsBefore$1, + insertRowsAfter: insertRowsAfter$1, + insertColumnsBefore: insertColumnsBefore$1, + insertColumnsAfter: insertColumnsAfter$1, + mergeCells: mergeCells$1, + unmergeCells: unmergeCells$1, + pasteColsBefore: pasteColsBefore$1, + pasteColsAfter: pasteColsAfter$1, + pasteRowsBefore: pasteRowsBefore$1, + pasteRowsAfter: pasteRowsAfter$1, + pasteCells: pasteCells$1, + makeCellsHeader: makeCellsHeader$1, + unmakeCellsHeader: unmakeCellsHeader$1, + makeColumnsHeader: makeColumnsHeader$1, + unmakeColumnsHeader: unmakeColumnsHeader$1, + makeRowsHeader: makeRowsHeader$1, + makeRowsBody: makeRowsBody$1, + makeRowsFooter: makeRowsFooter$1, + getTableRowType, + getTableCellType, + getTableColType + }; + }; + + const constrainSpan = (element, property, value) => { + const currentColspan = getAttrValue(element, property, 1); + if (value === 1 || currentColspan <= 1) { + remove$7(element, property); + } else { + set$2(element, property, Math.min(value, currentColspan)); + } + }; + const isColInRange = (minColRange, maxColRange) => cell => { + const endCol = cell.column + cell.colspan - 1; + const startCol = cell.column; + return endCol >= minColRange && startCol < maxColRange; + }; + const generateColGroup = (house, minColRange, maxColRange) => { + if (Warehouse.hasColumns(house)) { + const colsToCopy = filter$2(Warehouse.justColumns(house), isColInRange(minColRange, maxColRange)); + const copiedCols = map$1(colsToCopy, c => { + const clonedCol = deep(c.element); + constrainSpan(clonedCol, 'span', maxColRange - minColRange); + return clonedCol; + }); + const fakeColgroup = SugarElement.fromTag('colgroup'); + append(fakeColgroup, copiedCols); + return [fakeColgroup]; + } else { + return []; + } + }; + const generateRows = (house, minColRange, maxColRange) => map$1(house.all, row => { + const cellsToCopy = filter$2(row.cells, isColInRange(minColRange, maxColRange)); + const copiedCells = map$1(cellsToCopy, cell => { + const clonedCell = deep(cell.element); + constrainSpan(clonedCell, 'colspan', maxColRange - minColRange); + return clonedCell; + }); + const fakeTR = SugarElement.fromTag('tr'); + append(fakeTR, copiedCells); + return fakeTR; + }); + const copyCols = (table, target) => { + const house = Warehouse.fromTable(table); + const details = onUnlockedCells(house, target); + return details.map(selectedCells => { + const lastSelectedCell = selectedCells[selectedCells.length - 1]; + const minColRange = selectedCells[0].column; + const maxColRange = lastSelectedCell.column + lastSelectedCell.colspan; + const fakeColGroups = generateColGroup(house, minColRange, maxColRange); + const fakeRows = generateRows(house, minColRange, maxColRange); + return [ + ...fakeColGroups, + ...fakeRows + ]; + }); + }; + + const copyRows = (table, target, generators) => { + const warehouse = Warehouse.fromTable(table); + const details = onCells(warehouse, target); + return details.bind(selectedCells => { + const grid = toGrid(warehouse, generators, false); + const rows = extractGridDetails(grid).rows; + const slicedGrid = rows.slice(selectedCells[0].row, selectedCells[selectedCells.length - 1].row + selectedCells[selectedCells.length - 1].rowspan); + const filteredGrid = bind$2(slicedGrid, row => { + const newCells = filter$2(row.cells, cell => !cell.isLocked); + return newCells.length > 0 ? [{ + ...row, + cells: newCells + }] : []; + }); + const slicedDetails = toDetailList(filteredGrid); + return someIf(slicedDetails.length > 0, slicedDetails); + }).map(slicedDetails => copy(slicedDetails)); + }; + + const adt$5 = Adt.generate([ + { invalid: ['raw'] }, + { pixels: ['value'] }, + { percent: ['value'] } + ]); + const validateFor = (suffix, type, value) => { + const rawAmount = value.substring(0, value.length - suffix.length); + const amount = parseFloat(rawAmount); + return rawAmount === amount.toString() ? type(amount) : adt$5.invalid(value); + }; + const from = value => { + if (endsWith(value, '%')) { + return validateFor('%', adt$5.percent, value); + } + if (endsWith(value, 'px')) { + return validateFor('px', adt$5.pixels, value); + } + return adt$5.invalid(value); + }; + const Size = { + ...adt$5, + from + }; + + const redistributeToPercent = (widths, totalWidth) => { + return map$1(widths, w => { + const colType = Size.from(w); + return colType.fold(() => { + return w; + }, px => { + const ratio = px / totalWidth * 100; + return ratio + '%'; + }, pc => { + return pc + '%'; + }); + }); + }; + const redistributeToPx = (widths, totalWidth, newTotalWidth) => { + const scale = newTotalWidth / totalWidth; + return map$1(widths, w => { + const colType = Size.from(w); + return colType.fold(() => { + return w; + }, px => { + return px * scale + 'px'; + }, pc => { + return pc / 100 * newTotalWidth + 'px'; + }); + }); + }; + const redistributeEmpty = (newWidthType, columns) => { + const f = newWidthType.fold(() => constant(''), pixels => { + const num = pixels / columns; + return constant(num + 'px'); + }, () => { + const num = 100 / columns; + return constant(num + '%'); + }); + return range$1(columns, f); + }; + const redistributeValues = (newWidthType, widths, totalWidth) => { + return newWidthType.fold(() => { + return widths; + }, px => { + return redistributeToPx(widths, totalWidth, px); + }, _pc => { + return redistributeToPercent(widths, totalWidth); + }); + }; + const redistribute$1 = (widths, totalWidth, newWidth) => { + const newType = Size.from(newWidth); + const floats = forall(widths, s => { + return s === '0px'; + }) ? redistributeEmpty(newType, widths.length) : redistributeValues(newType, widths, totalWidth); + return normalize(floats); + }; + const sum = (values, fallback) => { + if (values.length === 0) { + return fallback; + } + return foldr(values, (rest, v) => { + return Size.from(v).fold(constant(0), identity, identity) + rest; + }, 0); + }; + const roundDown = (num, unit) => { + const floored = Math.floor(num); + return { + value: floored + unit, + remainder: num - floored + }; + }; + const add$3 = (value, amount) => { + return Size.from(value).fold(constant(value), px => { + return px + amount + 'px'; + }, pc => { + return pc + amount + '%'; + }); + }; + const normalize = values => { + if (values.length === 0) { + return values; + } + const scan = foldr(values, (rest, value) => { + const info = Size.from(value).fold(() => ({ + value, + remainder: 0 + }), num => roundDown(num, 'px'), num => ({ + value: num + '%', + remainder: 0 + })); + return { + output: [info.value].concat(rest.output), + remainder: rest.remainder + info.remainder + }; + }, { + output: [], + remainder: 0 + }); + const r = scan.output; + return r.slice(0, r.length - 1).concat([add$3(r[r.length - 1], Math.round(scan.remainder))]); + }; + const validate = Size.from; + + const redistributeToW = (newWidths, cells, unit) => { + each$2(cells, cell => { + const widths = newWidths.slice(cell.column, cell.colspan + cell.column); + const w = sum(widths, minWidth()); + set$1(cell.element, 'width', w + unit); + }); + }; + const redistributeToColumns = (newWidths, columns, unit) => { + each$2(columns, (column, index) => { + const width = sum([newWidths[index]], minWidth()); + set$1(column.element, 'width', width + unit); + }); + }; + const redistributeToH = (newHeights, rows, cells, unit) => { + each$2(cells, cell => { + const heights = newHeights.slice(cell.row, cell.rowspan + cell.row); + const h = sum(heights, minHeight()); + set$1(cell.element, 'height', h + unit); + }); + each$2(rows, (row, i) => { + set$1(row.element, 'height', newHeights[i]); + }); + }; + const getUnit = newSize => { + return validate(newSize).fold(constant('px'), constant('px'), constant('%')); + }; + const redistribute = (table, optWidth, optHeight) => { + const warehouse = Warehouse.fromTable(table); + const rows = warehouse.all; + const cells = Warehouse.justCells(warehouse); + const columns = Warehouse.justColumns(warehouse); + optWidth.each(newWidth => { + const widthUnit = getUnit(newWidth); + const totalWidth = get$9(table); + const oldWidths = getRawWidths(warehouse, table); + const nuWidths = redistribute$1(oldWidths, totalWidth, newWidth); + if (Warehouse.hasColumns(warehouse)) { + redistributeToColumns(nuWidths, columns, widthUnit); + } else { + redistributeToW(nuWidths, cells, widthUnit); + } + set$1(table, 'width', newWidth); + }); + optHeight.each(newHeight => { + const hUnit = getUnit(newHeight); + const totalHeight = get$8(table); + const oldHeights = getRawHeights(warehouse, table, height); + const nuHeights = redistribute$1(oldHeights, totalHeight, newHeight); + redistributeToH(nuHeights, rows, cells, hUnit); + set$1(table, 'height', newHeight); + }); + }; + const isPercentSizing = isPercentSizing$1; + const isPixelSizing = isPixelSizing$1; + const isNoneSizing = isNoneSizing$1; + + const cleanupLegacyAttributes = element => { + remove$7(element, 'width'); + }; + const convertToPercentSize = table => { + const newWidth = getPercentTableWidth(table); + redistribute(table, Optional.some(newWidth), Optional.none()); + cleanupLegacyAttributes(table); + }; + const convertToPixelSize = table => { + const newWidth = getPixelTableWidth(table); + redistribute(table, Optional.some(newWidth), Optional.none()); + cleanupLegacyAttributes(table); + }; + const convertToNoneSize = table => { + remove$5(table, 'width'); + const columns = columns$1(table); + const rowElements = columns.length > 0 ? columns : cells$1(table); + each$2(rowElements, cell => { + remove$5(cell, 'width'); + cleanupLegacyAttributes(cell); + }); + cleanupLegacyAttributes(table); + }; + + const DefaultRenderOptions = { + styles: { + 'border-collapse': 'collapse', + 'width': '100%' + }, + attributes: { border: '1' }, + colGroups: false + }; + const tableHeaderCell = () => SugarElement.fromTag('th'); + const tableCell = () => SugarElement.fromTag('td'); + const tableColumn = () => SugarElement.fromTag('col'); + const createRow = (columns, rowHeaders, columnHeaders, rowIndex) => { + const tr = SugarElement.fromTag('tr'); + for (let j = 0; j < columns; j++) { + const td = rowIndex < rowHeaders || j < columnHeaders ? tableHeaderCell() : tableCell(); + if (j < columnHeaders) { + set$2(td, 'scope', 'row'); + } + if (rowIndex < rowHeaders) { + set$2(td, 'scope', 'col'); + } + append$1(td, SugarElement.fromTag('br')); + append$1(tr, td); + } + return tr; + }; + const createGroupRow = columns => { + const columnGroup = SugarElement.fromTag('colgroup'); + range$1(columns, () => append$1(columnGroup, tableColumn())); + return columnGroup; + }; + const createRows = (rows, columns, rowHeaders, columnHeaders) => range$1(rows, r => createRow(columns, rowHeaders, columnHeaders, r)); + const render = (rows, columns, rowHeaders, columnHeaders, headerType, renderOpts = DefaultRenderOptions) => { + const table = SugarElement.fromTag('table'); + const rowHeadersGoInThead = headerType !== 'cells'; + setAll(table, renderOpts.styles); + setAll$1(table, renderOpts.attributes); + if (renderOpts.colGroups) { + append$1(table, createGroupRow(columns)); + } + const actualRowHeaders = Math.min(rows, rowHeaders); + if (rowHeadersGoInThead && rowHeaders > 0) { + const thead = SugarElement.fromTag('thead'); + append$1(table, thead); + const theadRowHeaders = headerType === 'sectionCells' ? actualRowHeaders : 0; + const theadRows = createRows(rowHeaders, columns, theadRowHeaders, columnHeaders); + append(thead, theadRows); + } + const tbody = SugarElement.fromTag('tbody'); + append$1(table, tbody); + const numRows = rowHeadersGoInThead ? rows - actualRowHeaders : rows; + const numRowHeaders = rowHeadersGoInThead ? 0 : rowHeaders; + const tbodyRows = createRows(numRows, columns, numRowHeaders, columnHeaders); + append(tbody, tbodyRows); + return table; + }; + + const get$4 = element => element.dom.innerHTML; + const getOuter = element => { + const container = SugarElement.fromTag('div'); + const clone = SugarElement.fromDom(element.dom.cloneNode(true)); + append$1(container, clone); + return get$4(container); + }; + + const placeCaretInCell = (editor, cell) => { + editor.selection.select(cell.dom, true); + editor.selection.collapse(true); + }; + const selectFirstCellInTable = (editor, tableElm) => { + descendant(tableElm, 'td,th').each(curry(placeCaretInCell, editor)); + }; + const fireEvents = (editor, table) => { + each$2(descendants(table, 'tr'), row => { + fireNewRow(editor, row.dom); + each$2(descendants(row, 'th,td'), cell => { + fireNewCell(editor, cell.dom); + }); + }); + }; + const isPercentage = width => isString(width) && width.indexOf('%') !== -1; + const insert = (editor, columns, rows, colHeaders, rowHeaders) => { + const defaultStyles = getTableDefaultStyles(editor); + const options = { + styles: defaultStyles, + attributes: getTableDefaultAttributes(editor), + colGroups: tableUseColumnGroup(editor) + }; + editor.undoManager.ignore(() => { + const table = render(rows, columns, rowHeaders, colHeaders, getTableHeaderType(editor), options); + set$2(table, 'data-mce-id', '__mce'); + const html = getOuter(table); + editor.insertContent(html); + editor.addVisual(); + }); + return descendant(getBody(editor), 'table[data-mce-id="__mce"]').map(table => { + if (isTablePixelsForced(editor)) { + convertToPixelSize(table); + } else if (isTableResponsiveForced(editor)) { + convertToNoneSize(table); + } else if (isTablePercentagesForced(editor) || isPercentage(defaultStyles.width)) { + convertToPercentSize(table); + } + removeDataStyle(table); + remove$7(table, 'data-mce-id'); + fireEvents(editor, table); + selectFirstCellInTable(editor, table); + return table.dom; + }).getOrNull(); + }; + const insertTable = (editor, rows, columns, options = {}) => { + const checkInput = val => isNumber(val) && val > 0; + if (checkInput(rows) && checkInput(columns)) { + const headerRows = options.headerRows || 0; + const headerColumns = options.headerColumns || 0; + return insert(editor, columns, rows, headerColumns, headerRows); + } else { + console.error('Invalid values for mceInsertTable - rows and columns values are required to insert a table.'); + return null; + } + }; + + var global = tinymce.util.Tools.resolve('tinymce.FakeClipboard'); + + const tableTypeBase = 'x-tinymce/dom-table-'; + const tableTypeRow = tableTypeBase + 'rows'; + const tableTypeColumn = tableTypeBase + 'columns'; + const setData = items => { + const fakeClipboardItem = global.FakeClipboardItem(items); + global.write([fakeClipboardItem]); + }; + const getData = type => { + var _a; + const items = (_a = global.read()) !== null && _a !== void 0 ? _a : []; + return findMap(items, item => Optional.from(item.getType(type))); + }; + const clearData = type => { + if (getData(type).isSome()) { + global.clear(); + } + }; + const setRows = rowsOpt => { + rowsOpt.fold(clearRows, rows => setData({ [tableTypeRow]: rows })); + }; + const getRows = () => getData(tableTypeRow); + const clearRows = () => clearData(tableTypeRow); + const setColumns = columnsOpt => { + columnsOpt.fold(clearColumns, columns => setData({ [tableTypeColumn]: columns })); + }; + const getColumns = () => getData(tableTypeColumn); + const clearColumns = () => clearData(tableTypeColumn); + + const getSelectionStartCellOrCaption = editor => getSelectionCellOrCaption(getSelectionStart(editor), getIsRoot(editor)).filter(isInEditableContext$1); + const getSelectionStartCell = editor => getSelectionCell(getSelectionStart(editor), getIsRoot(editor)).filter(isInEditableContext$1); + const registerCommands = (editor, actions) => { + const isRoot = getIsRoot(editor); + const eraseTable = () => getSelectionStartCellOrCaption(editor).each(cellOrCaption => { + table(cellOrCaption, isRoot).filter(not(isRoot)).each(table => { + const cursor = SugarElement.fromText(''); + after$5(table, cursor); + remove$6(table); + if (editor.dom.isEmpty(editor.getBody())) { + editor.setContent(''); + editor.selection.setCursorLocation(); + } else { + const rng = editor.dom.createRng(); + rng.setStart(cursor.dom, 0); + rng.setEnd(cursor.dom, 0); + editor.selection.setRng(rng); + editor.nodeChanged(); + } + }); + }); + const setSizingMode = sizing => getSelectionStartCellOrCaption(editor).each(cellOrCaption => { + const isForcedSizing = isTableResponsiveForced(editor) || isTablePixelsForced(editor) || isTablePercentagesForced(editor); + if (!isForcedSizing) { + table(cellOrCaption, isRoot).each(table => { + if (sizing === 'relative' && !isPercentSizing(table)) { + convertToPercentSize(table); + } else if (sizing === 'fixed' && !isPixelSizing(table)) { + convertToPixelSize(table); + } else if (sizing === 'responsive' && !isNoneSizing(table)) { + convertToNoneSize(table); + } + removeDataStyle(table); + fireTableModified(editor, table.dom, structureModified); + }); + } + }); + const getTableFromCell = cell => table(cell, isRoot); + const performActionOnSelection = action => getSelectionStartCell(editor).bind(cell => getTableFromCell(cell).map(table => action(table, cell))); + const toggleTableClass = (_ui, clazz) => { + performActionOnSelection(table => { + editor.formatter.toggle('tableclass', { value: clazz }, table.dom); + fireTableModified(editor, table.dom, styleModified); + }); + }; + const toggleTableCellClass = (_ui, clazz) => { + performActionOnSelection(table => { + const selectedCells = getCellsFromSelection(editor); + const allHaveClass = forall(selectedCells, cell => editor.formatter.match('tablecellclass', { value: clazz }, cell.dom)); + const formatterAction = allHaveClass ? editor.formatter.remove : editor.formatter.apply; + each$2(selectedCells, cell => formatterAction('tablecellclass', { value: clazz }, cell.dom)); + fireTableModified(editor, table.dom, styleModified); + }); + }; + const toggleCaption = () => { + getSelectionStartCellOrCaption(editor).each(cellOrCaption => { + table(cellOrCaption, isRoot).each(table => { + child(table, 'caption').fold(() => { + const caption = SugarElement.fromTag('caption'); + append$1(caption, SugarElement.fromText('Caption')); + appendAt(table, caption, 0); + editor.selection.setCursorLocation(caption.dom, 0); + }, caption => { + if (isTag('caption')(cellOrCaption)) { + one('td', table).each(td => editor.selection.setCursorLocation(td.dom, 0)); + } + remove$6(caption); + }); + fireTableModified(editor, table.dom, structureModified); + }); + }); + }; + const postExecute = _data => { + editor.focus(); + }; + const actOnSelection = (execute, noEvents = false) => performActionOnSelection((table, startCell) => { + const targets = forMenu(getCellsFromSelection(editor), table, startCell); + execute(table, targets, noEvents).each(postExecute); + }); + const copyRowSelection = () => performActionOnSelection((table, startCell) => { + const targets = forMenu(getCellsFromSelection(editor), table, startCell); + const generators = cellOperations(noop, SugarElement.fromDom(editor.getDoc()), Optional.none()); + return copyRows(table, targets, generators); + }); + const copyColSelection = () => performActionOnSelection((table, startCell) => { + const targets = forMenu(getCellsFromSelection(editor), table, startCell); + return copyCols(table, targets); + }); + const pasteOnSelection = (execute, getRows) => getRows().each(rows => { + const clonedRows = map$1(rows, row => deep(row)); + performActionOnSelection((table, startCell) => { + const generators = paste$1(SugarElement.fromDom(editor.getDoc())); + const targets = pasteRows(getCellsFromSelection(editor), startCell, clonedRows, generators); + execute(table, targets).each(postExecute); + }); + }); + const actOnType = getAction => (_ui, args) => get$c(args, 'type').each(type => { + actOnSelection(getAction(type), args.no_events); + }); + each$1({ + mceTableSplitCells: () => actOnSelection(actions.unmergeCells), + mceTableMergeCells: () => actOnSelection(actions.mergeCells), + mceTableInsertRowBefore: () => actOnSelection(actions.insertRowsBefore), + mceTableInsertRowAfter: () => actOnSelection(actions.insertRowsAfter), + mceTableInsertColBefore: () => actOnSelection(actions.insertColumnsBefore), + mceTableInsertColAfter: () => actOnSelection(actions.insertColumnsAfter), + mceTableDeleteCol: () => actOnSelection(actions.deleteColumn), + mceTableDeleteRow: () => actOnSelection(actions.deleteRow), + mceTableCutCol: () => copyColSelection().each(selection => { + setColumns(selection); + actOnSelection(actions.deleteColumn); + }), + mceTableCutRow: () => copyRowSelection().each(selection => { + setRows(selection); + actOnSelection(actions.deleteRow); + }), + mceTableCopyCol: () => copyColSelection().each(selection => setColumns(selection)), + mceTableCopyRow: () => copyRowSelection().each(selection => setRows(selection)), + mceTablePasteColBefore: () => pasteOnSelection(actions.pasteColsBefore, getColumns), + mceTablePasteColAfter: () => pasteOnSelection(actions.pasteColsAfter, getColumns), + mceTablePasteRowBefore: () => pasteOnSelection(actions.pasteRowsBefore, getRows), + mceTablePasteRowAfter: () => pasteOnSelection(actions.pasteRowsAfter, getRows), + mceTableDelete: eraseTable, + mceTableCellToggleClass: toggleTableCellClass, + mceTableToggleClass: toggleTableClass, + mceTableToggleCaption: toggleCaption, + mceTableSizingMode: (_ui, sizing) => setSizingMode(sizing), + mceTableCellType: actOnType(type => type === 'th' ? actions.makeCellsHeader : actions.unmakeCellsHeader), + mceTableColType: actOnType(type => type === 'th' ? actions.makeColumnsHeader : actions.unmakeColumnsHeader), + mceTableRowType: actOnType(type => { + switch (type) { + case 'header': + return actions.makeRowsHeader; + case 'footer': + return actions.makeRowsFooter; + default: + return actions.makeRowsBody; + } + }) + }, (func, name) => editor.addCommand(name, func)); + editor.addCommand('mceInsertTable', (_ui, args) => { + insertTable(editor, args.rows, args.columns, args.options); + }); + editor.addCommand('mceTableApplyCellStyle', (_ui, args) => { + const getFormatName = style => 'tablecell' + style.toLowerCase().replace('-', ''); + if (!isObject(args)) { + return; + } + const cells = filter$2(getCellsFromSelection(editor), isInEditableContext$1); + if (cells.length === 0) { + return; + } + const validArgs = filter$1(args, (value, style) => editor.formatter.has(getFormatName(style)) && isString(value)); + if (isEmpty(validArgs)) { + return; + } + each$1(validArgs, (value, style) => { + const formatName = getFormatName(style); + each$2(cells, cell => { + if (value === '') { + editor.formatter.remove(formatName, { value: null }, cell.dom, true); + } else { + editor.formatter.apply(formatName, { value }, cell.dom); + } + }); + }); + getTableFromCell(cells[0]).each(table => fireTableModified(editor, table.dom, styleModified)); + }); + }; + + const registerQueryCommands = (editor, actions) => { + const isRoot = getIsRoot(editor); + const lookupOnSelection = action => getSelectionCell(getSelectionStart(editor)).bind(cell => table(cell, isRoot).map(table => { + const targets = forMenu(getCellsFromSelection(editor), table, cell); + return action(table, targets); + })).getOr(''); + each$1({ + mceTableRowType: () => lookupOnSelection(actions.getTableRowType), + mceTableCellType: () => lookupOnSelection(actions.getTableCellType), + mceTableColType: () => lookupOnSelection(actions.getTableColType) + }, (func, name) => editor.addQueryValueHandler(name, func)); + }; + + const adt$4 = Adt.generate([ + { before: ['element'] }, + { + on: [ + 'element', + 'offset' + ] + }, + { after: ['element'] } + ]); + const cata$1 = (subject, onBefore, onOn, onAfter) => subject.fold(onBefore, onOn, onAfter); + const getStart$1 = situ => situ.fold(identity, identity, identity); + const before$2 = adt$4.before; + const on = adt$4.on; + const after$3 = adt$4.after; + const Situ = { + before: before$2, + on, + after: after$3, + cata: cata$1, + getStart: getStart$1 + }; + + const create$4 = (selection, kill) => ({ + selection, + kill + }); + const Response = { create: create$4 }; + + const selectNode = (win, element) => { + const rng = win.document.createRange(); + rng.selectNode(element.dom); + return rng; + }; + const selectNodeContents = (win, element) => { + const rng = win.document.createRange(); + selectNodeContentsUsing(rng, element); + return rng; + }; + const selectNodeContentsUsing = (rng, element) => rng.selectNodeContents(element.dom); + const setStart = (rng, situ) => { + situ.fold(e => { + rng.setStartBefore(e.dom); + }, (e, o) => { + rng.setStart(e.dom, o); + }, e => { + rng.setStartAfter(e.dom); + }); + }; + const setFinish = (rng, situ) => { + situ.fold(e => { + rng.setEndBefore(e.dom); + }, (e, o) => { + rng.setEnd(e.dom, o); + }, e => { + rng.setEndAfter(e.dom); + }); + }; + const relativeToNative = (win, startSitu, finishSitu) => { + const range = win.document.createRange(); + setStart(range, startSitu); + setFinish(range, finishSitu); + return range; + }; + const exactToNative = (win, start, soffset, finish, foffset) => { + const rng = win.document.createRange(); + rng.setStart(start.dom, soffset); + rng.setEnd(finish.dom, foffset); + return rng; + }; + const toRect = rect => ({ + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + width: rect.width, + height: rect.height + }); + const getFirstRect$1 = rng => { + const rects = rng.getClientRects(); + const rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect(); + return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.none(); + }; + + const adt$3 = Adt.generate([ + { + ltr: [ + 'start', + 'soffset', + 'finish', + 'foffset' + ] + }, + { + rtl: [ + 'start', + 'soffset', + 'finish', + 'foffset' + ] + } + ]); + const fromRange = (win, type, range) => type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset); + const getRanges = (win, selection) => selection.match({ + domRange: rng => { + return { + ltr: constant(rng), + rtl: Optional.none + }; + }, + relative: (startSitu, finishSitu) => { + return { + ltr: cached(() => relativeToNative(win, startSitu, finishSitu)), + rtl: cached(() => Optional.some(relativeToNative(win, finishSitu, startSitu))) + }; + }, + exact: (start, soffset, finish, foffset) => { + return { + ltr: cached(() => exactToNative(win, start, soffset, finish, foffset)), + rtl: cached(() => Optional.some(exactToNative(win, finish, foffset, start, soffset))) + }; + } + }); + const doDiagnose = (win, ranges) => { + const rng = ranges.ltr(); + if (rng.collapsed) { + const reversed = ranges.rtl().filter(rev => rev.collapsed === false); + return reversed.map(rev => adt$3.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset)).getOrThunk(() => fromRange(win, adt$3.ltr, rng)); + } else { + return fromRange(win, adt$3.ltr, rng); + } + }; + const diagnose = (win, selection) => { + const ranges = getRanges(win, selection); + return doDiagnose(win, ranges); + }; + const asLtrRange = (win, selection) => { + const diagnosis = diagnose(win, selection); + return diagnosis.match({ + ltr: (start, soffset, finish, foffset) => { + const rng = win.document.createRange(); + rng.setStart(start.dom, soffset); + rng.setEnd(finish.dom, foffset); + return rng; + }, + rtl: (start, soffset, finish, foffset) => { + const rng = win.document.createRange(); + rng.setStart(finish.dom, foffset); + rng.setEnd(start.dom, soffset); + return rng; + } + }); + }; + adt$3.ltr; + adt$3.rtl; + + const create$3 = (start, soffset, finish, foffset) => ({ + start, + soffset, + finish, + foffset + }); + const SimRange = { create: create$3 }; + + const create$2 = (start, soffset, finish, foffset) => { + return { + start: Situ.on(start, soffset), + finish: Situ.on(finish, foffset) + }; + }; + const Situs = { create: create$2 }; + + const convertToRange = (win, selection) => { + const rng = asLtrRange(win, selection); + return SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset); + }; + const makeSitus = Situs.create; + + const sync = (container, isRoot, start, soffset, finish, foffset, selectRange) => { + if (!(eq$1(start, finish) && soffset === foffset)) { + return closest$1(start, 'td,th', isRoot).bind(s => { + return closest$1(finish, 'td,th', isRoot).bind(f => { + return detect(container, isRoot, s, f, selectRange); + }); + }); + } else { + return Optional.none(); + } + }; + const detect = (container, isRoot, start, finish, selectRange) => { + if (!eq$1(start, finish)) { + return identify(start, finish, isRoot).bind(cellSel => { + const boxes = cellSel.boxes.getOr([]); + if (boxes.length > 1) { + selectRange(container, boxes, cellSel.start, cellSel.finish); + return Optional.some(Response.create(Optional.some(makeSitus(start, 0, start, getEnd(start))), true)); + } else { + return Optional.none(); + } + }); + } else { + return Optional.none(); + } + }; + const update = (rows, columns, container, selected, annotations) => { + const updateSelection = newSels => { + annotations.clearBeforeUpdate(container); + annotations.selectRange(container, newSels.boxes, newSels.start, newSels.finish); + return newSels.boxes; + }; + return shiftSelection(selected, rows, columns, annotations.firstSelectedSelector, annotations.lastSelectedSelector).map(updateSelection); + }; + + const traverse = (item, mode) => ({ + item, + mode + }); + const backtrack = (universe, item, _direction, transition = sidestep) => { + return universe.property().parent(item).map(p => { + return traverse(p, transition); + }); + }; + const sidestep = (universe, item, direction, transition = advance) => { + return direction.sibling(universe, item).map(p => { + return traverse(p, transition); + }); + }; + const advance = (universe, item, direction, transition = advance) => { + const children = universe.property().children(item); + const result = direction.first(children); + return result.map(r => { + return traverse(r, transition); + }); + }; + const successors = [ + { + current: backtrack, + next: sidestep, + fallback: Optional.none() + }, + { + current: sidestep, + next: advance, + fallback: Optional.some(backtrack) + }, + { + current: advance, + next: advance, + fallback: Optional.some(sidestep) + } + ]; + const go = (universe, item, mode, direction, rules = successors) => { + const ruleOpt = find$1(rules, succ => { + return succ.current === mode; + }); + return ruleOpt.bind(rule => { + return rule.current(universe, item, direction, rule.next).orThunk(() => { + return rule.fallback.bind(fb => { + return go(universe, item, fb, direction); + }); + }); + }); + }; + + const left$1 = () => { + const sibling = (universe, item) => { + return universe.query().prevSibling(item); + }; + const first = children => { + return children.length > 0 ? Optional.some(children[children.length - 1]) : Optional.none(); + }; + return { + sibling, + first + }; + }; + const right$1 = () => { + const sibling = (universe, item) => { + return universe.query().nextSibling(item); + }; + const first = children => { + return children.length > 0 ? Optional.some(children[0]) : Optional.none(); + }; + return { + sibling, + first + }; + }; + const Walkers = { + left: left$1, + right: right$1 + }; + + const hone = (universe, item, predicate, mode, direction, isRoot) => { + const next = go(universe, item, mode, direction); + return next.bind(n => { + if (isRoot(n.item)) { + return Optional.none(); + } else { + return predicate(n.item) ? Optional.some(n.item) : hone(universe, n.item, predicate, n.mode, direction, isRoot); + } + }); + }; + const left = (universe, item, predicate, isRoot) => { + return hone(universe, item, predicate, sidestep, Walkers.left(), isRoot); + }; + const right = (universe, item, predicate, isRoot) => { + return hone(universe, item, predicate, sidestep, Walkers.right(), isRoot); + }; + + const isLeaf = universe => element => universe.property().children(element).length === 0; + const before$1 = (universe, item, isRoot) => { + return seekLeft$1(universe, item, isLeaf(universe), isRoot); + }; + const after$2 = (universe, item, isRoot) => { + return seekRight$1(universe, item, isLeaf(universe), isRoot); + }; + const seekLeft$1 = left; + const seekRight$1 = right; + + const universe = DomUniverse(); + const before = (element, isRoot) => { + return before$1(universe, element, isRoot); + }; + const after$1 = (element, isRoot) => { + return after$2(universe, element, isRoot); + }; + const seekLeft = (element, predicate, isRoot) => { + return seekLeft$1(universe, element, predicate, isRoot); + }; + const seekRight = (element, predicate, isRoot) => { + return seekRight$1(universe, element, predicate, isRoot); + }; + + const ancestor = (scope, predicate, isRoot) => ancestor$2(scope, predicate, isRoot).isSome(); + + const adt$2 = Adt.generate([ + { none: ['message'] }, + { success: [] }, + { failedUp: ['cell'] }, + { failedDown: ['cell'] } + ]); + const isOverlapping = (bridge, before, after) => { + const beforeBounds = bridge.getRect(before); + const afterBounds = bridge.getRect(after); + return afterBounds.right > beforeBounds.left && afterBounds.left < beforeBounds.right; + }; + const isRow = elem => { + return closest$1(elem, 'tr'); + }; + const verify = (bridge, before, beforeOffset, after, afterOffset, failure, isRoot) => { + return closest$1(after, 'td,th', isRoot).bind(afterCell => { + return closest$1(before, 'td,th', isRoot).map(beforeCell => { + if (!eq$1(afterCell, beforeCell)) { + return sharedOne(isRow, [ + afterCell, + beforeCell + ]).fold(() => { + return isOverlapping(bridge, beforeCell, afterCell) ? adt$2.success() : failure(beforeCell); + }, _sharedRow => { + return failure(beforeCell); + }); + } else { + return eq$1(after, afterCell) && getEnd(afterCell) === afterOffset ? failure(beforeCell) : adt$2.none('in same cell'); + } + }); + }).getOr(adt$2.none('default')); + }; + const cata = (subject, onNone, onSuccess, onFailedUp, onFailedDown) => { + return subject.fold(onNone, onSuccess, onFailedUp, onFailedDown); + }; + const BeforeAfter = { + ...adt$2, + verify, + cata + }; + + const inParent = (parent, children, element, index) => ({ + parent, + children, + element, + index + }); + const indexInParent = element => parent(element).bind(parent => { + const children = children$2(parent); + return indexOf(children, element).map(index => inParent(parent, children, element, index)); + }); + const indexOf = (elements, element) => findIndex(elements, curry(eq$1, element)); + + const isBr = isTag('br'); + const gatherer = (cand, gather, isRoot) => { + return gather(cand, isRoot).bind(target => { + return isText(target) && get$6(target).trim().length === 0 ? gatherer(target, gather, isRoot) : Optional.some(target); + }); + }; + const handleBr = (isRoot, element, direction) => { + return direction.traverse(element).orThunk(() => { + return gatherer(element, direction.gather, isRoot); + }).map(direction.relative); + }; + const findBr = (element, offset) => { + return child$2(element, offset).filter(isBr).orThunk(() => { + return child$2(element, offset - 1).filter(isBr); + }); + }; + const handleParent = (isRoot, element, offset, direction) => { + return findBr(element, offset).bind(br => { + return direction.traverse(br).fold(() => { + return gatherer(br, direction.gather, isRoot).map(direction.relative); + }, adjacent => { + return indexInParent(adjacent).map(info => { + return Situ.on(info.parent, info.index); + }); + }); + }); + }; + const tryBr = (isRoot, element, offset, direction) => { + const target = isBr(element) ? handleBr(isRoot, element, direction) : handleParent(isRoot, element, offset, direction); + return target.map(tgt => { + return { + start: tgt, + finish: tgt + }; + }); + }; + const process = analysis => { + return BeforeAfter.cata(analysis, _message => { + return Optional.none(); + }, () => { + return Optional.none(); + }, cell => { + return Optional.some(point(cell, 0)); + }, cell => { + return Optional.some(point(cell, getEnd(cell))); + }); + }; + + const moveDown = (caret, amount) => { + return { + left: caret.left, + top: caret.top + amount, + right: caret.right, + bottom: caret.bottom + amount + }; + }; + const moveUp = (caret, amount) => { + return { + left: caret.left, + top: caret.top - amount, + right: caret.right, + bottom: caret.bottom - amount + }; + }; + const translate = (caret, xDelta, yDelta) => { + return { + left: caret.left + xDelta, + top: caret.top + yDelta, + right: caret.right + xDelta, + bottom: caret.bottom + yDelta + }; + }; + const getTop = caret => { + return caret.top; + }; + const getBottom = caret => { + return caret.bottom; + }; + + const getPartialBox = (bridge, element, offset) => { + if (offset >= 0 && offset < getEnd(element)) { + return bridge.getRangedRect(element, offset, element, offset + 1); + } else if (offset > 0) { + return bridge.getRangedRect(element, offset - 1, element, offset); + } + return Optional.none(); + }; + const toCaret = rect => ({ + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom + }); + const getElemBox = (bridge, element) => { + return Optional.some(bridge.getRect(element)); + }; + const getBoxAt = (bridge, element, offset) => { + if (isElement(element)) { + return getElemBox(bridge, element).map(toCaret); + } else if (isText(element)) { + return getPartialBox(bridge, element, offset).map(toCaret); + } else { + return Optional.none(); + } + }; + const getEntireBox = (bridge, element) => { + if (isElement(element)) { + return getElemBox(bridge, element).map(toCaret); + } else if (isText(element)) { + return bridge.getRangedRect(element, 0, element, getEnd(element)).map(toCaret); + } else { + return Optional.none(); + } + }; + + const JUMP_SIZE = 5; + const NUM_RETRIES = 100; + const adt$1 = Adt.generate([ + { none: [] }, + { retry: ['caret'] } + ]); + const isOutside = (caret, box) => { + return caret.left < box.left || Math.abs(box.right - caret.left) < 1 || caret.left > box.right; + }; + const inOutsideBlock = (bridge, element, caret) => { + return closest$2(element, isBlock).fold(never, cell => { + return getEntireBox(bridge, cell).exists(box => { + return isOutside(caret, box); + }); + }); + }; + const adjustDown = (bridge, element, guessBox, original, caret) => { + const lowerCaret = moveDown(caret, JUMP_SIZE); + if (Math.abs(guessBox.bottom - original.bottom) < 1) { + return adt$1.retry(lowerCaret); + } else if (guessBox.top > caret.bottom) { + return adt$1.retry(lowerCaret); + } else if (guessBox.top === caret.bottom) { + return adt$1.retry(moveDown(caret, 1)); + } else { + return inOutsideBlock(bridge, element, caret) ? adt$1.retry(translate(lowerCaret, JUMP_SIZE, 0)) : adt$1.none(); + } + }; + const adjustUp = (bridge, element, guessBox, original, caret) => { + const higherCaret = moveUp(caret, JUMP_SIZE); + if (Math.abs(guessBox.top - original.top) < 1) { + return adt$1.retry(higherCaret); + } else if (guessBox.bottom < caret.top) { + return adt$1.retry(higherCaret); + } else if (guessBox.bottom === caret.top) { + return adt$1.retry(moveUp(caret, 1)); + } else { + return inOutsideBlock(bridge, element, caret) ? adt$1.retry(translate(higherCaret, JUMP_SIZE, 0)) : adt$1.none(); + } + }; + const upMovement = { + point: getTop, + adjuster: adjustUp, + move: moveUp, + gather: before + }; + const downMovement = { + point: getBottom, + adjuster: adjustDown, + move: moveDown, + gather: after$1 + }; + const isAtTable = (bridge, x, y) => { + return bridge.elementFromPoint(x, y).filter(elm => { + return name(elm) === 'table'; + }).isSome(); + }; + const adjustForTable = (bridge, movement, original, caret, numRetries) => { + return adjustTil(bridge, movement, original, movement.move(caret, JUMP_SIZE), numRetries); + }; + const adjustTil = (bridge, movement, original, caret, numRetries) => { + if (numRetries === 0) { + return Optional.some(caret); + } + if (isAtTable(bridge, caret.left, movement.point(caret))) { + return adjustForTable(bridge, movement, original, caret, numRetries - 1); + } + return bridge.situsFromPoint(caret.left, movement.point(caret)).bind(guess => { + return guess.start.fold(Optional.none, element => { + return getEntireBox(bridge, element).bind(guessBox => { + return movement.adjuster(bridge, element, guessBox, original, caret).fold(Optional.none, newCaret => { + return adjustTil(bridge, movement, original, newCaret, numRetries - 1); + }); + }).orThunk(() => { + return Optional.some(caret); + }); + }, Optional.none); + }); + }; + const checkScroll = (movement, adjusted, bridge) => { + if (movement.point(adjusted) > bridge.getInnerHeight()) { + return Optional.some(movement.point(adjusted) - bridge.getInnerHeight()); + } else if (movement.point(adjusted) < 0) { + return Optional.some(-movement.point(adjusted)); + } else { + return Optional.none(); + } + }; + const retry = (movement, bridge, caret) => { + const moved = movement.move(caret, JUMP_SIZE); + const adjusted = adjustTil(bridge, movement, caret, moved, NUM_RETRIES).getOr(moved); + return checkScroll(movement, adjusted, bridge).fold(() => { + return bridge.situsFromPoint(adjusted.left, movement.point(adjusted)); + }, delta => { + bridge.scrollBy(0, delta); + return bridge.situsFromPoint(adjusted.left, movement.point(adjusted) - delta); + }); + }; + const Retries = { + tryUp: curry(retry, upMovement), + tryDown: curry(retry, downMovement), + getJumpSize: constant(JUMP_SIZE) + }; + + const MAX_RETRIES = 20; + const findSpot = (bridge, isRoot, direction) => { + return bridge.getSelection().bind(sel => { + return tryBr(isRoot, sel.finish, sel.foffset, direction).fold(() => { + return Optional.some(point(sel.finish, sel.foffset)); + }, brNeighbour => { + const range = bridge.fromSitus(brNeighbour); + const analysis = BeforeAfter.verify(bridge, sel.finish, sel.foffset, range.finish, range.foffset, direction.failure, isRoot); + return process(analysis); + }); + }); + }; + const scan = (bridge, isRoot, element, offset, direction, numRetries) => { + if (numRetries === 0) { + return Optional.none(); + } + return tryCursor(bridge, isRoot, element, offset, direction).bind(situs => { + const range = bridge.fromSitus(situs); + const analysis = BeforeAfter.verify(bridge, element, offset, range.finish, range.foffset, direction.failure, isRoot); + return BeforeAfter.cata(analysis, () => { + return Optional.none(); + }, () => { + return Optional.some(situs); + }, cell => { + if (eq$1(element, cell) && offset === 0) { + return tryAgain(bridge, element, offset, moveUp, direction); + } else { + return scan(bridge, isRoot, cell, 0, direction, numRetries - 1); + } + }, cell => { + if (eq$1(element, cell) && offset === getEnd(cell)) { + return tryAgain(bridge, element, offset, moveDown, direction); + } else { + return scan(bridge, isRoot, cell, getEnd(cell), direction, numRetries - 1); + } + }); + }); + }; + const tryAgain = (bridge, element, offset, move, direction) => { + return getBoxAt(bridge, element, offset).bind(box => { + return tryAt(bridge, direction, move(box, Retries.getJumpSize())); + }); + }; + const tryAt = (bridge, direction, box) => { + const browser = detect$2().browser; + if (browser.isChromium() || browser.isSafari() || browser.isFirefox()) { + return direction.retry(bridge, box); + } else { + return Optional.none(); + } + }; + const tryCursor = (bridge, isRoot, element, offset, direction) => { + return getBoxAt(bridge, element, offset).bind(box => { + return tryAt(bridge, direction, box); + }); + }; + const handle$1 = (bridge, isRoot, direction) => { + return findSpot(bridge, isRoot, direction).bind(spot => { + return scan(bridge, isRoot, spot.element, spot.offset, direction, MAX_RETRIES).map(bridge.fromSitus); + }); + }; + + const inSameTable = (elem, table) => { + return ancestor(elem, e => { + return parent(e).exists(p => { + return eq$1(p, table); + }); + }); + }; + const simulate = (bridge, isRoot, direction, initial, anchor) => { + return closest$1(initial, 'td,th', isRoot).bind(start => { + return closest$1(start, 'table', isRoot).bind(table => { + if (!inSameTable(anchor, table)) { + return Optional.none(); + } + return handle$1(bridge, isRoot, direction).bind(range => { + return closest$1(range.finish, 'td,th', isRoot).map(finish => { + return { + start, + finish, + range + }; + }); + }); + }); + }); + }; + const navigate = (bridge, isRoot, direction, initial, anchor, precheck) => { + return precheck(initial, isRoot).orThunk(() => { + return simulate(bridge, isRoot, direction, initial, anchor).map(info => { + const range = info.range; + return Response.create(Optional.some(makeSitus(range.start, range.soffset, range.finish, range.foffset)), true); + }); + }); + }; + const firstUpCheck = (initial, isRoot) => { + return closest$1(initial, 'tr', isRoot).bind(startRow => { + return closest$1(startRow, 'table', isRoot).bind(table => { + const rows = descendants(table, 'tr'); + if (eq$1(startRow, rows[0])) { + return seekLeft(table, element => { + return last$1(element).isSome(); + }, isRoot).map(last => { + const lastOffset = getEnd(last); + return Response.create(Optional.some(makeSitus(last, lastOffset, last, lastOffset)), true); + }); + } else { + return Optional.none(); + } + }); + }); + }; + const lastDownCheck = (initial, isRoot) => { + return closest$1(initial, 'tr', isRoot).bind(startRow => { + return closest$1(startRow, 'table', isRoot).bind(table => { + const rows = descendants(table, 'tr'); + if (eq$1(startRow, rows[rows.length - 1])) { + return seekRight(table, element => { + return first(element).isSome(); + }, isRoot).map(first => { + return Response.create(Optional.some(makeSitus(first, 0, first, 0)), true); + }); + } else { + return Optional.none(); + } + }); + }); + }; + const select = (bridge, container, isRoot, direction, initial, anchor, selectRange) => { + return simulate(bridge, isRoot, direction, initial, anchor).bind(info => { + return detect(container, isRoot, info.start, info.finish, selectRange); + }); + }; + + const Cell = initial => { + let value = initial; + const get = () => { + return value; + }; + const set = v => { + value = v; + }; + return { + get, + set + }; + }; + + const singleton = doRevoke => { + const subject = Cell(Optional.none()); + const revoke = () => subject.get().each(doRevoke); + const clear = () => { + revoke(); + subject.set(Optional.none()); + }; + const isSet = () => subject.get().isSome(); + const get = () => subject.get(); + const set = s => { + revoke(); + subject.set(Optional.some(s)); + }; + return { + clear, + isSet, + get, + set + }; + }; + const value = () => { + const subject = singleton(noop); + const on = f => subject.get().each(f); + return { + ...subject, + on + }; + }; + + const findCell = (target, isRoot) => closest$1(target, 'td,th', isRoot); + const isInEditableContext = cell => parentElement(cell).exists(isEditable$1); + const MouseSelection = (bridge, container, isRoot, annotations) => { + const cursor = value(); + const clearstate = cursor.clear; + const applySelection = event => { + cursor.on(start => { + annotations.clearBeforeUpdate(container); + findCell(event.target, isRoot).each(finish => { + identify(start, finish, isRoot).each(cellSel => { + const boxes = cellSel.boxes.getOr([]); + if (boxes.length === 1) { + const singleCell = boxes[0]; + const isNonEditableCell = getRaw(singleCell) === 'false'; + const isCellClosestContentEditable = is(closest(event.target), singleCell, eq$1); + if (isNonEditableCell && isCellClosestContentEditable) { + annotations.selectRange(container, boxes, singleCell, singleCell); + bridge.selectContents(singleCell); + } + } else if (boxes.length > 1) { + annotations.selectRange(container, boxes, cellSel.start, cellSel.finish); + bridge.selectContents(finish); + } + }); + }); + }); + }; + const mousedown = event => { + annotations.clear(container); + findCell(event.target, isRoot).filter(isInEditableContext).each(cursor.set); + }; + const mouseover = event => { + applySelection(event); + }; + const mouseup = event => { + applySelection(event); + clearstate(); + }; + return { + clearstate, + mousedown, + mouseover, + mouseup + }; + }; + + const down = { + traverse: nextSibling, + gather: after$1, + relative: Situ.before, + retry: Retries.tryDown, + failure: BeforeAfter.failedDown + }; + const up = { + traverse: prevSibling, + gather: before, + relative: Situ.before, + retry: Retries.tryUp, + failure: BeforeAfter.failedUp + }; + + const isKey = key => { + return keycode => { + return keycode === key; + }; + }; + const isUp = isKey(38); + const isDown = isKey(40); + const isNavigation = keycode => { + return keycode >= 37 && keycode <= 40; + }; + const ltr = { + isBackward: isKey(37), + isForward: isKey(39) + }; + const rtl = { + isBackward: isKey(39), + isForward: isKey(37) + }; + + const get$3 = _DOC => { + const doc = _DOC !== undefined ? _DOC.dom : document; + const x = doc.body.scrollLeft || doc.documentElement.scrollLeft; + const y = doc.body.scrollTop || doc.documentElement.scrollTop; + return SugarPosition(x, y); + }; + const by = (x, y, _DOC) => { + const doc = _DOC !== undefined ? _DOC.dom : document; + const win = doc.defaultView; + if (win) { + win.scrollBy(x, y); + } + }; + + const adt = Adt.generate([ + { domRange: ['rng'] }, + { + relative: [ + 'startSitu', + 'finishSitu' + ] + }, + { + exact: [ + 'start', + 'soffset', + 'finish', + 'foffset' + ] + } + ]); + const exactFromRange = simRange => adt.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset); + const getStart = selection => selection.match({ + domRange: rng => SugarElement.fromDom(rng.startContainer), + relative: (startSitu, _finishSitu) => Situ.getStart(startSitu), + exact: (start, _soffset, _finish, _foffset) => start + }); + const domRange = adt.domRange; + const relative = adt.relative; + const exact = adt.exact; + const getWin = selection => { + const start = getStart(selection); + return defaultView(start); + }; + const range = SimRange.create; + const SimSelection = { + domRange, + relative, + exact, + exactFromRange, + getWin, + range + }; + + const caretPositionFromPoint = (doc, x, y) => { + var _a, _b; + return Optional.from((_b = (_a = doc.dom).caretPositionFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y)).bind(pos => { + if (pos.offsetNode === null) { + return Optional.none(); + } + const r = doc.dom.createRange(); + r.setStart(pos.offsetNode, pos.offset); + r.collapse(); + return Optional.some(r); + }); + }; + const caretRangeFromPoint = (doc, x, y) => { + var _a, _b; + return Optional.from((_b = (_a = doc.dom).caretRangeFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y)); + }; + const availableSearch = (() => { + if (document.caretPositionFromPoint) { + return caretPositionFromPoint; + } else if (document.caretRangeFromPoint) { + return caretRangeFromPoint; + } else { + return Optional.none; + } + })(); + const fromPoint = (win, x, y) => { + const doc = SugarElement.fromDom(win.document); + return availableSearch(doc, x, y).map(rng => SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset)); + }; + + const beforeSpecial = (element, offset) => { + const name$1 = name(element); + if ('input' === name$1) { + return Situ.after(element); + } else if (!contains$2([ + 'br', + 'img' + ], name$1)) { + return Situ.on(element, offset); + } else { + return offset === 0 ? Situ.before(element) : Situ.after(element); + } + }; + const preprocessRelative = (startSitu, finishSitu) => { + const start = startSitu.fold(Situ.before, beforeSpecial, Situ.after); + const finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after); + return SimSelection.relative(start, finish); + }; + const preprocessExact = (start, soffset, finish, foffset) => { + const startSitu = beforeSpecial(start, soffset); + const finishSitu = beforeSpecial(finish, foffset); + return SimSelection.relative(startSitu, finishSitu); + }; + + const makeRange = (start, soffset, finish, foffset) => { + const doc = owner(start); + const rng = doc.dom.createRange(); + rng.setStart(start.dom, soffset); + rng.setEnd(finish.dom, foffset); + return rng; + }; + const after = (start, soffset, finish, foffset) => { + const r = makeRange(start, soffset, finish, foffset); + const same = eq$1(start, finish) && soffset === foffset; + return r.collapsed && !same; + }; + + const getNativeSelection = win => Optional.from(win.getSelection()); + const doSetNativeRange = (win, rng) => { + getNativeSelection(win).each(selection => { + selection.removeAllRanges(); + selection.addRange(rng); + }); + }; + const doSetRange = (win, start, soffset, finish, foffset) => { + const rng = exactToNative(win, start, soffset, finish, foffset); + doSetNativeRange(win, rng); + }; + const setLegacyRtlRange = (win, selection, start, soffset, finish, foffset) => { + selection.collapse(start.dom, soffset); + selection.extend(finish.dom, foffset); + }; + const setRangeFromRelative = (win, relative) => diagnose(win, relative).match({ + ltr: (start, soffset, finish, foffset) => { + doSetRange(win, start, soffset, finish, foffset); + }, + rtl: (start, soffset, finish, foffset) => { + getNativeSelection(win).each(selection => { + if (selection.setBaseAndExtent) { + selection.setBaseAndExtent(start.dom, soffset, finish.dom, foffset); + } else if (selection.extend) { + try { + setLegacyRtlRange(win, selection, start, soffset, finish, foffset); + } catch (e) { + doSetRange(win, finish, foffset, start, soffset); + } + } else { + doSetRange(win, finish, foffset, start, soffset); + } + }); + } + }); + const setExact = (win, start, soffset, finish, foffset) => { + const relative = preprocessExact(start, soffset, finish, foffset); + setRangeFromRelative(win, relative); + }; + const setRelative = (win, startSitu, finishSitu) => { + const relative = preprocessRelative(startSitu, finishSitu); + setRangeFromRelative(win, relative); + }; + const readRange = selection => { + if (selection.rangeCount > 0) { + const firstRng = selection.getRangeAt(0); + const lastRng = selection.getRangeAt(selection.rangeCount - 1); + return Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset)); + } else { + return Optional.none(); + } + }; + const doGetExact = selection => { + if (selection.anchorNode === null || selection.focusNode === null) { + return readRange(selection); + } else { + const anchor = SugarElement.fromDom(selection.anchorNode); + const focus = SugarElement.fromDom(selection.focusNode); + return after(anchor, selection.anchorOffset, focus, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus, selection.focusOffset)) : readRange(selection); + } + }; + const setToElement = (win, element, selectNodeContents$1 = true) => { + const rngGetter = selectNodeContents$1 ? selectNodeContents : selectNode; + const rng = rngGetter(win, element); + doSetNativeRange(win, rng); + }; + const getExact = win => getNativeSelection(win).filter(sel => sel.rangeCount > 0).bind(doGetExact); + const get$2 = win => getExact(win).map(range => SimSelection.exact(range.start, range.soffset, range.finish, range.foffset)); + const getFirstRect = (win, selection) => { + const rng = asLtrRange(win, selection); + return getFirstRect$1(rng); + }; + const getAtPoint = (win, x, y) => fromPoint(win, x, y); + const clear = win => { + getNativeSelection(win).each(selection => selection.removeAllRanges()); + }; + + const WindowBridge = win => { + const elementFromPoint = (x, y) => { + return SugarElement.fromPoint(SugarElement.fromDom(win.document), x, y); + }; + const getRect = element => { + return element.dom.getBoundingClientRect(); + }; + const getRangedRect = (start, soffset, finish, foffset) => { + const sel = SimSelection.exact(start, soffset, finish, foffset); + return getFirstRect(win, sel); + }; + const getSelection = () => { + return get$2(win).map(exactAdt => { + return convertToRange(win, exactAdt); + }); + }; + const fromSitus = situs => { + const relative = SimSelection.relative(situs.start, situs.finish); + return convertToRange(win, relative); + }; + const situsFromPoint = (x, y) => { + return getAtPoint(win, x, y).map(exact => { + return Situs.create(exact.start, exact.soffset, exact.finish, exact.foffset); + }); + }; + const clearSelection = () => { + clear(win); + }; + const collapseSelection = (toStart = false) => { + get$2(win).each(sel => sel.fold(rng => rng.collapse(toStart), (startSitu, finishSitu) => { + const situ = toStart ? startSitu : finishSitu; + setRelative(win, situ, situ); + }, (start, soffset, finish, foffset) => { + const node = toStart ? start : finish; + const offset = toStart ? soffset : foffset; + setExact(win, node, offset, node, offset); + })); + }; + const selectNode = element => { + setToElement(win, element, false); + }; + const selectContents = element => { + setToElement(win, element); + }; + const setSelection = sel => { + setExact(win, sel.start, sel.soffset, sel.finish, sel.foffset); + }; + const setRelativeSelection = (start, finish) => { + setRelative(win, start, finish); + }; + const getInnerHeight = () => { + return win.innerHeight; + }; + const getScrollY = () => { + const pos = get$3(SugarElement.fromDom(win.document)); + return pos.top; + }; + const scrollBy = (x, y) => { + by(x, y, SugarElement.fromDom(win.document)); + }; + return { + elementFromPoint, + getRect, + getRangedRect, + getSelection, + fromSitus, + situsFromPoint, + clearSelection, + collapseSelection, + setSelection, + setRelativeSelection, + selectNode, + selectContents, + getInnerHeight, + getScrollY, + scrollBy + }; + }; + + const rc = (rows, cols) => ({ + rows, + cols + }); + const mouse = (win, container, isRoot, annotations) => { + const bridge = WindowBridge(win); + const handlers = MouseSelection(bridge, container, isRoot, annotations); + return { + clearstate: handlers.clearstate, + mousedown: handlers.mousedown, + mouseover: handlers.mouseover, + mouseup: handlers.mouseup + }; + }; + const isEditableNode = node => closest$2(node, isHTMLElement).exists(isEditable$1); + const isEditableSelection = (start, finish) => isEditableNode(start) || isEditableNode(finish); + const keyboard = (win, container, isRoot, annotations) => { + const bridge = WindowBridge(win); + const clearToNavigate = () => { + annotations.clear(container); + return Optional.none(); + }; + const keydown = (event, start, soffset, finish, foffset, direction) => { + const realEvent = event.raw; + const keycode = realEvent.which; + const shiftKey = realEvent.shiftKey === true; + const handler = retrieve$1(container, annotations.selectedSelector).fold(() => { + if (isNavigation(keycode) && !shiftKey) { + annotations.clearBeforeUpdate(container); + } + if (isNavigation(keycode) && shiftKey && !isEditableSelection(start, finish)) { + return Optional.none; + } else if (isDown(keycode) && shiftKey) { + return curry(select, bridge, container, isRoot, down, finish, start, annotations.selectRange); + } else if (isUp(keycode) && shiftKey) { + return curry(select, bridge, container, isRoot, up, finish, start, annotations.selectRange); + } else if (isDown(keycode)) { + return curry(navigate, bridge, isRoot, down, finish, start, lastDownCheck); + } else if (isUp(keycode)) { + return curry(navigate, bridge, isRoot, up, finish, start, firstUpCheck); + } else { + return Optional.none; + } + }, selected => { + const update$1 = attempts => { + return () => { + const navigation = findMap(attempts, delta => { + return update(delta.rows, delta.cols, container, selected, annotations); + }); + return navigation.fold(() => { + return getEdges(container, annotations.firstSelectedSelector, annotations.lastSelectedSelector).map(edges => { + const relative = isDown(keycode) || direction.isForward(keycode) ? Situ.after : Situ.before; + bridge.setRelativeSelection(Situ.on(edges.first, 0), relative(edges.table)); + annotations.clear(container); + return Response.create(Optional.none(), true); + }); + }, _ => { + return Optional.some(Response.create(Optional.none(), true)); + }); + }; + }; + if (isNavigation(keycode) && shiftKey && !isEditableSelection(start, finish)) { + return Optional.none; + } else if (isDown(keycode) && shiftKey) { + return update$1([rc(+1, 0)]); + } else if (isUp(keycode) && shiftKey) { + return update$1([rc(-1, 0)]); + } else if (direction.isBackward(keycode) && shiftKey) { + return update$1([ + rc(0, -1), + rc(-1, 0) + ]); + } else if (direction.isForward(keycode) && shiftKey) { + return update$1([ + rc(0, +1), + rc(+1, 0) + ]); + } else if (isNavigation(keycode) && !shiftKey) { + return clearToNavigate; + } else { + return Optional.none; + } + }); + return handler(); + }; + const keyup = (event, start, soffset, finish, foffset) => { + return retrieve$1(container, annotations.selectedSelector).fold(() => { + const realEvent = event.raw; + const keycode = realEvent.which; + const shiftKey = realEvent.shiftKey === true; + if (!shiftKey) { + return Optional.none(); + } + if (isNavigation(keycode) && isEditableSelection(start, finish)) { + return sync(container, isRoot, start, soffset, finish, foffset, annotations.selectRange); + } else { + return Optional.none(); + } + }, Optional.none); + }; + return { + keydown, + keyup + }; + }; + const external = (win, container, isRoot, annotations) => { + const bridge = WindowBridge(win); + return (start, finish) => { + annotations.clearBeforeUpdate(container); + identify(start, finish, isRoot).each(cellSel => { + const boxes = cellSel.boxes.getOr([]); + annotations.selectRange(container, boxes, cellSel.start, cellSel.finish); + bridge.selectContents(finish); + bridge.collapseSelection(); + }); + }; + }; + + const read = (element, attr) => { + const value = get$b(element, attr); + return value === undefined || value === '' ? [] : value.split(' '); + }; + const add$2 = (element, attr, id) => { + const old = read(element, attr); + const nu = old.concat([id]); + set$2(element, attr, nu.join(' ')); + return true; + }; + const remove$4 = (element, attr, id) => { + const nu = filter$2(read(element, attr), v => v !== id); + if (nu.length > 0) { + set$2(element, attr, nu.join(' ')); + } else { + remove$7(element, attr); + } + return false; + }; + + const supports = element => element.dom.classList !== undefined; + const get$1 = element => read(element, 'class'); + const add$1 = (element, clazz) => add$2(element, 'class', clazz); + const remove$3 = (element, clazz) => remove$4(element, 'class', clazz); + + const add = (element, clazz) => { + if (supports(element)) { + element.dom.classList.add(clazz); + } else { + add$1(element, clazz); + } + }; + const cleanClass = element => { + const classList = supports(element) ? element.dom.classList : get$1(element); + if (classList.length === 0) { + remove$7(element, 'class'); + } + }; + const remove$2 = (element, clazz) => { + if (supports(element)) { + const classList = element.dom.classList; + classList.remove(clazz); + } else { + remove$3(element, clazz); + } + cleanClass(element); + }; + const has = (element, clazz) => supports(element) && element.dom.classList.contains(clazz); + + const remove$1 = (element, classes) => { + each$2(classes, x => { + remove$2(element, x); + }); + }; + + const addClass = clazz => element => { + add(element, clazz); + }; + const removeClasses = classes => element => { + remove$1(element, classes); + }; + + const byClass = ephemera => { + const addSelectionClass = addClass(ephemera.selected); + const removeSelectionClasses = removeClasses([ + ephemera.selected, + ephemera.lastSelected, + ephemera.firstSelected + ]); + const clear = container => { + const sels = descendants(container, ephemera.selectedSelector); + each$2(sels, removeSelectionClasses); + }; + const selectRange = (container, cells, start, finish) => { + clear(container); + each$2(cells, addSelectionClass); + add(start, ephemera.firstSelected); + add(finish, ephemera.lastSelected); + }; + return { + clearBeforeUpdate: clear, + clear, + selectRange, + selectedSelector: ephemera.selectedSelector, + firstSelectedSelector: ephemera.firstSelectedSelector, + lastSelectedSelector: ephemera.lastSelectedSelector + }; + }; + const byAttr = (ephemera, onSelection, onClear) => { + const removeSelectionAttributes = element => { + remove$7(element, ephemera.selected); + remove$7(element, ephemera.firstSelected); + remove$7(element, ephemera.lastSelected); + }; + const addSelectionAttribute = element => { + set$2(element, ephemera.selected, '1'); + }; + const clear = container => { + clearBeforeUpdate(container); + onClear(); + }; + const clearBeforeUpdate = container => { + const sels = descendants(container, `${ ephemera.selectedSelector },${ ephemera.firstSelectedSelector },${ ephemera.lastSelectedSelector }`); + each$2(sels, removeSelectionAttributes); + }; + const selectRange = (container, cells, start, finish) => { + clear(container); + each$2(cells, addSelectionAttribute); + set$2(start, ephemera.firstSelected, '1'); + set$2(finish, ephemera.lastSelected, '1'); + onSelection(cells, start, finish); + }; + return { + clearBeforeUpdate, + clear, + selectRange, + selectedSelector: ephemera.selectedSelector, + firstSelectedSelector: ephemera.firstSelectedSelector, + lastSelectedSelector: ephemera.lastSelectedSelector + }; + }; + const SelectionAnnotation = { + byClass, + byAttr + }; + + const fold = (subject, onNone, onMultiple, onSingle) => { + switch (subject.tag) { + case 'none': + return onNone(); + case 'single': + return onSingle(subject.element); + case 'multiple': + return onMultiple(subject.elements); + } + }; + const none = () => ({ tag: 'none' }); + const multiple = elements => ({ + tag: 'multiple', + elements + }); + const single = element => ({ + tag: 'single', + element + }); + + const Selections = (lazyRoot, getStart, selectedSelector) => { + const get = () => retrieve(lazyRoot(), selectedSelector).fold(() => getStart().fold(none, single), multiple); + return { get }; + }; + + const getUpOrLeftCells = (grid, selectedCells) => { + const upGrid = grid.slice(0, selectedCells[selectedCells.length - 1].row + 1); + const upDetails = toDetailList(upGrid); + return bind$2(upDetails, detail => { + const slicedCells = detail.cells.slice(0, selectedCells[selectedCells.length - 1].column + 1); + return map$1(slicedCells, cell => cell.element); + }); + }; + const getDownOrRightCells = (grid, selectedCells) => { + const downGrid = grid.slice(selectedCells[0].row + selectedCells[0].rowspan - 1, grid.length); + const downDetails = toDetailList(downGrid); + return bind$2(downDetails, detail => { + const slicedCells = detail.cells.slice(selectedCells[0].column + selectedCells[0].colspan - 1, detail.cells.length); + return map$1(slicedCells, cell => cell.element); + }); + }; + const getOtherCells = (table, target, generators) => { + const warehouse = Warehouse.fromTable(table); + const details = onCells(warehouse, target); + return details.map(selectedCells => { + const grid = toGrid(warehouse, generators, false); + const {rows} = extractGridDetails(grid); + const upOrLeftCells = getUpOrLeftCells(rows, selectedCells); + const downOrRightCells = getDownOrRightCells(rows, selectedCells); + return { + upOrLeftCells, + downOrRightCells + }; + }); + }; + + const mkEvent = (target, x, y, stop, prevent, kill, raw) => ({ + target, + x, + y, + stop, + prevent, + kill, + raw + }); + const fromRawEvent$1 = rawEvent => { + const target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target)); + const stop = () => rawEvent.stopPropagation(); + const prevent = () => rawEvent.preventDefault(); + const kill = compose(prevent, stop); + return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); + }; + const handle = (filter, handler) => rawEvent => { + if (filter(rawEvent)) { + handler(fromRawEvent$1(rawEvent)); + } + }; + const binder = (element, event, filter, handler, useCapture) => { + const wrapped = handle(filter, handler); + element.dom.addEventListener(event, wrapped, useCapture); + return { unbind: curry(unbind, element, event, wrapped, useCapture) }; + }; + const bind$1 = (element, event, filter, handler) => binder(element, event, filter, handler, false); + const unbind = (element, event, handler, useCapture) => { + element.dom.removeEventListener(event, handler, useCapture); + }; + + const filter = always; + const bind = (element, event, handler) => bind$1(element, event, filter, handler); + const fromRawEvent = fromRawEvent$1; + + const hasInternalTarget = e => !has(SugarElement.fromDom(e.target), 'ephox-snooker-resizer-bar'); + const TableCellSelectionHandler = (editor, resizeHandler) => { + const cellSelection = Selections(() => SugarElement.fromDom(editor.getBody()), () => getSelectionCell(getSelectionStart(editor), getIsRoot(editor)), ephemera.selectedSelector); + const onSelection = (cells, start, finish) => { + const tableOpt = table(start); + tableOpt.each(table => { + const cloneFormats = getTableCloneElements(editor); + const generators = cellOperations(noop, SugarElement.fromDom(editor.getDoc()), cloneFormats); + const selectedCells = getCellsFromSelection(editor); + const otherCells = getOtherCells(table, { selection: selectedCells }, generators); + fireTableSelectionChange(editor, cells, start, finish, otherCells); + }); + }; + const onClear = () => fireTableSelectionClear(editor); + const annotations = SelectionAnnotation.byAttr(ephemera, onSelection, onClear); + editor.on('init', _e => { + const win = editor.getWin(); + const body = getBody(editor); + const isRoot = getIsRoot(editor); + const syncSelection = () => { + const sel = editor.selection; + const start = SugarElement.fromDom(sel.getStart()); + const end = SugarElement.fromDom(sel.getEnd()); + const shared = sharedOne(table, [ + start, + end + ]); + shared.fold(() => annotations.clear(body), noop); + }; + const mouseHandlers = mouse(win, body, isRoot, annotations); + const keyHandlers = keyboard(win, body, isRoot, annotations); + const external$1 = external(win, body, isRoot, annotations); + const hasShiftKey = event => event.raw.shiftKey === true; + editor.on('TableSelectorChange', e => external$1(e.start, e.finish)); + const handleResponse = (event, response) => { + if (!hasShiftKey(event)) { + return; + } + if (response.kill) { + event.kill(); + } + response.selection.each(ns => { + const relative = SimSelection.relative(ns.start, ns.finish); + const rng = asLtrRange(win, relative); + editor.selection.setRng(rng); + }); + }; + const keyup = event => { + const wrappedEvent = fromRawEvent(event); + if (wrappedEvent.raw.shiftKey && isNavigation(wrappedEvent.raw.which)) { + const rng = editor.selection.getRng(); + const start = SugarElement.fromDom(rng.startContainer); + const end = SugarElement.fromDom(rng.endContainer); + keyHandlers.keyup(wrappedEvent, start, rng.startOffset, end, rng.endOffset).each(response => { + handleResponse(wrappedEvent, response); + }); + } + }; + const keydown = event => { + const wrappedEvent = fromRawEvent(event); + resizeHandler.hide(); + const rng = editor.selection.getRng(); + const start = SugarElement.fromDom(rng.startContainer); + const end = SugarElement.fromDom(rng.endContainer); + const direction = onDirection(ltr, rtl)(SugarElement.fromDom(editor.selection.getStart())); + keyHandlers.keydown(wrappedEvent, start, rng.startOffset, end, rng.endOffset, direction).each(response => { + handleResponse(wrappedEvent, response); + }); + resizeHandler.show(); + }; + const isLeftMouse = raw => raw.button === 0; + const isLeftButtonPressed = raw => { + if (raw.buttons === undefined) { + return true; + } + return (raw.buttons & 1) !== 0; + }; + const dragStart = _e => { + mouseHandlers.clearstate(); + }; + const mouseDown = e => { + if (isLeftMouse(e) && hasInternalTarget(e)) { + mouseHandlers.mousedown(fromRawEvent(e)); + } + }; + const mouseOver = e => { + if (isLeftButtonPressed(e) && hasInternalTarget(e)) { + mouseHandlers.mouseover(fromRawEvent(e)); + } + }; + const mouseUp = e => { + if (isLeftMouse(e) && hasInternalTarget(e)) { + mouseHandlers.mouseup(fromRawEvent(e)); + } + }; + const getDoubleTap = () => { + const lastTarget = Cell(SugarElement.fromDom(body)); + const lastTimeStamp = Cell(0); + const touchEnd = t => { + const target = SugarElement.fromDom(t.target); + if (isTag('td')(target) || isTag('th')(target)) { + const lT = lastTarget.get(); + const lTS = lastTimeStamp.get(); + if (eq$1(lT, target) && t.timeStamp - lTS < 300) { + t.preventDefault(); + external$1(target, target); + } + } + lastTarget.set(target); + lastTimeStamp.set(t.timeStamp); + }; + return { touchEnd }; + }; + const doubleTap = getDoubleTap(); + editor.on('dragstart', dragStart); + editor.on('mousedown', mouseDown); + editor.on('mouseover', mouseOver); + editor.on('mouseup', mouseUp); + editor.on('touchend', doubleTap.touchEnd); + editor.on('keyup', keyup); + editor.on('keydown', keydown); + editor.on('NodeChange', syncSelection); + }); + editor.on('PreInit', () => { + editor.serializer.addTempAttr(ephemera.firstSelected); + editor.serializer.addTempAttr(ephemera.lastSelected); + }); + const clearSelectedCells = container => annotations.clear(SugarElement.fromDom(container)); + const getSelectedCells = () => fold(cellSelection.get(), constant([]), cells => { + return map$1(cells, cell => cell.dom); + }, cell => [cell.dom]); + return { + getSelectedCells, + clearSelectedCells + }; + }; + + const Event = fields => { + let handlers = []; + const bind = handler => { + if (handler === undefined) { + throw new Error('Event bind error: undefined handler'); + } + handlers.push(handler); + }; + const unbind = handler => { + handlers = filter$2(handlers, h => { + return h !== handler; + }); + }; + const trigger = (...args) => { + const event = {}; + each$2(fields, (name, i) => { + event[name] = args[i]; + }); + each$2(handlers, handler => { + handler(event); + }); + }; + return { + bind, + unbind, + trigger + }; + }; + + const create$1 = typeDefs => { + const registry = map(typeDefs, event => { + return { + bind: event.bind, + unbind: event.unbind + }; + }); + const trigger = map(typeDefs, event => { + return event.trigger; + }); + return { + registry, + trigger + }; + }; + + const last = (fn, rate) => { + let timer = null; + const cancel = () => { + if (!isNull(timer)) { + clearTimeout(timer); + timer = null; + } + }; + const throttle = (...args) => { + cancel(); + timer = setTimeout(() => { + timer = null; + fn.apply(null, args); + }, rate); + }; + return { + cancel, + throttle + }; + }; + + const sort = arr => { + return arr.slice(0).sort(); + }; + const reqMessage = (required, keys) => { + throw new Error('All required keys (' + sort(required).join(', ') + ') were not specified. Specified keys were: ' + sort(keys).join(', ') + '.'); + }; + const unsuppMessage = unsupported => { + throw new Error('Unsupported keys for object: ' + sort(unsupported).join(', ')); + }; + const validateStrArr = (label, array) => { + if (!isArray(array)) { + throw new Error('The ' + label + ' fields must be an array. Was: ' + array + '.'); + } + each$2(array, a => { + if (!isString(a)) { + throw new Error('The value ' + a + ' in the ' + label + ' fields was not a string.'); + } + }); + }; + const invalidTypeMessage = (incorrect, type) => { + throw new Error('All values need to be of type: ' + type + '. Keys (' + sort(incorrect).join(', ') + ') were not.'); + }; + const checkDupes = everything => { + const sorted = sort(everything); + const dupe = find$1(sorted, (s, i) => { + return i < sorted.length - 1 && s === sorted[i + 1]; + }); + dupe.each(d => { + throw new Error('The field: ' + d + ' occurs more than once in the combined fields: [' + sorted.join(', ') + '].'); + }); + }; + + const base = (handleUnsupported, required) => { + return baseWith(handleUnsupported, required, { + validate: isFunction, + label: 'function' + }); + }; + const baseWith = (handleUnsupported, required, pred) => { + if (required.length === 0) { + throw new Error('You must specify at least one required field.'); + } + validateStrArr('required', required); + checkDupes(required); + return obj => { + const keys$1 = keys(obj); + const allReqd = forall(required, req => { + return contains$2(keys$1, req); + }); + if (!allReqd) { + reqMessage(required, keys$1); + } + handleUnsupported(required, keys$1); + const invalidKeys = filter$2(required, key => { + return !pred.validate(obj[key], key); + }); + if (invalidKeys.length > 0) { + invalidTypeMessage(invalidKeys, pred.label); + } + return obj; + }; + }; + const handleExact = (required, keys) => { + const unsupported = filter$2(keys, key => { + return !contains$2(required, key); + }); + if (unsupported.length > 0) { + unsuppMessage(unsupported); + } + }; + const exactly = required => base(handleExact, required); + + const DragMode = exactly([ + 'compare', + 'extract', + 'mutate', + 'sink' + ]); + const DragSink = exactly([ + 'element', + 'start', + 'stop', + 'destroy' + ]); + const DragApi = exactly([ + 'forceDrop', + 'drop', + 'move', + 'delayDrop' + ]); + + const InDrag = () => { + let previous = Optional.none(); + const reset = () => { + previous = Optional.none(); + }; + const update = (mode, nu) => { + const result = previous.map(old => { + return mode.compare(old, nu); + }); + previous = Optional.some(nu); + return result; + }; + const onEvent = (event, mode) => { + const dataOption = mode.extract(event); + dataOption.each(data => { + const offset = update(mode, data); + offset.each(d => { + events.trigger.move(d); + }); + }); + }; + const events = create$1({ move: Event(['info']) }); + return { + onEvent, + reset, + events: events.registry + }; + }; + + const NoDrag = () => { + const events = create$1({ move: Event(['info']) }); + return { + onEvent: noop, + reset: noop, + events: events.registry + }; + }; + + const Movement = () => { + const noDragState = NoDrag(); + const inDragState = InDrag(); + let dragState = noDragState; + const on = () => { + dragState.reset(); + dragState = inDragState; + }; + const off = () => { + dragState.reset(); + dragState = noDragState; + }; + const onEvent = (event, mode) => { + dragState.onEvent(event, mode); + }; + const isOn = () => { + return dragState === inDragState; + }; + return { + on, + off, + isOn, + onEvent, + events: inDragState.events + }; + }; + + const setup = (mutation, mode, settings) => { + let active = false; + const events = create$1({ + start: Event([]), + stop: Event([]) + }); + const movement = Movement(); + const drop = () => { + sink.stop(); + if (movement.isOn()) { + movement.off(); + events.trigger.stop(); + } + }; + const throttledDrop = last(drop, 200); + const go = parent => { + sink.start(parent); + movement.on(); + events.trigger.start(); + }; + const mousemove = event => { + throttledDrop.cancel(); + movement.onEvent(event, mode); + }; + movement.events.move.bind(event => { + mode.mutate(mutation, event.info); + }); + const on = () => { + active = true; + }; + const off = () => { + active = false; + }; + const isActive = () => active; + const runIfActive = f => { + return (...args) => { + if (active) { + f.apply(null, args); + } + }; + }; + const sink = mode.sink(DragApi({ + forceDrop: drop, + drop: runIfActive(drop), + move: runIfActive(mousemove), + delayDrop: runIfActive(throttledDrop.throttle) + }), settings); + const destroy = () => { + sink.destroy(); + }; + return { + element: sink.element, + go, + on, + off, + isActive, + destroy, + events: events.registry + }; + }; + + const css = namespace => { + const dashNamespace = namespace.replace(/\./g, '-'); + const resolve = str => { + return dashNamespace + '-' + str; + }; + return { resolve }; + }; + + const styles$1 = css('ephox-dragster'); + const resolve$1 = styles$1.resolve; + + const Blocker = options => { + const settings = { + layerClass: resolve$1('blocker'), + ...options + }; + const div = SugarElement.fromTag('div'); + set$2(div, 'role', 'presentation'); + setAll(div, { + position: 'fixed', + left: '0px', + top: '0px', + width: '100%', + height: '100%' + }); + add(div, resolve$1('blocker')); + add(div, settings.layerClass); + const element = constant(div); + const destroy = () => { + remove$6(div); + }; + return { + element, + destroy + }; + }; + + const compare = (old, nu) => { + return SugarPosition(nu.left - old.left, nu.top - old.top); + }; + const extract = event => { + return Optional.some(SugarPosition(event.x, event.y)); + }; + const mutate = (mutation, info) => { + mutation.mutate(info.left, info.top); + }; + const sink = (dragApi, settings) => { + const blocker = Blocker(settings); + const mdown = bind(blocker.element(), 'mousedown', dragApi.forceDrop); + const mup = bind(blocker.element(), 'mouseup', dragApi.drop); + const mmove = bind(blocker.element(), 'mousemove', dragApi.move); + const mout = bind(blocker.element(), 'mouseout', dragApi.delayDrop); + const destroy = () => { + blocker.destroy(); + mup.unbind(); + mmove.unbind(); + mout.unbind(); + mdown.unbind(); + }; + const start = parent => { + append$1(parent, blocker.element()); + }; + const stop = () => { + remove$6(blocker.element()); + }; + return DragSink({ + element: blocker.element, + start, + stop, + destroy + }); + }; + var MouseDrag = DragMode({ + compare, + extract, + sink, + mutate + }); + + const transform = (mutation, settings = {}) => { + var _a; + const mode = (_a = settings.mode) !== null && _a !== void 0 ? _a : MouseDrag; + return setup(mutation, mode, settings); + }; + + const styles = css('ephox-snooker'); + const resolve = styles.resolve; + + const Mutation = () => { + const events = create$1({ + drag: Event([ + 'xDelta', + 'yDelta' + ]) + }); + const mutate = (x, y) => { + events.trigger.drag(x, y); + }; + return { + mutate, + events: events.registry + }; + }; + + const BarMutation = () => { + const events = create$1({ + drag: Event([ + 'xDelta', + 'yDelta', + 'target' + ]) + }); + let target = Optional.none(); + const delegate = Mutation(); + delegate.events.drag.bind(event => { + target.each(t => { + events.trigger.drag(event.xDelta, event.yDelta, t); + }); + }); + const assign = t => { + target = Optional.some(t); + }; + const get = () => { + return target; + }; + return { + assign, + get, + mutate: delegate.mutate, + events: events.registry + }; + }; + + const col = (column, x, y, w, h) => { + const bar = SugarElement.fromTag('div'); + setAll(bar, { + position: 'absolute', + left: x - w / 2 + 'px', + top: y + 'px', + height: h + 'px', + width: w + 'px' + }); + setAll$1(bar, { + 'data-column': column, + 'role': 'presentation' + }); + return bar; + }; + const row = (r, x, y, w, h) => { + const bar = SugarElement.fromTag('div'); + setAll(bar, { + position: 'absolute', + left: x + 'px', + top: y - h / 2 + 'px', + height: h + 'px', + width: w + 'px' + }); + setAll$1(bar, { + 'data-row': r, + 'role': 'presentation' + }); + return bar; + }; + + const resizeBar = resolve('resizer-bar'); + const resizeRowBar = resolve('resizer-rows'); + const resizeColBar = resolve('resizer-cols'); + const BAR_THICKNESS = 7; + const resizableRows = (warehouse, isResizable) => bind$2(warehouse.all, (row, i) => isResizable(row.element) ? [i] : []); + const resizableColumns = (warehouse, isResizable) => { + const resizableCols = []; + range$1(warehouse.grid.columns, index => { + const colElmOpt = Warehouse.getColumnAt(warehouse, index).map(col => col.element); + if (colElmOpt.forall(isResizable)) { + resizableCols.push(index); + } + }); + return filter$2(resizableCols, colIndex => { + const columnCells = Warehouse.filterItems(warehouse, cell => cell.column === colIndex); + return forall(columnCells, cell => isResizable(cell.element)); + }); + }; + const destroy = wire => { + const previous = descendants(wire.parent(), '.' + resizeBar); + each$2(previous, remove$6); + }; + const drawBar = (wire, positions, create) => { + const origin = wire.origin(); + each$2(positions, cpOption => { + cpOption.each(cp => { + const bar = create(origin, cp); + add(bar, resizeBar); + append$1(wire.parent(), bar); + }); + }); + }; + const refreshCol = (wire, colPositions, position, tableHeight) => { + drawBar(wire, colPositions, (origin, cp) => { + const colBar = col(cp.col, cp.x - origin.left, position.top - origin.top, BAR_THICKNESS, tableHeight); + add(colBar, resizeColBar); + return colBar; + }); + }; + const refreshRow = (wire, rowPositions, position, tableWidth) => { + drawBar(wire, rowPositions, (origin, cp) => { + const rowBar = row(cp.row, position.left - origin.left, cp.y - origin.top, tableWidth, BAR_THICKNESS); + add(rowBar, resizeRowBar); + return rowBar; + }); + }; + const refreshGrid = (warhouse, wire, table, rows, cols) => { + const position = absolute(table); + const isResizable = wire.isResizable; + const rowPositions = rows.length > 0 ? height.positions(rows, table) : []; + const resizableRowBars = rowPositions.length > 0 ? resizableRows(warhouse, isResizable) : []; + const resizableRowPositions = filter$2(rowPositions, (_pos, i) => exists(resizableRowBars, barIndex => i === barIndex)); + refreshRow(wire, resizableRowPositions, position, getOuter$2(table)); + const colPositions = cols.length > 0 ? width.positions(cols, table) : []; + const resizableColBars = colPositions.length > 0 ? resizableColumns(warhouse, isResizable) : []; + const resizableColPositions = filter$2(colPositions, (_pos, i) => exists(resizableColBars, barIndex => i === barIndex)); + refreshCol(wire, resizableColPositions, position, getOuter$1(table)); + }; + const refresh = (wire, table) => { + destroy(wire); + if (wire.isResizable(table)) { + const warehouse = Warehouse.fromTable(table); + const rows$1 = rows(warehouse); + const cols = columns(warehouse); + refreshGrid(warehouse, wire, table, rows$1, cols); + } + }; + const each = (wire, f) => { + const bars = descendants(wire.parent(), '.' + resizeBar); + each$2(bars, f); + }; + const hide = wire => { + each(wire, bar => { + set$1(bar, 'display', 'none'); + }); + }; + const show = wire => { + each(wire, bar => { + set$1(bar, 'display', 'block'); + }); + }; + const isRowBar = element => { + return has(element, resizeRowBar); + }; + const isColBar = element => { + return has(element, resizeColBar); + }; + + const resizeBarDragging = resolve('resizer-bar-dragging'); + const BarManager = wire => { + const mutation = BarMutation(); + const resizing = transform(mutation, {}); + let hoverTable = Optional.none(); + const getResizer = (element, type) => { + return Optional.from(get$b(element, type)); + }; + mutation.events.drag.bind(event => { + getResizer(event.target, 'data-row').each(_dataRow => { + const currentRow = getCssValue(event.target, 'top'); + set$1(event.target, 'top', currentRow + event.yDelta + 'px'); + }); + getResizer(event.target, 'data-column').each(_dataCol => { + const currentCol = getCssValue(event.target, 'left'); + set$1(event.target, 'left', currentCol + event.xDelta + 'px'); + }); + }); + const getDelta = (target, dir) => { + const newX = getCssValue(target, dir); + const oldX = getAttrValue(target, 'data-initial-' + dir, 0); + return newX - oldX; + }; + resizing.events.stop.bind(() => { + mutation.get().each(target => { + hoverTable.each(table => { + getResizer(target, 'data-row').each(row => { + const delta = getDelta(target, 'top'); + remove$7(target, 'data-initial-top'); + events.trigger.adjustHeight(table, delta, parseInt(row, 10)); + }); + getResizer(target, 'data-column').each(column => { + const delta = getDelta(target, 'left'); + remove$7(target, 'data-initial-left'); + events.trigger.adjustWidth(table, delta, parseInt(column, 10)); + }); + refresh(wire, table); + }); + }); + }); + const handler = (target, dir) => { + events.trigger.startAdjust(); + mutation.assign(target); + set$2(target, 'data-initial-' + dir, getCssValue(target, dir)); + add(target, resizeBarDragging); + set$1(target, 'opacity', '0.2'); + resizing.go(wire.parent()); + }; + const mousedown = bind(wire.parent(), 'mousedown', event => { + if (isRowBar(event.target)) { + handler(event.target, 'top'); + } + if (isColBar(event.target)) { + handler(event.target, 'left'); + } + }); + const isRoot = e => { + return eq$1(e, wire.view()); + }; + const findClosestEditableTable = target => closest$1(target, 'table', isRoot).filter(isEditable$1); + const mouseover = bind(wire.view(), 'mouseover', event => { + findClosestEditableTable(event.target).fold(() => { + if (inBody(event.target)) { + destroy(wire); + } + }, table => { + if (resizing.isActive()) { + hoverTable = Optional.some(table); + refresh(wire, table); + } + }); + }); + const destroy$1 = () => { + mousedown.unbind(); + mouseover.unbind(); + resizing.destroy(); + destroy(wire); + }; + const refresh$1 = tbl => { + refresh(wire, tbl); + }; + const events = create$1({ + adjustHeight: Event([ + 'table', + 'delta', + 'row' + ]), + adjustWidth: Event([ + 'table', + 'delta', + 'column' + ]), + startAdjust: Event([]) + }); + return { + destroy: destroy$1, + refresh: refresh$1, + on: resizing.on, + off: resizing.off, + hideBars: curry(hide, wire), + showBars: curry(show, wire), + events: events.registry + }; + }; + + const create = (wire, resizing, lazySizing) => { + const hdirection = height; + const vdirection = width; + const manager = BarManager(wire); + const events = create$1({ + beforeResize: Event([ + 'table', + 'type' + ]), + afterResize: Event([ + 'table', + 'type' + ]), + startDrag: Event([]) + }); + manager.events.adjustHeight.bind(event => { + const table = event.table; + events.trigger.beforeResize(table, 'row'); + const delta = hdirection.delta(event.delta, table); + adjustHeight(table, delta, event.row, hdirection); + events.trigger.afterResize(table, 'row'); + }); + manager.events.startAdjust.bind(_event => { + events.trigger.startDrag(); + }); + manager.events.adjustWidth.bind(event => { + const table = event.table; + events.trigger.beforeResize(table, 'col'); + const delta = vdirection.delta(event.delta, table); + const tableSize = lazySizing(table); + adjustWidth(table, delta, event.column, resizing, tableSize); + events.trigger.afterResize(table, 'col'); + }); + return { + on: manager.on, + off: manager.off, + refreshBars: manager.refresh, + hideBars: manager.hideBars, + showBars: manager.showBars, + destroy: manager.destroy, + events: events.registry + }; + }; + const TableResize = { create }; + + const only = (element, isResizable) => { + const parent = isDocument(element) ? documentElement(element) : element; + return { + parent: constant(parent), + view: constant(element), + origin: constant(SugarPosition(0, 0)), + isResizable + }; + }; + const detached = (editable, chrome, isResizable) => { + const origin = () => absolute(chrome); + return { + parent: constant(chrome), + view: constant(editable), + origin, + isResizable + }; + }; + const body = (editable, chrome, isResizable) => { + return { + parent: constant(chrome), + view: constant(editable), + origin: constant(SugarPosition(0, 0)), + isResizable + }; + }; + const ResizeWire = { + only, + detached, + body + }; + + const createContainer = () => { + const container = SugarElement.fromTag('div'); + setAll(container, { + position: 'static', + height: '0', + width: '0', + padding: '0', + margin: '0', + border: '0' + }); + append$1(body$1(), container); + return container; + }; + const get = (editor, isResizable) => { + return editor.inline ? ResizeWire.body(SugarElement.fromDom(editor.getBody()), createContainer(), isResizable) : ResizeWire.only(SugarElement.fromDom(editor.getDoc()), isResizable); + }; + const remove = (editor, wire) => { + if (editor.inline) { + remove$6(wire.parent()); + } + }; + + const isTable = node => isNonNullable(node) && node.nodeName === 'TABLE'; + const barResizerPrefix = 'bar-'; + const isResizable = elm => get$b(elm, 'data-mce-resize') !== 'false'; + const syncPixels = table => { + const warehouse = Warehouse.fromTable(table); + if (!Warehouse.hasColumns(warehouse)) { + each$2(cells$1(table), cell => { + const computedWidth = get$a(cell, 'width'); + set$1(cell, 'width', computedWidth); + remove$7(cell, 'width'); + }); + } + }; + const TableResizeHandler = editor => { + const selectionRng = value(); + const tableResize = value(); + const resizeWire = value(); + let startW; + let startRawW; + const lazySizing = table => get$5(editor, table); + const lazyResizingBehaviour = () => isPreserveTableColumnResizing(editor) ? preserveTable() : resizeTable(); + const getNumColumns = table => getGridSize(table).columns; + const afterCornerResize = (table, origin, width) => { + const isRightEdgeResize = endsWith(origin, 'e'); + if (startRawW === '') { + convertToPercentSize(table); + } + if (width !== startW && startRawW !== '') { + set$1(table, 'width', startRawW); + const resizing = lazyResizingBehaviour(); + const tableSize = lazySizing(table); + const col = isPreserveTableColumnResizing(editor) || isRightEdgeResize ? getNumColumns(table) - 1 : 0; + adjustWidth(table, width - startW, col, resizing, tableSize); + } else if (isPercentage$1(startRawW)) { + const percentW = parseFloat(startRawW.replace('%', '')); + const targetPercentW = width * percentW / startW; + set$1(table, 'width', targetPercentW + '%'); + } + if (isPixel(startRawW)) { + syncPixels(table); + } + }; + const destroy = () => { + tableResize.on(sz => { + sz.destroy(); + }); + resizeWire.on(w => { + remove(editor, w); + }); + }; + editor.on('init', () => { + const rawWire = get(editor, isResizable); + resizeWire.set(rawWire); + if (hasTableObjectResizing(editor) && hasTableResizeBars(editor)) { + const resizing = lazyResizingBehaviour(); + const sz = TableResize.create(rawWire, resizing, lazySizing); + sz.on(); + sz.events.startDrag.bind(_event => { + selectionRng.set(editor.selection.getRng()); + }); + sz.events.beforeResize.bind(event => { + const rawTable = event.table.dom; + fireObjectResizeStart(editor, rawTable, getPixelWidth(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type); + }); + sz.events.afterResize.bind(event => { + const table = event.table; + const rawTable = table.dom; + removeDataStyle(table); + selectionRng.on(rng => { + editor.selection.setRng(rng); + editor.focus(); + }); + fireObjectResized(editor, rawTable, getPixelWidth(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type); + editor.undoManager.add(); + }); + tableResize.set(sz); + } + }); + editor.on('ObjectResizeStart', e => { + const targetElm = e.target; + if (isTable(targetElm)) { + const table = SugarElement.fromDom(targetElm); + each$2(editor.dom.select('.mce-clonedresizable'), clone => { + editor.dom.addClass(clone, 'mce-' + getTableColumnResizingBehaviour(editor) + '-columns'); + }); + if (!isPixelSizing(table) && isTablePixelsForced(editor)) { + convertToPixelSize(table); + } else if (!isPercentSizing(table) && isTablePercentagesForced(editor)) { + convertToPercentSize(table); + } + if (isNoneSizing(table) && startsWith(e.origin, barResizerPrefix)) { + convertToPercentSize(table); + } + startW = e.width; + startRawW = isTableResponsiveForced(editor) ? '' : getRawWidth(editor, targetElm).getOr(''); + } + }); + editor.on('ObjectResized', e => { + const targetElm = e.target; + if (isTable(targetElm)) { + const table = SugarElement.fromDom(targetElm); + const origin = e.origin; + if (startsWith(origin, 'corner-')) { + afterCornerResize(table, origin, e.width); + } + removeDataStyle(table); + fireTableModified(editor, table.dom, styleModified); + } + }); + editor.on('SwitchMode', () => { + tableResize.on(resize => { + if (editor.mode.isReadOnly()) { + resize.hideBars(); + } else { + resize.showBars(); + } + }); + }); + editor.on('dragstart dragend', e => { + tableResize.on(resize => { + if (e.type === 'dragstart') { + resize.hideBars(); + resize.off(); + } else { + resize.on(); + resize.showBars(); + } + }); + }); + editor.on('remove', () => { + destroy(); + }); + const refresh = table => { + tableResize.on(resize => resize.refreshBars(SugarElement.fromDom(table))); + }; + const hide = () => { + tableResize.on(resize => resize.hideBars()); + }; + const show = () => { + tableResize.on(resize => resize.showBars()); + }; + return { + refresh, + hide, + show + }; + }; + + const setupTable = editor => { + register(editor); + const resizeHandler = TableResizeHandler(editor); + const cellSelectionHandler = TableCellSelectionHandler(editor, resizeHandler); + const actions = TableActions(editor, resizeHandler, cellSelectionHandler); + registerCommands(editor, actions); + registerQueryCommands(editor, actions); + registerEvents(editor, actions); + return { + getSelectedCells: cellSelectionHandler.getSelectedCells, + clearSelectedCells: cellSelectionHandler.clearSelectedCells + }; + }; + + const DomModel = editor => { + const table = setupTable(editor); + return { table }; + }; + var Model = () => { + global$1.add('dom', DomModel); + }; + + Model(); + +})(); diff --git a/public/js/tinymce/models/dom/model.min.js b/public/js/tinymce/models/dom/model.min.js new file mode 100644 index 000000000..8065e3eaa --- /dev/null +++ b/public/js/tinymce/models/dom/model.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.5.1 (2023-06-19) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.ModelManager");const t=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=n=e,(r=String).prototype.isPrototypeOf(o)||(null===(s=n.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var o,n,r,s})(t)===e,o=e=>t=>typeof t===e,n=e=>t=>e===t,r=t("string"),s=t("object"),l=t("array"),a=n(null),c=o("boolean"),i=n(void 0),m=e=>!(e=>null==e)(e),d=o("function"),u=o("number"),f=()=>{},g=e=>()=>e,h=e=>e,p=(e,t)=>e===t;function w(e,...t){return(...o)=>{const n=t.concat(o);return e.apply(null,n)}}const b=e=>t=>!e(t),v=e=>e(),y=g(!1),x=g(!0);class C{constructor(e,t){this.tag=e,this.value=t}static some(e){return new C(!0,e)}static none(){return C.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?C.some(e(this.value)):C.none()}bind(e){return this.tag?e(this.value):C.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:C.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return m(e)?C.some(e):C.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}C.singletonNone=new C(!1);const S=Array.prototype.slice,T=Array.prototype.indexOf,R=Array.prototype.push,D=(e,t)=>{return o=e,n=t,T.call(o,n)>-1;var o,n},O=(e,t)=>{for(let o=0,n=e.length;o{const o=[];for(let n=0;n{const o=e.length,n=new Array(o);for(let r=0;r{for(let o=0,n=e.length;o{const o=[],n=[];for(let r=0,s=e.length;r{const o=[];for(let n=0,r=e.length;n(((e,t)=>{for(let o=e.length-1;o>=0;o--)t(e[o],o)})(e,((e,n)=>{o=t(o,e,n)})),o),A=(e,t,o)=>(N(e,((e,n)=>{o=t(o,e,n)})),o),L=(e,t)=>((e,t,o)=>{for(let n=0,r=e.length;n{for(let o=0,n=e.length;o{const t=[];for(let o=0,n=e.length;oM(E(e,t)),P=(e,t)=>{for(let o=0,n=e.length;o{const o={};for(let n=0,r=e.length;nt>=0&&tF(e,0),$=e=>F(e,e.length-1),V=(e,t)=>{for(let o=0;o{const o=q(e);for(let n=0,r=o.length;nY(e,((e,o)=>({k:o,v:t(e,o)}))),Y=(e,t)=>{const o={};return G(e,((e,n)=>{const r=t(e,n);o[r.k]=r.v})),o},J=(e,t)=>{const o=[];return G(e,((e,n)=>{o.push(t(e,n))})),o},Q=e=>J(e,h),X=(e,t)=>U.call(e,t),Z="undefined"!=typeof window?window:Function("return this;")(),ee=(e,t)=>((e,t)=>{let o=null!=t?t:Z;for(let t=0;t{const t=ee("ownerDocument.defaultView",e);return s(e)&&((e=>((e,t)=>{const o=((e,t)=>ee(e,t))(e,t);if(null==o)throw new Error(e+" not available on this browser");return o})("HTMLElement",e))(t).prototype.isPrototypeOf(e)||/^HTML\w*Element$/.test(te(e).constructor.name))},ne=e=>e.dom.nodeName.toLowerCase(),re=e=>e.dom.nodeType,se=e=>t=>re(t)===e,le=e=>8===re(e)||"#comment"===ne(e),ae=e=>ce(e)&&oe(e.dom),ce=se(1),ie=se(3),me=se(9),de=se(11),ue=e=>t=>ce(t)&&ne(t)===e,fe=(e,t,o)=>{if(!(r(o)||c(o)||u(o)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",o,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,o+"")},ge=(e,t,o)=>{fe(e.dom,t,o)},he=(e,t)=>{const o=e.dom;G(t,((e,t)=>{fe(o,t,e)}))},pe=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},we=(e,t)=>C.from(pe(e,t)),be=(e,t)=>{e.dom.removeAttribute(t)},ve=e=>A(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}),ye=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},xe={fromHtml:(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return ye(o.childNodes[0])},fromTag:(e,t)=>{const o=(t||document).createElement(e);return ye(o)},fromText:(e,t)=>{const o=(t||document).createTextNode(e);return ye(o)},fromDom:ye,fromPoint:(e,t,o)=>C.from(e.dom.elementFromPoint(t,o)).map(ye)},Ce=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},Se=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,Te=(e,t)=>{const o=void 0===t?document:t.dom;return Se(o)?C.none():C.from(o.querySelector(e)).map(xe.fromDom)},Re=(e,t)=>e.dom===t.dom,De=(e,t)=>{const o=e.dom,n=t.dom;return o!==n&&o.contains(n)},Oe=Ce,ke=e=>xe.fromDom(e.dom.ownerDocument),Ee=e=>me(e)?e:ke(e),Ne=e=>C.from(e.dom.parentNode).map(xe.fromDom),Be=e=>C.from(e.dom.parentElement).map(xe.fromDom),_e=(e,t)=>{const o=d(t)?t:y;let n=e.dom;const r=[];for(;null!==n.parentNode&&void 0!==n.parentNode;){const e=n.parentNode,t=xe.fromDom(e);if(r.push(t),!0===o(t))break;n=e}return r},ze=e=>C.from(e.dom.previousSibling).map(xe.fromDom),Ae=e=>C.from(e.dom.nextSibling).map(xe.fromDom),Le=e=>E(e.dom.childNodes,xe.fromDom),We=(e,t)=>{const o=e.dom.childNodes;return C.from(o[t]).map(xe.fromDom)},Me=(e,t)=>{Ne(e).each((o=>{o.dom.insertBefore(t.dom,e.dom)}))},je=(e,t)=>{Ae(e).fold((()=>{Ne(e).each((e=>{Ie(e,t)}))}),(e=>{Me(e,t)}))},Pe=(e,t)=>{const o=(e=>We(e,0))(e);o.fold((()=>{Ie(e,t)}),(o=>{e.dom.insertBefore(t.dom,o.dom)}))},Ie=(e,t)=>{e.dom.appendChild(t.dom)},Fe=(e,t)=>{Me(e,t),Ie(t,e)},He=(e,t)=>{N(t,((o,n)=>{const r=0===n?e:t[n-1];je(r,o)}))},$e=(e,t)=>{N(t,(t=>{Ie(e,t)}))},Ve=e=>{e.dom.textContent="",N(Le(e),(e=>{qe(e)}))},qe=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},Ue=e=>{const t=Le(e);t.length>0&&He(e,t),qe(e)},Ge=(e,t)=>xe.fromDom(e.dom.cloneNode(t)),Ke=e=>Ge(e,!1),Ye=e=>Ge(e,!0),Je=(e,t)=>{const o=xe.fromTag(t),n=ve(e);return he(o,n),o},Qe=["tfoot","thead","tbody","colgroup"],Xe=(e,t,o)=>({element:e,rowspan:t,colspan:o}),Ze=(e,t,o)=>({element:e,cells:t,section:o}),et=(e,t,o)=>({element:e,isNew:t,isLocked:o}),tt=(e,t,o,n)=>({element:e,cells:t,section:o,isNew:n}),ot=d(Element.prototype.attachShadow)&&d(Node.prototype.getRootNode),nt=g(ot),rt=ot?e=>xe.fromDom(e.dom.getRootNode()):Ee,st=e=>xe.fromDom(e.dom.host),lt=e=>{const t=ie(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return(e=>{const t=rt(e);return de(o=t)&&m(o.dom.host)?C.some(t):C.none();var o})(xe.fromDom(t)).fold((()=>o.body.contains(t)),(n=lt,r=st,e=>n(r(e))));var n,r},at=e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return xe.fromDom(t)},ct=(e,t)=>{let o=[];return N(Le(e),(e=>{t(e)&&(o=o.concat([e])),o=o.concat(ct(e,t))})),o},it=(e,t,o)=>((e,o,n)=>_(_e(e,n),(e=>Ce(e,t))))(e,0,o),mt=(e,t)=>((e,o)=>_(Le(e),(e=>Ce(e,t))))(e),dt=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return Se(o)?[]:E(o.querySelectorAll(e),xe.fromDom)})(t,e);var ut=(e,t,o,n,r)=>e(o,n)?C.some(o):d(r)&&r(o)?C.none():t(o,n,r);const ft=(e,t,o)=>{let n=e.dom;const r=d(o)?o:y;for(;n.parentNode;){n=n.parentNode;const e=xe.fromDom(n);if(t(e))return C.some(e);if(r(e))break}return C.none()},gt=(e,t,o)=>ut(((e,t)=>t(e)),ft,e,t,o),ht=(e,t,o)=>ft(e,(e=>Ce(e,t)),o),pt=(e,t)=>((e,o)=>L(e.dom.childNodes,(e=>{return o=xe.fromDom(e),Ce(o,t);var o})).map(xe.fromDom))(e),wt=(e,t)=>Te(t,e),bt=(e,t,o)=>ut(((e,t)=>Ce(e,t)),ht,e,t,o),vt=(e,t,o=p)=>e.exists((e=>o(e,t))),yt=e=>{const t=[],o=e=>{t.push(e)};for(let t=0;te?C.some(t):C.none(),Ct=(e,t,o)=>""===t||e.length>=t.length&&e.substr(o,o+t.length)===t,St=(e,t,o=0,n)=>{const r=e.indexOf(t,o);return-1!==r&&(!!i(n)||r+t.length<=n)},Tt=(e,t)=>Ct(e,t,0),Rt=(e,t)=>Ct(e,t,e.length-t.length),Dt=(e=>t=>t.replace(e,""))(/^\s+|\s+$/g),Ot=e=>e.length>0,kt=e=>void 0!==e.style&&d(e.style.getPropertyValue),Et=(e,t,o)=>{if(!r(o))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",o,":: Element ",e),new Error("CSS value must be a string: "+o);kt(e)&&e.style.setProperty(t,o)},Nt=(e,t,o)=>{const n=e.dom;Et(n,t,o)},Bt=(e,t)=>{const o=e.dom;G(t,((e,t)=>{Et(o,t,e)}))},_t=(e,t)=>{const o=e.dom,n=window.getComputedStyle(o).getPropertyValue(t);return""!==n||lt(e)?n:zt(o,t)},zt=(e,t)=>kt(e)?e.style.getPropertyValue(t):"",At=(e,t)=>{const o=e.dom,n=zt(o,t);return C.from(n).filter((e=>e.length>0))},Lt=(e,t)=>{((e,t)=>{kt(e)&&e.style.removeProperty(t)})(e.dom,t),vt(we(e,"style").map(Dt),"")&&be(e,"style")},Wt=(e,t,o=0)=>we(e,t).map((e=>parseInt(e,10))).getOr(o),Mt=(e,t)=>Wt(e,t,1),jt=e=>ue("col")(e)?Wt(e,"span",1)>1:Mt(e,"colspan")>1,Pt=e=>Mt(e,"rowspan")>1,It=(e,t)=>parseInt(_t(e,t),10),Ft=g(10),Ht=g(10),$t=(e,t)=>Vt(e,t,x),Vt=(e,t,o)=>j(Le(e),(e=>Ce(e,t)?o(e)?[e]:[]:Vt(e,t,o))),qt=(e,t)=>((e,t,o=y)=>o(t)?C.none():D(e,ne(t))?C.some(t):ht(t,e.join(","),(e=>Ce(e,"table")||o(e))))(["td","th"],e,t),Ut=e=>$t(e,"th,td"),Gt=e=>Ce(e,"colgroup")?mt(e,"col"):j(Jt(e),(e=>mt(e,"col"))),Kt=(e,t)=>bt(e,"table",t),Yt=e=>$t(e,"tr"),Jt=e=>Kt(e).fold(g([]),(e=>mt(e,"colgroup"))),Qt=(e,t)=>E(e,(e=>{if("colgroup"===ne(e)){const t=E(Gt(e),(e=>{const t=Wt(e,"span",1);return Xe(e,1,t)}));return Ze(e,t,"colgroup")}{const o=E(Ut(e),(e=>{const t=Wt(e,"rowspan",1),o=Wt(e,"colspan",1);return Xe(e,t,o)}));return Ze(e,o,t(e))}})),Xt=e=>Ne(e).map((e=>{const t=ne(e);return(e=>D(Qe,e))(t)?t:"tbody"})).getOr("tbody"),Zt=e=>{const t=Yt(e),o=[...Jt(e),...t];return Qt(o,Xt)},eo=e=>{let t,o=!1;return(...n)=>(o||(o=!0,t=e.apply(null,n)),t)},to=()=>oo(0,0),oo=(e,t)=>({major:e,minor:t}),no={nu:oo,detect:(e,t)=>{const o=String(t).toLowerCase();return 0===e.length?to():((e,t)=>{const o=((e,t)=>{for(let o=0;oNumber(t.replace(o,"$"+e));return oo(n(1),n(2))})(e,o)},unknown:to},ro=(e,t)=>{const o=String(t).toLowerCase();return L(e,(e=>e.search(o)))},so=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,lo=e=>t=>St(t,e),ao=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>St(e,"edge/")&&St(e,"chrome")&&St(e,"safari")&&St(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,so],search:e=>St(e,"chrome")&&!St(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>St(e,"msie")||St(e,"trident")},{name:"Opera",versionRegexes:[so,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:lo("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:lo("firefox")},{name:"Safari",versionRegexes:[so,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(St(e,"safari")||St(e,"mobile/"))&&St(e,"applewebkit")}],co=[{name:"Windows",search:lo("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>St(e,"iphone")||St(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:lo("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:lo("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:lo("linux"),versionRegexes:[]},{name:"Solaris",search:lo("sunos"),versionRegexes:[]},{name:"FreeBSD",search:lo("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:lo("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],io={browsers:g(ao),oses:g(co)},mo="Edge",uo="Chromium",fo="Opera",go="Firefox",ho="Safari",po=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isEdge:n(mo),isChromium:n(uo),isIE:n("IE"),isOpera:n(fo),isFirefox:n(go),isSafari:n(ho)}},wo=()=>po({current:void 0,version:no.unknown()}),bo=po,vo=(g(mo),g(uo),g("IE"),g(fo),g(go),g(ho),"Windows"),yo="Android",xo="Linux",Co="macOS",So="Solaris",To="FreeBSD",Ro="ChromeOS",Do=e=>{const t=e.current,o=e.version,n=e=>()=>t===e;return{current:t,version:o,isWindows:n(vo),isiOS:n("iOS"),isAndroid:n(yo),isMacOS:n(Co),isLinux:n(xo),isSolaris:n(So),isFreeBSD:n(To),isChromeOS:n(Ro)}},Oo=()=>Do({current:void 0,version:no.unknown()}),ko=Do,Eo=(g(vo),g("iOS"),g(yo),g(xo),g(Co),g(So),g(To),g(Ro),e=>window.matchMedia(e).matches);let No=eo((()=>((e,t,o)=>{const n=io.browsers(),r=io.oses(),s=t.bind((e=>((e,t)=>V(t.brands,(t=>{const o=t.brand.toLowerCase();return L(e,(e=>{var t;return o===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:no.nu(parseInt(t.version,10),0)})))})))(n,e))).orThunk((()=>((e,t)=>ro(e,t).map((e=>{const o=no.detect(e.versionRegexes,t);return{current:e.name,version:o}})))(n,e))).fold(wo,bo),l=((e,t)=>ro(e,t).map((e=>{const o=no.detect(e.versionRegexes,t);return{current:e.name,version:o}})))(r,e).fold(Oo,ko),a=((e,t,o,n)=>{const r=e.isiOS()&&!0===/ipad/i.test(o),s=e.isiOS()&&!r,l=e.isiOS()||e.isAndroid(),a=l||n("(pointer:coarse)"),c=r||!s&&l&&n("(min-device-width:768px)"),i=s||l&&!c,m=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(o),d=!i&&!c&&!m;return{isiPad:g(r),isiPhone:g(s),isTablet:g(c),isPhone:g(i),isTouch:g(a),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:g(m),isDesktop:g(d)}})(l,s,e,o);return{browser:s,os:l,deviceType:a}})(navigator.userAgent,C.from(navigator.userAgentData),Eo)));const Bo=()=>No(),_o=(e,t)=>{const o=o=>{const n=t(o);if(n<=0||null===n){const t=_t(o,e);return parseFloat(t)||0}return n},n=(e,t)=>A(t,((t,o)=>{const n=_t(e,o),r=void 0===n?0:parseInt(n,10);return isNaN(r)?t:t+r}),0);return{set:(t,o)=>{if(!u(o)&&!o.match(/^[0-9]+$/))throw new Error(e+".set accepts only positive integer values. Value was "+o);const n=t.dom;kt(n)&&(n.style[e]=o+"px")},get:o,getOuter:o,aggregate:n,max:(e,t,o)=>{const r=n(e,o);return t>r?t-r:0}}},zo=(e,t,o)=>((e,t)=>(e=>{const t=parseFloat(e);return isNaN(t)?C.none():C.some(t)})(e).getOr(t))(_t(e,t),o),Ao=_o("width",(e=>e.dom.offsetWidth)),Lo=e=>Ao.get(e),Wo=e=>Ao.getOuter(e),Mo=e=>((e,t)=>{const o=e.dom,n=o.getBoundingClientRect().width||o.offsetWidth;return"border-box"===t?n:((e,t,o,n)=>t-zo(e,`padding-${o}`,0)-zo(e,`padding-${n}`,0)-zo(e,`border-${o}-width`,0)-zo(e,`border-${n}-width`,0))(e,n,"left","right")})(e,"content-box"),jo=(e,t,o)=>{const n=e.cells,r=n.slice(0,t),s=n.slice(t),l=r.concat(o).concat(s);return Fo(e,l)},Po=(e,t,o)=>jo(e,t,[o]),Io=(e,t,o)=>{e.cells[t]=o},Fo=(e,t)=>tt(e.element,t,e.section,e.isNew),Ho=(e,t)=>e.cells[t],$o=(e,t)=>Ho(e,t).element,Vo=e=>e.cells.length,qo=e=>{const t=B(e,(e=>"colgroup"===e.section));return{rows:t.fail,cols:t.pass}},Uo=(e,t,o)=>{const n=E(e.cells,o);return tt(t(e.element),n,e.section,!0)},Go="data-snooker-locked-cols",Ko=e=>we(e,Go).bind((e=>C.from(e.match(/\d+/g)))).map((e=>I(e,x))),Yo=e=>{const t=A(qo(e).rows,((e,t)=>(N(t.cells,((t,o)=>{t.isLocked&&(e[o]=!0)})),e)),{}),o=J(t,((e,t)=>parseInt(t,10)));return((e,t)=>{const o=S.call(e,0);return o.sort(void 0),o})(o)},Jo=(e,t)=>e+","+t,Qo=(e,t)=>{const o=j(e.all,(e=>e.cells));return _(o,t)},Xo=e=>{const t={},o=[],n=H(e).map((e=>e.element)).bind(Kt).bind(Ko).getOr({});let r=0,s=0,l=0;const{pass:a,fail:c}=B(e,(e=>"colgroup"===e.section));N(c,(e=>{const a=[];N(e.cells,(e=>{let o=0;for(;void 0!==t[Jo(l,o)];)o++;const r=((e,t)=>X(e,t)&&void 0!==e[t]&&null!==e[t])(n,o.toString()),c=((e,t,o,n,r,s)=>({element:e,rowspan:t,colspan:o,row:n,column:r,isLocked:s}))(e.element,e.rowspan,e.colspan,l,o,r);for(let n=0;n{const t=(e=>{const t={};let o=0;return N(e.cells,(e=>{const n=e.colspan;k(n,(r=>{const s=o+r;t[s]=((e,t,o)=>({element:e,colspan:t,column:o}))(e.element,n,s)})),o+=n})),t})(e),o=((e,t)=>({element:e,columns:t}))(e.element,Q(t));return{colgroups:[o],columns:t}})).getOrThunk((()=>({colgroups:[],columns:{}}))),d=((e,t)=>({rows:e,columns:t}))(r,s);return{grid:d,access:t,all:o,columns:i,colgroups:m}},Zo=e=>{const t=Zt(e);return Xo(t)},en=Xo,tn=(e,t,o)=>C.from(e.access[Jo(t,o)]),on=(e,t,o)=>{const n=Qo(e,(e=>o(t,e.element)));return n.length>0?C.some(n[0]):C.none()},nn=Qo,rn=e=>j(e.all,(e=>e.cells)),sn=e=>Q(e.columns),ln=e=>q(e.columns).length>0,an=(e,t)=>C.from(e.columns[t]),cn=(e,t=x)=>{const o=e.grid,n=k(o.columns,h),r=k(o.rows,h);return E(n,(o=>mn((()=>j(r,(t=>tn(e,t,o).filter((e=>e.column===o)).toArray()))),(e=>1===e.colspan&&t(e.element)),(()=>tn(e,0,o)))))},mn=(e,t,o)=>{const n=e();return L(n,t).orThunk((()=>C.from(n[0]).orThunk(o))).map((e=>e.element))},dn=e=>{const t=e.grid,o=k(t.rows,h),n=k(t.columns,h);return E(o,(t=>mn((()=>j(n,(o=>tn(e,t,o).filter((e=>e.row===t)).fold(g([]),(e=>[e]))))),(e=>1===e.rowspan),(()=>tn(e,t,0)))))},un=(e,t)=>o=>"rtl"===fn(o)?t:e,fn=e=>"rtl"===_t(e,"direction")?"rtl":"ltr",gn=_o("height",(e=>{const t=e.dom;return lt(e)?t.getBoundingClientRect().height:t.offsetHeight})),hn=e=>gn.get(e),pn=e=>gn.getOuter(e),wn=(e,t)=>({left:e,top:t,translate:(o,n)=>wn(e+o,t+n)}),bn=wn,vn=(e,t)=>void 0!==e?e:void 0!==t?t:0,yn=e=>{const t=e.dom.ownerDocument,o=t.body,n=t.defaultView,r=t.documentElement;if(o===e.dom)return bn(o.offsetLeft,o.offsetTop);const s=vn(null==n?void 0:n.pageYOffset,r.scrollTop),l=vn(null==n?void 0:n.pageXOffset,r.scrollLeft),a=vn(r.clientTop,o.clientTop),c=vn(r.clientLeft,o.clientLeft);return xn(e).translate(l-c,s-a)},xn=e=>{const t=e.dom,o=t.ownerDocument.body;return o===t?bn(o.offsetLeft,o.offsetTop):lt(e)?(e=>{const t=e.getBoundingClientRect();return bn(t.left,t.top)})(t):bn(0,0)},Cn=(e,t)=>({row:e,y:t}),Sn=(e,t)=>({col:e,x:t}),Tn=e=>yn(e).left+Wo(e),Rn=e=>yn(e).left,Dn=(e,t)=>Sn(e,Rn(t)),On=(e,t)=>Sn(e,Tn(t)),kn=e=>yn(e).top,En=(e,t)=>Cn(e,kn(t)),Nn=(e,t)=>Cn(e,kn(t)+pn(t)),Bn=(e,t,o)=>{if(0===o.length)return[];const n=E(o.slice(1),((t,o)=>t.map((t=>e(o,t))))),r=o[o.length-1].map((e=>t(o.length-1,e)));return n.concat([r])},_n={delta:h,positions:e=>Bn(En,Nn,e),edge:kn},zn=un({delta:h,edge:Rn,positions:e=>Bn(Dn,On,e)},{delta:e=>-e,edge:Tn,positions:e=>Bn(On,Dn,e)}),An={delta:(e,t)=>zn(t).delta(e,t),positions:(e,t)=>zn(t).positions(e,t),edge:e=>zn(e).edge(e)},Ln={unsupportedLength:["em","ex","cap","ch","ic","rem","lh","rlh","vw","vh","vi","vb","vmin","vmax","cm","mm","Q","in","pc","pt","px"],fixed:["px","pt"],relative:["%"],empty:[""]},Wn=(()=>{const e="[0-9]+",t="[eE][+-]?"+e,o=e=>`(?:${e})?`,n=["Infinity",e+"\\."+o(e)+o(t),"\\."+e+o(t),e+o(t)].join("|");return new RegExp(`^([+-]?(?:${n}))(.*)$`)})(),Mn=/(\d+(\.\d+)?)%/,jn=/(\d+(\.\d+)?)px|em/,Pn=ue("col"),In=(e,t,o)=>{const n=Be(e).getOrThunk((()=>at(ke(e))));return t(e)/o(n)*100},Fn=(e,t)=>{Nt(e,"width",t+"px")},Hn=(e,t)=>{Nt(e,"width",t+"%")},$n=(e,t)=>{Nt(e,"height",t+"px")},Vn=e=>{const t=(e=>{return zo(t=e,"height",t.dom.offsetHeight)+"px";var t})(e);return t?((e,t,o,n)=>{const r=parseFloat(e);return Rt(e,"%")&&"table"!==ne(t)?((e,t,o,n)=>{const r=Kt(e).map((e=>{const n=o(e);return Math.floor(t/100*n)})).getOr(t);return n(e,r),r})(t,r,o,n):r})(t,e,hn,$n):hn(e)},qn=(e,t)=>At(e,t).orThunk((()=>we(e,t).map((e=>e+"px")))),Un=e=>qn(e,"width"),Gn=e=>In(e,Lo,Mo),Kn=e=>{return Pn(e)?Lo(e):zo(t=e,"width",t.dom.offsetWidth);var t},Yn=e=>((e,t,o)=>o(e)/Mt(e,"rowspan"))(e,0,Vn),Jn=(e,t,o)=>{Nt(e,"width",t+o)},Qn=e=>In(e,Lo,Mo)+"%",Xn=g(Mn),Zn=ue("col"),er=e=>Un(e).getOrThunk((()=>Kn(e)+"px")),tr=e=>{return(t=e,qn(t,"height")).getOrThunk((()=>Yn(e)+"px"));var t},or=(e,t,o,n,r,s)=>e.filter(n).fold((()=>s(((e,t)=>{if(t<0||t>=e.length-1)return C.none();const o=e[t].fold((()=>{const o=(e=>{const t=S.call(e,0);return t.reverse(),t})(e.slice(0,t));return V(o,((e,t)=>e.map((e=>({value:e,delta:t+1})))))}),(e=>C.some({value:e,delta:0}))),n=e[t+1].fold((()=>{const o=e.slice(t+1);return V(o,((e,t)=>e.map((e=>({value:e,delta:t+1})))))}),(e=>C.some({value:e,delta:1})));return o.bind((e=>n.map((t=>{const o=t.delta+e.delta;return Math.abs(t.value-e.value)/o}))))})(o,t))),(e=>r(e))),nr=(e,t,o,n)=>{const r=cn(e),s=ln(e)?(e=>E(sn(e),(e=>C.from(e.element))))(e):r,l=[C.some(An.edge(t))].concat(E(An.positions(r,t),(e=>e.map((e=>e.x))))),a=b(jt);return E(s,((e,t)=>or(e,t,l,a,(e=>{if((e=>{const t=Bo().browser,o=t.isChromium()||t.isFirefox();return!Zn(e)||o})(e))return o(e);{const e=null!=(s=r[t])?h(s):C.none();return or(e,t,l,a,(e=>n(C.some(Lo(e)))),n)}var s}),n)))},rr=e=>e.map((e=>e+"px")).getOr(""),sr=(e,t,o)=>nr(e,t,Kn,(e=>e.getOrThunk(o.minCellWidth))),lr=(e,t,o,n,r)=>{const s=dn(e),l=[C.some(o.edge(t))].concat(E(o.positions(s,t),(e=>e.map((e=>e.y)))));return E(s,((e,t)=>or(e,t,l,b(Pt),n,r)))},ar=(e,t)=>()=>lt(e)?t(e):parseFloat(At(e,"width").getOr("0")),cr=e=>{const t=ar(e,(e=>parseFloat(Qn(e)))),o=ar(e,Lo);return{width:t,pixelWidth:o,getWidths:(t,o)=>((e,t,o)=>nr(e,t,Gn,(e=>e.fold((()=>o.minCellWidth()),(e=>e/o.pixelWidth()*100)))))(t,e,o),getCellDelta:e=>e/o()*100,singleColumnWidth:(e,t)=>[100-e],minCellWidth:()=>Ft()/o()*100,setElementWidth:Hn,adjustTableWidth:o=>{const n=t();Hn(e,n+o/100*n)},isRelative:!0,label:"percent"}},ir=e=>{const t=ar(e,Lo);return{width:t,pixelWidth:t,getWidths:(t,o)=>sr(t,e,o),getCellDelta:h,singleColumnWidth:(e,t)=>[Math.max(Ft(),e+t)-e],minCellWidth:Ft,setElementWidth:Fn,adjustTableWidth:o=>{const n=t()+o;Fn(e,n)},isRelative:!1,label:"pixel"}},mr=e=>Un(e).fold((()=>(e=>{const t=ar(e,Lo),o=g(0);return{width:t,pixelWidth:t,getWidths:(t,o)=>sr(t,e,o),getCellDelta:o,singleColumnWidth:g([0]),minCellWidth:o,setElementWidth:f,adjustTableWidth:f,isRelative:!0,label:"none"}})(e)),(t=>((e,t)=>null!==Xn().exec(t)?cr(e):ir(e))(e,t))),dr=ir,ur=cr,fr=(e,t,o)=>{const n=e[o].element,r=xe.fromTag("td");Ie(r,xe.fromTag("br")),(t?Ie:Pe)(n,r)},gr=((e,t)=>{const o=t=>e(t)?C.from(t.dom.nodeValue):C.none();return{get:t=>{if(!e(t))throw new Error("Can only get text value of a text node");return o(t).getOr("")},getOption:o,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(ie),hr=e=>gr.get(e),pr=e=>gr.getOption(e),wr=(e,t)=>gr.set(e,t),br=e=>"img"===ne(e)?1:pr(e).fold((()=>Le(e).length),(e=>e.length)),vr=["img","br"],yr=e=>pr(e).filter((e=>0!==e.trim().length||e.indexOf("\xa0")>-1)).isSome()||D(vr,ne(e))||(e=>ae(e)&&"false"===pe(e,"contenteditable"))(e),xr=e=>((e,t)=>{const o=e=>{for(let n=0;nSr(e,yr),Sr=(e,t)=>{const o=e=>{const n=Le(e);for(let e=n.length-1;e>=0;e--){const r=n[e];if(t(r))return C.some(r);const s=o(r);if(s.isSome())return s}return C.none()};return o(e)},Tr={scope:["row","col"]},Rr=e=>()=>{const t=xe.fromTag("td",e.dom);return Ie(t,xe.fromTag("br",e.dom)),t},Dr=e=>()=>xe.fromTag("col",e.dom),Or=e=>()=>xe.fromTag("colgroup",e.dom),kr=e=>()=>xe.fromTag("tr",e.dom),Er=(e,t,o)=>{const n=((e,t)=>{const o=Je(e,t),n=Le(Ye(e));return $e(o,n),o})(e,t);return G(o,((e,t)=>{null===e?be(n,t):ge(n,t,e)})),n},Nr=e=>e,Br=(e,t,o)=>{const n=(e,t)=>{((e,t)=>{const o=e.dom,n=t.dom;kt(o)&&kt(n)&&(n.style.cssText=o.style.cssText)})(e.element,t),Lt(t,"height"),1!==e.colspan&&Lt(t,"width")};return{col:o=>{const r=xe.fromTag(ne(o.element),t.dom);return n(o,r),e(o.element,r),r},colgroup:Or(t),row:kr(t),cell:r=>{const s=xe.fromTag(ne(r.element),t.dom),l=o.getOr(["strong","em","b","i","span","font","h1","h2","h3","h4","h5","h6","p","div"]),a=l.length>0?((e,t,o)=>xr(e).map((n=>{const r=o.join(","),s=it(n,r,(t=>Re(t,e)));return z(s,((e,t)=>{const o=Ke(t);return Ie(e,o),o}),t)})).getOr(t))(r.element,s,l):s;return Ie(a,xe.fromTag("br")),n(r,s),((e,t)=>{G(Tr,((o,n)=>we(e,n).filter((e=>D(o,e))).each((e=>ge(t,n,e)))))})(r.element,s),e(r.element,s),s},replace:Er,colGap:Dr(t),gap:Rr(t)}},_r=e=>({col:Dr(e),colgroup:Or(e),row:kr(e),cell:Rr(e),replace:Nr,colGap:Dr(e),gap:Rr(e)}),zr=e=>t=>t.options.get(e),Ar="100%",Lr=e=>{var t;const o=e.dom,n=null!==(t=o.getParent(e.selection.getStart(),o.isBlock))&&void 0!==t?t:e.getBody();return Mo(xe.fromDom(n))+"px"},Wr=e=>C.from(e.options.get("table_clone_elements")),Mr=zr("table_header_type"),jr=zr("table_column_resizing"),Pr=e=>"preservetable"===jr(e),Ir=e=>"resizetable"===jr(e),Fr=zr("table_sizing_mode"),Hr=e=>"relative"===Fr(e),$r=e=>"fixed"===Fr(e),Vr=e=>"responsive"===Fr(e),qr=zr("table_resize_bars"),Ur=zr("table_style_by_css"),Gr=zr("table_merge_content_on_paste"),Kr=e=>{const t=e.options,o=t.get("table_default_attributes");return t.isSet("table_default_attributes")?o:((e,t)=>Vr(e)||Ur(e)?t:$r(e)?{...t,width:Lr(e)}:{...t,width:Ar})(e,o)},Yr=zr("table_use_colgroups"),Jr=e=>bt(e,"[contenteditable]"),Qr=(e,t=!1)=>lt(e)?e.dom.isContentEditable:Jr(e).fold(g(t),(e=>"true"===Xr(e))),Xr=e=>e.dom.contentEditable,Zr=e=>xe.fromDom(e.getBody()),es=e=>t=>Re(t,Zr(e)),ts=e=>{be(e,"data-mce-style");const t=e=>be(e,"data-mce-style");N(Ut(e),t),N(Gt(e),t),N(Yt(e),t)},os=e=>xe.fromDom(e.selection.getStart()),ns=e=>e.getBoundingClientRect().width,rs=e=>e.getBoundingClientRect().height,ss=e=>gt(e,ue("table")).exists(Qr),ls=(e,t)=>{const o=t.column,n=t.column+t.colspan-1,r=t.row,s=t.row+t.rowspan-1;return o<=e.finishCol&&n>=e.startCol&&r<=e.finishRow&&s>=e.startRow},as=(e,t)=>t.column>=e.startCol&&t.column+t.colspan-1<=e.finishCol&&t.row>=e.startRow&&t.row+t.rowspan-1<=e.finishRow,cs=(e,t,o)=>{const n=on(e,t,Re),r=on(e,o,Re);return n.bind((e=>r.map((t=>{return o=e,n=t,{startRow:Math.min(o.row,n.row),startCol:Math.min(o.column,n.column),finishRow:Math.max(o.row+o.rowspan-1,n.row+n.rowspan-1),finishCol:Math.max(o.column+o.colspan-1,n.column+n.colspan-1)};var o,n}))))},is=(e,t,o)=>cs(e,t,o).map((t=>{const o=nn(e,w(ls,t));return E(o,(e=>e.element))})),ms=(e,t)=>on(e,t,((e,t)=>De(t,e))).map((e=>e.element)),ds=(e,t,o)=>{const n=fs(e);return is(n,t,o)},us=(e,t,o,n,r)=>{const s=fs(e),l=Re(e,o)?C.some(t):ms(s,t),a=Re(e,r)?C.some(n):ms(s,n);return l.bind((e=>a.bind((t=>is(s,e,t)))))},fs=Zo;var gs=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"],hs=()=>({up:g({selector:ht,closest:bt,predicate:ft,all:_e}),down:g({selector:dt,predicate:ct}),styles:g({get:_t,getRaw:At,set:Nt,remove:Lt}),attrs:g({get:pe,set:ge,remove:be,copyTo:(e,t)=>{const o=ve(e);he(t,o)}}),insert:g({before:Me,after:je,afterAll:He,append:Ie,appendAll:$e,prepend:Pe,wrap:Fe}),remove:g({unwrap:Ue,remove:qe}),create:g({nu:xe.fromTag,clone:e=>xe.fromDom(e.dom.cloneNode(!1)),text:xe.fromText}),query:g({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:ze,nextSibling:Ae}),property:g({children:Le,name:ne,parent:Ne,document:e=>Ee(e).dom,isText:ie,isComment:le,isElement:ce,isSpecial:e=>{const t=ne(e);return D(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>ce(e)?we(e,"lang"):C.none(),getText:hr,setText:wr,isBoundary:e=>!!ce(e)&&("body"===ne(e)||D(gs,ne(e))),isEmptyTag:e=>!!ce(e)&&D(["br","img","hr","input"],ne(e)),isNonEditable:e=>ce(e)&&"false"===pe(e,"contenteditable")}),eq:Re,is:Oe});const ps=(e,t,o,n)=>{const r=t(e,o);return z(n,((o,n)=>{const r=t(e,n);return ws(e,o,r)}),r)},ws=(e,t,o)=>t.bind((t=>o.filter(w(e.eq,t)))),bs=hs(),vs=(e,t)=>((e,t,o)=>o.length>0?((e,t,o,n)=>n(e,t,o[0],o.slice(1)))(e,t,o,ps):C.none())(bs,((t,o)=>e(o)),t),ys=e=>ht(e,"table"),xs=(e,t,o)=>{const n=e=>t=>void 0!==o&&o(t)||Re(t,e);return Re(e,t)?C.some({boxes:C.some([e]),start:e,finish:t}):ys(e).bind((r=>ys(t).bind((s=>{if(Re(r,s))return C.some({boxes:ds(r,e,t),start:e,finish:t});if(De(r,s)){const o=it(t,"td,th",n(r)),l=o.length>0?o[o.length-1]:t;return C.some({boxes:us(r,e,r,t,s),start:e,finish:l})}if(De(s,r)){const o=it(e,"td,th",n(s)),l=o.length>0?o[o.length-1]:e;return C.some({boxes:us(s,e,r,t,s),start:e,finish:l})}return((e,t,o)=>((e,t,o,n=y)=>{const r=[t].concat(e.up().all(t)),s=[o].concat(e.up().all(o)),l=e=>W(e,n).fold((()=>e),(t=>e.slice(0,t+1))),a=l(r),c=l(s),i=L(a,(t=>O(c,((e,t)=>w(e.eq,t))(e,t))));return{firstpath:a,secondpath:c,shared:i}})(bs,e,t,void 0))(e,t).shared.bind((l=>bt(l,"table",o).bind((o=>{const l=it(t,"td,th",n(o)),a=l.length>0?l[l.length-1]:t,c=it(e,"td,th",n(o)),i=c.length>0?c[c.length-1]:e;return C.some({boxes:us(o,e,r,t,s),start:i,finish:a})}))))}))))},Cs=(e,t)=>{const o=dt(e,t);return o.length>0?C.some(o):C.none()},Ss=(e,t,o)=>wt(e,t).bind((t=>wt(e,o).bind((e=>vs(ys,[t,e]).map((o=>({first:t,last:e,table:o}))))))),Ts=(e,t,o,n,r)=>((e,t)=>L(e,(e=>Ce(e,t))))(e,r).bind((e=>((e,t,o)=>Kt(e).bind((n=>((e,t,o,n)=>on(e,t,Re).bind((t=>{const r=o>0?t.row+t.rowspan-1:t.row,s=n>0?t.column+t.colspan-1:t.column;return tn(e,r+o,s+n).map((e=>e.element))})))(fs(n),e,t,o))))(e,t,o).bind((e=>((e,t)=>ht(e,"table").bind((o=>wt(o,t).bind((t=>xs(t,e).bind((e=>e.boxes.map((t=>({boxes:t,start:e.start,finish:e.finish}))))))))))(e,n))))),Rs=(e,t)=>Cs(e,t),Ds=(e,t,o)=>Ss(e,t,o).bind((t=>{const o=t=>Re(e,t),n="thead,tfoot,tbody,table",r=ht(t.first,n,o),s=ht(t.last,n,o);return r.bind((e=>s.bind((o=>Re(e,o)?((e,t,o)=>((e,t,o)=>cs(e,t,o).bind((t=>((e,t)=>{let o=!0;const n=w(as,t);for(let r=t.startRow;r<=t.finishRow;r++)for(let s=t.startCol;s<=t.finishCol;s++)o=o&&tn(e,r,s).exists(n);return o?C.some(t):C.none()})(e,t))))(fs(e),t,o))(t.table,t.first,t.last):C.none()))))})),Os=h,ks=e=>{const t=(e,t)=>we(e,t).exists((e=>parseInt(e,10)>1));return e.length>0&&P(e,(e=>t(e,"rowspan")||t(e,"colspan")))?C.some(e):C.none()},Es=(e,t,o)=>t.length<=1?C.none():Ds(e,o.firstSelectedSelector,o.lastSelectedSelector).map((e=>({bounds:e,cells:t}))),Ns="data-mce-selected",Bs="data-mce-first-selected",_s="data-mce-last-selected",zs="["+Ns+"]",As={selected:Ns,selectedSelector:"td["+Ns+"],th["+Ns+"]",firstSelected:Bs,firstSelectedSelector:"td["+Bs+"],th["+Bs+"]",lastSelected:_s,lastSelectedSelector:"td["+_s+"],th["+_s+"]"},Ls=(e,t,o)=>({element:o,mergable:Es(t,e,As),unmergable:ks(e),selection:Os(e)}),Ws=e=>(t,o)=>{const n=ne(t),r="col"===n||"colgroup"===n?Kt(s=t).bind((e=>Rs(e,As.firstSelectedSelector))).fold(g(s),(e=>e[0])):t;var s;return bt(r,e,o)},Ms=Ws("th,td,caption"),js=Ws("th,td"),Ps=e=>{return t=e.model.table.getSelectedCells(),E(t,xe.fromDom);var t},Is=(e,t)=>{e.on("BeforeGetContent",(t=>{const o=o=>{t.preventDefault(),(e=>Kt(e[0]).map((e=>{const t=((e,t)=>{const o=e=>Ce(e.element,t),n=Ye(e),r=Zt(n),s=mr(e),l=en(r),a=((e,t)=>{const o=e.grid.columns;let n=e.grid.rows,r=o,s=0,l=0;const a=[],c=[];return G(e.access,(e=>{if(a.push(e),t(e)){c.push(e);const t=e.row,o=t+e.rowspan-1,a=e.column,i=a+e.colspan-1;ts&&(s=o),al&&(l=i)}})),((e,t,o,n,r,s)=>({minRow:e,minCol:t,maxRow:o,maxCol:n,allCells:r,selectedCells:s}))(n,r,s,l,a,c)})(l,o),c="th:not("+t+"),td:not("+t+")",i=Vt(n,"th,td",(e=>Ce(e,c)));N(i,qe),((e,t,o,n)=>{const r=_(e,(e=>"colgroup"!==e.section)),s=t.grid.columns,l=t.grid.rows;for(let e=0;eo.maxRow||ao.maxCol||(tn(t,e,a).filter(n).isNone()?fr(r,l,e):l=!0)}})(r,l,a,o);const m=((e,t,o,n)=>{if(0===n.minCol&&t.grid.columns===n.maxCol+1)return 0;const r=sr(t,e,o),s=A(r,((e,t)=>e+t),0),l=A(r.slice(n.minCol,n.maxCol+1),((e,t)=>e+t),0),a=l/s*o.pixelWidth()-o.pixelWidth();return o.getCellDelta(a)})(e,Zo(e),s,a);return((e,t,o,n)=>{G(o.columns,(e=>{(e.columnt.maxCol)&&qe(e.element)}));const r=_($t(e,"tr"),(e=>0===e.dom.childElementCount));N(r,qe),t.minCol!==t.maxCol&&t.minRow!==t.maxRow||N($t(e,"th,td"),(e=>{be(e,"rowspan"),be(e,"colspan")})),be(e,Go),be(e,"data-snooker-col-series"),mr(e).adjustTableWidth(n)})(n,a,l,m),n})(e,zs);return ts(t),[t]})))(o).each((o=>{t.content="text"===t.format?(e=>E(e,(e=>e.dom.innerText)).join(""))(o):((e,t)=>E(t,(t=>e.selection.serializer.serialize(t.dom,{}))).join(""))(e,o)}))};if(!0===t.selection){const t=(e=>_(Ps(e),(e=>Ce(e,As.selectedSelector))))(e);t.length>=1&&o(t)}})),e.on("BeforeSetContent",(o=>{if(!0===o.selection&&!0===o.paste){const n=Ps(e);H(n).each((n=>{Kt(n).each((r=>{const s=_(((e,t)=>{const o=document.createElement("div");return o.innerHTML=e,Le(xe.fromDom(o))})(o.content),(e=>"meta"!==ne(e))),l=ue("table");if(Gr(e)&&1===s.length&&l(s[0])){o.preventDefault();const l=xe.fromDom(e.getDoc()),a=_r(l),c=((e,t,o)=>({element:e,clipboard:t,generators:o}))(n,s[0],a);t.pasteCells(r,c).each((()=>{e.focus()}))}}))}))}}))},Fs=(e,t)=>({element:e,offset:t}),Hs=(e,t,o)=>e.property().isText(t)&&0===e.property().getText(t).trim().length||e.property().isComment(t)?o(t).bind((t=>Hs(e,t,o).orThunk((()=>C.some(t))))):C.none(),$s=(e,t)=>e.property().isText(t)?e.property().getText(t).length:e.property().children(t).length,Vs=(e,t)=>{const o=Hs(e,t,e.query().prevSibling).getOr(t);if(e.property().isText(o))return Fs(o,$s(e,o));const n=e.property().children(o);return n.length>0?Vs(e,n[n.length-1]):Fs(o,$s(e,o))},qs=Vs,Us=hs(),Gs=(e,t)=>{if(!jt(e)){const o=(e=>Un(e).bind((e=>{return t=e,o=["fixed","relative","empty"],C.from(Wn.exec(t)).bind((e=>{const t=Number(e[1]),n=e[2];return((e,t)=>O(t,(t=>O(Ln[t],(t=>e===t)))))(n,o)?C.some({value:t,unit:n}):C.none()}));var t,o})))(e);o.each((o=>{const n=o.value/2;Jn(e,n,o.unit),Jn(t,n,o.unit)}))}},Ks=e=>E(e,g(0)),Ys=(e,t,o,n,r)=>r(e.slice(0,t)).concat(n).concat(r(e.slice(o))),Js=e=>(t,o,n,r)=>{if(e(n)){const e=Math.max(r,t[o]-Math.abs(n)),s=Math.abs(e-t[o]);return n>=0?s:-s}return n},Qs=Js((e=>e<0)),Xs=Js(x),Zs=()=>{const e=(e,t,o,n)=>{const r=(100+o)/100,s=Math.max(n,(e[t]+o)/r);return E(e,((e,o)=>(o===t?s:e/r)-e))},t=(t,o,n,r,s,l)=>l?e(t,o,r,s):((e,t,o,n,r)=>{const s=Qs(e,t,n,r);return Ys(e,t,o+1,[s,0],Ks)})(t,o,n,r,s);return{resizeTable:(e,t)=>e(t),clampTableDelta:Qs,calcLeftEdgeDeltas:t,calcMiddleDeltas:(e,o,n,r,s,l,a)=>t(e,n,r,s,l,a),calcRightEdgeDeltas:(t,o,n,r,s,l)=>{if(l)return e(t,n,r,s);{const e=Qs(t,n,r,s);return Ks(t.slice(0,n)).concat([e])}},calcRedestributedWidths:(e,t,o,n)=>{if(n){const n=(t+o)/t,r=E(e,(e=>e/n));return{delta:100*n-100,newSizes:r}}return{delta:o,newSizes:e}}}},el=()=>{const e=(e,t,o,n,r)=>{const s=Xs(e,n>=0?o:t,n,r);return Ys(e,t,o+1,[s,-s],Ks)};return{resizeTable:(e,t,o)=>{o&&e(t)},clampTableDelta:(e,t,o,n,r)=>{if(r){if(o>=0)return o;{const t=A(e,((e,t)=>e+t-n),0);return Math.max(-t,o)}}return Qs(e,t,o,n)},calcLeftEdgeDeltas:e,calcMiddleDeltas:(t,o,n,r,s,l)=>e(t,n,r,s,l),calcRightEdgeDeltas:(e,t,o,n,r,s)=>{if(s)return Ks(e);{const t=n/e.length;return E(e,g(t))}},calcRedestributedWidths:(e,t,o,n)=>({delta:0,newSizes:e})}},tl=e=>Zo(e).grid,ol=ue("th"),nl=e=>P(e,(e=>ol(e.element))),rl=(e,t)=>e&&t?"sectionCells":e?"section":"cells",sl=e=>{const t="thead"===e.section,o=vt(ll(e.cells),"th");return"tfoot"===e.section?{type:"footer"}:t||o?{type:"header",subType:rl(t,o)}:{type:"body"}},ll=e=>{const t=_(e,(e=>ol(e.element)));return 0===t.length?C.some("td"):t.length===e.length?C.some("th"):C.none()},al=(e,t,o)=>et(o(e.element,t),!0,e.isLocked),cl=(e,t)=>e.section!==t?tt(e.element,e.cells,t,e.isNew):e,il=()=>({transformRow:cl,transformCell:(e,t,o)=>{const n=o(e.element,t),r="td"!==ne(n)?((e,t)=>{const o=Je(e,"td");je(e,o);const n=Le(e);return $e(o,n),qe(e),o})(n):n;return et(r,e.isNew,e.isLocked)}}),ml=()=>({transformRow:cl,transformCell:al}),dl=()=>({transformRow:(e,t)=>cl(e,"thead"===t?"tbody":t),transformCell:al}),ul=il,fl=ml,gl=dl,hl=()=>({transformRow:h,transformCell:al}),pl=(e,t,o,n)=>{o===n?be(e,t):ge(e,t,o)},wl=(e,t,o)=>{$(mt(e,t)).fold((()=>Pe(e,o)),(e=>je(e,o)))},bl=(e,t)=>{const o=[],n=[],r=e=>E(e,(e=>{e.isNew&&o.push(e.element);const t=e.element;return Ve(t),N(e.cells,(e=>{e.isNew&&n.push(e.element),pl(e.element,"colspan",e.colspan,1),pl(e.element,"rowspan",e.rowspan,1),Ie(t,e.element)})),t})),s=e=>j(e,(e=>E(e.cells,(e=>(pl(e.element,"span",e.colspan,1),e.element))))),l=(t,o)=>{const n=((e,t)=>{const o=pt(e,t).getOrThunk((()=>{const o=xe.fromTag(t,ke(e).dom);return"thead"===t?wl(e,"caption,colgroup",o):"colgroup"===t?wl(e,"caption",o):Ie(e,o),o}));return Ve(o),o})(e,o),l=("colgroup"===o?s:r)(t);$e(n,l)},a=(t,o)=>{t.length>0?l(t,o):(t=>{pt(e,t).each(qe)})(o)},c=[],i=[],m=[],d=[];return N(t,(e=>{switch(e.section){case"thead":c.push(e);break;case"tbody":i.push(e);break;case"tfoot":m.push(e);break;case"colgroup":d.push(e)}})),a(d,"colgroup"),a(c,"thead"),a(i,"tbody"),a(m,"tfoot"),{newRows:o,newCells:n}},vl=(e,t)=>{if(0===e.length)return 0;const o=e[0];return W(e,(e=>!t(o.element,e.element))).getOr(e.length)},yl=(e,t)=>{const o=E(e,(e=>E(e.cells,y)));return E(e,((n,r)=>{const s=j(n.cells,((n,s)=>{if(!1===o[r][s]){const m=((e,t,o,n)=>{const r=((e,t)=>e[t])(e,t),s="colgroup"===r.section,l=vl(r.cells.slice(o),n),a=s?1:vl(((e,t)=>E(e,(e=>Ho(e,t))))(e.slice(t),o),n);return{colspan:l,rowspan:a}})(e,r,s,t);return((e,t,n,r)=>{for(let s=e;s({element:e,cells:t,section:o,isNew:n}))(n.element,s,n.section,n.isNew)}))},xl=(e,t,o)=>{const n=[];N(e.colgroups,(r=>{const s=[];for(let n=0;net(e.element,o,!1))).getOrThunk((()=>et(t.colGap(),!0,!1)));s.push(r)}n.push(tt(r.element,s,"colgroup",o))}));for(let r=0;ret(e.element,o,e.isLocked))).getOrThunk((()=>et(t.gap(),!0,!1)));s.push(l)}const l=e.all[r],a=tt(l.element,s,l.section,o);n.push(a)}return n},Cl=e=>yl(e,Re),Sl=(e,t)=>V(e.all,(e=>L(e.cells,(e=>Re(t,e.element))))),Tl=(e,t,o)=>{const n=E(t.selection,(t=>qt(t).bind((t=>Sl(e,t))).filter(o))),r=yt(n);return xt(r.length>0,r)},Rl=(e,t,o,n,r)=>(s,l,a,c)=>{const i=Zo(s),m=C.from(null==c?void 0:c.section).getOrThunk(hl);return t(i,l).map((t=>{const o=((e,t)=>xl(e,t,!1))(i,a),n=e(o,t,Re,r(a),m),s=Yo(n.grid);return{info:t,grid:Cl(n.grid),cursor:n.cursor,lockedColumns:s}})).bind((e=>{const t=bl(s,e.grid),r=C.from(null==c?void 0:c.sizing).getOrThunk((()=>mr(s))),l=C.from(null==c?void 0:c.resize).getOrThunk(el);return o(s,e.grid,e.info,{sizing:r,resize:l,section:m}),n(s),be(s,Go),e.lockedColumns.length>0&&ge(s,Go,e.lockedColumns.join(",")),C.some({cursor:e.cursor,newRows:t.newRows,newCells:t.newCells})}))},Dl=(e,t)=>Tl(e,t,x).map((e=>({cells:e,generators:t.generators,clipboard:t.clipboard}))),Ol=(e,t)=>Tl(e,t,x),kl=(e,t)=>Tl(e,t,(e=>!e.isLocked)),El=(e,t)=>P(t,(t=>((e,t)=>Sl(e,t).exists((e=>!e.isLocked)))(e,t))),Nl=(e,t,o,n)=>{const r=qo(e).rows;let s=!0;for(let e=0;e{const t=t=>t(e),o=g(e),n=()=>r,r={tag:!0,inner:e,fold:(t,o)=>o(e),isValue:x,isError:y,map:t=>zl.value(t(e)),mapError:n,bind:t,exists:t,forall:t,getOr:o,or:n,getOrThunk:o,orThunk:n,getOrDie:o,each:t=>{t(e)},toOptional:()=>C.some(e)};return r},_l=e=>{const t=()=>o,o={tag:!1,inner:e,fold:(t,o)=>t(e),isValue:y,isError:x,map:t,mapError:t=>zl.error(t(e)),bind:t,exists:y,forall:x,getOr:h,or:h,getOrThunk:v,orThunk:v,getOrDie:(n=String(e),()=>{throw new Error(n)}),each:f,toOptional:C.none};var n;return o},zl={value:Bl,error:_l,fromOption:(e,t)=>e.fold((()=>_l(t)),Bl)},Al=(e,t)=>({rowDelta:0,colDelta:Vo(e[0])-Vo(t[0])}),Ll=(e,t)=>({rowDelta:e.length-t.length,colDelta:0}),Wl=(e,t,o,n)=>{const r="colgroup"===t.section?o.col:o.cell;return k(e,(e=>et(r(),!0,n(e))))},Ml=(e,t,o,n)=>{const r=e[e.length-1];return e.concat(k(t,(()=>{const e="colgroup"===r.section?o.colgroup:o.row,t=Uo(r,e,h),s=Wl(t.cells.length,t,o,(e=>X(n,e.toString())));return Fo(t,s)})))},jl=(e,t,o,n)=>E(e,(e=>{const r=Wl(t,e,o,y);return jo(e,n,r)})),Pl=(e,t,o)=>{const n=t.colDelta<0?jl:h,r=t.rowDelta<0?Ml:h,s=Yo(e),l=Vo(e[0]),a=O(s,(e=>e===l-1)),c=n(e,Math.abs(t.colDelta),o,a?l-1:l),i=Yo(c);return r(c,Math.abs(t.rowDelta),o,I(i,x))},Il=(e,t,o,n)=>{const r=w(n,Ho(e[t],o).element),s=e[t];return e.length>1&&Vo(s)>1&&(o>0&&r($o(s,o-1))||o0&&r($o(e[t-1],o))||t_(o,(o=>o>=e.column&&o<=Vo(t[0])+e.column)),Hl=(e,t,o,n,r)=>{((e,t,o,n)=>{t>0&&t{const r=e.cells[t-1];let s=0;const l=n();for(;e.cells.length>t+s&&o(r.element,e.cells[t+s].element);)Io(e,t+s,et(l,!0,e.cells[t+s].isLocked)),s++}))})(t,e,r,n.cell);const s=Ll(o,t),l=Pl(o,s,n),a=Ll(t,l),c=Pl(t,a,n);return E(c,((t,o)=>jo(t,e,l[o].cells)))},$l=(e,t,o,n,r)=>{((e,t,o,n)=>{const r=qo(e).rows;if(t>0&&tA(e,((e,o)=>O(e,(e=>t(e.element,o.element)))?e:e.concat([o])),[]))(r[t-1].cells,o);N(e,(e=>{let s=C.none();for(let l=t;l{Io(a,t,et(e,!0,c.isLocked))})))}}))}})(t,e,r,n.cell);const s=Yo(t),l=Al(t,o),a={...l,colDelta:l.colDelta-s.length},c=Pl(t,a,n),{cols:i,rows:m}=qo(c),d=Yo(c),u=Al(o,t),f={...u,colDelta:u.colDelta+d.length},g=(p=n,w=d,E(o,(e=>A(w,((t,o)=>{const n=Wl(1,e,p,x)[0];return Po(t,o,n)}),e)))),h=Pl(g,f,n);var p,w;return[...i,...m.slice(0,e),...h,...m.slice(e,m.length)]},Vl=(e,t,o,n,r)=>{const{rows:s,cols:l}=qo(e),a=s.slice(0,t),c=s.slice(t);return[...l,...a,((e,t,o,n)=>Uo(e,(e=>n(e,o)),t))(s[o],((e,o)=>t>0&&tE(e,(e=>{const s=t>0&&t{if("colgroup"!==o&&n)return Ho(e,t);{const t=Ho(e,r);return et(l(t.element,s),!0,!1)}})(e,t,e.section,s,o,n,r);return Po(e,t,l)})),Ul=(e,t,o,n)=>((e,t,o,n)=>void 0!==$o(e[t],o)&&t>0&&n($o(e[t-1],o),$o(e[t],o)))(e,t,o,n)||((e,t,o)=>t>0&&o($o(e,t-1),$o(e,t)))(e[t],o,n),Gl=(e,t,o,n)=>{const r=e=>(e=>"row"===e?Pt(t):jt(t))(e)?`${e}group`:e;return e?ol(t)?r(o):null:n&&ol(t)?r("row"===o?"col":"row"):null},Kl=(e,t,o)=>et(o(e.element,t),!0,e.isLocked),Yl=(e,t,o,n,r,s,l)=>E(e,((e,a)=>((e,c)=>{const i=e.cells,m=E(i,((e,c)=>{if((e=>O(t,(t=>o(e.element,t.element))))(e)){const t=l(e,a,c)?r(e,o,n):e;return s(t,a,c).each((e=>{var o,n;o=t.element,n={scope:C.from(e)},G(n,((e,t)=>{e.fold((()=>{be(o,t)}),(e=>{fe(o.dom,t,e)}))}))})),t}return e}));return tt(e.element,m,e.section,e.isNew)})(e))),Jl=(e,t,o)=>j(e,((n,r)=>Ul(e,r,t,o)?[]:[Ho(n,t)])),Ql=(e,t,o,n,r)=>{const s=qo(e).rows,l=j(t,(e=>Jl(s,e,n))),a=E(s,(e=>nl(e.cells))),c=((e,t)=>P(t,h)&&nl(e)?x:(e,o,n)=>!("th"===ne(e.element)&&t[o]))(l,a),i=((e,t)=>(o,n)=>C.some(Gl(e,o.element,"row",t[n])))(o,a);return Yl(e,l,n,r,Kl,i,c)},Xl=(e,t,o,n)=>{const r=qo(e).rows,s=E(t,(e=>Ho(r[e.row],e.column)));return Yl(e,s,o,n,Kl,C.none,x)},Zl=e=>{if(!l(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");const t=[],o={};return N(e,((n,r)=>{const s=q(n);if(1!==s.length)throw new Error("one and only one name per case");const a=s[0],c=n[a];if(void 0!==o[a])throw new Error("duplicate key detected:"+a);if("cata"===a)throw new Error("cannot have a case named cata (sorry)");if(!l(c))throw new Error("case arguments must be an array");t.push(a),o[a]=(...o)=>{const n=o.length;if(n!==c.length)throw new Error("Wrong number of arguments to case "+a+". Expected "+c.length+" ("+c+"), got "+n);return{fold:(...t)=>{if(t.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+t.length);return t[r].apply(null,o)},match:e=>{const n=q(e);if(t.length!==n.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+n.join(","));if(!P(t,(e=>D(n,e))))throw new Error("Not all branches were specified when using match. Specified: "+n.join(", ")+"\nRequired: "+t.join(", "));return e[a].apply(null,o)},log:e=>{console.log(e,{constructors:t,constructor:a,params:o})}}}})),o},ea={...Zl([{none:[]},{only:["index"]},{left:["index","next"]},{middle:["prev","index","next"]},{right:["prev","index"]}])},ta=(e,t,o)=>{let n=0;for(let r=e;r{const o=rn(e);return E(o,(e=>{const o=ta(e.row,e.row+e.rowspan,t);return{element:e.element,height:o,rowspan:e.rowspan}}))},na=(e,t,o)=>{const n=((e,t)=>ln(e)?((e,t)=>{const o=sn(e);return E(o,((e,o)=>({element:e.element,width:t[o],colspan:e.colspan})))})(e,t):((e,t)=>{const o=rn(e);return E(o,(e=>{const o=ta(e.column,e.column+e.colspan,t);return{element:e.element,width:o,colspan:e.colspan}}))})(e,t))(e,t);N(n,(e=>{o.setElementWidth(e.element,e.width)}))},ra=(e,t,o,n,r)=>{const s=Zo(e),l=r.getCellDelta(t),a=r.getWidths(s,r),c=o===s.grid.columns-1,i=n.clampTableDelta(a,o,l,r.minCellWidth(),c),m=((e,t,o,n,r)=>{const s=e.slice(0),l=((e,t)=>0===e.length?ea.none():1===e.length?ea.only(0):0===t?ea.left(0,1):t===e.length-1?ea.right(t-1,t):t>0&&tn.singleColumnWidth(s[e],o)),((e,t)=>r.calcLeftEdgeDeltas(s,e,t,o,n.minCellWidth(),n.isRelative)),((e,t,l)=>r.calcMiddleDeltas(s,e,t,l,o,n.minCellWidth(),n.isRelative)),((e,t)=>r.calcRightEdgeDeltas(s,e,t,o,n.minCellWidth(),n.isRelative)))})(a,o,i,r,n),d=E(m,((e,t)=>e+a[t]));na(s,d,r),n.resizeTable(r.adjustTableWidth,i,c)},sa=e=>A(e,((e,t)=>O(e,(e=>e.column===t.column))?e:e.concat([t])),[]).sort(((e,t)=>e.column-t.column)),la=ue("col"),aa=ue("colgroup"),ca=e=>"tr"===ne(e)||aa(e),ia=e=>({element:e,colspan:Wt(e,"colspan",1),rowspan:Wt(e,"rowspan",1)}),ma=e=>we(e,"scope").map((e=>e.substr(0,3))),da=(e,t=ia)=>{const o=o=>{if(ca(o))return aa((r={element:o}).element)?e.colgroup(r):e.row(r);{const r=o,s=(t=>la(t.element)?e.col(t):e.cell(t))(t(r));return n=C.some({item:r,replacement:s}),s}var r};let n=C.none();return{getOrInit:(e,t)=>n.fold((()=>o(e)),(n=>t(e,n.item)?n.replacement:o(e)))}},ua=e=>t=>{const o=[],n=n=>{const r="td"===e?{scope:null}:{},s=t.replace(n,e,r);return o.push({item:n,sub:s}),s};return{replaceOrInit:(e,t)=>{if(ca(e)||la(e))return e;{const r=e;return((e,t)=>L(o,(o=>t(o.item,e))))(r,t).fold((()=>n(r)),(o=>t(e,o.item)?o.sub:n(r)))}}}},fa=e=>({unmerge:t=>{const o=ma(t);return o.each((e=>ge(t,"scope",e))),()=>{const n=e.cell({element:t,colspan:1,rowspan:1});return Lt(n,"width"),Lt(t,"width"),o.each((e=>ge(n,"scope",e))),n}},merge:e=>(Lt(e[0],"width"),(()=>{const t=yt(E(e,ma));if(0===t.length)return C.none();{const e=t[0],o=["row","col"];return O(t,(t=>t!==e&&D(o,t)))?C.none():C.from(e)}})().fold((()=>be(e[0],"scope")),(t=>ge(e[0],"scope",t+"group"))),g(e[0]))}),ga=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","table","thead","tfoot","tbody","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"],ha=hs(),pa=e=>((e,t)=>{const o=e.property().name(t);return D(ga,o)})(ha,e),wa=e=>((e,t)=>{const o=e.property().name(t);return D(["ol","ul"],o)})(ha,e),ba=e=>{const t=ue("br"),o=e=>Cr(e).bind((o=>{const n=Ae(o).map((e=>!!pa(e)||!!((e,t)=>D(["br","img","hr","input"],e.property().name(t)))(ha,e)&&"img"!==ne(e))).getOr(!1);return Ne(o).map((r=>{return!0===n||("li"===ne(s=r)||ft(s,wa).isSome())||t(o)||pa(r)&&!Re(e,r)?[]:[xe.fromTag("br")];var s}))})).getOr([]),n=(()=>{const n=j(e,(e=>{const n=Le(e);return(e=>P(e,(e=>t(e)||ie(e)&&0===hr(e).trim().length)))(n)?[]:n.concat(o(e))}));return 0===n.length?[xe.fromTag("br")]:n})();Ve(e[0]),$e(e[0],n)},va=e=>Qr(e,!0),ya=e=>{0===Ut(e).length&&qe(e)},xa=(e,t)=>({grid:e,cursor:t}),Ca=(e,t,o)=>{const n=((e,t,o)=>{var n,r;const s=qo(e).rows;return C.from(null===(r=null===(n=s[t])||void 0===n?void 0:n.cells[o])||void 0===r?void 0:r.element).filter(va).orThunk((()=>(e=>V(e,(e=>V(e.cells,(e=>{const t=e.element;return xt(va(t),t)})))))(s)))})(e,t,o);return xa(e,n)},Sa=e=>A(e,((e,t)=>O(e,(e=>e.row===t.row))?e:e.concat([t])),[]).sort(((e,t)=>e.row-t.row)),Ta=(e,t)=>(o,n,r,s,l)=>{const a=Sa(n),c=E(a,(e=>e.row)),i=((e,t,o,n,r,s,l)=>{const{cols:a,rows:c}=qo(e),i=c[t[0]],m=j(t,(e=>((e,t,o)=>{const n=e[t];return j(n.cells,((n,r)=>Ul(e,t,r,o)?[]:[n]))})(c,e,r))),d=E(i.cells,((e,t)=>nl(Jl(c,t,r)))),u=[...c];N(t,(e=>{u[e]=l.transformRow(c[e],o)}));const f=[...a,...u],g=((e,t)=>P(t,h)&&nl(e.cells)?x:(e,o,n)=>!("th"===ne(e.element)&&t[n]))(i,d),p=((e,t)=>(o,n,r)=>C.some(Gl(e,o.element,"col",t[r])))(n,d);return Yl(f,m,r,s,l.transformCell,p,g)})(o,c,e,t,r,s.replaceOrInit,l);return Ca(i,n[0].row,n[0].column)},Ra=Ta("thead",!0),Da=Ta("tbody",!1),Oa=Ta("tfoot",!1),ka=(e,t,o)=>{const n=((e,t)=>Qt(e,(()=>t)))(e,o.section),r=en(n);return xl(r,t,!0)},Ea=(e,t,o,n)=>((e,t,o,n)=>{const r=en(t),s=n.getWidths(r,n);na(r,s,n)})(0,t,0,n.sizing),Na=(e,t,o,n)=>((e,t,o,n,r)=>{const s=en(t),l=n.getWidths(s,n),a=n.pixelWidth(),{newSizes:c,delta:i}=r.calcRedestributedWidths(l,a,o.pixelDelta,n.isRelative);na(s,c,n),n.adjustTableWidth(i)})(0,t,o,n.sizing,n.resize),Ba=(e,t)=>O(t,(e=>0===e.column&&e.isLocked)),_a=(e,t)=>O(t,(t=>t.column+t.colspan>=e.grid.columns&&t.isLocked)),za=(e,t)=>{const o=cn(e),n=sa(t);return A(n,((e,t)=>e+o[t.column].map(Wo).getOr(0)),0)},Aa=e=>(t,o)=>Ol(t,o).filter((o=>!(e?Ba:_a)(t,o))).map((e=>({details:e,pixelDelta:za(t,e)}))),La=e=>(t,o)=>Dl(t,o).filter((o=>!(e?Ba:_a)(t,o.cells))),Wa=ua("th"),Ma=ua("td"),ja=Rl(((e,t,o,n)=>{const r=t[0].row,s=Sa(t),l=z(s,((e,t)=>({grid:Vl(e.grid,r,t.row+e.delta,o,n.getOrInit),delta:e.delta+1})),{grid:e,delta:0}).grid;return Ca(l,r,t[0].column)}),Ol,f,f,da),Pa=Rl(((e,t,o,n)=>{const r=Sa(t),s=r[r.length-1],l=s.row+s.rowspan,a=z(r,((e,t)=>Vl(e,l,t.row,o,n.getOrInit)),e);return Ca(a,l,t[0].column)}),Ol,f,f,da),Ia=Rl(((e,t,o,n)=>{const r=t.details,s=sa(r),l=s[0].column,a=z(s,((e,t)=>({grid:ql(e.grid,l,t.column+e.delta,o,n.getOrInit),delta:e.delta+1})),{grid:e,delta:0}).grid;return Ca(a,r[0].row,l)}),Aa(!0),Na,f,da),Fa=Rl(((e,t,o,n)=>{const r=t.details,s=r[r.length-1],l=s.column+s.colspan,a=sa(r),c=z(a,((e,t)=>ql(e,l,t.column,o,n.getOrInit)),e);return Ca(c,r[0].row,l)}),Aa(!1),Na,f,da),Ha=Rl(((e,t,o,n)=>{const r=sa(t.details),s=((e,t)=>j(e,(e=>{const o=e.cells,n=z(t,((e,t)=>t>=0&&t0?[tt(e.element,n,e.section,e.isNew)]:[]})))(e,E(r,(e=>e.column))),l=s.length>0?s[0].cells.length-1:0;return Ca(s,r[0].row,Math.min(r[0].column,l))}),((e,t)=>kl(e,t).map((t=>({details:t,pixelDelta:-za(e,t)})))),Na,ya,da),$a=Rl(((e,t,o,n)=>{const r=Sa(t),s=((e,t,o)=>{const{rows:n,cols:r}=qo(e);return[...r,...n.slice(0,t),...n.slice(o+1)]})(e,r[0].row,r[r.length-1].row),l=s.length>0?s.length-1:0;return Ca(s,Math.min(t[0].row,l),t[0].column)}),Ol,f,ya,da),Va=Rl(((e,t,o,n)=>{const r=sa(t),s=E(r,(e=>e.column)),l=Ql(e,s,!0,o,n.replaceOrInit);return Ca(l,t[0].row,t[0].column)}),kl,f,f,Wa),qa=Rl(((e,t,o,n)=>{const r=sa(t),s=E(r,(e=>e.column)),l=Ql(e,s,!1,o,n.replaceOrInit);return Ca(l,t[0].row,t[0].column)}),kl,f,f,Ma),Ua=Rl(Ra,kl,f,f,Wa),Ga=Rl(Da,kl,f,f,Ma),Ka=Rl(Oa,kl,f,f,Ma),Ya=Rl(((e,t,o,n)=>{const r=Xl(e,t,o,n.replaceOrInit);return Ca(r,t[0].row,t[0].column)}),kl,f,f,Wa),Ja=Rl(((e,t,o,n)=>{const r=Xl(e,t,o,n.replaceOrInit);return Ca(r,t[0].row,t[0].column)}),kl,f,f,Ma),Qa=Rl(((e,t,o,n)=>{const r=t.cells;ba(r);const s=((e,t,o,n)=>{const r=qo(e).rows;if(0===r.length)return e;for(let e=t.startRow;e<=t.finishRow;e++)for(let o=t.startCol;o<=t.finishCol;o++){const t=r[e],s=Ho(t,o).isLocked;Io(t,o,et(n(),!1,s))}return e})(e,t.bounds,0,n.merge(r));return xa(s,C.from(r[0]))}),((e,t)=>((e,t)=>t.mergable)(0,t).filter((t=>El(e,t.cells)))),Ea,f,fa),Xa=Rl(((e,t,o,n)=>{const r=z(t,((e,t)=>Nl(e,t,o,n.unmerge(t))),e);return xa(r,C.from(t[0]))}),((e,t)=>((e,t)=>t.unmergable)(0,t).filter((t=>El(e,t)))),Ea,f,fa),Za=Rl(((e,t,o,n)=>{const r=((e,t)=>{const o=Zo(e);return xl(o,t,!0)})(t.clipboard,t.generators);var s,l;return((e,t,o,n,r)=>{const s=Yo(t),l=((e,t,o)=>{const n=Vo(t[0]),r=qo(t).cols.length+e.row,s=k(n-e.column,(t=>t+e.column));return{row:r,column:L(s,(e=>P(o,(t=>t!==e)))).getOr(n-1)}})(e,t,s),a=qo(o).rows,c=Fl(l,a,s),i=((e,t,o)=>{if(e.row>=t.length||e.column>Vo(t[0]))return zl.error("invalid start address out of table bounds, row: "+e.row+", column: "+e.column);const n=t.slice(e.row),r=n[0].cells.slice(e.column),s=Vo(o[0]),l=o.length;return zl.value({rowDelta:n.length-l,colDelta:r.length-s})})(l,t,a);return i.map((e=>{const o={...e,colDelta:e.colDelta-c.length},s=Pl(t,o,n),i=Yo(s),m=Fl(l,a,i);return((e,t,o,n,r,s)=>{const l=e.row,a=e.column,c=l+o.length,i=a+Vo(o[0])+s.length,m=I(s,x);for(let e=l;exa(e,C.some(t.element))),(e=>Ca(e,t.row,t.column)))}),((e,t)=>qt(t.element).bind((o=>Sl(e,o).map((e=>({...e,generators:t.generators,clipboard:t.clipboard})))))),Ea,f,da),ec=Rl(((e,t,o,n)=>{const r=qo(e).rows,s=t.cells[0].column,l=r[t.cells[0].row],a=ka(t.clipboard,t.generators,l),c=Hl(s,e,a,t.generators,o);return Ca(c,t.cells[0].row,t.cells[0].column)}),La(!0),f,f,da),tc=Rl(((e,t,o,n)=>{const r=qo(e).rows,s=t.cells[t.cells.length-1].column+t.cells[t.cells.length-1].colspan,l=r[t.cells[0].row],a=ka(t.clipboard,t.generators,l),c=Hl(s,e,a,t.generators,o);return Ca(c,t.cells[0].row,t.cells[0].column)}),La(!1),f,f,da),oc=Rl(((e,t,o,n)=>{const r=qo(e).rows,s=t.cells[0].row,l=r[s],a=ka(t.clipboard,t.generators,l),c=$l(s,e,a,t.generators,o);return Ca(c,t.cells[0].row,t.cells[0].column)}),Dl,f,f,da),nc=Rl(((e,t,o,n)=>{const r=qo(e).rows,s=t.cells[t.cells.length-1].row+t.cells[t.cells.length-1].rowspan,l=r[t.cells[0].row],a=ka(t.clipboard,t.generators,l),c=$l(s,e,a,t.generators,o);return Ca(c,t.cells[0].row,t.cells[0].column)}),Dl,f,f,da),rc=(e,t)=>{const o=Zo(e);return Ol(o,t).bind((e=>{const t=e[e.length-1],n=e[0].column,r=t.column+t.colspan,s=M(E(o.all,(e=>_(e.cells,(e=>e.column>=n&&e.column{const o=Zo(e);return Ol(o,t).bind(ll).getOr("")},lc=(e,t)=>{const o=Zo(e);return Ol(o,t).bind((e=>{const t=e[e.length-1],n=e[0].row,r=t.row+t.rowspan;return(e=>{const t=E(e,(e=>sl(e).type)),o=D(t,"header"),n=D(t,"footer");if(o||n){const e=D(t,"body");return!o||e||n?o||e||!n?C.none():C.some("footer"):C.some("header")}return C.some("body")})(o.all.slice(n,r))})).getOr("")},ac=(e,t)=>e.dispatch("NewRow",{node:t}),cc=(e,t)=>e.dispatch("NewCell",{node:t}),ic=(e,t,o)=>{e.dispatch("TableModified",{...o,table:t})},mc={structure:!1,style:!0},dc={structure:!0,style:!1},uc={structure:!0,style:!0},fc=(e,t)=>Hr(e)?ur(t):$r(e)?dr(t):mr(t),gc=(e,t,o)=>{const n=e=>"table"===ne(Zr(e)),r=Wr(e),s=Ir(e)?f:Gs,l=t=>{switch(Mr(e)){case"section":return ul();case"sectionCells":return fl();case"cells":return gl();default:return((e,t)=>{var o;switch((o=Zo(e),V(o.all,(e=>{const t=sl(e);return"header"===t.type?C.from(t.subType):C.none()}))).getOr(t)){case"section":return il();case"sectionCells":return ml();case"cells":return dl()}})(t,"section")}},a=(n,s,a,c)=>(i,m,d=!1)=>{ts(i);const u=xe.fromDom(e.getDoc()),f=Br(a,u,r),g={sizing:fc(e,i),resize:Ir(e)?Zs():el(),section:l(i)};return s(i)?n(i,m,f,g).bind((n=>{t.refresh(i.dom),N(n.newRows,(t=>{ac(e,t.dom)})),N(n.newCells,(t=>{cc(e,t.dom)}));const r=((t,n)=>n.cursor.fold((()=>{const n=Ut(t);return H(n).filter(lt).map((n=>{o.clearSelectedCells(t.dom);const r=e.dom.createRng();return r.selectNode(n.dom),e.selection.setRng(r),ge(n,"data-mce-selected","1"),r}))}),(n=>{const r=qs(Us,n),s=e.dom.createRng();return s.setStart(r.element.dom,r.offset),s.setEnd(r.element.dom,r.offset),e.selection.setRng(s),o.clearSelectedCells(t.dom),C.some(s)})))(i,n);return lt(i)&&(ts(i),d||ic(e,i.dom,c)),r.map((e=>({rng:e,effect:c})))})):C.none()},c=a($a,(t=>!n(e)||tl(t).rows>1),f,dc),i=a(Ha,(t=>!n(e)||tl(t).columns>1),f,dc);return{deleteRow:c,deleteColumn:i,insertRowsBefore:a(ja,x,f,dc),insertRowsAfter:a(Pa,x,f,dc),insertColumnsBefore:a(Ia,x,s,dc),insertColumnsAfter:a(Fa,x,s,dc),mergeCells:a(Qa,x,f,dc),unmergeCells:a(Xa,x,f,dc),pasteColsBefore:a(ec,x,f,dc),pasteColsAfter:a(tc,x,f,dc),pasteRowsBefore:a(oc,x,f,dc),pasteRowsAfter:a(nc,x,f,dc),pasteCells:a(Za,x,f,uc),makeCellsHeader:a(Ya,x,f,dc),unmakeCellsHeader:a(Ja,x,f,dc),makeColumnsHeader:a(Va,x,f,dc),unmakeColumnsHeader:a(qa,x,f,dc),makeRowsHeader:a(Ua,x,f,dc),makeRowsBody:a(Ga,x,f,dc),makeRowsFooter:a(Ka,x,f,dc),getTableRowType:lc,getTableCellType:sc,getTableColType:rc}},hc=(e,t,o)=>{const n=Wt(e,t,1);1===o||n<=1?be(e,t):ge(e,t,Math.min(o,n))},pc=(e,t)=>o=>{const n=o.column+o.colspan-1,r=o.column;return n>=e&&r{const n=o.substring(0,o.length-e.length),r=parseFloat(n);return n===r.toString()?t(r):wc.invalid(o)},vc={...wc,from:e=>Rt(e,"%")?bc("%",wc.percent,e):Rt(e,"px")?bc("px",wc.pixels,e):wc.invalid(e)},yc=(e,t,o)=>{const n=vc.from(o),r=P(e,(e=>"0px"===e))?((e,t)=>{const o=e.fold((()=>g("")),(e=>g(e/t+"px")),(()=>g(100/t+"%")));return k(t,o)})(n,e.length):((e,t,o)=>e.fold((()=>t),(e=>((e,t,o)=>{const n=o/t;return E(e,(e=>vc.from(e).fold((()=>e),(e=>e*n+"px"),(e=>e/100*o+"px"))))})(t,o,e)),(e=>((e,t)=>E(e,(e=>vc.from(e).fold((()=>e),(e=>e/t*100+"%"),(e=>e+"%")))))(t,o))))(n,e,t);return Sc(r)},xc=(e,t)=>0===e.length?t:z(e,((e,t)=>vc.from(t).fold(g(0),h,h)+e),0),Cc=(e,t)=>vc.from(e).fold(g(e),(e=>e+t+"px"),(e=>e+t+"%")),Sc=e=>{if(0===e.length)return e;const t=z(e,((e,t)=>{const o=vc.from(t).fold((()=>({value:t,remainder:0})),(e=>((e,t)=>{const o=Math.floor(e);return{value:o+"px",remainder:e-o}})(e)),(e=>({value:e+"%",remainder:0})));return{output:[o.value].concat(e.output),remainder:e.remainder+o.remainder}}),{output:[],remainder:0}),o=t.output;return o.slice(0,o.length-1).concat([Cc(o[o.length-1],Math.round(t.remainder))])},Tc=vc.from,Rc=e=>Tc(e).fold(g("px"),g("px"),g("%")),Dc=(e,t,o)=>{const n=Zo(e),r=n.all,s=rn(n),l=sn(n);t.each((t=>{const o=Rc(t),r=Lo(e),a=((e,t)=>nr(e,t,er,rr))(n,e),c=yc(a,r,t);ln(n)?((e,t,o)=>{N(t,((t,n)=>{const r=xc([e[n]],Ft());Nt(t.element,"width",r+o)}))})(c,l,o):((e,t,o)=>{N(t,(t=>{const n=e.slice(t.column,t.colspan+t.column),r=xc(n,Ft());Nt(t.element,"width",r+o)}))})(c,s,o),Nt(e,"width",t)})),o.each((t=>{const o=Rc(t),l=hn(e),a=((e,t,o)=>lr(e,t,o,tr,rr))(n,e,_n);((e,t,o,n)=>{N(o,(t=>{const o=e.slice(t.row,t.rowspan+t.row),r=xc(o,Ht());Nt(t.element,"height",r+n)})),N(t,((t,o)=>{Nt(t.element,"height",e[o])}))})(yc(a,l,t),r,s,o),Nt(e,"height",t)}))},Oc=e=>Un(e).exists((e=>Mn.test(e))),kc=e=>Un(e).exists((e=>jn.test(e))),Ec=e=>Un(e).isNone(),Nc=e=>{be(e,"width")},Bc=e=>{const t=Qn(e);Dc(e,C.some(t),C.none()),Nc(e)},_c=e=>{const t=(e=>Lo(e)+"px")(e);Dc(e,C.some(t),C.none()),Nc(e)},zc=e=>{Lt(e,"width");const t=Gt(e),o=t.length>0?t:Ut(e);N(o,(e=>{Lt(e,"width"),Nc(e)})),Nc(e)},Ac={styles:{"border-collapse":"collapse",width:"100%"},attributes:{border:"1"},colGroups:!1},Lc=(e,t,o,n)=>k(e,(e=>((e,t,o,n)=>{const r=xe.fromTag("tr");for(let s=0;s{e.selection.select(t.dom,!0),e.selection.collapse(!0)},Mc=(e,t,o,n,s)=>{const l=(e=>{const t=e.options,o=t.get("table_default_styles");return t.isSet("table_default_styles")?o:((e,t)=>Vr(e)||!Ur(e)?t:$r(e)?{...t,width:Lr(e)}:{...t,width:Ar})(e,o)})(e),a={styles:l,attributes:Kr(e),colGroups:Yr(e)};return e.undoManager.ignore((()=>{const r=((e,t,o,n,r,s=Ac)=>{const l=xe.fromTag("table"),a="cells"!==r;Bt(l,s.styles),he(l,s.attributes),s.colGroups&&Ie(l,(e=>{const t=xe.fromTag("colgroup");return k(e,(()=>Ie(t,xe.fromTag("col")))),t})(t));const c=Math.min(e,o);if(a&&o>0){const e=xe.fromTag("thead");Ie(l,e);const s=Lc(o,t,"sectionCells"===r?c:0,n);$e(e,s)}const i=xe.fromTag("tbody");Ie(l,i);const m=Lc(a?e-c:e,t,a?0:o,n);return $e(i,m),l})(o,t,s,n,Mr(e),a);ge(r,"data-mce-id","__mce");const l=(e=>{const t=xe.fromTag("div"),o=xe.fromDom(e.dom.cloneNode(!0));return Ie(t,o),(e=>e.dom.innerHTML)(t)})(r);e.insertContent(l),e.addVisual()})),wt(Zr(e),'table[data-mce-id="__mce"]').map((t=>($r(e)?_c(t):Vr(e)?zc(t):(Hr(e)||(e=>r(e)&&-1!==e.indexOf("%"))(l.width))&&Bc(t),ts(t),be(t,"data-mce-id"),((e,t)=>{N(dt(t,"tr"),(t=>{ac(e,t.dom),N(dt(t,"th,td"),(t=>{cc(e,t.dom)}))}))})(e,t),((e,t)=>{wt(t,"td,th").each(w(Wc,e))})(e,t),t.dom))).getOrNull()};var jc=tinymce.util.Tools.resolve("tinymce.FakeClipboard");const Pc="x-tinymce/dom-table-",Ic=Pc+"rows",Fc=Pc+"columns",Hc=e=>{const t=jc.FakeClipboardItem(e);jc.write([t])},$c=e=>{var t;const o=null!==(t=jc.read())&&void 0!==t?t:[];return V(o,(t=>C.from(t.getType(e))))},Vc=e=>{$c(e).isSome()&&jc.clear()},qc=e=>{e.fold(Gc,(e=>Hc({[Ic]:e})))},Uc=()=>$c(Ic),Gc=()=>Vc(Ic),Kc=e=>{e.fold(Jc,(e=>Hc({[Fc]:e})))},Yc=()=>$c(Fc),Jc=()=>Vc(Fc),Qc=e=>Ms(os(e),es(e)).filter(ss),Xc=(e,t)=>{const o=es(e),n=e=>Kt(e,o),l=t=>(e=>js(os(e),es(e)).filter(ss))(e).bind((e=>n(e).map((o=>t(o,e))))),a=t=>{e.focus()},c=(t,o=!1)=>l(((n,r)=>{const s=Ls(Ps(e),n,r);t(n,s,o).each(a)})),i=()=>l(((t,o)=>((e,t,o)=>{const n=Zo(e);return Ol(n,t).bind((e=>{const t=xl(n,o,!1),r=qo(t).rows.slice(e[0].row,e[e.length-1].row+e[e.length-1].rowspan),s=j(r,(e=>{const t=_(e.cells,(e=>!e.isLocked));return t.length>0?[{...e,cells:t}]:[]})),l=Cl(s);return xt(l.length>0,l)})).map((e=>E(e,(e=>{const t=Ke(e.element);return N(e.cells,(e=>{const o=Ye(e.element);pl(o,"colspan",e.colspan,1),pl(o,"rowspan",e.rowspan,1),Ie(t,o)})),t}))))})(t,Ls(Ps(e),t,o),Br(f,xe.fromDom(e.getDoc()),C.none())))),m=()=>l(((t,o)=>((e,t)=>{const o=Zo(e);return kl(o,t).map((e=>{const t=e[e.length-1],n=e[0].column,r=t.column+t.colspan,s=((e,t,o)=>{if(ln(e)){const n=_(sn(e),pc(t,o)),r=E(n,(e=>{const n=Ye(e.element);return hc(n,"span",o-t),n})),s=xe.fromTag("colgroup");return $e(s,r),[s]}return[]})(o,n,r),l=((e,t,o)=>E(e.all,(e=>{const n=_(e.cells,pc(t,o)),r=E(n,(e=>{const n=Ye(e.element);return hc(n,"colspan",o-t),n})),s=xe.fromTag("tr");return $e(s,r),s})))(o,n,r);return[...s,...l]}))})(t,Ls(Ps(e),t,o)))),d=(t,o)=>o().each((o=>{const n=E(o,(e=>Ye(e)));l(((o,r)=>{const s=_r(xe.fromDom(e.getDoc())),l=((e,t,o,n)=>({selection:Os(e),clipboard:o,generators:n}))(Ps(e),0,n,s);t(o,l).each(a)}))})),g=e=>(t,o)=>((e,t)=>X(e,t)?C.from(e[t]):C.none())(o,"type").each((t=>{c(e(t),o.no_events)}));G({mceTableSplitCells:()=>c(t.unmergeCells),mceTableMergeCells:()=>c(t.mergeCells),mceTableInsertRowBefore:()=>c(t.insertRowsBefore),mceTableInsertRowAfter:()=>c(t.insertRowsAfter),mceTableInsertColBefore:()=>c(t.insertColumnsBefore),mceTableInsertColAfter:()=>c(t.insertColumnsAfter),mceTableDeleteCol:()=>c(t.deleteColumn),mceTableDeleteRow:()=>c(t.deleteRow),mceTableCutCol:()=>m().each((e=>{Kc(e),c(t.deleteColumn)})),mceTableCutRow:()=>i().each((e=>{qc(e),c(t.deleteRow)})),mceTableCopyCol:()=>m().each((e=>Kc(e))),mceTableCopyRow:()=>i().each((e=>qc(e))),mceTablePasteColBefore:()=>d(t.pasteColsBefore,Yc),mceTablePasteColAfter:()=>d(t.pasteColsAfter,Yc),mceTablePasteRowBefore:()=>d(t.pasteRowsBefore,Uc),mceTablePasteRowAfter:()=>d(t.pasteRowsAfter,Uc),mceTableDelete:()=>Qc(e).each((t=>{Kt(t,o).filter(b(o)).each((t=>{const o=xe.fromText("");if(je(t,o),qe(t),e.dom.isEmpty(e.getBody()))e.setContent(""),e.selection.setCursorLocation();else{const t=e.dom.createRng();t.setStart(o.dom,0),t.setEnd(o.dom,0),e.selection.setRng(t),e.nodeChanged()}}))})),mceTableCellToggleClass:(t,o)=>{l((t=>{const n=Ps(e),r=P(n,(t=>e.formatter.match("tablecellclass",{value:o},t.dom))),s=r?e.formatter.remove:e.formatter.apply;N(n,(e=>s("tablecellclass",{value:o},e.dom))),ic(e,t.dom,mc)}))},mceTableToggleClass:(t,o)=>{l((t=>{e.formatter.toggle("tableclass",{value:o},t.dom),ic(e,t.dom,mc)}))},mceTableToggleCaption:()=>{Qc(e).each((t=>{Kt(t,o).each((o=>{pt(o,"caption").fold((()=>{const t=xe.fromTag("caption");Ie(t,xe.fromText("Caption")),((e,t,o)=>{We(e,0).fold((()=>{Ie(e,t)}),(e=>{Me(e,t)}))})(o,t),e.selection.setCursorLocation(t.dom,0)}),(n=>{ue("caption")(t)&&Te("td",o).each((t=>e.selection.setCursorLocation(t.dom,0))),qe(n)})),ic(e,o.dom,dc)}))}))},mceTableSizingMode:(t,n)=>(t=>Qc(e).each((n=>{Vr(e)||$r(e)||Hr(e)||Kt(n,o).each((o=>{"relative"!==t||Oc(o)?"fixed"!==t||kc(o)?"responsive"!==t||Ec(o)||zc(o):_c(o):Bc(o),ts(o),ic(e,o.dom,dc)}))})))(n),mceTableCellType:g((e=>"th"===e?t.makeCellsHeader:t.unmakeCellsHeader)),mceTableColType:g((e=>"th"===e?t.makeColumnsHeader:t.unmakeColumnsHeader)),mceTableRowType:g((e=>{switch(e){case"header":return t.makeRowsHeader;case"footer":return t.makeRowsFooter;default:return t.makeRowsBody}}))},((t,o)=>e.addCommand(o,t))),e.addCommand("mceInsertTable",((t,o)=>{((e,t,o,n={})=>{const r=e=>u(e)&&e>0;if(r(t)&&r(o)){const r=n.headerRows||0,s=n.headerColumns||0;return Mc(e,o,t,s,r)}console.error("Invalid values for mceInsertTable - rows and columns values are required to insert a table.")})(e,o.rows,o.columns,o.options)})),e.addCommand("mceTableApplyCellStyle",((t,o)=>{const l=e=>"tablecell"+e.toLowerCase().replace("-","");if(!s(o))return;const a=_(Ps(e),ss);if(0===a.length)return;const c=((e,t)=>{const o={};return((e,t,o,n)=>{G(e,((e,r)=>{(t(e,r)?o:n)(e,r)}))})(e,t,(e=>(t,o)=>{e[o]=t})(o),f),o})(o,((t,o)=>e.formatter.has(l(o))&&r(t)));(e=>{for(const t in e)if(U.call(e,t))return!1;return!0})(c)||(G(c,((t,o)=>{const n=l(o);N(a,(o=>{""===t?e.formatter.remove(n,{value:null},o.dom,!0):e.formatter.apply(n,{value:t},o.dom)}))})),n(a[0]).each((t=>ic(e,t.dom,mc))))}))},Zc=Zl([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),ei={before:Zc.before,on:Zc.on,after:Zc.after,cata:(e,t,o,n)=>e.fold(t,o,n),getStart:e=>e.fold(h,h,h)},ti=(e,t)=>({selection:e,kill:t}),oi=(e,t)=>{const o=e.document.createRange();return o.selectNode(t.dom),o},ni=(e,t)=>{const o=e.document.createRange();return ri(o,t),o},ri=(e,t)=>e.selectNodeContents(t.dom),si=(e,t,o)=>{const n=e.document.createRange();var r;return r=n,t.fold((e=>{r.setStartBefore(e.dom)}),((e,t)=>{r.setStart(e.dom,t)}),(e=>{r.setStartAfter(e.dom)})),((e,t)=>{t.fold((t=>{e.setEndBefore(t.dom)}),((t,o)=>{e.setEnd(t.dom,o)}),(t=>{e.setEndAfter(t.dom)}))})(n,o),n},li=(e,t,o,n,r)=>{const s=e.document.createRange();return s.setStart(t.dom,o),s.setEnd(n.dom,r),s},ai=e=>({left:e.left,top:e.top,right:e.right,bottom:e.bottom,width:e.width,height:e.height}),ci=Zl([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]),ii=(e,t,o)=>t(xe.fromDom(o.startContainer),o.startOffset,xe.fromDom(o.endContainer),o.endOffset),mi=(e,t)=>{const o=((e,t)=>t.match({domRange:e=>({ltr:g(e),rtl:C.none}),relative:(t,o)=>({ltr:eo((()=>si(e,t,o))),rtl:eo((()=>C.some(si(e,o,t))))}),exact:(t,o,n,r)=>({ltr:eo((()=>li(e,t,o,n,r))),rtl:eo((()=>C.some(li(e,n,r,t,o))))})}))(e,t);return((e,t)=>{const o=t.ltr();return o.collapsed?t.rtl().filter((e=>!1===e.collapsed)).map((e=>ci.rtl(xe.fromDom(e.endContainer),e.endOffset,xe.fromDom(e.startContainer),e.startOffset))).getOrThunk((()=>ii(0,ci.ltr,o))):ii(0,ci.ltr,o)})(0,o)},di=(e,t)=>mi(e,t).match({ltr:(t,o,n,r)=>{const s=e.document.createRange();return s.setStart(t.dom,o),s.setEnd(n.dom,r),s},rtl:(t,o,n,r)=>{const s=e.document.createRange();return s.setStart(n.dom,r),s.setEnd(t.dom,o),s}});ci.ltr,ci.rtl;const ui=(e,t,o,n)=>({start:e,soffset:t,finish:o,foffset:n}),fi=(e,t,o,n)=>({start:ei.on(e,t),finish:ei.on(o,n)}),gi=(e,t)=>{const o=di(e,t);return ui(xe.fromDom(o.startContainer),o.startOffset,xe.fromDom(o.endContainer),o.endOffset)},hi=fi,pi=(e,t,o,n,r)=>Re(o,n)?C.none():xs(o,n,t).bind((t=>{const n=t.boxes.getOr([]);return n.length>1?(r(e,n,t.start,t.finish),C.some(ti(C.some(hi(o,0,o,br(o))),!0))):C.none()})),wi=(e,t)=>({item:e,mode:t}),bi=(e,t,o,n=vi)=>e.property().parent(t).map((e=>wi(e,n))),vi=(e,t,o,n=yi)=>o.sibling(e,t).map((e=>wi(e,n))),yi=(e,t,o,n=yi)=>{const r=e.property().children(t);return o.first(r).map((e=>wi(e,n)))},xi=[{current:bi,next:vi,fallback:C.none()},{current:vi,next:yi,fallback:C.some(bi)},{current:yi,next:yi,fallback:C.some(vi)}],Ci=(e,t,o,n,r=xi)=>L(r,(e=>e.current===o)).bind((o=>o.current(e,t,n,o.next).orThunk((()=>o.fallback.bind((o=>Ci(e,t,o,n))))))),Si=(e,t,o,n,r,s)=>Ci(e,t,n,r).bind((t=>s(t.item)?C.none():o(t.item)?C.some(t.item):Si(e,t.item,o,t.mode,r,s))),Ti=e=>t=>0===e.property().children(t).length,Ri=(e,t,o,n)=>Si(e,t,o,vi,{sibling:(e,t)=>e.query().prevSibling(t),first:e=>e.length>0?C.some(e[e.length-1]):C.none()},n),Di=(e,t,o,n)=>Si(e,t,o,vi,{sibling:(e,t)=>e.query().nextSibling(t),first:e=>e.length>0?C.some(e[0]):C.none()},n),Oi=hs(),ki=(e,t)=>((e,t,o)=>Ri(e,t,Ti(e),o))(Oi,e,t),Ei=(e,t)=>((e,t,o)=>Di(e,t,Ti(e),o))(Oi,e,t),Ni=Zl([{none:["message"]},{success:[]},{failedUp:["cell"]},{failedDown:["cell"]}]),Bi=e=>bt(e,"tr"),_i={...Ni,verify:(e,t,o,n,r,s,l)=>bt(n,"td,th",l).bind((o=>bt(t,"td,th",l).map((t=>Re(o,t)?Re(n,o)&&br(o)===r?s(t):Ni.none("in same cell"):vs(Bi,[o,t]).fold((()=>((e,t,o)=>{const n=e.getRect(t),r=e.getRect(o);return r.right>n.left&&r.lefts(t))))))).getOr(Ni.none("default")),cata:(e,t,o,n,r)=>e.fold(t,o,n,r)},zi=ue("br"),Ai=(e,t,o)=>t(e,o).bind((e=>ie(e)&&0===hr(e).trim().length?Ai(e,t,o):C.some(e))),Li=(e,t,o,n)=>((e,t)=>We(e,t).filter(zi).orThunk((()=>We(e,t-1).filter(zi))))(t,o).bind((t=>n.traverse(t).fold((()=>Ai(t,n.gather,e).map(n.relative)),(e=>(e=>Ne(e).bind((t=>{const o=Le(t);return((e,t)=>W(e,w(Re,t)))(o,e).map((n=>((e,t,o,n)=>({parent:e,children:t,element:o,index:n}))(t,o,e,n)))})))(e).map((e=>ei.on(e.parent,e.index))))))),Wi=(e,t)=>({left:e.left,top:e.top+t,right:e.right,bottom:e.bottom+t}),Mi=(e,t)=>({left:e.left,top:e.top-t,right:e.right,bottom:e.bottom-t}),ji=(e,t,o)=>({left:e.left+t,top:e.top+o,right:e.right+t,bottom:e.bottom+o}),Pi=e=>({left:e.left,top:e.top,right:e.right,bottom:e.bottom}),Ii=(e,t)=>C.some(e.getRect(t)),Fi=(e,t,o)=>ce(t)?Ii(e,t).map(Pi):ie(t)?((e,t,o)=>o>=0&&o0?e.getRangedRect(t,o-1,t,o):C.none())(e,t,o).map(Pi):C.none(),Hi=(e,t)=>ce(t)?Ii(e,t).map(Pi):ie(t)?e.getRangedRect(t,0,t,br(t)).map(Pi):C.none(),$i=Zl([{none:[]},{retry:["caret"]}]),Vi=(e,t,o)=>gt(t,pa).fold(y,(t=>Hi(e,t).exists((e=>((e,t)=>e.leftt.right)(o,e))))),qi={point:e=>e.bottom,adjuster:(e,t,o,n,r)=>{const s=Wi(r,5);return Math.abs(o.bottom-n.bottom)<1||o.top>r.bottom?$i.retry(s):o.top===r.bottom?$i.retry(Wi(r,1)):Vi(e,t,r)?$i.retry(ji(s,5,0)):$i.none()},move:Wi,gather:Ei},Ui=(e,t,o,n,r)=>0===r?C.some(n):((e,t,o)=>e.elementFromPoint(t,o).filter((e=>"table"===ne(e))).isSome())(e,n.left,t.point(n))?((e,t,o,n,r)=>Ui(e,t,o,t.move(n,5),r))(e,t,o,n,r-1):e.situsFromPoint(n.left,t.point(n)).bind((s=>s.start.fold(C.none,(s=>Hi(e,s).bind((l=>t.adjuster(e,s,l,o,n).fold(C.none,(n=>Ui(e,t,o,n,r-1))))).orThunk((()=>C.some(n)))),C.none))),Gi=(e,t,o)=>{const n=e.move(o,5),r=Ui(t,e,o,n,100).getOr(n);return((e,t,o)=>e.point(t)>o.getInnerHeight()?C.some(e.point(t)-o.getInnerHeight()):e.point(t)<0?C.some(-e.point(t)):C.none())(e,r,t).fold((()=>t.situsFromPoint(r.left,e.point(r))),(o=>(t.scrollBy(0,o),t.situsFromPoint(r.left,e.point(r)-o))))},Ki={tryUp:w(Gi,{point:e=>e.top,adjuster:(e,t,o,n,r)=>{const s=Mi(r,5);return Math.abs(o.top-n.top)<1||o.bottome.getSelection().bind((n=>((e,t,o,n)=>{const r=zi(t)?((e,t,o)=>o.traverse(t).orThunk((()=>Ai(t,o.gather,e))).map(o.relative))(e,t,n):Li(e,t,o,n);return r.map((e=>({start:e,finish:e})))})(t,n.finish,n.foffset,o).fold((()=>C.some(Fs(n.finish,n.foffset))),(r=>{const s=e.fromSitus(r);return l=_i.verify(e,n.finish,n.foffset,s.finish,s.foffset,o.failure,t),_i.cata(l,(e=>C.none()),(()=>C.none()),(e=>C.some(Fs(e,0))),(e=>C.some(Fs(e,br(e)))));var l})))),Ji=(e,t,o,n,r,s)=>0===s?C.none():Zi(e,t,o,n,r).bind((l=>{const a=e.fromSitus(l),c=_i.verify(e,o,n,a.finish,a.foffset,r.failure,t);return _i.cata(c,(()=>C.none()),(()=>C.some(l)),(l=>Re(o,l)&&0===n?Qi(e,o,n,Mi,r):Ji(e,t,l,0,r,s-1)),(l=>Re(o,l)&&n===br(l)?Qi(e,o,n,Wi,r):Ji(e,t,l,br(l),r,s-1)))})),Qi=(e,t,o,n,r)=>Fi(e,t,o).bind((t=>Xi(e,r,n(t,Ki.getJumpSize())))),Xi=(e,t,o)=>{const n=Bo().browser;return n.isChromium()||n.isSafari()||n.isFirefox()?t.retry(e,o):C.none()},Zi=(e,t,o,n,r)=>Fi(e,o,n).bind((t=>Xi(e,r,t))),em=(e,t,o,n,r)=>bt(n,"td,th",t).bind((n=>bt(n,"table",t).bind((s=>((e,t)=>ft(e,(e=>Ne(e).exists((e=>Re(e,t)))),void 0).isSome())(r,s)?((e,t,o)=>Yi(e,t,o).bind((n=>Ji(e,t,n.element,n.offset,o,20).map(e.fromSitus))))(e,t,o).bind((e=>bt(e.finish,"td,th",t).map((t=>({start:n,finish:t,range:e}))))):C.none())))),tm=(e,t,o,n,r,s)=>s(n,t).orThunk((()=>em(e,t,o,n,r).map((e=>{const t=e.range;return ti(C.some(hi(t.start,t.soffset,t.finish,t.foffset)),!0)})))),om=(e,t)=>bt(e,"tr",t).bind((e=>bt(e,"table",t).bind((o=>{const n=dt(o,"tr");return Re(e,n[0])?((e,t,o)=>Ri(Oi,e,(e=>Cr(e).isSome()),o))(o,0,t).map((e=>{const t=br(e);return ti(C.some(hi(e,t,e,t)),!0)})):C.none()})))),nm=(e,t)=>bt(e,"tr",t).bind((e=>bt(e,"table",t).bind((o=>{const n=dt(o,"tr");return Re(e,n[n.length-1])?((e,t,o)=>Di(Oi,e,(e=>xr(e).isSome()),o))(o,0,t).map((e=>ti(C.some(hi(e,0,e,0)),!0))):C.none()})))),rm=(e,t,o,n,r,s,l)=>em(e,o,n,r,s).bind((e=>pi(t,o,e.start,e.finish,l))),sm=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},lm=()=>{const e=(e=>{const t=sm(C.none()),o=()=>t.get().each(e);return{clear:()=>{o(),t.set(C.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{o(),t.set(C.some(e))}}})(f);return{...e,on:t=>e.get().each(t)}},am=(e,t)=>bt(e,"td,th",t),cm=e=>Be(e).exists(Qr),im={traverse:Ae,gather:Ei,relative:ei.before,retry:Ki.tryDown,failure:_i.failedDown},mm={traverse:ze,gather:ki,relative:ei.before,retry:Ki.tryUp,failure:_i.failedUp},dm=e=>t=>t===e,um=dm(38),fm=dm(40),gm=e=>e>=37&&e<=40,hm={isBackward:dm(37),isForward:dm(39)},pm={isBackward:dm(39),isForward:dm(37)},wm=Zl([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),bm={domRange:wm.domRange,relative:wm.relative,exact:wm.exact,exactFromRange:e=>wm.exact(e.start,e.soffset,e.finish,e.foffset),getWin:e=>{const t=(e=>e.match({domRange:e=>xe.fromDom(e.startContainer),relative:(e,t)=>ei.getStart(e),exact:(e,t,o,n)=>e}))(e);return xe.fromDom(Ee(t).dom.defaultView)},range:ui},vm=document.caretPositionFromPoint?(e,t,o)=>{var n,r;return C.from(null===(r=(n=e.dom).caretPositionFromPoint)||void 0===r?void 0:r.call(n,t,o)).bind((t=>{if(null===t.offsetNode)return C.none();const o=e.dom.createRange();return o.setStart(t.offsetNode,t.offset),o.collapse(),C.some(o)}))}:document.caretRangeFromPoint?(e,t,o)=>{var n,r;return C.from(null===(r=(n=e.dom).caretRangeFromPoint)||void 0===r?void 0:r.call(n,t,o))}:C.none,ym=(e,t)=>{const o=ne(e);return"input"===o?ei.after(e):D(["br","img"],o)?0===t?ei.before(e):ei.after(e):ei.on(e,t)},xm=e=>C.from(e.getSelection()),Cm=(e,t)=>{xm(e).each((e=>{e.removeAllRanges(),e.addRange(t)}))},Sm=(e,t,o,n,r)=>{const s=li(e,t,o,n,r);Cm(e,s)},Tm=(e,t)=>mi(e,t).match({ltr:(t,o,n,r)=>{Sm(e,t,o,n,r)},rtl:(t,o,n,r)=>{xm(e).each((s=>{if(s.setBaseAndExtent)s.setBaseAndExtent(t.dom,o,n.dom,r);else if(s.extend)try{((e,t,o,n,r,s)=>{t.collapse(o.dom,n),t.extend(r.dom,s)})(0,s,t,o,n,r)}catch(s){Sm(e,n,r,t,o)}else Sm(e,n,r,t,o)}))}}),Rm=(e,t,o,n,r)=>{const s=((e,t,o,n)=>{const r=ym(e,t),s=ym(o,n);return bm.relative(r,s)})(t,o,n,r);Tm(e,s)},Dm=(e,t,o)=>{const n=((e,t)=>{const o=e.fold(ei.before,ym,ei.after),n=t.fold(ei.before,ym,ei.after);return bm.relative(o,n)})(t,o);Tm(e,n)},Om=e=>{if(e.rangeCount>0){const t=e.getRangeAt(0),o=e.getRangeAt(e.rangeCount-1);return C.some(ui(xe.fromDom(t.startContainer),t.startOffset,xe.fromDom(o.endContainer),o.endOffset))}return C.none()},km=e=>{if(null===e.anchorNode||null===e.focusNode)return Om(e);{const t=xe.fromDom(e.anchorNode),o=xe.fromDom(e.focusNode);return((e,t,o,n)=>{const r=((e,t,o,n)=>{const r=ke(e).dom.createRange();return r.setStart(e.dom,t),r.setEnd(o.dom,n),r})(e,t,o,n),s=Re(e,o)&&t===n;return r.collapsed&&!s})(t,e.anchorOffset,o,e.focusOffset)?C.some(ui(t,e.anchorOffset,o,e.focusOffset)):Om(e)}},Em=(e,t,o=!0)=>{const n=(o?ni:oi)(e,t);Cm(e,n)},Nm=e=>(e=>xm(e).filter((e=>e.rangeCount>0)).bind(km))(e).map((e=>bm.exact(e.start,e.soffset,e.finish,e.foffset))),Bm=e=>({elementFromPoint:(t,o)=>xe.fromPoint(xe.fromDom(e.document),t,o),getRect:e=>e.dom.getBoundingClientRect(),getRangedRect:(t,o,n,r)=>{const s=bm.exact(t,o,n,r);return((e,t)=>(e=>{const t=e.getClientRects(),o=t.length>0?t[0]:e.getBoundingClientRect();return o.width>0||o.height>0?C.some(o).map(ai):C.none()})(di(e,t)))(e,s)},getSelection:()=>Nm(e).map((t=>gi(e,t))),fromSitus:t=>{const o=bm.relative(t.start,t.finish);return gi(e,o)},situsFromPoint:(t,o)=>((e,t,o)=>((e,t,o)=>{const n=xe.fromDom(e.document);return vm(n,t,o).map((e=>ui(xe.fromDom(e.startContainer),e.startOffset,xe.fromDom(e.endContainer),e.endOffset)))})(e,t,o))(e,t,o).map((e=>fi(e.start,e.soffset,e.finish,e.foffset))),clearSelection:()=>{(e=>{xm(e).each((e=>e.removeAllRanges()))})(e)},collapseSelection:(t=!1)=>{Nm(e).each((o=>o.fold((e=>e.collapse(t)),((o,n)=>{const r=t?o:n;Dm(e,r,r)}),((o,n,r,s)=>{const l=t?o:r,a=t?n:s;Rm(e,l,a,l,a)}))))},setSelection:t=>{Rm(e,t.start,t.soffset,t.finish,t.foffset)},setRelativeSelection:(t,o)=>{Dm(e,t,o)},selectNode:t=>{Em(e,t,!1)},selectContents:t=>{Em(e,t)},getInnerHeight:()=>e.innerHeight,getScrollY:()=>(e=>{const t=void 0!==e?e.dom:document,o=t.body.scrollLeft||t.documentElement.scrollLeft,n=t.body.scrollTop||t.documentElement.scrollTop;return bn(o,n)})(xe.fromDom(e.document)).top,scrollBy:(t,o)=>{((e,t,o)=>{const n=(void 0!==o?o.dom:document).defaultView;n&&n.scrollBy(e,t)})(t,o,xe.fromDom(e.document))}}),_m=(e,t)=>({rows:e,cols:t}),zm=e=>gt(e,ae).exists(Qr),Am=(e,t)=>zm(e)||zm(t),Lm=e=>void 0!==e.dom.classList,Wm=(e,t)=>((e,t,o)=>{const n=((e,t)=>{const o=pe(e,t);return void 0===o||""===o?[]:o.split(" ")})(e,t).concat([o]);return ge(e,t,n.join(" ")),!0})(e,"class",t),Mm=(e,t)=>{Lm(e)?e.dom.classList.add(t):Wm(e,t)},jm=(e,t)=>Lm(e)&&e.dom.classList.contains(t),Pm=()=>({tag:"none"}),Im=e=>({tag:"multiple",elements:e}),Fm=e=>({tag:"single",element:e}),Hm=e=>{const t=xe.fromDom((e=>{if(nt()&&m(e.target)){const t=xe.fromDom(e.target);if(ce(t)&&m(t.dom.shadowRoot)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return H(t)}}return C.from(e.target)})(e).getOr(e.target)),o=()=>e.stopPropagation(),n=()=>e.preventDefault(),r=(s=n,l=o,(...e)=>s(l.apply(null,e)));var s,l;return((e,t,o,n,r,s,l)=>({target:e,x:t,y:o,stop:n,prevent:r,kill:s,raw:l}))(t,e.clientX,e.clientY,o,n,r,e)},$m=(e,t,o,n)=>{e.dom.removeEventListener(t,o,n)},Vm=x,qm=(e,t,o)=>((e,t,o,n)=>((e,t,o,n,r)=>{const s=((e,t)=>o=>{e(o)&&t(Hm(o))})(o,n);return e.dom.addEventListener(t,s,r),{unbind:w($m,e,t,s,r)}})(e,t,o,n,!1))(e,t,Vm,o),Um=Hm,Gm=e=>!jm(xe.fromDom(e.target),"ephox-snooker-resizer-bar"),Km=(e,t)=>{const o=(r=As.selectedSelector,{get:()=>Rs(xe.fromDom(e.getBody()),r).fold((()=>js(os(e),es(e)).fold(Pm,Fm)),Im)}),n=((e,t,o)=>{const n=t=>{be(t,e.selected),be(t,e.firstSelected),be(t,e.lastSelected)},r=t=>{ge(t,e.selected,"1")},s=e=>{l(e),o()},l=t=>{const o=dt(t,`${e.selectedSelector},${e.firstSelectedSelector},${e.lastSelectedSelector}`);N(o,n)};return{clearBeforeUpdate:l,clear:s,selectRange:(o,n,l,a)=>{s(o),N(n,r),ge(l,e.firstSelected,"1"),ge(a,e.lastSelected,"1"),t(n,l,a)},selectedSelector:e.selectedSelector,firstSelectedSelector:e.firstSelectedSelector,lastSelectedSelector:e.lastSelectedSelector}})(As,((t,o,n)=>{Kt(o).each((r=>{const s=Wr(e),l=Br(f,xe.fromDom(e.getDoc()),s),a=((e,t,o)=>{const n=Zo(e);return Ol(n,t).map((e=>{const t=xl(n,o,!1),{rows:r}=qo(t),s=((e,t)=>{const o=e.slice(0,t[t.length-1].row+1),n=Cl(o);return j(n,(e=>{const o=e.cells.slice(0,t[t.length-1].column+1);return E(o,(e=>e.element))}))})(r,e),l=((e,t)=>{const o=e.slice(t[0].row+t[0].rowspan-1,e.length),n=Cl(o);return j(n,(e=>{const o=e.cells.slice(t[0].column+t[0].colspan-1,e.cells.length);return E(o,(e=>e.element))}))})(r,e);return{upOrLeftCells:s,downOrRightCells:l}}))})(r,{selection:Ps(e)},l);((e,t,o,n,r)=>{e.dispatch("TableSelectionChange",{cells:t,start:o,finish:n,otherCells:r})})(e,t,o,n,a)}))}),(()=>(e=>{e.dispatch("TableSelectionClear")})(e)));var r;return e.on("init",(o=>{const r=e.getWin(),s=Zr(e),l=es(e),a=((e,t,o,n)=>{const r=((e,t,o,n)=>{const r=lm(),s=r.clear,l=s=>{r.on((r=>{n.clearBeforeUpdate(t),am(s.target,o).each((l=>{xs(r,l,o).each((o=>{const r=o.boxes.getOr([]);if(1===r.length){const o=r[0],l="false"===Xr(o),a=vt(Jr(s.target),o,Re);l&&a&&(n.selectRange(t,r,o,o),e.selectContents(o))}else r.length>1&&(n.selectRange(t,r,o.start,o.finish),e.selectContents(l))}))}))}))};return{clearstate:s,mousedown:e=>{n.clear(t),am(e.target,o).filter(cm).each(r.set)},mouseover:e=>{l(e)},mouseup:e=>{l(e),s()}}})(Bm(e),t,o,n);return{clearstate:r.clearstate,mousedown:r.mousedown,mouseover:r.mouseover,mouseup:r.mouseup}})(r,s,l,n),c=((e,t,o,n)=>{const r=Bm(e),s=()=>(n.clear(t),C.none());return{keydown:(e,l,a,c,i,m)=>{const d=e.raw,u=d.which,f=!0===d.shiftKey,g=Cs(t,n.selectedSelector).fold((()=>(gm(u)&&!f&&n.clearBeforeUpdate(t),gm(u)&&f&&!Am(l,c)?C.none:fm(u)&&f?w(rm,r,t,o,im,c,l,n.selectRange):um(u)&&f?w(rm,r,t,o,mm,c,l,n.selectRange):fm(u)?w(tm,r,o,im,c,l,nm):um(u)?w(tm,r,o,mm,c,l,om):C.none)),(e=>{const o=o=>()=>{const s=V(o,(o=>((e,t,o,n,r)=>Ts(n,e,t,r.firstSelectedSelector,r.lastSelectedSelector).map((e=>(r.clearBeforeUpdate(o),r.selectRange(o,e.boxes,e.start,e.finish),e.boxes))))(o.rows,o.cols,t,e,n)));return s.fold((()=>Ss(t,n.firstSelectedSelector,n.lastSelectedSelector).map((e=>{const o=fm(u)||m.isForward(u)?ei.after:ei.before;return r.setRelativeSelection(ei.on(e.first,0),o(e.table)),n.clear(t),ti(C.none(),!0)}))),(e=>C.some(ti(C.none(),!0))))};return gm(u)&&f&&!Am(l,c)?C.none:fm(u)&&f?o([_m(1,0)]):um(u)&&f?o([_m(-1,0)]):m.isBackward(u)&&f?o([_m(0,-1),_m(-1,0)]):m.isForward(u)&&f?o([_m(0,1),_m(1,0)]):gm(u)&&!f?s:C.none}));return g()},keyup:(e,r,s,l,a)=>Cs(t,n.selectedSelector).fold((()=>{const c=e.raw,i=c.which;return!0===c.shiftKey&&gm(i)&&Am(r,l)?((e,t,o,n,r,s,l)=>Re(o,r)&&n===s?C.none():bt(o,"td,th",t).bind((o=>bt(r,"td,th",t).bind((n=>pi(e,t,o,n,l))))))(t,o,r,s,l,a,n.selectRange):C.none()}),C.none)}})(r,s,l,n),i=((e,t,o,n)=>{const r=Bm(e);return(e,s)=>{n.clearBeforeUpdate(t),xs(e,s,o).each((e=>{const o=e.boxes.getOr([]);n.selectRange(t,o,e.start,e.finish),r.selectContents(s),r.collapseSelection()}))}})(r,s,l,n);e.on("TableSelectorChange",(e=>i(e.start,e.finish)));const m=(t,o)=>{(e=>!0===e.raw.shiftKey)(t)&&(o.kill&&t.kill(),o.selection.each((t=>{const o=bm.relative(t.start,t.finish),n=di(r,o);e.selection.setRng(n)})))},d=e=>0===e.button,u=(()=>{const e=sm(xe.fromDom(s)),t=sm(0);return{touchEnd:o=>{const n=xe.fromDom(o.target);if(ue("td")(n)||ue("th")(n)){const r=e.get(),s=t.get();Re(r,n)&&o.timeStamp-s<300&&(o.preventDefault(),i(n,n))}e.set(n),t.set(o.timeStamp)}}})();e.on("dragstart",(e=>{a.clearstate()})),e.on("mousedown",(e=>{d(e)&&Gm(e)&&a.mousedown(Um(e))})),e.on("mouseover",(e=>{var t;void 0!==(t=e).buttons&&0==(1&t.buttons)||!Gm(e)||a.mouseover(Um(e))})),e.on("mouseup",(e=>{d(e)&&Gm(e)&&a.mouseup(Um(e))})),e.on("touchend",u.touchEnd),e.on("keyup",(t=>{const o=Um(t);if(o.raw.shiftKey&&gm(o.raw.which)){const t=e.selection.getRng(),n=xe.fromDom(t.startContainer),r=xe.fromDom(t.endContainer);c.keyup(o,n,t.startOffset,r,t.endOffset).each((e=>{m(o,e)}))}})),e.on("keydown",(o=>{const n=Um(o);t.hide();const r=e.selection.getRng(),s=xe.fromDom(r.startContainer),l=xe.fromDom(r.endContainer),a=un(hm,pm)(xe.fromDom(e.selection.getStart()));c.keydown(n,s,r.startOffset,l,r.endOffset,a).each((e=>{m(n,e)})),t.show()})),e.on("NodeChange",(()=>{const t=e.selection,o=xe.fromDom(t.getStart()),r=xe.fromDom(t.getEnd());vs(Kt,[o,r]).fold((()=>n.clear(s)),f)}))})),e.on("PreInit",(()=>{e.serializer.addTempAttr(As.firstSelected),e.serializer.addTempAttr(As.lastSelected)})),{getSelectedCells:()=>((e,t,o,n)=>{switch(e.tag){case"none":return t();case"single":return(e=>[e.dom])(e.element);case"multiple":return(e=>E(e,(e=>e.dom)))(e.elements)}})(o.get(),g([])),clearSelectedCells:e=>n.clear(xe.fromDom(e))}},Ym=e=>{let t=[];return{bind:e=>{if(void 0===e)throw new Error("Event bind error: undefined handler");t.push(e)},unbind:e=>{t=_(t,(t=>t!==e))},trigger:(...o)=>{const n={};N(e,((e,t)=>{n[e]=o[t]})),N(t,(e=>{e(n)}))}}},Jm=e=>({registry:K(e,(e=>({bind:e.bind,unbind:e.unbind}))),trigger:K(e,(e=>e.trigger))}),Qm=e=>e.slice(0).sort(),Xm=(e,t)=>{const o=_(t,(t=>!D(e,t)));o.length>0&&(e=>{throw new Error("Unsupported keys for object: "+Qm(e).join(", "))})(o)},Zm=e=>((e,t)=>((e,t,o)=>{if(0===t.length)throw new Error("You must specify at least one required field.");return((e,t)=>{if(!l(t))throw new Error("The "+e+" fields must be an array. Was: "+t+".");N(t,(t=>{if(!r(t))throw new Error("The value "+t+" in the "+e+" fields was not a string.")}))})("required",t),(e=>{const t=Qm(e);L(t,((e,o)=>o{throw new Error("The field: "+e+" occurs more than once in the combined fields: ["+t.join(", ")+"].")}))})(t),n=>{const r=q(n);P(t,(e=>D(r,e)))||((e,t)=>{throw new Error("All required keys ("+Qm(e).join(", ")+") were not specified. Specified keys were: "+Qm(t).join(", ")+".")})(t,r),e(t,r);const s=_(t,(e=>!o.validate(n[e],e)));return s.length>0&&((e,t)=>{throw new Error("All values need to be of type: "+t+". Keys ("+Qm(e).join(", ")+") were not.")})(s,o.label),n}})(e,t,{validate:d,label:"function"}))(Xm,e),ed=Zm(["compare","extract","mutate","sink"]),td=Zm(["element","start","stop","destroy"]),od=Zm(["forceDrop","drop","move","delayDrop"]),nd=()=>{const e=(()=>{const e=Jm({move:Ym(["info"])});return{onEvent:f,reset:f,events:e.registry}})(),t=(()=>{let e=C.none();const t=Jm({move:Ym(["info"])});return{onEvent:(o,n)=>{n.extract(o).each((o=>{const r=((t,o)=>{const n=e.map((e=>t.compare(e,o)));return e=C.some(o),n})(n,o);r.each((e=>{t.trigger.move(e)}))}))},reset:()=>{e=C.none()},events:t.registry}})();let o=e;return{on:()=>{o.reset(),o=t},off:()=>{o.reset(),o=e},isOn:()=>o===t,onEvent:(e,t)=>{o.onEvent(e,t)},events:t.events}},rd=e=>{const t=e.replace(/\./g,"-");return{resolve:e=>t+"-"+e}},sd=rd("ephox-dragster").resolve;var ld=ed({compare:(e,t)=>bn(t.left-e.left,t.top-e.top),extract:e=>C.some(bn(e.x,e.y)),sink:(e,t)=>{const o=(e=>{const t={layerClass:sd("blocker"),...e},o=xe.fromTag("div");return ge(o,"role","presentation"),Bt(o,{position:"fixed",left:"0px",top:"0px",width:"100%",height:"100%"}),Mm(o,sd("blocker")),Mm(o,t.layerClass),{element:g(o),destroy:()=>{qe(o)}}})(t),n=qm(o.element(),"mousedown",e.forceDrop),r=qm(o.element(),"mouseup",e.drop),s=qm(o.element(),"mousemove",e.move),l=qm(o.element(),"mouseout",e.delayDrop);return td({element:o.element,start:e=>{Ie(e,o.element())},stop:()=>{qe(o.element())},destroy:()=>{o.destroy(),r.unbind(),s.unbind(),l.unbind(),n.unbind()}})},mutate:(e,t)=>{e.mutate(t.left,t.top)}});const ad=rd("ephox-snooker").resolve,cd=ad("resizer-bar"),id=ad("resizer-rows"),md=ad("resizer-cols"),dd=e=>{const t=dt(e.parent(),"."+cd);N(t,qe)},ud=(e,t,o)=>{const n=e.origin();N(t,(t=>{t.each((t=>{const r=o(n,t);Mm(r,cd),Ie(e.parent(),r)}))}))},fd=(e,t,o,n,r)=>{const s=yn(o),l=t.isResizable,a=n.length>0?_n.positions(n,o):[],c=a.length>0?((e,t)=>j(e.all,((e,o)=>t(e.element)?[o]:[])))(e,l):[];((e,t,o,n)=>{ud(e,t,((e,t)=>{const r=((e,t,o,n,r)=>{const s=xe.fromTag("div");return Bt(s,{position:"absolute",left:t+"px",top:o-3.5+"px",height:"7px",width:n+"px"}),he(s,{"data-row":e,role:"presentation"}),s})(t.row,o.left-e.left,t.y-e.top,n);return Mm(r,id),r}))})(t,_(a,((e,t)=>O(c,(e=>t===e)))),s,Wo(o));const i=r.length>0?An.positions(r,o):[],m=i.length>0?((e,t)=>{const o=[];return k(e.grid.columns,(n=>{an(e,n).map((e=>e.element)).forall(t)&&o.push(n)})),_(o,(o=>{const n=nn(e,(e=>e.column===o));return P(n,(e=>t(e.element)))}))})(e,l):[];((e,t,o,n)=>{ud(e,t,((e,t)=>{const r=((e,t,o,n,r)=>{const s=xe.fromTag("div");return Bt(s,{position:"absolute",left:t-3.5+"px",top:o+"px",height:r+"px",width:"7px"}),he(s,{"data-column":e,role:"presentation"}),s})(t.col,t.x-e.left,o.top-e.top,0,n);return Mm(r,md),r}))})(t,_(i,((e,t)=>O(m,(e=>t===e)))),s,pn(o))},gd=(e,t)=>{if(dd(e),e.isResizable(t)){const o=Zo(t),n=dn(o),r=cn(o);fd(o,e,t,n,r)}},hd=(e,t)=>{const o=dt(e.parent(),"."+cd);N(o,t)},pd=e=>{hd(e,(e=>{Nt(e,"display","none")}))},wd=e=>{hd(e,(e=>{Nt(e,"display","block")}))},bd=ad("resizer-bar-dragging"),vd=e=>{const t=(()=>{const e=Jm({drag:Ym(["xDelta","yDelta","target"])});let t=C.none();const o=(()=>{const e=Jm({drag:Ym(["xDelta","yDelta"])});return{mutate:(t,o)=>{e.trigger.drag(t,o)},events:e.registry}})();return o.events.drag.bind((o=>{t.each((t=>{e.trigger.drag(o.xDelta,o.yDelta,t)}))})),{assign:e=>{t=C.some(e)},get:()=>t,mutate:o.mutate,events:e.registry}})(),o=((e,t={})=>{var o;return((e,t,o)=>{let n=!1;const r=Jm({start:Ym([]),stop:Ym([])}),s=nd(),l=()=>{m.stop(),s.isOn()&&(s.off(),r.trigger.stop())},c=((e,t)=>{let o=null;const n=()=>{a(o)||(clearTimeout(o),o=null)};return{cancel:n,throttle:(...t)=>{n(),o=setTimeout((()=>{o=null,e.apply(null,t)}),200)}}})(l);s.events.move.bind((o=>{t.mutate(e,o.info)}));const i=e=>(...t)=>{n&&e.apply(null,t)},m=t.sink(od({forceDrop:l,drop:i(l),move:i((e=>{c.cancel(),s.onEvent(e,t)})),delayDrop:i(c.throttle)}),o);return{element:m.element,go:e=>{m.start(e),s.on(),r.trigger.start()},on:()=>{n=!0},off:()=>{n=!1},isActive:()=>n,destroy:()=>{m.destroy()},events:r.registry}})(e,null!==(o=t.mode)&&void 0!==o?o:ld,t)})(t,{});let n=C.none();const r=(e,t)=>C.from(pe(e,t));t.events.drag.bind((e=>{r(e.target,"data-row").each((t=>{const o=It(e.target,"top");Nt(e.target,"top",o+e.yDelta+"px")})),r(e.target,"data-column").each((t=>{const o=It(e.target,"left");Nt(e.target,"left",o+e.xDelta+"px")}))}));const s=(e,t)=>It(e,t)-Wt(e,"data-initial-"+t,0);o.events.stop.bind((()=>{t.get().each((t=>{n.each((o=>{r(t,"data-row").each((e=>{const n=s(t,"top");be(t,"data-initial-top"),d.trigger.adjustHeight(o,n,parseInt(e,10))})),r(t,"data-column").each((e=>{const n=s(t,"left");be(t,"data-initial-left"),d.trigger.adjustWidth(o,n,parseInt(e,10))})),gd(e,o)}))}))}));const l=(n,r)=>{d.trigger.startAdjust(),t.assign(n),ge(n,"data-initial-"+r,It(n,r)),Mm(n,bd),Nt(n,"opacity","0.2"),o.go(e.parent())},c=qm(e.parent(),"mousedown",(e=>{var t;t=e.target,jm(t,id)&&l(e.target,"top"),(e=>jm(e,md))(e.target)&&l(e.target,"left")})),i=t=>Re(t,e.view()),m=qm(e.view(),"mouseover",(t=>{var r;(r=t.target,bt(r,"table",i).filter(Qr)).fold((()=>{lt(t.target)&&dd(e)}),(t=>{o.isActive()&&(n=C.some(t),gd(e,t))}))})),d=Jm({adjustHeight:Ym(["table","delta","row"]),adjustWidth:Ym(["table","delta","column"]),startAdjust:Ym([])});return{destroy:()=>{c.unbind(),m.unbind(),o.destroy(),dd(e)},refresh:t=>{gd(e,t)},on:o.on,off:o.off,hideBars:w(pd,e),showBars:w(wd,e),events:d.registry}},yd=(e,t,o)=>{const n=_n,r=An,s=vd(e),l=Jm({beforeResize:Ym(["table","type"]),afterResize:Ym(["table","type"]),startDrag:Ym([])});return s.events.adjustHeight.bind((e=>{const t=e.table;l.trigger.beforeResize(t,"row");((e,t,o,n)=>{const r=Zo(e),s=((e,t,o)=>lr(e,t,o,Yn,(e=>e.getOrThunk(Ht))))(r,e,n),l=E(s,((e,n)=>o===n?Math.max(t+e,Ht()):e)),a=oa(r,l),c=((e,t)=>E(e.all,((e,o)=>({element:e.element,height:t[o]}))))(r,l);N(c,(e=>{$n(e.element,e.height)})),N(a,(e=>{$n(e.element,e.height)}));const i=z(l,((e,t)=>e+t),0);$n(e,i)})(t,n.delta(e.delta,t),e.row,n),l.trigger.afterResize(t,"row")})),s.events.startAdjust.bind((e=>{l.trigger.startDrag()})),s.events.adjustWidth.bind((e=>{const n=e.table;l.trigger.beforeResize(n,"col");const s=r.delta(e.delta,n),a=o(n);ra(n,s,e.column,t,a),l.trigger.afterResize(n,"col")})),{on:s.on,off:s.off,refreshBars:s.refresh,hideBars:s.hideBars,showBars:s.showBars,destroy:s.destroy,events:l.registry}},xd=e=>m(e)&&"TABLE"===e.nodeName,Cd="bar-",Sd=e=>"false"!==pe(e,"data-mce-resize"),Td=e=>{const t=lm(),o=lm(),n=lm();let r,s;const l=t=>fc(e,t),a=()=>Pr(e)?el():Zs();return e.on("init",(()=>{const r=((e,t)=>e.inline?((e,t,o)=>({parent:g(t),view:g(e),origin:g(bn(0,0)),isResizable:o}))(xe.fromDom(e.getBody()),(()=>{const e=xe.fromTag("div");return Bt(e,{position:"static",height:"0",width:"0",padding:"0",margin:"0",border:"0"}),Ie(at(xe.fromDom(document)),e),e})(),t):((e,t)=>{const o=me(e)?(e=>xe.fromDom(Ee(e).dom.documentElement))(e):e;return{parent:g(o),view:g(e),origin:g(bn(0,0)),isResizable:t}})(xe.fromDom(e.getDoc()),t))(e,Sd);if(n.set(r),(e=>{const t=e.options.get("object_resizing");return D(t.split(","),"table")})(e)&&qr(e)){const n=a(),s=yd(r,n,l);s.on(),s.events.startDrag.bind((o=>{t.set(e.selection.getRng())})),s.events.beforeResize.bind((t=>{const o=t.table.dom;((e,t,o,n,r)=>{e.dispatch("ObjectResizeStart",{target:t,width:o,height:n,origin:r})})(e,o,ns(o),rs(o),Cd+t.type)})),s.events.afterResize.bind((o=>{const n=o.table,r=n.dom;ts(n),t.on((t=>{e.selection.setRng(t),e.focus()})),((e,t,o,n,r)=>{e.dispatch("ObjectResized",{target:t,width:o,height:n,origin:r})})(e,r,ns(r),rs(r),Cd+o.type),e.undoManager.add()})),o.set(s)}})),e.on("ObjectResizeStart",(t=>{const o=t.target;if(xd(o)){const n=xe.fromDom(o);N(e.dom.select(".mce-clonedresizable"),(t=>{e.dom.addClass(t,"mce-"+jr(e)+"-columns")})),!kc(n)&&$r(e)?_c(n):!Oc(n)&&Hr(e)&&Bc(n),Ec(n)&&Tt(t.origin,Cd)&&Bc(n),r=t.width,s=Vr(e)?"":((e,t)=>{const o=e.dom.getStyle(t,"width")||e.dom.getAttrib(t,"width");return C.from(o).filter(Ot)})(e,o).getOr("")}})),e.on("ObjectResized",(t=>{const o=t.target;if(xd(o)){const n=xe.fromDom(o),c=t.origin;Tt(c,"corner-")&&((t,o,n)=>{const c=Rt(o,"e");if(""===s&&Bc(t),n!==r&&""!==s){Nt(t,"width",s);const o=a(),i=l(t),m=Pr(e)||c?(e=>tl(e).columns)(t)-1:0;ra(t,n-r,m,o,i)}else if((e=>/^(\d+(\.\d+)?)%$/.test(e))(s)){const e=parseFloat(s.replace("%",""));Nt(t,"width",n*e/r+"%")}(e=>/^(\d+(\.\d+)?)px$/.test(e))(s)&&(e=>{const t=Zo(e);ln(t)||N(Ut(e),(e=>{const t=_t(e,"width");Nt(e,"width",t),be(e,"width")}))})(t)})(n,c,t.width),ts(n),ic(e,n.dom,mc)}})),e.on("SwitchMode",(()=>{o.on((t=>{e.mode.isReadOnly()?t.hideBars():t.showBars()}))})),e.on("dragstart dragend",(e=>{o.on((t=>{"dragstart"===e.type?(t.hideBars(),t.off()):(t.on(),t.showBars())}))})),e.on("remove",(()=>{o.on((e=>{e.destroy()})),n.on((t=>{((e,t)=>{e.inline&&qe(t.parent())})(e,t)}))})),{refresh:e=>{o.on((t=>t.refreshBars(xe.fromDom(e))))},hide:()=>{o.on((e=>e.hideBars()))},show:()=>{o.on((e=>e.showBars()))}}},Rd=e=>{(e=>{const t=e.options.register;t("table_clone_elements",{processor:"string[]"}),t("table_use_colgroups",{processor:"boolean",default:!0}),t("table_header_type",{processor:e=>{const t=D(["section","cells","sectionCells","auto"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be one of: section, cells, sectionCells or auto."}},default:"section"}),t("table_sizing_mode",{processor:"string",default:"auto"}),t("table_default_attributes",{processor:"object",default:{border:"1"}}),t("table_default_styles",{processor:"object",default:{"border-collapse":"collapse"}}),t("table_column_resizing",{processor:e=>{const t=D(["preservetable","resizetable"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be preservetable, or resizetable."}},default:"preservetable"}),t("table_resize_bars",{processor:"boolean",default:!0}),t("table_style_by_css",{processor:"boolean",default:!0}),t("table_merge_content_on_paste",{processor:"boolean",default:!0})})(e);const t=Td(e),o=Km(e,t),n=gc(e,t,o);return Xc(e,n),((e,t)=>{const o=es(e),n=t=>js(os(e)).bind((n=>Kt(n,o).map((o=>{const r=Ls(Ps(e),o,n);return t(o,r)})))).getOr("");G({mceTableRowType:()=>n(t.getTableRowType),mceTableCellType:()=>n(t.getTableCellType),mceTableColType:()=>n(t.getTableColType)},((t,o)=>e.addQueryValueHandler(o,t)))})(e,n),Is(e,n),{getSelectedCells:o.getSelectedCells,clearSelectedCells:o.clearSelectedCells}};e.add("dom",(e=>({table:Rd(e)})))}(); \ No newline at end of file diff --git a/public/js/tinymce/package.json b/public/js/tinymce/package.json new file mode 100644 index 000000000..6aaf142b4 --- /dev/null +++ b/public/js/tinymce/package.json @@ -0,0 +1,32 @@ +{ + "name": "tinymce", + "version": "6.5.1", + "repository": { + "type": "git", + "url": "https://github.com/tinymce/tinymce.git", + "directory": "modules/tinymce" + }, + "description": "Web based JavaScript HTML WYSIWYG editor control.", + "author": "Ephox Corporation DBA Tiny Technologies, Inc", + "main": "tinymce.js", + "types": "tinymce.d.ts", + "license": "MIT", + "keywords": [ + "wysiwyg", + "tinymce", + "richtext", + "javascript", + "html", + "text", + "rich editor", + "rich text editor", + "rte", + "rich text", + "contenteditable", + "editing" + ], + "homepage": "https://www.tiny.cloud/", + "bugs": { + "url": "https://github.com/tinymce/tinymce/issues" + } +} \ No newline at end of file diff --git a/public/js/tinymce/plugins/accordion/index.js b/public/js/tinymce/plugins/accordion/index.js new file mode 100644 index 000000000..bba980719 --- /dev/null +++ b/public/js/tinymce/plugins/accordion/index.js @@ -0,0 +1,7 @@ +// Exports the "accordion" plugin for usage with module loaders +// Usage: +// CommonJS: +// require('tinymce/plugins/accordion') +// ES2015: +// import 'tinymce/plugins/accordion' +require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/accordion/plugin.js b/public/js/tinymce/plugins/accordion/plugin.js new file mode 100644 index 000000000..77f76637f --- /dev/null +++ b/public/js/tinymce/plugins/accordion/plugin.js @@ -0,0 +1,1033 @@ +/** + * TinyMCE version 6.5.1 (2023-06-19) + */ + +(function () { + 'use strict'; + + var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + let unique = 0; + const generate = prefix => { + const date = new Date(); + const time = date.getTime(); + const random = Math.floor(Math.random() * 1000000000); + unique++; + return prefix + '_' + random + unique + String(time); + }; + + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } + }; + const typeOf = x => { + const t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && Array.isArray(x)) { + return 'array'; + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { + return 'string'; + } else { + return t; + } + }; + const isType$1 = type => value => typeOf(value) === type; + const isSimpleType = type => value => typeof value === type; + const isString = isType$1('string'); + const isBoolean = isSimpleType('boolean'); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); + const isFunction = isSimpleType('function'); + const isNumber = isSimpleType('number'); + + const compose1 = (fbc, fab) => a => fbc(fab(a)); + const constant = value => { + return () => { + return value; + }; + }; + const tripleEquals = (a, b) => { + return a === b; + }; + const never = constant(false); + + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); + } + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); + + const nativeIndexOf = Array.prototype.indexOf; + const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t); + const contains = (xs, x) => rawIndexOf(xs, x) > -1; + const map = (xs, f) => { + const len = xs.length; + const r = new Array(len); + for (let i = 0; i < len; i++) { + const x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + const each$1 = (xs, f) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + f(x, i); + } + }; + const filter = (xs, pred) => { + const r = []; + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + const foldl = (xs, f, acc) => { + each$1(xs, (x, i) => { + acc = f(acc, x, i); + }); + return acc; + }; + + const keys = Object.keys; + const each = (obj, f) => { + const props = keys(obj); + for (let k = 0, len = props.length; k < len; k++) { + const i = props[k]; + const x = obj[i]; + f(x, i); + } + }; + + typeof window !== 'undefined' ? window : Function('return this;')(); + + const COMMENT = 8; + const DOCUMENT = 9; + const DOCUMENT_FRAGMENT = 11; + const ELEMENT = 1; + const TEXT = 3; + + const name = element => { + const r = element.dom.nodeName; + return r.toLowerCase(); + }; + const type = element => element.dom.nodeType; + const isType = t => element => type(element) === t; + const isComment = element => type(element) === COMMENT || name(element) === '#comment'; + const isElement = isType(ELEMENT); + const isText = isType(TEXT); + const isDocument = isType(DOCUMENT); + const isDocumentFragment = isType(DOCUMENT_FRAGMENT); + + const rawSet = (dom, key, value) => { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + const set$2 = (element, key, value) => { + rawSet(element.dom, key, value); + }; + const setAll = (element, attrs) => { + const dom = element.dom; + each(attrs, (v, k) => { + rawSet(dom, k, v); + }); + }; + const get$2 = (element, key) => { + const v = element.dom.getAttribute(key); + return v === null ? undefined : v; + }; + const getOpt = (element, key) => Optional.from(get$2(element, key)); + const remove$2 = (element, key) => { + element.dom.removeAttribute(key); + }; + const clone = element => foldl(element.dom.attributes, (acc, attr) => { + acc[attr.name] = attr.value; + return acc; + }, {}); + + const fromHtml = (html, scope) => { + const doc = scope || document; + const div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + const message = 'HTML does not have a single root node'; + console.error(message, html); + throw new Error(message); + } + return fromDom(div.childNodes[0]); + }; + const fromTag = (tag, scope) => { + const doc = scope || document; + const node = doc.createElement(tag); + return fromDom(node); + }; + const fromText = (text, scope) => { + const doc = scope || document; + const node = doc.createTextNode(text); + return fromDom(node); + }; + const fromDom = node => { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + const fromPoint = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + const SugarElement = { + fromHtml, + fromTag, + fromText, + fromDom, + fromPoint + }; + + const is$2 = (element, selector) => { + const dom = element.dom; + if (dom.nodeType !== ELEMENT) { + return false; + } else { + const elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + const bypassSelector = dom => dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0; + const all = (selector, scope) => { + const base = scope === undefined ? document : scope.dom; + return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom); + }; + const one = (selector, scope) => { + const base = scope === undefined ? document : scope.dom; + return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom); + }; + + const eq = (e1, e2) => e1.dom === e2.dom; + const is$1 = is$2; + + const is = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs)); + + const blank = r => s => s.replace(r, ''); + const trim = blank(/^\s+|\s+$/g); + + const isSupported = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue); + + const owner = element => SugarElement.fromDom(element.dom.ownerDocument); + const documentOrOwner = dos => isDocument(dos) ? dos : owner(dos); + const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom); + const parents = (element, isRoot) => { + const stop = isFunction(isRoot) ? isRoot : never; + let dom = element.dom; + const ret = []; + while (dom.parentNode !== null && dom.parentNode !== undefined) { + const rawParent = dom.parentNode; + const p = SugarElement.fromDom(rawParent); + ret.push(p); + if (stop(p) === true) { + break; + } else { + dom = rawParent; + } + } + return ret; + }; + const prevSibling = element => Optional.from(element.dom.previousSibling).map(SugarElement.fromDom); + const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom); + const children = element => map(element.dom.childNodes, SugarElement.fromDom); + const child = (element, index) => { + const cs = element.dom.childNodes; + return Optional.from(cs[index]).map(SugarElement.fromDom); + }; + const firstChild = element => child(element, 0); + + const isShadowRoot = dos => isDocumentFragment(dos) && isNonNullable(dos.dom.host); + const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); + const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner; + const getShadowRoot = e => { + const r = getRootNode(e); + return isShadowRoot(r) ? Optional.some(r) : Optional.none(); + }; + const getShadowHost = e => SugarElement.fromDom(e.dom.host); + + const inBody = element => { + const dom = isText(element) ? element.dom.parentNode : element.dom; + if (dom === undefined || dom === null || dom.ownerDocument === null) { + return false; + } + const doc = dom.ownerDocument; + return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost)); + }; + + const internalSet = (dom, property, value) => { + if (!isString(value)) { + console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + const internalRemove = (dom, property) => { + if (isSupported(dom)) { + dom.style.removeProperty(property); + } + }; + const set$1 = (element, property, value) => { + const dom = element.dom; + internalSet(dom, property, value); + }; + const get$1 = (element, property) => { + const dom = element.dom; + const styles = window.getComputedStyle(dom); + const r = styles.getPropertyValue(property); + return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + }; + const getUnsafeProperty = (dom, property) => isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + const getRaw = (element, property) => { + const dom = element.dom; + const raw = getUnsafeProperty(dom, property); + return Optional.from(raw).filter(r => r.length > 0); + }; + const remove$1 = (element, property) => { + const dom = element.dom; + internalRemove(dom, property); + if (is(getOpt(element, 'style').map(trim), '')) { + remove$2(element, 'style'); + } + }; + + const before = (marker, element) => { + const parent$1 = parent(marker); + parent$1.each(v => { + v.dom.insertBefore(element.dom, marker.dom); + }); + }; + const after$1 = (marker, element) => { + const sibling = nextSibling(marker); + sibling.fold(() => { + const parent$1 = parent(marker); + parent$1.each(v => { + append$1(v, element); + }); + }, v => { + before(v, element); + }); + }; + const prepend = (parent, element) => { + const firstChild$1 = firstChild(parent); + firstChild$1.fold(() => { + append$1(parent, element); + }, v => { + parent.dom.insertBefore(element.dom, v.dom); + }); + }; + const append$1 = (parent, element) => { + parent.dom.appendChild(element.dom); + }; + const wrap = (element, wrapper) => { + before(element, wrapper); + append$1(wrapper, element); + }; + + const after = (marker, elements) => { + each$1(elements, (x, i) => { + const e = i === 0 ? marker : elements[i - 1]; + after$1(e, x); + }); + }; + const append = (parent, elements) => { + each$1(elements, x => { + append$1(parent, x); + }); + }; + + const descendants$1 = (scope, predicate) => { + let result = []; + each$1(children(scope), x => { + if (predicate(x)) { + result = result.concat([x]); + } + result = result.concat(descendants$1(x, predicate)); + }); + return result; + }; + + var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => { + if (is(scope, a)) { + return Optional.some(scope); + } else if (isFunction(isRoot) && isRoot(scope)) { + return Optional.none(); + } else { + return ancestor(scope, a, isRoot); + } + }; + + const ancestor$1 = (scope, predicate, isRoot) => { + let element = scope.dom; + const stop = isFunction(isRoot) ? isRoot : never; + while (element.parentNode) { + element = element.parentNode; + const el = SugarElement.fromDom(element); + if (predicate(el)) { + return Optional.some(el); + } else if (stop(el)) { + break; + } + } + return Optional.none(); + }; + + const remove = element => { + const dom = element.dom; + if (dom.parentNode !== null) { + dom.parentNode.removeChild(dom); + } + }; + const unwrap = wrapper => { + const children$1 = children(wrapper); + if (children$1.length > 0) { + after(wrapper, children$1); + } + remove(wrapper); + }; + + const descendants = (scope, selector) => all(selector, scope); + + const ancestor = (scope, selector, isRoot) => ancestor$1(scope, e => is$2(e, selector), isRoot); + const descendant = (scope, selector) => one(selector, scope); + const closest = (scope, selector, isRoot) => { + const is = (element, selector) => is$2(element, selector); + return ClosestOrAncestor(is, ancestor, scope, selector, isRoot); + }; + + const NodeValue = (is, name) => { + const get = element => { + if (!is(element)) { + throw new Error('Can only get ' + name + ' value of a ' + name + ' node'); + } + return getOption(element).getOr(''); + }; + const getOption = element => is(element) ? Optional.from(element.dom.nodeValue) : Optional.none(); + const set = (element, value) => { + if (!is(element)) { + throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node'); + } + element.dom.nodeValue = value; + }; + return { + get, + getOption, + set + }; + }; + + const api = NodeValue(isText, 'text'); + const get = element => api.get(element); + const set = (element, value) => api.set(element, value); + + var TagBoundaries = [ + 'body', + 'p', + 'div', + 'article', + 'aside', + 'figcaption', + 'figure', + 'footer', + 'header', + 'nav', + 'section', + 'ol', + 'ul', + 'li', + 'table', + 'thead', + 'tbody', + 'tfoot', + 'caption', + 'tr', + 'td', + 'th', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'blockquote', + 'pre', + 'address' + ]; + + var DomUniverse = () => { + const clone$1 = element => { + return SugarElement.fromDom(element.dom.cloneNode(false)); + }; + const document = element => documentOrOwner(element).dom; + const isBoundary = element => { + if (!isElement(element)) { + return false; + } + if (name(element) === 'body') { + return true; + } + return contains(TagBoundaries, name(element)); + }; + const isEmptyTag = element => { + if (!isElement(element)) { + return false; + } + return contains([ + 'br', + 'img', + 'hr', + 'input' + ], name(element)); + }; + const isNonEditable = element => isElement(element) && get$2(element, 'contenteditable') === 'false'; + const comparePosition = (element, other) => { + return element.dom.compareDocumentPosition(other.dom); + }; + const copyAttributesTo = (source, destination) => { + const as = clone(source); + setAll(destination, as); + }; + const isSpecial = element => { + const tag = name(element); + return contains([ + 'script', + 'noscript', + 'iframe', + 'noframes', + 'noembed', + 'title', + 'style', + 'textarea', + 'xmp' + ], tag); + }; + const getLanguage = element => isElement(element) ? getOpt(element, 'lang') : Optional.none(); + return { + up: constant({ + selector: ancestor, + closest: closest, + predicate: ancestor$1, + all: parents + }), + down: constant({ + selector: descendants, + predicate: descendants$1 + }), + styles: constant({ + get: get$1, + getRaw: getRaw, + set: set$1, + remove: remove$1 + }), + attrs: constant({ + get: get$2, + set: set$2, + remove: remove$2, + copyTo: copyAttributesTo + }), + insert: constant({ + before: before, + after: after$1, + afterAll: after, + append: append$1, + appendAll: append, + prepend: prepend, + wrap: wrap + }), + remove: constant({ + unwrap: unwrap, + remove: remove + }), + create: constant({ + nu: SugarElement.fromTag, + clone: clone$1, + text: SugarElement.fromText + }), + query: constant({ + comparePosition, + prevSibling: prevSibling, + nextSibling: nextSibling + }), + property: constant({ + children: children, + name: name, + parent: parent, + document, + isText: isText, + isComment: isComment, + isElement: isElement, + isSpecial, + getLanguage, + getText: get, + setText: set, + isBoundary, + isEmptyTag, + isNonEditable + }), + eq: eq, + is: is$1 + }; + }; + + const point = (element, offset) => ({ + element, + offset + }); + + const scan = (universe, element, direction) => { + if (universe.property().isText(element) && universe.property().getText(element).trim().length === 0 || universe.property().isComment(element)) { + return direction(element).bind(elem => { + return scan(universe, elem, direction).orThunk(() => { + return Optional.some(elem); + }); + }); + } else { + return Optional.none(); + } + }; + const toEnd = (universe, element) => { + if (universe.property().isText(element)) { + return universe.property().getText(element).length; + } + const children = universe.property().children(element); + return children.length; + }; + const freefallRtl$2 = (universe, element) => { + const candidate = scan(universe, element, universe.query().prevSibling).getOr(element); + if (universe.property().isText(candidate)) { + return point(candidate, toEnd(universe, candidate)); + } + const children = universe.property().children(candidate); + return children.length > 0 ? freefallRtl$2(universe, children[children.length - 1]) : point(candidate, toEnd(universe, candidate)); + }; + + const freefallRtl$1 = freefallRtl$2; + + const universe = DomUniverse(); + const freefallRtl = element => { + return freefallRtl$1(universe, element); + }; + + const fireToggleAccordionEvent = (editor, element, state) => editor.dispatch('ToggledAccordion', { + element, + state + }); + const fireToggleAllAccordionsEvent = (editor, elements, state) => editor.dispatch('ToggledAllAccordions', { + elements, + state + }); + + const accordionTag = 'details'; + const accordionDetailsClass = 'mce-accordion'; + const accordionSummaryClass = 'mce-accordion-summary'; + const accordionBodyWrapperClass = 'mce-accordion-body'; + const accordionBodyWrapperTag = 'div'; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + const isSummary = node => (node === null || node === void 0 ? void 0 : node.nodeName) === 'SUMMARY'; + const isDetails = node => (node === null || node === void 0 ? void 0 : node.nodeName) === 'DETAILS'; + const isOpen = details => details.hasAttribute('open'); + const isInSummary = editor => { + const node = editor.selection.getNode(); + return isSummary(node) || Boolean(editor.dom.getParent(node, isSummary)); + }; + const isInsertAllowed = editor => !isInSummary(editor) && editor.dom.isEditable(editor.selection.getNode()); + const getSelectedDetails = editor => Optional.from(editor.dom.getParent(editor.selection.getNode(), isDetails)); + const isDetailsSelected = editor => getSelectedDetails(editor).isSome(); + const insertBogus = element => { + element.innerHTML = '
    '; + return element; + }; + const createParagraph = editor => insertBogus(editor.dom.create('p')); + const createSummary = editor => insertBogus(editor.dom.create('summary')); + const insertAndSelectParagraphAfter = (editor, target) => { + const paragraph = createParagraph(editor); + target.insertAdjacentElement('afterend', paragraph); + editor.selection.setCursorLocation(paragraph, 0); + }; + const normalizeContent = (editor, accordion) => { + if (isSummary(accordion === null || accordion === void 0 ? void 0 : accordion.lastChild)) { + const paragraph = createParagraph(editor); + accordion.appendChild(paragraph); + editor.selection.setCursorLocation(paragraph, 0); + } + }; + const normalizeSummary = (editor, accordion) => { + if (!isSummary(accordion === null || accordion === void 0 ? void 0 : accordion.firstChild)) { + const summary = createSummary(editor); + accordion.prepend(summary); + editor.selection.setCursorLocation(summary, 0); + } + }; + const normalizeAccordion = editor => accordion => { + normalizeContent(editor, accordion); + normalizeSummary(editor, accordion); + }; + const normalizeDetails = editor => { + global$2.each(global$2.grep(editor.dom.select('details', editor.getBody())), normalizeAccordion(editor)); + }; + + const insertAccordion = editor => { + if (!isInsertAllowed(editor)) { + return; + } + const editorBody = SugarElement.fromDom(editor.getBody()); + const uid = generate('acc'); + const summaryText = editor.dom.encode(editor.selection.getRng().toString() || editor.translate('Accordion summary...')); + const bodyText = editor.dom.encode(editor.translate('Accordion body...')); + const accordionSummaryHtml = `${ summaryText }`; + const accordionBodyHtml = `<${ accordionBodyWrapperTag } class="${ accordionBodyWrapperClass }">

    ${ bodyText }

    `; + editor.undoManager.transact(() => { + editor.insertContent([ + `
    `, + accordionSummaryHtml, + accordionBodyHtml, + `
    ` + ].join('')); + descendant(editorBody, `[data-mce-id="${ uid }"]`).each(detailsElm => { + remove$2(detailsElm, 'data-mce-id'); + descendant(detailsElm, `summary`).each(summaryElm => { + const rng = editor.dom.createRng(); + const des = freefallRtl(summaryElm); + rng.setStart(des.element.dom, des.offset); + rng.setEnd(des.element.dom, des.offset); + editor.selection.setRng(rng); + }); + }); + }); + }; + const toggleDetailsElement = (details, state) => { + const shouldOpen = state !== null && state !== void 0 ? state : !isOpen(details); + if (shouldOpen) { + details.setAttribute('open', 'open'); + } else { + details.removeAttribute('open'); + } + return shouldOpen; + }; + const toggleAccordion = (editor, state) => { + getSelectedDetails(editor).each(details => { + fireToggleAccordionEvent(editor, details, toggleDetailsElement(details, state)); + }); + }; + const removeAccordion = editor => { + getSelectedDetails(editor).each(details => { + const {nextSibling} = details; + if (nextSibling) { + editor.selection.select(nextSibling, true); + editor.selection.collapse(true); + } else { + insertAndSelectParagraphAfter(editor, details); + } + details.remove(); + }); + }; + const toggleAllAccordions = (editor, state) => { + const accordions = Array.from(editor.getBody().querySelectorAll('details')); + if (accordions.length === 0) { + return; + } + each$1(accordions, accordion => toggleDetailsElement(accordion, state !== null && state !== void 0 ? state : !isOpen(accordion))); + fireToggleAllAccordionsEvent(editor, accordions, state); + }; + + const register$1 = editor => { + editor.addCommand('InsertAccordion', () => insertAccordion(editor)); + editor.addCommand('ToggleAccordion', (_ui, value) => toggleAccordion(editor, value)); + editor.addCommand('ToggleAllAccordions', (_ui, value) => toggleAllAccordions(editor, value)); + editor.addCommand('RemoveAccordion', () => removeAccordion(editor)); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + const getClassList = node => { + var _a, _b; + return (_b = (_a = node.attr('class')) === null || _a === void 0 ? void 0 : _a.split(' ')) !== null && _b !== void 0 ? _b : []; + }; + const addClasses = (node, classes) => { + const classListSet = new Set([ + ...getClassList(node), + ...classes + ]); + const newClassList = Array.from(classListSet); + if (newClassList.length > 0) { + node.attr('class', newClassList.join(' ')); + } + }; + const removeClasses = (node, classes) => { + const newClassList = filter(getClassList(node), clazz => !classes.has(clazz)); + node.attr('class', newClassList.length > 0 ? newClassList.join(' ') : null); + }; + const isAccordionDetailsNode = node => node.name === accordionTag && contains(getClassList(node), accordionDetailsClass); + const isAccordionBodyWrapperNode = node => node.name === accordionBodyWrapperTag && contains(getClassList(node), accordionBodyWrapperClass); + const getAccordionChildren = accordionNode => { + const children = accordionNode.children(); + let summaryNode; + let wrapperNode; + const otherNodes = []; + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child.name === 'summary' && isNullable(summaryNode)) { + summaryNode = child; + } else if (isAccordionBodyWrapperNode(child) && isNullable(wrapperNode)) { + wrapperNode = child; + } else { + otherNodes.push(child); + } + } + return { + summaryNode, + wrapperNode, + otherNodes + }; + }; + const padInputNode = node => { + const br = new global$1('br', 1); + br.attr('data-mce-bogus', '1'); + node.empty(); + node.append(br); + }; + const setup$1 = editor => { + editor.on('PreInit', () => { + const {serializer, parser} = editor; + parser.addNodeFilter(accordionTag, nodes => { + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (isAccordionDetailsNode(node)) { + const accordionNode = node; + const {summaryNode, wrapperNode, otherNodes} = getAccordionChildren(accordionNode); + const hasSummaryNode = isNonNullable(summaryNode); + const newSummaryNode = hasSummaryNode ? summaryNode : new global$1('summary', 1); + if (isNullable(newSummaryNode.firstChild)) { + padInputNode(newSummaryNode); + } + addClasses(newSummaryNode, [accordionSummaryClass]); + if (!hasSummaryNode) { + if (isNonNullable(accordionNode.firstChild)) { + accordionNode.insert(newSummaryNode, accordionNode.firstChild, true); + } else { + accordionNode.append(newSummaryNode); + } + } + const hasWrapperNode = isNonNullable(wrapperNode); + const newWrapperNode = hasWrapperNode ? wrapperNode : new global$1(accordionBodyWrapperTag, 1); + addClasses(newWrapperNode, [accordionBodyWrapperClass]); + if (otherNodes.length > 0) { + for (let j = 0; j < otherNodes.length; j++) { + const otherNode = otherNodes[j]; + newWrapperNode.append(otherNode); + } + } + if (isNullable(newWrapperNode.firstChild)) { + const pNode = new global$1('p', 1); + padInputNode(pNode); + newWrapperNode.append(pNode); + } + if (!hasWrapperNode) { + accordionNode.append(newWrapperNode); + } + } + } + }); + serializer.addNodeFilter(accordionTag, nodes => { + const summaryClassRemoveSet = new Set([accordionSummaryClass]); + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (isAccordionDetailsNode(node)) { + const accordionNode = node; + const {summaryNode, wrapperNode} = getAccordionChildren(accordionNode); + if (isNonNullable(summaryNode)) { + removeClasses(summaryNode, summaryClassRemoveSet); + } + if (isNonNullable(wrapperNode)) { + wrapperNode.unwrap(); + } + } + } + }); + }); + }; + + var global = tinymce.util.Tools.resolve('tinymce.util.VK'); + + const setupEnterKeyInSummary = editor => { + editor.on('keydown', event => { + if (event.shiftKey || event.keyCode !== global.ENTER || !isInSummary(editor)) { + return; + } + event.preventDefault(); + editor.execCommand('ToggleAccordion'); + }); + }; + const setup = editor => { + setupEnterKeyInSummary(editor); + editor.on('ExecCommand', e => { + const cmd = e.command.toLowerCase(); + if ((cmd === 'delete' || cmd === 'forwarddelete') && isDetailsSelected(editor)) { + normalizeDetails(editor); + } + }); + }; + + const onSetup = editor => buttonApi => { + const onNodeChange = () => buttonApi.setEnabled(isInsertAllowed(editor)); + editor.on('NodeChange', onNodeChange); + return () => editor.off('NodeChange', onNodeChange); + }; + const register = editor => { + const onAction = () => editor.execCommand('InsertAccordion'); + editor.ui.registry.addButton('accordion', { + icon: 'accordion', + tooltip: 'Insert accordion', + onSetup: onSetup(editor), + onAction + }); + editor.ui.registry.addMenuItem('accordion', { + icon: 'accordion', + text: 'Accordion', + onSetup: onSetup(editor), + onAction + }); + editor.ui.registry.addToggleButton('accordiontoggle', { + icon: 'accordion-toggle', + tooltip: 'Toggle accordion', + onAction: () => editor.execCommand('ToggleAccordion') + }); + editor.ui.registry.addToggleButton('accordionremove', { + icon: 'remove', + tooltip: 'Delete accordion', + onAction: () => editor.execCommand('RemoveAccordion') + }); + editor.ui.registry.addContextToolbar('accordion', { + predicate: accordion => editor.dom.is(accordion, 'details') && editor.getBody().contains(accordion) && editor.dom.isEditable(accordion.parentNode), + items: 'accordiontoggle accordionremove', + scope: 'node', + position: 'node' + }); + }; + + var Plugin = () => { + global$3.add('accordion', editor => { + register(editor); + register$1(editor); + setup(editor); + setup$1(editor); + }); + }; + + Plugin(); + +})(); diff --git a/public/js/tinymce/plugins/accordion/plugin.min.js b/public/js/tinymce/plugins/accordion/plugin.min.js new file mode 100644 index 000000000..10ad7713d --- /dev/null +++ b/public/js/tinymce/plugins/accordion/plugin.min.js @@ -0,0 +1,4 @@ +/** + * TinyMCE version 6.5.1 (2023-06-19) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");let t=0;const o=e=>t=>typeof t===e,n=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(o=n=e,(r=String).prototype.isPrototypeOf(o)||(null===(s=n.constructor)||void 0===s?void 0:s.name)===r.name)?"string":t;var o,n,r,s})(e),r=o("boolean"),s=e=>null==e,i=e=>!s(e),a=o("function"),d=o("number"),l=e=>()=>e,c=(e,t)=>e===t,m=l(!1);class u{constructor(e,t){this.tag=e,this.value=t}static some(e){return new u(!0,e)}static none(){return u.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?u.some(e(this.value)):u.none()}bind(e){return this.tag?e(this.value):u.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:u.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return i(e)?u.some(e):u.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}u.singletonNone=new u(!1);const p=Array.prototype.indexOf,g=(e,t)=>{return o=e,n=t,p.call(o,n)>-1;var o,n},h=(e,t)=>{const o=e.length,n=new Array(o);for(let r=0;r{for(let o=0,n=e.length;oe.dom.nodeName.toLowerCase(),w=e=>e.dom.nodeType,b=e=>t=>w(t)===e,N=b(1),T=b(3),A=b(9),C=b(11),S=(e,t,o)=>{if(!(n(o)||r(o)||d(o)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",o,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,o+"")},x=(e,t)=>{const o=e.dom.getAttribute(t);return null===o?void 0:o},D=(e,t)=>u.from(x(e,t)),E=(e,t)=>{e.dom.removeAttribute(t)},M=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},P={fromHtml:(e,t)=>{const o=(t||document).createElement("div");if(o.innerHTML=e,!o.hasChildNodes()||o.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return M(o.childNodes[0])},fromTag:(e,t)=>{const o=(t||document).createElement(e);return M(o)},fromText:(e,t)=>{const o=(t||document).createTextNode(e);return M(o)},fromDom:M,fromPoint:(e,t,o)=>u.from(e.dom.elementFromPoint(t,o)).map(M)},k=(e,t)=>{const o=e.dom;if(1!==o.nodeType)return!1;{const e=o;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},B=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,O=k,$=(L=/^\s+|\s+$/g,e=>e.replace(L,""));var L;const R=e=>void 0!==e.style&&a(e.style.getPropertyValue),I=e=>A(e)?e:P.fromDom(e.dom.ownerDocument),V=e=>u.from(e.dom.parentNode).map(P.fromDom),j=e=>u.from(e.dom.nextSibling).map(P.fromDom),q=e=>h(e.dom.childNodes,P.fromDom),F=a(Element.prototype.attachShadow)&&a(Node.prototype.getRootNode)?e=>P.fromDom(e.dom.getRootNode()):I,H=e=>P.fromDom(e.dom.host),z=e=>{const t=T(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const o=t.ownerDocument;return(e=>{const t=F(e);return C(o=t)&&i(o.dom.host)?u.some(t):u.none();var o})(P.fromDom(t)).fold((()=>o.body.contains(t)),(n=z,r=H,e=>n(r(e))));var n,r},K=(e,t)=>R(e)?e.style.getPropertyValue(t):"",U=(e,t)=>{V(e).each((o=>{o.dom.insertBefore(t.dom,e.dom)}))},Y=(e,t)=>{j(e).fold((()=>{V(e).each((e=>{_(e,t)}))}),(e=>{U(e,t)}))},_=(e,t)=>{e.dom.appendChild(t.dom)},G=(e,t)=>{f(t,((o,n)=>{const r=0===n?e:t[n-1];Y(r,o)}))},J=(e,t)=>{let o=[];return f(q(e),(e=>{t(e)&&(o=o.concat([e])),o=o.concat(J(e,t))})),o},Q=(e,t,o)=>{let n=e.dom;const r=a(o)?o:m;for(;n.parentNode;){n=n.parentNode;const e=P.fromDom(n);if(t(e))return u.some(e);if(r(e))break}return u.none()},W=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},X=(e,t,o)=>Q(e,(e=>k(e,t)),o),Z=(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return B(o)?u.none():u.from(o.querySelector(e)).map(P.fromDom)})(t,e),ee=((e,t)=>{const o=t=>e(t)?u.from(t.dom.nodeValue):u.none();return{get:t=>{if(!e(t))throw new Error("Can only get text value of a text node");return o(t).getOr("")},getOption:o,set:(t,o)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=o}}})(T);var te=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"];const oe=(e,t)=>({element:e,offset:t}),ne=(e,t,o)=>e.property().isText(t)&&0===e.property().getText(t).trim().length||e.property().isComment(t)?o(t).bind((t=>ne(e,t,o).orThunk((()=>u.some(t))))):u.none(),re=(e,t)=>e.property().isText(t)?e.property().getText(t).length:e.property().children(t).length,se=(e,t)=>{const o=ne(e,t,e.query().prevSibling).getOr(t);if(e.property().isText(o))return oe(o,re(e,o));const n=e.property().children(o);return n.length>0?se(e,n[n.length-1]):oe(o,re(e,o))},ie=se,ae={up:l({selector:X,closest:(e,t,o)=>((e,t,o,n,r)=>((e,t)=>k(e,t))(o,n)?u.some(o):a(r)&&r(o)?u.none():t(o,n,r))(0,X,e,t,o),predicate:Q,all:(e,t)=>{const o=a(t)?t:m;let n=e.dom;const r=[];for(;null!==n.parentNode&&void 0!==n.parentNode;){const e=n.parentNode,t=P.fromDom(e);if(r.push(t),!0===o(t))break;n=e}return r}}),down:l({selector:(e,t)=>((e,t)=>{const o=void 0===t?document:t.dom;return B(o)?[]:h(o.querySelectorAll(e),P.fromDom)})(t,e),predicate:J}),styles:l({get:(e,t)=>{const o=e.dom,n=window.getComputedStyle(o).getPropertyValue(t);return""!==n||z(e)?n:K(o,t)},getRaw:(e,t)=>{const o=e.dom,n=K(o,t);return u.from(n).filter((e=>e.length>0))},set:(e,t,o)=>{((e,t,o)=>{if(!n(o))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",o,":: Element ",e),new Error("CSS value must be a string: "+o);R(e)&&e.style.setProperty(t,o)})(e.dom,t,o)},remove:(e,t)=>{((e,t)=>{R(e)&&e.style.removeProperty(t)})(e.dom,t),((e,t,o=c)=>e.exists((e=>o(e,t))))(D(e,"style").map($),"")&&E(e,"style")}}),attrs:l({get:x,set:(e,t,o)=>{S(e.dom,t,o)},remove:E,copyTo:(e,t)=>{const o=(n=e.dom.attributes,r=(e,t)=>(e[t.name]=t.value,e),s={},f(n,((e,t)=>{s=r(s,e)})),s);var n,r,s;((e,t)=>{const o=e.dom;((e,t)=>{const o=y(e);for(let n=0,r=o.length;n{S(o,t,e)}))})(t,o)}}),insert:l({before:U,after:Y,afterAll:G,append:_,appendAll:(e,t)=>{f(t,(t=>{_(e,t)}))},prepend:(e,t)=>{(e=>((e,t)=>{const o=e.dom.childNodes;return u.from(o[0]).map(P.fromDom)})(e))(e).fold((()=>{_(e,t)}),(o=>{e.dom.insertBefore(t.dom,o.dom)}))},wrap:(e,t)=>{U(e,t),_(t,e)}}),remove:l({unwrap:e=>{const t=q(e);t.length>0&&G(e,t),W(e)},remove:W}),create:l({nu:P.fromTag,clone:e=>P.fromDom(e.dom.cloneNode(!1)),text:P.fromText}),query:l({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:e=>u.from(e.dom.previousSibling).map(P.fromDom),nextSibling:j}),property:l({children:q,name:v,parent:V,document:e=>I(e).dom,isText:T,isComment:e=>8===w(e)||"#comment"===v(e),isElement:N,isSpecial:e=>{const t=v(e);return g(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>N(e)?D(e,"lang"):u.none(),getText:e=>ee.get(e),setText:(e,t)=>ee.set(e,t),isBoundary:e=>!!N(e)&&("body"===v(e)||g(te,v(e))),isEmptyTag:e=>!!N(e)&&g(["br","img","hr","input"],v(e)),isNonEditable:e=>N(e)&&"false"===x(e,"contenteditable")}),eq:(e,t)=>e.dom===t.dom,is:O},de="details",le="mce-accordion",ce="mce-accordion-summary",me="mce-accordion-body",ue="div";var pe=tinymce.util.Tools.resolve("tinymce.util.Tools");const ge=e=>"SUMMARY"===(null==e?void 0:e.nodeName),he=e=>"DETAILS"===(null==e?void 0:e.nodeName),fe=e=>e.hasAttribute("open"),ye=e=>{const t=e.selection.getNode();return ge(t)||Boolean(e.dom.getParent(t,ge))},ve=e=>!ye(e)&&e.dom.isEditable(e.selection.getNode()),we=e=>u.from(e.dom.getParent(e.selection.getNode(),he)),be=e=>(e.innerHTML='
    ',e),Ne=e=>be(e.dom.create("p")),Te=e=>t=>{((e,t)=>{if(ge(null==t?void 0:t.lastChild)){const o=Ne(e);t.appendChild(o),e.selection.setCursorLocation(o,0)}})(e,t),((e,t)=>{if(!ge(null==t?void 0:t.firstChild)){const o=(e=>be(e.dom.create("summary")))(e);t.prepend(o),e.selection.setCursorLocation(o,0)}})(e,t)},Ae=(e,t)=>{const o=null!=t?t:!fe(e);return o?e.setAttribute("open","open"):e.removeAttribute("open"),o},Ce=e=>{e.addCommand("InsertAccordion",(()=>(e=>{if(!ve(e))return;const o=P.fromDom(e.getBody()),n=(e=>{const o=(new Date).getTime(),n=Math.floor(1e9*Math.random());return t++,"acc_"+n+t+String(o)})(),r=e.dom.encode(e.selection.getRng().toString()||e.translate("Accordion summary...")),s=e.dom.encode(e.translate("Accordion body...")),i=`${r}`,a=`<${ue} class="${me}">

    ${s}

    `;e.undoManager.transact((()=>{e.insertContent([`
    `,i,a,"
    "].join("")),Z(o,`[data-mce-id="${n}"]`).each((t=>{E(t,"data-mce-id"),Z(t,"summary").each((t=>{const o=e.dom.createRng(),n=ie(ae,t);o.setStart(n.element.dom,n.offset),o.setEnd(n.element.dom,n.offset),e.selection.setRng(o)}))}))}))})(e))),e.addCommand("ToggleAccordion",((t,o)=>((e,t)=>{we(e).each((o=>{((e,t,o)=>{e.dispatch("ToggledAccordion",{element:t,state:o})})(e,o,Ae(o,t))}))})(e,o))),e.addCommand("ToggleAllAccordions",((t,o)=>((e,t)=>{const o=Array.from(e.getBody().querySelectorAll("details"));0!==o.length&&(f(o,(e=>Ae(e,null!=t?t:!fe(e)))),((e,t,o)=>{e.dispatch("ToggledAllAccordions",{elements:t,state:o})})(e,o,t))})(e,o))),e.addCommand("RemoveAccordion",(()=>(e=>{we(e).each((t=>{const{nextSibling:o}=t;o?(e.selection.select(o,!0),e.selection.collapse(!0)):((e,t)=>{const o=Ne(e);t.insertAdjacentElement("afterend",o),e.selection.setCursorLocation(o,0)})(e,t),t.remove()}))})(e)))};var Se=tinymce.util.Tools.resolve("tinymce.html.Node");const xe=e=>{var t,o;return null!==(o=null===(t=e.attr("class"))||void 0===t?void 0:t.split(" "))&&void 0!==o?o:[]},De=(e,t)=>{const o=new Set([...xe(e),...t]),n=Array.from(o);n.length>0&&e.attr("class",n.join(" "))},Ee=(e,t)=>{const o=((e,o)=>{const n=[];for(let o=0,s=e.length;o0?o.join(" "):null)},Me=e=>e.name===de&&g(xe(e),le),Pe=e=>{const t=e.children();let o,n;const r=[];for(let e=0;e{const t=new Se("br",1);t.attr("data-mce-bogus","1"),e.empty(),e.append(t)};var Be=tinymce.util.Tools.resolve("tinymce.util.VK");const Oe=e=>t=>{const o=()=>t.setEnabled(ve(e));return e.on("NodeChange",o),()=>e.off("NodeChange",o)};e.add("accordion",(e=>{(e=>{const t=()=>e.execCommand("InsertAccordion");e.ui.registry.addButton("accordion",{icon:"accordion",tooltip:"Insert accordion",onSetup:Oe(e),onAction:t}),e.ui.registry.addMenuItem("accordion",{icon:"accordion",text:"Accordion",onSetup:Oe(e),onAction:t}),e.ui.registry.addToggleButton("accordiontoggle",{icon:"accordion-toggle",tooltip:"Toggle accordion",onAction:()=>e.execCommand("ToggleAccordion")}),e.ui.registry.addToggleButton("accordionremove",{icon:"remove",tooltip:"Delete accordion",onAction:()=>e.execCommand("RemoveAccordion")}),e.ui.registry.addContextToolbar("accordion",{predicate:t=>e.dom.is(t,"details")&&e.getBody().contains(t)&&e.dom.isEditable(t.parentNode),items:"accordiontoggle accordionremove",scope:"node",position:"node"})})(e),Ce(e),(e=>{(e=>{e.on("keydown",(t=>{!t.shiftKey&&t.keyCode===Be.ENTER&&ye(e)&&(t.preventDefault(),e.execCommand("ToggleAccordion"))}))})(e),e.on("ExecCommand",(t=>{const o=t.command.toLowerCase();"delete"!==o&&"forwarddelete"!==o||!(e=>we(e).isSome())(e)||(e=>{pe.each(pe.grep(e.dom.select("details",e.getBody())),Te(e))})(e)}))})(e),(e=>{e.on("PreInit",(()=>{const{serializer:t,parser:o}=e;o.addNodeFilter(de,(e=>{for(let t=0;t0)for(let e=0;e{const t=new Set([ce]);for(let o=0;o { + const cmd = listName === 'UL' ? 'InsertUnorderedList' : 'InsertOrderedList'; editor.execCommand(cmd, false, styleValue === false ? null : { 'list-style-type': styleValue }); }; - var register$1 = function (editor) { - editor.addCommand('ApplyUnorderedListStyle', function (ui, value) { + const register$2 = editor => { + editor.addCommand('ApplyUnorderedListStyle', (ui, value) => { applyListFormat(editor, 'UL', value['list-style-type']); }); - editor.addCommand('ApplyOrderedListStyle', function (ui, value) { + editor.addCommand('ApplyOrderedListStyle', (ui, value) => { applyListFormat(editor, 'OL', value['list-style-type']); }); }; - var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); - - var getNumberStyles = function (editor) { - var styles = editor.getParam('advlist_number_styles', 'default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman'); - return styles ? styles.split(/[ ,]/) : []; - }; - var getBulletStyles = function (editor) { - var styles = editor.getParam('advlist_bullet_styles', 'default,circle,square'); - return styles ? styles.split(/[ ,]/) : []; + const option = name => editor => editor.options.get(name); + const register$1 = editor => { + const registerOption = editor.options.register; + registerOption('advlist_number_styles', { + processor: 'string[]', + default: 'default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman'.split(',') + }); + registerOption('advlist_bullet_styles', { + processor: 'string[]', + default: 'default,circle,square'.split(',') + }); }; + const getNumberStyles = option('advlist_number_styles'); + const getBulletStyles = option('advlist_bullet_styles'); - var noop = function () { - }; - var constant = function (value) { - return function () { - return value; - }; - }; - var identity = function (x) { - return x; - }; - var never = constant(false); - var always = constant(true); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; + var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); + + const findUntil = (xs, pred, until) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + if (pred(x, i)) { + return Optional.some(x); + } else if (until(x, i)) { + break; + } + } + return Optional.none(); }; - var isChildOfBody = function (editor, elm) { - return editor.$.contains(editor.getBody(), elm); + const isCustomList = list => /\btox\-/.test(list.className); + const isChildOfBody = (editor, elm) => { + return editor.dom.isChildOf(elm, editor.getBody()); }; - var isTableCellNode = function (node) { - return node && /^(TH|TD)$/.test(node.nodeName); + const matchNodeNames = regex => node => isNonNullable(node) && regex.test(node.nodeName); + const isListNode = matchNodeNames(/^(OL|UL|DL)$/); + const isTableCellNode = matchNodeNames(/^(TH|TD)$/); + const inList = (editor, parents, nodeName) => findUntil(parents, parent => isListNode(parent) && !isCustomList(parent), isTableCellNode).exists(list => list.nodeName === nodeName && isChildOfBody(editor, list)); + const getSelectedStyleType = editor => { + const listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul'); + const style = editor.dom.getStyle(listElm, 'listStyleType'); + return Optional.from(style); }; - var isListNode = function (editor) { - return function (node) { - return node && /^(OL|UL|DL)$/.test(node.nodeName) && isChildOfBody(editor, node); - }; + const isWithinNonEditable = (editor, element) => element !== null && !editor.dom.isEditable(element); + const isWithinNonEditableList = (editor, element) => { + const parentList = editor.dom.getParent(element, 'ol,ul,dl'); + return isWithinNonEditable(editor, parentList) && editor.selection.isEditable(); }; - var getSelectedStyleType = function (editor) { - var listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul'); - var style = editor.dom.getStyle(listElm, 'listStyleType'); - return Optional.from(style); + const setNodeChangeHandler = (editor, nodeChangeHandler) => { + const initialNode = editor.selection.getNode(); + nodeChangeHandler({ + parents: editor.dom.getParents(initialNode), + element: initialNode + }); + editor.on('NodeChange', nodeChangeHandler); + return () => editor.off('NodeChange', nodeChangeHandler); }; - var findIndex = function (list, predicate) { - for (var index = 0; index < list.length; index++) { - var element = list[index]; - if (predicate(element)) { - return index; - } - } - return -1; - }; - var styleValueToText = function (styleValue) { - return styleValue.replace(/\-/g, ' ').replace(/\b\w/g, function (chr) { + const styleValueToText = styleValue => { + return styleValue.replace(/\-/g, ' ').replace(/\b\w/g, chr => { return chr.toUpperCase(); }); }; - var isWithinList = function (editor, e, nodeName) { - var tableCellIndex = findIndex(e.parents, isTableCellNode); - var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents; - var lists = global.grep(parents, isListNode(editor)); - return lists.length > 0 && lists[0].nodeName === nodeName; - }; - var makeSetupHandler = function (editor, nodeName) { - return function (api) { - var nodeChangeHandler = function (e) { - api.setActive(isWithinList(editor, e, nodeName)); - }; - editor.on('NodeChange', nodeChangeHandler); - return function () { - return editor.off('NodeChange', nodeChangeHandler); - }; + const normalizeStyleValue = styleValue => isNullable(styleValue) || styleValue === 'default' ? '' : styleValue; + const makeSetupHandler = (editor, nodeName) => api => { + const updateButtonState = (editor, parents) => { + const element = editor.selection.getStart(true); + api.setActive(inList(editor, parents, nodeName)); + api.setEnabled(!isWithinNonEditableList(editor, element) && editor.selection.isEditable()); }; + const nodeChangeHandler = e => updateButtonState(editor, e.parents); + return setNodeChangeHandler(editor, nodeChangeHandler); }; - var addSplitButton = function (editor, id, tooltip, cmd, nodeName, styles) { + const addSplitButton = (editor, id, tooltip, cmd, nodeName, styles) => { editor.ui.registry.addSplitButton(id, { - tooltip: tooltip, + tooltip, icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', presets: 'listpreview', columns: 3, - fetch: function (callback) { - var items = global.map(styles, function (styleValue) { - var iconStyle = nodeName === 'OL' ? 'num' : 'bull'; - var iconName = styleValue === 'disc' || styleValue === 'decimal' ? 'default' : styleValue; - var itemValue = styleValue === 'default' ? '' : styleValue; - var displayText = styleValueToText(styleValue); + fetch: callback => { + const items = global.map(styles, styleValue => { + const iconStyle = nodeName === 'OL' ? 'num' : 'bull'; + const iconName = styleValue === 'disc' || styleValue === 'decimal' ? 'default' : styleValue; + const itemValue = normalizeStyleValue(styleValue); + const displayText = styleValueToText(styleValue); return { type: 'choiceitem', value: itemValue, @@ -207,55 +210,50 @@ }); callback(items); }, - onAction: function () { - return editor.execCommand(cmd); - }, - onItemAction: function (_splitButtonApi, value) { + onAction: () => editor.execCommand(cmd), + onItemAction: (_splitButtonApi, value) => { applyListFormat(editor, nodeName, value); }, - select: function (value) { - var listStyleType = getSelectedStyleType(editor); - return listStyleType.map(function (listStyle) { - return value === listStyle; - }).getOr(false); + select: value => { + const listStyleType = getSelectedStyleType(editor); + return listStyleType.map(listStyle => value === listStyle).getOr(false); }, onSetup: makeSetupHandler(editor, nodeName) }); }; - var addButton = function (editor, id, tooltip, cmd, nodeName, _styles) { + const addButton = (editor, id, tooltip, cmd, nodeName, styleValue) => { editor.ui.registry.addToggleButton(id, { active: false, - tooltip: tooltip, + tooltip, icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', onSetup: makeSetupHandler(editor, nodeName), - onAction: function () { - return editor.execCommand(cmd); - } + onAction: () => editor.queryCommandState(cmd) || styleValue === '' ? editor.execCommand(cmd) : applyListFormat(editor, nodeName, styleValue) }); }; - var addControl = function (editor, id, tooltip, cmd, nodeName, styles) { + const addControl = (editor, id, tooltip, cmd, nodeName, styles) => { if (styles.length > 1) { addSplitButton(editor, id, tooltip, cmd, nodeName, styles); } else { - addButton(editor, id, tooltip, cmd, nodeName); + addButton(editor, id, tooltip, cmd, nodeName, normalizeStyleValue(styles[0])); } }; - var register = function (editor) { + const register = editor => { addControl(editor, 'numlist', 'Numbered list', 'InsertOrderedList', 'OL', getNumberStyles(editor)); addControl(editor, 'bullist', 'Bullet list', 'InsertUnorderedList', 'UL', getBulletStyles(editor)); }; - function Plugin () { - global$1.add('advlist', function (editor) { + var Plugin = () => { + global$1.add('advlist', editor => { if (editor.hasPlugin('lists')) { - register(editor); register$1(editor); + register(editor); + register$2(editor); } else { console.error('Please use the Lists plugin together with the Advanced List plugin.'); } }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/advlist/plugin.min.js b/public/js/tinymce/plugins/advlist/plugin.min.js index 3cf008a80..c14d6635c 100644 --- a/public/js/tinymce/plugins/advlist/plugin.min.js +++ b/public/js/tinymce/plugins/advlist/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function f(t,e,n){t.execCommand("UL"===e?"InsertUnorderedList":"InsertOrderedList",!1,!1===n?null:{"list-style-type":n})}function i(t){return function(){return t}}function t(t){return t}function e(){return s}var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=tinymce.util.Tools.resolve("tinymce.util.Tools"),u=i(!1),l=i(!0),s={fold:function(t,e){return t()},isSome:u,isNone:l,getOr:t,getOrThunk:r,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:t,orThunk:r,map:e,each:function(){},bind:e,exists:u,forall:l,filter:function(){return s},toArray:function(){return[]},toString:i("none()")};function r(t){return t()}function d(t){return t&&/^(TH|TD)$/.test(t.nodeName)}function m(c,a){return function(s){function t(t){var e,n,r,o,i,u,l;s.setActive((e=c,r=a,i=-1!==(o=function(t,e){for(var n=0;n{const r="UL"===e?"InsertUnorderedList":"InsertOrderedList";t.execCommand(r,!1,!1===s?null:{"list-style-type":s})},s=t=>e=>e.options.get(t),r=s("advlist_number_styles"),n=s("advlist_bullet_styles"),i=t=>null==t,l=t=>!i(t);var o=tinymce.util.Tools.resolve("tinymce.util.Tools");class a{constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return l(t)?a.some(t):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);const u=t=>e=>l(e)&&t.test(e.nodeName),d=u(/^(OL|UL|DL)$/),g=u(/^(TH|TD)$/),c=t=>i(t)||"default"===t?"":t,h=(t,e)=>s=>((t,e)=>{const s=t.selection.getNode();return e({parents:t.dom.getParents(s),element:s}),t.on("NodeChange",e),()=>t.off("NodeChange",e)})(t,(r=>((t,r)=>{const n=t.selection.getStart(!0);s.setActive(((t,e,s)=>((t,e,s)=>{for(let e=0,n=t.length;ee.nodeName===s&&((t,e)=>t.dom.isChildOf(e,t.getBody()))(t,e))))(t,r,e)),s.setEnabled(!((t,e)=>{const s=t.dom.getParent(e,"ol,ul,dl");return((t,e)=>null!==e&&!t.dom.isEditable(e))(t,s)&&t.selection.isEditable()})(t,n)&&t.selection.isEditable())})(t,r.parents))),m=(t,s,r,n,i,l)=>{l.length>1?((t,s,r,n,i,l)=>{t.ui.registry.addSplitButton(s,{tooltip:r,icon:"OL"===i?"ordered-list":"unordered-list",presets:"listpreview",columns:3,fetch:t=>{t(o.map(l,(t=>{const e="OL"===i?"num":"bull",s="disc"===t||"decimal"===t?"default":t,r=c(t),n=(t=>t.replace(/\-/g," ").replace(/\b\w/g,(t=>t.toUpperCase())))(t);return{type:"choiceitem",value:r,icon:"list-"+e+"-"+s,text:n}})))},onAction:()=>t.execCommand(n),onItemAction:(s,r)=>{e(t,i,r)},select:e=>{const s=(t=>{const e=t.dom.getParent(t.selection.getNode(),"ol,ul"),s=t.dom.getStyle(e,"listStyleType");return a.from(s)})(t);return s.map((t=>e===t)).getOr(!1)},onSetup:h(t,i)})})(t,s,r,n,i,l):((t,s,r,n,i,l)=>{t.ui.registry.addToggleButton(s,{active:!1,tooltip:r,icon:"OL"===i?"ordered-list":"unordered-list",onSetup:h(t,i),onAction:()=>t.queryCommandState(n)||""===l?t.execCommand(n):e(t,i,l)})})(t,s,r,n,i,c(l[0]))};t.add("advlist",(t=>{t.hasPlugin("lists")?((t=>{const e=t.options.register;e("advlist_number_styles",{processor:"string[]",default:"default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman".split(",")}),e("advlist_bullet_styles",{processor:"string[]",default:"default,circle,square".split(",")})})(t),(t=>{m(t,"numlist","Numbered list","InsertOrderedList","OL",r(t)),m(t,"bullist","Bullet list","InsertUnorderedList","UL",n(t))})(t),(t=>{t.addCommand("ApplyUnorderedListStyle",((s,r)=>{e(t,"UL",r["list-style-type"])})),t.addCommand("ApplyOrderedListStyle",((s,r)=>{e(t,"OL",r["list-style-type"])}))})(t)):console.error("Please use the Lists plugin together with the Advanced List plugin.")}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/anchor/plugin.js b/public/js/tinymce/plugins/anchor/plugin.js index 2989a82e2..bf24c5dd2 100644 --- a/public/js/tinymce/plugins/anchor/plugin.js +++ b/public/js/tinymce/plugins/anchor/plugin.js @@ -1,11 +1,7 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; @@ -15,75 +11,69 @@ var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); - var allowHtmlInNamedAnchor = function (editor) { - return editor.getParam('allow_html_in_named_anchor', false, 'boolean'); + const option = name => editor => editor.options.get(name); + const register$2 = editor => { + const registerOption = editor.options.register; + registerOption('allow_html_in_named_anchor', { + processor: 'boolean', + default: false + }); }; + const allowHtmlInNamedAnchor = option('allow_html_in_named_anchor'); - var namedAnchorSelector = 'a:not([href])'; - var isEmptyString = function (str) { - return !str; - }; - var getIdFromAnchor = function (elm) { - var id = elm.getAttribute('id') || elm.getAttribute('name'); + const namedAnchorSelector = 'a:not([href])'; + const isEmptyString = str => !str; + const getIdFromAnchor = elm => { + const id = elm.getAttribute('id') || elm.getAttribute('name'); return id || ''; }; - var isAnchor = function (elm) { - return elm && elm.nodeName.toLowerCase() === 'a'; - }; - var isNamedAnchor = function (elm) { - return isAnchor(elm) && !elm.getAttribute('href') && getIdFromAnchor(elm) !== ''; - }; - var isEmptyNamedAnchor = function (elm) { - return isNamedAnchor(elm) && !elm.firstChild; - }; + const isAnchor = elm => elm.nodeName.toLowerCase() === 'a'; + const isNamedAnchor = elm => isAnchor(elm) && !elm.getAttribute('href') && getIdFromAnchor(elm) !== ''; + const isEmptyNamedAnchor = elm => isNamedAnchor(elm) && !elm.firstChild; - var removeEmptyNamedAnchorsInSelection = function (editor) { - var dom = editor.dom; - global$1(dom).walk(editor.selection.getRng(), function (nodes) { - global.each(nodes, function (node) { + const removeEmptyNamedAnchorsInSelection = editor => { + const dom = editor.dom; + global$1(dom).walk(editor.selection.getRng(), nodes => { + global.each(nodes, node => { if (isEmptyNamedAnchor(node)) { dom.remove(node, false); } }); }); }; - var isValidId = function (id) { - return /^[A-Za-z][A-Za-z0-9\-:._]*$/.test(id); - }; - var getNamedAnchor = function (editor) { - return editor.dom.getParent(editor.selection.getStart(), namedAnchorSelector); - }; - var getId = function (editor) { - var anchor = getNamedAnchor(editor); + const isValidId = id => /^[A-Za-z][A-Za-z0-9\-:._]*$/.test(id); + const getNamedAnchor = editor => editor.dom.getParent(editor.selection.getStart(), namedAnchorSelector); + const getId = editor => { + const anchor = getNamedAnchor(editor); if (anchor) { return getIdFromAnchor(anchor); } else { return ''; } }; - var createAnchor = function (editor, id) { - editor.undoManager.transact(function () { + const createAnchor = (editor, id) => { + editor.undoManager.transact(() => { if (!allowHtmlInNamedAnchor(editor)) { editor.selection.collapse(true); } if (editor.selection.isCollapsed()) { - editor.insertContent(editor.dom.createHTML('a', { id: id })); + editor.insertContent(editor.dom.createHTML('a', { id })); } else { removeEmptyNamedAnchorsInSelection(editor); - editor.formatter.remove('namedAnchor', null, null, true); + editor.formatter.remove('namedAnchor', undefined, undefined, true); editor.formatter.apply('namedAnchor', { value: id }); editor.addVisual(); } }); }; - var updateAnchor = function (editor, id, anchorElement) { + const updateAnchor = (editor, id, anchorElement) => { anchorElement.removeAttribute('name'); anchorElement.id = id; editor.addVisual(); editor.undoManager.add(); }; - var insert = function (editor, id) { - var anchor = getNamedAnchor(editor); + const insert = (editor, id) => { + const anchor = getNamedAnchor(editor); if (anchor) { updateAnchor(editor, id, anchor); } else { @@ -92,17 +82,17 @@ editor.focus(); }; - var insertAnchor = function (editor, newId) { + const insertAnchor = (editor, newId) => { if (!isValidId(newId)) { - editor.windowManager.alert('Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.'); + editor.windowManager.alert('ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.'); return false; } else { insert(editor, newId); return true; } }; - var open = function (editor) { - var currentId = getId(editor); + const open = editor => { + const currentId = getId(editor); editor.windowManager.open({ title: 'Anchor', size: 'normal', @@ -129,7 +119,7 @@ } ], initialData: { id: currentId }, - onSubmit: function (api) { + onSubmit: api => { if (insertAnchor(editor, api.getData().id)) { api.close(); } @@ -137,36 +127,30 @@ }); }; - var register$1 = function (editor) { - editor.addCommand('mceAnchor', function () { + const register$1 = editor => { + editor.addCommand('mceAnchor', () => { open(editor); }); }; - var isNamedAnchorNode = function (node) { - return node && isEmptyString(node.attr('href')) && !isEmptyString(node.attr('id') || node.attr('name')); - }; - var isEmptyNamedAnchorNode = function (node) { - return isNamedAnchorNode(node) && !node.firstChild; - }; - var setContentEditable = function (state) { - return function (nodes) { - for (var i = 0; i < nodes.length; i++) { - var node = nodes[i]; - if (isEmptyNamedAnchorNode(node)) { - node.attr('contenteditable', state); - } + const isNamedAnchorNode = node => isEmptyString(node.attr('href')) && !isEmptyString(node.attr('id') || node.attr('name')); + const isEmptyNamedAnchorNode = node => isNamedAnchorNode(node) && !node.firstChild; + const setContentEditable = state => nodes => { + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (isEmptyNamedAnchorNode(node)) { + node.attr('contenteditable', state); } - }; + } }; - var setup = function (editor) { - editor.on('PreInit', function () { + const setup = editor => { + editor.on('PreInit', () => { editor.parser.addNodeFilter('a', setContentEditable('false')); editor.serializer.addNodeFilter('a', setContentEditable(null)); }); }; - var registerFormats = function (editor) { + const registerFormats = editor => { editor.formatter.register('namedAnchor', { inline: 'a', selector: namedAnchorSelector, @@ -174,43 +158,57 @@ split: true, deep: true, attributes: { id: '%value' }, - onmatch: function (node, _fmt, _itemName) { + onmatch: (node, _fmt, _itemName) => { return isNamedAnchor(node); } }); }; - var register = function (editor) { + const onSetupEditable = editor => api => { + const nodeChanged = () => { + api.setEnabled(editor.selection.isEditable()); + }; + editor.on('NodeChange', nodeChanged); + nodeChanged(); + return () => { + editor.off('NodeChange', nodeChanged); + }; + }; + const register = editor => { + const onAction = () => editor.execCommand('mceAnchor'); editor.ui.registry.addToggleButton('anchor', { icon: 'bookmark', tooltip: 'Anchor', - onAction: function () { - return editor.execCommand('mceAnchor'); - }, - onSetup: function (buttonApi) { - return editor.selection.selectorChangedWithUnbind('a:not([href])', buttonApi.setActive).unbind; + onAction, + onSetup: buttonApi => { + const unbindSelectorChanged = editor.selection.selectorChangedWithUnbind('a:not([href])', buttonApi.setActive).unbind; + const unbindEditableChanged = onSetupEditable(editor)(buttonApi); + return () => { + unbindSelectorChanged(); + unbindEditableChanged(); + }; } }); editor.ui.registry.addMenuItem('anchor', { icon: 'bookmark', text: 'Anchor...', - onAction: function () { - return editor.execCommand('mceAnchor'); - } + onAction, + onSetup: onSetupEditable(editor) }); }; - function Plugin () { - global$2.add('anchor', function (editor) { + var Plugin = () => { + global$2.add('anchor', editor => { + register$2(editor); setup(editor); register$1(editor); register(editor); - editor.on('PreInit', function () { + editor.on('PreInit', () => { registerFormats(editor); }); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/anchor/plugin.min.js b/public/js/tinymce/plugins/anchor/plugin.min.js index 790fc842d..075af45c3 100644 --- a/public/js/tinymce/plugins/anchor/plugin.min.js +++ b/public/js/tinymce/plugins/anchor/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function a(e){return e.getAttribute("id")||e.getAttribute("name")||""}function c(e){return e&&"a"===e.nodeName.toLowerCase()&&!e.getAttribute("href")&&""!==a(e)}function d(e){return e.dom.getParent(e.selection.getStart(),l)}function r(e,t){var o,a,n,r,i,l=d(e);l?(n=e,r=t,(i=l).removeAttribute("name"),i.id=r,n.addVisual(),n.undoManager.add()):(a=t,(o=e).undoManager.transact(function(){var e,n;o.getParam("allow_html_in_named_anchor",!1,"boolean")||o.selection.collapse(!0),o.selection.isCollapsed()?o.insertContent(o.dom.createHTML("a",{id:a})):(n=(e=o).dom,u(n).walk(e.selection.getRng(),function(e){s.each(e,function(e){var t;c(t=e)&&!t.firstChild&&n.remove(e,!1)})}),o.formatter.remove("namedAnchor",null,null,!0),o.formatter.apply("namedAnchor",{value:a}),o.addVisual())})),e.focus()}function i(r){return function(e){for(var t,n=0;ne.options.get("allow_html_in_named_anchor"));const a="a:not([href])",r=e=>!e,i=e=>e.getAttribute("id")||e.getAttribute("name")||"",l=e=>(e=>"a"===e.nodeName.toLowerCase())(e)&&!e.getAttribute("href")&&""!==i(e),s=e=>e.dom.getParent(e.selection.getStart(),a),d=(e,a)=>{const r=s(e);r?((e,t,o)=>{o.removeAttribute("name"),o.id=t,e.addVisual(),e.undoManager.add()})(e,a,r):((e,a)=>{e.undoManager.transact((()=>{n(e)||e.selection.collapse(!0),e.selection.isCollapsed()?e.insertContent(e.dom.createHTML("a",{id:a})):((e=>{const n=e.dom;t(n).walk(e.selection.getRng(),(e=>{o.each(e,(e=>{var t;l(t=e)&&!t.firstChild&&n.remove(e,!1)}))}))})(e),e.formatter.remove("namedAnchor",void 0,void 0,!0),e.formatter.apply("namedAnchor",{value:a}),e.addVisual())}))})(e,a),e.focus()},c=e=>(e=>r(e.attr("href"))&&!r(e.attr("id")||e.attr("name")))(e)&&!e.firstChild,m=e=>t=>{for(let o=0;ot=>{const o=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",o),o(),()=>{e.off("NodeChange",o)}};e.add("anchor",(e=>{(e=>{(0,e.options.register)("allow_html_in_named_anchor",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreInit",(()=>{e.parser.addNodeFilter("a",m("false")),e.serializer.addNodeFilter("a",m(null))}))})(e),(e=>{e.addCommand("mceAnchor",(()=>{(e=>{const t=(e=>{const t=s(e);return t?i(t):""})(e);e.windowManager.open({title:"Anchor",size:"normal",body:{type:"panel",items:[{name:"id",type:"input",label:"ID",placeholder:"example"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{id:t},onSubmit:t=>{((e,t)=>/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(t)?(d(e,t),!0):(e.windowManager.alert("ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."),!1))(e,t.getData().id)&&t.close()}})})(e)}))})(e),(e=>{const t=()=>e.execCommand("mceAnchor");e.ui.registry.addToggleButton("anchor",{icon:"bookmark",tooltip:"Anchor",onAction:t,onSetup:t=>{const o=e.selection.selectorChangedWithUnbind("a:not([href])",t.setActive).unbind,n=u(e)(t);return()=>{o(),n()}}}),e.ui.registry.addMenuItem("anchor",{icon:"bookmark",text:"Anchor...",onAction:t,onSetup:u(e)})})(e),e.on("PreInit",(()=>{(e=>{e.formatter.register("namedAnchor",{inline:"a",selector:a,remove:"all",split:!0,deep:!0,attributes:{id:"%value"},onmatch:(e,t,o)=>l(e)})})(e)}))}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/autolink/plugin.js b/public/js/tinymce/plugins/autolink/plugin.js index 2184d076d..5bdbee864 100644 --- a/public/js/tinymce/plugins/autolink/plugin.js +++ b/public/js/tinymce/plugins/autolink/plugin.js @@ -1,213 +1,228 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { - 'use strict'; + 'use strict'; - var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var checkRange = function (str, substr, start) { - return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; - }; - var contains = function (str, substr) { - return str.indexOf(substr) !== -1; - }; - var startsWith = function (str, prefix) { - return checkRange(str, prefix, 0); - }; + const link = () => /(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-.~*+=!;:'%@$(),\/\w]*[-~*+=%@$()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g; - var global = tinymce.util.Tools.resolve('tinymce.Env'); + const option = name => editor => editor.options.get(name); + const register = editor => { + const registerOption = editor.options.register; + registerOption('autolink_pattern', { + processor: 'regexp', + default: new RegExp('^' + link().source + '$', 'i') + }); + registerOption('link_default_target', { processor: 'string' }); + registerOption('link_default_protocol', { + processor: 'string', + default: 'https' + }); + }; + const getAutoLinkPattern = option('autolink_pattern'); + const getDefaultLinkTarget = option('link_default_target'); + const getDefaultLinkProtocol = option('link_default_protocol'); + const allowUnsafeLinkTarget = option('allow_unsafe_link_target'); - var link = function () { - return /(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-+~=.,%()\/\w]*[-+~=%()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g; - }; + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } + }; + const typeOf = x => { + const t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && Array.isArray(x)) { + return 'array'; + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { + return 'string'; + } else { + return t; + } + }; + const isType = type => value => typeOf(value) === type; + const eq = t => a => t === a; + const isString = isType('string'); + const isUndefined = eq(undefined); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); - var defaultLinkPattern = new RegExp('^' + link().source + '$', 'i'); - var getAutoLinkPattern = function (editor) { - return editor.getParam('autolink_pattern', defaultLinkPattern); - }; - var getDefaultLinkTarget = function (editor) { - return editor.getParam('default_link_target', false); - }; - var getDefaultLinkProtocol = function (editor) { - return editor.getParam('link_default_protocol', 'http', 'string'); - }; + const not = f => t => !f(t); - var rangeEqualsBracketOrSpace = function (rangeString) { - return /^[(\[{ \u00a0]$/.test(rangeString); - }; - var isTextNode = function (node) { - return node.nodeType === 3; - }; - var isElement = function (node) { - return node.nodeType === 1; - }; - var handleBracket = function (editor) { - return parseCurrentLine(editor, -1); - }; - var handleSpacebar = function (editor) { - return parseCurrentLine(editor, 0); - }; - var handleEnter = function (editor) { - return parseCurrentLine(editor, -1); - }; - var scopeIndex = function (container, index) { - if (index < 0) { - index = 0; - } - if (isTextNode(container)) { - var len = container.data.length; - if (index > len) { - index = len; - } - } - return index; - }; - var setStart = function (rng, container, offset) { - if (!isElement(container) || container.hasChildNodes()) { - rng.setStart(container, scopeIndex(container, offset)); - } else { - rng.setStartBefore(container); - } - }; - var setEnd = function (rng, container, offset) { - if (!isElement(container) || container.hasChildNodes()) { - rng.setEnd(container, scopeIndex(container, offset)); - } else { - rng.setEndAfter(container); + const hasOwnProperty = Object.hasOwnProperty; + const has = (obj, key) => hasOwnProperty.call(obj, key); + + const checkRange = (str, substr, start) => substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; + const contains = (str, substr, start = 0, end) => { + const idx = str.indexOf(substr, start); + if (idx !== -1) { + return isUndefined(end) ? true : idx + substr.length <= end; + } else { + return false; + } + }; + const startsWith = (str, prefix) => { + return checkRange(str, prefix, 0); + }; + + const zeroWidth = '\uFEFF'; + const isZwsp = char => char === zeroWidth; + const removeZwsp = s => s.replace(/\uFEFF/g, ''); + + var global = tinymce.util.Tools.resolve('tinymce.dom.TextSeeker'); + + const isTextNode = node => node.nodeType === 3; + const isElement = node => node.nodeType === 1; + const isBracketOrSpace = char => /^[(\[{ \u00a0]$/.test(char); + const hasProtocol = url => /^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(url); + const isPunctuation = char => /[?!,.;:]/.test(char); + const findChar = (text, index, predicate) => { + for (let i = index - 1; i >= 0; i--) { + const char = text.charAt(i); + if (!isZwsp(char) && predicate(char)) { + return i; } + } + return -1; + }; + const freefallRtl = (container, offset) => { + let tempNode = container; + let tempOffset = offset; + while (isElement(tempNode) && tempNode.childNodes[tempOffset]) { + tempNode = tempNode.childNodes[tempOffset]; + tempOffset = isTextNode(tempNode) ? tempNode.data.length : tempNode.childNodes.length; + } + return { + container: tempNode, + offset: tempOffset }; - var hasProtocol = function (url) { - return /^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(url); - }; - var isPunctuation = function (char) { - return /[?!,.;:]/.test(char); - }; - var parseCurrentLine = function (editor, endOffset) { - var end, endContainer, bookmark, text, prev, len, rngText; - var autoLinkPattern = getAutoLinkPattern(editor); - var defaultLinkTarget = getDefaultLinkTarget(editor); - if (editor.dom.getParent(editor.selection.getNode(), 'a[href]') !== null) { - return; + }; + + const parseCurrentLine = (editor, offset) => { + var _a; + const voidElements = editor.schema.getVoidElements(); + const autoLinkPattern = getAutoLinkPattern(editor); + const {dom, selection} = editor; + if (dom.getParent(selection.getNode(), 'a[href]') !== null) { + return null; + } + const rng = selection.getRng(); + const textSeeker = global(dom, node => { + return dom.isBlock(node) || has(voidElements, node.nodeName.toLowerCase()) || dom.getContentEditable(node) === 'false'; + }); + const { + container: endContainer, + offset: endOffset + } = freefallRtl(rng.endContainer, rng.endOffset); + const root = (_a = dom.getParent(endContainer, dom.isBlock)) !== null && _a !== void 0 ? _a : dom.getRoot(); + const endSpot = textSeeker.backwards(endContainer, endOffset + offset, (node, offset) => { + const text = node.data; + const idx = findChar(text, offset, not(isBracketOrSpace)); + return idx === -1 || isPunctuation(text[idx]) ? idx : idx + 1; + }, root); + if (!endSpot) { + return null; + } + let lastTextNode = endSpot.container; + const startSpot = textSeeker.backwards(endSpot.container, endSpot.offset, (node, offset) => { + lastTextNode = node; + const idx = findChar(node.data, offset, isBracketOrSpace); + return idx === -1 ? idx : idx + 1; + }, root); + const newRng = dom.createRng(); + if (!startSpot) { + newRng.setStart(lastTextNode, 0); + } else { + newRng.setStart(startSpot.container, startSpot.offset); + } + newRng.setEnd(endSpot.container, endSpot.offset); + const rngText = removeZwsp(newRng.toString()); + const matches = rngText.match(autoLinkPattern); + if (matches) { + let url = matches[0]; + if (startsWith(url, 'www.')) { + const protocol = getDefaultLinkProtocol(editor); + url = protocol + '://' + url; + } else if (contains(url, '@') && !hasProtocol(url)) { + url = 'mailto:' + url; } - var rng = editor.selection.getRng().cloneRange(); - if (rng.startOffset < 5) { - prev = rng.endContainer.previousSibling; - if (!prev) { - if (!rng.endContainer.firstChild || !rng.endContainer.firstChild.nextSibling) { - return; - } - prev = rng.endContainer.firstChild.nextSibling; - } - len = prev.length; - setStart(rng, prev, len); - setEnd(rng, prev, len); - if (rng.endOffset < 5) { - return; - } - end = rng.endOffset; - endContainer = prev; - } else { - endContainer = rng.endContainer; - if (!isTextNode(endContainer) && endContainer.firstChild) { - while (!isTextNode(endContainer) && endContainer.firstChild) { - endContainer = endContainer.firstChild; - } - if (isTextNode(endContainer)) { - setStart(rng, endContainer, 0); - setEnd(rng, endContainer, endContainer.nodeValue.length); - } - } - if (rng.endOffset === 1) { - end = 2; - } else { - end = rng.endOffset - 1 - endOffset; + return { + rng: newRng, + url + }; + } else { + return null; + } + }; + const convertToLink = (editor, result) => { + const {dom, selection} = editor; + const {rng, url} = result; + const bookmark = selection.getBookmark(); + selection.setRng(rng); + const command = 'createlink'; + const args = { + command, + ui: false, + value: url + }; + const beforeExecEvent = editor.dispatch('BeforeExecCommand', args); + if (!beforeExecEvent.isDefaultPrevented()) { + editor.getDoc().execCommand(command, false, url); + editor.dispatch('ExecCommand', args); + const defaultLinkTarget = getDefaultLinkTarget(editor); + if (isString(defaultLinkTarget)) { + const anchor = selection.getNode(); + dom.setAttrib(anchor, 'target', defaultLinkTarget); + if (defaultLinkTarget === '_blank' && !allowUnsafeLinkTarget(editor)) { + dom.setAttrib(anchor, 'rel', 'noopener'); } } - var start = end; - do { - setStart(rng, endContainer, end >= 2 ? end - 2 : 0); - setEnd(rng, endContainer, end >= 1 ? end - 1 : 0); - end -= 1; - rngText = rng.toString(); - } while (!rangeEqualsBracketOrSpace(rngText) && end - 2 >= 0); - if (rangeEqualsBracketOrSpace(rng.toString())) { - setStart(rng, endContainer, end); - setEnd(rng, endContainer, start); - end += 1; - } else if (rng.startOffset === 0) { - setStart(rng, endContainer, 0); - setEnd(rng, endContainer, start); - } else { - setStart(rng, endContainer, end); - setEnd(rng, endContainer, start); + } + selection.moveToBookmark(bookmark); + editor.nodeChanged(); + }; + const handleSpacebar = editor => { + const result = parseCurrentLine(editor, -1); + if (isNonNullable(result)) { + convertToLink(editor, result); + } + }; + const handleBracket = handleSpacebar; + const handleEnter = editor => { + const result = parseCurrentLine(editor, 0); + if (isNonNullable(result)) { + convertToLink(editor, result); + } + }; + const setup = editor => { + editor.on('keydown', e => { + if (e.keyCode === 13 && !e.isDefaultPrevented()) { + handleEnter(editor); } - text = rng.toString(); - if (isPunctuation(text.charAt(text.length - 1))) { - setEnd(rng, endContainer, start - 1); + }); + editor.on('keyup', e => { + if (e.keyCode === 32) { + handleSpacebar(editor); + } else if (e.keyCode === 48 && e.shiftKey || e.keyCode === 221) { + handleBracket(editor); } - text = rng.toString().trim(); - var matches = text.match(autoLinkPattern); - var protocol = getDefaultLinkProtocol(editor); - if (matches) { - var url = matches[0]; - if (startsWith(url, 'www.')) { - url = protocol + '://' + url; - } else if (contains(url, '@') && !hasProtocol(url)) { - url = 'mailto:' + url; - } - bookmark = editor.selection.getBookmark(); - editor.selection.setRng(rng); - editor.execCommand('createlink', false, url); - if (defaultLinkTarget !== false) { - editor.dom.setAttrib(editor.selection.getNode(), 'target', defaultLinkTarget); - } - editor.selection.moveToBookmark(bookmark); - editor.nodeChanged(); - } - }; - var setup = function (editor) { - var autoUrlDetectState; - editor.on('keydown', function (e) { - if (e.keyCode === 13) { - return handleEnter(editor); - } - }); - if (global.browser.isIE()) { - editor.on('focus', function () { - if (!autoUrlDetectState) { - autoUrlDetectState = true; - try { - editor.execCommand('AutoUrlDetect', false, true); - } catch (ex) { - } - } - }); - return; - } - editor.on('keypress', function (e) { - if (e.keyCode === 41 || e.keyCode === 93 || e.keyCode === 125) { - return handleBracket(editor); - } - }); - editor.on('keyup', function (e) { - if (e.keyCode === 32) { - return handleSpacebar(editor); - } - }); - }; + }); + }; - function Plugin () { - global$1.add('autolink', function (editor) { - setup(editor); - }); - } + var Plugin = () => { + global$1.add('autolink', editor => { + register(editor); + setup(editor); + }); + }; - Plugin(); + Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/autolink/plugin.min.js b/public/js/tinymce/plugins/autolink/plugin.min.js index 8468059e6..bd176be4f 100644 --- a/public/js/tinymce/plugins/autolink/plugin.min.js +++ b/public/js/tinymce/plugins/autolink/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function k(e){return/^[(\[{ \u00a0]$/.test(e)}function w(e){return 3===e.nodeType}function i(e){return 1===e.nodeType}function o(e,t){var n;return t<0&&(t=0),!w(e)||(n=e.data.length)=(h="www.").length&&g.substr(0,0+h.length)===h?c=m+"://"+c:-1===c.indexOf("@")||/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(c)||(c="mailto:"+c),o=e.selection.getBookmark(),e.selection.setRng(d),e.execCommand("createlink",!1,c),!1!==s&&e.dom.setAttrib(e.selection.getNode(),"target",s),e.selection.moveToBookmark(o),e.nodeChanged())}}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=tinymce.util.Tools.resolve("tinymce.Env"),A=new RegExp("^"+/(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-+~=.,%()\/\w]*[-+~=%()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g.source+"$","i");e.add("autolink",function(e){var t,n;(t=e).on("keydown",function(e){if(13===e.keyCode)return r(t,-1)}),a.browser.isIE()?t.on("focus",function(){if(!n){n=!0;try{t.execCommand("AutoUrlDetect",!1,!0)}catch(e){}}}):(t.on("keypress",function(e){if(41===e.keyCode||93===e.keyCode||125===e.keyCode)return r(t,-1)}),t.on("keyup",function(e){if(32===e.keyCode)return r(t,0)}))})}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>t.options.get(e),n=t("autolink_pattern"),o=t("link_default_target"),r=t("link_default_protocol"),a=t("allow_unsafe_link_target"),s=("string",e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(a=o.constructor)||void 0===a?void 0:a.name)===r.name)?"string":t;var n,o,r,a})(e));const l=(void 0,e=>undefined===e);const i=e=>!(e=>null==e)(e),c=Object.hasOwnProperty,d=e=>"\ufeff"===e;var u=tinymce.util.Tools.resolve("tinymce.dom.TextSeeker");const f=e=>/^[(\[{ \u00a0]$/.test(e),g=(e,t,n)=>{for(let o=t-1;o>=0;o--){const t=e.charAt(o);if(!d(t)&&n(t))return o}return-1},m=(e,t)=>{var o;const a=e.schema.getVoidElements(),s=n(e),{dom:i,selection:d}=e;if(null!==i.getParent(d.getNode(),"a[href]"))return null;const m=d.getRng(),k=u(i,(e=>{return i.isBlock(e)||(t=a,n=e.nodeName.toLowerCase(),c.call(t,n))||"false"===i.getContentEditable(e);var t,n})),{container:p,offset:y}=((e,t)=>{let n=e,o=t;for(;1===n.nodeType&&n.childNodes[o];)n=n.childNodes[o],o=3===n.nodeType?n.data.length:n.childNodes.length;return{container:n,offset:o}})(m.endContainer,m.endOffset),w=null!==(o=i.getParent(p,i.isBlock))&&void 0!==o?o:i.getRoot(),h=k.backwards(p,y+t,((e,t)=>{const n=e.data,o=g(n,t,(r=f,e=>!r(e)));var r,a;return-1===o||(a=n[o],/[?!,.;:]/.test(a))?o:o+1}),w);if(!h)return null;let v=h.container;const _=k.backwards(h.container,h.offset,((e,t)=>{v=e;const n=g(e.data,t,f);return-1===n?n:n+1}),w),A=i.createRng();_?A.setStart(_.container,_.offset):A.setStart(v,0),A.setEnd(h.container,h.offset);const C=A.toString().replace(/\uFEFF/g,"").match(s);if(C){let t=C[0];return $="www.",(b=t).length>=4&&b.substr(0,4)===$?t=r(e)+"://"+t:((e,t,n=0,o)=>{const r=e.indexOf(t,n);return-1!==r&&(!!l(o)||r+t.length<=o)})(t,"@")&&!(e=>/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(e))(t)&&(t="mailto:"+t),{rng:A,url:t}}var b,$;return null},k=(e,t)=>{const{dom:n,selection:r}=e,{rng:l,url:i}=t,c=r.getBookmark();r.setRng(l);const d="createlink",u={command:d,ui:!1,value:i};if(!e.dispatch("BeforeExecCommand",u).isDefaultPrevented()){e.getDoc().execCommand(d,!1,i),e.dispatch("ExecCommand",u);const t=o(e);if(s(t)){const o=r.getNode();n.setAttrib(o,"target",t),"_blank"!==t||a(e)||n.setAttrib(o,"rel","noopener")}}r.moveToBookmark(c),e.nodeChanged()},p=e=>{const t=m(e,-1);i(t)&&k(e,t)},y=p;e.add("autolink",(e=>{(e=>{const t=e.options.register;t("autolink_pattern",{processor:"regexp",default:new RegExp("^"+/(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-.~*+=!;:'%@$(),\/\w]*[-~*+=%@$()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g.source+"$","i")}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"})})(e),(e=>{e.on("keydown",(t=>{13!==t.keyCode||t.isDefaultPrevented()||(e=>{const t=m(e,0);i(t)&&k(e,t)})(e)})),e.on("keyup",(t=>{32===t.keyCode?p(e):(48===t.keyCode&&t.shiftKey||221===t.keyCode)&&y(e)}))})(e)}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/autoresize/plugin.js b/public/js/tinymce/plugins/autoresize/plugin.js index 5030c196a..de628ae51 100644 --- a/public/js/tinymce/plugins/autoresize/plugin.js +++ b/public/js/tinymce/plugins/autoresize/plugin.js @@ -1,74 +1,56 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; - var Cell = function (initial) { - var value = initial; - var get = function () { + const Cell = initial => { + let value = initial; + const get = () => { return value; }; - var set = function (v) { + const set = v => { value = v; }; return { - get: get, - set: set + get, + set }; }; - var hasOwnProperty = Object.hasOwnProperty; - var has = function (obj, key) { - return hasOwnProperty.call(obj, key); - }; - - var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); + const constant = value => { + return () => { + return value; + }; + }; - var global = tinymce.util.Tools.resolve('tinymce.util.Delay'); + var global = tinymce.util.Tools.resolve('tinymce.Env'); - var fireResizeEditor = function (editor) { - return editor.fire('ResizeEditor'); - }; + const fireResizeEditor = editor => editor.dispatch('ResizeEditor'); - var getAutoResizeMinHeight = function (editor) { - return editor.getParam('min_height', editor.getElement().offsetHeight, 'number'); - }; - var getAutoResizeMaxHeight = function (editor) { - return editor.getParam('max_height', 0, 'number'); - }; - var getAutoResizeOverflowPadding = function (editor) { - return editor.getParam('autoresize_overflow_padding', 1, 'number'); - }; - var getAutoResizeBottomMargin = function (editor) { - return editor.getParam('autoresize_bottom_margin', 50, 'number'); - }; - var shouldAutoResizeOnInit = function (editor) { - return editor.getParam('autoresize_on_init', true, 'boolean'); + const option = name => editor => editor.options.get(name); + const register$1 = editor => { + const registerOption = editor.options.register; + registerOption('autoresize_overflow_padding', { + processor: 'number', + default: 1 + }); + registerOption('autoresize_bottom_margin', { + processor: 'number', + default: 50 + }); }; + const getMinHeight = option('min_height'); + const getMaxHeight = option('max_height'); + const getAutoResizeOverflowPadding = option('autoresize_overflow_padding'); + const getAutoResizeBottomMargin = option('autoresize_bottom_margin'); - var isFullscreen = function (editor) { - return editor.plugins.fullscreen && editor.plugins.fullscreen.isFullscreen(); - }; - var wait = function (editor, oldSize, times, interval, callback) { - global.setEditorTimeout(editor, function () { - resize(editor, oldSize); - if (times--) { - wait(editor, oldSize, times, interval, callback); - } else if (callback) { - callback(); - } - }, interval); - }; - var toggleScrolling = function (editor, state) { - var body = editor.getBody(); + const isFullscreen = editor => editor.plugins.fullscreen && editor.plugins.fullscreen.isFullscreen(); + const toggleScrolling = (editor, state) => { + const body = editor.getBody(); if (body) { body.style.overflowY = state ? '' : 'hidden'; if (!state) { @@ -76,21 +58,23 @@ } } }; - var parseCssValueToInt = function (dom, elm, name, computed) { - var value = parseInt(dom.getStyle(elm, name, computed), 10); + const parseCssValueToInt = (dom, elm, name, computed) => { + var _a; + const value = parseInt((_a = dom.getStyle(elm, name, computed)) !== null && _a !== void 0 ? _a : '', 10); return isNaN(value) ? 0 : value; }; - var shouldScrollIntoView = function (trigger) { + const shouldScrollIntoView = trigger => { if ((trigger === null || trigger === void 0 ? void 0 : trigger.type.toLowerCase()) === 'setcontent') { - var setContentEvent = trigger; + const setContentEvent = trigger; return setContentEvent.selection === true || setContentEvent.paste === true; } else { return false; } }; - var resize = function (editor, oldSize, trigger) { - var dom = editor.dom; - var doc = editor.getDoc(); + const resize = (editor, oldSize, trigger, getExtraMarginBottom) => { + var _a; + const dom = editor.dom; + const doc = editor.getDoc(); if (!doc) { return; } @@ -98,22 +82,23 @@ toggleScrolling(editor, true); return; } - var docEle = doc.documentElement; - var resizeBottomMargin = getAutoResizeBottomMargin(editor); - var resizeHeight = getAutoResizeMinHeight(editor); - var marginTop = parseCssValueToInt(dom, docEle, 'margin-top', true); - var marginBottom = parseCssValueToInt(dom, docEle, 'margin-bottom', true); - var contentHeight = docEle.offsetHeight + marginTop + marginBottom + resizeBottomMargin; + const docEle = doc.documentElement; + const resizeBottomMargin = getExtraMarginBottom ? getExtraMarginBottom() : getAutoResizeOverflowPadding(editor); + const minHeight = (_a = getMinHeight(editor)) !== null && _a !== void 0 ? _a : editor.getElement().offsetHeight; + let resizeHeight = minHeight; + const marginTop = parseCssValueToInt(dom, docEle, 'margin-top', true); + const marginBottom = parseCssValueToInt(dom, docEle, 'margin-bottom', true); + let contentHeight = docEle.offsetHeight + marginTop + marginBottom + resizeBottomMargin; if (contentHeight < 0) { contentHeight = 0; } - var containerHeight = editor.getContainer().offsetHeight; - var contentAreaHeight = editor.getContentAreaContainer().offsetHeight; - var chromeHeight = containerHeight - contentAreaHeight; - if (contentHeight + chromeHeight > getAutoResizeMinHeight(editor)) { + const containerHeight = editor.getContainer().offsetHeight; + const contentAreaHeight = editor.getContentAreaContainer().offsetHeight; + const chromeHeight = containerHeight - contentAreaHeight; + if (contentHeight + chromeHeight > minHeight) { resizeHeight = contentHeight + chromeHeight; } - var maxHeight = getAutoResizeMaxHeight(editor); + const maxHeight = getMaxHeight(editor); if (maxHeight && resizeHeight > maxHeight) { resizeHeight = maxHeight; toggleScrolling(editor, true); @@ -121,64 +106,87 @@ toggleScrolling(editor, false); } if (resizeHeight !== oldSize.get()) { - var deltaSize = resizeHeight - oldSize.get(); + const deltaSize = resizeHeight - oldSize.get(); dom.setStyle(editor.getContainer(), 'height', resizeHeight + 'px'); oldSize.set(resizeHeight); fireResizeEditor(editor); - if (global$1.browser.isSafari() && global$1.mac) { - var win = editor.getWin(); + if (global.browser.isSafari() && (global.os.isMacOS() || global.os.isiOS())) { + const win = editor.getWin(); win.scrollTo(win.pageXOffset, win.pageYOffset); } if (editor.hasFocus() && shouldScrollIntoView(trigger)) { editor.selection.scrollIntoView(); } - if (global$1.webkit && deltaSize < 0) { - resize(editor, oldSize, trigger); + if ((global.browser.isSafari() || global.browser.isChromium()) && deltaSize < 0) { + resize(editor, oldSize, trigger, getExtraMarginBottom); } } }; - var setup = function (editor, oldSize) { - editor.on('init', function () { - var overflowPadding = getAutoResizeOverflowPadding(editor); - var dom = editor.dom; + const setup = (editor, oldSize) => { + let getExtraMarginBottom = () => getAutoResizeBottomMargin(editor); + let resizeCounter; + let sizeAfterFirstResize; + editor.on('init', e => { + resizeCounter = 0; + const overflowPadding = getAutoResizeOverflowPadding(editor); + const dom = editor.dom; dom.setStyles(editor.getDoc().documentElement, { height: 'auto' }); - dom.setStyles(editor.getBody(), { - 'paddingLeft': overflowPadding, - 'paddingRight': overflowPadding, - 'min-height': 0 - }); + if (global.browser.isEdge() || global.browser.isIE()) { + dom.setStyles(editor.getBody(), { + 'paddingLeft': overflowPadding, + 'paddingRight': overflowPadding, + 'min-height': 0 + }); + } else { + dom.setStyles(editor.getBody(), { + paddingLeft: overflowPadding, + paddingRight: overflowPadding + }); + } + resize(editor, oldSize, e, getExtraMarginBottom); + resizeCounter += 1; }); - editor.on('NodeChange SetContent keyup FullscreenStateChanged ResizeContent', function (e) { - resize(editor, oldSize, e); + editor.on('NodeChange SetContent keyup FullscreenStateChanged ResizeContent', e => { + if (resizeCounter === 1) { + sizeAfterFirstResize = editor.getContainer().offsetHeight; + resize(editor, oldSize, e, getExtraMarginBottom); + resizeCounter += 1; + } else if (resizeCounter === 2) { + const isLooping = sizeAfterFirstResize < editor.getContainer().offsetHeight; + if (isLooping) { + const dom = editor.dom; + const doc = editor.getDoc(); + dom.setStyles(doc.documentElement, { 'min-height': 0 }); + dom.setStyles(editor.getBody(), { 'min-height': 'inherit' }); + } + getExtraMarginBottom = isLooping ? constant(0) : getExtraMarginBottom; + resizeCounter += 1; + } else { + resize(editor, oldSize, e, getExtraMarginBottom); + } }); - if (shouldAutoResizeOnInit(editor)) { - editor.on('init', function () { - wait(editor, oldSize, 20, 100, function () { - wait(editor, oldSize, 5, 1000); - }); - }); - } }; - var register = function (editor, oldSize) { - editor.addCommand('mceAutoResize', function () { + const register = (editor, oldSize) => { + editor.addCommand('mceAutoResize', () => { resize(editor, oldSize); }); }; - function Plugin () { - global$2.add('autoresize', function (editor) { - if (!has(editor.settings, 'resize')) { - editor.settings.resize = false; + var Plugin = () => { + global$1.add('autoresize', editor => { + register$1(editor); + if (!editor.options.isSet('resize')) { + editor.options.set('resize', false); } if (!editor.inline) { - var oldSize = Cell(0); + const oldSize = Cell(0); register(editor, oldSize); setup(editor, oldSize); } }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/autoresize/plugin.min.js b/public/js/tinymce/plugins/autoresize/plugin.min.js index 5659cdbcd..c5e5ca891 100644 --- a/public/js/tinymce/plugins/autoresize/plugin.min.js +++ b/public/js/tinymce/plugins/autoresize/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function y(e){return e.getParam("min_height",e.getElement().offsetHeight,"number")}function p(e,t){var n=e.getBody();n&&(n.style.overflowY=t?"":"hidden",t||(n.scrollTop=0))}function v(e,t,n,i){var o=parseInt(e.getStyle(t,n,i),10);return isNaN(o)?0:o}var l=Object.hasOwnProperty,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),b=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),u=function(e,t,n,i,o){r.setEditorTimeout(e,function(){C(e,t),n--?u(e,t,n,i,o):o&&o()},i)},C=function(e,t,n){var i,o,r,s,a,l,u,g,c,m,f,d=e.dom,h=e.getDoc();h&&(e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen()?p(e,!0):(i=h.documentElement,o=e.getParam("autoresize_bottom_margin",50,"number"),r=y(e),s=v(d,i,"margin-top",!0),a=v(d,i,"margin-bottom",!0),(l=(l=i.offsetHeight+s+a+o)<0?0:l)+(u=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight)>y(e)&&(r=l+u),(g=e.getParam("max_height",0,"number"))&&gt=>t.options.get(e),s=o("min_height"),i=o("max_height"),n=o("autoresize_overflow_padding"),r=o("autoresize_bottom_margin"),l=(e,t)=>{const o=e.getBody();o&&(o.style.overflowY=t?"":"hidden",t||(o.scrollTop=0))},g=(e,t,o,s)=>{var i;const n=parseInt(null!==(i=e.getStyle(t,o,s))&&void 0!==i?i:"",10);return isNaN(n)?0:n},a=(e,o,r,c)=>{var d;const f=e.dom,u=e.getDoc();if(!u)return;if((e=>e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen())(e))return void l(e,!0);const m=u.documentElement,h=c?c():n(e),p=null!==(d=s(e))&&void 0!==d?d:e.getElement().offsetHeight;let y=p;const S=g(f,m,"margin-top",!0),v=g(f,m,"margin-bottom",!0);let C=m.offsetHeight+S+v+h;C<0&&(C=0);const b=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;C+b>p&&(y=C+b);const w=i(e);if(w&&y>w?(y=w,l(e,!0)):l(e,!1),y!==o.get()){const s=y-o.get();if(f.setStyle(e.getContainer(),"height",y+"px"),o.set(y),(e=>{e.dispatch("ResizeEditor")})(e),t.browser.isSafari()&&(t.os.isMacOS()||t.os.isiOS())){const t=e.getWin();t.scrollTo(t.pageXOffset,t.pageYOffset)}e.hasFocus()&&(e=>{if("setcontent"===(null==e?void 0:e.type.toLowerCase())){const t=e;return!0===t.selection||!0===t.paste}return!1})(r)&&e.selection.scrollIntoView(),(t.browser.isSafari()||t.browser.isChromium())&&s<0&&a(e,o,r,c)}};e.add("autoresize",(e=>{if((e=>{const t=e.options.register;t("autoresize_overflow_padding",{processor:"number",default:1}),t("autoresize_bottom_margin",{processor:"number",default:50})})(e),e.options.isSet("resize")||e.options.set("resize",!1),!e.inline){const o=(e=>{let t=0;return{get:()=>t,set:e=>{t=e}}})();((e,t)=>{e.addCommand("mceAutoResize",(()=>{a(e,t)}))})(e,o),((e,o)=>{let s,i,l=()=>r(e);e.on("init",(i=>{s=0;const r=n(e),g=e.dom;g.setStyles(e.getDoc().documentElement,{height:"auto"}),t.browser.isEdge()||t.browser.isIE()?g.setStyles(e.getBody(),{paddingLeft:r,paddingRight:r,"min-height":0}):g.setStyles(e.getBody(),{paddingLeft:r,paddingRight:r}),a(e,o,i,l),s+=1})),e.on("NodeChange SetContent keyup FullscreenStateChanged ResizeContent",(t=>{if(1===s)i=e.getContainer().offsetHeight,a(e,o,t,l),s+=1;else if(2===s){const t=i0):l,s+=1}else a(e,o,t,l)}))})(e,o)}}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/autosave/plugin.js b/public/js/tinymce/plugins/autosave/plugin.js index 9905fae04..0be2edbbf 100644 --- a/public/js/tinymce/plugins/autosave/plugin.js +++ b/public/js/tinymce/plugins/autosave/plugin.js @@ -1,22 +1,36 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; var global$4 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var eq = function (t) { - return function (a) { - return t === a; - }; + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } }; - var isUndefined = eq(undefined); + const typeOf = x => { + const t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && Array.isArray(x)) { + return 'array'; + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { + return 'string'; + } else { + return t; + } + }; + const isType = type => value => typeOf(value) === type; + const eq = t => a => t === a; + const isString = isType('string'); + const isUndefined = eq(undefined); var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); @@ -24,74 +38,98 @@ var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); - var fireRestoreDraft = function (editor) { - return editor.fire('RestoreDraft'); - }; - var fireStoreDraft = function (editor) { - return editor.fire('StoreDraft'); - }; - var fireRemoveDraft = function (editor) { - return editor.fire('RemoveDraft'); - }; + const fireRestoreDraft = editor => editor.dispatch('RestoreDraft'); + const fireStoreDraft = editor => editor.dispatch('StoreDraft'); + const fireRemoveDraft = editor => editor.dispatch('RemoveDraft'); - var parse = function (timeString, defaultTime) { - var multiples = { + const parse = timeString => { + const multiples = { s: 1000, m: 60000 }; - var toParse = timeString || defaultTime; - var parsedTime = /^(\d+)([ms]?)$/.exec('' + toParse); - return (parsedTime[2] ? multiples[parsedTime[2]] : 1) * parseInt(toParse, 10); - }; - - var shouldAskBeforeUnload = function (editor) { - return editor.getParam('autosave_ask_before_unload', true); - }; - var getAutoSavePrefix = function (editor) { - var location = document.location; - return editor.getParam('autosave_prefix', 'tinymce-autosave-{path}{query}{hash}-{id}-').replace(/{path}/g, location.pathname).replace(/{query}/g, location.search).replace(/{hash}/g, location.hash).replace(/{id}/g, editor.id); - }; - var shouldRestoreWhenEmpty = function (editor) { - return editor.getParam('autosave_restore_when_empty', false); - }; - var getAutoSaveInterval = function (editor) { - return parse(editor.getParam('autosave_interval'), '30s'); + const parsedTime = /^(\d+)([ms]?)$/.exec(timeString); + return (parsedTime && parsedTime[2] ? multiples[parsedTime[2]] : 1) * parseInt(timeString, 10); + }; + + const option = name => editor => editor.options.get(name); + const register$1 = editor => { + const registerOption = editor.options.register; + const timeProcessor = value => { + const valid = isString(value); + if (valid) { + return { + value: parse(value), + valid + }; + } else { + return { + valid: false, + message: 'Must be a string.' + }; + } + }; + registerOption('autosave_ask_before_unload', { + processor: 'boolean', + default: true + }); + registerOption('autosave_prefix', { + processor: 'string', + default: 'tinymce-autosave-{path}{query}{hash}-{id}-' + }); + registerOption('autosave_restore_when_empty', { + processor: 'boolean', + default: false + }); + registerOption('autosave_interval', { + processor: timeProcessor, + default: '30s' + }); + registerOption('autosave_retention', { + processor: timeProcessor, + default: '20m' + }); }; - var getAutoSaveRetention = function (editor) { - return parse(editor.getParam('autosave_retention'), '20m'); + const shouldAskBeforeUnload = option('autosave_ask_before_unload'); + const shouldRestoreWhenEmpty = option('autosave_restore_when_empty'); + const getAutoSaveInterval = option('autosave_interval'); + const getAutoSaveRetention = option('autosave_retention'); + const getAutoSavePrefix = editor => { + const location = document.location; + return editor.options.get('autosave_prefix').replace(/{path}/g, location.pathname).replace(/{query}/g, location.search).replace(/{hash}/g, location.hash).replace(/{id}/g, editor.id); }; - var isEmpty = function (editor, html) { + const isEmpty = (editor, html) => { if (isUndefined(html)) { return editor.dom.isEmpty(editor.getBody()); } else { - var trimmedHtml = global$1.trim(html); + const trimmedHtml = global$1.trim(html); if (trimmedHtml === '') { return true; } else { - var fragment = new DOMParser().parseFromString(trimmedHtml, 'text/html'); + const fragment = new DOMParser().parseFromString(trimmedHtml, 'text/html'); return editor.dom.isEmpty(fragment); } } }; - var hasDraft = function (editor) { - var time = parseInt(global$2.getItem(getAutoSavePrefix(editor) + 'time'), 10) || 0; + const hasDraft = editor => { + var _a; + const time = parseInt((_a = global$2.getItem(getAutoSavePrefix(editor) + 'time')) !== null && _a !== void 0 ? _a : '0', 10) || 0; if (new Date().getTime() - time > getAutoSaveRetention(editor)) { removeDraft(editor, false); return false; } return true; }; - var removeDraft = function (editor, fire) { - var prefix = getAutoSavePrefix(editor); + const removeDraft = (editor, fire) => { + const prefix = getAutoSavePrefix(editor); global$2.removeItem(prefix + 'draft'); global$2.removeItem(prefix + 'time'); if (fire !== false) { fireRemoveDraft(editor); } }; - var storeDraft = function (editor) { - var prefix = getAutoSavePrefix(editor); + const storeDraft = editor => { + const prefix = getAutoSavePrefix(editor); if (!isEmpty(editor) && editor.isDirty()) { global$2.setItem(prefix + 'draft', editor.getContent({ format: 'raw', @@ -101,53 +139,42 @@ fireStoreDraft(editor); } }; - var restoreDraft = function (editor) { - var prefix = getAutoSavePrefix(editor); + const restoreDraft = editor => { + var _a; + const prefix = getAutoSavePrefix(editor); if (hasDraft(editor)) { - editor.setContent(global$2.getItem(prefix + 'draft'), { format: 'raw' }); + editor.setContent((_a = global$2.getItem(prefix + 'draft')) !== null && _a !== void 0 ? _a : '', { format: 'raw' }); fireRestoreDraft(editor); } }; - var startStoreDraft = function (editor) { - var interval = getAutoSaveInterval(editor); - global$3.setEditorInterval(editor, function () { + const startStoreDraft = editor => { + const interval = getAutoSaveInterval(editor); + global$3.setEditorInterval(editor, () => { storeDraft(editor); }, interval); }; - var restoreLastDraft = function (editor) { - editor.undoManager.transact(function () { + const restoreLastDraft = editor => { + editor.undoManager.transact(() => { restoreDraft(editor); removeDraft(editor); }); editor.focus(); }; - var get = function (editor) { - return { - hasDraft: function () { - return hasDraft(editor); - }, - storeDraft: function () { - return storeDraft(editor); - }, - restoreDraft: function () { - return restoreDraft(editor); - }, - removeDraft: function (fire) { - return removeDraft(editor, fire); - }, - isEmpty: function (html) { - return isEmpty(editor, html); - } - }; - }; + const get = editor => ({ + hasDraft: () => hasDraft(editor), + storeDraft: () => storeDraft(editor), + restoreDraft: () => restoreDraft(editor), + removeDraft: fire => removeDraft(editor, fire), + isEmpty: html => isEmpty(editor, html) + }); var global = tinymce.util.Tools.resolve('tinymce.EditorManager'); - var setup = function (editor) { - editor.editorManager.on('BeforeUnload', function (e) { - var msg; - global$1.each(global.get(), function (editor) { + const setup = editor => { + editor.editorManager.on('BeforeUnload', e => { + let msg; + global$1.each(global.get(), editor => { if (editor.plugins.autosave) { editor.plugins.autosave.storeDraft(); } @@ -162,51 +189,45 @@ }); }; - var makeSetupHandler = function (editor) { - return function (api) { - api.setDisabled(!hasDraft(editor)); - var editorEventCallback = function () { - return api.setDisabled(!hasDraft(editor)); - }; - editor.on('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); - return function () { - return editor.off('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); - }; - }; + const makeSetupHandler = editor => api => { + api.setEnabled(hasDraft(editor)); + const editorEventCallback = () => api.setEnabled(hasDraft(editor)); + editor.on('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + return () => editor.off('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); }; - var register = function (editor) { + const register = editor => { startStoreDraft(editor); + const onAction = () => { + restoreLastDraft(editor); + }; editor.ui.registry.addButton('restoredraft', { tooltip: 'Restore last draft', icon: 'restore-draft', - onAction: function () { - restoreLastDraft(editor); - }, + onAction, onSetup: makeSetupHandler(editor) }); editor.ui.registry.addMenuItem('restoredraft', { text: 'Restore last draft', icon: 'restore-draft', - onAction: function () { - restoreLastDraft(editor); - }, + onAction, onSetup: makeSetupHandler(editor) }); }; - function Plugin () { - global$4.add('autosave', function (editor) { + var Plugin = () => { + global$4.add('autosave', editor => { + register$1(editor); setup(editor); register(editor); - editor.on('init', function () { + editor.on('init', () => { if (shouldRestoreWhenEmpty(editor) && editor.dom.isEmpty(editor.getBody())) { restoreDraft(editor); } }); return get(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/autosave/plugin.min.js b/public/js/tinymce/plugins/autosave/plugin.min.js index 7f1fe9319..6acfa5e8a 100644 --- a/public/js/tinymce/plugins/autosave/plugin.min.js +++ b/public/js/tinymce/plugins/autosave/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function o(t,e){var r=t||e,n=/^(\d+)([ms]?)$/.exec(""+r);return(n[2]?{s:1e3,m:6e4}[n[2]]:1)*parseInt(r,10)}function n(t){var e=document.location;return t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)}function i(t,e){if(a(e))return t.dom.isEmpty(t.getBody());var r=d.trim(e);if(""===r)return!0;var n=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(n)}function u(t){var e=parseInt(v.getItem(n(t)+"time"),10)||0;return!((new Date).getTime()-e>o(t.getParam("autosave_retention"),"20m")&&(g(t,!1),1))}function s(t){var e=n(t);!i(t)&&t.isDirty()&&(v.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),v.setItem(e+"time",(new Date).getTime().toString()),t.fire("StoreDraft"))}function f(t){var e=n(t);u(t)&&(t.setContent(v.getItem(e+"draft"),{format:"raw"}),t.fire("RestoreDraft"))}function c(t){t.undoManager.transact(function(){f(t),g(t)}),t.focus()}function m(r){return function(t){function e(){return t.setDisabled(!u(r))}return t.setDisabled(!u(r)),r.on("StoreDraft RestoreDraft RemoveDraft",e),function(){return r.off("StoreDraft RestoreDraft RemoveDraft",e)}}}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(t){return void 0===t},l=tinymce.util.Tools.resolve("tinymce.util.Delay"),v=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),d=tinymce.util.Tools.resolve("tinymce.util.Tools"),g=function(t,e){var r=n(t);v.removeItem(r+"draft"),v.removeItem(r+"time"),!1!==e&&t.fire("RemoveDraft")},y=tinymce.util.Tools.resolve("tinymce.EditorManager");t.add("autosave",function(t){var e,r,n,a;return t.editorManager.on("BeforeUnload",function(t){var e;d.each(y.get(),function(t){t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&t.getParam("autosave_ask_before_unload",!0)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)}),n=e=t,a=o(n.getParam("autosave_interval"),"30s"),l.setEditorInterval(n,function(){s(n)},a),e.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:function(){c(e)},onSetup:m(e)}),e.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:function(){c(e)},onSetup:m(e)}),t.on("init",function(){t.getParam("autosave_restore_when_empty",!1)&&t.dom.isEmpty(t.getBody())&&f(t)}),r=t,{hasDraft:function(){return u(r)},storeDraft:function(){return s(r)},restoreDraft:function(){return f(r)},removeDraft:function(t){return g(r,t)},isEmpty:function(t){return i(r,t)}}})}(); \ No newline at end of file +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=("string",t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(r=o=t,(a=String).prototype.isPrototypeOf(r)||(null===(s=o.constructor)||void 0===s?void 0:s.name)===a.name)?"string":e;var r,o,a,s})(t));const r=(void 0,t=>undefined===t);var o=tinymce.util.Tools.resolve("tinymce.util.Delay"),a=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),s=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=t=>{const e=/^(\d+)([ms]?)$/.exec(t);return(e&&e[2]?{s:1e3,m:6e4}[e[2]]:1)*parseInt(t,10)},i=t=>e=>e.options.get(t),u=i("autosave_ask_before_unload"),l=i("autosave_restore_when_empty"),c=i("autosave_interval"),d=i("autosave_retention"),m=t=>{const e=document.location;return t.options.get("autosave_prefix").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},v=(t,e)=>{if(r(e))return t.dom.isEmpty(t.getBody());{const r=s.trim(e);if(""===r)return!0;{const e=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(e)}}},f=t=>{var e;const r=parseInt(null!==(e=a.getItem(m(t)+"time"))&&void 0!==e?e:"0",10)||0;return!((new Date).getTime()-r>d(t)&&(p(t,!1),1))},p=(t,e)=>{const r=m(t);a.removeItem(r+"draft"),a.removeItem(r+"time"),!1!==e&&(t=>{t.dispatch("RemoveDraft")})(t)},g=t=>{const e=m(t);!v(t)&&t.isDirty()&&(a.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),a.setItem(e+"time",(new Date).getTime().toString()),(t=>{t.dispatch("StoreDraft")})(t))},y=t=>{var e;const r=m(t);f(t)&&(t.setContent(null!==(e=a.getItem(r+"draft"))&&void 0!==e?e:"",{format:"raw"}),(t=>{t.dispatch("RestoreDraft")})(t))};var D=tinymce.util.Tools.resolve("tinymce.EditorManager");const h=t=>e=>{e.setEnabled(f(t));const r=()=>e.setEnabled(f(t));return t.on("StoreDraft RestoreDraft RemoveDraft",r),()=>t.off("StoreDraft RestoreDraft RemoveDraft",r)};t.add("autosave",(t=>((t=>{const r=t.options.register,o=t=>{const r=e(t);return r?{value:n(t),valid:r}:{valid:!1,message:"Must be a string."}};r("autosave_ask_before_unload",{processor:"boolean",default:!0}),r("autosave_prefix",{processor:"string",default:"tinymce-autosave-{path}{query}{hash}-{id}-"}),r("autosave_restore_when_empty",{processor:"boolean",default:!1}),r("autosave_interval",{processor:o,default:"30s"}),r("autosave_retention",{processor:o,default:"20m"})})(t),(t=>{t.editorManager.on("BeforeUnload",(t=>{let e;s.each(D.get(),(t=>{t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&u(t)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))})),e&&(t.preventDefault(),t.returnValue=e)}))})(t),(t=>{(t=>{const e=c(t);o.setEditorInterval(t,(()=>{g(t)}),e)})(t);const e=()=>{(t=>{t.undoManager.transact((()=>{y(t),p(t)})),t.focus()})(t)};t.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)}),t.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)})})(t),t.on("init",(()=>{l(t)&&t.dom.isEmpty(t.getBody())&&y(t)})),(t=>({hasDraft:()=>f(t),storeDraft:()=>g(t),restoreDraft:()=>y(t),removeDraft:e=>p(t,e),isEmpty:e=>v(t,e)}))(t))))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/bbcode/index.js b/public/js/tinymce/plugins/bbcode/index.js deleted file mode 100644 index 2dd534e63..000000000 --- a/public/js/tinymce/plugins/bbcode/index.js +++ /dev/null @@ -1,7 +0,0 @@ -// Exports the "bbcode" plugin for usage with module loaders -// Usage: -// CommonJS: -// require('tinymce/plugins/bbcode') -// ES2015: -// import 'tinymce/plugins/bbcode' -require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/bbcode/plugin.js b/public/js/tinymce/plugins/bbcode/plugin.js deleted file mode 100644 index b82f3890c..000000000 --- a/public/js/tinymce/plugins/bbcode/plugin.js +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) - */ -(function () { - 'use strict'; - - var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - - var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); - - var html2bbcode = function (s) { - s = global.trim(s); - var rep = function (re, str) { - s = s.replace(re, str); - }; - rep(/(.*?)<\/a>/gi, '[url=$1]$2[/url]'); - rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); - rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); - rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); - rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); - rep(/(.*?)<\/span>/gi, '[color=$1]$2[/color]'); - rep(/(.*?)<\/font>/gi, '[color=$1]$2[/color]'); - rep(/(.*?)<\/span>/gi, '[size=$1]$2[/size]'); - rep(/(.*?)<\/font>/gi, '$1'); - rep(//gi, '[img]$1[/img]'); - rep(/(.*?)<\/span>/gi, '[code]$1[/code]'); - rep(/(.*?)<\/span>/gi, '[quote]$1[/quote]'); - rep(/(.*?)<\/strong>/gi, '[code][b]$1[/b][/code]'); - rep(/(.*?)<\/strong>/gi, '[quote][b]$1[/b][/quote]'); - rep(/(.*?)<\/em>/gi, '[code][i]$1[/i][/code]'); - rep(/(.*?)<\/em>/gi, '[quote][i]$1[/i][/quote]'); - rep(/(.*?)<\/u>/gi, '[code][u]$1[/u][/code]'); - rep(/(.*?)<\/u>/gi, '[quote][u]$1[/u][/quote]'); - rep(/<\/(strong|b)>/gi, '[/b]'); - rep(/<(strong|b)>/gi, '[b]'); - rep(/<\/(em|i)>/gi, '[/i]'); - rep(/<(em|i)>/gi, '[i]'); - rep(/<\/u>/gi, '[/u]'); - rep(/(.*?)<\/span>/gi, '[u]$1[/u]'); - rep(//gi, '[u]'); - rep(/]*>/gi, '[quote]'); - rep(/<\/blockquote>/gi, '[/quote]'); - rep(/
    /gi, '\n'); - rep(//gi, '\n'); - rep(/
    /gi, '\n'); - rep(/

    /gi, ''); - rep(/<\/p>/gi, '\n'); - rep(/ |\u00a0/gi, ' '); - rep(/"/gi, '"'); - rep(/</gi, '<'); - rep(/>/gi, '>'); - rep(/&/gi, '&'); - return s; - }; - var bbcode2html = function (s) { - s = global.trim(s); - var rep = function (re, str) { - s = s.replace(re, str); - }; - rep(/\n/gi, '
    '); - rep(/\[b\]/gi, ''); - rep(/\[\/b\]/gi, ''); - rep(/\[i\]/gi, ''); - rep(/\[\/i\]/gi, ''); - rep(/\[u\]/gi, ''); - rep(/\[\/u\]/gi, ''); - rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi, '
    $2'); - rep(/\[url\](.*?)\[\/url\]/gi, '$1'); - rep(/\[img\](.*?)\[\/img\]/gi, ''); - rep(/\[color=(.*?)\](.*?)\[\/color\]/gi, '$2'); - rep(/\[code\](.*?)\[\/code\]/gi, '$1 '); - rep(/\[quote.*?\](.*?)\[\/quote\]/gi, '$1 '); - return s; - }; - - function Plugin () { - global$1.add('bbcode', function (editor) { - editor.on('BeforeSetContent', function (e) { - e.content = bbcode2html(e.content); - }); - editor.on('PostProcess', function (e) { - if (e.set) { - e.content = bbcode2html(e.content); - } - if (e.get) { - e.content = html2bbcode(e.content); - } - }); - }); - } - - Plugin(); - -}()); diff --git a/public/js/tinymce/plugins/bbcode/plugin.min.js b/public/js/tinymce/plugins/bbcode/plugin.min.js index 06b01ee38..4f0010183 100644 --- a/public/js/tinymce/plugins/bbcode/plugin.min.js +++ b/public/js/tinymce/plugins/bbcode/plugin.min.js @@ -4,6 +4,6 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * - * Version: 5.10.3 (2022-02-09) + * Version: 5.10.5 (2022-05-25) */ !function(){"use strict";function i(t){function o(o,e){t=t.replace(o,e)}return t=n.trim(t),o(/\n/gi,"
    "),o(/\[b\]/gi,""),o(/\[\/b\]/gi,""),o(/\[i\]/gi,""),o(/\[\/i\]/gi,""),o(/\[u\]/gi,""),o(/\[\/u\]/gi,""),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),o(/\[url\](.*?)\[\/url\]/gi,'$1'),o(/\[img\](.*?)\[\/img\]/gi,''),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),o(/\[code\](.*?)\[\/code\]/gi,'$1 '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),t}var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Tools");o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=i(o.content)}),o.on("PostProcess",function(o){function e(o,e){t=t.replace(o,e)}var t;o.set&&(o.content=i(o.content)),o.get&&(o.content=(t=o.content,t=n.trim(t),e(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),e(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),e(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),e(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),e(/(.*?)<\/font>/gi,"$1"),e(//gi,"[img]$1[/img]"),e(/(.*?)<\/span>/gi,"[code]$1[/code]"),e(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),e(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),e(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),e(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),e(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),e(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),e(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),e(/<\/(strong|b)>/gi,"[/b]"),e(/<(strong|b)>/gi,"[b]"),e(/<\/(em|i)>/gi,"[/i]"),e(/<(em|i)>/gi,"[i]"),e(/<\/u>/gi,"[/u]"),e(/(.*?)<\/span>/gi,"[u]$1[/u]"),e(//gi,"[u]"),e(/]*>/gi,"[quote]"),e(/<\/blockquote>/gi,"[/quote]"),e(/
    /gi,"\n"),e(//gi,"\n"),e(/
    /gi,"\n"),e(/

    /gi,""),e(/<\/p>/gi,"\n"),e(/ |\u00a0/gi," "),e(/"/gi,'"'),e(/</gi,"<"),e(/>/gi,">"),e(/&/gi,"&"),t))})})}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/charmap/plugin.js b/public/js/tinymce/plugins/charmap/plugin.js index d8d6d2959..ddf3cdb9d 100644 --- a/public/js/tinymce/plugins/charmap/plugin.js +++ b/public/js/tinymce/plugins/charmap/plugin.js @@ -1,171 +1,170 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; - var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var fireInsertCustomChar = function (editor, chr) { - return editor.fire('insertCustomChar', { chr: chr }); + const fireInsertCustomChar = (editor, chr) => { + return editor.dispatch('insertCustomChar', { chr }); }; - var insertChar = function (editor, chr) { - var evtChr = fireInsertCustomChar(editor, chr).chr; + const insertChar = (editor, chr) => { + const evtChr = fireInsertCustomChar(editor, chr).chr; editor.execCommand('mceInsertContent', false, evtChr); }; - var typeOf = function (x) { - var t = typeof x; + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } + }; + const typeOf = x => { + const t = typeof x; if (x === null) { return 'null'; - } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + } else if (t === 'object' && Array.isArray(x)) { return 'array'; - } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { return 'string'; } else { return t; } }; - var isType = function (type) { - return function (value) { - return typeOf(value) === type; - }; - }; - var eq = function (t) { - return function (a) { - return t === a; - }; - }; - var isArray$1 = isType('array'); - var isNull = eq(null); + const isType = type => value => typeOf(value) === type; + const isSimpleType = type => value => typeof value === type; + const eq = t => a => t === a; + const isArray$1 = isType('array'); + const isNull = eq(null); + const isUndefined = eq(undefined); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); + const isFunction = isSimpleType('function'); - var noop = function () { - }; - var constant = function (value) { - return function () { + const constant = value => { + return () => { return value; }; }; - var identity = function (x) { - return x; - }; - var never = constant(false); - var always = constant(true); + const never = constant(false); - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from - }; + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); - var nativePush = Array.prototype.push; - var map = function (xs, f) { - var len = xs.length; - var r = new Array(len); - for (var i = 0; i < len; i++) { - var x = xs[i]; + const nativePush = Array.prototype.push; + const map = (xs, f) => { + const len = xs.length; + const r = new Array(len); + for (let i = 0; i < len; i++) { + const x = xs[i]; r[i] = f(x, i); } return r; }; - var each = function (xs, f) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const each = (xs, f) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; f(x, i); } }; - var findUntil = function (xs, pred, until) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const findUntil = (xs, pred, until) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; if (pred(x, i)) { return Optional.some(x); } else if (until(x, i)) { @@ -174,12 +173,12 @@ } return Optional.none(); }; - var find = function (xs, pred) { + const find = (xs, pred) => { return findUntil(xs, pred, never); }; - var flatten = function (xs) { - var r = []; - for (var i = 0, len = xs.length; i < len; ++i) { + const flatten = xs => { + const r = []; + for (let i = 0, len = xs.length; i < len; ++i) { if (!isArray$1(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } @@ -187,22 +186,23 @@ } return r; }; - var bind = function (xs, f) { - return flatten(map(xs, f)); - }; + const bind = (xs, f) => flatten(map(xs, f)); - var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); - var getCharMap$1 = function (editor) { - return editor.getParam('charmap'); - }; - var getCharMapAppend = function (editor) { - return editor.getParam('charmap_append'); + const option = name => editor => editor.options.get(name); + const register$2 = editor => { + const registerOption = editor.options.register; + const charMapProcessor = value => isFunction(value) || isArray$1(value); + registerOption('charmap', { processor: charMapProcessor }); + registerOption('charmap_append', { processor: charMapProcessor }); }; + const getCharMap$1 = option('charmap'); + const getCharMapAppend = option('charmap_append'); - var isArray = global$1.isArray; - var UserDefined = 'User Defined'; - var getDefaultCharMap = function () { + const isArray = global.isArray; + const UserDefined = 'User Defined'; + const getDefaultCharMap = () => { return [ { name: 'Currency', @@ -1393,59 +1393,58 @@ } ]; }; - var charmapFilter = function (charmap) { - return global$1.grep(charmap, function (item) { + const charmapFilter = charmap => { + return global.grep(charmap, item => { return isArray(item) && item.length === 2; }); }; - var getCharsFromSetting = function (settingValue) { - if (isArray(settingValue)) { - return charmapFilter(settingValue); + const getCharsFromOption = optionValue => { + if (isArray(optionValue)) { + return charmapFilter(optionValue); } - if (typeof settingValue === 'function') { - return settingValue(); + if (typeof optionValue === 'function') { + return optionValue(); } return []; }; - var extendCharMap = function (editor, charmap) { - var userCharMap = getCharMap$1(editor); + const extendCharMap = (editor, charmap) => { + const userCharMap = getCharMap$1(editor); if (userCharMap) { charmap = [{ name: UserDefined, - characters: getCharsFromSetting(userCharMap) + characters: getCharsFromOption(userCharMap) }]; } - var userCharMapAppend = getCharMapAppend(editor); + const userCharMapAppend = getCharMapAppend(editor); if (userCharMapAppend) { - var userDefinedGroup = global$1.grep(charmap, function (cg) { - return cg.name === UserDefined; - }); + const userDefinedGroup = global.grep(charmap, cg => cg.name === UserDefined); if (userDefinedGroup.length) { - userDefinedGroup[0].characters = [].concat(userDefinedGroup[0].characters).concat(getCharsFromSetting(userCharMapAppend)); + userDefinedGroup[0].characters = [ + ...userDefinedGroup[0].characters, + ...getCharsFromOption(userCharMapAppend) + ]; return charmap; } return charmap.concat({ name: UserDefined, - characters: getCharsFromSetting(userCharMapAppend) + characters: getCharsFromOption(userCharMapAppend) }); } return charmap; }; - var getCharMap = function (editor) { - var groups = extendCharMap(editor, getDefaultCharMap()); + const getCharMap = editor => { + const groups = extendCharMap(editor, getDefaultCharMap()); return groups.length > 1 ? [{ name: 'All', - characters: bind(groups, function (g) { - return g.characters; - }) + characters: bind(groups, g => g.characters) }].concat(groups) : groups; }; - var get = function (editor) { - var getCharMap$1 = function () { + const get = editor => { + const getCharMap$1 = () => { return getCharMap(editor); }; - var insertChar$1 = function (chr) { + const insertChar$1 = chr => { insertChar(editor, chr); }; return { @@ -1454,209 +1453,162 @@ }; }; - var Cell = function (initial) { - var value = initial; - var get = function () { + const Cell = initial => { + let value = initial; + const get = () => { return value; }; - var set = function (v) { + const set = v => { value = v; }; return { - get: get, - set: set + get, + set }; }; - var last = function (fn, rate) { - var timer = null; - var cancel = function () { + const last = (fn, rate) => { + let timer = null; + const cancel = () => { if (!isNull(timer)) { clearTimeout(timer); timer = null; } }; - var throttle = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } + const throttle = (...args) => { cancel(); - timer = setTimeout(function () { + timer = setTimeout(() => { timer = null; fn.apply(null, args); }, rate); }; return { - cancel: cancel, - throttle: throttle + cancel, + throttle }; }; - var nativeFromCodePoint = String.fromCodePoint; - var contains = function (str, substr) { - return str.indexOf(substr) !== -1; - }; - var fromCodePoint = function () { - var codePoints = []; - for (var _i = 0; _i < arguments.length; _i++) { - codePoints[_i] = arguments[_i]; - } - if (nativeFromCodePoint) { - return nativeFromCodePoint.apply(void 0, codePoints); + const contains = (str, substr, start = 0, end) => { + const idx = str.indexOf(substr, start); + if (idx !== -1) { + return isUndefined(end) ? true : idx + substr.length <= end; } else { - var codeUnits = []; - var codeLen = 0; - var result = ''; - for (var index = 0, len = codePoints.length; index !== len; ++index) { - var codePoint = +codePoints[index]; - if (!(codePoint < 1114111 && codePoint >>> 0 === codePoint)) { - throw RangeError('Invalid code point: ' + codePoint); - } - if (codePoint <= 65535) { - codeLen = codeUnits.push(codePoint); - } else { - codePoint -= 65536; - codeLen = codeUnits.push((codePoint >> 10) + 55296, codePoint % 1024 + 56320); - } - if (codeLen >= 16383) { - result += String.fromCharCode.apply(null, codeUnits); - codeUnits.length = 0; - } - } - return result + String.fromCharCode.apply(null, codeUnits); + return false; } }; + const fromCodePoint = String.fromCodePoint; - var charMatches = function (charCode, name, lowerCasePattern) { + const charMatches = (charCode, name, lowerCasePattern) => { if (contains(fromCodePoint(charCode).toLowerCase(), lowerCasePattern)) { return true; } else { return contains(name.toLowerCase(), lowerCasePattern) || contains(name.toLowerCase().replace(/\s+/g, ''), lowerCasePattern); } }; - var scan = function (group, pattern) { - var matches = []; - var lowerCasePattern = pattern.toLowerCase(); - each(group.characters, function (g) { + const scan = (group, pattern) => { + const matches = []; + const lowerCasePattern = pattern.toLowerCase(); + each(group.characters, g => { if (charMatches(g[0], g[1], lowerCasePattern)) { matches.push(g); } }); - return map(matches, function (m) { - return { - text: m[1], - value: fromCodePoint(m[0]), - icon: fromCodePoint(m[0]) - }; - }); + return map(matches, m => ({ + text: m[1], + value: fromCodePoint(m[0]), + icon: fromCodePoint(m[0]) + })); }; - var patternName = 'pattern'; - var open = function (editor, charMap) { - var makeGroupItems = function () { - return [ - { - label: 'Search', - type: 'input', - name: patternName - }, - { - type: 'collection', - name: 'results' - } - ]; - }; - var makeTabs = function () { - return map(charMap, function (charGroup) { - return { - title: charGroup.name, - name: charGroup.name, - items: makeGroupItems() - }; - }); - }; - var makePanel = function () { - return { - type: 'panel', - items: makeGroupItems() - }; - }; - var makeTabPanel = function () { - return { - type: 'tabpanel', - tabs: makeTabs() - }; - }; - var currentTab = charMap.length === 1 ? Cell(UserDefined) : Cell('All'); - var scanAndSet = function (dialogApi, pattern) { - find(charMap, function (group) { - return group.name === currentTab.get(); - }).each(function (f) { - var items = scan(f, pattern); + const patternName = 'pattern'; + const open = (editor, charMap) => { + const makeGroupItems = () => [ + { + label: 'Search', + type: 'input', + name: patternName + }, + { + type: 'collection', + name: 'results' + } + ]; + const makeTabs = () => map(charMap, charGroup => ({ + title: charGroup.name, + name: charGroup.name, + items: makeGroupItems() + })); + const makePanel = () => ({ + type: 'panel', + items: makeGroupItems() + }); + const makeTabPanel = () => ({ + type: 'tabpanel', + tabs: makeTabs() + }); + const currentTab = charMap.length === 1 ? Cell(UserDefined) : Cell('All'); + const scanAndSet = (dialogApi, pattern) => { + find(charMap, group => group.name === currentTab.get()).each(f => { + const items = scan(f, pattern); dialogApi.setData({ results: items }); }); }; - var SEARCH_DELAY = 40; - var updateFilter = last(function (dialogApi) { - var pattern = dialogApi.getData().pattern; + const SEARCH_DELAY = 40; + const updateFilter = last(dialogApi => { + const pattern = dialogApi.getData().pattern; scanAndSet(dialogApi, pattern); }, SEARCH_DELAY); - var body = charMap.length === 1 ? makePanel() : makeTabPanel(); - var initialData = { + const body = charMap.length === 1 ? makePanel() : makeTabPanel(); + const initialData = { pattern: '', results: scan(charMap[0], '') }; - var bridgeSpec = { + const bridgeSpec = { title: 'Special Character', size: 'normal', - body: body, + body, buttons: [{ type: 'cancel', name: 'close', text: 'Close', primary: true }], - initialData: initialData, - onAction: function (api, details) { + initialData, + onAction: (api, details) => { if (details.name === 'results') { insertChar(editor, details.value); api.close(); } }, - onTabChange: function (dialogApi, details) { + onTabChange: (dialogApi, details) => { currentTab.set(details.newTabName); updateFilter.throttle(dialogApi); }, - onChange: function (dialogApi, changeData) { + onChange: (dialogApi, changeData) => { if (changeData.name === patternName) { updateFilter.throttle(dialogApi); } } }; - var dialogApi = editor.windowManager.open(bridgeSpec); + const dialogApi = editor.windowManager.open(bridgeSpec); dialogApi.focus(patternName); }; - var register$1 = function (editor, charMap) { - editor.addCommand('mceShowCharmap', function () { + const register$1 = (editor, charMap) => { + editor.addCommand('mceShowCharmap', () => { open(editor, charMap); }); }; - var global = tinymce.util.Tools.resolve('tinymce.util.Promise'); - - var init = function (editor, all) { + const init = (editor, all) => { editor.ui.registry.addAutocompleter('charmap', { - ch: ':', + trigger: ':', columns: 'auto', minChars: 2, - fetch: function (pattern, _maxResults) { - return new global(function (resolve, _reject) { - resolve(scan(all, pattern)); - }); - }, - onAction: function (autocompleteApi, rng, value) { + fetch: (pattern, _maxResults) => new Promise((resolve, _reject) => { + resolve(scan(all, pattern)); + }), + onAction: (autocompleteApi, rng, value) => { editor.selection.setRng(rng); editor.insertContent(value); autocompleteApi.hide(); @@ -1664,33 +1616,43 @@ }); }; - var register = function (editor) { + const onSetupEditable = editor => api => { + const nodeChanged = () => { + api.setEnabled(editor.selection.isEditable()); + }; + editor.on('NodeChange', nodeChanged); + nodeChanged(); + return () => { + editor.off('NodeChange', nodeChanged); + }; + }; + const register = editor => { + const onAction = () => editor.execCommand('mceShowCharmap'); editor.ui.registry.addButton('charmap', { icon: 'insert-character', tooltip: 'Special character', - onAction: function () { - return editor.execCommand('mceShowCharmap'); - } + onAction, + onSetup: onSetupEditable(editor) }); editor.ui.registry.addMenuItem('charmap', { icon: 'insert-character', text: 'Special character...', - onAction: function () { - return editor.execCommand('mceShowCharmap'); - } + onAction, + onSetup: onSetupEditable(editor) }); }; - function Plugin () { - global$2.add('charmap', function (editor) { - var charMap = getCharMap(editor); + var Plugin = () => { + global$1.add('charmap', editor => { + register$2(editor); + const charMap = getCharMap(editor); register$1(editor, charMap); register(editor); init(editor, charMap[0]); return get(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/charmap/plugin.min.js b/public/js/tinymce/plugins/charmap/plugin.min.js index 3cccc5df6..520b1e817 100644 --- a/public/js/tinymce/plugins/charmap/plugin.min.js +++ b/public/js/tinymce/plugins/charmap/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function l(e,r){var n=e.fire("insertCustomChar",{chr:r}).chr;e.execCommand("mceInsertContent",!1,n)}function i(e){return function(){return e}}function e(e){return e}function r(){return c}var t,g,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(e){return n=typeof(r=e),(null===r?"null":"object"==n&&(Array.prototype.isPrototypeOf(r)||r.constructor&&"Array"===r.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(r)||r.constructor&&"String"===r.constructor.name)?"string":n)===t;var r,n},m=i(!(t="array")),o=i(!(g=null)),c={fold:function(e,r){return e()},isSome:m,isNone:o,getOr:e,getOrThunk:u,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:u,map:r,each:function(){},bind:r,exists:m,forall:o,filter:function(){return c},toArray:function(){return[]},toString:i("none()")};function u(e){return e()}function f(e,r){for(var n=e.length,t=new Array(n),a=0;a>>0===o))throw RangeError("Invalid code point: "+o);16383<=(o<=65535?n.push(o):(o-=65536,n.push(55296+(o>>10),o%1024+56320)))&&(t+=String.fromCharCode.apply(null,n),n.length=0)}return t+String.fromCharCode.apply(null,n)}function v(e,r){var c=[],u=r.toLowerCase();return function(e){for(var r,n,t,a,i=0,o=e.length;i{const r=((e,t)=>e.dispatch("insertCustomChar",{chr:t}))(e,t).chr;e.execCommand("mceInsertContent",!1,r)},r=e=>t=>e===t,a=("array",e=>"array"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(r=a=e,(n=String).prototype.isPrototypeOf(r)||(null===(i=a.constructor)||void 0===i?void 0:i.name)===n.name)?"string":t;var r,a,n,i})(e));const n=r(null),i=r(void 0),o=e=>"function"==typeof e,s=(!1,()=>false);class l{constructor(e,t){this.tag=e,this.value=t}static some(e){return new l(!0,e)}static none(){return l.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?l.some(e(this.value)):l.none()}bind(e){return this.tag?e(this.value):l.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:l.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?l.none():l.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}l.singletonNone=new l(!1);const c=Array.prototype.push,u=(e,t)=>{const r=e.length,a=new Array(r);for(let n=0;nt=>t.options.get(e),m=h("charmap"),p=h("charmap_append"),d=g.isArray,f="User Defined",y=e=>{return d(e)?(t=e,g.grep(t,(e=>d(e)&&2===e.length))):"function"==typeof e?e():[];var t},b=e=>{const t=((e,t)=>{const r=m(e);r&&(t=[{name:f,characters:y(r)}]);const a=p(e);if(a){const e=g.grep(t,(e=>e.name===f));return e.length?(e[0].characters=[...e[0].characters,...y(a)],t):t.concat({name:f,characters:y(a)})}return t})(e,[{name:"Currency",characters:[[36,"dollar sign"],[162,"cent sign"],[8364,"euro sign"],[163,"pound sign"],[165,"yen sign"],[164,"currency sign"],[8352,"euro-currency sign"],[8353,"colon sign"],[8354,"cruzeiro sign"],[8355,"french franc sign"],[8356,"lira sign"],[8357,"mill sign"],[8358,"naira sign"],[8359,"peseta sign"],[8360,"rupee sign"],[8361,"won sign"],[8362,"new sheqel sign"],[8363,"dong sign"],[8365,"kip sign"],[8366,"tugrik sign"],[8367,"drachma sign"],[8368,"german penny symbol"],[8369,"peso sign"],[8370,"guarani sign"],[8371,"austral sign"],[8372,"hryvnia sign"],[8373,"cedi sign"],[8374,"livre tournois sign"],[8375,"spesmilo sign"],[8376,"tenge sign"],[8377,"indian rupee sign"],[8378,"turkish lira sign"],[8379,"nordic mark sign"],[8380,"manat sign"],[8381,"ruble sign"],[20870,"yen character"],[20803,"yuan character"],[22291,"yuan character, in hong kong and taiwan"],[22278,"yen/yuan character variant one"]]},{name:"Text",characters:[[169,"copyright sign"],[174,"registered sign"],[8482,"trade mark sign"],[8240,"per mille sign"],[181,"micro sign"],[183,"middle dot"],[8226,"bullet"],[8230,"three dot leader"],[8242,"minutes / feet"],[8243,"seconds / inches"],[167,"section sign"],[182,"paragraph sign"],[223,"sharp s / ess-zed"]]},{name:"Quotations",characters:[[8249,"single left-pointing angle quotation mark"],[8250,"single right-pointing angle quotation mark"],[171,"left pointing guillemet"],[187,"right pointing guillemet"],[8216,"left single quotation mark"],[8217,"right single quotation mark"],[8220,"left double quotation mark"],[8221,"right double quotation mark"],[8218,"single low-9 quotation mark"],[8222,"double low-9 quotation mark"],[60,"less-than sign"],[62,"greater-than sign"],[8804,"less-than or equal to"],[8805,"greater-than or equal to"],[8211,"en dash"],[8212,"em dash"],[175,"macron"],[8254,"overline"],[164,"currency sign"],[166,"broken bar"],[168,"diaeresis"],[161,"inverted exclamation mark"],[191,"turned question mark"],[710,"circumflex accent"],[732,"small tilde"],[176,"degree sign"],[8722,"minus sign"],[177,"plus-minus sign"],[247,"division sign"],[8260,"fraction slash"],[215,"multiplication sign"],[185,"superscript one"],[178,"superscript two"],[179,"superscript three"],[188,"fraction one quarter"],[189,"fraction one half"],[190,"fraction three quarters"]]},{name:"Mathematical",characters:[[402,"function / florin"],[8747,"integral"],[8721,"n-ary sumation"],[8734,"infinity"],[8730,"square root"],[8764,"similar to"],[8773,"approximately equal to"],[8776,"almost equal to"],[8800,"not equal to"],[8801,"identical to"],[8712,"element of"],[8713,"not an element of"],[8715,"contains as member"],[8719,"n-ary product"],[8743,"logical and"],[8744,"logical or"],[172,"not sign"],[8745,"intersection"],[8746,"union"],[8706,"partial differential"],[8704,"for all"],[8707,"there exists"],[8709,"diameter"],[8711,"backward difference"],[8727,"asterisk operator"],[8733,"proportional to"],[8736,"angle"]]},{name:"Extended Latin",characters:[[192,"A - grave"],[193,"A - acute"],[194,"A - circumflex"],[195,"A - tilde"],[196,"A - diaeresis"],[197,"A - ring above"],[256,"A - macron"],[198,"ligature AE"],[199,"C - cedilla"],[200,"E - grave"],[201,"E - acute"],[202,"E - circumflex"],[203,"E - diaeresis"],[274,"E - macron"],[204,"I - grave"],[205,"I - acute"],[206,"I - circumflex"],[207,"I - diaeresis"],[298,"I - macron"],[208,"ETH"],[209,"N - tilde"],[210,"O - grave"],[211,"O - acute"],[212,"O - circumflex"],[213,"O - tilde"],[214,"O - diaeresis"],[216,"O - slash"],[332,"O - macron"],[338,"ligature OE"],[352,"S - caron"],[217,"U - grave"],[218,"U - acute"],[219,"U - circumflex"],[220,"U - diaeresis"],[362,"U - macron"],[221,"Y - acute"],[376,"Y - diaeresis"],[562,"Y - macron"],[222,"THORN"],[224,"a - grave"],[225,"a - acute"],[226,"a - circumflex"],[227,"a - tilde"],[228,"a - diaeresis"],[229,"a - ring above"],[257,"a - macron"],[230,"ligature ae"],[231,"c - cedilla"],[232,"e - grave"],[233,"e - acute"],[234,"e - circumflex"],[235,"e - diaeresis"],[275,"e - macron"],[236,"i - grave"],[237,"i - acute"],[238,"i - circumflex"],[239,"i - diaeresis"],[299,"i - macron"],[240,"eth"],[241,"n - tilde"],[242,"o - grave"],[243,"o - acute"],[244,"o - circumflex"],[245,"o - tilde"],[246,"o - diaeresis"],[248,"o slash"],[333,"o macron"],[339,"ligature oe"],[353,"s - caron"],[249,"u - grave"],[250,"u - acute"],[251,"u - circumflex"],[252,"u - diaeresis"],[363,"u - macron"],[253,"y - acute"],[254,"thorn"],[255,"y - diaeresis"],[563,"y - macron"],[913,"Alpha"],[914,"Beta"],[915,"Gamma"],[916,"Delta"],[917,"Epsilon"],[918,"Zeta"],[919,"Eta"],[920,"Theta"],[921,"Iota"],[922,"Kappa"],[923,"Lambda"],[924,"Mu"],[925,"Nu"],[926,"Xi"],[927,"Omicron"],[928,"Pi"],[929,"Rho"],[931,"Sigma"],[932,"Tau"],[933,"Upsilon"],[934,"Phi"],[935,"Chi"],[936,"Psi"],[937,"Omega"],[945,"alpha"],[946,"beta"],[947,"gamma"],[948,"delta"],[949,"epsilon"],[950,"zeta"],[951,"eta"],[952,"theta"],[953,"iota"],[954,"kappa"],[955,"lambda"],[956,"mu"],[957,"nu"],[958,"xi"],[959,"omicron"],[960,"pi"],[961,"rho"],[962,"final sigma"],[963,"sigma"],[964,"tau"],[965,"upsilon"],[966,"phi"],[967,"chi"],[968,"psi"],[969,"omega"]]},{name:"Symbols",characters:[[8501,"alef symbol"],[982,"pi symbol"],[8476,"real part symbol"],[978,"upsilon - hook symbol"],[8472,"Weierstrass p"],[8465,"imaginary part"]]},{name:"Arrows",characters:[[8592,"leftwards arrow"],[8593,"upwards arrow"],[8594,"rightwards arrow"],[8595,"downwards arrow"],[8596,"left right arrow"],[8629,"carriage return"],[8656,"leftwards double arrow"],[8657,"upwards double arrow"],[8658,"rightwards double arrow"],[8659,"downwards double arrow"],[8660,"left right double arrow"],[8756,"therefore"],[8834,"subset of"],[8835,"superset of"],[8836,"not a subset of"],[8838,"subset of or equal to"],[8839,"superset of or equal to"],[8853,"circled plus"],[8855,"circled times"],[8869,"perpendicular"],[8901,"dot operator"],[8968,"left ceiling"],[8969,"right ceiling"],[8970,"left floor"],[8971,"right floor"],[9001,"left-pointing angle bracket"],[9002,"right-pointing angle bracket"],[9674,"lozenge"],[9824,"black spade suit"],[9827,"black club suit"],[9829,"black heart suit"],[9830,"black diamond suit"],[8194,"en space"],[8195,"em space"],[8201,"thin space"],[8204,"zero width non-joiner"],[8205,"zero width joiner"],[8206,"left-to-right mark"],[8207,"right-to-left mark"]]}]);return t.length>1?[{name:"All",characters:(r=t,n=e=>e.characters,(e=>{const t=[];for(let r=0,n=e.length;r{let t=e;return{get:()=>t,set:e=>{t=e}}},v=(e,t,r=0,a)=>{const n=e.indexOf(t,r);return-1!==n&&(!!i(a)||n+t.length<=a)},k=String.fromCodePoint,C=(e,t)=>{const r=[],a=t.toLowerCase();return((e,t)=>{for(let t=0,i=e.length;t!!v(k(e).toLowerCase(),r)||v(t.toLowerCase(),r)||v(t.toLowerCase().replace(/\s+/g,""),r))((n=e[t])[0],n[1],a)&&r.push(n);var n})(e.characters),u(r,(e=>({text:e[1],value:k(e[0]),icon:k(e[0])})))},x="pattern",A=(e,r)=>{const a=()=>[{label:"Search",type:"input",name:x},{type:"collection",name:"results"}],i=1===r.length?w(f):w("All"),o=((e,t)=>{let r=null;const a=()=>{n(r)||(clearTimeout(r),r=null)};return{cancel:a,throttle:(...t)=>{a(),r=setTimeout((()=>{r=null,e.apply(null,t)}),40)}}})((e=>{const t=e.getData().pattern;((e,t)=>{var a,n;(a=r,n=e=>e.name===i.get(),((e,t,r)=>{for(let a=0,n=e.length;a{const a=C(r,t);e.setData({results:a})}))})(e,t)})),c={title:"Special Character",size:"normal",body:1===r.length?{type:"panel",items:a()}:{type:"tabpanel",tabs:u(r,(e=>({title:e.name,name:e.name,items:a()})))},buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{pattern:"",results:C(r[0],"")},onAction:(r,a)=>{"results"===a.name&&(t(e,a.value),r.close())},onTabChange:(e,t)=>{i.set(t.newTabName),o.throttle(e)},onChange:(e,t)=>{t.name===x&&o.throttle(e)}};e.windowManager.open(c).focus(x)},q=e=>t=>{const r=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",r),r(),()=>{e.off("NodeChange",r)}};e.add("charmap",(e=>{(e=>{const t=e.options.register,r=e=>o(e)||a(e);t("charmap",{processor:r}),t("charmap_append",{processor:r})})(e);const r=b(e);return((e,t)=>{e.addCommand("mceShowCharmap",(()=>{A(e,t)}))})(e,r),(e=>{const t=()=>e.execCommand("mceShowCharmap");e.ui.registry.addButton("charmap",{icon:"insert-character",tooltip:"Special character",onAction:t,onSetup:q(e)}),e.ui.registry.addMenuItem("charmap",{icon:"insert-character",text:"Special character...",onAction:t,onSetup:q(e)})})(e),((e,t)=>{e.ui.registry.addAutocompleter("charmap",{trigger:":",columns:"auto",minChars:2,fetch:(e,r)=>new Promise(((r,a)=>{r(C(t,e))})),onAction:(t,r,a)=>{e.selection.setRng(r),e.insertContent(a),t.hide()}})})(e,r[0]),(e=>({getCharMap:()=>b(e),insertChar:r=>{t(e,r)}}))(e)}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/code/plugin.js b/public/js/tinymce/plugins/code/plugin.js index 771b1ffeb..9992259a4 100644 --- a/public/js/tinymce/plugins/code/plugin.js +++ b/public/js/tinymce/plugins/code/plugin.js @@ -1,30 +1,26 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var setContent = function (editor, html) { + const setContent = (editor, html) => { editor.focus(); - editor.undoManager.transact(function () { + editor.undoManager.transact(() => { editor.setContent(html); }); editor.selection.setCursorLocation(); editor.nodeChanged(); }; - var getContent = function (editor) { + const getContent = editor => { return editor.getContent({ source_view: true }); }; - var open = function (editor) { - var editorContent = getContent(editor); + const open = editor => { + const editorContent = getContent(editor); editor.windowManager.open({ title: 'Source Code', size: 'large', @@ -49,43 +45,41 @@ } ], initialData: { code: editorContent }, - onSubmit: function (api) { + onSubmit: api => { setContent(editor, api.getData().code); api.close(); } }); }; - var register$1 = function (editor) { - editor.addCommand('mceCodeEditor', function () { + const register$1 = editor => { + editor.addCommand('mceCodeEditor', () => { open(editor); }); }; - var register = function (editor) { - var onAction = function () { - return editor.execCommand('mceCodeEditor'); - }; + const register = editor => { + const onAction = () => editor.execCommand('mceCodeEditor'); editor.ui.registry.addButton('code', { icon: 'sourcecode', tooltip: 'Source code', - onAction: onAction + onAction }); editor.ui.registry.addMenuItem('code', { icon: 'sourcecode', text: 'Source code', - onAction: onAction + onAction }); }; - function Plugin () { - global.add('code', function (editor) { + var Plugin = () => { + global.add('code', editor => { register$1(editor); register(editor); return {}; }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/code/plugin.min.js b/public/js/tinymce/plugins/code/plugin.min.js index 8fb499c51..edee77ec1 100644 --- a/public/js/tinymce/plugins/code/plugin.min.js +++ b/public/js/tinymce/plugins/code/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("code",function(e){var t,o;function n(){return o.execCommand("mceCodeEditor")}return(t=e).addCommand("mceCodeEditor",function(){var n,e;e=(n=t).getContent({source_view:!0}),n.windowManager.open({title:"Source Code",size:"large",body:{type:"panel",items:[{type:"textarea",name:"code"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{code:e},onSubmit:function(e){var t=n,o=e.getData().code;t.focus(),t.undoManager.transact(function(){t.setContent(o)}),t.selection.setCursorLocation(),t.nodeChanged(),e.close()}})}),(o=e).ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:n}),o.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:n}),{}})}(); \ No newline at end of file +!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("code",(e=>((e=>{e.addCommand("mceCodeEditor",(()=>{(e=>{const o=(e=>e.getContent({source_view:!0}))(e);e.windowManager.open({title:"Source Code",size:"large",body:{type:"panel",items:[{type:"textarea",name:"code"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{code:o},onSubmit:o=>{((e,o)=>{e.focus(),e.undoManager.transact((()=>{e.setContent(o)})),e.selection.setCursorLocation(),e.nodeChanged()})(e,o.getData().code),o.close()}})})(e)}))})(e),(e=>{const o=()=>e.execCommand("mceCodeEditor");e.ui.registry.addButton("code",{icon:"sourcecode",tooltip:"Source code",onAction:o}),e.ui.registry.addMenuItem("code",{icon:"sourcecode",text:"Source code",onAction:o})})(e),{})))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/codesample/plugin.js b/public/js/tinymce/plugins/codesample/plugin.js index fcc574acd..57e53cdc0 100644 --- a/public/js/tinymce/plugins/codesample/plugin.js +++ b/public/js/tinymce/plugins/codesample/plugin.js @@ -1,1509 +1,1636 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var noop = function () { + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); + + const noop = () => { }; - var constant = function (value) { - return function () { + const constant = value => { + return () => { return value; }; }; - var identity = function (x) { - return x; - }; - var never = constant(false); - var always = constant(true); - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from - }; - - var get$1 = function (xs, i) { - return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); - }; - var head = function (xs) { - return get$1(xs, 0); - }; + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); - var someIf = function (b, a) { - return b ? Optional.some(a) : Optional.none(); - }; + const get$1 = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + const head = xs => get$1(xs, 0); var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); - var isCodeSample = function (elm) { - return elm && elm.nodeName === 'PRE' && elm.className.indexOf('language-') !== -1; - }; - var trimArg = function (predicateFn) { - return function (arg1, arg2) { - return predicateFn(arg2); - }; - }; - - var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + const Global = typeof window !== 'undefined' ? window : Function('return this;')(); - var exports$1 = {}, module = { exports: exports$1 }, global = {}; - (function (define, exports, module, require) { - var oldprism = window.Prism; + const prismjs = function (global, module, exports) { + const oldprism = window.Prism; window.Prism = { manual: true }; - (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EphoxContactWrapper = factory()); - }(this, function () { - var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - var prismCore = { exports: {} }; - (function (module) { - var _self = typeof window !== 'undefined' ? window : typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope ? self : {}; - var Prism = function (_self) { - var lang = /\blang(?:uage)?-([\w-]+)\b/i; - var uniqueId = 0; - var plainTextGrammar = {}; - var _ = { - manual: _self.Prism && _self.Prism.manual, - disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler, - util: { - encode: function encode(tokens) { - if (tokens instanceof Token) { - return new Token(tokens.type, encode(tokens.content), tokens.alias); - } else if (Array.isArray(tokens)) { - return tokens.map(encode); - } else { - return tokens.replace(/&/g, '&').replace(/' + env.content + ''; - }; - function matchPattern(pattern, pos, text, lookbehind) { - pattern.lastIndex = pos; - var match = pattern.exec(text); - if (match && lookbehind && match[1]) { - var lookbehindLength = match[1].length; - match.index += lookbehindLength; - match[0] = match[0].slice(lookbehindLength); + try { + throw new Error(); + } catch (err) { + var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1]; + if (src) { + var scripts = document.getElementsByTagName('script'); + for (var i in scripts) { + if (scripts[i].src == src) { + return scripts[i]; + } + } + } + return null; + } + }, + isActive: function (element, className, defaultActivation) { + var no = 'no-' + className; + while (element) { + var classList = element.classList; + if (classList.contains(className)) { + return true; + } + if (classList.contains(no)) { + return false; + } + element = element.parentElement; } - return match; + return !!defaultActivation; } - function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) { + }, + languages: { + plain: plainTextGrammar, + plaintext: plainTextGrammar, + text: plainTextGrammar, + txt: plainTextGrammar, + extend: function (id, redef) { + var lang = _.util.clone(_.languages[id]); + for (var key in redef) { + lang[key] = redef[key]; + } + return lang; + }, + insertBefore: function (inside, before, insert, root) { + root = root || _.languages; + var grammar = root[inside]; + var ret = {}; for (var token in grammar) { - if (!grammar.hasOwnProperty(token) || !grammar[token]) { - continue; - } - var patterns = grammar[token]; - patterns = Array.isArray(patterns) ? patterns : [patterns]; - for (var j = 0; j < patterns.length; ++j) { - if (rematch && rematch.cause == token + ',' + j) { - return; - } - var patternObj = patterns[j]; - var inside = patternObj.inside; - var lookbehind = !!patternObj.lookbehind; - var greedy = !!patternObj.greedy; - var alias = patternObj.alias; - if (greedy && !patternObj.pattern.global) { - var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0]; - patternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g'); - } - var pattern = patternObj.pattern || patternObj; - for (var currentNode = startNode.next, pos = startPos; currentNode !== tokenList.tail; pos += currentNode.value.length, currentNode = currentNode.next) { - if (rematch && pos >= rematch.reach) { - break; - } - var str = currentNode.value; - if (tokenList.length > text.length) { - return; - } - if (str instanceof Token) { - continue; - } - var removeCount = 1; - var match; - if (greedy) { - match = matchPattern(pattern, pos, text, lookbehind); - if (!match) { - break; - } - var from = match.index; - var to = match.index + match[0].length; - var p = pos; - p += currentNode.value.length; - while (from >= p) { - currentNode = currentNode.next; - p += currentNode.value.length; - } - p -= currentNode.value.length; - pos = p; - if (currentNode.value instanceof Token) { - continue; - } - for (var k = currentNode; k !== tokenList.tail && (p < to || typeof k.value === 'string'); k = k.next) { - removeCount++; - p += k.value.length; - } - removeCount--; - str = text.slice(pos, p); - match.index -= pos; - } else { - match = matchPattern(pattern, 0, str, lookbehind); - if (!match) { - continue; - } - } - var from = match.index; - var matchStr = match[0]; - var before = str.slice(0, from); - var after = str.slice(from + matchStr.length); - var reach = pos + str.length; - if (rematch && reach > rematch.reach) { - rematch.reach = reach; - } - var removeFrom = currentNode.prev; - if (before) { - removeFrom = addAfter(tokenList, removeFrom, before); - pos += before.length; - } - removeRange(tokenList, removeFrom, removeCount); - var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr); - currentNode = addAfter(tokenList, removeFrom, wrapped); - if (after) { - addAfter(tokenList, currentNode, after); - } - if (removeCount > 1) { - var nestedRematch = { - cause: token + ',' + j, - reach: reach - }; - matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch); - if (rematch && nestedRematch.reach > rematch.reach) { - rematch.reach = nestedRematch.reach; + if (grammar.hasOwnProperty(token)) { + if (token == before) { + for (var newToken in insert) { + if (insert.hasOwnProperty(newToken)) { + ret[newToken] = insert[newToken]; } } } + if (!insert.hasOwnProperty(token)) { + ret[token] = grammar[token]; + } + } + } + var old = root[inside]; + root[inside] = ret; + _.languages.DFS(_.languages, function (key, value) { + if (value === old && key != inside) { + this[key] = ret; + } + }); + return ret; + }, + DFS: function DFS(o, callback, type, visited) { + visited = visited || {}; + var objId = _.util.objId; + for (var i in o) { + if (o.hasOwnProperty(i)) { + callback.call(o, i, o[i], type || i); + var property = o[i]; + var propertyType = _.util.type(property); + if (propertyType === 'Object' && !visited[objId(property)]) { + visited[objId(property)] = true; + DFS(property, callback, null, visited); + } else if (propertyType === 'Array' && !visited[objId(property)]) { + visited[objId(property)] = true; + DFS(property, callback, i, visited); + } } } } - function LinkedList() { - var head = { - value: null, - prev: null, - next: null - }; - var tail = { - value: null, - prev: head, - next: null - }; - head.next = tail; - this.head = head; - this.tail = tail; - this.length = 0; + }, + plugins: {}, + highlightAll: function (async, callback) { + _.highlightAllUnder(document, async, callback); + }, + highlightAllUnder: function (container, async, callback) { + var env = { + callback: callback, + container: container, + selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code' + }; + _.hooks.run('before-highlightall', env); + env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector)); + _.hooks.run('before-all-elements-highlight', env); + for (var i = 0, element; element = env.elements[i++];) { + _.highlightElement(element, async === true, env.callback); } - function addAfter(list, node, value) { - var next = node.next; - var newNode = { - value: value, - prev: node, - next: next - }; - node.next = newNode; - next.prev = newNode; - list.length++; - return newNode; + }, + highlightElement: function (element, async, callback) { + var language = _.util.getLanguage(element); + var grammar = _.languages[language]; + _.util.setLanguage(element, language); + var parent = element.parentElement; + if (parent && parent.nodeName.toLowerCase() === 'pre') { + _.util.setLanguage(parent, language); } - function removeRange(list, node, count) { - var next = node.next; - for (var i = 0; i < count && next !== list.tail; i++) { - next = next.next; - } - node.next = next; - next.prev = node; - list.length -= i; + var code = element.textContent; + var env = { + element: element, + language: language, + grammar: grammar, + code: code + }; + function insertHighlightedCode(highlightedCode) { + env.highlightedCode = highlightedCode; + _.hooks.run('before-insert', env); + env.element.innerHTML = env.highlightedCode; + _.hooks.run('after-highlight', env); + _.hooks.run('complete', env); + callback && callback.call(env.element); } - function toArray(list) { - var array = []; - var node = list.head.next; - while (node !== list.tail) { - array.push(node.value); - node = node.next; - } - return array; + _.hooks.run('before-sanity-check', env); + parent = env.element.parentElement; + if (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) { + parent.setAttribute('tabindex', '0'); } - if (!_self.document) { - if (!_self.addEventListener) { - return _; - } - if (!_.disableWorkerMessageHandler) { - _self.addEventListener('message', function (evt) { - var message = JSON.parse(evt.data); - var lang = message.language; - var code = message.code; - var immediateClose = message.immediateClose; - _self.postMessage(_.highlight(code, _.languages[lang], lang)); - if (immediateClose) { - _self.close(); - } - }, false); - } - return _; + if (!env.code) { + _.hooks.run('complete', env); + callback && callback.call(env.element); + return; } - var script = _.util.currentScript(); - if (script) { - _.filename = script.src; - if (script.hasAttribute('data-manual')) { - _.manual = true; - } + _.hooks.run('before-highlight', env); + if (!env.grammar) { + insertHighlightedCode(_.util.encode(env.code)); + return; + } + if (async && _self.Worker) { + var worker = new Worker(_.filename); + worker.onmessage = function (evt) { + insertHighlightedCode(evt.data); + }; + worker.postMessage(JSON.stringify({ + language: env.language, + code: env.code, + immediateClose: true + })); + } else { + insertHighlightedCode(_.highlight(env.code, env.grammar, env.language)); + } + }, + highlight: function (text, grammar, language) { + var env = { + code: text, + grammar: grammar, + language: language + }; + _.hooks.run('before-tokenize', env); + if (!env.grammar) { + throw new Error('The language "' + env.language + '" has no grammar.'); } - function highlightAutomaticallyCallback() { - if (!_.manual) { - _.highlightAll(); + env.tokens = _.tokenize(env.code, env.grammar); + _.hooks.run('after-tokenize', env); + return Token.stringify(_.util.encode(env.tokens), env.language); + }, + tokenize: function (text, grammar) { + var rest = grammar.rest; + if (rest) { + for (var token in rest) { + grammar[token] = rest[token]; } + delete grammar.rest; } - if (!_.manual) { - var readyState = document.readyState; - if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) { - document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback); - } else { - if (window.requestAnimationFrame) { - window.requestAnimationFrame(highlightAutomaticallyCallback); - } else { - window.setTimeout(highlightAutomaticallyCallback, 16); - } + var tokenList = new LinkedList(); + addAfter(tokenList, tokenList.head, text); + matchGrammar(text, tokenList, grammar, tokenList.head, 0); + return toArray(tokenList); + }, + hooks: { + all: {}, + add: function (name, callback) { + var hooks = _.hooks.all; + hooks[name] = hooks[name] || []; + hooks[name].push(callback); + }, + run: function (name, env) { + var callbacks = _.hooks.all[name]; + if (!callbacks || !callbacks.length) { + return; + } + for (var i = 0, callback; callback = callbacks[i++];) { + callback(env); } } - return _; - }(_self); - if (module.exports) { - module.exports = Prism; + }, + Token: Token + }; + _self.Prism = _; + function Token(type, content, alias, matchedStr) { + this.type = type; + this.content = content; + this.alias = alias; + this.length = (matchedStr || '').length | 0; + } + Token.stringify = function stringify(o, language) { + if (typeof o == 'string') { + return o; } - if (typeof commonjsGlobal !== 'undefined') { - commonjsGlobal.Prism = Prism; + if (Array.isArray(o)) { + var s = ''; + o.forEach(function (e) { + s += stringify(e, language); + }); + return s; } - }(prismCore)); - Prism.languages.clike = { - 'comment': [ - { - pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, - lookbehind: true, - greedy: true - }, - { - pattern: /(^|[^\\:])\/\/.*/, - lookbehind: true, - greedy: true + var env = { + type: o.type, + content: stringify(o.content, language), + tag: 'span', + classes: [ + 'token', + o.type + ], + attributes: {}, + language: language + }; + var aliases = o.alias; + if (aliases) { + if (Array.isArray(aliases)) { + Array.prototype.push.apply(env.classes, aliases); + } else { + env.classes.push(aliases); } - ], - 'string': { - pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, - greedy: true - }, - 'class-name': { - pattern: /(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i, - lookbehind: true, - inside: { 'punctuation': /[.\\]/ } - }, - 'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, - 'boolean': /\b(?:true|false)\b/, - 'function': /\b\w+(?=\()/, - 'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i, - 'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, - 'punctuation': /[{}[\];(),.:]/ + } + _.hooks.run('wrap', env); + var attributes = ''; + for (var name in env.attributes) { + attributes += ' ' + name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"'; + } + return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + attributes + '>' + env.content + ''; }; - (function (Prism) { - function getPlaceholder(language, index) { - return '___' + language.toUpperCase() + index + '___'; + function matchPattern(pattern, pos, text, lookbehind) { + pattern.lastIndex = pos; + var match = pattern.exec(text); + if (match && lookbehind && match[1]) { + var lookbehindLength = match[1].length; + match.index += lookbehindLength; + match[0] = match[0].slice(lookbehindLength); } - Object.defineProperties(Prism.languages['markup-templating'] = {}, { - buildPlaceholders: { - value: function (env, language, placeholderPattern, replaceFilter) { - if (env.language !== language) { + return match; + } + function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) { + for (var token in grammar) { + if (!grammar.hasOwnProperty(token) || !grammar[token]) { + continue; + } + var patterns = grammar[token]; + patterns = Array.isArray(patterns) ? patterns : [patterns]; + for (var j = 0; j < patterns.length; ++j) { + if (rematch && rematch.cause == token + ',' + j) { + return; + } + var patternObj = patterns[j]; + var inside = patternObj.inside; + var lookbehind = !!patternObj.lookbehind; + var greedy = !!patternObj.greedy; + var alias = patternObj.alias; + if (greedy && !patternObj.pattern.global) { + var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0]; + patternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g'); + } + var pattern = patternObj.pattern || patternObj; + for (var currentNode = startNode.next, pos = startPos; currentNode !== tokenList.tail; pos += currentNode.value.length, currentNode = currentNode.next) { + if (rematch && pos >= rematch.reach) { + break; + } + var str = currentNode.value; + if (tokenList.length > text.length) { return; } - var tokenStack = env.tokenStack = []; - env.code = env.code.replace(placeholderPattern, function (match) { - if (typeof replaceFilter === 'function' && !replaceFilter(match)) { - return match; + if (str instanceof Token) { + continue; + } + var removeCount = 1; + var match; + if (greedy) { + match = matchPattern(pattern, pos, text, lookbehind); + if (!match || match.index >= text.length) { + break; } - var i = tokenStack.length; - var placeholder; - while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) { - ++i; + var from = match.index; + var to = match.index + match[0].length; + var p = pos; + p += currentNode.value.length; + while (from >= p) { + currentNode = currentNode.next; + p += currentNode.value.length; + } + p -= currentNode.value.length; + pos = p; + if (currentNode.value instanceof Token) { + continue; + } + for (var k = currentNode; k !== tokenList.tail && (p < to || typeof k.value === 'string'); k = k.next) { + removeCount++; + p += k.value.length; + } + removeCount--; + str = text.slice(pos, p); + match.index -= pos; + } else { + match = matchPattern(pattern, 0, str, lookbehind); + if (!match) { + continue; } - tokenStack[i] = match; - return placeholder; - }); - env.grammar = Prism.languages.markup; - } - }, - tokenizePlaceholders: { - value: function (env, language) { - if (env.language !== language || !env.tokenStack) { - return; } - env.grammar = Prism.languages[language]; - var j = 0; - var keys = Object.keys(env.tokenStack); - function walkTokens(tokens) { - for (var i = 0; i < tokens.length; i++) { - if (j >= keys.length) { - break; - } - var token = tokens[i]; - if (typeof token === 'string' || token.content && typeof token.content === 'string') { - var k = keys[j]; - var t = env.tokenStack[k]; - var s = typeof token === 'string' ? token : token.content; - var placeholder = getPlaceholder(language, k); - var index = s.indexOf(placeholder); - if (index > -1) { - ++j; - var before = s.substring(0, index); - var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t); - var after = s.substring(index + placeholder.length); - var replacement = []; - if (before) { - replacement.push.apply(replacement, walkTokens([before])); - } - replacement.push(middle); - if (after) { - replacement.push.apply(replacement, walkTokens([after])); - } - if (typeof token === 'string') { - tokens.splice.apply(tokens, [ - i, - 1 - ].concat(replacement)); - } else { - token.content = replacement; - } - } - } else if (token.content) { - walkTokens(token.content); - } + var from = match.index; + var matchStr = match[0]; + var before = str.slice(0, from); + var after = str.slice(from + matchStr.length); + var reach = pos + str.length; + if (rematch && reach > rematch.reach) { + rematch.reach = reach; + } + var removeFrom = currentNode.prev; + if (before) { + removeFrom = addAfter(tokenList, removeFrom, before); + pos += before.length; + } + removeRange(tokenList, removeFrom, removeCount); + var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr); + currentNode = addAfter(tokenList, removeFrom, wrapped); + if (after) { + addAfter(tokenList, currentNode, after); + } + if (removeCount > 1) { + var nestedRematch = { + cause: token + ',' + j, + reach: reach + }; + matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch); + if (rematch && nestedRematch.reach > rematch.reach) { + rematch.reach = nestedRematch.reach; } - return tokens; } - walkTokens(env.tokens); } } - }); - }(Prism)); - Prism.languages.c = Prism.languages.extend('clike', { - 'comment': { - pattern: /\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/, + } + } + function LinkedList() { + var head = { + value: null, + prev: null, + next: null + }; + var tail = { + value: null, + prev: head, + next: null + }; + head.next = tail; + this.head = head; + this.tail = tail; + this.length = 0; + } + function addAfter(list, node, value) { + var next = node.next; + var newNode = { + value: value, + prev: node, + next: next + }; + node.next = newNode; + next.prev = newNode; + list.length++; + return newNode; + } + function removeRange(list, node, count) { + var next = node.next; + for (var i = 0; i < count && next !== list.tail; i++) { + next = next.next; + } + node.next = next; + next.prev = node; + list.length -= i; + } + function toArray(list) { + var array = []; + var node = list.head.next; + while (node !== list.tail) { + array.push(node.value); + node = node.next; + } + return array; + } + if (!_self.document) { + if (!_self.addEventListener) { + return _; + } + if (!_.disableWorkerMessageHandler) { + _self.addEventListener('message', function (evt) { + var message = JSON.parse(evt.data); + var lang = message.language; + var code = message.code; + var immediateClose = message.immediateClose; + _self.postMessage(_.highlight(code, _.languages[lang], lang)); + if (immediateClose) { + _self.close(); + } + }, false); + } + return _; + } + var script = _.util.currentScript(); + if (script) { + _.filename = script.src; + if (script.hasAttribute('data-manual')) { + _.manual = true; + } + } + function highlightAutomaticallyCallback() { + if (!_.manual) { + _.highlightAll(); + } + } + if (!_.manual) { + var readyState = document.readyState; + if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) { + document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback); + } else { + if (window.requestAnimationFrame) { + window.requestAnimationFrame(highlightAutomaticallyCallback); + } else { + window.setTimeout(highlightAutomaticallyCallback, 16); + } + } + } + return _; + }(_self); + if (typeof module !== 'undefined' && module.exports) { + module.exports = Prism; + } + if (typeof global !== 'undefined') { + global.Prism = Prism; + } + Prism.languages.clike = { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true, greedy: true }, - 'class-name': { - pattern: /(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/, - lookbehind: true - }, - 'keyword': /\b(?:__attribute__|_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/, - 'function': /\b[a-z_]\w*(?=\s*\()/i, - 'number': /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i, - 'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/ - }); - Prism.languages.insertBefore('c', 'string', { - 'macro': { - pattern: /(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im, + { + pattern: /(^|[^\\:])\/\/.*/, lookbehind: true, - greedy: true, - alias: 'property', - inside: { - 'string': [ - { - pattern: /^(#\s*include\s*)<[^>]+>/, - lookbehind: true - }, - Prism.languages.c['string'] - ], - 'comment': Prism.languages.c['comment'], - 'macro-name': [ - { - pattern: /(^#\s*define\s+)\w+\b(?!\()/i, - lookbehind: true - }, - { - pattern: /(^#\s*define\s+)\w+\b(?=\()/i, - lookbehind: true, - alias: 'function' - } - ], - 'directive': { - pattern: /^(#\s*)[a-z]+/, - lookbehind: true, - alias: 'keyword' - }, - 'directive-hash': /^#/, - 'punctuation': /##|\\(?=[\r\n])/, - 'expression': { - pattern: /\S[\s\S]*/, - inside: Prism.languages.c + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'class-name': { + pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/, + 'boolean': /\b(?:false|true)\b/, + 'function': /\b\w+(?=\()/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i, + 'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, + 'punctuation': /[{}[\];(),.:]/ + }; + (function (Prism) { + function getPlaceholder(language, index) { + return '___' + language.toUpperCase() + index + '___'; + } + Object.defineProperties(Prism.languages['markup-templating'] = {}, { + buildPlaceholders: { + value: function (env, language, placeholderPattern, replaceFilter) { + if (env.language !== language) { + return; } + var tokenStack = env.tokenStack = []; + env.code = env.code.replace(placeholderPattern, function (match) { + if (typeof replaceFilter === 'function' && !replaceFilter(match)) { + return match; + } + var i = tokenStack.length; + var placeholder; + while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) { + ++i; + } + tokenStack[i] = match; + return placeholder; + }); + env.grammar = Prism.languages.markup; } }, - 'constant': /\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/ - }); - delete Prism.languages.c['boolean']; - (function (Prism) { - var keyword = /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/; - var modName = /\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g, function () { - return keyword.source; - }); - Prism.languages.cpp = Prism.languages.extend('c', { - 'class-name': [ - { - pattern: RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g, function () { - return keyword.source; - })), - lookbehind: true - }, - /\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/, - /\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i, - /\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/ - ], - 'keyword': keyword, - 'number': { - pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i, - greedy: true - }, - 'operator': />>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/, - 'boolean': /\b(?:true|false)\b/ - }); - Prism.languages.insertBefore('cpp', 'string', { - 'module': { - pattern: RegExp(/(\b(?:module|import)\s+)/.source + '(?:' + /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source + '|' + /(?:\s*:\s*)?|:\s*/.source.replace(//g, function () { - return modName; - }) + ')'), - lookbehind: true, - greedy: true, - inside: { - 'string': /^[<"][\s\S]+/, - 'operator': /:/, - 'punctuation': /\./ + tokenizePlaceholders: { + value: function (env, language) { + if (env.language !== language || !env.tokenStack) { + return; } - }, - 'raw-string': { - pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/, - alias: 'string', - greedy: true - } - }); - Prism.languages.insertBefore('cpp', 'keyword', { - 'generic-function': { - pattern: /\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i, - inside: { - 'function': /^\w+/, - 'generic': { - pattern: /<[\s\S]+/, - alias: 'class-name', - inside: Prism.languages.cpp + env.grammar = Prism.languages[language]; + var j = 0; + var keys = Object.keys(env.tokenStack); + function walkTokens(tokens) { + for (var i = 0; i < tokens.length; i++) { + if (j >= keys.length) { + break; + } + var token = tokens[i]; + if (typeof token === 'string' || token.content && typeof token.content === 'string') { + var k = keys[j]; + var t = env.tokenStack[k]; + var s = typeof token === 'string' ? token : token.content; + var placeholder = getPlaceholder(language, k); + var index = s.indexOf(placeholder); + if (index > -1) { + ++j; + var before = s.substring(0, index); + var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t); + var after = s.substring(index + placeholder.length); + var replacement = []; + if (before) { + replacement.push.apply(replacement, walkTokens([before])); + } + replacement.push(middle); + if (after) { + replacement.push.apply(replacement, walkTokens([after])); + } + if (typeof token === 'string') { + tokens.splice.apply(tokens, [ + i, + 1 + ].concat(replacement)); + } else { + token.content = replacement; + } + } + } else if (token.content) { + walkTokens(token.content); + } } + return tokens; } + walkTokens(env.tokens); } - }); - Prism.languages.insertBefore('cpp', 'operator', { - 'double-colon': { - pattern: /::/, - alias: 'punctuation' - } - }); - Prism.languages.insertBefore('cpp', 'class-name', { - 'base-clause': { - pattern: /(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/, - lookbehind: true, - greedy: true, - inside: Prism.languages.extend('cpp', {}) - } - }); - Prism.languages.insertBefore('inside', 'double-colon', { 'class-name': /\b[a-z_]\w*\b(?!\s*::)/i }, Prism.languages.cpp['base-clause']); - }(Prism)); - (function (Prism) { - function replace(pattern, replacements) { - return pattern.replace(/<<(\d+)>>/g, function (m, index) { - return '(?:' + replacements[+index] + ')'; - }); - } - function re(pattern, replacements, flags) { - return RegExp(replace(pattern, replacements), flags || ''); - } - function nested(pattern, depthLog2) { - for (var i = 0; i < depthLog2; i++) { - pattern = pattern.replace(/<>/g, function () { - return '(?:' + pattern + ')'; - }); - } - return pattern.replace(/<>/g, '[^\\s\\S]'); - } - var keywordKinds = { - type: 'bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void', - typeDeclaration: 'class enum interface record struct', - contextual: 'add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)', - other: 'abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield' - }; - function keywordsToPattern(words) { - return '\\b(?:' + words.trim().replace(/ /g, '|') + ')\\b'; } - var typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration); - var keywords = RegExp(keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other)); - var nonTypeKeywords = keywordsToPattern(keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other); - var nonContextualKeywords = keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.other); - var generic = nested(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source, 2); - var nestedRound = nested(/\((?:[^()]|<>)*\)/.source, 2); - var name = /@?\b[A-Za-z_]\w*\b/.source; - var genericName = replace(/<<0>>(?:\s*<<1>>)?/.source, [ - name, - generic - ]); - var identifier = replace(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source, [ - nonTypeKeywords, - genericName - ]); - var array = /\[\s*(?:,\s*)*\]/.source; - var typeExpressionWithoutTuple = replace(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source, [ - identifier, - array - ]); - var tupleElement = replace(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [ - generic, - nestedRound, - array - ]); - var tuple = replace(/\(<<0>>+(?:,<<0>>+)+\)/.source, [tupleElement]); - var typeExpression = replace(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source, [ - tuple, - identifier, - array - ]); - var typeInside = { - 'keyword': keywords, - 'punctuation': /[<>()?,.:[\]]/ - }; - var character = /'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source; - var regularString = /"(?:\\.|[^\\"\r\n])*"/.source; - var verbatimString = /@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source; - Prism.languages.csharp = Prism.languages.extend('clike', { + }); + }(Prism)); + Prism.languages.c = Prism.languages.extend('clike', { + 'comment': { + pattern: /\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/, + greedy: true + }, + 'string': { + pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/, + greedy: true + }, + 'class-name': { + pattern: /(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/, + lookbehind: true + }, + 'keyword': /\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/, + 'function': /\b[a-z_]\w*(?=\s*\()/i, + 'number': /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i, + 'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/ + }); + Prism.languages.insertBefore('c', 'string', { + 'char': { + pattern: /'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/, + greedy: true + } + }); + Prism.languages.insertBefore('c', 'string', { + 'macro': { + pattern: /(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im, + lookbehind: true, + greedy: true, + alias: 'property', + inside: { 'string': [ { - pattern: re(/(^|[^$\\])<<0>>/.source, [verbatimString]), - lookbehind: true, - greedy: true - }, - { - pattern: re(/(^|[^@$\\])<<0>>/.source, [regularString]), - lookbehind: true, - greedy: true - }, - { - pattern: RegExp(character), - greedy: true, - alias: 'character' - } - ], - 'class-name': [ - { - pattern: re(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source, [identifier]), - lookbehind: true, - inside: typeInside - }, - { - pattern: re(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source, [ - name, - typeExpression - ]), - lookbehind: true, - inside: typeInside - }, - { - pattern: re(/(\busing\s+)<<0>>(?=\s*=)/.source, [name]), + pattern: /^(#\s*include\s*)<[^>]+>/, lookbehind: true }, + Prism.languages.c['string'] + ], + 'char': Prism.languages.c['char'], + 'comment': Prism.languages.c['comment'], + 'macro-name': [ { - pattern: re(/(\b<<0>>\s+)<<1>>/.source, [ - typeDeclarationKeywords, - genericName - ]), - lookbehind: true, - inside: typeInside - }, - { - pattern: re(/(\bcatch\s*\(\s*)<<0>>/.source, [identifier]), - lookbehind: true, - inside: typeInside - }, - { - pattern: re(/(\bwhere\s+)<<0>>/.source, [name]), + pattern: /(^#\s*define\s+)\w+\b(?!\()/i, lookbehind: true }, { - pattern: re(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source, [typeExpressionWithoutTuple]), + pattern: /(^#\s*define\s+)\w+\b(?=\()/i, lookbehind: true, - inside: typeInside - }, - { - pattern: re(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source, [ - typeExpression, - nonContextualKeywords, - name - ]), - inside: typeInside + alias: 'function' } ], - 'keyword': keywords, - 'number': /(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i, - 'operator': />>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/, - 'punctuation': /\?\.?|::|[{}[\];(),.:]/ - }); - Prism.languages.insertBefore('csharp', 'number', { - 'range': { - pattern: /\.\./, - alias: 'operator' - } - }); - Prism.languages.insertBefore('csharp', 'punctuation', { - 'named-parameter': { - pattern: re(/([(,]\s*)<<0>>(?=\s*:)/.source, [name]), + 'directive': { + pattern: /^(#\s*)[a-z]+/, lookbehind: true, - alias: 'punctuation' + alias: 'keyword' + }, + 'directive-hash': /^#/, + 'punctuation': /##|\\(?=[\r\n])/, + 'expression': { + pattern: /\S[\s\S]*/, + inside: Prism.languages.c + } + } + } + }); + Prism.languages.insertBefore('c', 'function', { 'constant': /\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/ }); + delete Prism.languages.c['boolean']; + (function (Prism) { + var keyword = /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/; + var modName = /\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g, function () { + return keyword.source; + }); + Prism.languages.cpp = Prism.languages.extend('c', { + 'class-name': [ + { + pattern: RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g, function () { + return keyword.source; + })), + lookbehind: true + }, + /\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/, + /\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i, + /\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/ + ], + 'keyword': keyword, + 'number': { + pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i, + greedy: true + }, + 'operator': />>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/, + 'boolean': /\b(?:false|true)\b/ + }); + Prism.languages.insertBefore('cpp', 'string', { + 'module': { + pattern: RegExp(/(\b(?:import|module)\s+)/.source + '(?:' + /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source + '|' + /(?:\s*:\s*)?|:\s*/.source.replace(//g, function () { + return modName; + }) + ')'), + lookbehind: true, + greedy: true, + inside: { + 'string': /^[<"][\s\S]+/, + 'operator': /:/, + 'punctuation': /\./ + } + }, + 'raw-string': { + pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/, + alias: 'string', + greedy: true + } + }); + Prism.languages.insertBefore('cpp', 'keyword', { + 'generic-function': { + pattern: /\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i, + inside: { + 'function': /^\w+/, + 'generic': { + pattern: /<[\s\S]+/, + alias: 'class-name', + inside: Prism.languages.cpp + } } + } + }); + Prism.languages.insertBefore('cpp', 'operator', { + 'double-colon': { + pattern: /::/, + alias: 'punctuation' + } + }); + Prism.languages.insertBefore('cpp', 'class-name', { + 'base-clause': { + pattern: /(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/, + lookbehind: true, + greedy: true, + inside: Prism.languages.extend('cpp', {}) + } + }); + Prism.languages.insertBefore('inside', 'double-colon', { 'class-name': /\b[a-z_]\w*\b(?!\s*::)/i }, Prism.languages.cpp['base-clause']); + }(Prism)); + (function (Prism) { + function replace(pattern, replacements) { + return pattern.replace(/<<(\d+)>>/g, function (m, index) { + return '(?:' + replacements[+index] + ')'; }); - Prism.languages.insertBefore('csharp', 'class-name', { - 'namespace': { - pattern: re(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source, [name]), + } + function re(pattern, replacements, flags) { + return RegExp(replace(pattern, replacements), flags || ''); + } + function nested(pattern, depthLog2) { + for (var i = 0; i < depthLog2; i++) { + pattern = pattern.replace(/<>/g, function () { + return '(?:' + pattern + ')'; + }); + } + return pattern.replace(/<>/g, '[^\\s\\S]'); + } + var keywordKinds = { + type: 'bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void', + typeDeclaration: 'class enum interface record struct', + contextual: 'add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)', + other: 'abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield' + }; + function keywordsToPattern(words) { + return '\\b(?:' + words.trim().replace(/ /g, '|') + ')\\b'; + } + var typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration); + var keywords = RegExp(keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other)); + var nonTypeKeywords = keywordsToPattern(keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other); + var nonContextualKeywords = keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.other); + var generic = nested(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source, 2); + var nestedRound = nested(/\((?:[^()]|<>)*\)/.source, 2); + var name = /@?\b[A-Za-z_]\w*\b/.source; + var genericName = replace(/<<0>>(?:\s*<<1>>)?/.source, [ + name, + generic + ]); + var identifier = replace(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source, [ + nonTypeKeywords, + genericName + ]); + var array = /\[\s*(?:,\s*)*\]/.source; + var typeExpressionWithoutTuple = replace(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source, [ + identifier, + array + ]); + var tupleElement = replace(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [ + generic, + nestedRound, + array + ]); + var tuple = replace(/\(<<0>>+(?:,<<0>>+)+\)/.source, [tupleElement]); + var typeExpression = replace(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source, [ + tuple, + identifier, + array + ]); + var typeInside = { + 'keyword': keywords, + 'punctuation': /[<>()?,.:[\]]/ + }; + var character = /'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source; + var regularString = /"(?:\\.|[^\\"\r\n])*"/.source; + var verbatimString = /@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source; + Prism.languages.csharp = Prism.languages.extend('clike', { + 'string': [ + { + pattern: re(/(^|[^$\\])<<0>>/.source, [verbatimString]), lookbehind: true, - inside: { 'punctuation': /\./ } + greedy: true }, - 'type-expression': { - pattern: re(/(\b(?:default|typeof|sizeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source, [nestedRound]), + { + pattern: re(/(^|[^@$\\])<<0>>/.source, [regularString]), + lookbehind: true, + greedy: true + } + ], + 'class-name': [ + { + pattern: re(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source, [identifier]), lookbehind: true, - alias: 'class-name', inside: typeInside }, - 'return-type': { - pattern: re(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source, [ - typeExpression, - identifier + { + pattern: re(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source, [ + name, + typeExpression ]), - inside: typeInside, - alias: 'class-name' - }, - 'constructor-invocation': { - pattern: re(/(\bnew\s+)<<0>>(?=\s*[[({])/.source, [typeExpression]), lookbehind: true, - inside: typeInside, - alias: 'class-name' + inside: typeInside }, - 'generic-method': { - pattern: re(/<<0>>\s*<<1>>(?=\s*\()/.source, [ - name, - generic - ]), - inside: { - 'function': re(/^<<0>>/.source, [name]), - 'generic': { - pattern: RegExp(generic), - alias: 'class-name', - inside: typeInside - } - } + { + pattern: re(/(\busing\s+)<<0>>(?=\s*=)/.source, [name]), + lookbehind: true }, - 'type-list': { - pattern: re(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source, [ + { + pattern: re(/(\b<<0>>\s+)<<1>>/.source, [ typeDeclarationKeywords, - genericName, - name, - typeExpression, - keywords.source, - nestedRound, - /\bnew\s*\(\s*\)/.source + genericName ]), lookbehind: true, - inside: { - 'record-arguments': { - pattern: re(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source, [ - genericName, - nestedRound - ]), - lookbehind: true, - greedy: true, - inside: Prism.languages.csharp - }, - 'keyword': keywords, - 'class-name': { - pattern: RegExp(typeExpression), - greedy: true, - inside: typeInside - }, - 'punctuation': /[,()]/ - } + inside: typeInside }, - 'preprocessor': { - pattern: /(^[\t ]*)#.*/m, + { + pattern: re(/(\bcatch\s*\(\s*)<<0>>/.source, [identifier]), lookbehind: true, - alias: 'property', - inside: { - 'directive': { - pattern: /(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/, - lookbehind: true, - alias: 'keyword' - } - } - } - }); - var regularStringOrCharacter = regularString + '|' + character; - var regularStringCharacterOrComment = replace(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source, [regularStringOrCharacter]); - var roundExpression = nested(replace(/[^"'/()]|<<0>>|\(<>*\)/.source, [regularStringCharacterOrComment]), 2); - var attrTarget = /\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source; - var attr = replace(/<<0>>(?:\s*\(<<1>>*\))?/.source, [ - identifier, - roundExpression - ]); - Prism.languages.insertBefore('csharp', 'class-name', { - 'attribute': { - pattern: re(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source, [ - attrTarget, - attr - ]), + inside: typeInside + }, + { + pattern: re(/(\bwhere\s+)<<0>>/.source, [name]), + lookbehind: true + }, + { + pattern: re(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source, [typeExpressionWithoutTuple]), lookbehind: true, - greedy: true, - inside: { - 'target': { - pattern: re(/^<<0>>(?=\s*:)/.source, [attrTarget]), - alias: 'keyword' - }, - 'attribute-arguments': { - pattern: re(/\(<<0>>*\)/.source, [roundExpression]), - inside: Prism.languages.csharp - }, - 'class-name': { - pattern: RegExp(identifier), - inside: { 'punctuation': /\./ } - }, - 'punctuation': /[:,]/ + inside: typeInside + }, + { + pattern: re(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source, [ + typeExpression, + nonContextualKeywords, + name + ]), + inside: typeInside + } + ], + 'keyword': keywords, + 'number': /(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i, + 'operator': />>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/, + 'punctuation': /\?\.?|::|[{}[\];(),.:]/ + }); + Prism.languages.insertBefore('csharp', 'number', { + 'range': { + pattern: /\.\./, + alias: 'operator' + } + }); + Prism.languages.insertBefore('csharp', 'punctuation', { + 'named-parameter': { + pattern: re(/([(,]\s*)<<0>>(?=\s*:)/.source, [name]), + lookbehind: true, + alias: 'punctuation' + } + }); + Prism.languages.insertBefore('csharp', 'class-name', { + 'namespace': { + pattern: re(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source, [name]), + lookbehind: true, + inside: { 'punctuation': /\./ } + }, + 'type-expression': { + pattern: re(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source, [nestedRound]), + lookbehind: true, + alias: 'class-name', + inside: typeInside + }, + 'return-type': { + pattern: re(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source, [ + typeExpression, + identifier + ]), + inside: typeInside, + alias: 'class-name' + }, + 'constructor-invocation': { + pattern: re(/(\bnew\s+)<<0>>(?=\s*[[({])/.source, [typeExpression]), + lookbehind: true, + inside: typeInside, + alias: 'class-name' + }, + 'generic-method': { + pattern: re(/<<0>>\s*<<1>>(?=\s*\()/.source, [ + name, + generic + ]), + inside: { + 'function': re(/^<<0>>/.source, [name]), + 'generic': { + pattern: RegExp(generic), + alias: 'class-name', + inside: typeInside } } - }); - var formatString = /:[^}\r\n]+/.source; - var mInterpolationRound = nested(replace(/[^"'/()]|<<0>>|\(<>*\)/.source, [regularStringCharacterOrComment]), 2); - var mInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [ - mInterpolationRound, - formatString - ]); - var sInterpolationRound = nested(replace(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source, [regularStringOrCharacter]), 2); - var sInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [ - sInterpolationRound, - formatString - ]); - function createInterpolationInside(interpolation, interpolationRound) { - return { - 'interpolation': { - pattern: re(/((?:^|[^{])(?:\{\{)*)<<0>>/.source, [interpolation]), + }, + 'type-list': { + pattern: re(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source, [ + typeDeclarationKeywords, + genericName, + name, + typeExpression, + keywords.source, + nestedRound, + /\bnew\s*\(\s*\)/.source + ]), + lookbehind: true, + inside: { + 'record-arguments': { + pattern: re(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source, [ + genericName, + nestedRound + ]), lookbehind: true, - inside: { - 'format-string': { - pattern: re(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source, [ - interpolationRound, - formatString - ]), - lookbehind: true, - inside: { 'punctuation': /^:/ } - }, - 'punctuation': /^\{|\}$/, - 'expression': { - pattern: /[\s\S]+/, - alias: 'language-csharp', - inside: Prism.languages.csharp - } - } + greedy: true, + inside: Prism.languages.csharp }, - 'string': /[\s\S]+/ - }; - } - Prism.languages.insertBefore('csharp', 'string', { - 'interpolation-string': [ - { - pattern: re(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source, [mInterpolation]), - lookbehind: true, + 'keyword': keywords, + 'class-name': { + pattern: RegExp(typeExpression), greedy: true, - inside: createInterpolationInside(mInterpolation, mInterpolationRound) + inside: typeInside }, - { - pattern: re(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source, [sInterpolation]), + 'punctuation': /[,()]/ + } + }, + 'preprocessor': { + pattern: /(^[\t ]*)#.*/m, + lookbehind: true, + alias: 'property', + inside: { + 'directive': { + pattern: /(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/, lookbehind: true, - greedy: true, - inside: createInterpolationInside(sInterpolation, sInterpolationRound) + alias: 'keyword' } - ] - }); - }(Prism)); - Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp; - (function (Prism) { - var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/; - Prism.languages.css = { - 'comment': /\/\*[\s\S]*?\*\//, - 'atrule': { - pattern: /@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/, - inside: { - 'rule': /^@[\w-]+/, - 'selector-function-argument': { - pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/, - lookbehind: true, - alias: 'selector' - }, - 'keyword': { - pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/, - lookbehind: true - } - } - }, - 'url': { - pattern: RegExp('\\burl\\((?:' + string.source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ')\\)', 'i'), - greedy: true, - inside: { - 'function': /^url/i, - 'punctuation': /^\(|\)$/, - 'string': { - pattern: RegExp('^' + string.source + '$'), - alias: 'url' - } - } - }, - 'selector': { - pattern: RegExp('(^|[{}\\s])[^{}\\s](?:[^{};"\'\\s]|\\s+(?![\\s{])|' + string.source + ')*(?=\\s*\\{)'), - lookbehind: true - }, - 'string': { - pattern: string, - greedy: true - }, - 'property': { - pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i, - lookbehind: true - }, - 'important': /!important\b/i, - 'function': { - pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i, - lookbehind: true - }, - 'punctuation': /[(){};:,]/ - }; - Prism.languages.css['atrule'].inside.rest = Prism.languages.css; - var markup = Prism.languages.markup; - if (markup) { - markup.tag.addInlined('style', 'css'); - markup.tag.addAttribute('style', 'css'); + } } - }(Prism)); - (function (Prism) { - var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; - var classNamePrefix = /(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source; - var className = { - pattern: RegExp(classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source), + }); + var regularStringOrCharacter = regularString + '|' + character; + var regularStringCharacterOrComment = replace(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source, [regularStringOrCharacter]); + var roundExpression = nested(replace(/[^"'/()]|<<0>>|\(<>*\)/.source, [regularStringCharacterOrComment]), 2); + var attrTarget = /\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source; + var attr = replace(/<<0>>(?:\s*\(<<1>>*\))?/.source, [ + identifier, + roundExpression + ]); + Prism.languages.insertBefore('csharp', 'class-name', { + 'attribute': { + pattern: re(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source, [ + attrTarget, + attr + ]), lookbehind: true, + greedy: true, inside: { - 'namespace': { - pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/, + 'target': { + pattern: re(/^<<0>>(?=\s*:)/.source, [attrTarget]), + alias: 'keyword' + }, + 'attribute-arguments': { + pattern: re(/\(<<0>>*\)/.source, [roundExpression]), + inside: Prism.languages.csharp + }, + 'class-name': { + pattern: RegExp(identifier), inside: { 'punctuation': /\./ } }, - 'punctuation': /\./ - } - }; - Prism.languages.java = Prism.languages.extend('clike', { - 'class-name': [ - className, - { - pattern: RegExp(classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source), - lookbehind: true, - inside: className.inside - } - ], - 'keyword': keywords, - 'function': [ - Prism.languages.clike.function, - { - pattern: /(::\s*)[a-z_]\w*/, - lookbehind: true - } - ], - 'number': /\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i, - 'operator': { - pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m, - lookbehind: true + 'punctuation': /[:,]/ } - }); - Prism.languages.insertBefore('java', 'string', { - 'triple-quoted-string': { - pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/, - greedy: true, - alias: 'string' - } - }); - Prism.languages.insertBefore('java', 'class-name', { - 'annotation': { - pattern: /(^|[^.])@\w+(?:\s*\.\s*\w+)*/, + } + }); + var formatString = /:[^}\r\n]+/.source; + var mInterpolationRound = nested(replace(/[^"'/()]|<<0>>|\(<>*\)/.source, [regularStringCharacterOrComment]), 2); + var mInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [ + mInterpolationRound, + formatString + ]); + var sInterpolationRound = nested(replace(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source, [regularStringOrCharacter]), 2); + var sInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [ + sInterpolationRound, + formatString + ]); + function createInterpolationInside(interpolation, interpolationRound) { + return { + 'interpolation': { + pattern: re(/((?:^|[^{])(?:\{\{)*)<<0>>/.source, [interpolation]), lookbehind: true, - alias: 'punctuation' - }, - 'generics': { - pattern: /<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/, inside: { - 'class-name': className, - 'keyword': keywords, - 'punctuation': /[<>(),.:]/, - 'operator': /[?&|]/ + 'format-string': { + pattern: re(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source, [ + interpolationRound, + formatString + ]), + lookbehind: true, + inside: { 'punctuation': /^:/ } + }, + 'punctuation': /^\{|\}$/, + 'expression': { + pattern: /[\s\S]+/, + alias: 'language-csharp', + inside: Prism.languages.csharp + } } }, - 'namespace': { - pattern: RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g, function () { - return keywords.source; - })), - lookbehind: true, - inside: { 'punctuation': /\./ } - } - }); - }(Prism)); - Prism.languages.javascript = Prism.languages.extend('clike', { - 'class-name': [ - Prism.languages.clike['class-name'], - { - pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/, - lookbehind: true - } - ], - 'keyword': [ + 'string': /[\s\S]+/ + }; + } + Prism.languages.insertBefore('csharp', 'string', { + 'interpolation-string': [ { - pattern: /((?:^|\})\s*)catch\b/, - lookbehind: true + pattern: re(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source, [mInterpolation]), + lookbehind: true, + greedy: true, + inside: createInterpolationInside(mInterpolation, mInterpolationRound) }, { - pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, - lookbehind: true + pattern: re(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source, [sInterpolation]), + lookbehind: true, + greedy: true, + inside: createInterpolationInside(sInterpolation, sInterpolationRound) } ], - 'function': /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, - 'number': /\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/, - 'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/ + 'char': { + pattern: RegExp(character), + greedy: true + } }); - Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/; - Prism.languages.insertBefore('javascript', 'keyword', { - 'regex': { - pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/, - lookbehind: true, - greedy: true, + Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp; + }(Prism)); + (function (Prism) { + var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/; + Prism.languages.css = { + 'comment': /\/\*[\s\S]*?\*\//, + 'atrule': { + pattern: RegExp('@[\\w-](?:' + /[^;{\s"']|\s+(?!\s)/.source + '|' + string.source + ')*?' + /(?:;|(?=\s*\{))/.source), inside: { - 'regex-source': { - pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/, + 'rule': /^@[\w-]+/, + 'selector-function-argument': { + pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/, lookbehind: true, - alias: 'language-regex', - inside: Prism.languages.regex + alias: 'selector' }, - 'regex-delimiter': /^\/|\/$/, - 'regex-flags': /^[a-z]+$/ + 'keyword': { + pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/, + lookbehind: true + } } }, - 'function-variable': { - pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/, - alias: 'function' + 'url': { + pattern: RegExp('\\burl\\((?:' + string.source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ')\\)', 'i'), + greedy: true, + inside: { + 'function': /^url/i, + 'punctuation': /^\(|\)$/, + 'string': { + pattern: RegExp('^' + string.source + '$'), + alias: 'url' + } + } }, - 'parameter': [ - { - pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/, - lookbehind: true, - inside: Prism.languages.javascript + 'selector': { + pattern: RegExp('(^|[{}\\s])[^{}\\s](?:[^{};"\'\\s]|\\s+(?![\\s{])|' + string.source + ')*(?=\\s*\\{)'), + lookbehind: true + }, + 'string': { + pattern: string, + greedy: true + }, + 'property': { + pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i, + lookbehind: true + }, + 'important': /!important\b/i, + 'function': { + pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i, + lookbehind: true + }, + 'punctuation': /[(){};:,]/ + }; + Prism.languages.css['atrule'].inside.rest = Prism.languages.css; + var markup = Prism.languages.markup; + if (markup) { + markup.tag.addInlined('style', 'css'); + markup.tag.addAttribute('style', 'css'); + } + }(Prism)); + (function (Prism) { + var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; + var classNamePrefix = /(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source; + var className = { + pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source), + lookbehind: true, + inside: { + 'namespace': { + pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/, + inside: { 'punctuation': /\./ } }, + 'punctuation': /\./ + } + }; + Prism.languages.java = Prism.languages.extend('clike', { + 'string': { + pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"/, + lookbehind: true, + greedy: true + }, + 'class-name': [ + className, { - pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i, + pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source), lookbehind: true, - inside: Prism.languages.javascript + inside: className.inside }, { - pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/, + pattern: RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source + classNamePrefix + /[A-Z]\w*\b/.source), lookbehind: true, - inside: Prism.languages.javascript - }, + inside: className.inside + } + ], + 'keyword': keywords, + 'function': [ + Prism.languages.clike.function, { - pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/, - lookbehind: true, - inside: Prism.languages.javascript + pattern: /(::\s*)[a-z_]\w*/, + lookbehind: true } ], - 'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/ + 'number': /\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i, + 'operator': { + pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m, + lookbehind: true + }, + 'constant': /\b[A-Z][A-Z_\d]+\b/ }); - Prism.languages.insertBefore('javascript', 'string', { - 'hashbang': { - pattern: /^#!.*/, + Prism.languages.insertBefore('java', 'string', { + 'triple-quoted-string': { + pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/, greedy: true, - alias: 'comment' + alias: 'string' }, - 'template-string': { - pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/, - greedy: true, + 'char': { + pattern: /'(?:\\.|[^'\\\r\n]){1,6}'/, + greedy: true + } + }); + Prism.languages.insertBefore('java', 'class-name', { + 'annotation': { + pattern: /(^|[^.])@\w+(?:\s*\.\s*\w+)*/, + lookbehind: true, + alias: 'punctuation' + }, + 'generics': { + pattern: /<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/, inside: { - 'template-punctuation': { - pattern: /^`|`$/, - alias: 'string' - }, - 'interpolation': { - pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/, - lookbehind: true, - inside: { - 'interpolation-punctuation': { - pattern: /^\$\{|\}$/, - alias: 'punctuation' - }, - rest: Prism.languages.javascript - } - }, - 'string': /[\s\S]+/ + 'class-name': className, + 'keyword': keywords, + 'punctuation': /[<>(),.:]/, + 'operator': /[?&|]/ + } + }, + 'import': [ + { + pattern: RegExp(/(\bimport\s+)/.source + classNamePrefix + /(?:[A-Z]\w*|\*)(?=\s*;)/.source), + lookbehind: true, + inside: { + 'namespace': className.inside.namespace, + 'punctuation': /\./, + 'operator': /\*/, + 'class-name': /\w+/ + } + }, + { + pattern: RegExp(/(\bimport\s+static\s+)/.source + classNamePrefix + /(?:\w+|\*)(?=\s*;)/.source), + lookbehind: true, + alias: 'static', + inside: { + 'namespace': className.inside.namespace, + 'static': /\b\w+$/, + 'punctuation': /\./, + 'operator': /\*/, + 'class-name': /\w+/ + } } + ], + 'namespace': { + pattern: RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g, function () { + return keywords.source; + })), + lookbehind: true, + inside: { 'punctuation': /\./ } } }); - if (Prism.languages.markup) { - Prism.languages.markup.tag.addInlined('script', 'javascript'); - Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source, 'javascript'); - } - Prism.languages.js = Prism.languages.javascript; - Prism.languages.markup = { - 'comment': { - pattern: //, - greedy: true + }(Prism)); + Prism.languages.javascript = Prism.languages.extend('clike', { + 'class-name': [ + Prism.languages.clike['class-name'], + { + pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/, + lookbehind: true + } + ], + 'keyword': [ + { + pattern: /((?:^|\})\s*)catch\b/, + lookbehind: true }, - 'prolog': { - pattern: /<\?[\s\S]+?\?>/, - greedy: true + { + pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, + lookbehind: true + } + ], + 'function': /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, + 'number': { + pattern: RegExp(/(^|[^\w$])/.source + '(?:' + (/NaN|Infinity/.source + '|' + /0[bB][01]+(?:_[01]+)*n?/.source + '|' + /0[oO][0-7]+(?:_[0-7]+)*n?/.source + '|' + /0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source + '|' + /\d+(?:_\d+)*n/.source + '|' + /(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source) + ')' + /(?![\w$])/.source), + lookbehind: true + }, + 'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/ + }); + Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/; + Prism.languages.insertBefore('javascript', 'keyword', { + 'regex': { + pattern: RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source + /\//.source + '(?:' + /(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source + '|' + /(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + ')' + /(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source), + lookbehind: true, + greedy: true, + inside: { + 'regex-source': { + pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/, + lookbehind: true, + alias: 'language-regex', + inside: Prism.languages.regex + }, + 'regex-delimiter': /^\/|\/$/, + 'regex-flags': /^[a-z]+$/ + } + }, + 'function-variable': { + pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/, + alias: 'function' + }, + 'parameter': [ + { + pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/, + lookbehind: true, + inside: Prism.languages.javascript }, - 'doctype': { - pattern: /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i, - greedy: true, - inside: { - 'internal-subset': { - pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/, - lookbehind: true, - greedy: true, - inside: null - }, - 'string': { - pattern: /"[^"]*"|'[^']*'/, - greedy: true - }, - 'punctuation': /^$|[[\]]/, - 'doctype-tag': /^DOCTYPE/i, - 'name': /[^\s<>'"]+/ - } + { + pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i, + lookbehind: true, + inside: Prism.languages.javascript }, - 'cdata': { - pattern: //i, - greedy: true + { + pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/, + lookbehind: true, + inside: Prism.languages.javascript }, - 'tag': { - pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/, + { + pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/, + lookbehind: true, + inside: Prism.languages.javascript + } + ], + 'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/ + }); + Prism.languages.insertBefore('javascript', 'string', { + 'hashbang': { + pattern: /^#!.*/, + greedy: true, + alias: 'comment' + }, + 'template-string': { + pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/, + greedy: true, + inside: { + 'template-punctuation': { + pattern: /^`|`$/, + alias: 'string' + }, + 'interpolation': { + pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/, + lookbehind: true, + inside: { + 'interpolation-punctuation': { + pattern: /^\$\{|\}$/, + alias: 'punctuation' + }, + rest: Prism.languages.javascript + } + }, + 'string': /[\s\S]+/ + } + }, + 'string-property': { + pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m, + lookbehind: true, + greedy: true, + alias: 'property' + } + }); + Prism.languages.insertBefore('javascript', 'operator', { + 'literal-property': { + pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m, + lookbehind: true, + alias: 'property' + } + }); + if (Prism.languages.markup) { + Prism.languages.markup.tag.addInlined('script', 'javascript'); + Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source, 'javascript'); + } + Prism.languages.js = Prism.languages.javascript; + Prism.languages.markup = { + 'comment': { + pattern: //, + greedy: true + }, + 'prolog': { + pattern: /<\?[\s\S]+?\?>/, + greedy: true + }, + 'doctype': { + pattern: /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i, + greedy: true, + inside: { + 'internal-subset': { + pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/, + lookbehind: true, + greedy: true, + inside: null + }, + 'string': { + pattern: /"[^"]*"|'[^']*'/, + greedy: true + }, + 'punctuation': /^$|[[\]]/, + 'doctype-tag': /^DOCTYPE/i, + 'name': /[^\s<>'"]+/ + } + }, + 'cdata': { + pattern: //i, + greedy: true + }, + 'tag': { + pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/, + greedy: true, + inside: { + 'tag': { + pattern: /^<\/?[^\s>\/]+/, + inside: { + 'punctuation': /^<\/?/, + 'namespace': /^[^\s>\/:]+:/ + } + }, + 'special-attr': [], + 'attr-value': { + pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/, + inside: { + 'punctuation': [ + { + pattern: /^=/, + alias: 'attr-equals' + }, + { + pattern: /^(\s*)["']|["']$/, + lookbehind: true + } + ] + } + }, + 'punctuation': /\/?>/, + 'attr-name': { + pattern: /[^\s>\/]+/, + inside: { 'namespace': /^[^\s>\/:]+:/ } + } + } + }, + 'entity': [ + { + pattern: /&[\da-z]{1,8};/i, + alias: 'named-entity' + }, + /&#x?[\da-f]{1,8};/i + ] + }; + Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = Prism.languages.markup['entity']; + Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup; + Prism.hooks.add('wrap', function (env) { + if (env.type === 'entity') { + env.attributes['title'] = env.content.replace(/&/, '&'); + } + }); + Object.defineProperty(Prism.languages.markup.tag, 'addInlined', { + value: function addInlined(tagName, lang) { + var includedCdataInside = {}; + includedCdataInside['language-' + lang] = { + pattern: /(^$)/i, + lookbehind: true, + inside: Prism.languages[lang] + }; + includedCdataInside['cdata'] = /^$/i; + var inside = { + 'included-cdata': { + pattern: //i, + inside: includedCdataInside + } + }; + inside['language-' + lang] = { + pattern: /[\s\S]+/, + inside: Prism.languages[lang] + }; + var def = {}; + def[tagName] = { + pattern: RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g, function () { + return tagName; + }), 'i'), + lookbehind: true, greedy: true, + inside: inside + }; + Prism.languages.insertBefore('markup', 'cdata', def); + } + }); + Object.defineProperty(Prism.languages.markup.tag, 'addAttribute', { + value: function (attrName, lang) { + Prism.languages.markup.tag.inside['special-attr'].push({ + pattern: RegExp(/(^|["'\s])/.source + '(?:' + attrName + ')' + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source, 'i'), + lookbehind: true, inside: { - 'tag': { - pattern: /^<\/?[^\s>\/]+/, - inside: { - 'punctuation': /^<\/?/, - 'namespace': /^[^\s>\/:]+:/ - } - }, - 'special-attr': [], + 'attr-name': /^[^\s=]+/, 'attr-value': { - pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/, + pattern: /=[\s\S]+/, inside: { + 'value': { + pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/, + lookbehind: true, + alias: [ + lang, + 'language-' + lang + ], + inside: Prism.languages[lang] + }, 'punctuation': [ { pattern: /^=/, @@ -1512,560 +1639,493 @@ /"|'/ ] } - }, - 'punctuation': /\/?>/, - 'attr-name': { - pattern: /[^\s>\/]+/, - inside: { 'namespace': /^[^\s>\/:]+:/ } } } + }); + } + }); + Prism.languages.html = Prism.languages.markup; + Prism.languages.mathml = Prism.languages.markup; + Prism.languages.svg = Prism.languages.markup; + Prism.languages.xml = Prism.languages.extend('markup', {}); + Prism.languages.ssml = Prism.languages.xml; + Prism.languages.atom = Prism.languages.xml; + Prism.languages.rss = Prism.languages.xml; + (function (Prism) { + var comment = /\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/; + var constant = [ + { + pattern: /\b(?:false|true)\b/i, + alias: 'boolean' + }, + { + pattern: /(::\s*)\b[a-z_]\w*\b(?!\s*\()/i, + greedy: true, + lookbehind: true + }, + { + pattern: /(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i, + greedy: true, + lookbehind: true + }, + /\b(?:null)\b/i, + /\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/ + ]; + var number = /\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i; + var operator = /|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/; + var punctuation = /[{}\[\](),:;]/; + Prism.languages.php = { + 'delimiter': { + pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i, + alias: 'important' + }, + 'comment': comment, + 'variable': /\$+(?:\w+\b|(?=\{))/, + 'package': { + pattern: /(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i, + lookbehind: true, + inside: { 'punctuation': /\\/ } }, - 'entity': [ + 'class-name-definition': { + pattern: /(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i, + lookbehind: true, + alias: 'class-name' + }, + 'function-definition': { + pattern: /(\bfunction\s+)[a-z_]\w*(?=\s*\()/i, + lookbehind: true, + alias: 'function' + }, + 'keyword': [ { - pattern: /&[\da-z]{1,8};/i, - alias: 'named-entity' - }, - /&#x?[\da-f]{1,8};/i - ] - }; - Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = Prism.languages.markup['entity']; - Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup; - Prism.hooks.add('wrap', function (env) { - if (env.type === 'entity') { - env.attributes['title'] = env.content.replace(/&/, '&'); - } - }); - Object.defineProperty(Prism.languages.markup.tag, 'addInlined', { - value: function addInlined(tagName, lang) { - var includedCdataInside = {}; - includedCdataInside['language-' + lang] = { - pattern: /(^$)/i, - lookbehind: true, - inside: Prism.languages[lang] - }; - includedCdataInside['cdata'] = /^$/i; - var inside = { - 'included-cdata': { - pattern: //i, - inside: includedCdataInside - } - }; - inside['language-' + lang] = { - pattern: /[\s\S]+/, - inside: Prism.languages[lang] - }; - var def = {}; - def[tagName] = { - pattern: RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g, function () { - return tagName; - }), 'i'), - lookbehind: true, + pattern: /(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i, + alias: 'type-casting', greedy: true, - inside: inside - }; - Prism.languages.insertBefore('markup', 'cdata', def); - } - }); - Object.defineProperty(Prism.languages.markup.tag, 'addAttribute', { - value: function (attrName, lang) { - Prism.languages.markup.tag.inside['special-attr'].push({ - pattern: RegExp(/(^|["'\s])/.source + '(?:' + attrName + ')' + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source, 'i'), - lookbehind: true, - inside: { - 'attr-name': /^[^\s=]+/, - 'attr-value': { - pattern: /=[\s\S]+/, - inside: { - 'value': { - pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/, - lookbehind: true, - alias: [ - lang, - 'language-' + lang - ], - inside: Prism.languages[lang] - }, - 'punctuation': [ - { - pattern: /^=/, - alias: 'attr-equals' - }, - /"|'/ - ] - } - } - } - }); - } - }); - Prism.languages.html = Prism.languages.markup; - Prism.languages.mathml = Prism.languages.markup; - Prism.languages.svg = Prism.languages.markup; - Prism.languages.xml = Prism.languages.extend('markup', {}); - Prism.languages.ssml = Prism.languages.xml; - Prism.languages.atom = Prism.languages.xml; - Prism.languages.rss = Prism.languages.xml; - (function (Prism) { - var comment = /\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/; - var constant = [ - { - pattern: /\b(?:false|true)\b/i, - alias: 'boolean' + lookbehind: true }, { - pattern: /(::\s*)\b[a-z_]\w*\b(?!\s*\()/i, + pattern: /([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i, + alias: 'type-hint', greedy: true, lookbehind: true }, { - pattern: /(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i, + pattern: /(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i, + alias: 'return-type', greedy: true, lookbehind: true }, - /\b(?:null)\b/i, - /\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/ - ]; - var number = /\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i; - var operator = /|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/; - var punctuation = /[{}\[\](),:;]/; - Prism.languages.php = { - 'delimiter': { - pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i, - alias: 'important' - }, - 'comment': comment, - 'variable': /\$+(?:\w+\b|(?=\{))/i, - 'package': { - pattern: /(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i, - lookbehind: true, - inside: { 'punctuation': /\\/ } - }, - 'class-name-definition': { - pattern: /(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i, - lookbehind: true, - alias: 'class-name' - }, - 'function-definition': { - pattern: /(\bfunction\s+)[a-z_]\w*(?=\s*\()/i, - lookbehind: true, - alias: 'function' - }, - 'keyword': [ - { - pattern: /(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i, - alias: 'type-casting', - greedy: true, - lookbehind: true - }, - { - pattern: /([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i, - alias: 'type-hint', - greedy: true, - lookbehind: true - }, - { - pattern: /([(,?]\s*[\w|]\|\s*)(?:null|false)\b(?=\s*\$)/i, - alias: 'type-hint', - greedy: true, - lookbehind: true - }, - { - pattern: /(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i, - alias: 'return-type', - greedy: true, - lookbehind: true - }, - { - pattern: /(\)\s*:\s*(?:\?\s*)?[\w|]\|\s*)(?:null|false)\b/i, - alias: 'return-type', - greedy: true, - lookbehind: true - }, - { - pattern: /\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i, - alias: 'type-declaration', - greedy: true - }, - { - pattern: /(\|\s*)(?:null|false)\b/i, - alias: 'type-declaration', - greedy: true, - lookbehind: true - }, - { - pattern: /\b(?:parent|self|static)(?=\s*::)/i, - alias: 'static-context', - greedy: true - }, - { - pattern: /(\byield\s+)from\b/i, - lookbehind: true - }, - /\bclass\b/i, - { - pattern: /((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i, - lookbehind: true - } - ], - 'argument-name': { - pattern: /([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i, - lookbehind: true + { + pattern: /\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i, + alias: 'type-declaration', + greedy: true }, - 'class-name': [ - { - pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i, - greedy: true, - lookbehind: true - }, - { - pattern: /(\|\s*)\b[a-z_]\w*(?!\\)\b/i, - greedy: true, - lookbehind: true - }, - { - pattern: /\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i, - greedy: true - }, - { - pattern: /(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i, - alias: 'class-name-fully-qualified', - greedy: true, - lookbehind: true, - inside: { 'punctuation': /\\/ } - }, - { - pattern: /(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i, - alias: 'class-name-fully-qualified', - greedy: true, - inside: { 'punctuation': /\\/ } - }, - { - pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i, - alias: 'class-name-fully-qualified', - greedy: true, - lookbehind: true, - inside: { 'punctuation': /\\/ } - }, - { - pattern: /\b[a-z_]\w*(?=\s*\$)/i, - alias: 'type-declaration', - greedy: true - }, - { - pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i, - alias: [ - 'class-name-fully-qualified', - 'type-declaration' - ], - greedy: true, - inside: { 'punctuation': /\\/ } - }, - { - pattern: /\b[a-z_]\w*(?=\s*::)/i, - alias: 'static-context', - greedy: true - }, - { - pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*::)/i, - alias: [ - 'class-name-fully-qualified', - 'static-context' - ], - greedy: true, - inside: { 'punctuation': /\\/ } - }, - { - pattern: /([(,?]\s*)[a-z_]\w*(?=\s*\$)/i, - alias: 'type-hint', - greedy: true, - lookbehind: true - }, - { - pattern: /([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i, - alias: [ - 'class-name-fully-qualified', - 'type-hint' - ], - greedy: true, - lookbehind: true, - inside: { 'punctuation': /\\/ } - }, - { - pattern: /(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i, - alias: 'return-type', - greedy: true, - lookbehind: true - }, - { - pattern: /(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i, - alias: [ - 'class-name-fully-qualified', - 'return-type' - ], - greedy: true, - lookbehind: true, - inside: { 'punctuation': /\\/ } - } - ], - 'constant': constant, - 'function': { - pattern: /(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i, - lookbehind: true, - inside: { 'punctuation': /\\/ } + { + pattern: /(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i, + alias: 'type-declaration', + greedy: true, + lookbehind: true + }, + { + pattern: /\b(?:parent|self|static)(?=\s*::)/i, + alias: 'static-context', + greedy: true }, - 'property': { - pattern: /(->\s*)\w+/, + { + pattern: /(\byield\s+)from\b/i, lookbehind: true }, - 'number': number, - 'operator': operator, - 'punctuation': punctuation - }; - var string_interpolation = { - pattern: /\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/, - lookbehind: true, - inside: Prism.languages.php - }; - var string = [ + /\bclass\b/i, { - pattern: /<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/, - alias: 'nowdoc-string', + pattern: /((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i, + lookbehind: true + } + ], + 'argument-name': { + pattern: /([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i, + lookbehind: true + }, + 'class-name': [ + { + pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i, greedy: true, - inside: { - 'delimiter': { - pattern: /^<<<'[^']+'|[a-z_]\w*;$/i, - alias: 'symbol', - inside: { 'punctuation': /^<<<'?|[';]$/ } - } - } + lookbehind: true }, { - pattern: /<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i, - alias: 'heredoc-string', + pattern: /(\|\s*)\b[a-z_]\w*(?!\\)\b/i, greedy: true, - inside: { - 'delimiter': { - pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i, - alias: 'symbol', - inside: { 'punctuation': /^<<<"?|[";]$/ } - }, - 'interpolation': string_interpolation - } + lookbehind: true + }, + { + pattern: /\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i, + greedy: true + }, + { + pattern: /(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i, + alias: 'class-name-fully-qualified', + greedy: true, + lookbehind: true, + inside: { 'punctuation': /\\/ } + }, + { + pattern: /(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i, + alias: 'class-name-fully-qualified', + greedy: true, + inside: { 'punctuation': /\\/ } + }, + { + pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i, + alias: 'class-name-fully-qualified', + greedy: true, + lookbehind: true, + inside: { 'punctuation': /\\/ } }, { - pattern: /`(?:\\[\s\S]|[^\\`])*`/, - alias: 'backtick-quoted-string', + pattern: /\b[a-z_]\w*(?=\s*\$)/i, + alias: 'type-declaration', greedy: true }, { - pattern: /'(?:\\[\s\S]|[^\\'])*'/, - alias: 'single-quoted-string', + pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i, + alias: [ + 'class-name-fully-qualified', + 'type-declaration' + ], + greedy: true, + inside: { 'punctuation': /\\/ } + }, + { + pattern: /\b[a-z_]\w*(?=\s*::)/i, + alias: 'static-context', greedy: true }, { - pattern: /"(?:\\[\s\S]|[^\\"])*"/, - alias: 'double-quoted-string', + pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*::)/i, + alias: [ + 'class-name-fully-qualified', + 'static-context' + ], greedy: true, - inside: { 'interpolation': string_interpolation } - } - ]; - Prism.languages.insertBefore('php', 'variable', { - 'string': string, - 'attribute': { - pattern: /#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im, + inside: { 'punctuation': /\\/ } + }, + { + pattern: /([(,?]\s*)[a-z_]\w*(?=\s*\$)/i, + alias: 'type-hint', greedy: true, - inside: { - 'attribute-content': { - pattern: /^(#\[)[\s\S]+(?=\]$)/, - lookbehind: true, - inside: { - 'comment': comment, - 'string': string, - 'attribute-class-name': [ - { - pattern: /([^:]|^)\b[a-z_]\w*(?!\\)\b/i, - alias: 'class-name', - greedy: true, - lookbehind: true - }, - { - pattern: /([^:]|^)(?:\\?\b[a-z_]\w*)+/i, - alias: [ - 'class-name', - 'class-name-fully-qualified' - ], - greedy: true, - lookbehind: true, - inside: { 'punctuation': /\\/ } - } - ], - 'constant': constant, - 'number': number, - 'operator': operator, - 'punctuation': punctuation - } - }, - 'delimiter': { - pattern: /^#\[|\]$/, - alias: 'punctuation' - } + lookbehind: true + }, + { + pattern: /([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i, + alias: [ + 'class-name-fully-qualified', + 'type-hint' + ], + greedy: true, + lookbehind: true, + inside: { 'punctuation': /\\/ } + }, + { + pattern: /(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i, + alias: 'return-type', + greedy: true, + lookbehind: true + }, + { + pattern: /(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i, + alias: [ + 'class-name-fully-qualified', + 'return-type' + ], + greedy: true, + lookbehind: true, + inside: { 'punctuation': /\\/ } + } + ], + 'constant': constant, + 'function': { + pattern: /(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i, + lookbehind: true, + inside: { 'punctuation': /\\/ } + }, + 'property': { + pattern: /(->\s*)\w+/, + lookbehind: true + }, + 'number': number, + 'operator': operator, + 'punctuation': punctuation + }; + var string_interpolation = { + pattern: /\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/, + lookbehind: true, + inside: Prism.languages.php + }; + var string = [ + { + pattern: /<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/, + alias: 'nowdoc-string', + greedy: true, + inside: { + 'delimiter': { + pattern: /^<<<'[^']+'|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<'?|[';]$/ } } } - }); - Prism.hooks.add('before-tokenize', function (env) { - if (!/<\?/.test(env.code)) { - return; + }, + { + pattern: /<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i, + alias: 'heredoc-string', + greedy: true, + inside: { + 'delimiter': { + pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<"?|[";]$/ } + }, + 'interpolation': string_interpolation } - var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi; - Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern); - }); - Prism.hooks.add('after-tokenize', function (env) { - Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php'); - }); - }(Prism)); - Prism.languages.python = { - 'comment': { - pattern: /(^|[^\\])#.*/, - lookbehind: true }, - 'string-interpolation': { - pattern: /(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, + { + pattern: /`(?:\\[\s\S]|[^\\`])*`/, + alias: 'backtick-quoted-string', + greedy: true + }, + { + pattern: /'(?:\\[\s\S]|[^\\'])*'/, + alias: 'single-quoted-string', + greedy: true + }, + { + pattern: /"(?:\\[\s\S]|[^\\"])*"/, + alias: 'double-quoted-string', + greedy: true, + inside: { 'interpolation': string_interpolation } + } + ]; + Prism.languages.insertBefore('php', 'variable', { + 'string': string, + 'attribute': { + pattern: /#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im, greedy: true, inside: { - 'interpolation': { - pattern: /((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/, + 'attribute-content': { + pattern: /^(#\[)[\s\S]+(?=\]$)/, lookbehind: true, inside: { - 'format-spec': { - pattern: /(:)[^:(){}]+(?=\}$)/, - lookbehind: true - }, - 'conversion-option': { - pattern: /![sra](?=[:}]$)/, - alias: 'punctuation' - }, - rest: null + 'comment': comment, + 'string': string, + 'attribute-class-name': [ + { + pattern: /([^:]|^)\b[a-z_]\w*(?!\\)\b/i, + alias: 'class-name', + greedy: true, + lookbehind: true + }, + { + pattern: /([^:]|^)(?:\\?\b[a-z_]\w*)+/i, + alias: [ + 'class-name', + 'class-name-fully-qualified' + ], + greedy: true, + lookbehind: true, + inside: { 'punctuation': /\\/ } + } + ], + 'constant': constant, + 'number': number, + 'operator': operator, + 'punctuation': punctuation } }, - 'string': /[\s\S]+/ + 'delimiter': { + pattern: /^#\[|\]$/, + alias: 'punctuation' + } } - }, - 'triple-quoted-string': { - pattern: /(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i, - greedy: true, - alias: 'string' - }, - 'string': { - pattern: /(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, + } + }); + Prism.hooks.add('before-tokenize', function (env) { + if (!/<\?/.test(env.code)) { + return; + } + var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g; + Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern); + }); + Prism.hooks.add('after-tokenize', function (env) { + Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php'); + }); + }(Prism)); + Prism.languages.python = { + 'comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true, + greedy: true + }, + 'string-interpolation': { + pattern: /(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, + greedy: true, + inside: { + 'interpolation': { + pattern: /((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/, + lookbehind: true, + inside: { + 'format-spec': { + pattern: /(:)[^:(){}]+(?=\}$)/, + lookbehind: true + }, + 'conversion-option': { + pattern: /![sra](?=[:}]$)/, + alias: 'punctuation' + }, + rest: null + } + }, + 'string': /[\s\S]+/ + } + }, + 'triple-quoted-string': { + pattern: /(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i, + greedy: true, + alias: 'string' + }, + 'string': { + pattern: /(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, + greedy: true + }, + 'function': { + pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, + lookbehind: true + }, + 'class-name': { + pattern: /(\bclass\s+)\w+/i, + lookbehind: true + }, + 'decorator': { + pattern: /(^[\t ]*)@\w+(?:\.\w+)*/m, + lookbehind: true, + alias: [ + 'annotation', + 'punctuation' + ], + inside: { 'punctuation': /\./ } + }, + 'keyword': /\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/, + 'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/, + 'boolean': /\b(?:False|None|True)\b/, + 'number': /\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i, + 'operator': /[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, + 'punctuation': /[{}[\];(),.:]/ + }; + Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python; + Prism.languages.py = Prism.languages.python; + (function (Prism) { + Prism.languages.ruby = Prism.languages.extend('clike', { + 'comment': { + pattern: /#.*|^=begin\s[\s\S]*?^=end/m, greedy: true }, - 'function': { - pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, - lookbehind: true - }, 'class-name': { - pattern: /(\bclass\s+)\w+/i, - lookbehind: true - }, - 'decorator': { - pattern: /(^[\t ]*)@\w+(?:\.\w+)*/im, + pattern: /(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/, lookbehind: true, - alias: [ - 'annotation', - 'punctuation' - ], - inside: { 'punctuation': /\./ } + inside: { 'punctuation': /[.\\]/ } }, - 'keyword': /\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/, - 'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/, - 'boolean': /\b(?:True|False|None)\b/, - 'number': /\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?\b/i, - 'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, - 'punctuation': /[{}[\];(),.:]/ - }; - Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python; - Prism.languages.py = Prism.languages.python; - (function (Prism) { - Prism.languages.ruby = Prism.languages.extend('clike', { - 'comment': [ - /#.*/, - { - pattern: /^=begin\s[\s\S]*?^=end/m, - greedy: true - } - ], - 'class-name': { - pattern: /(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i, + 'keyword': /\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/, + 'operator': /\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/, + 'punctuation': /[(){}[\].,;]/ + }); + Prism.languages.insertBefore('ruby', 'operator', { + 'double-colon': { + pattern: /::/, + alias: 'punctuation' + } + }); + var interpolation = { + pattern: /((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/, + lookbehind: true, + inside: { + 'content': { + pattern: /^(#\{)[\s\S]+(?=\}$)/, lookbehind: true, - inside: { 'punctuation': /[.\\]/ } + inside: Prism.languages.ruby }, - 'keyword': /\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/ - }); - var interpolation = { - pattern: /#\{[^}]+\}/, - inside: { - 'delimiter': { - pattern: /^#\{|\}$/, - alias: 'tag' - }, - rest: Prism.languages.ruby + 'delimiter': { + pattern: /^#\{|\}$/, + alias: 'punctuation' } - }; - delete Prism.languages.ruby.function; - Prism.languages.insertBefore('ruby', 'keyword', { - 'regex': [ - { - pattern: RegExp(/%r/.source + '(?:' + [ - /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source, - /\((?:[^()\\]|\\[\s\S])*\)/.source, - /\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source, - /\[(?:[^\[\]\\]|\\[\s\S])*\]/.source, - /<(?:[^<>\\]|\\[\s\S])*>/.source - ].join('|') + ')' + /[egimnosux]{0,6}/.source), - greedy: true, - inside: { 'interpolation': interpolation } - }, - { - pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/, - lookbehind: true, - greedy: true, - inside: { 'interpolation': interpolation } + } + }; + delete Prism.languages.ruby.function; + var percentExpression = '(?:' + [ + /([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source, + /\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source, + /\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source, + /\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source, + /<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source + ].join('|') + ')'; + var symbolName = /(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source; + Prism.languages.insertBefore('ruby', 'keyword', { + 'regex-literal': [ + { + pattern: RegExp(/%r/.source + percentExpression + /[egimnosux]{0,6}/.source), + greedy: true, + inside: { + 'interpolation': interpolation, + 'regex': /[\s\S]+/ } - ], - 'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/, - 'symbol': { - pattern: /(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/, - lookbehind: true }, - 'method-definition': { - pattern: /(\bdef\s+)[\w.]+/, + { + pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/, lookbehind: true, + greedy: true, inside: { - 'function': /\w+$/, - rest: Prism.languages.ruby + 'interpolation': interpolation, + 'regex': /[\s\S]+/ } } - }); - Prism.languages.insertBefore('ruby', 'number', { - 'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/, - 'constant': /\b[A-Z]\w*(?:[?!]|\b)/ - }); - Prism.languages.ruby.string = [ + ], + 'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/, + 'symbol': [ + { + pattern: RegExp(/(^|[^:]):/.source + symbolName), + lookbehind: true, + greedy: true + }, + { + pattern: RegExp(/([\r\n{(,][ \t]*)/.source + symbolName + /(?=:(?!:))/.source), + lookbehind: true, + greedy: true + } + ], + 'method-definition': { + pattern: /(\bdef\s+)\w+(?:\s*\.\s*\w+)?/, + lookbehind: true, + inside: { + 'function': /\b\w+$/, + 'keyword': /^self\b/, + 'class-name': /^\w+/, + 'punctuation': /\./ + } + } + }); + Prism.languages.insertBefore('ruby', 'string', { + 'string-literal': [ { - pattern: RegExp(/%[qQiIwWxs]?/.source + '(?:' + [ - /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source, - /\((?:[^()\\]|\\[\s\S])*\)/.source, - /\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source, - /\[(?:[^\[\]\\]|\\[\s\S])*\]/.source, - /<(?:[^<>\\]|\\[\s\S])*>/.source - ].join('|') + ')'), + pattern: RegExp(/%[qQiIwWs]?/.source + percentExpression), greedy: true, - inside: { 'interpolation': interpolation } + inside: { + 'interpolation': interpolation, + 'string': /[\s\S]+/ + } }, { pattern: /("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/, greedy: true, - inside: { 'interpolation': interpolation } + inside: { + 'interpolation': interpolation, + 'string': /[\s\S]+/ + } }, { pattern: /<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i, @@ -2073,11 +2133,14 @@ greedy: true, inside: { 'delimiter': { - pattern: /^<<[-~]?[a-z_]\w*|[a-z_]\w*$/i, - alias: 'symbol', - inside: { 'punctuation': /^<<[-~]?/ } + pattern: /^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i, + inside: { + 'symbol': /\b\w+/, + 'punctuation': /^<<[-~]?/ + } }, - 'interpolation': interpolation + 'interpolation': interpolation, + 'string': /[\s\S]+/ } }, { @@ -2086,64 +2149,99 @@ greedy: true, inside: { 'delimiter': { - pattern: /^<<[-~]?'[a-z_]\w*'|[a-z_]\w*$/i, - alias: 'symbol', - inside: { 'punctuation': /^<<[-~]?'|'$/ } + pattern: /^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i, + inside: { + 'symbol': /\b\w+/, + 'punctuation': /^<<[-~]?'|'$/ + } + }, + 'string': /[\s\S]+/ + } + } + ], + 'command-literal': [ + { + pattern: RegExp(/%x/.source + percentExpression), + greedy: true, + inside: { + 'interpolation': interpolation, + 'command': { + pattern: /[\s\S]+/, + alias: 'string' + } + } + }, + { + pattern: /`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/, + greedy: true, + inside: { + 'interpolation': interpolation, + 'command': { + pattern: /[\s\S]+/, + alias: 'string' } } } - ]; - Prism.languages.rb = Prism.languages.ruby; - }(Prism)); - var Prism$1 = prismCore.exports; - var prismjs = { boltExport: Prism$1 }; - return prismjs; - })); - var prism = window.Prism; + ] + }); + delete Prism.languages.ruby.string; + Prism.languages.insertBefore('ruby', 'number', { + 'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/, + 'constant': /\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/ + }); + Prism.languages.rb = Prism.languages.ruby; + }(Prism)); window.Prism = oldprism; - return prism; - }(undefined, exports$1, module)); - var Prism$1 = module.exports.boltExport; + return Prism; + }(undefined, undefined); - var getLanguages$1 = function (editor) { - return editor.getParam('codesample_languages'); - }; - var useGlobalPrismJS = function (editor) { - return editor.getParam('codesample_global_prismjs', false, 'boolean'); + const option = name => editor => editor.options.get(name); + const register$2 = editor => { + const registerOption = editor.options.register; + registerOption('codesample_languages', { processor: 'object[]' }); + registerOption('codesample_global_prismjs', { + processor: 'boolean', + default: false + }); }; + const getLanguages$1 = option('codesample_languages'); + const useGlobalPrismJS = option('codesample_global_prismjs'); + + const get = editor => Global.Prism && useGlobalPrismJS(editor) ? Global.Prism : prismjs; - var get = function (editor) { - return Global.Prism && useGlobalPrismJS(editor) ? Global.Prism : Prism$1; + const isCodeSample = elm => { + return isNonNullable(elm) && elm.nodeName === 'PRE' && elm.className.indexOf('language-') !== -1; }; - var getSelectedCodeSample = function (editor) { - var node = editor.selection ? editor.selection.getNode() : null; - return someIf(isCodeSample(node), node); + const getSelectedCodeSample = editor => { + const node = editor.selection ? editor.selection.getNode() : null; + return isCodeSample(node) ? Optional.some(node) : Optional.none(); }; - var insertCodeSample = function (editor, language, code) { - editor.undoManager.transact(function () { - var node = getSelectedCodeSample(editor); + const insertCodeSample = (editor, language, code) => { + const dom = editor.dom; + editor.undoManager.transact(() => { + const node = getSelectedCodeSample(editor); code = global$1.DOM.encode(code); - return node.fold(function () { + return node.fold(() => { editor.insertContent('

    ' + code + '
    '); - editor.selection.select(editor.$('#__new').removeAttr('id')[0]); - }, function (n) { - editor.dom.setAttrib(n, 'class', 'language-' + language); + const newPre = dom.select('#__new')[0]; + dom.setAttrib(newPre, 'id', null); + editor.selection.select(newPre); + }, n => { + dom.setAttrib(n, 'class', 'language-' + language); n.innerHTML = code; get(editor).highlightElement(n); editor.selection.select(n); }); }); }; - var getCurrentCode = function (editor) { - var node = getSelectedCodeSample(editor); - return node.fold(constant(''), function (n) { - return n.textContent; - }); + const getCurrentCode = editor => { + const node = getSelectedCodeSample(editor); + return node.bind(n => Optional.from(n.textContent)).getOr(''); }; - var getLanguages = function (editor) { - var defaultLanguages = [ + const getLanguages = editor => { + const defaultLanguages = [ { text: 'HTML/XML', value: 'markup' @@ -2185,26 +2283,22 @@ value: 'cpp' } ]; - var customLanguages = getLanguages$1(editor); + const customLanguages = getLanguages$1(editor); return customLanguages ? customLanguages : defaultLanguages; }; - var getCurrentLanguage = function (editor, fallback) { - var node = getSelectedCodeSample(editor); - return node.fold(function () { - return fallback; - }, function (n) { - var matches = n.className.match(/language-(\w+)/); + const getCurrentLanguage = (editor, fallback) => { + const node = getSelectedCodeSample(editor); + return node.fold(() => fallback, n => { + const matches = n.className.match(/language-(\w+)/); return matches ? matches[1] : fallback; }); }; - var open = function (editor) { - var languages = getLanguages(editor); - var defaultLanguage = head(languages).fold(constant(''), function (l) { - return l.value; - }); - var currentLanguage = getCurrentLanguage(editor, defaultLanguage); - var currentCode = getCurrentCode(editor); + const open = editor => { + const languages = getLanguages(editor); + const defaultLanguage = head(languages).fold(constant(''), l => l.value); + const currentLanguage = getCurrentLanguage(editor, defaultLanguage); + const currentCode = getCurrentCode(editor); editor.windowManager.open({ title: 'Insert/Edit Code Sample', size: 'large', @@ -2212,7 +2306,7 @@ type: 'panel', items: [ { - type: 'selectbox', + type: 'listbox', name: 'language', label: 'Language', items: languages @@ -2241,17 +2335,17 @@ language: currentLanguage, code: currentCode }, - onSubmit: function (api) { - var data = api.getData(); + onSubmit: api => { + const data = api.getData(); insertCodeSample(editor, data.language, data.code); api.close(); } }); }; - var register$1 = function (editor) { - editor.addCommand('codesample', function () { - var node = editor.selection.getNode(); + const register$1 = editor => { + editor.addCommand('codesample', () => { + const node = editor.selection.getNode(); if (editor.selection.isCollapsed() || isCodeSample(node)) { open(editor); } else { @@ -2260,80 +2354,110 @@ }); }; - var setup = function (editor) { - var $ = editor.$; - editor.on('PreProcess', function (e) { - $('pre[contenteditable=false]', e.node).filter(trimArg(isCodeSample)).each(function (idx, elm) { - var $elm = $(elm), code = elm.textContent; - $elm.attr('class', $.trim($elm.attr('class'))); - $elm.removeAttr('contentEditable'); - $elm.empty().append($('').each(function () { - this.textContent = code; - })); + const blank = r => s => s.replace(r, ''); + const trim = blank(/^\s+|\s+$/g); + + var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + const setup = editor => { + editor.on('PreProcess', e => { + const dom = editor.dom; + const pres = dom.select('pre[contenteditable=false]', e.node); + global.each(global.grep(pres, isCodeSample), elm => { + const code = elm.textContent; + dom.setAttrib(elm, 'class', trim(dom.getAttrib(elm, 'class'))); + dom.setAttrib(elm, 'contentEditable', null); + dom.setAttrib(elm, 'data-mce-highlighted', null); + let child; + while (child = elm.firstChild) { + elm.removeChild(child); + } + const codeElm = dom.add(elm, 'code'); + codeElm.textContent = code; }); }); - editor.on('SetContent', function () { - var unprocessedCodeSamples = $('pre').filter(trimArg(isCodeSample)).filter(function (idx, elm) { - return elm.contentEditable !== 'false'; + editor.on('SetContent', () => { + const dom = editor.dom; + const unprocessedCodeSamples = global.grep(dom.select('pre'), elm => { + return isCodeSample(elm) && dom.getAttrib(elm, 'data-mce-highlighted') !== 'true'; }); if (unprocessedCodeSamples.length) { - editor.undoManager.transact(function () { - unprocessedCodeSamples.each(function (idx, elm) { - $(elm).find('br').each(function (idx, elm) { - elm.parentNode.replaceChild(editor.getDoc().createTextNode('\n'), elm); + editor.undoManager.transact(() => { + global.each(unprocessedCodeSamples, elm => { + var _a; + global.each(dom.select('br', elm), elm => { + dom.replace(editor.getDoc().createTextNode('\n'), elm); }); - elm.contentEditable = 'false'; - elm.innerHTML = editor.dom.encode(elm.textContent); + elm.innerHTML = dom.encode((_a = elm.textContent) !== null && _a !== void 0 ? _a : ''); get(editor).highlightElement(elm); - elm.className = $.trim(elm.className); + dom.setAttrib(elm, 'data-mce-highlighted', true); + elm.className = trim(elm.className); }); }); } }); + editor.on('PreInit', () => { + editor.parser.addNodeFilter('pre', nodes => { + var _a; + for (let i = 0, l = nodes.length; i < l; i++) { + const node = nodes[i]; + const isCodeSample = ((_a = node.attr('class')) !== null && _a !== void 0 ? _a : '').indexOf('language-') !== -1; + if (isCodeSample) { + node.attr('contenteditable', 'false'); + node.attr('data-mce-highlighted', 'false'); + } + } + }); + }); }; - var isCodeSampleSelection = function (editor) { - var node = editor.selection.getStart(); + const onSetupEditable = (editor, onChanged = noop) => api => { + const nodeChanged = () => { + api.setEnabled(editor.selection.isEditable()); + onChanged(api); + }; + editor.on('NodeChange', nodeChanged); + nodeChanged(); + return () => { + editor.off('NodeChange', nodeChanged); + }; + }; + const isCodeSampleSelection = editor => { + const node = editor.selection.getStart(); return editor.dom.is(node, 'pre[class*="language-"]'); }; - var register = function (editor) { - var onAction = function () { - return editor.execCommand('codesample'); - }; + const register = editor => { + const onAction = () => editor.execCommand('codesample'); editor.ui.registry.addToggleButton('codesample', { icon: 'code-sample', tooltip: 'Insert/edit code sample', - onAction: onAction, - onSetup: function (api) { - var nodeChangeHandler = function () { - api.setActive(isCodeSampleSelection(editor)); - }; - editor.on('NodeChange', nodeChangeHandler); - return function () { - return editor.off('NodeChange', nodeChangeHandler); - }; - } + onAction, + onSetup: onSetupEditable(editor, api => { + api.setActive(isCodeSampleSelection(editor)); + }) }); editor.ui.registry.addMenuItem('codesample', { text: 'Code sample...', icon: 'code-sample', - onAction: onAction + onAction, + onSetup: onSetupEditable(editor) }); }; - function Plugin () { - global$2.add('codesample', function (editor) { + var Plugin = () => { + global$2.add('codesample', editor => { + register$2(editor); setup(editor); register(editor); register$1(editor); - editor.on('dblclick', function (ev) { + editor.on('dblclick', ev => { if (isCodeSample(ev.target)) { open(editor); } }); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/codesample/plugin.min.js b/public/js/tinymce/plugins/codesample/plugin.min.js index 2939f0db2..d89494717 100644 --- a/public/js/tinymce/plugins/codesample/plugin.min.js +++ b/public/js/tinymce/plugins/codesample/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function o(e){return function(){return e}}function e(e){return e}function n(){return l}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=o(!1),i=o(!0),l={fold:function(e,n){return e()},isSome:s,isNone:i,getOr:e,getOrThunk:a,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:o(null),getOrUndefined:o(void 0),or:e,orThunk:a,map:n,each:function(){},bind:n,exists:s,forall:i,filter:function(){return l},toArray:function(){return[]},toString:o("none()")};function a(e){return e()}function u(e){return e&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-")}function c(t){return function(e,n){return t(n)}}var d=function(t){function e(){return r}function n(e){return e(t)}var a=o(t),r={fold:function(e,n){return n(t)},isSome:i,isNone:s,getOr:a,getOrThunk:a,getOrDie:a,getOrNull:a,getOrUndefined:a,or:e,orThunk:e,map:function(e){return d(e(t))},each:function(e){e(t)},bind:n,exists:n,forall:n,filter:function(e){return e(t)?r:l},toArray:function(){return[t]},toString:function(){return"some("+t+")"}};return r},p={some:d,none:n,from:function(e){return null==e?l:d(e)}},g=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),r="undefined"!=typeof window?window:Function("return this;")(),b={},m={exports:b},f={};function h(e){return r.Prism&&e.getParam("codesample_global_prismjs",!1,"boolean")?r.Prism:k}function y(e){var n=e.selection?e.selection.getNode():null;return u(n)?p.some(n):p.none()}function w(s){var t,e,n=s.getParam("codesample_languages")||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}],a=(0<(e=n).length?p.some(e[0]):p.none()).fold(o(""),function(e){return e.value}),r=(t=a,y(s).fold(function(){return t},function(e){var n=e.className.match(/language-(\w+)/);return n?n[1]:t})),i=y(s).fold(o(""),function(e){return e.textContent});s.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"selectbox",name:"language",label:"Language",items:n},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:i},onSubmit:function(e){var n=e.getData(),t=s,a=n.language,r=n.code;t.undoManager.transact(function(){var e=y(t);return r=g.DOM.encode(r),e.fold(function(){t.insertContent('
    '+r+"
    "),t.selection.select(t.$("#__new").removeAttr("id")[0])},function(e){t.dom.setAttrib(e,"class","language-"+a),e.innerHTML=r,h(t).highlightElement(e),t.selection.select(e)})}),e.close()}})}!function(e,n){var t,a,r=window.Prism;window.Prism={manual:!0},t=this,a=function(){var e,n,h,t,a,r,s,i,o,l,u="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:f,c={exports:{}};function y(e,n){return"___"+e.toUpperCase()+n+"___"}return e=c,n=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,e={},j={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof T?new T(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=i.reach);y+=h.value.length,h=h.next){var w=h.value;if(t.length>n.length)return;if(!(w instanceof T)){var k,v=1;if(b){if(!(k=O(f,y,n,g)))break;var _=k.index,x=k.index+k[0].length,F=y;for(F+=h.value.length;F<=_;)F+=(h=h.next).value.length;if(y=F-=h.value.length,h.value instanceof T)continue;for(var P=h;P!==t.tail&&(Fi.reach&&(i.reach=z);var E=h.prev;S&&(E=N(t,E,S),y+=S.length),function(e,n,t){for(var a=n.next,r=0;ri.reach&&(i.reach=C.reach))}}}}(e,r,n,r.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(r)},hooks:{all:{},add:function(e,n){var t=j.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=j.hooks.all[e];if(t&&t.length)for(var a,r=0;a=t[r++];)a(n)}},Token:T};function T(e,n,t,a){this.type=e,this.content=n,this.alias=t,this.length=0|(a||"").length}function O(e,n,t,a){e.lastIndex=n;var r,s=e.exec(t);return s&&a&&s[1]&&(r=s[1].length,s.index+=r,s[0]=s[0].slice(r)),s}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function N(e,n,t){var a=n.next,r={value:t,prev:n,next:a};return n.next=r,a.prev=r,e.length++,r}if(u.Prism=j,T.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var a="";return e.forEach(function(e){a+=n(e,t)}),a}var r={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},s=e.alias;s&&(Array.isArray(s)?Array.prototype.push.apply(r.classes,s):r.classes.push(s)),j.hooks.run("wrap",r);var i,o="";for(i in r.attributes)o+=" "+i+'="'+(r.attributes[i]||"").replace(/"/g,""")+'"';return"<"+r.tag+' class="'+r.classes.join(" ")+'"'+o+">"+r.content+""},!u.document)return u.addEventListener&&(j.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,a=n.code,r=n.immediateClose;u.postMessage(j.highlight(a,j.languages[t],t)),r&&u.close()},!1)),j;var t,a=j.util.currentScript();function r(){j.manual||j.highlightAll()}return a&&(j.filename=a.src,a.hasAttribute("data-manual")&&(j.manual=!0)),j.manual||("loading"===(t=document.readyState)||"interactive"===t&&a&&a.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)),j}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{}),e.exports&&(e.exports=n),void 0!==u&&(u.Prism=n),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},h=Prism,Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,s){var i;a.language===r&&(i=a.tokenStack=[],a.code=a.code.replace(e,function(e){if("function"==typeof s&&!s(e))return e;for(var n,t=i.length;-1!==a.code.indexOf(n=y(r,t));)++t;return i[t]=e,n}),a.grammar=h.languages.markup)}},tokenizePlaceholders:{value:function(g,b){var m,f;g.language===b&&g.tokenStack&&(g.grammar=h.languages[b],m=0,f=Object.keys(g.tokenStack),function e(n){for(var t=0;t=f.length);t++){var a,r,s,i,o,l,u,c,d,p=n[t];"string"==typeof p||p.content&&"string"==typeof p.content?(a=f[m],r=g.tokenStack[a],s="string"==typeof p?p:p.content,i=y(b,a),-1<(o=s.indexOf(i))&&(++m,l=s.substring(0,o),u=new h.Token(b,h.tokenize(r,g.grammar),"language-"+b,r),c=s.substring(o+i.length),d=[],l&&d.push.apply(d,e([l])),d.push(u),c&&d.push.apply(d,e([c])),"string"==typeof p?n.splice.apply(n,[t,1].concat(d)):p.content=d)):p.content&&e(p.content)}return n}(g.tokens))}}}),Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:__attribute__|_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c.boolean,t=Prism,a=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,r=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return a.source}),t.languages.cpp=t.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return a.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:a,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),t.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:module|import)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return r})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),t.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t.languages.cpp}}}}),t.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),t.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:t.languages.extend("cpp",{})}}),t.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},t.languages.cpp["base-clause"]),function(t){function a(e,t){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+t[+n]+")"})}function r(e,n,t){return RegExp(a(e,n),t||"")}function e(e,n){for(var t=0;t>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",s="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(s),c=RegExp(l(n+" "+s+" "+i+" "+o)),d=l(s+" "+i+" "+o),p=l(n+" "+s+" "+o),g=e(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),b=e(/\((?:[^()]|<>)*\)/.source,2),m=/@?\b[A-Za-z_]\w*\b/.source,f=a(/<<0>>(?:\s*<<1>>)?/.source,[m,g]),h=a(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,f]),y=/\[\s*(?:,\s*)*\]/.source,w=a(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[h,y]),k=a(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,b,y]),v=a(/\(<<0>>+(?:,<<0>>+)+\)/.source,[k]),_=a(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[v,h,y]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},F=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,P=/"(?:\\.|[^\\"\r\n])*"/.source;t.languages.csharp=t.languages.extend("clike",{string:[{pattern:r(/(^|[^$\\])<<0>>/.source,[/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source]),lookbehind:!0,greedy:!0},{pattern:r(/(^|[^@$\\])<<0>>/.source,[P]),lookbehind:!0,greedy:!0},{pattern:RegExp(F),greedy:!0,alias:"character"}],"class-name":[{pattern:r(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[h]),lookbehind:!0,inside:x},{pattern:r(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[m,_]),lookbehind:!0,inside:x},{pattern:r(/(\busing\s+)<<0>>(?=\s*=)/.source,[m]),lookbehind:!0},{pattern:r(/(\b<<0>>\s+)<<1>>/.source,[u,f]),lookbehind:!0,inside:x},{pattern:r(/(\bcatch\s*\(\s*)<<0>>/.source,[h]),lookbehind:!0,inside:x},{pattern:r(/(\bwhere\s+)<<0>>/.source,[m]),lookbehind:!0},{pattern:r(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:r(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,p,m]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),t.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),t.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:r(/([(,]\s*)<<0>>(?=\s*:)/.source,[m]),lookbehind:!0,alias:"punctuation"}}),t.languages.insertBefore("csharp","class-name",{namespace:{pattern:r(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[m]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:r(/(\b(?:default|typeof|sizeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[b]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:r(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,h]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:r(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:r(/<<0>>\s*<<1>>(?=\s*\()/.source,[m,g]),inside:{function:r(/^<<0>>/.source,[m]),generic:{pattern:RegExp(g),alias:"class-name",inside:x}}},"type-list":{pattern:r(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,f,m,_,c.source,b,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:r(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[f,b]),lookbehind:!0,greedy:!0,inside:t.languages.csharp},keyword:c,"class-name":{pattern:RegExp(_),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var A=P+"|"+F,S=a(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[A]),$=e(a(/[^"'/()]|<<0>>|\(<>*\)/.source,[S]),2),z=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,E=a(/<<0>>(?:\s*\(<<1>>*\))?/.source,[h,$]);t.languages.insertBefore("csharp","class-name",{attribute:{pattern:r(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[z,E]),lookbehind:!0,greedy:!0,inside:{target:{pattern:r(/^<<0>>(?=\s*:)/.source,[z]),alias:"keyword"},"attribute-arguments":{pattern:r(/\(<<0>>*\)/.source,[$]),inside:t.languages.csharp},"class-name":{pattern:RegExp(h),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var C=/:[^}\r\n]+/.source,j=e(a(/[^"'/()]|<<0>>|\(<>*\)/.source,[S]),2),T=a(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[j,C]),O=e(a(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[A]),2),N=a(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[O,C]);function B(e,n){return{interpolation:{pattern:r(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[e]),lookbehind:!0,inside:{"format-string":{pattern:r(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[n,C]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:t.languages.csharp}}},string:/[\s\S]+/}}t.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:r(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[T]),lookbehind:!0,greedy:!0,inside:B(T,j)},{pattern:r(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:B(N,O)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp,function(e){var n=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+n.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:n,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism),s=Prism,i=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,o=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,l={pattern:RegExp(o+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}},s.languages.java=s.languages.extend("clike",{"class-name":[l,{pattern:RegExp(o+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:l.inside}],keyword:i,function:[s.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),s.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),s.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":l,keyword:i,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return i.source})),lookbehind:!0,inside:{punctuation:/\./}}}),Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),Prism.languages.js=Prism.languages.javascript,Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:t}};a["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:a},Prism.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(e,n){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:Prism.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml,function(n){var e=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;n.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/i,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*[\w|]\|\s*)(?:null|false)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?[\w|]\|\s*)(?:null|false)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:null|false)\b/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:r,punctuation:s};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:n.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];n.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:a,operator:r,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),n.hooks.add("before-tokenize",function(e){/<\?/.test(e.code)&&n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism),Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python,function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby.function,e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp(/%r/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp(/%[qQiIwWxs]?/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?/}},interpolation:n}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?'|'$/}}}}],e.languages.rb=e.languages.ruby}(Prism),{boltExport:c.exports}},"object"==typeof e&&void 0!==n?n.exports=a():(t="undefined"!=typeof globalThis?globalThis:t||self).EphoxContactWrapper=a();window.Prism;window.Prism=r}(b,m);var k=m.exports.boltExport;t.add("codesample",function(n){var t,r,a,s;function e(){return s.execCommand("codesample")}r=(t=n).$,t.on("PreProcess",function(e){r("pre[contenteditable=false]",e.node).filter(c(u)).each(function(e,n){var t=r(n),a=n.textContent;t.attr("class",r.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(r("").each(function(){this.textContent=a}))})}),t.on("SetContent",function(){var e=r("pre").filter(c(u)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){r(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),h(t).highlightElement(n),n.className=r.trim(n.className)})})}),(s=n).ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:e,onSetup:function(t){function e(){var e,n;t.setActive((n=(e=s).selection.getStart(),e.dom.is(n,'pre[class*="language-"]')))}return s.on("NodeChange",e),function(){return s.off("NodeChange",e)}}}),s.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:e}),(a=n).addCommand("codesample",function(){var e=a.selection.getNode();a.selection.isCollapsed()||u(e)?w(a):a.formatter.toggle("code")}),n.on("dblclick",function(e){u(e.target)&&w(n)})})}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>!(e=>null==e)(e),n=()=>{};class a{constructor(e,t){this.tag=e,this.value=t}static some(e){return new a(!0,e)}static none(){return a.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?a.some(e(this.value)):a.none()}bind(e){return this.tag?e(this.value):a.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:a.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return t(e)?a.some(e):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);var s=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");const r="undefined"!=typeof window?window:Function("return this;")(),i=function(e,t,n){const a=window.Prism;window.Prism={manual:!0};var s=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,a={},s={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);x+=_.value.length,_=_.next){var F=_.value;if(t.length>e.length)return;if(!(F instanceof r)){var A,S=1;if(y){if(!(A=i(v,x,e,m))||A.index>=e.length)break;var $=A.index,z=A.index+A[0].length,E=x;for(E+=_.value.length;$>=E;)E+=(_=_.next).value.length;if(x=E-=_.value.length,_.value instanceof r)continue;for(var C=_;C!==t.tail&&(Ed.reach&&(d.reach=O);var P=_.prev;if(B&&(P=u(t,P,B),x+=B.length),c(t,P,S),_=u(t,P,new r(g,f?s.tokenize(j,f):j,w,j)),T&&u(t,_,T),S>1){var N={cause:g+","+b,reach:O};o(e,t,n,_.prev,x,N),d&&N.reach>d.reach&&(d.reach=N.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function u(e,t,n){var a=t.next,s={value:n,prev:t,next:a};return t.next=s,a.prev=s,e.length++,s}function c(e,t,n){for(var a=t.next,s=0;s"+r.content+""},!e.document)return e.addEventListener?(s.disableWorkerMessageHandler||e.addEventListener("message",(function(t){var n=JSON.parse(t.data),a=n.language,r=n.code,i=n.immediateClose;e.postMessage(s.highlight(r,s.languages[a],a)),i&&e.close()}),!1),s):s;var d=s.util.currentScript();function g(){s.manual||s.highlightAll()}if(d&&(s.filename=d.src,d.hasAttribute("data-manual")&&(s.manual=!0)),!s.manual){var p=document.readyState;"loading"===p||"interactive"===p&&d&&d.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return s}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});return s.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,s,r){if(n.language===a){var i=n.tokenStack=[];n.code=n.code.replace(s,(function(e){if("function"==typeof r&&!r(e))return e;for(var s,o=i.length;-1!==n.code.indexOf(s=t(a,o));)++o;return i[o]=e,s})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var s=0,r=Object.keys(n.tokenStack);!function i(o){for(var l=0;l=r.length);l++){var u=o[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=r[s],d=n.tokenStack[c],g="string"==typeof u?u:u.content,p=t(a,c),b=g.indexOf(p);if(b>-1){++s;var h=g.substring(0,b),f=new e.Token(a,e.tokenize(d,n.grammar),"language-"+a,d),m=g.substring(b+p.length),y=[];h&&y.push.apply(y,i([h])),y.push(f),m&&y.push.apply(y,i([m])),"string"==typeof u?o.splice.apply(o,[l,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return o}(n.tokens)}}}})}(s),s.languages.c=s.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),s.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),s.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},s.languages.c.string],char:s.languages.c.char,comment:s.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:s.languages.c}}}}),s.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete s.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(s),function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,(function(e,n){return"(?:"+t[+n]+")"}))}function n(e,n,a){return RegExp(t(e,n),a||"")}function a(e,t){for(var n=0;n>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var s="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(r),c=RegExp(l(s+" "+r+" "+i+" "+o)),d=l(r+" "+i+" "+o),g=l(s+" "+r+" "+o),p=a(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),b=a(/\((?:[^()]|<>)*\)/.source,2),h=/@?\b[A-Za-z_]\w*\b/.source,f=t(/<<0>>(?:\s*<<1>>)?/.source,[h,p]),m=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,f]),y=/\[\s*(?:,\s*)*\]/.source,w=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[m,y]),k=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[p,b,y]),v=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[k]),_=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[v,m,y]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},F=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,A=/"(?:\\.|[^\\"\r\n])*"/.source,S=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[S]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[A]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[m]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[h,_]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[h]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[u,f]),lookbehind:!0,inside:x},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[m]),lookbehind:!0,inside:x},{pattern:n(/(\bwhere\s+)<<0>>/.source,[h]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,g,h]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[b]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,m]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[h,p]),inside:{function:n(/^<<0>>/.source,[h]),generic:{pattern:RegExp(p),alias:"class-name",inside:x}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,f,h,_,c.source,b,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:c,"class-name":{pattern:RegExp(_),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var $=A+"|"+F,z=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[$]),E=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),C=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,j=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[m,E]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[C,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[C]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[E]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var B=/:[^}\r\n]+/.source,T=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),O=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[T,B]),P=a(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[$]),2),N=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[P,B]);function R(t,a){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[a,B]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[O]),lookbehind:!0,greedy:!0,inside:R(O,T)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:R(N,P)}],char:{pattern:RegExp(F),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(s),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(s),function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:a.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:a.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:a.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(s),s.languages.javascript=s.languages.extend("clike",{"class-name":[s.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),s.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,s.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:s.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:s.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:s.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:s.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:s.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),s.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:s.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),s.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),s.languages.markup&&(s.languages.markup.tag.addInlined("script","javascript"),s.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),s.languages.js=s.languages.javascript,s.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},s.languages.markup.tag.inside["attr-value"].inside.entity=s.languages.markup.entity,s.languages.markup.doctype.inside["internal-subset"].inside=s.languages.markup,s.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(s.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:s.languages[t]},n.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:s.languages[t]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:a},s.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(s.languages.markup.tag,"addAttribute",{value:function(e,t){s.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:s.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),s.languages.html=s.languages.markup,s.languages.mathml=s.languages.markup,s.languages.svg=s.languages.markup,s.languages.xml=s.languages.extend("markup",{}),s.languages.ssml=s.languages.xml,s.languages.atom=s.languages.xml,s.languages.rss=s.languages.xml,function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,s=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,r=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:s,punctuation:r};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:s,punctuation:r}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){/<\?/.test(t.code)&&e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(s),s.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},s.languages.python["string-interpolation"].inside.interpolation.inside.rest=s.languages.python,s.languages.py=s.languages.python,function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",a=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+a),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+a+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(s),window.Prism=a,s}(),o=e=>t=>t.options.get(e),l=o("codesample_languages"),u=o("codesample_global_prismjs"),c=e=>r.Prism&&u(e)?r.Prism:i,d=e=>t(e)&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-"),g=e=>{const t=e.selection?e.selection.getNode():null;return d(t)?a.some(t):a.none()},p=e=>{const t=(e=>l(e)||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}])(e),n=(r=t,((e,t)=>0""),(e=>e.value));var r;const i=((e,t)=>g(e).fold((()=>t),(e=>{const n=e.className.match(/language-(\w+)/);return n?n[1]:t})))(e,n),o=(e=>g(e).bind((e=>a.from(e.textContent))).getOr(""))(e);e.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"listbox",name:"language",label:"Language",items:t},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:i,code:o},onSubmit:t=>{const n=t.getData();((e,t,n)=>{const a=e.dom;e.undoManager.transact((()=>{const r=g(e);return n=s.DOM.encode(n),r.fold((()=>{e.insertContent('
    '+n+"
    ");const s=a.select("#__new")[0];a.setAttrib(s,"id",null),e.selection.select(s)}),(s=>{a.setAttrib(s,"class","language-"+t),s.innerHTML=n,c(e).highlightElement(s),e.selection.select(s)}))}))})(e,n.language,n.code),t.close()}})},b=(h=/^\s+|\s+$/g,e=>e.replace(h,""));var h,f=tinymce.util.Tools.resolve("tinymce.util.Tools");const m=(e,t=n)=>n=>{const a=()=>{n.setEnabled(e.selection.isEditable()),t(n)};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("codesample",(e=>{(e=>{const t=e.options.register;t("codesample_languages",{processor:"object[]"}),t("codesample_global_prismjs",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreProcess",(t=>{const n=e.dom,a=n.select("pre[contenteditable=false]",t.node);f.each(f.grep(a,d),(e=>{const t=e.textContent;let a;for(n.setAttrib(e,"class",b(n.getAttrib(e,"class"))),n.setAttrib(e,"contentEditable",null),n.setAttrib(e,"data-mce-highlighted",null);a=e.firstChild;)e.removeChild(a);n.add(e,"code").textContent=t}))})),e.on("SetContent",(()=>{const t=e.dom,n=f.grep(t.select("pre"),(e=>d(e)&&"true"!==t.getAttrib(e,"data-mce-highlighted")));n.length&&e.undoManager.transact((()=>{f.each(n,(n=>{var a;f.each(t.select("br",n),(n=>{t.replace(e.getDoc().createTextNode("\n"),n)})),n.innerHTML=t.encode(null!==(a=n.textContent)&&void 0!==a?a:""),c(e).highlightElement(n),t.setAttrib(n,"data-mce-highlighted",!0),n.className=b(n.className)}))}))})),e.on("PreInit",(()=>{e.parser.addNodeFilter("pre",(e=>{var t;for(let n=0,a=e.length;n{const t=()=>e.execCommand("codesample");e.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:t,onSetup:m(e,(t=>{t.setActive((e=>{const t=e.selection.getStart();return e.dom.is(t,'pre[class*="language-"]')})(e))}))}),e.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:t,onSetup:m(e)})})(e),(e=>{e.addCommand("codesample",(()=>{const t=e.selection.getNode();e.selection.isCollapsed()||d(t)?p(e):e.formatter.toggle("code")}))})(e),e.on("dblclick",(t=>{d(t.target)&&p(e)}))}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/colorpicker/index.js b/public/js/tinymce/plugins/colorpicker/index.js deleted file mode 100644 index 1af1ae63e..000000000 --- a/public/js/tinymce/plugins/colorpicker/index.js +++ /dev/null @@ -1,7 +0,0 @@ -// Exports the "colorpicker" plugin for usage with module loaders -// Usage: -// CommonJS: -// require('tinymce/plugins/colorpicker') -// ES2015: -// import 'tinymce/plugins/colorpicker' -require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/colorpicker/plugin.js b/public/js/tinymce/plugins/colorpicker/plugin.js deleted file mode 100644 index d35c1f6af..000000000 --- a/public/js/tinymce/plugins/colorpicker/plugin.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) - */ -(function () { - 'use strict'; - - var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); - - function Plugin () { - global.add('colorpicker', function () { - }); - } - - Plugin(); - -}()); diff --git a/public/js/tinymce/plugins/colorpicker/plugin.min.js b/public/js/tinymce/plugins/colorpicker/plugin.min.js index 4781ad41a..13a74592a 100644 --- a/public/js/tinymce/plugins/colorpicker/plugin.min.js +++ b/public/js/tinymce/plugins/colorpicker/plugin.min.js @@ -4,6 +4,6 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * - * Version: 5.10.3 (2022-02-09) + * Version: 5.10.5 (2022-05-25) */ !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("colorpicker",function(){})}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/contextmenu/index.js b/public/js/tinymce/plugins/contextmenu/index.js deleted file mode 100644 index ae837e243..000000000 --- a/public/js/tinymce/plugins/contextmenu/index.js +++ /dev/null @@ -1,7 +0,0 @@ -// Exports the "contextmenu" plugin for usage with module loaders -// Usage: -// CommonJS: -// require('tinymce/plugins/contextmenu') -// ES2015: -// import 'tinymce/plugins/contextmenu' -require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/contextmenu/plugin.js b/public/js/tinymce/plugins/contextmenu/plugin.js deleted file mode 100644 index b54c8b072..000000000 --- a/public/js/tinymce/plugins/contextmenu/plugin.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) - */ -(function () { - 'use strict'; - - var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); - - function Plugin () { - global.add('contextmenu', function () { - }); - } - - Plugin(); - -}()); diff --git a/public/js/tinymce/plugins/contextmenu/plugin.min.js b/public/js/tinymce/plugins/contextmenu/plugin.min.js index 2026ed0f3..4799e4c67 100644 --- a/public/js/tinymce/plugins/contextmenu/plugin.min.js +++ b/public/js/tinymce/plugins/contextmenu/plugin.min.js @@ -4,6 +4,6 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * - * Version: 5.10.3 (2022-02-09) + * Version: 5.10.5 (2022-05-25) */ !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("contextmenu",function(){})}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/directionality/plugin.js b/public/js/tinymce/plugins/directionality/plugin.js index a9bb12077..b4524e6e3 100644 --- a/public/js/tinymce/plugins/directionality/plugin.js +++ b/public/js/tinymce/plugins/directionality/plugin.js @@ -1,175 +1,161 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var typeOf = function (x) { - var t = typeof x; + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } + }; + const typeOf = x => { + const t = typeof x; if (x === null) { return 'null'; - } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + } else if (t === 'object' && Array.isArray(x)) { return 'array'; - } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { return 'string'; } else { return t; } }; - var isType$1 = function (type) { - return function (value) { - return typeOf(value) === type; - }; - }; - var isSimpleType = function (type) { - return function (value) { - return typeof value === type; - }; - }; - var isString = isType$1('string'); - var isBoolean = isSimpleType('boolean'); - var isNullable = function (a) { - return a === null || a === undefined; - }; - var isNonNullable = function (a) { - return !isNullable(a); - }; - var isFunction = isSimpleType('function'); - var isNumber = isSimpleType('number'); + const isType$1 = type => value => typeOf(value) === type; + const isSimpleType = type => value => typeof value === type; + const isString = isType$1('string'); + const isBoolean = isSimpleType('boolean'); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); + const isFunction = isSimpleType('function'); + const isNumber = isSimpleType('number'); - var noop = function () { - }; - var compose1 = function (fbc, fab) { - return function (a) { - return fbc(fab(a)); - }; - }; - var constant = function (value) { - return function () { + const compose1 = (fbc, fab) => a => fbc(fab(a)); + const constant = value => { + return () => { return value; }; }; - var identity = function (x) { - return x; - }; - var never = constant(false); - var always = constant(true); + const never = constant(false); - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from - }; + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); - var map = function (xs, f) { - var len = xs.length; - var r = new Array(len); - for (var i = 0; i < len; i++) { - var x = xs[i]; + const map = (xs, f) => { + const len = xs.length; + const r = new Array(len); + for (let i = 0; i < len; i++) { + const x = xs[i]; r[i] = f(x, i); } return r; }; - var each = function (xs, f) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const each = (xs, f) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; f(x, i); } }; - var filter = function (xs, pred) { - var r = []; - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const filter = (xs, pred) => { + const r = []; + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; if (pred(x, i)) { r.push(x); } @@ -177,54 +163,53 @@ return r; }; - var DOCUMENT = 9; - var DOCUMENT_FRAGMENT = 11; - var ELEMENT = 1; - var TEXT = 3; + const DOCUMENT = 9; + const DOCUMENT_FRAGMENT = 11; + const ELEMENT = 1; + const TEXT = 3; - var fromHtml = function (html, scope) { - var doc = scope || document; - var div = doc.createElement('div'); + const fromHtml = (html, scope) => { + const doc = scope || document; + const div = doc.createElement('div'); div.innerHTML = html; if (!div.hasChildNodes() || div.childNodes.length > 1) { - console.error('HTML does not have a single root node', html); - throw new Error('HTML must have a single root node'); + const message = 'HTML does not have a single root node'; + console.error(message, html); + throw new Error(message); } return fromDom(div.childNodes[0]); }; - var fromTag = function (tag, scope) { - var doc = scope || document; - var node = doc.createElement(tag); + const fromTag = (tag, scope) => { + const doc = scope || document; + const node = doc.createElement(tag); return fromDom(node); }; - var fromText = function (text, scope) { - var doc = scope || document; - var node = doc.createTextNode(text); + const fromText = (text, scope) => { + const doc = scope || document; + const node = doc.createTextNode(text); return fromDom(node); }; - var fromDom = function (node) { + const fromDom = node => { if (node === null || node === undefined) { throw new Error('Node cannot be null or undefined'); } return { dom: node }; }; - var fromPoint = function (docElm, x, y) { - return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); - }; - var SugarElement = { - fromHtml: fromHtml, - fromTag: fromTag, - fromText: fromText, - fromDom: fromDom, - fromPoint: fromPoint + const fromPoint = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + const SugarElement = { + fromHtml, + fromTag, + fromText, + fromDom, + fromPoint }; - var is = function (element, selector) { - var dom = element.dom; + const is = (element, selector) => { + const dom = element.dom; if (dom.nodeType !== ELEMENT) { return false; } else { - var elem = dom; + const elem = dom; if (elem.matches !== undefined) { return elem.matches(selector); } else if (elem.msMatchesSelector !== undefined) { @@ -241,42 +226,24 @@ typeof window !== 'undefined' ? window : Function('return this;')(); - var name = function (element) { - var r = element.dom.nodeName; + const name = element => { + const r = element.dom.nodeName; return r.toLowerCase(); }; - var type = function (element) { - return element.dom.nodeType; - }; - var isType = function (t) { - return function (element) { - return type(element) === t; - }; - }; - var isElement = isType(ELEMENT); - var isText = isType(TEXT); - var isDocument = isType(DOCUMENT); - var isDocumentFragment = isType(DOCUMENT_FRAGMENT); - var isTag = function (tag) { - return function (e) { - return isElement(e) && name(e) === tag; - }; - }; + const type = element => element.dom.nodeType; + const isType = t => element => type(element) === t; + const isElement = isType(ELEMENT); + const isText = isType(TEXT); + const isDocument = isType(DOCUMENT); + const isDocumentFragment = isType(DOCUMENT_FRAGMENT); + const isTag = tag => e => isElement(e) && name(e) === tag; - var owner = function (element) { - return SugarElement.fromDom(element.dom.ownerDocument); - }; - var documentOrOwner = function (dos) { - return isDocument(dos) ? dos : owner(dos); - }; - var parent = function (element) { - return Optional.from(element.dom.parentNode).map(SugarElement.fromDom); - }; - var children$2 = function (element) { - return map(element.dom.childNodes, SugarElement.fromDom); - }; + const owner = element => SugarElement.fromDom(element.dom.ownerDocument); + const documentOrOwner = dos => isDocument(dos) ? dos : owner(dos); + const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom); + const children$2 = element => map(element.dom.childNodes, SugarElement.fromDom); - var rawSet = function (dom, key, value) { + const rawSet = (dom, key, value) => { if (isString(value) || isBoolean(value) || isNumber(value)) { dom.setAttribute(key, value + ''); } else { @@ -284,45 +251,37 @@ throw new Error('Attribute value was not simple'); } }; - var set = function (element, key, value) { + const set = (element, key, value) => { rawSet(element.dom, key, value); }; - var remove = function (element, key) { + const remove = (element, key) => { element.dom.removeAttribute(key); }; - var isShadowRoot = function (dos) { - return isDocumentFragment(dos) && isNonNullable(dos.dom.host); - }; - var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); - var getRootNode = supported ? function (e) { - return SugarElement.fromDom(e.dom.getRootNode()); - } : documentOrOwner; - var getShadowRoot = function (e) { - var r = getRootNode(e); + const isShadowRoot = dos => isDocumentFragment(dos) && isNonNullable(dos.dom.host); + const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); + const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner; + const getShadowRoot = e => { + const r = getRootNode(e); return isShadowRoot(r) ? Optional.some(r) : Optional.none(); }; - var getShadowHost = function (e) { - return SugarElement.fromDom(e.dom.host); - }; + const getShadowHost = e => SugarElement.fromDom(e.dom.host); - var inBody = function (element) { - var dom = isText(element) ? element.dom.parentNode : element.dom; + const inBody = element => { + const dom = isText(element) ? element.dom.parentNode : element.dom; if (dom === undefined || dom === null || dom.ownerDocument === null) { return false; } - var doc = dom.ownerDocument; - return getShadowRoot(SugarElement.fromDom(dom)).fold(function () { - return doc.body.contains(dom); - }, compose1(inBody, getShadowHost)); + const doc = dom.ownerDocument; + return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost)); }; - var ancestor$1 = function (scope, predicate, isRoot) { - var element = scope.dom; - var stop = isFunction(isRoot) ? isRoot : never; + const ancestor$1 = (scope, predicate, isRoot) => { + let element = scope.dom; + const stop = isFunction(isRoot) ? isRoot : never; while (element.parentNode) { element = element.parentNode; - var el = SugarElement.fromDom(element); + const el = SugarElement.fromDom(element); if (predicate(el)) { return Optional.some(el); } else if (stop(el)) { @@ -332,122 +291,105 @@ return Optional.none(); }; - var ancestor = function (scope, selector, isRoot) { - return ancestor$1(scope, function (e) { - return is(e, selector); - }, isRoot); - }; + const ancestor = (scope, selector, isRoot) => ancestor$1(scope, e => is(e, selector), isRoot); - var isSupported = function (dom) { - return dom.style !== undefined && isFunction(dom.style.getPropertyValue); - }; + const isSupported = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue); - var get = function (element, property) { - var dom = element.dom; - var styles = window.getComputedStyle(dom); - var r = styles.getPropertyValue(property); + const get = (element, property) => { + const dom = element.dom; + const styles = window.getComputedStyle(dom); + const r = styles.getPropertyValue(property); return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; }; - var getUnsafeProperty = function (dom, property) { - return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; - }; + const getUnsafeProperty = (dom, property) => isSupported(dom) ? dom.style.getPropertyValue(property) : ''; - var getDirection = function (element) { - return get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; - }; + const getDirection = element => get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; - var children$1 = function (scope, predicate) { - return filter(children$2(scope), predicate); - }; + const children$1 = (scope, predicate) => filter(children$2(scope), predicate); - var children = function (scope, selector) { - return children$1(scope, function (e) { - return is(e, selector); - }); - }; + const children = (scope, selector) => children$1(scope, e => is(e, selector)); - var getParentElement = function (element) { - return parent(element).filter(isElement); - }; - var getNormalizedBlock = function (element, isListItem) { - var normalizedElement = isListItem ? ancestor(element, 'ol,ul') : Optional.some(element); + const getParentElement = element => parent(element).filter(isElement); + const getNormalizedBlock = (element, isListItem) => { + const normalizedElement = isListItem ? ancestor(element, 'ol,ul') : Optional.some(element); return normalizedElement.getOr(element); }; - var isListItem = isTag('li'); - var setDir = function (editor, dir) { - var selectedBlocks = editor.selection.getSelectedBlocks(); - if (selectedBlocks.length > 0) { - each(selectedBlocks, function (block) { - var blockElement = SugarElement.fromDom(block); - var isBlockElementListItem = isListItem(blockElement); - var normalizedBlock = getNormalizedBlock(blockElement, isBlockElementListItem); - var normalizedBlockParent = getParentElement(normalizedBlock); - normalizedBlockParent.each(function (parent) { - var parentDirection = getDirection(parent); - if (parentDirection !== dir) { - set(normalizedBlock, 'dir', dir); - } else if (getDirection(normalizedBlock) !== dir) { - remove(normalizedBlock, 'dir'); - } - if (isBlockElementListItem) { - var listItems = children(normalizedBlock, 'li[dir]'); - each(listItems, function (listItem) { - return remove(listItem, 'dir'); - }); - } - }); + const isListItem = isTag('li'); + const setDirOnElements = (dom, blocks, dir) => { + each(blocks, block => { + const blockElement = SugarElement.fromDom(block); + const isBlockElementListItem = isListItem(blockElement); + const normalizedBlock = getNormalizedBlock(blockElement, isBlockElementListItem); + const normalizedBlockParent = getParentElement(normalizedBlock); + normalizedBlockParent.each(parent => { + dom.setStyle(normalizedBlock.dom, 'direction', null); + const parentDirection = getDirection(parent); + if (parentDirection === dir) { + remove(normalizedBlock, 'dir'); + } else { + set(normalizedBlock, 'dir', dir); + } + if (getDirection(normalizedBlock) !== dir) { + dom.setStyle(normalizedBlock.dom, 'direction', dir); + } + if (isBlockElementListItem) { + const listItems = children(normalizedBlock, 'li[dir],li[style]'); + each(listItems, listItem => { + remove(listItem, 'dir'); + dom.setStyle(listItem.dom, 'direction', null); + }); + } }); + }); + }; + const setDir = (editor, dir) => { + if (editor.selection.isEditable()) { + setDirOnElements(editor.dom, editor.selection.getSelectedBlocks(), dir); editor.nodeChanged(); } }; - var register$1 = function (editor) { - editor.addCommand('mceDirectionLTR', function () { + const register$1 = editor => { + editor.addCommand('mceDirectionLTR', () => { setDir(editor, 'ltr'); }); - editor.addCommand('mceDirectionRTL', function () { + editor.addCommand('mceDirectionRTL', () => { setDir(editor, 'rtl'); }); }; - var getNodeChangeHandler = function (editor, dir) { - return function (api) { - var nodeChangeHandler = function (e) { - var element = SugarElement.fromDom(e.element); - api.setActive(getDirection(element) === dir); - }; - editor.on('NodeChange', nodeChangeHandler); - return function () { - return editor.off('NodeChange', nodeChangeHandler); - }; + const getNodeChangeHandler = (editor, dir) => api => { + const nodeChangeHandler = e => { + const element = SugarElement.fromDom(e.element); + api.setActive(getDirection(element) === dir); + api.setEnabled(editor.selection.isEditable()); }; + editor.on('NodeChange', nodeChangeHandler); + api.setEnabled(editor.selection.isEditable()); + return () => editor.off('NodeChange', nodeChangeHandler); }; - var register = function (editor) { + const register = editor => { editor.ui.registry.addToggleButton('ltr', { tooltip: 'Left to right', icon: 'ltr', - onAction: function () { - return editor.execCommand('mceDirectionLTR'); - }, + onAction: () => editor.execCommand('mceDirectionLTR'), onSetup: getNodeChangeHandler(editor, 'ltr') }); editor.ui.registry.addToggleButton('rtl', { tooltip: 'Right to left', icon: 'rtl', - onAction: function () { - return editor.execCommand('mceDirectionRTL'); - }, + onAction: () => editor.execCommand('mceDirectionRTL'), onSetup: getNodeChangeHandler(editor, 'rtl') }); }; - function Plugin () { - global.add('directionality', function (editor) { + var Plugin = () => { + global.add('directionality', editor => { register$1(editor); register(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/directionality/plugin.min.js b/public/js/tinymce/plugins/directionality/plugin.min.js index d56347615..19dee3a51 100644 --- a/public/js/tinymce/plugins/directionality/plugin.min.js +++ b/public/js/tinymce/plugins/directionality/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function n(t){return function(n){return typeof n===t}}function u(n){return function(){return n}}function t(n){return n}function r(){return d}var o,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n){return r=typeof(t=n),(null===t?"null":"object"==r&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":r)===o;var t,r},c=n("boolean"),f=n("function"),l=n("number"),a=u(!(o="string")),m=u(!0),d={fold:function(n,t){return n()},isSome:a,isNone:m,getOr:t,getOrThunk:s,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(void 0),or:t,orThunk:s,map:r,each:function(){},bind:r,exists:a,forall:m,filter:function(){return d},toArray:function(){return[]},toString:u("none()")};function s(n){return n()}function g(n,t){for(var r=0,o=n.length;re=>typeof e===t,o=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(o=r=t,(n=String).prototype.isPrototypeOf(o)||(null===(i=r.constructor)||void 0===i?void 0:i.name)===n.name)?"string":e;var o,r,n,i})(t),r=e("boolean"),n=t=>!(t=>null==t)(t),i=e("function"),s=e("number"),l=(!1,()=>false);class a{constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return n(t)?a.some(t):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);const u=(t,e)=>{for(let o=0,r=t.length;o{if(null==t)throw new Error("Node cannot be null or undefined");return{dom:t}},d=c,h=(t,e)=>{const o=t.dom;if(1!==o.nodeType)return!1;{const t=o;if(void 0!==t.matches)return t.matches(e);if(void 0!==t.msMatchesSelector)return t.msMatchesSelector(e);if(void 0!==t.webkitMatchesSelector)return t.webkitMatchesSelector(e);if(void 0!==t.mozMatchesSelector)return t.mozMatchesSelector(e);throw new Error("Browser lacks native selectors")}};"undefined"!=typeof window?window:Function("return this;")();const m=t=>e=>(t=>t.dom.nodeType)(e)===t,g=m(1),f=m(3),v=m(9),y=m(11),p=(t,e)=>{t.dom.removeAttribute(e)},w=i(Element.prototype.attachShadow)&&i(Node.prototype.getRootNode)?t=>d(t.dom.getRootNode()):t=>v(t)?t:d(t.dom.ownerDocument),b=t=>d(t.dom.host),N=t=>{const e=f(t)?t.dom.parentNode:t.dom;if(null==e||null===e.ownerDocument)return!1;const o=e.ownerDocument;return(t=>{const e=w(t);return y(o=e)&&n(o.dom.host)?a.some(e):a.none();var o})(d(e)).fold((()=>o.body.contains(e)),(r=N,i=b,t=>r(i(t))));var r,i},S=t=>"rtl"===((t,e)=>{const o=t.dom,r=window.getComputedStyle(o).getPropertyValue(e);return""!==r||N(t)?r:((t,e)=>(t=>void 0!==t.style&&i(t.style.getPropertyValue))(t)?t.style.getPropertyValue(e):"")(o,e)})(t,"direction")?"rtl":"ltr",A=(t,e)=>((t,o)=>((t,e)=>{const o=[];for(let r=0,n=t.length;r{const o=t.length,r=new Array(o);for(let n=0;nh(t,e))))(t),E=("li",t=>g(t)&&"li"===t.dom.nodeName.toLowerCase());const T=(t,e,n)=>{u(e,(e=>{const c=d(e),m=E(c),f=((t,e)=>{return(e?(o=t,r="ol,ul",((t,e,o)=>{let n=t.dom;const s=i(o)?o:l;for(;n.parentNode;){n=n.parentNode;const t=d(n);if(h(t,r))return a.some(t);if(s(t))break}return a.none()})(o,0,n)):a.some(t)).getOr(t);var o,r,n})(c,m);var v;(v=f,(t=>a.from(t.dom.parentNode).map(d))(v).filter(g)).each((e=>{if(t.setStyle(f.dom,"direction",null),S(e)===n?p(f,"dir"):((t,e,n)=>{((t,e,n)=>{if(!(o(n)||r(n)||s(n)))throw console.error("Invalid call to Attribute.set. Key ",e,":: Value ",n,":: Element ",t),new Error("Attribute value was not simple");t.setAttribute(e,n+"")})(t.dom,e,n)})(f,"dir",n),S(f)!==n&&t.setStyle(f.dom,"direction",n),m){const e=A(f,"li[dir],li[style]");u(e,(e=>{p(e,"dir"),t.setStyle(e.dom,"direction",null)}))}}))}))},C=(t,e)=>{t.selection.isEditable()&&(T(t.dom,t.selection.getSelectedBlocks(),e),t.nodeChanged())},D=(t,e)=>o=>{const r=r=>{const n=d(r.element);o.setActive(S(n)===e),o.setEnabled(t.selection.isEditable())};return t.on("NodeChange",r),o.setEnabled(t.selection.isEditable()),()=>t.off("NodeChange",r)};t.add("directionality",(t=>{(t=>{t.addCommand("mceDirectionLTR",(()=>{C(t,"ltr")})),t.addCommand("mceDirectionRTL",(()=>{C(t,"rtl")}))})(t),(t=>{t.ui.registry.addToggleButton("ltr",{tooltip:"Left to right",icon:"ltr",onAction:()=>t.execCommand("mceDirectionLTR"),onSetup:D(t,"ltr")}),t.ui.registry.addToggleButton("rtl",{tooltip:"Right to left",icon:"rtl",onAction:()=>t.execCommand("mceDirectionRTL"),onSetup:D(t,"rtl")})})(t)}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/emoticons/js/emojiimages.js b/public/js/tinymce/plugins/emoticons/js/emojiimages.js index d5f9734ba..6fcec717a 100644 --- a/public/js/tinymce/plugins/emoticons/js/emojiimages.js +++ b/public/js/tinymce/plugins/emoticons/js/emojiimages.js @@ -1,9424 +1 @@ -// Source: npm package: emojilib -// Images provided by twemoji: https://github.com/twitter/twemoji -window.tinymce.Resource.add("tinymce.plugins.emoticons", { - 100: { - keywords: [ "score", "perfect", "numbers", "century", "exam", "quiz", "test", "pass", "hundred" ], - char: '\ud83d\udcaf', - fitzpatrick_scale: false, - category: "symbols" - }, - 1234: { - keywords: [ "numbers", "blue-square" ], - char: '\ud83d\udd22', - fitzpatrick_scale: false, - category: "symbols" - }, - grinning: { - keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ], - char: '\ud83d\ude00', - fitzpatrick_scale: false, - category: "people" - }, - grimacing: { - keywords: [ "face", "grimace", "teeth" ], - char: '\ud83d\ude2c', - fitzpatrick_scale: false, - category: "people" - }, - grin: { - keywords: [ "face", "happy", "smile", "joy", "kawaii" ], - char: '\ud83d\ude01', - fitzpatrick_scale: false, - category: "people" - }, - joy: { - keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ], - char: '\ud83d\ude02', - fitzpatrick_scale: false, - category: "people" - }, - rofl: { - keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ], - char: '\ud83e\udd23', - fitzpatrick_scale: false, - category: "people" - }, - partying: { - keywords: [ "face", "celebration", "woohoo" ], - char: '\ud83e\udd73', - fitzpatrick_scale: false, - category: "people" - }, - smiley: { - keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ], - char: '\ud83d\ude03', - fitzpatrick_scale: false, - category: "people" - }, - smile: { - keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ], - char: '\ud83d\ude04', - fitzpatrick_scale: false, - category: "people" - }, - sweat_smile: { - keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ], - char: '\ud83d\ude05', - fitzpatrick_scale: false, - category: "people" - }, - laughing: { - keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ], - char: '\ud83d\ude06', - fitzpatrick_scale: false, - category: "people" - }, - innocent: { - keywords: [ "face", "angel", "heaven", "halo" ], - char: '\ud83d\ude07', - fitzpatrick_scale: false, - category: "people" - }, - wink: { - keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ], - char: '\ud83d\ude09', - fitzpatrick_scale: false, - category: "people" - }, - blush: { - keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ], - char: '\ud83d\ude0a', - fitzpatrick_scale: false, - category: "people" - }, - slightly_smiling_face: { - keywords: [ "face", "smile" ], - char: '\ud83d\ude42', - fitzpatrick_scale: false, - category: "people" - }, - upside_down_face: { - keywords: [ "face", "flipped", "silly", "smile" ], - char: '\ud83d\ude43', - fitzpatrick_scale: false, - category: "people" - }, - relaxed: { - keywords: [ "face", "blush", "massage", "happiness" ], - char: '\u263a\ufe0f', - fitzpatrick_scale: false, - category: "people" - }, - yum: { - keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ], - char: '\ud83d\ude0b', - fitzpatrick_scale: false, - category: "people" - }, - relieved: { - keywords: [ "face", "relaxed", "phew", "massage", "happiness" ], - char: '\ud83d\ude0c', - fitzpatrick_scale: false, - category: "people" - }, - heart_eyes: { - keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ], - char: '\ud83d\ude0d', - fitzpatrick_scale: false, - category: "people" - }, - smiling_face_with_three_hearts: { - keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ], - char: '\ud83e\udd70', - fitzpatrick_scale: false, - category: "people" - }, - kissing_heart: { - keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], - char: '\ud83d\ude18', - fitzpatrick_scale: false, - category: "people" - }, - kissing: { - keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ], - char: '\ud83d\ude17', - fitzpatrick_scale: false, - category: "people" - }, - kissing_smiling_eyes: { - keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ], - char: '\ud83d\ude19', - fitzpatrick_scale: false, - category: "people" - }, - kissing_closed_eyes: { - keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], - char: '\ud83d\ude1a', - fitzpatrick_scale: false, - category: "people" - }, - stuck_out_tongue_winking_eye: { - keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ], - char: '\ud83d\ude1c', - fitzpatrick_scale: false, - category: "people" - }, - zany: { - keywords: [ "face", "goofy", "crazy" ], - char: '\ud83e\udd2a', - fitzpatrick_scale: false, - category: "people" - }, - raised_eyebrow: { - keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ], - char: '\ud83e\udd28', - fitzpatrick_scale: false, - category: "people" - }, - monocle: { - keywords: [ "face", "stuffy", "wealthy" ], - char: '\ud83e\uddd0', - fitzpatrick_scale: false, - category: "people" - }, - stuck_out_tongue_closed_eyes: { - keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ], - char: '\ud83d\ude1d', - fitzpatrick_scale: false, - category: "people" - }, - stuck_out_tongue: { - keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ], - char: '\ud83d\ude1b', - fitzpatrick_scale: false, - category: "people" - }, - money_mouth_face: { - keywords: [ "face", "rich", "dollar", "money" ], - char: '\ud83e\udd11', - fitzpatrick_scale: false, - category: "people" - }, - nerd_face: { - keywords: [ "face", "nerdy", "geek", "dork" ], - char: '\ud83e\udd13', - fitzpatrick_scale: false, - category: "people" - }, - sunglasses: { - keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ], - char: '\ud83d\ude0e', - fitzpatrick_scale: false, - category: "people" - }, - star_struck: { - keywords: [ "face", "smile", "starry", "eyes", "grinning" ], - char: '\ud83e\udd29', - fitzpatrick_scale: false, - category: "people" - }, - clown_face: { - keywords: [ "face" ], - char: '\ud83e\udd21', - fitzpatrick_scale: false, - category: "people" - }, - cowboy_hat_face: { - keywords: [ "face", "cowgirl", "hat" ], - char: '\ud83e\udd20', - fitzpatrick_scale: false, - category: "people" - }, - hugs: { - keywords: [ "face", "smile", "hug" ], - char: '\ud83e\udd17', - fitzpatrick_scale: false, - category: "people" - }, - smirk: { - keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ], - char: '\ud83d\ude0f', - fitzpatrick_scale: false, - category: "people" - }, - no_mouth: { - keywords: [ "face", "hellokitty" ], - char: '\ud83d\ude36', - fitzpatrick_scale: false, - category: "people" - }, - neutral_face: { - keywords: [ "indifference", "meh", ":|", "neutral" ], - char: '\ud83d\ude10', - fitzpatrick_scale: false, - category: "people" - }, - expressionless: { - keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ], - char: '\ud83d\ude11', - fitzpatrick_scale: false, - category: "people" - }, - unamused: { - keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ], - char: '\ud83d\ude12', - fitzpatrick_scale: false, - category: "people" - }, - roll_eyes: { - keywords: [ "face", "eyeroll", "frustrated" ], - char: '\ud83d\ude44', - fitzpatrick_scale: false, - category: "people" - }, - thinking: { - keywords: [ "face", "hmmm", "think", "consider" ], - char: '\ud83e\udd14', - fitzpatrick_scale: false, - category: "people" - }, - lying_face: { - keywords: [ "face", "lie", "pinocchio" ], - char: '\ud83e\udd25', - fitzpatrick_scale: false, - category: "people" - }, - hand_over_mouth: { - keywords: [ "face", "whoops", "shock", "surprise" ], - char: '\ud83e\udd2d', - fitzpatrick_scale: false, - category: "people" - }, - shushing: { - keywords: [ "face", "quiet", "shhh" ], - char: '\ud83e\udd2b', - fitzpatrick_scale: false, - category: "people" - }, - symbols_over_mouth: { - keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ], - char: '\ud83e\udd2c', - fitzpatrick_scale: false, - category: "people" - }, - exploding_head: { - keywords: [ "face", "shocked", "mind", "blown" ], - char: '\ud83e\udd2f', - fitzpatrick_scale: false, - category: "people" - }, - flushed: { - keywords: [ "face", "blush", "shy", "flattered" ], - char: '\ud83d\ude33', - fitzpatrick_scale: false, - category: "people" - }, - disappointed: { - keywords: [ "face", "sad", "upset", "depressed", ":(" ], - char: '\ud83d\ude1e', - fitzpatrick_scale: false, - category: "people" - }, - worried: { - keywords: [ "face", "concern", "nervous", ":(" ], - char: '\ud83d\ude1f', - fitzpatrick_scale: false, - category: "people" - }, - angry: { - keywords: [ "mad", "face", "annoyed", "frustrated" ], - char: '\ud83d\ude20', - fitzpatrick_scale: false, - category: "people" - }, - rage: { - keywords: [ "angry", "mad", "hate", "despise" ], - char: '\ud83d\ude21', - fitzpatrick_scale: false, - category: "people" - }, - pensive: { - keywords: [ "face", "sad", "depressed", "upset" ], - char: '\ud83d\ude14', - fitzpatrick_scale: false, - category: "people" - }, - confused: { - keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ], - char: '\ud83d\ude15', - fitzpatrick_scale: false, - category: "people" - }, - slightly_frowning_face: { - keywords: [ "face", "frowning", "disappointed", "sad", "upset" ], - char: '\ud83d\ude41', - fitzpatrick_scale: false, - category: "people" - }, - frowning_face: { - keywords: [ "face", "sad", "upset", "frown" ], - char: '\u2639', - fitzpatrick_scale: false, - category: "people" - }, - persevere: { - keywords: [ "face", "sick", "no", "upset", "oops" ], - char: '\ud83d\ude23', - fitzpatrick_scale: false, - category: "people" - }, - confounded: { - keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ], - char: '\ud83d\ude16', - fitzpatrick_scale: false, - category: "people" - }, - tired_face: { - keywords: [ "sick", "whine", "upset", "frustrated" ], - char: '\ud83d\ude2b', - fitzpatrick_scale: false, - category: "people" - }, - weary: { - keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ], - char: '\ud83d\ude29', - fitzpatrick_scale: false, - category: "people" - }, - pleading: { - keywords: [ "face", "begging", "mercy" ], - char: '\ud83e\udd7a', - fitzpatrick_scale: false, - category: "people" - }, - triumph: { - keywords: [ "face", "gas", "phew", "proud", "pride" ], - char: '\ud83d\ude24', - fitzpatrick_scale: false, - category: "people" - }, - open_mouth: { - keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ], - char: '\ud83d\ude2e', - fitzpatrick_scale: false, - category: "people" - }, - scream: { - keywords: [ "face", "munch", "scared", "omg" ], - char: '\ud83d\ude31', - fitzpatrick_scale: false, - category: "people" - }, - fearful: { - keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ], - char: '\ud83d\ude28', - fitzpatrick_scale: false, - category: "people" - }, - cold_sweat: { - keywords: [ "face", "nervous", "sweat" ], - char: '\ud83d\ude30', - fitzpatrick_scale: false, - category: "people" - }, - hushed: { - keywords: [ "face", "woo", "shh" ], - char: '\ud83d\ude2f', - fitzpatrick_scale: false, - category: "people" - }, - frowning: { - keywords: [ "face", "aw", "what" ], - char: '\ud83d\ude26', - fitzpatrick_scale: false, - category: "people" - }, - anguished: { - keywords: [ "face", "stunned", "nervous" ], - char: '\ud83d\ude27', - fitzpatrick_scale: false, - category: "people" - }, - cry: { - keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ], - char: '\ud83d\ude22', - fitzpatrick_scale: false, - category: "people" - }, - disappointed_relieved: { - keywords: [ "face", "phew", "sweat", "nervous" ], - char: '\ud83d\ude25', - fitzpatrick_scale: false, - category: "people" - }, - drooling_face: { - keywords: [ "face" ], - char: '\ud83e\udd24', - fitzpatrick_scale: false, - category: "people" - }, - sleepy: { - keywords: [ "face", "tired", "rest", "nap" ], - char: '\ud83d\ude2a', - fitzpatrick_scale: false, - category: "people" - }, - sweat: { - keywords: [ "face", "hot", "sad", "tired", "exercise" ], - char: '\ud83d\ude13', - fitzpatrick_scale: false, - category: "people" - }, - hot: { - keywords: [ "face", "feverish", "heat", "red", "sweating" ], - char: '\ud83e\udd75', - fitzpatrick_scale: false, - category: "people" - }, - cold: { - keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ], - char: '\ud83e\udd76', - fitzpatrick_scale: false, - category: "people" - }, - sob: { - keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ], - char: '\ud83d\ude2d', - fitzpatrick_scale: false, - category: "people" - }, - dizzy_face: { - keywords: [ "spent", "unconscious", "xox", "dizzy" ], - char: '\ud83d\ude35', - fitzpatrick_scale: false, - category: "people" - }, - astonished: { - keywords: [ "face", "xox", "surprised", "poisoned" ], - char: '\ud83d\ude32', - fitzpatrick_scale: false, - category: "people" - }, - zipper_mouth_face: { - keywords: [ "face", "sealed", "zipper", "secret" ], - char: '\ud83e\udd10', - fitzpatrick_scale: false, - category: "people" - }, - nauseated_face: { - keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ], - char: '\ud83e\udd22', - fitzpatrick_scale: false, - category: "people" - }, - sneezing_face: { - keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ], - char: '\ud83e\udd27', - fitzpatrick_scale: false, - category: "people" - }, - vomiting: { - keywords: [ "face", "sick" ], - char: '\ud83e\udd2e', - fitzpatrick_scale: false, - category: "people" - }, - mask: { - keywords: [ "face", "sick", "ill", "disease" ], - char: '\ud83d\ude37', - fitzpatrick_scale: false, - category: "people" - }, - face_with_thermometer: { - keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ], - char: '\ud83e\udd12', - fitzpatrick_scale: false, - category: "people" - }, - face_with_head_bandage: { - keywords: [ "injured", "clumsy", "bandage", "hurt" ], - char: '\ud83e\udd15', - fitzpatrick_scale: false, - category: "people" - }, - woozy: { - keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ], - char: '\ud83e\udd74', - fitzpatrick_scale: false, - category: "people" - }, - sleeping: { - keywords: [ "face", "tired", "sleepy", "night", "zzz" ], - char: '\ud83d\ude34', - fitzpatrick_scale: false, - category: "people" - }, - zzz: { - keywords: [ "sleepy", "tired", "dream" ], - char: '\ud83d\udca4', - fitzpatrick_scale: false, - category: "people" - }, - poop: { - keywords: [ "hankey", "shitface", "fail", "turd", "shit" ], - char: '\ud83d\udca9', - fitzpatrick_scale: false, - category: "people" - }, - smiling_imp: { - keywords: [ "devil", "horns" ], - char: '\ud83d\ude08', - fitzpatrick_scale: false, - category: "people" - }, - imp: { - keywords: [ "devil", "angry", "horns" ], - char: '\ud83d\udc7f', - fitzpatrick_scale: false, - category: "people" - }, - japanese_ogre: { - keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ], - char: '\ud83d\udc79', - fitzpatrick_scale: false, - category: "people" - }, - japanese_goblin: { - keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ], - char: '\ud83d\udc7a', - fitzpatrick_scale: false, - category: "people" - }, - skull: { - keywords: [ "dead", "skeleton", "creepy", "death" ], - char: '\ud83d\udc80', - fitzpatrick_scale: false, - category: "people" - }, - ghost: { - keywords: [ "halloween", "spooky", "scary" ], - char: '\ud83d\udc7b', - fitzpatrick_scale: false, - category: "people" - }, - alien: { - keywords: [ "UFO", "paul", "weird", "outer_space" ], - char: '\ud83d\udc7d', - fitzpatrick_scale: false, - category: "people" - }, - robot: { - keywords: [ "computer", "machine", "bot" ], - char: '\ud83e\udd16', - fitzpatrick_scale: false, - category: "people" - }, - smiley_cat: { - keywords: [ "animal", "cats", "happy", "smile" ], - char: '\ud83d\ude3a', - fitzpatrick_scale: false, - category: "people" - }, - smile_cat: { - keywords: [ "animal", "cats", "smile" ], - char: '\ud83d\ude38', - fitzpatrick_scale: false, - category: "people" - }, - joy_cat: { - keywords: [ "animal", "cats", "haha", "happy", "tears" ], - char: '\ud83d\ude39', - fitzpatrick_scale: false, - category: "people" - }, - heart_eyes_cat: { - keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ], - char: '\ud83d\ude3b', - fitzpatrick_scale: false, - category: "people" - }, - smirk_cat: { - keywords: [ "animal", "cats", "smirk" ], - char: '\ud83d\ude3c', - fitzpatrick_scale: false, - category: "people" - }, - kissing_cat: { - keywords: [ "animal", "cats", "kiss" ], - char: '\ud83d\ude3d', - fitzpatrick_scale: false, - category: "people" - }, - scream_cat: { - keywords: [ "animal", "cats", "munch", "scared", "scream" ], - char: '\ud83d\ude40', - fitzpatrick_scale: false, - category: "people" - }, - crying_cat_face: { - keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ], - char: '\ud83d\ude3f', - fitzpatrick_scale: false, - category: "people" - }, - pouting_cat: { - keywords: [ "animal", "cats" ], - char: '\ud83d\ude3e', - fitzpatrick_scale: false, - category: "people" - }, - palms_up: { - keywords: [ "hands", "gesture", "cupped", "prayer" ], - char: '\ud83e\udd32', - fitzpatrick_scale: true, - category: "people" - }, - raised_hands: { - keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ], - char: '\ud83d\ude4c', - fitzpatrick_scale: true, - category: "people" - }, - clap: { - keywords: [ "hands", "praise", "applause", "congrats", "yay" ], - char: '\ud83d\udc4f', - fitzpatrick_scale: true, - category: "people" - }, - wave: { - keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ], - char: '\ud83d\udc4b', - fitzpatrick_scale: true, - category: "people" - }, - call_me_hand: { - keywords: [ "hands", "gesture" ], - char: '\ud83e\udd19', - fitzpatrick_scale: true, - category: "people" - }, - "+1": { - keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ], - char: '\ud83d\udc4d', - fitzpatrick_scale: true, - category: "people" - }, - "-1": { - keywords: [ "thumbsdown", "no", "dislike", "hand" ], - char: '\ud83d\udc4e', - fitzpatrick_scale: true, - category: "people" - }, - facepunch: { - keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ], - char: '\ud83d\udc4a', - fitzpatrick_scale: true, - category: "people" - }, - fist: { - keywords: [ "fingers", "hand", "grasp" ], - char: '\u270a', - fitzpatrick_scale: true, - category: "people" - }, - fist_left: { - keywords: [ "hand", "fistbump" ], - char: '\ud83e\udd1b', - fitzpatrick_scale: true, - category: "people" - }, - fist_right: { - keywords: [ "hand", "fistbump" ], - char: '\ud83e\udd1c', - fitzpatrick_scale: true, - category: "people" - }, - v: { - keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ], - char: '\u270c', - fitzpatrick_scale: true, - category: "people" - }, - ok_hand: { - keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ], - char: '\ud83d\udc4c', - fitzpatrick_scale: true, - category: "people" - }, - raised_hand: { - keywords: [ "fingers", "stop", "highfive", "palm", "ban" ], - char: '\u270b', - fitzpatrick_scale: true, - category: "people" - }, - raised_back_of_hand: { - keywords: [ "fingers", "raised", "backhand" ], - char: '\ud83e\udd1a', - fitzpatrick_scale: true, - category: "people" - }, - open_hands: { - keywords: [ "fingers", "butterfly", "hands", "open" ], - char: '\ud83d\udc50', - fitzpatrick_scale: true, - category: "people" - }, - muscle: { - keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ], - char: '\ud83d\udcaa', - fitzpatrick_scale: true, - category: "people" - }, - pray: { - keywords: [ "please", "hope", "wish", "namaste", "highfive" ], - char: '\ud83d\ude4f', - fitzpatrick_scale: true, - category: "people" - }, - foot: { - keywords: [ "kick", "stomp" ], - char: '\ud83e\uddb6', - fitzpatrick_scale: true, - category: "people" - }, - leg: { - keywords: [ "kick", "limb" ], - char: '\ud83e\uddb5', - fitzpatrick_scale: true, - category: "people" - }, - handshake: { - keywords: [ "agreement", "shake" ], - char: '\ud83e\udd1d', - fitzpatrick_scale: false, - category: "people" - }, - point_up: { - keywords: [ "hand", "fingers", "direction", "up" ], - char: '\u261d', - fitzpatrick_scale: true, - category: "people" - }, - point_up_2: { - keywords: [ "fingers", "hand", "direction", "up" ], - char: '\ud83d\udc46', - fitzpatrick_scale: true, - category: "people" - }, - point_down: { - keywords: [ "fingers", "hand", "direction", "down" ], - char: '\ud83d\udc47', - fitzpatrick_scale: true, - category: "people" - }, - point_left: { - keywords: [ "direction", "fingers", "hand", "left" ], - char: '\ud83d\udc48', - fitzpatrick_scale: true, - category: "people" - }, - point_right: { - keywords: [ "fingers", "hand", "direction", "right" ], - char: '\ud83d\udc49', - fitzpatrick_scale: true, - category: "people" - }, - fu: { - keywords: [ "hand", "fingers", "rude", "middle", "flipping" ], - char: '\ud83d\udd95', - fitzpatrick_scale: true, - category: "people" - }, - raised_hand_with_fingers_splayed: { - keywords: [ "hand", "fingers", "palm" ], - char: '\ud83d\udd90', - fitzpatrick_scale: true, - category: "people" - }, - love_you: { - keywords: [ "hand", "fingers", "gesture" ], - char: '\ud83e\udd1f', - fitzpatrick_scale: true, - category: "people" - }, - metal: { - keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ], - char: '\ud83e\udd18', - fitzpatrick_scale: true, - category: "people" - }, - crossed_fingers: { - keywords: [ "good", "lucky" ], - char: '\ud83e\udd1e', - fitzpatrick_scale: true, - category: "people" - }, - vulcan_salute: { - keywords: [ "hand", "fingers", "spock", "star trek" ], - char: '\ud83d\udd96', - fitzpatrick_scale: true, - category: "people" - }, - writing_hand: { - keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ], - char: '\u270d', - fitzpatrick_scale: true, - category: "people" - }, - selfie: { - keywords: [ "camera", "phone" ], - char: '\ud83e\udd33', - fitzpatrick_scale: true, - category: "people" - }, - nail_care: { - keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ], - char: '\ud83d\udc85', - fitzpatrick_scale: true, - category: "people" - }, - lips: { - keywords: [ "mouth", "kiss" ], - char: '\ud83d\udc44', - fitzpatrick_scale: false, - category: "people" - }, - tooth: { - keywords: [ "teeth", "dentist" ], - char: '\ud83e\uddb7', - fitzpatrick_scale: false, - category: "people" - }, - tongue: { - keywords: [ "mouth", "playful" ], - char: '\ud83d\udc45', - fitzpatrick_scale: false, - category: "people" - }, - ear: { - keywords: [ "face", "hear", "sound", "listen" ], - char: '\ud83d\udc42', - fitzpatrick_scale: true, - category: "people" - }, - nose: { - keywords: [ "smell", "sniff" ], - char: '\ud83d\udc43', - fitzpatrick_scale: true, - category: "people" - }, - eye: { - keywords: [ "face", "look", "see", "watch", "stare" ], - char: '\ud83d\udc41', - fitzpatrick_scale: false, - category: "people" - }, - eyes: { - keywords: [ "look", "watch", "stalk", "peek", "see" ], - char: '\ud83d\udc40', - fitzpatrick_scale: false, - category: "people" - }, - brain: { - keywords: [ "smart", "intelligent" ], - char: '\ud83e\udde0', - fitzpatrick_scale: false, - category: "people" - }, - bust_in_silhouette: { - keywords: [ "user", "person", "human" ], - char: '\ud83d\udc64', - fitzpatrick_scale: false, - category: "people" - }, - busts_in_silhouette: { - keywords: [ "user", "person", "human", "group", "team" ], - char: '\ud83d\udc65', - fitzpatrick_scale: false, - category: "people" - }, - speaking_head: { - keywords: [ "user", "person", "human", "sing", "say", "talk" ], - char: '\ud83d\udde3', - fitzpatrick_scale: false, - category: "people" - }, - baby: { - keywords: [ "child", "boy", "girl", "toddler" ], - char: '\ud83d\udc76', - fitzpatrick_scale: true, - category: "people" - }, - child: { - keywords: [ "gender-neutral", "young" ], - char: '\ud83e\uddd2', - fitzpatrick_scale: true, - category: "people" - }, - boy: { - keywords: [ "man", "male", "guy", "teenager" ], - char: '\ud83d\udc66', - fitzpatrick_scale: true, - category: "people" - }, - girl: { - keywords: [ "female", "woman", "teenager" ], - char: '\ud83d\udc67', - fitzpatrick_scale: true, - category: "people" - }, - adult: { - keywords: [ "gender-neutral", "person" ], - char: '\ud83e\uddd1', - fitzpatrick_scale: true, - category: "people" - }, - man: { - keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ], - char: '\ud83d\udc68', - fitzpatrick_scale: true, - category: "people" - }, - woman: { - keywords: [ "female", "girls", "lady" ], - char: '\ud83d\udc69', - fitzpatrick_scale: true, - category: "people" - }, - blonde_woman: { - keywords: [ "woman", "female", "girl", "blonde", "person" ], - char: '\ud83d\udc71\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - blonde_man: { - keywords: [ "man", "male", "boy", "blonde", "guy", "person" ], - char: '\ud83d\udc71', - fitzpatrick_scale: true, - category: "people" - }, - bearded_person: { - keywords: [ "person", "bewhiskered" ], - char: '\ud83e\uddd4', - fitzpatrick_scale: true, - category: "people" - }, - older_adult: { - keywords: [ "human", "elder", "senior", "gender-neutral" ], - char: '\ud83e\uddd3', - fitzpatrick_scale: true, - category: "people" - }, - older_man: { - keywords: [ "human", "male", "men", "old", "elder", "senior" ], - char: '\ud83d\udc74', - fitzpatrick_scale: true, - category: "people" - }, - older_woman: { - keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ], - char: '\ud83d\udc75', - fitzpatrick_scale: true, - category: "people" - }, - man_with_gua_pi_mao: { - keywords: [ "male", "boy", "chinese" ], - char: '\ud83d\udc72', - fitzpatrick_scale: true, - category: "people" - }, - woman_with_headscarf: { - keywords: [ "female", "hijab", "mantilla", "tichel" ], - char: '\ud83e\uddd5', - fitzpatrick_scale: true, - category: "people" - }, - woman_with_turban: { - keywords: [ "female", "indian", "hinduism", "arabs", "woman" ], - char: '\ud83d\udc73\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - man_with_turban: { - keywords: [ "male", "indian", "hinduism", "arabs" ], - char: '\ud83d\udc73', - fitzpatrick_scale: true, - category: "people" - }, - policewoman: { - keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ], - char: '\ud83d\udc6e\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - policeman: { - keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ], - char: '\ud83d\udc6e', - fitzpatrick_scale: true, - category: "people" - }, - construction_worker_woman: { - keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ], - char: '\ud83d\udc77\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - construction_worker_man: { - keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ], - char: '\ud83d\udc77', - fitzpatrick_scale: true, - category: "people" - }, - guardswoman: { - keywords: [ "uk", "gb", "british", "female", "royal", "woman" ], - char: '\ud83d\udc82\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - guardsman: { - keywords: [ "uk", "gb", "british", "male", "guy", "royal" ], - char: '\ud83d\udc82', - fitzpatrick_scale: true, - category: "people" - }, - female_detective: { - keywords: [ "human", "spy", "detective", "female", "woman" ], - char: '\ud83d\udd75\ufe0f\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - male_detective: { - keywords: [ "human", "spy", "detective" ], - char: '\ud83d\udd75', - fitzpatrick_scale: true, - category: "people" - }, - woman_health_worker: { - keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ], - char: '\ud83d\udc69\u200d\u2695\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - man_health_worker: { - keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ], - char: '\ud83d\udc68\u200d\u2695\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - woman_farmer: { - keywords: [ "rancher", "gardener", "woman", "human" ], - char: '\ud83d\udc69\u200d\ud83c\udf3e', - fitzpatrick_scale: true, - category: "people" - }, - man_farmer: { - keywords: [ "rancher", "gardener", "man", "human" ], - char: '\ud83d\udc68\u200d\ud83c\udf3e', - fitzpatrick_scale: true, - category: "people" - }, - woman_cook: { - keywords: [ "chef", "woman", "human" ], - char: '\ud83d\udc69\u200d\ud83c\udf73', - fitzpatrick_scale: true, - category: "people" - }, - man_cook: { - keywords: [ "chef", "man", "human" ], - char: '\ud83d\udc68\u200d\ud83c\udf73', - fitzpatrick_scale: true, - category: "people" - }, - woman_student: { - keywords: [ "graduate", "woman", "human" ], - char: '\ud83d\udc69\u200d\ud83c\udf93', - fitzpatrick_scale: true, - category: "people" - }, - man_student: { - keywords: [ "graduate", "man", "human" ], - char: '\ud83d\udc68\u200d\ud83c\udf93', - fitzpatrick_scale: true, - category: "people" - }, - woman_singer: { - keywords: [ "rockstar", "entertainer", "woman", "human" ], - char: '\ud83d\udc69\u200d\ud83c\udfa4', - fitzpatrick_scale: true, - category: "people" - }, - man_singer: { - keywords: [ "rockstar", "entertainer", "man", "human" ], - char: '\ud83d\udc68\u200d\ud83c\udfa4', - fitzpatrick_scale: true, - category: "people" - }, - woman_teacher: { - keywords: [ "instructor", "professor", "woman", "human" ], - char: '\ud83d\udc69\u200d\ud83c\udfeb', - fitzpatrick_scale: true, - category: "people" - }, - man_teacher: { - keywords: [ "instructor", "professor", "man", "human" ], - char: '\ud83d\udc68\u200d\ud83c\udfeb', - fitzpatrick_scale: true, - category: "people" - }, - woman_factory_worker: { - keywords: [ "assembly", "industrial", "woman", "human" ], - char: '\ud83d\udc69\u200d\ud83c\udfed', - fitzpatrick_scale: true, - category: "people" - }, - man_factory_worker: { - keywords: [ "assembly", "industrial", "man", "human" ], - char: '\ud83d\udc68\u200d\ud83c\udfed', - fitzpatrick_scale: true, - category: "people" - }, - woman_technologist: { - keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ], - char: '\ud83d\udc69\u200d\ud83d\udcbb', - fitzpatrick_scale: true, - category: "people" - }, - man_technologist: { - keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ], - char: '\ud83d\udc68\u200d\ud83d\udcbb', - fitzpatrick_scale: true, - category: "people" - }, - woman_office_worker: { - keywords: [ "business", "manager", "woman", "human" ], - char: '\ud83d\udc69\u200d\ud83d\udcbc', - fitzpatrick_scale: true, - category: "people" - }, - man_office_worker: { - keywords: [ "business", "manager", "man", "human" ], - char: '\ud83d\udc68\u200d\ud83d\udcbc', - fitzpatrick_scale: true, - category: "people" - }, - woman_mechanic: { - keywords: [ "plumber", "woman", "human", "wrench" ], - char: '\ud83d\udc69\u200d\ud83d\udd27', - fitzpatrick_scale: true, - category: "people" - }, - man_mechanic: { - keywords: [ "plumber", "man", "human", "wrench" ], - char: '\ud83d\udc68\u200d\ud83d\udd27', - fitzpatrick_scale: true, - category: "people" - }, - woman_scientist: { - keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ], - char: '\ud83d\udc69\u200d\ud83d\udd2c', - fitzpatrick_scale: true, - category: "people" - }, - man_scientist: { - keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ], - char: '\ud83d\udc68\u200d\ud83d\udd2c', - fitzpatrick_scale: true, - category: "people" - }, - woman_artist: { - keywords: [ "painter", "woman", "human" ], - char: '\ud83d\udc69\u200d\ud83c\udfa8', - fitzpatrick_scale: true, - category: "people" - }, - man_artist: { - keywords: [ "painter", "man", "human" ], - char: '\ud83d\udc68\u200d\ud83c\udfa8', - fitzpatrick_scale: true, - category: "people" - }, - woman_firefighter: { - keywords: [ "fireman", "woman", "human" ], - char: '\ud83d\udc69\u200d\ud83d\ude92', - fitzpatrick_scale: true, - category: "people" - }, - man_firefighter: { - keywords: [ "fireman", "man", "human" ], - char: '\ud83d\udc68\u200d\ud83d\ude92', - fitzpatrick_scale: true, - category: "people" - }, - woman_pilot: { - keywords: [ "aviator", "plane", "woman", "human" ], - char: '\ud83d\udc69\u200d\u2708\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - man_pilot: { - keywords: [ "aviator", "plane", "man", "human" ], - char: '\ud83d\udc68\u200d\u2708\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - woman_astronaut: { - keywords: [ "space", "rocket", "woman", "human" ], - char: '\ud83d\udc69\u200d\ud83d\ude80', - fitzpatrick_scale: true, - category: "people" - }, - man_astronaut: { - keywords: [ "space", "rocket", "man", "human" ], - char: '\ud83d\udc68\u200d\ud83d\ude80', - fitzpatrick_scale: true, - category: "people" - }, - woman_judge: { - keywords: [ "justice", "court", "woman", "human" ], - char: '\ud83d\udc69\u200d\u2696\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - man_judge: { - keywords: [ "justice", "court", "man", "human" ], - char: '\ud83d\udc68\u200d\u2696\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - woman_superhero: { - keywords: [ "woman", "female", "good", "heroine", "superpowers" ], - char: '\ud83e\uddb8\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - man_superhero: { - keywords: [ "man", "male", "good", "hero", "superpowers" ], - char: '\ud83e\uddb8\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - woman_supervillain: { - keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ], - char: '\ud83e\uddb9\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - man_supervillain: { - keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ], - char: '\ud83e\uddb9\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - mrs_claus: { - keywords: [ "woman", "female", "xmas", "mother christmas" ], - char: '\ud83e\udd36', - fitzpatrick_scale: true, - category: "people" - }, - santa: { - keywords: [ "festival", "man", "male", "xmas", "father christmas" ], - char: '\ud83c\udf85', - fitzpatrick_scale: true, - category: "people" - }, - sorceress: { - keywords: [ "woman", "female", "mage", "witch" ], - char: '\ud83e\uddd9\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - wizard: { - keywords: [ "man", "male", "mage", "sorcerer" ], - char: '\ud83e\uddd9\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - woman_elf: { - keywords: [ "woman", "female" ], - char: '\ud83e\udddd\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - man_elf: { - keywords: [ "man", "male" ], - char: '\ud83e\udddd\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - woman_vampire: { - keywords: [ "woman", "female" ], - char: '\ud83e\udddb\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - man_vampire: { - keywords: [ "man", "male", "dracula" ], - char: '\ud83e\udddb\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - woman_zombie: { - keywords: [ "woman", "female", "undead", "walking dead" ], - char: '\ud83e\udddf\u200d\u2640\ufe0f', - fitzpatrick_scale: false, - category: "people" - }, - man_zombie: { - keywords: [ "man", "male", "dracula", "undead", "walking dead" ], - char: '\ud83e\udddf\u200d\u2642\ufe0f', - fitzpatrick_scale: false, - category: "people" - }, - woman_genie: { - keywords: [ "woman", "female" ], - char: '\ud83e\uddde\u200d\u2640\ufe0f', - fitzpatrick_scale: false, - category: "people" - }, - man_genie: { - keywords: [ "man", "male" ], - char: '\ud83e\uddde\u200d\u2642\ufe0f', - fitzpatrick_scale: false, - category: "people" - }, - mermaid: { - keywords: [ "woman", "female", "merwoman", "ariel" ], - char: '\ud83e\udddc\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - merman: { - keywords: [ "man", "male", "triton" ], - char: '\ud83e\udddc\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - woman_fairy: { - keywords: [ "woman", "female" ], - char: '\ud83e\uddda\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - man_fairy: { - keywords: [ "man", "male" ], - char: '\ud83e\uddda\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - angel: { - keywords: [ "heaven", "wings", "halo" ], - char: '\ud83d\udc7c', - fitzpatrick_scale: true, - category: "people" - }, - pregnant_woman: { - keywords: [ "baby" ], - char: '\ud83e\udd30', - fitzpatrick_scale: true, - category: "people" - }, - breastfeeding: { - keywords: [ "nursing", "baby" ], - char: '\ud83e\udd31', - fitzpatrick_scale: true, - category: "people" - }, - princess: { - keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ], - char: '\ud83d\udc78', - fitzpatrick_scale: true, - category: "people" - }, - prince: { - keywords: [ "boy", "man", "male", "crown", "royal", "king" ], - char: '\ud83e\udd34', - fitzpatrick_scale: true, - category: "people" - }, - bride_with_veil: { - keywords: [ "couple", "marriage", "wedding", "woman", "bride" ], - char: '\ud83d\udc70', - fitzpatrick_scale: true, - category: "people" - }, - man_in_tuxedo: { - keywords: [ "couple", "marriage", "wedding", "groom" ], - char: '\ud83e\udd35', - fitzpatrick_scale: true, - category: "people" - }, - running_woman: { - keywords: [ "woman", "walking", "exercise", "race", "running", "female" ], - char: '\ud83c\udfc3\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - running_man: { - keywords: [ "man", "walking", "exercise", "race", "running" ], - char: '\ud83c\udfc3', - fitzpatrick_scale: true, - category: "people" - }, - walking_woman: { - keywords: [ "human", "feet", "steps", "woman", "female" ], - char: '\ud83d\udeb6\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - walking_man: { - keywords: [ "human", "feet", "steps" ], - char: '\ud83d\udeb6', - fitzpatrick_scale: true, - category: "people" - }, - dancer: { - keywords: [ "female", "girl", "woman", "fun" ], - char: '\ud83d\udc83', - fitzpatrick_scale: true, - category: "people" - }, - man_dancing: { - keywords: [ "male", "boy", "fun", "dancer" ], - char: '\ud83d\udd7a', - fitzpatrick_scale: true, - category: "people" - }, - dancing_women: { - keywords: [ "female", "bunny", "women", "girls" ], - char: '\ud83d\udc6f', - fitzpatrick_scale: false, - category: "people" - }, - dancing_men: { - keywords: [ "male", "bunny", "men", "boys" ], - char: '\ud83d\udc6f\u200d\u2642\ufe0f', - fitzpatrick_scale: false, - category: "people" - }, - couple: { - keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ], - char: '\ud83d\udc6b', - fitzpatrick_scale: false, - category: "people" - }, - two_men_holding_hands: { - keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ], - char: '\ud83d\udc6c', - fitzpatrick_scale: false, - category: "people" - }, - two_women_holding_hands: { - keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ], - char: '\ud83d\udc6d', - fitzpatrick_scale: false, - category: "people" - }, - bowing_woman: { - keywords: [ "woman", "female", "girl" ], - char: '\ud83d\ude47\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - bowing_man: { - keywords: [ "man", "male", "boy" ], - char: '\ud83d\ude47', - fitzpatrick_scale: true, - category: "people" - }, - man_facepalming: { - keywords: [ "man", "male", "boy", "disbelief" ], - char: '\ud83e\udd26\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - woman_facepalming: { - keywords: [ "woman", "female", "girl", "disbelief" ], - char: '\ud83e\udd26\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - woman_shrugging: { - keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ], - char: '\ud83e\udd37', - fitzpatrick_scale: true, - category: "people" - }, - man_shrugging: { - keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ], - char: '\ud83e\udd37\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - tipping_hand_woman: { - keywords: [ "female", "girl", "woman", "human", "information" ], - char: '\ud83d\udc81', - fitzpatrick_scale: true, - category: "people" - }, - tipping_hand_man: { - keywords: [ "male", "boy", "man", "human", "information" ], - char: '\ud83d\udc81\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - no_good_woman: { - keywords: [ "female", "girl", "woman", "nope" ], - char: '\ud83d\ude45', - fitzpatrick_scale: true, - category: "people" - }, - no_good_man: { - keywords: [ "male", "boy", "man", "nope" ], - char: '\ud83d\ude45\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - ok_woman: { - keywords: [ "women", "girl", "female", "pink", "human", "woman" ], - char: '\ud83d\ude46', - fitzpatrick_scale: true, - category: "people" - }, - ok_man: { - keywords: [ "men", "boy", "male", "blue", "human", "man" ], - char: '\ud83d\ude46\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - raising_hand_woman: { - keywords: [ "female", "girl", "woman" ], - char: '\ud83d\ude4b', - fitzpatrick_scale: true, - category: "people" - }, - raising_hand_man: { - keywords: [ "male", "boy", "man" ], - char: '\ud83d\ude4b\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - pouting_woman: { - keywords: [ "female", "girl", "woman" ], - char: '\ud83d\ude4e', - fitzpatrick_scale: true, - category: "people" - }, - pouting_man: { - keywords: [ "male", "boy", "man" ], - char: '\ud83d\ude4e\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - frowning_woman: { - keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ], - char: '\ud83d\ude4d', - fitzpatrick_scale: true, - category: "people" - }, - frowning_man: { - keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ], - char: '\ud83d\ude4d\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - haircut_woman: { - keywords: [ "female", "girl", "woman" ], - char: '\ud83d\udc87', - fitzpatrick_scale: true, - category: "people" - }, - haircut_man: { - keywords: [ "male", "boy", "man" ], - char: '\ud83d\udc87\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - massage_woman: { - keywords: [ "female", "girl", "woman", "head" ], - char: '\ud83d\udc86', - fitzpatrick_scale: true, - category: "people" - }, - massage_man: { - keywords: [ "male", "boy", "man", "head" ], - char: '\ud83d\udc86\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - woman_in_steamy_room: { - keywords: [ "female", "woman", "spa", "steamroom", "sauna" ], - char: '\ud83e\uddd6\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - man_in_steamy_room: { - keywords: [ "male", "man", "spa", "steamroom", "sauna" ], - char: '\ud83e\uddd6\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "people" - }, - couple_with_heart_woman_man: { - keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], - char: '\ud83d\udc91', - fitzpatrick_scale: false, - category: "people" - }, - couple_with_heart_woman_woman: { - keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], - char: '\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69', - fitzpatrick_scale: false, - category: "people" - }, - couple_with_heart_man_man: { - keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], - char: '\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68', - fitzpatrick_scale: false, - category: "people" - }, - couplekiss_man_woman: { - keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], - char: '\ud83d\udc8f', - fitzpatrick_scale: false, - category: "people" - }, - couplekiss_woman_woman: { - keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], - char: '\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69', - fitzpatrick_scale: false, - category: "people" - }, - couplekiss_man_man: { - keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], - char: '\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68', - fitzpatrick_scale: false, - category: "people" - }, - family_man_woman_boy: { - keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ], - char: '\ud83d\udc6a', - fitzpatrick_scale: false, - category: "people" - }, - family_man_woman_girl: { - keywords: [ "home", "parents", "people", "human", "child" ], - char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67', - fitzpatrick_scale: false, - category: "people" - }, - family_man_woman_girl_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_man_woman_boy_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_man_woman_girl_girl: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', - fitzpatrick_scale: false, - category: "people" - }, - family_woman_woman_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_woman_woman_girl: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67', - fitzpatrick_scale: false, - category: "people" - }, - family_woman_woman_girl_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_woman_woman_boy_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_woman_woman_girl_girl: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', - fitzpatrick_scale: false, - category: "people" - }, - family_man_man_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_man_man_girl: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67', - fitzpatrick_scale: false, - category: "people" - }, - family_man_man_girl_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_man_man_boy_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_man_man_girl_girl: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67', - fitzpatrick_scale: false, - category: "people" - }, - family_woman_boy: { - keywords: [ "home", "parent", "people", "human", "child" ], - char: '\ud83d\udc69\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_woman_girl: { - keywords: [ "home", "parent", "people", "human", "child" ], - char: '\ud83d\udc69\u200d\ud83d\udc67', - fitzpatrick_scale: false, - category: "people" - }, - family_woman_girl_boy: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: '\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_woman_boy_boy: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: '\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_woman_girl_girl: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: '\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', - fitzpatrick_scale: false, - category: "people" - }, - family_man_boy: { - keywords: [ "home", "parent", "people", "human", "child" ], - char: '\ud83d\udc68\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_man_girl: { - keywords: [ "home", "parent", "people", "human", "child" ], - char: '\ud83d\udc68\u200d\ud83d\udc67', - fitzpatrick_scale: false, - category: "people" - }, - family_man_girl_boy: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: '\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_man_boy_boy: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: '\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66', - fitzpatrick_scale: false, - category: "people" - }, - family_man_girl_girl: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: '\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67', - fitzpatrick_scale: false, - category: "people" - }, - yarn: { - keywords: [ "ball", "crochet", "knit" ], - char: '\ud83e\uddf6', - fitzpatrick_scale: false, - category: "people" - }, - thread: { - keywords: [ "needle", "sewing", "spool", "string" ], - char: '\ud83e\uddf5', - fitzpatrick_scale: false, - category: "people" - }, - coat: { - keywords: [ "jacket" ], - char: '\ud83e\udde5', - fitzpatrick_scale: false, - category: "people" - }, - labcoat: { - keywords: [ "doctor", "experiment", "scientist", "chemist" ], - char: '\ud83e\udd7c', - fitzpatrick_scale: false, - category: "people" - }, - womans_clothes: { - keywords: [ "fashion", "shopping_bags", "female" ], - char: '\ud83d\udc5a', - fitzpatrick_scale: false, - category: "people" - }, - tshirt: { - keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ], - char: '\ud83d\udc55', - fitzpatrick_scale: false, - category: "people" - }, - jeans: { - keywords: [ "fashion", "shopping" ], - char: '\ud83d\udc56', - fitzpatrick_scale: false, - category: "people" - }, - necktie: { - keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ], - char: '\ud83d\udc54', - fitzpatrick_scale: false, - category: "people" - }, - dress: { - keywords: [ "clothes", "fashion", "shopping" ], - char: '\ud83d\udc57', - fitzpatrick_scale: false, - category: "people" - }, - bikini: { - keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ], - char: '\ud83d\udc59', - fitzpatrick_scale: false, - category: "people" - }, - kimono: { - keywords: [ "dress", "fashion", "women", "female", "japanese" ], - char: '\ud83d\udc58', - fitzpatrick_scale: false, - category: "people" - }, - lipstick: { - keywords: [ "female", "girl", "fashion", "woman" ], - char: '\ud83d\udc84', - fitzpatrick_scale: false, - category: "people" - }, - kiss: { - keywords: [ "face", "lips", "love", "like", "affection", "valentines" ], - char: '\ud83d\udc8b', - fitzpatrick_scale: false, - category: "people" - }, - footprints: { - keywords: [ "feet", "tracking", "walking", "beach" ], - char: '\ud83d\udc63', - fitzpatrick_scale: false, - category: "people" - }, - flat_shoe: { - keywords: [ "ballet", "slip-on", "slipper" ], - char: '\ud83e\udd7f', - fitzpatrick_scale: false, - category: "people" - }, - high_heel: { - keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ], - char: '\ud83d\udc60', - fitzpatrick_scale: false, - category: "people" - }, - sandal: { - keywords: [ "shoes", "fashion", "flip flops" ], - char: '\ud83d\udc61', - fitzpatrick_scale: false, - category: "people" - }, - boot: { - keywords: [ "shoes", "fashion" ], - char: '\ud83d\udc62', - fitzpatrick_scale: false, - category: "people" - }, - mans_shoe: { - keywords: [ "fashion", "male" ], - char: '\ud83d\udc5e', - fitzpatrick_scale: false, - category: "people" - }, - athletic_shoe: { - keywords: [ "shoes", "sports", "sneakers" ], - char: '\ud83d\udc5f', - fitzpatrick_scale: false, - category: "people" - }, - hiking_boot: { - keywords: [ "backpacking", "camping", "hiking" ], - char: '\ud83e\udd7e', - fitzpatrick_scale: false, - category: "people" - }, - socks: { - keywords: [ "stockings", "clothes" ], - char: '\ud83e\udde6', - fitzpatrick_scale: false, - category: "people" - }, - gloves: { - keywords: [ "hands", "winter", "clothes" ], - char: '\ud83e\udde4', - fitzpatrick_scale: false, - category: "people" - }, - scarf: { - keywords: [ "neck", "winter", "clothes" ], - char: '\ud83e\udde3', - fitzpatrick_scale: false, - category: "people" - }, - womans_hat: { - keywords: [ "fashion", "accessories", "female", "lady", "spring" ], - char: '\ud83d\udc52', - fitzpatrick_scale: false, - category: "people" - }, - tophat: { - keywords: [ "magic", "gentleman", "classy", "circus" ], - char: '\ud83c\udfa9', - fitzpatrick_scale: false, - category: "people" - }, - billed_hat: { - keywords: [ "cap", "baseball" ], - char: '\ud83e\udde2', - fitzpatrick_scale: false, - category: "people" - }, - rescue_worker_helmet: { - keywords: [ "construction", "build" ], - char: '\u26d1', - fitzpatrick_scale: false, - category: "people" - }, - mortar_board: { - keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ], - char: '\ud83c\udf93', - fitzpatrick_scale: false, - category: "people" - }, - crown: { - keywords: [ "king", "kod", "leader", "royalty", "lord" ], - char: '\ud83d\udc51', - fitzpatrick_scale: false, - category: "people" - }, - school_satchel: { - keywords: [ "student", "education", "bag", "backpack" ], - char: '\ud83c\udf92', - fitzpatrick_scale: false, - category: "people" - }, - luggage: { - keywords: [ "packing", "travel" ], - char: '\ud83e\uddf3', - fitzpatrick_scale: false, - category: "people" - }, - pouch: { - keywords: [ "bag", "accessories", "shopping" ], - char: '\ud83d\udc5d', - fitzpatrick_scale: false, - category: "people" - }, - purse: { - keywords: [ "fashion", "accessories", "money", "sales", "shopping" ], - char: '\ud83d\udc5b', - fitzpatrick_scale: false, - category: "people" - }, - handbag: { - keywords: [ "fashion", "accessory", "accessories", "shopping" ], - char: '\ud83d\udc5c', - fitzpatrick_scale: false, - category: "people" - }, - briefcase: { - keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ], - char: '\ud83d\udcbc', - fitzpatrick_scale: false, - category: "people" - }, - eyeglasses: { - keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ], - char: '\ud83d\udc53', - fitzpatrick_scale: false, - category: "people" - }, - dark_sunglasses: { - keywords: [ "face", "cool", "accessories" ], - char: '\ud83d\udd76', - fitzpatrick_scale: false, - category: "people" - }, - goggles: { - keywords: [ "eyes", "protection", "safety" ], - char: '\ud83e\udd7d', - fitzpatrick_scale: false, - category: "people" - }, - ring: { - keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ], - char: '\ud83d\udc8d', - fitzpatrick_scale: false, - category: "people" - }, - closed_umbrella: { - keywords: [ "weather", "rain", "drizzle" ], - char: '\ud83c\udf02', - fitzpatrick_scale: false, - category: "people" - }, - dog: { - keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ], - char: '\ud83d\udc36', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cat: { - keywords: [ "animal", "meow", "nature", "pet", "kitten" ], - char: '\ud83d\udc31', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - mouse: { - keywords: [ "animal", "nature", "cheese_wedge", "rodent" ], - char: '\ud83d\udc2d', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hamster: { - keywords: [ "animal", "nature" ], - char: '\ud83d\udc39', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rabbit: { - keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ], - char: '\ud83d\udc30', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - fox_face: { - keywords: [ "animal", "nature", "face" ], - char: '\ud83e\udd8a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bear: { - keywords: [ "animal", "nature", "wild" ], - char: '\ud83d\udc3b', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - panda_face: { - keywords: [ "animal", "nature", "panda" ], - char: '\ud83d\udc3c', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - koala: { - keywords: [ "animal", "nature" ], - char: '\ud83d\udc28', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tiger: { - keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ], - char: '\ud83d\udc2f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - lion: { - keywords: [ "animal", "nature" ], - char: '\ud83e\udd81', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cow: { - keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], - char: '\ud83d\udc2e', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - pig: { - keywords: [ "animal", "oink", "nature" ], - char: '\ud83d\udc37', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - pig_nose: { - keywords: [ "animal", "oink" ], - char: '\ud83d\udc3d', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - frog: { - keywords: [ "animal", "nature", "croak", "toad" ], - char: '\ud83d\udc38', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - squid: { - keywords: [ "animal", "nature", "ocean", "sea" ], - char: '\ud83e\udd91', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - octopus: { - keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ], - char: '\ud83d\udc19', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - shrimp: { - keywords: [ "animal", "ocean", "nature", "seafood" ], - char: '\ud83e\udd90', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - monkey_face: { - keywords: [ "animal", "nature", "circus" ], - char: '\ud83d\udc35', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - gorilla: { - keywords: [ "animal", "nature", "circus" ], - char: '\ud83e\udd8d', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - see_no_evil: { - keywords: [ "monkey", "animal", "nature", "haha" ], - char: '\ud83d\ude48', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hear_no_evil: { - keywords: [ "animal", "monkey", "nature" ], - char: '\ud83d\ude49', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - speak_no_evil: { - keywords: [ "monkey", "animal", "nature", "omg" ], - char: '\ud83d\ude4a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - monkey: { - keywords: [ "animal", "nature", "banana", "circus" ], - char: '\ud83d\udc12', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - chicken: { - keywords: [ "animal", "cluck", "nature", "bird" ], - char: '\ud83d\udc14', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - penguin: { - keywords: [ "animal", "nature" ], - char: '\ud83d\udc27', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bird: { - keywords: [ "animal", "nature", "fly", "tweet", "spring" ], - char: '\ud83d\udc26', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - baby_chick: { - keywords: [ "animal", "chicken", "bird" ], - char: '\ud83d\udc24', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hatching_chick: { - keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ], - char: '\ud83d\udc23', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hatched_chick: { - keywords: [ "animal", "chicken", "baby", "bird" ], - char: '\ud83d\udc25', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - duck: { - keywords: [ "animal", "nature", "bird", "mallard" ], - char: '\ud83e\udd86', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - eagle: { - keywords: [ "animal", "nature", "bird" ], - char: '\ud83e\udd85', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - owl: { - keywords: [ "animal", "nature", "bird", "hoot" ], - char: '\ud83e\udd89', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bat: { - keywords: [ "animal", "nature", "blind", "vampire" ], - char: '\ud83e\udd87', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - wolf: { - keywords: [ "animal", "nature", "wild" ], - char: '\ud83d\udc3a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - boar: { - keywords: [ "animal", "nature" ], - char: '\ud83d\udc17', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - horse: { - keywords: [ "animal", "brown", "nature" ], - char: '\ud83d\udc34', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - unicorn: { - keywords: [ "animal", "nature", "mystical" ], - char: '\ud83e\udd84', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - honeybee: { - keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ], - char: '\ud83d\udc1d', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bug: { - keywords: [ "animal", "insect", "nature", "worm" ], - char: '\ud83d\udc1b', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - butterfly: { - keywords: [ "animal", "insect", "nature", "caterpillar" ], - char: '\ud83e\udd8b', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - snail: { - keywords: [ "slow", "animal", "shell" ], - char: '\ud83d\udc0c', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - beetle: { - keywords: [ "animal", "insect", "nature", "ladybug" ], - char: '\ud83d\udc1e', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - ant: { - keywords: [ "animal", "insect", "nature", "bug" ], - char: '\ud83d\udc1c', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - grasshopper: { - keywords: [ "animal", "cricket", "chirp" ], - char: '\ud83e\udd97', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - spider: { - keywords: [ "animal", "arachnid" ], - char: '\ud83d\udd77', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - scorpion: { - keywords: [ "animal", "arachnid" ], - char: '\ud83e\udd82', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - crab: { - keywords: [ "animal", "crustacean" ], - char: '\ud83e\udd80', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - snake: { - keywords: [ "animal", "evil", "nature", "hiss", "python" ], - char: '\ud83d\udc0d', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - lizard: { - keywords: [ "animal", "nature", "reptile" ], - char: '\ud83e\udd8e', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - "t-rex": { - keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ], - char: '\ud83e\udd96', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sauropod: { - keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ], - char: '\ud83e\udd95', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - turtle: { - keywords: [ "animal", "slow", "nature", "tortoise" ], - char: '\ud83d\udc22', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tropical_fish: { - keywords: [ "animal", "swim", "ocean", "beach", "nemo" ], - char: '\ud83d\udc20', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - fish: { - keywords: [ "animal", "food", "nature" ], - char: '\ud83d\udc1f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - blowfish: { - keywords: [ "animal", "nature", "food", "sea", "ocean" ], - char: '\ud83d\udc21', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dolphin: { - keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ], - char: '\ud83d\udc2c', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - shark: { - keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ], - char: '\ud83e\udd88', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - whale: { - keywords: [ "animal", "nature", "sea", "ocean" ], - char: '\ud83d\udc33', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - whale2: { - keywords: [ "animal", "nature", "sea", "ocean" ], - char: '\ud83d\udc0b', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - crocodile: { - keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ], - char: '\ud83d\udc0a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - leopard: { - keywords: [ "animal", "nature" ], - char: '\ud83d\udc06', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - zebra: { - keywords: [ "animal", "nature", "stripes", "safari" ], - char: '\ud83e\udd93', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tiger2: { - keywords: [ "animal", "nature", "roar" ], - char: '\ud83d\udc05', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - water_buffalo: { - keywords: [ "animal", "nature", "ox", "cow" ], - char: '\ud83d\udc03', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - ox: { - keywords: [ "animal", "cow", "beef" ], - char: '\ud83d\udc02', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cow2: { - keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], - char: '\ud83d\udc04', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - deer: { - keywords: [ "animal", "nature", "horns", "venison" ], - char: '\ud83e\udd8c', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dromedary_camel: { - keywords: [ "animal", "hot", "desert", "hump" ], - char: '\ud83d\udc2a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - camel: { - keywords: [ "animal", "nature", "hot", "desert", "hump" ], - char: '\ud83d\udc2b', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - giraffe: { - keywords: [ "animal", "nature", "spots", "safari" ], - char: '\ud83e\udd92', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - elephant: { - keywords: [ "animal", "nature", "nose", "th", "circus" ], - char: '\ud83d\udc18', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rhinoceros: { - keywords: [ "animal", "nature", "horn" ], - char: '\ud83e\udd8f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - goat: { - keywords: [ "animal", "nature" ], - char: '\ud83d\udc10', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - ram: { - keywords: [ "animal", "sheep", "nature" ], - char: '\ud83d\udc0f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sheep: { - keywords: [ "animal", "nature", "wool", "shipit" ], - char: '\ud83d\udc11', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - racehorse: { - keywords: [ "animal", "gamble", "luck" ], - char: '\ud83d\udc0e', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - pig2: { - keywords: [ "animal", "nature" ], - char: '\ud83d\udc16', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rat: { - keywords: [ "animal", "mouse", "rodent" ], - char: '\ud83d\udc00', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - mouse2: { - keywords: [ "animal", "nature", "rodent" ], - char: '\ud83d\udc01', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rooster: { - keywords: [ "animal", "nature", "chicken" ], - char: '\ud83d\udc13', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - turkey: { - keywords: [ "animal", "bird" ], - char: '\ud83e\udd83', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dove: { - keywords: [ "animal", "bird" ], - char: '\ud83d\udd4a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dog2: { - keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ], - char: '\ud83d\udc15', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - poodle: { - keywords: [ "dog", "animal", "101", "nature", "pet" ], - char: '\ud83d\udc29', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cat2: { - keywords: [ "animal", "meow", "pet", "cats" ], - char: '\ud83d\udc08', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rabbit2: { - keywords: [ "animal", "nature", "pet", "magic", "spring" ], - char: '\ud83d\udc07', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - chipmunk: { - keywords: [ "animal", "nature", "rodent", "squirrel" ], - char: '\ud83d\udc3f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hedgehog: { - keywords: [ "animal", "nature", "spiny" ], - char: '\ud83e\udd94', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - raccoon: { - keywords: [ "animal", "nature" ], - char: '\ud83e\udd9d', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - llama: { - keywords: [ "animal", "nature", "alpaca" ], - char: '\ud83e\udd99', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hippopotamus: { - keywords: [ "animal", "nature" ], - char: '\ud83e\udd9b', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - kangaroo: { - keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ], - char: '\ud83e\udd98', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - badger: { - keywords: [ "animal", "nature", "honey" ], - char: '\ud83e\udda1', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - swan: { - keywords: [ "animal", "nature", "bird" ], - char: '\ud83e\udda2', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - peacock: { - keywords: [ "animal", "nature", "peahen", "bird" ], - char: '\ud83e\udd9a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - parrot: { - keywords: [ "animal", "nature", "bird", "pirate", "talk" ], - char: '\ud83e\udd9c', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - lobster: { - keywords: [ "animal", "nature", "bisque", "claws", "seafood" ], - char: '\ud83e\udd9e', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - mosquito: { - keywords: [ "animal", "nature", "insect", "malaria" ], - char: '\ud83e\udd9f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - paw_prints: { - keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ], - char: '\ud83d\udc3e', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dragon: { - keywords: [ "animal", "myth", "nature", "chinese", "green" ], - char: '\ud83d\udc09', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dragon_face: { - keywords: [ "animal", "myth", "nature", "chinese", "green" ], - char: '\ud83d\udc32', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cactus: { - keywords: [ "vegetable", "plant", "nature" ], - char: '\ud83c\udf35', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - christmas_tree: { - keywords: [ "festival", "vacation", "december", "xmas", "celebration" ], - char: '\ud83c\udf84', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - evergreen_tree: { - keywords: [ "plant", "nature" ], - char: '\ud83c\udf32', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - deciduous_tree: { - keywords: [ "plant", "nature" ], - char: '\ud83c\udf33', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - palm_tree: { - keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ], - char: '\ud83c\udf34', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - seedling: { - keywords: [ "plant", "nature", "grass", "lawn", "spring" ], - char: '\ud83c\udf31', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - herb: { - keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ], - char: '\ud83c\udf3f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - shamrock: { - keywords: [ "vegetable", "plant", "nature", "irish", "clover" ], - char: '\u2618', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - four_leaf_clover: { - keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ], - char: '\ud83c\udf40', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bamboo: { - keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ], - char: '\ud83c\udf8d', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tanabata_tree: { - keywords: [ "plant", "nature", "branch", "summer" ], - char: '\ud83c\udf8b', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - leaves: { - keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ], - char: '\ud83c\udf43', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - fallen_leaf: { - keywords: [ "nature", "plant", "vegetable", "leaves" ], - char: '\ud83c\udf42', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - maple_leaf: { - keywords: [ "nature", "plant", "vegetable", "ca", "fall" ], - char: '\ud83c\udf41', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - ear_of_rice: { - keywords: [ "nature", "plant" ], - char: '\ud83c\udf3e', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hibiscus: { - keywords: [ "plant", "vegetable", "flowers", "beach" ], - char: '\ud83c\udf3a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sunflower: { - keywords: [ "nature", "plant", "fall" ], - char: '\ud83c\udf3b', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rose: { - keywords: [ "flowers", "valentines", "love", "spring" ], - char: '\ud83c\udf39', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - wilted_flower: { - keywords: [ "plant", "nature", "flower" ], - char: '\ud83e\udd40', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tulip: { - keywords: [ "flowers", "plant", "nature", "summer", "spring" ], - char: '\ud83c\udf37', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - blossom: { - keywords: [ "nature", "flowers", "yellow" ], - char: '\ud83c\udf3c', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cherry_blossom: { - keywords: [ "nature", "plant", "spring", "flower" ], - char: '\ud83c\udf38', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bouquet: { - keywords: [ "flowers", "nature", "spring" ], - char: '\ud83d\udc90', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - mushroom: { - keywords: [ "plant", "vegetable" ], - char: '\ud83c\udf44', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - chestnut: { - keywords: [ "food", "squirrel" ], - char: '\ud83c\udf30', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - jack_o_lantern: { - keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ], - char: '\ud83c\udf83', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - shell: { - keywords: [ "nature", "sea", "beach" ], - char: '\ud83d\udc1a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - spider_web: { - keywords: [ "animal", "insect", "arachnid", "silk" ], - char: '\ud83d\udd78', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - earth_americas: { - keywords: [ "globe", "world", "USA", "international" ], - char: '\ud83c\udf0e', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - earth_africa: { - keywords: [ "globe", "world", "international" ], - char: '\ud83c\udf0d', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - earth_asia: { - keywords: [ "globe", "world", "east", "international" ], - char: '\ud83c\udf0f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - full_moon: { - keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: '\ud83c\udf15', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - waning_gibbous_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ], - char: '\ud83c\udf16', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - last_quarter_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: '\ud83c\udf17', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - waning_crescent_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: '\ud83c\udf18', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - new_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: '\ud83c\udf11', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - waxing_crescent_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: '\ud83c\udf12', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - first_quarter_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: '\ud83c\udf13', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - waxing_gibbous_moon: { - keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ], - char: '\ud83c\udf14', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - new_moon_with_face: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: '\ud83c\udf1a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - full_moon_with_face: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: '\ud83c\udf1d', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - first_quarter_moon_with_face: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: '\ud83c\udf1b', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - last_quarter_moon_with_face: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: '\ud83c\udf1c', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sun_with_face: { - keywords: [ "nature", "morning", "sky" ], - char: '\ud83c\udf1e', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - crescent_moon: { - keywords: [ "night", "sleep", "sky", "evening", "magic" ], - char: '\ud83c\udf19', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - star: { - keywords: [ "night", "yellow" ], - char: '\u2b50', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - star2: { - keywords: [ "night", "sparkle", "awesome", "good", "magic" ], - char: '\ud83c\udf1f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dizzy: { - keywords: [ "star", "sparkle", "shoot", "magic" ], - char: '\ud83d\udcab', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sparkles: { - keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ], - char: '\u2728', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - comet: { - keywords: [ "space" ], - char: '\u2604', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sunny: { - keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ], - char: '\u2600\ufe0f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sun_behind_small_cloud: { - keywords: [ "weather" ], - char: '\ud83c\udf24', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - partly_sunny: { - keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ], - char: '\u26c5', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sun_behind_large_cloud: { - keywords: [ "weather" ], - char: '\ud83c\udf25', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sun_behind_rain_cloud: { - keywords: [ "weather" ], - char: '\ud83c\udf26', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cloud: { - keywords: [ "weather", "sky" ], - char: '\u2601\ufe0f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cloud_with_rain: { - keywords: [ "weather" ], - char: '\ud83c\udf27', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cloud_with_lightning_and_rain: { - keywords: [ "weather", "lightning" ], - char: '\u26c8', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cloud_with_lightning: { - keywords: [ "weather", "thunder" ], - char: '\ud83c\udf29', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - zap: { - keywords: [ "thunder", "weather", "lightning bolt", "fast" ], - char: '\u26a1', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - fire: { - keywords: [ "hot", "cook", "flame" ], - char: '\ud83d\udd25', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - boom: { - keywords: [ "bomb", "explode", "explosion", "collision", "blown" ], - char: '\ud83d\udca5', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - snowflake: { - keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ], - char: '\u2744\ufe0f', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cloud_with_snow: { - keywords: [ "weather" ], - char: '\ud83c\udf28', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - snowman: { - keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ], - char: '\u26c4', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - snowman_with_snow: { - keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ], - char: '\u2603', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - wind_face: { - keywords: [ "gust", "air" ], - char: '\ud83c\udf2c', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dash: { - keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ], - char: '\ud83d\udca8', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tornado: { - keywords: [ "weather", "cyclone", "twister" ], - char: '\ud83c\udf2a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - fog: { - keywords: [ "weather" ], - char: '\ud83c\udf2b', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - open_umbrella: { - keywords: [ "weather", "spring" ], - char: '\u2602', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - umbrella: { - keywords: [ "rainy", "weather", "spring" ], - char: '\u2614', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - droplet: { - keywords: [ "water", "drip", "faucet", "spring" ], - char: '\ud83d\udca7', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sweat_drops: { - keywords: [ "water", "drip", "oops" ], - char: '\ud83d\udca6', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - ocean: { - keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ], - char: '\ud83c\udf0a', - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - green_apple: { - keywords: [ "fruit", "nature" ], - char: '\ud83c\udf4f', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - apple: { - keywords: [ "fruit", "mac", "school" ], - char: '\ud83c\udf4e', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pear: { - keywords: [ "fruit", "nature", "food" ], - char: '\ud83c\udf50', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - tangerine: { - keywords: [ "food", "fruit", "nature", "orange" ], - char: '\ud83c\udf4a', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - lemon: { - keywords: [ "fruit", "nature" ], - char: '\ud83c\udf4b', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - banana: { - keywords: [ "fruit", "food", "monkey" ], - char: '\ud83c\udf4c', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - watermelon: { - keywords: [ "fruit", "food", "picnic", "summer" ], - char: '\ud83c\udf49', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - grapes: { - keywords: [ "fruit", "food", "wine" ], - char: '\ud83c\udf47', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - strawberry: { - keywords: [ "fruit", "food", "nature" ], - char: '\ud83c\udf53', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - melon: { - keywords: [ "fruit", "nature", "food" ], - char: '\ud83c\udf48', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cherries: { - keywords: [ "food", "fruit" ], - char: '\ud83c\udf52', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - peach: { - keywords: [ "fruit", "nature", "food" ], - char: '\ud83c\udf51', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pineapple: { - keywords: [ "fruit", "nature", "food" ], - char: '\ud83c\udf4d', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - coconut: { - keywords: [ "fruit", "nature", "food", "palm" ], - char: '\ud83e\udd65', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - kiwi_fruit: { - keywords: [ "fruit", "food" ], - char: '\ud83e\udd5d', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - mango: { - keywords: [ "fruit", "food", "tropical" ], - char: '\ud83e\udd6d', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - avocado: { - keywords: [ "fruit", "food" ], - char: '\ud83e\udd51', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - broccoli: { - keywords: [ "fruit", "food", "vegetable" ], - char: '\ud83e\udd66', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - tomato: { - keywords: [ "fruit", "vegetable", "nature", "food" ], - char: '\ud83c\udf45', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - eggplant: { - keywords: [ "vegetable", "nature", "food", "aubergine" ], - char: '\ud83c\udf46', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cucumber: { - keywords: [ "fruit", "food", "pickle" ], - char: '\ud83e\udd52', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - carrot: { - keywords: [ "vegetable", "food", "orange" ], - char: '\ud83e\udd55', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - hot_pepper: { - keywords: [ "food", "spicy", "chilli", "chili" ], - char: '\ud83c\udf36', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - potato: { - keywords: [ "food", "tuber", "vegatable", "starch" ], - char: '\ud83e\udd54', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - corn: { - keywords: [ "food", "vegetable", "plant" ], - char: '\ud83c\udf3d', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - leafy_greens: { - keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ], - char: '\ud83e\udd6c', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - sweet_potato: { - keywords: [ "food", "nature" ], - char: '\ud83c\udf60', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - peanuts: { - keywords: [ "food", "nut" ], - char: '\ud83e\udd5c', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - honey_pot: { - keywords: [ "bees", "sweet", "kitchen" ], - char: '\ud83c\udf6f', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - croissant: { - keywords: [ "food", "bread", "french" ], - char: '\ud83e\udd50', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bread: { - keywords: [ "food", "wheat", "breakfast", "toast" ], - char: '\ud83c\udf5e', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - baguette_bread: { - keywords: [ "food", "bread", "french" ], - char: '\ud83e\udd56', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bagel: { - keywords: [ "food", "bread", "bakery", "schmear" ], - char: '\ud83e\udd6f', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pretzel: { - keywords: [ "food", "bread", "twisted" ], - char: '\ud83e\udd68', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cheese: { - keywords: [ "food", "chadder" ], - char: '\ud83e\uddc0', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - egg: { - keywords: [ "food", "chicken", "breakfast" ], - char: '\ud83e\udd5a', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bacon: { - keywords: [ "food", "breakfast", "pork", "pig", "meat" ], - char: '\ud83e\udd53', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - steak: { - keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ], - char: '\ud83e\udd69', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pancakes: { - keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ], - char: '\ud83e\udd5e', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - poultry_leg: { - keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ], - char: '\ud83c\udf57', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - meat_on_bone: { - keywords: [ "good", "food", "drumstick" ], - char: '\ud83c\udf56', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bone: { - keywords: [ "skeleton" ], - char: '\ud83e\uddb4', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fried_shrimp: { - keywords: [ "food", "animal", "appetizer", "summer" ], - char: '\ud83c\udf64', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fried_egg: { - keywords: [ "food", "breakfast", "kitchen", "egg" ], - char: '\ud83c\udf73', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - hamburger: { - keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ], - char: '\ud83c\udf54', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fries: { - keywords: [ "chips", "snack", "fast food" ], - char: '\ud83c\udf5f', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - stuffed_flatbread: { - keywords: [ "food", "flatbread", "stuffed", "gyro" ], - char: '\ud83e\udd59', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - hotdog: { - keywords: [ "food", "frankfurter" ], - char: '\ud83c\udf2d', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pizza: { - keywords: [ "food", "party" ], - char: '\ud83c\udf55', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - sandwich: { - keywords: [ "food", "lunch", "bread" ], - char: '\ud83e\udd6a', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - canned_food: { - keywords: [ "food", "soup" ], - char: '\ud83e\udd6b', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - spaghetti: { - keywords: [ "food", "italian", "noodle" ], - char: '\ud83c\udf5d', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - taco: { - keywords: [ "food", "mexican" ], - char: '\ud83c\udf2e', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - burrito: { - keywords: [ "food", "mexican" ], - char: '\ud83c\udf2f', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - green_salad: { - keywords: [ "food", "healthy", "lettuce" ], - char: '\ud83e\udd57', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - shallow_pan_of_food: { - keywords: [ "food", "cooking", "casserole", "paella" ], - char: '\ud83e\udd58', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - ramen: { - keywords: [ "food", "japanese", "noodle", "chopsticks" ], - char: '\ud83c\udf5c', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - stew: { - keywords: [ "food", "meat", "soup" ], - char: '\ud83c\udf72', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fish_cake: { - keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ], - char: '\ud83c\udf65', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fortune_cookie: { - keywords: [ "food", "prophecy" ], - char: '\ud83e\udd60', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - sushi: { - keywords: [ "food", "fish", "japanese", "rice" ], - char: '\ud83c\udf63', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bento: { - keywords: [ "food", "japanese", "box" ], - char: '\ud83c\udf71', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - curry: { - keywords: [ "food", "spicy", "hot", "indian" ], - char: '\ud83c\udf5b', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - rice_ball: { - keywords: [ "food", "japanese" ], - char: '\ud83c\udf59', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - rice: { - keywords: [ "food", "china", "asian" ], - char: '\ud83c\udf5a', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - rice_cracker: { - keywords: [ "food", "japanese" ], - char: '\ud83c\udf58', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - oden: { - keywords: [ "food", "japanese" ], - char: '\ud83c\udf62', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - dango: { - keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ], - char: '\ud83c\udf61', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - shaved_ice: { - keywords: [ "hot", "dessert", "summer" ], - char: '\ud83c\udf67', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - ice_cream: { - keywords: [ "food", "hot", "dessert" ], - char: '\ud83c\udf68', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - icecream: { - keywords: [ "food", "hot", "dessert", "summer" ], - char: '\ud83c\udf66', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pie: { - keywords: [ "food", "dessert", "pastry" ], - char: '\ud83e\udd67', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cake: { - keywords: [ "food", "dessert" ], - char: '\ud83c\udf70', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cupcake: { - keywords: [ "food", "dessert", "bakery", "sweet" ], - char: '\ud83e\uddc1', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - moon_cake: { - keywords: [ "food", "autumn" ], - char: '\ud83e\udd6e', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - birthday: { - keywords: [ "food", "dessert", "cake" ], - char: '\ud83c\udf82', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - custard: { - keywords: [ "dessert", "food" ], - char: '\ud83c\udf6e', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - candy: { - keywords: [ "snack", "dessert", "sweet", "lolly" ], - char: '\ud83c\udf6c', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - lollipop: { - keywords: [ "food", "snack", "candy", "sweet" ], - char: '\ud83c\udf6d', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - chocolate_bar: { - keywords: [ "food", "snack", "dessert", "sweet" ], - char: '\ud83c\udf6b', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - popcorn: { - keywords: [ "food", "movie theater", "films", "snack" ], - char: '\ud83c\udf7f', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - dumpling: { - keywords: [ "food", "empanada", "pierogi", "potsticker" ], - char: '\ud83e\udd5f', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - doughnut: { - keywords: [ "food", "dessert", "snack", "sweet", "donut" ], - char: '\ud83c\udf69', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cookie: { - keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ], - char: '\ud83c\udf6a', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - milk_glass: { - keywords: [ "beverage", "drink", "cow" ], - char: '\ud83e\udd5b', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - beer: { - keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], - char: '\ud83c\udf7a', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - beers: { - keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], - char: '\ud83c\udf7b', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - clinking_glasses: { - keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ], - char: '\ud83e\udd42', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - wine_glass: { - keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ], - char: '\ud83c\udf77', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - tumbler_glass: { - keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ], - char: '\ud83e\udd43', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cocktail: { - keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ], - char: '\ud83c\udf78', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - tropical_drink: { - keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ], - char: '\ud83c\udf79', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - champagne: { - keywords: [ "drink", "wine", "bottle", "celebration" ], - char: '\ud83c\udf7e', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - sake: { - keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ], - char: '\ud83c\udf76', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - tea: { - keywords: [ "drink", "bowl", "breakfast", "green", "british" ], - char: '\ud83c\udf75', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cup_with_straw: { - keywords: [ "drink", "soda" ], - char: '\ud83e\udd64', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - coffee: { - keywords: [ "beverage", "caffeine", "latte", "espresso" ], - char: '\u2615', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - baby_bottle: { - keywords: [ "food", "container", "milk" ], - char: '\ud83c\udf7c', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - salt: { - keywords: [ "condiment", "shaker" ], - char: '\ud83e\uddc2', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - spoon: { - keywords: [ "cutlery", "kitchen", "tableware" ], - char: '\ud83e\udd44', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fork_and_knife: { - keywords: [ "cutlery", "kitchen" ], - char: '\ud83c\udf74', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - plate_with_cutlery: { - keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ], - char: '\ud83c\udf7d', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bowl_with_spoon: { - keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ], - char: '\ud83e\udd63', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - takeout_box: { - keywords: [ "food", "leftovers" ], - char: '\ud83e\udd61', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - chopsticks: { - keywords: [ "food" ], - char: '\ud83e\udd62', - fitzpatrick_scale: false, - category: "food_and_drink" - }, - soccer: { - keywords: [ "sports", "football" ], - char: '\u26bd', - fitzpatrick_scale: false, - category: "activity" - }, - basketball: { - keywords: [ "sports", "balls", "NBA" ], - char: '\ud83c\udfc0', - fitzpatrick_scale: false, - category: "activity" - }, - football: { - keywords: [ "sports", "balls", "NFL" ], - char: '\ud83c\udfc8', - fitzpatrick_scale: false, - category: "activity" - }, - baseball: { - keywords: [ "sports", "balls" ], - char: '\u26be', - fitzpatrick_scale: false, - category: "activity" - }, - softball: { - keywords: [ "sports", "balls" ], - char: '\ud83e\udd4e', - fitzpatrick_scale: false, - category: "activity" - }, - tennis: { - keywords: [ "sports", "balls", "green" ], - char: '\ud83c\udfbe', - fitzpatrick_scale: false, - category: "activity" - }, - volleyball: { - keywords: [ "sports", "balls" ], - char: '\ud83c\udfd0', - fitzpatrick_scale: false, - category: "activity" - }, - rugby_football: { - keywords: [ "sports", "team" ], - char: '\ud83c\udfc9', - fitzpatrick_scale: false, - category: "activity" - }, - flying_disc: { - keywords: [ "sports", "frisbee", "ultimate" ], - char: '\ud83e\udd4f', - fitzpatrick_scale: false, - category: "activity" - }, - "8ball": { - keywords: [ "pool", "hobby", "game", "luck", "magic" ], - char: '\ud83c\udfb1', - fitzpatrick_scale: false, - category: "activity" - }, - golf: { - keywords: [ "sports", "business", "flag", "hole", "summer" ], - char: '\u26f3', - fitzpatrick_scale: false, - category: "activity" - }, - golfing_woman: { - keywords: [ "sports", "business", "woman", "female" ], - char: '\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f', - fitzpatrick_scale: false, - category: "activity" - }, - golfing_man: { - keywords: [ "sports", "business" ], - char: '\ud83c\udfcc', - fitzpatrick_scale: true, - category: "activity" - }, - ping_pong: { - keywords: [ "sports", "pingpong" ], - char: '\ud83c\udfd3', - fitzpatrick_scale: false, - category: "activity" - }, - badminton: { - keywords: [ "sports" ], - char: '\ud83c\udff8', - fitzpatrick_scale: false, - category: "activity" - }, - goal_net: { - keywords: [ "sports" ], - char: '\ud83e\udd45', - fitzpatrick_scale: false, - category: "activity" - }, - ice_hockey: { - keywords: [ "sports" ], - char: '\ud83c\udfd2', - fitzpatrick_scale: false, - category: "activity" - }, - field_hockey: { - keywords: [ "sports" ], - char: '\ud83c\udfd1', - fitzpatrick_scale: false, - category: "activity" - }, - lacrosse: { - keywords: [ "sports", "ball", "stick" ], - char: '\ud83e\udd4d', - fitzpatrick_scale: false, - category: "activity" - }, - cricket: { - keywords: [ "sports" ], - char: '\ud83c\udfcf', - fitzpatrick_scale: false, - category: "activity" - }, - ski: { - keywords: [ "sports", "winter", "cold", "snow" ], - char: '\ud83c\udfbf', - fitzpatrick_scale: false, - category: "activity" - }, - skier: { - keywords: [ "sports", "winter", "snow" ], - char: '\u26f7', - fitzpatrick_scale: false, - category: "activity" - }, - snowboarder: { - keywords: [ "sports", "winter" ], - char: '\ud83c\udfc2', - fitzpatrick_scale: true, - category: "activity" - }, - person_fencing: { - keywords: [ "sports", "fencing", "sword" ], - char: '\ud83e\udd3a', - fitzpatrick_scale: false, - category: "activity" - }, - women_wrestling: { - keywords: [ "sports", "wrestlers" ], - char: '\ud83e\udd3c\u200d\u2640\ufe0f', - fitzpatrick_scale: false, - category: "activity" - }, - men_wrestling: { - keywords: [ "sports", "wrestlers" ], - char: '\ud83e\udd3c\u200d\u2642\ufe0f', - fitzpatrick_scale: false, - category: "activity" - }, - woman_cartwheeling: { - keywords: [ "gymnastics" ], - char: '\ud83e\udd38\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - man_cartwheeling: { - keywords: [ "gymnastics" ], - char: '\ud83e\udd38\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - woman_playing_handball: { - keywords: [ "sports" ], - char: '\ud83e\udd3e\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - man_playing_handball: { - keywords: [ "sports" ], - char: '\ud83e\udd3e\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - ice_skate: { - keywords: [ "sports" ], - char: '\u26f8', - fitzpatrick_scale: false, - category: "activity" - }, - curling_stone: { - keywords: [ "sports" ], - char: '\ud83e\udd4c', - fitzpatrick_scale: false, - category: "activity" - }, - skateboard: { - keywords: [ "board" ], - char: '\ud83d\udef9', - fitzpatrick_scale: false, - category: "activity" - }, - sled: { - keywords: [ "sleigh", "luge", "toboggan" ], - char: '\ud83d\udef7', - fitzpatrick_scale: false, - category: "activity" - }, - bow_and_arrow: { - keywords: [ "sports" ], - char: '\ud83c\udff9', - fitzpatrick_scale: false, - category: "activity" - }, - fishing_pole_and_fish: { - keywords: [ "food", "hobby", "summer" ], - char: '\ud83c\udfa3', - fitzpatrick_scale: false, - category: "activity" - }, - boxing_glove: { - keywords: [ "sports", "fighting" ], - char: '\ud83e\udd4a', - fitzpatrick_scale: false, - category: "activity" - }, - martial_arts_uniform: { - keywords: [ "judo", "karate", "taekwondo" ], - char: '\ud83e\udd4b', - fitzpatrick_scale: false, - category: "activity" - }, - rowing_woman: { - keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ], - char: '\ud83d\udea3\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - rowing_man: { - keywords: [ "sports", "hobby", "water", "ship" ], - char: '\ud83d\udea3', - fitzpatrick_scale: true, - category: "activity" - }, - climbing_woman: { - keywords: [ "sports", "hobby", "woman", "female", "rock" ], - char: '\ud83e\uddd7\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - climbing_man: { - keywords: [ "sports", "hobby", "man", "male", "rock" ], - char: '\ud83e\uddd7\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - swimming_woman: { - keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ], - char: '\ud83c\udfca\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - swimming_man: { - keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ], - char: '\ud83c\udfca', - fitzpatrick_scale: true, - category: "activity" - }, - woman_playing_water_polo: { - keywords: [ "sports", "pool" ], - char: '\ud83e\udd3d\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - man_playing_water_polo: { - keywords: [ "sports", "pool" ], - char: '\ud83e\udd3d\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - woman_in_lotus_position: { - keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ], - char: '\ud83e\uddd8\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - man_in_lotus_position: { - keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ], - char: '\ud83e\uddd8\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - surfing_woman: { - keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ], - char: '\ud83c\udfc4\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - surfing_man: { - keywords: [ "sports", "ocean", "sea", "summer", "beach" ], - char: '\ud83c\udfc4', - fitzpatrick_scale: true, - category: "activity" - }, - bath: { - keywords: [ "clean", "shower", "bathroom" ], - char: '\ud83d\udec0', - fitzpatrick_scale: true, - category: "activity" - }, - basketball_woman: { - keywords: [ "sports", "human", "woman", "female" ], - char: '\u26f9\ufe0f\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - basketball_man: { - keywords: [ "sports", "human" ], - char: '\u26f9', - fitzpatrick_scale: true, - category: "activity" - }, - weight_lifting_woman: { - keywords: [ "sports", "training", "exercise", "woman", "female" ], - char: '\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - weight_lifting_man: { - keywords: [ "sports", "training", "exercise" ], - char: '\ud83c\udfcb', - fitzpatrick_scale: true, - category: "activity" - }, - biking_woman: { - keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ], - char: '\ud83d\udeb4\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - biking_man: { - keywords: [ "sports", "bike", "exercise", "hipster" ], - char: '\ud83d\udeb4', - fitzpatrick_scale: true, - category: "activity" - }, - mountain_biking_woman: { - keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ], - char: '\ud83d\udeb5\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - mountain_biking_man: { - keywords: [ "transportation", "sports", "human", "race", "bike" ], - char: '\ud83d\udeb5', - fitzpatrick_scale: true, - category: "activity" - }, - horse_racing: { - keywords: [ "animal", "betting", "competition", "gambling", "luck" ], - char: '\ud83c\udfc7', - fitzpatrick_scale: true, - category: "activity" - }, - business_suit_levitating: { - keywords: [ "suit", "business", "levitate", "hover", "jump" ], - char: '\ud83d\udd74', - fitzpatrick_scale: true, - category: "activity" - }, - trophy: { - keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ], - char: '\ud83c\udfc6', - fitzpatrick_scale: false, - category: "activity" - }, - running_shirt_with_sash: { - keywords: [ "play", "pageant" ], - char: '\ud83c\udfbd', - fitzpatrick_scale: false, - category: "activity" - }, - medal_sports: { - keywords: [ "award", "winning" ], - char: '\ud83c\udfc5', - fitzpatrick_scale: false, - category: "activity" - }, - medal_military: { - keywords: [ "award", "winning", "army" ], - char: '\ud83c\udf96', - fitzpatrick_scale: false, - category: "activity" - }, - "1st_place_medal": { - keywords: [ "award", "winning", "first" ], - char: '\ud83e\udd47', - fitzpatrick_scale: false, - category: "activity" - }, - "2nd_place_medal": { - keywords: [ "award", "second" ], - char: '\ud83e\udd48', - fitzpatrick_scale: false, - category: "activity" - }, - "3rd_place_medal": { - keywords: [ "award", "third" ], - char: '\ud83e\udd49', - fitzpatrick_scale: false, - category: "activity" - }, - reminder_ribbon: { - keywords: [ "sports", "cause", "support", "awareness" ], - char: '\ud83c\udf97', - fitzpatrick_scale: false, - category: "activity" - }, - rosette: { - keywords: [ "flower", "decoration", "military" ], - char: '\ud83c\udff5', - fitzpatrick_scale: false, - category: "activity" - }, - ticket: { - keywords: [ "event", "concert", "pass" ], - char: '\ud83c\udfab', - fitzpatrick_scale: false, - category: "activity" - }, - tickets: { - keywords: [ "sports", "concert", "entrance" ], - char: '\ud83c\udf9f', - fitzpatrick_scale: false, - category: "activity" - }, - performing_arts: { - keywords: [ "acting", "theater", "drama" ], - char: '\ud83c\udfad', - fitzpatrick_scale: false, - category: "activity" - }, - art: { - keywords: [ "design", "paint", "draw", "colors" ], - char: '\ud83c\udfa8', - fitzpatrick_scale: false, - category: "activity" - }, - circus_tent: { - keywords: [ "festival", "carnival", "party" ], - char: '\ud83c\udfaa', - fitzpatrick_scale: false, - category: "activity" - }, - woman_juggling: { - keywords: [ "juggle", "balance", "skill", "multitask" ], - char: '\ud83e\udd39\u200d\u2640\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - man_juggling: { - keywords: [ "juggle", "balance", "skill", "multitask" ], - char: '\ud83e\udd39\u200d\u2642\ufe0f', - fitzpatrick_scale: true, - category: "activity" - }, - microphone: { - keywords: [ "sound", "music", "PA", "sing", "talkshow" ], - char: '\ud83c\udfa4', - fitzpatrick_scale: false, - category: "activity" - }, - headphones: { - keywords: [ "music", "score", "gadgets" ], - char: '\ud83c\udfa7', - fitzpatrick_scale: false, - category: "activity" - }, - musical_score: { - keywords: [ "treble", "clef", "compose" ], - char: '\ud83c\udfbc', - fitzpatrick_scale: false, - category: "activity" - }, - musical_keyboard: { - keywords: [ "piano", "instrument", "compose" ], - char: '\ud83c\udfb9', - fitzpatrick_scale: false, - category: "activity" - }, - drum: { - keywords: [ "music", "instrument", "drumsticks", "snare" ], - char: '\ud83e\udd41', - fitzpatrick_scale: false, - category: "activity" - }, - saxophone: { - keywords: [ "music", "instrument", "jazz", "blues" ], - char: '\ud83c\udfb7', - fitzpatrick_scale: false, - category: "activity" - }, - trumpet: { - keywords: [ "music", "brass" ], - char: '\ud83c\udfba', - fitzpatrick_scale: false, - category: "activity" - }, - guitar: { - keywords: [ "music", "instrument" ], - char: '\ud83c\udfb8', - fitzpatrick_scale: false, - category: "activity" - }, - violin: { - keywords: [ "music", "instrument", "orchestra", "symphony" ], - char: '\ud83c\udfbb', - fitzpatrick_scale: false, - category: "activity" - }, - clapper: { - keywords: [ "movie", "film", "record" ], - char: '\ud83c\udfac', - fitzpatrick_scale: false, - category: "activity" - }, - video_game: { - keywords: [ "play", "console", "PS4", "controller" ], - char: '\ud83c\udfae', - fitzpatrick_scale: false, - category: "activity" - }, - space_invader: { - keywords: [ "game", "arcade", "play" ], - char: '\ud83d\udc7e', - fitzpatrick_scale: false, - category: "activity" - }, - dart: { - keywords: [ "game", "play", "bar", "target", "bullseye" ], - char: '\ud83c\udfaf', - fitzpatrick_scale: false, - category: "activity" - }, - game_die: { - keywords: [ "dice", "random", "tabletop", "play", "luck" ], - char: '\ud83c\udfb2', - fitzpatrick_scale: false, - category: "activity" - }, - chess_pawn: { - keywords: [ "expendable" ], - char: "\u265f", - fitzpatrick_scale: false, - category: "activity" - }, - slot_machine: { - keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ], - char: '\ud83c\udfb0', - fitzpatrick_scale: false, - category: "activity" - }, - jigsaw: { - keywords: [ "interlocking", "puzzle", "piece" ], - char: '\ud83e\udde9', - fitzpatrick_scale: false, - category: "activity" - }, - bowling: { - keywords: [ "sports", "fun", "play" ], - char: '\ud83c\udfb3', - fitzpatrick_scale: false, - category: "activity" - }, - red_car: { - keywords: [ "red", "transportation", "vehicle" ], - char: '\ud83d\ude97', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - taxi: { - keywords: [ "uber", "vehicle", "cars", "transportation" ], - char: '\ud83d\ude95', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - blue_car: { - keywords: [ "transportation", "vehicle" ], - char: '\ud83d\ude99', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bus: { - keywords: [ "car", "vehicle", "transportation" ], - char: '\ud83d\ude8c', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - trolleybus: { - keywords: [ "bart", "transportation", "vehicle" ], - char: '\ud83d\ude8e', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - racing_car: { - keywords: [ "sports", "race", "fast", "formula", "f1" ], - char: '\ud83c\udfce', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - police_car: { - keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ], - char: '\ud83d\ude93', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - ambulance: { - keywords: [ "health", "911", "hospital" ], - char: '\ud83d\ude91', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - fire_engine: { - keywords: [ "transportation", "cars", "vehicle" ], - char: '\ud83d\ude92', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - minibus: { - keywords: [ "vehicle", "car", "transportation" ], - char: '\ud83d\ude90', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - truck: { - keywords: [ "cars", "transportation" ], - char: '\ud83d\ude9a', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - articulated_lorry: { - keywords: [ "vehicle", "cars", "transportation", "express" ], - char: '\ud83d\ude9b', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - tractor: { - keywords: [ "vehicle", "car", "farming", "agriculture" ], - char: '\ud83d\ude9c', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - kick_scooter: { - keywords: [ "vehicle", "kick", "razor" ], - char: '\ud83d\udef4', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - motorcycle: { - keywords: [ "race", "sports", "fast" ], - char: '\ud83c\udfcd', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bike: { - keywords: [ "sports", "bicycle", "exercise", "hipster" ], - char: '\ud83d\udeb2', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - motor_scooter: { - keywords: [ "vehicle", "vespa", "sasha" ], - char: '\ud83d\udef5', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - rotating_light: { - keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ], - char: '\ud83d\udea8', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - oncoming_police_car: { - keywords: [ "vehicle", "law", "legal", "enforcement", "911" ], - char: '\ud83d\ude94', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - oncoming_bus: { - keywords: [ "vehicle", "transportation" ], - char: '\ud83d\ude8d', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - oncoming_automobile: { - keywords: [ "car", "vehicle", "transportation" ], - char: '\ud83d\ude98', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - oncoming_taxi: { - keywords: [ "vehicle", "cars", "uber" ], - char: '\ud83d\ude96', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - aerial_tramway: { - keywords: [ "transportation", "vehicle", "ski" ], - char: '\ud83d\udea1', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mountain_cableway: { - keywords: [ "transportation", "vehicle", "ski" ], - char: '\ud83d\udea0', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - suspension_railway: { - keywords: [ "vehicle", "transportation" ], - char: '\ud83d\ude9f', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - railway_car: { - keywords: [ "transportation", "vehicle" ], - char: '\ud83d\ude83', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - train: { - keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ], - char: '\ud83d\ude8b', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - monorail: { - keywords: [ "transportation", "vehicle" ], - char: '\ud83d\ude9d', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bullettrain_side: { - keywords: [ "transportation", "vehicle" ], - char: '\ud83d\ude84', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bullettrain_front: { - keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ], - char: '\ud83d\ude85', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - light_rail: { - keywords: [ "transportation", "vehicle" ], - char: '\ud83d\ude88', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mountain_railway: { - keywords: [ "transportation", "vehicle" ], - char: '\ud83d\ude9e', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - steam_locomotive: { - keywords: [ "transportation", "vehicle", "train" ], - char: '\ud83d\ude82', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - train2: { - keywords: [ "transportation", "vehicle" ], - char: '\ud83d\ude86', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - metro: { - keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ], - char: '\ud83d\ude87', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - tram: { - keywords: [ "transportation", "vehicle" ], - char: '\ud83d\ude8a', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - station: { - keywords: [ "transportation", "vehicle", "public" ], - char: '\ud83d\ude89', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - flying_saucer: { - keywords: [ "transportation", "vehicle", "ufo" ], - char: '\ud83d\udef8', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - helicopter: { - keywords: [ "transportation", "vehicle", "fly" ], - char: '\ud83d\ude81', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - small_airplane: { - keywords: [ "flight", "transportation", "fly", "vehicle" ], - char: '\ud83d\udee9', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - airplane: { - keywords: [ "vehicle", "transportation", "flight", "fly" ], - char: '\u2708\ufe0f', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - flight_departure: { - keywords: [ "airport", "flight", "landing" ], - char: '\ud83d\udeeb', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - flight_arrival: { - keywords: [ "airport", "flight", "boarding" ], - char: '\ud83d\udeec', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - sailboat: { - keywords: [ "ship", "summer", "transportation", "water", "sailing" ], - char: '\u26f5', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - motor_boat: { - keywords: [ "ship" ], - char: '\ud83d\udee5', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - speedboat: { - keywords: [ "ship", "transportation", "vehicle", "summer" ], - char: '\ud83d\udea4', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - ferry: { - keywords: [ "boat", "ship", "yacht" ], - char: '\u26f4', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - passenger_ship: { - keywords: [ "yacht", "cruise", "ferry" ], - char: '\ud83d\udef3', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - rocket: { - keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ], - char: '\ud83d\ude80', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - artificial_satellite: { - keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ], - char: '\ud83d\udef0', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - seat: { - keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ], - char: '\ud83d\udcba', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - canoe: { - keywords: [ "boat", "paddle", "water", "ship" ], - char: '\ud83d\udef6', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - anchor: { - keywords: [ "ship", "ferry", "sea", "boat" ], - char: '\u2693', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - construction: { - keywords: [ "wip", "progress", "caution", "warning" ], - char: '\ud83d\udea7', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - fuelpump: { - keywords: [ "gas station", "petroleum" ], - char: '\u26fd', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - busstop: { - keywords: [ "transportation", "wait" ], - char: '\ud83d\ude8f', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - vertical_traffic_light: { - keywords: [ "transportation", "driving" ], - char: '\ud83d\udea6', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - traffic_light: { - keywords: [ "transportation", "signal" ], - char: '\ud83d\udea5', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - checkered_flag: { - keywords: [ "contest", "finishline", "race", "gokart" ], - char: '\ud83c\udfc1', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - ship: { - keywords: [ "transportation", "titanic", "deploy" ], - char: '\ud83d\udea2', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - ferris_wheel: { - keywords: [ "photo", "carnival", "londoneye" ], - char: '\ud83c\udfa1', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - roller_coaster: { - keywords: [ "carnival", "playground", "photo", "fun" ], - char: '\ud83c\udfa2', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - carousel_horse: { - keywords: [ "photo", "carnival" ], - char: '\ud83c\udfa0', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - building_construction: { - keywords: [ "wip", "working", "progress" ], - char: '\ud83c\udfd7', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - foggy: { - keywords: [ "photo", "mountain" ], - char: '\ud83c\udf01', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - tokyo_tower: { - keywords: [ "photo", "japanese" ], - char: '\ud83d\uddfc', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - factory: { - keywords: [ "building", "industry", "pollution", "smoke" ], - char: '\ud83c\udfed', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - fountain: { - keywords: [ "photo", "summer", "water", "fresh" ], - char: '\u26f2', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - rice_scene: { - keywords: [ "photo", "japan", "asia", "tsukimi" ], - char: '\ud83c\udf91', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mountain: { - keywords: [ "photo", "nature", "environment" ], - char: '\u26f0', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mountain_snow: { - keywords: [ "photo", "nature", "environment", "winter", "cold" ], - char: '\ud83c\udfd4', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mount_fuji: { - keywords: [ "photo", "mountain", "nature", "japanese" ], - char: '\ud83d\uddfb', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - volcano: { - keywords: [ "photo", "nature", "disaster" ], - char: '\ud83c\udf0b', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - japan: { - keywords: [ "nation", "country", "japanese", "asia" ], - char: '\ud83d\uddfe', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - camping: { - keywords: [ "photo", "outdoors", "tent" ], - char: '\ud83c\udfd5', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - tent: { - keywords: [ "photo", "camping", "outdoors" ], - char: '\u26fa', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - national_park: { - keywords: [ "photo", "environment", "nature" ], - char: '\ud83c\udfde', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - motorway: { - keywords: [ "road", "cupertino", "interstate", "highway" ], - char: '\ud83d\udee3', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - railway_track: { - keywords: [ "train", "transportation" ], - char: '\ud83d\udee4', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - sunrise: { - keywords: [ "morning", "view", "vacation", "photo" ], - char: '\ud83c\udf05', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - sunrise_over_mountains: { - keywords: [ "view", "vacation", "photo" ], - char: '\ud83c\udf04', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - desert: { - keywords: [ "photo", "warm", "saharah" ], - char: '\ud83c\udfdc', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - beach_umbrella: { - keywords: [ "weather", "summer", "sunny", "sand", "mojito" ], - char: '\ud83c\udfd6', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - desert_island: { - keywords: [ "photo", "tropical", "mojito" ], - char: '\ud83c\udfdd', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - city_sunrise: { - keywords: [ "photo", "good morning", "dawn" ], - char: '\ud83c\udf07', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - city_sunset: { - keywords: [ "photo", "evening", "sky", "buildings" ], - char: '\ud83c\udf06', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - cityscape: { - keywords: [ "photo", "night life", "urban" ], - char: '\ud83c\udfd9', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - night_with_stars: { - keywords: [ "evening", "city", "downtown" ], - char: '\ud83c\udf03', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bridge_at_night: { - keywords: [ "photo", "sanfrancisco" ], - char: '\ud83c\udf09', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - milky_way: { - keywords: [ "photo", "space", "stars" ], - char: '\ud83c\udf0c', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - stars: { - keywords: [ "night", "photo" ], - char: '\ud83c\udf20', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - sparkler: { - keywords: [ "stars", "night", "shine" ], - char: '\ud83c\udf87', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - fireworks: { - keywords: [ "photo", "festival", "carnival", "congratulations" ], - char: '\ud83c\udf86', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - rainbow: { - keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ], - char: '\ud83c\udf08', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - houses: { - keywords: [ "buildings", "photo" ], - char: '\ud83c\udfd8', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - european_castle: { - keywords: [ "building", "royalty", "history" ], - char: '\ud83c\udff0', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - japanese_castle: { - keywords: [ "photo", "building" ], - char: '\ud83c\udfef', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - stadium: { - keywords: [ "photo", "place", "sports", "concert", "venue" ], - char: '\ud83c\udfdf', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - statue_of_liberty: { - keywords: [ "american", "newyork" ], - char: '\ud83d\uddfd', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - house: { - keywords: [ "building", "home" ], - char: '\ud83c\udfe0', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - house_with_garden: { - keywords: [ "home", "plant", "nature" ], - char: '\ud83c\udfe1', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - derelict_house: { - keywords: [ "abandon", "evict", "broken", "building" ], - char: '\ud83c\udfda', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - office: { - keywords: [ "building", "bureau", "work" ], - char: '\ud83c\udfe2', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - department_store: { - keywords: [ "building", "shopping", "mall" ], - char: '\ud83c\udfec', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - post_office: { - keywords: [ "building", "envelope", "communication" ], - char: '\ud83c\udfe3', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - european_post_office: { - keywords: [ "building", "email" ], - char: '\ud83c\udfe4', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - hospital: { - keywords: [ "building", "health", "surgery", "doctor" ], - char: '\ud83c\udfe5', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bank: { - keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ], - char: '\ud83c\udfe6', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - hotel: { - keywords: [ "building", "accomodation", "checkin" ], - char: '\ud83c\udfe8', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - convenience_store: { - keywords: [ "building", "shopping", "groceries" ], - char: '\ud83c\udfea', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - school: { - keywords: [ "building", "student", "education", "learn", "teach" ], - char: '\ud83c\udfeb', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - love_hotel: { - keywords: [ "like", "affection", "dating" ], - char: '\ud83c\udfe9', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - wedding: { - keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ], - char: '\ud83d\udc92', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - classical_building: { - keywords: [ "art", "culture", "history" ], - char: '\ud83c\udfdb', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - church: { - keywords: [ "building", "religion", "christ" ], - char: '\u26ea', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mosque: { - keywords: [ "islam", "worship", "minaret" ], - char: '\ud83d\udd4c', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - synagogue: { - keywords: [ "judaism", "worship", "temple", "jewish" ], - char: '\ud83d\udd4d', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - kaaba: { - keywords: [ "mecca", "mosque", "islam" ], - char: '\ud83d\udd4b', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - shinto_shrine: { - keywords: [ "temple", "japan", "kyoto" ], - char: '\u26e9', - fitzpatrick_scale: false, - category: "travel_and_places" - }, - watch: { - keywords: [ "time", "accessories" ], - char: '\u231a', - fitzpatrick_scale: false, - category: "objects" - }, - iphone: { - keywords: [ "technology", "apple", "gadgets", "dial" ], - char: '\ud83d\udcf1', - fitzpatrick_scale: false, - category: "objects" - }, - calling: { - keywords: [ "iphone", "incoming" ], - char: '\ud83d\udcf2', - fitzpatrick_scale: false, - category: "objects" - }, - computer: { - keywords: [ "technology", "laptop", "screen", "display", "monitor" ], - char: '\ud83d\udcbb', - fitzpatrick_scale: false, - category: "objects" - }, - keyboard: { - keywords: [ "technology", "computer", "type", "input", "text" ], - char: '\u2328', - fitzpatrick_scale: false, - category: "objects" - }, - desktop_computer: { - keywords: [ "technology", "computing", "screen" ], - char: '\ud83d\udda5', - fitzpatrick_scale: false, - category: "objects" - }, - printer: { - keywords: [ "paper", "ink" ], - char: '\ud83d\udda8', - fitzpatrick_scale: false, - category: "objects" - }, - computer_mouse: { - keywords: [ "click" ], - char: '\ud83d\uddb1', - fitzpatrick_scale: false, - category: "objects" - }, - trackball: { - keywords: [ "technology", "trackpad" ], - char: '\ud83d\uddb2', - fitzpatrick_scale: false, - category: "objects" - }, - joystick: { - keywords: [ "game", "play" ], - char: '\ud83d\udd79', - fitzpatrick_scale: false, - category: "objects" - }, - clamp: { - keywords: [ "tool" ], - char: '\ud83d\udddc', - fitzpatrick_scale: false, - category: "objects" - }, - minidisc: { - keywords: [ "technology", "record", "data", "disk", "90s" ], - char: '\ud83d\udcbd', - fitzpatrick_scale: false, - category: "objects" - }, - floppy_disk: { - keywords: [ "oldschool", "technology", "save", "90s", "80s" ], - char: '\ud83d\udcbe', - fitzpatrick_scale: false, - category: "objects" - }, - cd: { - keywords: [ "technology", "dvd", "disk", "disc", "90s" ], - char: '\ud83d\udcbf', - fitzpatrick_scale: false, - category: "objects" - }, - dvd: { - keywords: [ "cd", "disk", "disc" ], - char: '\ud83d\udcc0', - fitzpatrick_scale: false, - category: "objects" - }, - vhs: { - keywords: [ "record", "video", "oldschool", "90s", "80s" ], - char: '\ud83d\udcfc', - fitzpatrick_scale: false, - category: "objects" - }, - camera: { - keywords: [ "gadgets", "photography" ], - char: '\ud83d\udcf7', - fitzpatrick_scale: false, - category: "objects" - }, - camera_flash: { - keywords: [ "photography", "gadgets" ], - char: '\ud83d\udcf8', - fitzpatrick_scale: false, - category: "objects" - }, - video_camera: { - keywords: [ "film", "record" ], - char: '\ud83d\udcf9', - fitzpatrick_scale: false, - category: "objects" - }, - movie_camera: { - keywords: [ "film", "record" ], - char: '\ud83c\udfa5', - fitzpatrick_scale: false, - category: "objects" - }, - film_projector: { - keywords: [ "video", "tape", "record", "movie" ], - char: '\ud83d\udcfd', - fitzpatrick_scale: false, - category: "objects" - }, - film_strip: { - keywords: [ "movie" ], - char: '\ud83c\udf9e', - fitzpatrick_scale: false, - category: "objects" - }, - telephone_receiver: { - keywords: [ "technology", "communication", "dial" ], - char: '\ud83d\udcde', - fitzpatrick_scale: false, - category: "objects" - }, - phone: { - keywords: [ "technology", "communication", "dial", "telephone" ], - char: '\u260e\ufe0f', - fitzpatrick_scale: false, - category: "objects" - }, - pager: { - keywords: [ "bbcall", "oldschool", "90s" ], - char: '\ud83d\udcdf', - fitzpatrick_scale: false, - category: "objects" - }, - fax: { - keywords: [ "communication", "technology" ], - char: '\ud83d\udce0', - fitzpatrick_scale: false, - category: "objects" - }, - tv: { - keywords: [ "technology", "program", "oldschool", "show", "television" ], - char: '\ud83d\udcfa', - fitzpatrick_scale: false, - category: "objects" - }, - radio: { - keywords: [ "communication", "music", "podcast", "program" ], - char: '\ud83d\udcfb', - fitzpatrick_scale: false, - category: "objects" - }, - studio_microphone: { - keywords: [ "sing", "recording", "artist", "talkshow" ], - char: '\ud83c\udf99', - fitzpatrick_scale: false, - category: "objects" - }, - level_slider: { - keywords: [ "scale" ], - char: '\ud83c\udf9a', - fitzpatrick_scale: false, - category: "objects" - }, - control_knobs: { - keywords: [ "dial" ], - char: '\ud83c\udf9b', - fitzpatrick_scale: false, - category: "objects" - }, - compass: { - keywords: [ "magnetic", "navigation", "orienteering" ], - char: '\ud83e\udded', - fitzpatrick_scale: false, - category: "objects" - }, - stopwatch: { - keywords: [ "time", "deadline" ], - char: '\u23f1', - fitzpatrick_scale: false, - category: "objects" - }, - timer_clock: { - keywords: [ "alarm" ], - char: '\u23f2', - fitzpatrick_scale: false, - category: "objects" - }, - alarm_clock: { - keywords: [ "time", "wake" ], - char: '\u23f0', - fitzpatrick_scale: false, - category: "objects" - }, - mantelpiece_clock: { - keywords: [ "time" ], - char: '\ud83d\udd70', - fitzpatrick_scale: false, - category: "objects" - }, - hourglass_flowing_sand: { - keywords: [ "oldschool", "time", "countdown" ], - char: '\u23f3', - fitzpatrick_scale: false, - category: "objects" - }, - hourglass: { - keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ], - char: '\u231b', - fitzpatrick_scale: false, - category: "objects" - }, - satellite: { - keywords: [ "communication", "future", "radio", "space" ], - char: '\ud83d\udce1', - fitzpatrick_scale: false, - category: "objects" - }, - battery: { - keywords: [ "power", "energy", "sustain" ], - char: '\ud83d\udd0b', - fitzpatrick_scale: false, - category: "objects" - }, - electric_plug: { - keywords: [ "charger", "power" ], - char: '\ud83d\udd0c', - fitzpatrick_scale: false, - category: "objects" - }, - bulb: { - keywords: [ "light", "electricity", "idea" ], - char: '\ud83d\udca1', - fitzpatrick_scale: false, - category: "objects" - }, - flashlight: { - keywords: [ "dark", "camping", "sight", "night" ], - char: '\ud83d\udd26', - fitzpatrick_scale: false, - category: "objects" - }, - candle: { - keywords: [ "fire", "wax" ], - char: '\ud83d\udd6f', - fitzpatrick_scale: false, - category: "objects" - }, - fire_extinguisher: { - keywords: [ "quench" ], - char: '\ud83e\uddef', - fitzpatrick_scale: false, - category: "objects" - }, - wastebasket: { - keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ], - char: '\ud83d\uddd1', - fitzpatrick_scale: false, - category: "objects" - }, - oil_drum: { - keywords: [ "barrell" ], - char: '\ud83d\udee2', - fitzpatrick_scale: false, - category: "objects" - }, - money_with_wings: { - keywords: [ "dollar", "bills", "payment", "sale" ], - char: '\ud83d\udcb8', - fitzpatrick_scale: false, - category: "objects" - }, - dollar: { - keywords: [ "money", "sales", "bill", "currency" ], - char: '\ud83d\udcb5', - fitzpatrick_scale: false, - category: "objects" - }, - yen: { - keywords: [ "money", "sales", "japanese", "dollar", "currency" ], - char: '\ud83d\udcb4', - fitzpatrick_scale: false, - category: "objects" - }, - euro: { - keywords: [ "money", "sales", "dollar", "currency" ], - char: '\ud83d\udcb6', - fitzpatrick_scale: false, - category: "objects" - }, - pound: { - keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ], - char: '\ud83d\udcb7', - fitzpatrick_scale: false, - category: "objects" - }, - moneybag: { - keywords: [ "dollar", "payment", "coins", "sale" ], - char: '\ud83d\udcb0', - fitzpatrick_scale: false, - category: "objects" - }, - credit_card: { - keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ], - char: '\ud83d\udcb3', - fitzpatrick_scale: false, - category: "objects" - }, - gem: { - keywords: [ "blue", "ruby", "diamond", "jewelry" ], - char: '\ud83d\udc8e', - fitzpatrick_scale: false, - category: "objects" - }, - balance_scale: { - keywords: [ "law", "fairness", "weight" ], - char: '\u2696', - fitzpatrick_scale: false, - category: "objects" - }, - toolbox: { - keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ], - char: '\ud83e\uddf0', - fitzpatrick_scale: false, - category: "objects" - }, - wrench: { - keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ], - char: '\ud83d\udd27', - fitzpatrick_scale: false, - category: "objects" - }, - hammer: { - keywords: [ "tools", "build", "create" ], - char: '\ud83d\udd28', - fitzpatrick_scale: false, - category: "objects" - }, - hammer_and_pick: { - keywords: [ "tools", "build", "create" ], - char: '\u2692', - fitzpatrick_scale: false, - category: "objects" - }, - hammer_and_wrench: { - keywords: [ "tools", "build", "create" ], - char: '\ud83d\udee0', - fitzpatrick_scale: false, - category: "objects" - }, - pick: { - keywords: [ "tools", "dig" ], - char: '\u26cf', - fitzpatrick_scale: false, - category: "objects" - }, - nut_and_bolt: { - keywords: [ "handy", "tools", "fix" ], - char: '\ud83d\udd29', - fitzpatrick_scale: false, - category: "objects" - }, - gear: { - keywords: [ "cog" ], - char: '\u2699', - fitzpatrick_scale: false, - category: "objects" - }, - brick: { - keywords: [ "bricks" ], - char: '\ud83e\uddf1', - fitzpatrick_scale: false, - category: "objects" - }, - chains: { - keywords: [ "lock", "arrest" ], - char: '\u26d3', - fitzpatrick_scale: false, - category: "objects" - }, - magnet: { - keywords: [ "attraction", "magnetic" ], - char: '\ud83e\uddf2', - fitzpatrick_scale: false, - category: "objects" - }, - gun: { - keywords: [ "violence", "weapon", "pistol", "revolver" ], - char: '\ud83d\udd2b', - fitzpatrick_scale: false, - category: "objects" - }, - bomb: { - keywords: [ "boom", "explode", "explosion", "terrorism" ], - char: '\ud83d\udca3', - fitzpatrick_scale: false, - category: "objects" - }, - firecracker: { - keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ], - char: '\ud83e\udde8', - fitzpatrick_scale: false, - category: "objects" - }, - hocho: { - keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ], - char: '\ud83d\udd2a', - fitzpatrick_scale: false, - category: "objects" - }, - dagger: { - keywords: [ "weapon" ], - char: '\ud83d\udde1', - fitzpatrick_scale: false, - category: "objects" - }, - crossed_swords: { - keywords: [ "weapon" ], - char: '\u2694', - fitzpatrick_scale: false, - category: "objects" - }, - shield: { - keywords: [ "protection", "security" ], - char: '\ud83d\udee1', - fitzpatrick_scale: false, - category: "objects" - }, - smoking: { - keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ], - char: '\ud83d\udeac', - fitzpatrick_scale: false, - category: "objects" - }, - skull_and_crossbones: { - keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ], - char: '\u2620', - fitzpatrick_scale: false, - category: "objects" - }, - coffin: { - keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ], - char: '\u26b0', - fitzpatrick_scale: false, - category: "objects" - }, - funeral_urn: { - keywords: [ "dead", "die", "death", "rip", "ashes" ], - char: '\u26b1', - fitzpatrick_scale: false, - category: "objects" - }, - amphora: { - keywords: [ "vase", "jar" ], - char: '\ud83c\udffa', - fitzpatrick_scale: false, - category: "objects" - }, - crystal_ball: { - keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ], - char: '\ud83d\udd2e', - fitzpatrick_scale: false, - category: "objects" - }, - prayer_beads: { - keywords: [ "dhikr", "religious" ], - char: '\ud83d\udcff', - fitzpatrick_scale: false, - category: "objects" - }, - nazar_amulet: { - keywords: [ "bead", "charm" ], - char: '\ud83e\uddff', - fitzpatrick_scale: false, - category: "objects" - }, - barber: { - keywords: [ "hair", "salon", "style" ], - char: '\ud83d\udc88', - fitzpatrick_scale: false, - category: "objects" - }, - alembic: { - keywords: [ "distilling", "science", "experiment", "chemistry" ], - char: '\u2697', - fitzpatrick_scale: false, - category: "objects" - }, - telescope: { - keywords: [ "stars", "space", "zoom", "science", "astronomy" ], - char: '\ud83d\udd2d', - fitzpatrick_scale: false, - category: "objects" - }, - microscope: { - keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ], - char: '\ud83d\udd2c', - fitzpatrick_scale: false, - category: "objects" - }, - hole: { - keywords: [ "embarrassing" ], - char: '\ud83d\udd73', - fitzpatrick_scale: false, - category: "objects" - }, - pill: { - keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ], - char: '\ud83d\udc8a', - fitzpatrick_scale: false, - category: "objects" - }, - syringe: { - keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ], - char: '\ud83d\udc89', - fitzpatrick_scale: false, - category: "objects" - }, - dna: { - keywords: [ "biologist", "genetics", "life" ], - char: '\ud83e\uddec', - fitzpatrick_scale: false, - category: "objects" - }, - microbe: { - keywords: [ "amoeba", "bacteria", "germs" ], - char: '\ud83e\udda0', - fitzpatrick_scale: false, - category: "objects" - }, - petri_dish: { - keywords: [ "bacteria", "biology", "culture", "lab" ], - char: '\ud83e\uddeb', - fitzpatrick_scale: false, - category: "objects" - }, - test_tube: { - keywords: [ "chemistry", "experiment", "lab", "science" ], - char: '\ud83e\uddea', - fitzpatrick_scale: false, - category: "objects" - }, - thermometer: { - keywords: [ "weather", "temperature", "hot", "cold" ], - char: '\ud83c\udf21', - fitzpatrick_scale: false, - category: "objects" - }, - broom: { - keywords: [ "cleaning", "sweeping", "witch" ], - char: '\ud83e\uddf9', - fitzpatrick_scale: false, - category: "objects" - }, - basket: { - keywords: [ "laundry" ], - char: '\ud83e\uddfa', - fitzpatrick_scale: false, - category: "objects" - }, - toilet_paper: { - keywords: [ "roll" ], - char: '\ud83e\uddfb', - fitzpatrick_scale: false, - category: "objects" - }, - label: { - keywords: [ "sale", "tag" ], - char: '\ud83c\udff7', - fitzpatrick_scale: false, - category: "objects" - }, - bookmark: { - keywords: [ "favorite", "label", "save" ], - char: '\ud83d\udd16', - fitzpatrick_scale: false, - category: "objects" - }, - toilet: { - keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ], - char: '\ud83d\udebd', - fitzpatrick_scale: false, - category: "objects" - }, - shower: { - keywords: [ "clean", "water", "bathroom" ], - char: '\ud83d\udebf', - fitzpatrick_scale: false, - category: "objects" - }, - bathtub: { - keywords: [ "clean", "shower", "bathroom" ], - char: '\ud83d\udec1', - fitzpatrick_scale: false, - category: "objects" - }, - soap: { - keywords: [ "bar", "bathing", "cleaning", "lather" ], - char: '\ud83e\uddfc', - fitzpatrick_scale: false, - category: "objects" - }, - sponge: { - keywords: [ "absorbing", "cleaning", "porous" ], - char: '\ud83e\uddfd', - fitzpatrick_scale: false, - category: "objects" - }, - lotion_bottle: { - keywords: [ "moisturizer", "sunscreen" ], - char: '\ud83e\uddf4', - fitzpatrick_scale: false, - category: "objects" - }, - key: { - keywords: [ "lock", "door", "password" ], - char: '\ud83d\udd11', - fitzpatrick_scale: false, - category: "objects" - }, - old_key: { - keywords: [ "lock", "door", "password" ], - char: '\ud83d\udddd', - fitzpatrick_scale: false, - category: "objects" - }, - couch_and_lamp: { - keywords: [ "read", "chill" ], - char: '\ud83d\udecb', - fitzpatrick_scale: false, - category: "objects" - }, - sleeping_bed: { - keywords: [ "bed", "rest" ], - char: '\ud83d\udecc', - fitzpatrick_scale: true, - category: "objects" - }, - bed: { - keywords: [ "sleep", "rest" ], - char: '\ud83d\udecf', - fitzpatrick_scale: false, - category: "objects" - }, - door: { - keywords: [ "house", "entry", "exit" ], - char: '\ud83d\udeaa', - fitzpatrick_scale: false, - category: "objects" - }, - bellhop_bell: { - keywords: [ "service" ], - char: '\ud83d\udece', - fitzpatrick_scale: false, - category: "objects" - }, - teddy_bear: { - keywords: [ "plush", "stuffed" ], - char: '\ud83e\uddf8', - fitzpatrick_scale: false, - category: "objects" - }, - framed_picture: { - keywords: [ "photography" ], - char: '\ud83d\uddbc', - fitzpatrick_scale: false, - category: "objects" - }, - world_map: { - keywords: [ "location", "direction" ], - char: '\ud83d\uddfa', - fitzpatrick_scale: false, - category: "objects" - }, - parasol_on_ground: { - keywords: [ "weather", "summer" ], - char: '\u26f1', - fitzpatrick_scale: false, - category: "objects" - }, - moyai: { - keywords: [ "rock", "easter island", "moai" ], - char: '\ud83d\uddff', - fitzpatrick_scale: false, - category: "objects" - }, - shopping: { - keywords: [ "mall", "buy", "purchase" ], - char: '\ud83d\udecd', - fitzpatrick_scale: false, - category: "objects" - }, - shopping_cart: { - keywords: [ "trolley" ], - char: '\ud83d\uded2', - fitzpatrick_scale: false, - category: "objects" - }, - balloon: { - keywords: [ "party", "celebration", "birthday", "circus" ], - char: '\ud83c\udf88', - fitzpatrick_scale: false, - category: "objects" - }, - flags: { - keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ], - char: '\ud83c\udf8f', - fitzpatrick_scale: false, - category: "objects" - }, - ribbon: { - keywords: [ "decoration", "pink", "girl", "bowtie" ], - char: '\ud83c\udf80', - fitzpatrick_scale: false, - category: "objects" - }, - gift: { - keywords: [ "present", "birthday", "christmas", "xmas" ], - char: '\ud83c\udf81', - fitzpatrick_scale: false, - category: "objects" - }, - confetti_ball: { - keywords: [ "festival", "party", "birthday", "circus" ], - char: '\ud83c\udf8a', - fitzpatrick_scale: false, - category: "objects" - }, - tada: { - keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ], - char: '\ud83c\udf89', - fitzpatrick_scale: false, - category: "objects" - }, - dolls: { - keywords: [ "japanese", "toy", "kimono" ], - char: '\ud83c\udf8e', - fitzpatrick_scale: false, - category: "objects" - }, - wind_chime: { - keywords: [ "nature", "ding", "spring", "bell" ], - char: '\ud83c\udf90', - fitzpatrick_scale: false, - category: "objects" - }, - crossed_flags: { - keywords: [ "japanese", "nation", "country", "border" ], - char: '\ud83c\udf8c', - fitzpatrick_scale: false, - category: "objects" - }, - izakaya_lantern: { - keywords: [ "light", "paper", "halloween", "spooky" ], - char: '\ud83c\udfee', - fitzpatrick_scale: false, - category: "objects" - }, - red_envelope: { - keywords: [ "gift" ], - char: '\ud83e\udde7', - fitzpatrick_scale: false, - category: "objects" - }, - email: { - keywords: [ "letter", "postal", "inbox", "communication" ], - char: '\u2709\ufe0f', - fitzpatrick_scale: false, - category: "objects" - }, - envelope_with_arrow: { - keywords: [ "email", "communication" ], - char: '\ud83d\udce9', - fitzpatrick_scale: false, - category: "objects" - }, - incoming_envelope: { - keywords: [ "email", "inbox" ], - char: '\ud83d\udce8', - fitzpatrick_scale: false, - category: "objects" - }, - "e-mail": { - keywords: [ "communication", "inbox" ], - char: '\ud83d\udce7', - fitzpatrick_scale: false, - category: "objects" - }, - love_letter: { - keywords: [ "email", "like", "affection", "envelope", "valentines" ], - char: '\ud83d\udc8c', - fitzpatrick_scale: false, - category: "objects" - }, - postbox: { - keywords: [ "email", "letter", "envelope" ], - char: '\ud83d\udcee', - fitzpatrick_scale: false, - category: "objects" - }, - mailbox_closed: { - keywords: [ "email", "communication", "inbox" ], - char: '\ud83d\udcea', - fitzpatrick_scale: false, - category: "objects" - }, - mailbox: { - keywords: [ "email", "inbox", "communication" ], - char: '\ud83d\udceb', - fitzpatrick_scale: false, - category: "objects" - }, - mailbox_with_mail: { - keywords: [ "email", "inbox", "communication" ], - char: '\ud83d\udcec', - fitzpatrick_scale: false, - category: "objects" - }, - mailbox_with_no_mail: { - keywords: [ "email", "inbox" ], - char: '\ud83d\udced', - fitzpatrick_scale: false, - category: "objects" - }, - package: { - keywords: [ "mail", "gift", "cardboard", "box", "moving" ], - char: '\ud83d\udce6', - fitzpatrick_scale: false, - category: "objects" - }, - postal_horn: { - keywords: [ "instrument", "music" ], - char: '\ud83d\udcef', - fitzpatrick_scale: false, - category: "objects" - }, - inbox_tray: { - keywords: [ "email", "documents" ], - char: '\ud83d\udce5', - fitzpatrick_scale: false, - category: "objects" - }, - outbox_tray: { - keywords: [ "inbox", "email" ], - char: '\ud83d\udce4', - fitzpatrick_scale: false, - category: "objects" - }, - scroll: { - keywords: [ "documents", "ancient", "history", "paper" ], - char: '\ud83d\udcdc', - fitzpatrick_scale: false, - category: "objects" - }, - page_with_curl: { - keywords: [ "documents", "office", "paper" ], - char: '\ud83d\udcc3', - fitzpatrick_scale: false, - category: "objects" - }, - bookmark_tabs: { - keywords: [ "favorite", "save", "order", "tidy" ], - char: '\ud83d\udcd1', - fitzpatrick_scale: false, - category: "objects" - }, - receipt: { - keywords: [ "accounting", "expenses" ], - char: '\ud83e\uddfe', - fitzpatrick_scale: false, - category: "objects" - }, - bar_chart: { - keywords: [ "graph", "presentation", "stats" ], - char: '\ud83d\udcca', - fitzpatrick_scale: false, - category: "objects" - }, - chart_with_upwards_trend: { - keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ], - char: '\ud83d\udcc8', - fitzpatrick_scale: false, - category: "objects" - }, - chart_with_downwards_trend: { - keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ], - char: '\ud83d\udcc9', - fitzpatrick_scale: false, - category: "objects" - }, - page_facing_up: { - keywords: [ "documents", "office", "paper", "information" ], - char: '\ud83d\udcc4', - fitzpatrick_scale: false, - category: "objects" - }, - date: { - keywords: [ "calendar", "schedule" ], - char: '\ud83d\udcc5', - fitzpatrick_scale: false, - category: "objects" - }, - calendar: { - keywords: [ "schedule", "date", "planning" ], - char: '\ud83d\udcc6', - fitzpatrick_scale: false, - category: "objects" - }, - spiral_calendar: { - keywords: [ "date", "schedule", "planning" ], - char: '\ud83d\uddd3', - fitzpatrick_scale: false, - category: "objects" - }, - card_index: { - keywords: [ "business", "stationery" ], - char: '\ud83d\udcc7', - fitzpatrick_scale: false, - category: "objects" - }, - card_file_box: { - keywords: [ "business", "stationery" ], - char: '\ud83d\uddc3', - fitzpatrick_scale: false, - category: "objects" - }, - ballot_box: { - keywords: [ "election", "vote" ], - char: '\ud83d\uddf3', - fitzpatrick_scale: false, - category: "objects" - }, - file_cabinet: { - keywords: [ "filing", "organizing" ], - char: '\ud83d\uddc4', - fitzpatrick_scale: false, - category: "objects" - }, - clipboard: { - keywords: [ "stationery", "documents" ], - char: '\ud83d\udccb', - fitzpatrick_scale: false, - category: "objects" - }, - spiral_notepad: { - keywords: [ "memo", "stationery" ], - char: '\ud83d\uddd2', - fitzpatrick_scale: false, - category: "objects" - }, - file_folder: { - keywords: [ "documents", "business", "office" ], - char: '\ud83d\udcc1', - fitzpatrick_scale: false, - category: "objects" - }, - open_file_folder: { - keywords: [ "documents", "load" ], - char: '\ud83d\udcc2', - fitzpatrick_scale: false, - category: "objects" - }, - card_index_dividers: { - keywords: [ "organizing", "business", "stationery" ], - char: '\ud83d\uddc2', - fitzpatrick_scale: false, - category: "objects" - }, - newspaper_roll: { - keywords: [ "press", "headline" ], - char: '\ud83d\uddde', - fitzpatrick_scale: false, - category: "objects" - }, - newspaper: { - keywords: [ "press", "headline" ], - char: '\ud83d\udcf0', - fitzpatrick_scale: false, - category: "objects" - }, - notebook: { - keywords: [ "stationery", "record", "notes", "paper", "study" ], - char: '\ud83d\udcd3', - fitzpatrick_scale: false, - category: "objects" - }, - closed_book: { - keywords: [ "read", "library", "knowledge", "textbook", "learn" ], - char: '\ud83d\udcd5', - fitzpatrick_scale: false, - category: "objects" - }, - green_book: { - keywords: [ "read", "library", "knowledge", "study" ], - char: '\ud83d\udcd7', - fitzpatrick_scale: false, - category: "objects" - }, - blue_book: { - keywords: [ "read", "library", "knowledge", "learn", "study" ], - char: '\ud83d\udcd8', - fitzpatrick_scale: false, - category: "objects" - }, - orange_book: { - keywords: [ "read", "library", "knowledge", "textbook", "study" ], - char: '\ud83d\udcd9', - fitzpatrick_scale: false, - category: "objects" - }, - notebook_with_decorative_cover: { - keywords: [ "classroom", "notes", "record", "paper", "study" ], - char: '\ud83d\udcd4', - fitzpatrick_scale: false, - category: "objects" - }, - ledger: { - keywords: [ "notes", "paper" ], - char: '\ud83d\udcd2', - fitzpatrick_scale: false, - category: "objects" - }, - books: { - keywords: [ "literature", "library", "study" ], - char: '\ud83d\udcda', - fitzpatrick_scale: false, - category: "objects" - }, - open_book: { - keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ], - char: '\ud83d\udcd6', - fitzpatrick_scale: false, - category: "objects" - }, - safety_pin: { - keywords: [ "diaper" ], - char: '\ud83e\uddf7', - fitzpatrick_scale: false, - category: "objects" - }, - link: { - keywords: [ "rings", "url" ], - char: '\ud83d\udd17', - fitzpatrick_scale: false, - category: "objects" - }, - paperclip: { - keywords: [ "documents", "stationery" ], - char: '\ud83d\udcce', - fitzpatrick_scale: false, - category: "objects" - }, - paperclips: { - keywords: [ "documents", "stationery" ], - char: '\ud83d\udd87', - fitzpatrick_scale: false, - category: "objects" - }, - scissors: { - keywords: [ "stationery", "cut" ], - char: '\u2702\ufe0f', - fitzpatrick_scale: false, - category: "objects" - }, - triangular_ruler: { - keywords: [ "stationery", "math", "architect", "sketch" ], - char: '\ud83d\udcd0', - fitzpatrick_scale: false, - category: "objects" - }, - straight_ruler: { - keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ], - char: '\ud83d\udccf', - fitzpatrick_scale: false, - category: "objects" - }, - abacus: { - keywords: [ "calculation" ], - char: '\ud83e\uddee', - fitzpatrick_scale: false, - category: "objects" - }, - pushpin: { - keywords: [ "stationery", "mark", "here" ], - char: '\ud83d\udccc', - fitzpatrick_scale: false, - category: "objects" - }, - round_pushpin: { - keywords: [ "stationery", "location", "map", "here" ], - char: '\ud83d\udccd', - fitzpatrick_scale: false, - category: "objects" - }, - triangular_flag_on_post: { - keywords: [ "mark", "milestone", "place" ], - char: '\ud83d\udea9', - fitzpatrick_scale: false, - category: "objects" - }, - white_flag: { - keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ], - char: '\ud83c\udff3', - fitzpatrick_scale: false, - category: "objects" - }, - black_flag: { - keywords: [ "pirate" ], - char: '\ud83c\udff4', - fitzpatrick_scale: false, - category: "objects" - }, - rainbow_flag: { - keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ], - char: '\ud83c\udff3\ufe0f\u200d\ud83c\udf08', - fitzpatrick_scale: false, - category: "objects" - }, - closed_lock_with_key: { - keywords: [ "security", "privacy" ], - char: '\ud83d\udd10', - fitzpatrick_scale: false, - category: "objects" - }, - lock: { - keywords: [ "security", "password", "padlock" ], - char: '\ud83d\udd12', - fitzpatrick_scale: false, - category: "objects" - }, - unlock: { - keywords: [ "privacy", "security" ], - char: '\ud83d\udd13', - fitzpatrick_scale: false, - category: "objects" - }, - lock_with_ink_pen: { - keywords: [ "security", "secret" ], - char: '\ud83d\udd0f', - fitzpatrick_scale: false, - category: "objects" - }, - pen: { - keywords: [ "stationery", "writing", "write" ], - char: '\ud83d\udd8a', - fitzpatrick_scale: false, - category: "objects" - }, - fountain_pen: { - keywords: [ "stationery", "writing", "write" ], - char: '\ud83d\udd8b', - fitzpatrick_scale: false, - category: "objects" - }, - black_nib: { - keywords: [ "pen", "stationery", "writing", "write" ], - char: '\u2712\ufe0f', - fitzpatrick_scale: false, - category: "objects" - }, - memo: { - keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ], - char: '\ud83d\udcdd', - fitzpatrick_scale: false, - category: "objects" - }, - pencil2: { - keywords: [ "stationery", "write", "paper", "writing", "school", "study" ], - char: '\u270f\ufe0f', - fitzpatrick_scale: false, - category: "objects" - }, - crayon: { - keywords: [ "drawing", "creativity" ], - char: '\ud83d\udd8d', - fitzpatrick_scale: false, - category: "objects" - }, - paintbrush: { - keywords: [ "drawing", "creativity", "art" ], - char: '\ud83d\udd8c', - fitzpatrick_scale: false, - category: "objects" - }, - mag: { - keywords: [ "search", "zoom", "find", "detective" ], - char: '\ud83d\udd0d', - fitzpatrick_scale: false, - category: "objects" - }, - mag_right: { - keywords: [ "search", "zoom", "find", "detective" ], - char: '\ud83d\udd0e', - fitzpatrick_scale: false, - category: "objects" - }, - heart: { - keywords: [ "love", "like", "valentines" ], - char: '\u2764\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - orange_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: '\ud83e\udde1', - fitzpatrick_scale: false, - category: "symbols" - }, - yellow_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: '\ud83d\udc9b', - fitzpatrick_scale: false, - category: "symbols" - }, - green_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: '\ud83d\udc9a', - fitzpatrick_scale: false, - category: "symbols" - }, - blue_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: '\ud83d\udc99', - fitzpatrick_scale: false, - category: "symbols" - }, - purple_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: '\ud83d\udc9c', - fitzpatrick_scale: false, - category: "symbols" - }, - black_heart: { - keywords: [ "evil" ], - char: '\ud83d\udda4', - fitzpatrick_scale: false, - category: "symbols" - }, - broken_heart: { - keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ], - char: '\ud83d\udc94', - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_heart_exclamation: { - keywords: [ "decoration", "love" ], - char: '\u2763', - fitzpatrick_scale: false, - category: "symbols" - }, - two_hearts: { - keywords: [ "love", "like", "affection", "valentines", "heart" ], - char: '\ud83d\udc95', - fitzpatrick_scale: false, - category: "symbols" - }, - revolving_hearts: { - keywords: [ "love", "like", "affection", "valentines" ], - char: '\ud83d\udc9e', - fitzpatrick_scale: false, - category: "symbols" - }, - heartbeat: { - keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ], - char: '\ud83d\udc93', - fitzpatrick_scale: false, - category: "symbols" - }, - heartpulse: { - keywords: [ "like", "love", "affection", "valentines", "pink" ], - char: '\ud83d\udc97', - fitzpatrick_scale: false, - category: "symbols" - }, - sparkling_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: '\ud83d\udc96', - fitzpatrick_scale: false, - category: "symbols" - }, - cupid: { - keywords: [ "love", "like", "heart", "affection", "valentines" ], - char: '\ud83d\udc98', - fitzpatrick_scale: false, - category: "symbols" - }, - gift_heart: { - keywords: [ "love", "valentines" ], - char: '\ud83d\udc9d', - fitzpatrick_scale: false, - category: "symbols" - }, - heart_decoration: { - keywords: [ "purple-square", "love", "like" ], - char: '\ud83d\udc9f', - fitzpatrick_scale: false, - category: "symbols" - }, - peace_symbol: { - keywords: [ "hippie" ], - char: '\u262e', - fitzpatrick_scale: false, - category: "symbols" - }, - latin_cross: { - keywords: [ "christianity" ], - char: '\u271d', - fitzpatrick_scale: false, - category: "symbols" - }, - star_and_crescent: { - keywords: [ "islam" ], - char: '\u262a', - fitzpatrick_scale: false, - category: "symbols" - }, - om: { - keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], - char: '\ud83d\udd49', - fitzpatrick_scale: false, - category: "symbols" - }, - wheel_of_dharma: { - keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], - char: '\u2638', - fitzpatrick_scale: false, - category: "symbols" - }, - star_of_david: { - keywords: [ "judaism" ], - char: '\u2721', - fitzpatrick_scale: false, - category: "symbols" - }, - six_pointed_star: { - keywords: [ "purple-square", "religion", "jewish", "hexagram" ], - char: '\ud83d\udd2f', - fitzpatrick_scale: false, - category: "symbols" - }, - menorah: { - keywords: [ "hanukkah", "candles", "jewish" ], - char: '\ud83d\udd4e', - fitzpatrick_scale: false, - category: "symbols" - }, - yin_yang: { - keywords: [ "balance" ], - char: '\u262f', - fitzpatrick_scale: false, - category: "symbols" - }, - orthodox_cross: { - keywords: [ "suppedaneum", "religion" ], - char: '\u2626', - fitzpatrick_scale: false, - category: "symbols" - }, - place_of_worship: { - keywords: [ "religion", "church", "temple", "prayer" ], - char: '\ud83d\uded0', - fitzpatrick_scale: false, - category: "symbols" - }, - ophiuchus: { - keywords: [ "sign", "purple-square", "constellation", "astrology" ], - char: '\u26ce', - fitzpatrick_scale: false, - category: "symbols" - }, - aries: { - keywords: [ "sign", "purple-square", "zodiac", "astrology" ], - char: '\u2648', - fitzpatrick_scale: false, - category: "symbols" - }, - taurus: { - keywords: [ "purple-square", "sign", "zodiac", "astrology" ], - char: '\u2649', - fitzpatrick_scale: false, - category: "symbols" - }, - gemini: { - keywords: [ "sign", "zodiac", "purple-square", "astrology" ], - char: '\u264a', - fitzpatrick_scale: false, - category: "symbols" - }, - cancer: { - keywords: [ "sign", "zodiac", "purple-square", "astrology" ], - char: '\u264b', - fitzpatrick_scale: false, - category: "symbols" - }, - leo: { - keywords: [ "sign", "purple-square", "zodiac", "astrology" ], - char: '\u264c', - fitzpatrick_scale: false, - category: "symbols" - }, - virgo: { - keywords: [ "sign", "zodiac", "purple-square", "astrology" ], - char: '\u264d', - fitzpatrick_scale: false, - category: "symbols" - }, - libra: { - keywords: [ "sign", "purple-square", "zodiac", "astrology" ], - char: '\u264e', - fitzpatrick_scale: false, - category: "symbols" - }, - scorpius: { - keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ], - char: '\u264f', - fitzpatrick_scale: false, - category: "symbols" - }, - sagittarius: { - keywords: [ "sign", "zodiac", "purple-square", "astrology" ], - char: '\u2650', - fitzpatrick_scale: false, - category: "symbols" - }, - capricorn: { - keywords: [ "sign", "zodiac", "purple-square", "astrology" ], - char: '\u2651', - fitzpatrick_scale: false, - category: "symbols" - }, - aquarius: { - keywords: [ "sign", "purple-square", "zodiac", "astrology" ], - char: '\u2652', - fitzpatrick_scale: false, - category: "symbols" - }, - pisces: { - keywords: [ "purple-square", "sign", "zodiac", "astrology" ], - char: '\u2653', - fitzpatrick_scale: false, - category: "symbols" - }, - id: { - keywords: [ "purple-square", "words" ], - char: '\ud83c\udd94', - fitzpatrick_scale: false, - category: "symbols" - }, - atom_symbol: { - keywords: [ "science", "physics", "chemistry" ], - char: '\u269b', - fitzpatrick_scale: false, - category: "symbols" - }, - u7a7a: { - keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ], - char: '\ud83c\ude33', - fitzpatrick_scale: false, - category: "symbols" - }, - u5272: { - keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ], - char: '\ud83c\ude39', - fitzpatrick_scale: false, - category: "symbols" - }, - radioactive: { - keywords: [ "nuclear", "danger" ], - char: '\u2622', - fitzpatrick_scale: false, - category: "symbols" - }, - biohazard: { - keywords: [ "danger" ], - char: '\u2623', - fitzpatrick_scale: false, - category: "symbols" - }, - mobile_phone_off: { - keywords: [ "mute", "orange-square", "silence", "quiet" ], - char: '\ud83d\udcf4', - fitzpatrick_scale: false, - category: "symbols" - }, - vibration_mode: { - keywords: [ "orange-square", "phone" ], - char: '\ud83d\udcf3', - fitzpatrick_scale: false, - category: "symbols" - }, - u6709: { - keywords: [ "orange-square", "chinese", "have", "kanji" ], - char: '\ud83c\ude36', - fitzpatrick_scale: false, - category: "symbols" - }, - u7121: { - keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ], - char: '\ud83c\ude1a', - fitzpatrick_scale: false, - category: "symbols" - }, - u7533: { - keywords: [ "chinese", "japanese", "kanji", "orange-square" ], - char: '\ud83c\ude38', - fitzpatrick_scale: false, - category: "symbols" - }, - u55b6: { - keywords: [ "japanese", "opening hours", "orange-square" ], - char: '\ud83c\ude3a', - fitzpatrick_scale: false, - category: "symbols" - }, - u6708: { - keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ], - char: '\ud83c\ude37\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - eight_pointed_black_star: { - keywords: [ "orange-square", "shape", "polygon" ], - char: '\u2734\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - vs: { - keywords: [ "words", "orange-square" ], - char: '\ud83c\udd9a', - fitzpatrick_scale: false, - category: "symbols" - }, - accept: { - keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ], - char: '\ud83c\ude51', - fitzpatrick_scale: false, - category: "symbols" - }, - white_flower: { - keywords: [ "japanese", "spring" ], - char: '\ud83d\udcae', - fitzpatrick_scale: false, - category: "symbols" - }, - ideograph_advantage: { - keywords: [ "chinese", "kanji", "obtain", "get", "circle" ], - char: '\ud83c\ude50', - fitzpatrick_scale: false, - category: "symbols" - }, - secret: { - keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ], - char: '\u3299\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - congratulations: { - keywords: [ "chinese", "kanji", "japanese", "red-circle" ], - char: '\u3297\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - u5408: { - keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ], - char: '\ud83c\ude34', - fitzpatrick_scale: false, - category: "symbols" - }, - u6e80: { - keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ], - char: '\ud83c\ude35', - fitzpatrick_scale: false, - category: "symbols" - }, - u7981: { - keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ], - char: '\ud83c\ude32', - fitzpatrick_scale: false, - category: "symbols" - }, - a: { - keywords: [ "red-square", "alphabet", "letter" ], - char: '\ud83c\udd70\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - b: { - keywords: [ "red-square", "alphabet", "letter" ], - char: '\ud83c\udd71\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - ab: { - keywords: [ "red-square", "alphabet" ], - char: '\ud83c\udd8e', - fitzpatrick_scale: false, - category: "symbols" - }, - cl: { - keywords: [ "alphabet", "words", "red-square" ], - char: '\ud83c\udd91', - fitzpatrick_scale: false, - category: "symbols" - }, - o2: { - keywords: [ "alphabet", "red-square", "letter" ], - char: '\ud83c\udd7e\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - sos: { - keywords: [ "help", "red-square", "words", "emergency", "911" ], - char: '\ud83c\udd98', - fitzpatrick_scale: false, - category: "symbols" - }, - no_entry: { - keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ], - char: '\u26d4', - fitzpatrick_scale: false, - category: "symbols" - }, - name_badge: { - keywords: [ "fire", "forbid" ], - char: '\ud83d\udcdb', - fitzpatrick_scale: false, - category: "symbols" - }, - no_entry_sign: { - keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ], - char: '\ud83d\udeab', - fitzpatrick_scale: false, - category: "symbols" - }, - x: { - keywords: [ "no", "delete", "remove", "cancel", "red" ], - char: '\u274c', - fitzpatrick_scale: false, - category: "symbols" - }, - o: { - keywords: [ "circle", "round" ], - char: '\u2b55', - fitzpatrick_scale: false, - category: "symbols" - }, - stop_sign: { - keywords: [ "stop" ], - char: '\ud83d\uded1', - fitzpatrick_scale: false, - category: "symbols" - }, - anger: { - keywords: [ "angry", "mad" ], - char: '\ud83d\udca2', - fitzpatrick_scale: false, - category: "symbols" - }, - hotsprings: { - keywords: [ "bath", "warm", "relax" ], - char: '\u2668\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - no_pedestrians: { - keywords: [ "rules", "crossing", "walking", "circle" ], - char: '\ud83d\udeb7', - fitzpatrick_scale: false, - category: "symbols" - }, - do_not_litter: { - keywords: [ "trash", "bin", "garbage", "circle" ], - char: '\ud83d\udeaf', - fitzpatrick_scale: false, - category: "symbols" - }, - no_bicycles: { - keywords: [ "cyclist", "prohibited", "circle" ], - char: '\ud83d\udeb3', - fitzpatrick_scale: false, - category: "symbols" - }, - "non-potable_water": { - keywords: [ "drink", "faucet", "tap", "circle" ], - char: '\ud83d\udeb1', - fitzpatrick_scale: false, - category: "symbols" - }, - underage: { - keywords: [ "18", "drink", "pub", "night", "minor", "circle" ], - char: '\ud83d\udd1e', - fitzpatrick_scale: false, - category: "symbols" - }, - no_mobile_phones: { - keywords: [ "iphone", "mute", "circle" ], - char: '\ud83d\udcf5', - fitzpatrick_scale: false, - category: "symbols" - }, - exclamation: { - keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ], - char: '\u2757', - fitzpatrick_scale: false, - category: "symbols" - }, - grey_exclamation: { - keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ], - char: '\u2755', - fitzpatrick_scale: false, - category: "symbols" - }, - question: { - keywords: [ "doubt", "confused" ], - char: '\u2753', - fitzpatrick_scale: false, - category: "symbols" - }, - grey_question: { - keywords: [ "doubts", "gray", "huh", "confused" ], - char: '\u2754', - fitzpatrick_scale: false, - category: "symbols" - }, - bangbang: { - keywords: [ "exclamation", "surprise" ], - char: '\u203c\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - interrobang: { - keywords: [ "wat", "punctuation", "surprise" ], - char: '\u2049\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - low_brightness: { - keywords: [ "sun", "afternoon", "warm", "summer" ], - char: '\ud83d\udd05', - fitzpatrick_scale: false, - category: "symbols" - }, - high_brightness: { - keywords: [ "sun", "light" ], - char: '\ud83d\udd06', - fitzpatrick_scale: false, - category: "symbols" - }, - trident: { - keywords: [ "weapon", "spear" ], - char: '\ud83d\udd31', - fitzpatrick_scale: false, - category: "symbols" - }, - fleur_de_lis: { - keywords: [ "decorative", "scout" ], - char: '\u269c', - fitzpatrick_scale: false, - category: "symbols" - }, - part_alternation_mark: { - keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ], - char: '\u303d\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - warning: { - keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ], - char: '\u26a0\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - children_crossing: { - keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ], - char: '\ud83d\udeb8', - fitzpatrick_scale: false, - category: "symbols" - }, - beginner: { - keywords: [ "badge", "shield" ], - char: '\ud83d\udd30', - fitzpatrick_scale: false, - category: "symbols" - }, - recycle: { - keywords: [ "arrow", "environment", "garbage", "trash" ], - char: '\u267b\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - u6307: { - keywords: [ "chinese", "point", "green-square", "kanji" ], - char: '\ud83c\ude2f', - fitzpatrick_scale: false, - category: "symbols" - }, - chart: { - keywords: [ "green-square", "graph", "presentation", "stats" ], - char: '\ud83d\udcb9', - fitzpatrick_scale: false, - category: "symbols" - }, - sparkle: { - keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ], - char: '\u2747\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - eight_spoked_asterisk: { - keywords: [ "star", "sparkle", "green-square" ], - char: '\u2733\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - negative_squared_cross_mark: { - keywords: [ "x", "green-square", "no", "deny" ], - char: '\u274e', - fitzpatrick_scale: false, - category: "symbols" - }, - white_check_mark: { - keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ], - char: '\u2705', - fitzpatrick_scale: false, - category: "symbols" - }, - diamond_shape_with_a_dot_inside: { - keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ], - char: '\ud83d\udca0', - fitzpatrick_scale: false, - category: "symbols" - }, - cyclone: { - keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ], - char: '\ud83c\udf00', - fitzpatrick_scale: false, - category: "symbols" - }, - loop: { - keywords: [ "tape", "cassette" ], - char: '\u27bf', - fitzpatrick_scale: false, - category: "symbols" - }, - globe_with_meridians: { - keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ], - char: '\ud83c\udf10', - fitzpatrick_scale: false, - category: "symbols" - }, - m: { - keywords: [ "alphabet", "blue-circle", "letter" ], - char: '\u24c2\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - atm: { - keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ], - char: '\ud83c\udfe7', - fitzpatrick_scale: false, - category: "symbols" - }, - sa: { - keywords: [ "japanese", "blue-square", "katakana" ], - char: '\ud83c\ude02\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - passport_control: { - keywords: [ "custom", "blue-square" ], - char: '\ud83d\udec2', - fitzpatrick_scale: false, - category: "symbols" - }, - customs: { - keywords: [ "passport", "border", "blue-square" ], - char: '\ud83d\udec3', - fitzpatrick_scale: false, - category: "symbols" - }, - baggage_claim: { - keywords: [ "blue-square", "airport", "transport" ], - char: '\ud83d\udec4', - fitzpatrick_scale: false, - category: "symbols" - }, - left_luggage: { - keywords: [ "blue-square", "travel" ], - char: '\ud83d\udec5', - fitzpatrick_scale: false, - category: "symbols" - }, - wheelchair: { - keywords: [ "blue-square", "disabled", "a11y", "accessibility" ], - char: '\u267f', - fitzpatrick_scale: false, - category: "symbols" - }, - no_smoking: { - keywords: [ "cigarette", "blue-square", "smell", "smoke" ], - char: '\ud83d\udead', - fitzpatrick_scale: false, - category: "symbols" - }, - wc: { - keywords: [ "toilet", "restroom", "blue-square" ], - char: '\ud83d\udebe', - fitzpatrick_scale: false, - category: "symbols" - }, - parking: { - keywords: [ "cars", "blue-square", "alphabet", "letter" ], - char: '\ud83c\udd7f\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - potable_water: { - keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ], - char: '\ud83d\udeb0', - fitzpatrick_scale: false, - category: "symbols" - }, - mens: { - keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ], - char: '\ud83d\udeb9', - fitzpatrick_scale: false, - category: "symbols" - }, - womens: { - keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ], - char: '\ud83d\udeba', - fitzpatrick_scale: false, - category: "symbols" - }, - baby_symbol: { - keywords: [ "orange-square", "child" ], - char: '\ud83d\udebc', - fitzpatrick_scale: false, - category: "symbols" - }, - restroom: { - keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ], - char: '\ud83d\udebb', - fitzpatrick_scale: false, - category: "symbols" - }, - put_litter_in_its_place: { - keywords: [ "blue-square", "sign", "human", "info" ], - char: '\ud83d\udeae', - fitzpatrick_scale: false, - category: "symbols" - }, - cinema: { - keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ], - char: '\ud83c\udfa6', - fitzpatrick_scale: false, - category: "symbols" - }, - signal_strength: { - keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ], - char: '\ud83d\udcf6', - fitzpatrick_scale: false, - category: "symbols" - }, - koko: { - keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ], - char: '\ud83c\ude01', - fitzpatrick_scale: false, - category: "symbols" - }, - ng: { - keywords: [ "blue-square", "words", "shape", "icon" ], - char: '\ud83c\udd96', - fitzpatrick_scale: false, - category: "symbols" - }, - ok: { - keywords: [ "good", "agree", "yes", "blue-square" ], - char: '\ud83c\udd97', - fitzpatrick_scale: false, - category: "symbols" - }, - up: { - keywords: [ "blue-square", "above", "high" ], - char: '\ud83c\udd99', - fitzpatrick_scale: false, - category: "symbols" - }, - cool: { - keywords: [ "words", "blue-square" ], - char: '\ud83c\udd92', - fitzpatrick_scale: false, - category: "symbols" - }, - new: { - keywords: [ "blue-square", "words", "start" ], - char: '\ud83c\udd95', - fitzpatrick_scale: false, - category: "symbols" - }, - free: { - keywords: [ "blue-square", "words" ], - char: '\ud83c\udd93', - fitzpatrick_scale: false, - category: "symbols" - }, - zero: { - keywords: [ "0", "numbers", "blue-square", "null" ], - char: '0\ufe0f\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - one: { - keywords: [ "blue-square", "numbers", "1" ], - char: '1\ufe0f\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - two: { - keywords: [ "numbers", "2", "prime", "blue-square" ], - char: '2\ufe0f\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - three: { - keywords: [ "3", "numbers", "prime", "blue-square" ], - char: '3\ufe0f\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - four: { - keywords: [ "4", "numbers", "blue-square" ], - char: '4\ufe0f\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - five: { - keywords: [ "5", "numbers", "blue-square", "prime" ], - char: '5\ufe0f\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - six: { - keywords: [ "6", "numbers", "blue-square" ], - char: '6\ufe0f\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - seven: { - keywords: [ "7", "numbers", "blue-square", "prime" ], - char: '7\ufe0f\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - eight: { - keywords: [ "8", "blue-square", "numbers" ], - char: '8\ufe0f\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - nine: { - keywords: [ "blue-square", "numbers", "9" ], - char: '9\ufe0f\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - keycap_ten: { - keywords: [ "numbers", "10", "blue-square" ], - char: '\ud83d\udd1f', - fitzpatrick_scale: false, - category: "symbols" - }, - asterisk: { - keywords: [ "star", "keycap" ], - char: '*\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - eject_button: { - keywords: [ "blue-square" ], - char: '\u23cf\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_forward: { - keywords: [ "blue-square", "right", "direction", "play" ], - char: '\u25b6\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - pause_button: { - keywords: [ "pause", "blue-square" ], - char: '\u23f8', - fitzpatrick_scale: false, - category: "symbols" - }, - next_track_button: { - keywords: [ "forward", "next", "blue-square" ], - char: '\u23ed', - fitzpatrick_scale: false, - category: "symbols" - }, - stop_button: { - keywords: [ "blue-square" ], - char: '\u23f9', - fitzpatrick_scale: false, - category: "symbols" - }, - record_button: { - keywords: [ "blue-square" ], - char: '\u23fa', - fitzpatrick_scale: false, - category: "symbols" - }, - play_or_pause_button: { - keywords: [ "blue-square", "play", "pause" ], - char: '\u23ef', - fitzpatrick_scale: false, - category: "symbols" - }, - previous_track_button: { - keywords: [ "backward" ], - char: '\u23ee', - fitzpatrick_scale: false, - category: "symbols" - }, - fast_forward: { - keywords: [ "blue-square", "play", "speed", "continue" ], - char: '\u23e9', - fitzpatrick_scale: false, - category: "symbols" - }, - rewind: { - keywords: [ "play", "blue-square" ], - char: '\u23ea', - fitzpatrick_scale: false, - category: "symbols" - }, - twisted_rightwards_arrows: { - keywords: [ "blue-square", "shuffle", "music", "random" ], - char: '\ud83d\udd00', - fitzpatrick_scale: false, - category: "symbols" - }, - repeat: { - keywords: [ "loop", "record" ], - char: '\ud83d\udd01', - fitzpatrick_scale: false, - category: "symbols" - }, - repeat_one: { - keywords: [ "blue-square", "loop" ], - char: '\ud83d\udd02', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_backward: { - keywords: [ "blue-square", "left", "direction" ], - char: '\u25c0\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_up_small: { - keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ], - char: '\ud83d\udd3c', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_down_small: { - keywords: [ "blue-square", "direction", "bottom" ], - char: '\ud83d\udd3d', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_double_up: { - keywords: [ "blue-square", "direction", "top" ], - char: '\u23eb', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_double_down: { - keywords: [ "blue-square", "direction", "bottom" ], - char: '\u23ec', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_right: { - keywords: [ "blue-square", "next" ], - char: '\u27a1\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_left: { - keywords: [ "blue-square", "previous", "back" ], - char: '\u2b05\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_up: { - keywords: [ "blue-square", "continue", "top", "direction" ], - char: '\u2b06\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_down: { - keywords: [ "blue-square", "direction", "bottom" ], - char: '\u2b07\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_upper_right: { - keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ], - char: '\u2197\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_lower_right: { - keywords: [ "blue-square", "direction", "diagonal", "southeast" ], - char: '\u2198\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_lower_left: { - keywords: [ "blue-square", "direction", "diagonal", "southwest" ], - char: '\u2199\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_upper_left: { - keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ], - char: '\u2196\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_up_down: { - keywords: [ "blue-square", "direction", "way", "vertical" ], - char: '\u2195\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - left_right_arrow: { - keywords: [ "shape", "direction", "horizontal", "sideways" ], - char: '\u2194\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrows_counterclockwise: { - keywords: [ "blue-square", "sync", "cycle" ], - char: '\ud83d\udd04', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_right_hook: { - keywords: [ "blue-square", "return", "rotate", "direction" ], - char: '\u21aa\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - leftwards_arrow_with_hook: { - keywords: [ "back", "return", "blue-square", "undo", "enter" ], - char: '\u21a9\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_heading_up: { - keywords: [ "blue-square", "direction", "top" ], - char: '\u2934\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_heading_down: { - keywords: [ "blue-square", "direction", "bottom" ], - char: '\u2935\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - hash: { - keywords: [ "symbol", "blue-square", "twitter" ], - char: '#\ufe0f\u20e3', - fitzpatrick_scale: false, - category: "symbols" - }, - information_source: { - keywords: [ "blue-square", "alphabet", "letter" ], - char: '\u2139\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - abc: { - keywords: [ "blue-square", "alphabet" ], - char: '\ud83d\udd24', - fitzpatrick_scale: false, - category: "symbols" - }, - abcd: { - keywords: [ "blue-square", "alphabet" ], - char: '\ud83d\udd21', - fitzpatrick_scale: false, - category: "symbols" - }, - capital_abcd: { - keywords: [ "alphabet", "words", "blue-square" ], - char: '\ud83d\udd20', - fitzpatrick_scale: false, - category: "symbols" - }, - symbols: { - keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ], - char: '\ud83d\udd23', - fitzpatrick_scale: false, - category: "symbols" - }, - musical_note: { - keywords: [ "score", "tone", "sound" ], - char: '\ud83c\udfb5', - fitzpatrick_scale: false, - category: "symbols" - }, - notes: { - keywords: [ "music", "score" ], - char: '\ud83c\udfb6', - fitzpatrick_scale: false, - category: "symbols" - }, - wavy_dash: { - keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ], - char: '\u3030\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - curly_loop: { - keywords: [ "scribble", "draw", "shape", "squiggle" ], - char: '\u27b0', - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_check_mark: { - keywords: [ "ok", "nike", "answer", "yes", "tick" ], - char: '\u2714\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - arrows_clockwise: { - keywords: [ "sync", "cycle", "round", "repeat" ], - char: '\ud83d\udd03', - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_plus_sign: { - keywords: [ "math", "calculation", "addition", "more", "increase" ], - char: '\u2795', - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_minus_sign: { - keywords: [ "math", "calculation", "subtract", "less" ], - char: '\u2796', - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_division_sign: { - keywords: [ "divide", "math", "calculation" ], - char: '\u2797', - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_multiplication_x: { - keywords: [ "math", "calculation" ], - char: '\u2716\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - infinity: { - keywords: [ "forever" ], - char: '\u267e', - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_dollar_sign: { - keywords: [ "money", "sales", "payment", "currency", "buck" ], - char: '\ud83d\udcb2', - fitzpatrick_scale: false, - category: "symbols" - }, - currency_exchange: { - keywords: [ "money", "sales", "dollar", "travel" ], - char: '\ud83d\udcb1', - fitzpatrick_scale: false, - category: "symbols" - }, - copyright: { - keywords: [ "ip", "license", "circle", "law", "legal" ], - char: '\xa9\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - registered: { - keywords: [ "alphabet", "circle" ], - char: '\xae\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - tm: { - keywords: [ "trademark", "brand", "law", "legal" ], - char: '\u2122\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - end: { - keywords: [ "words", "arrow" ], - char: '\ud83d\udd1a', - fitzpatrick_scale: false, - category: "symbols" - }, - back: { - keywords: [ "arrow", "words", "return" ], - char: '\ud83d\udd19', - fitzpatrick_scale: false, - category: "symbols" - }, - on: { - keywords: [ "arrow", "words" ], - char: '\ud83d\udd1b', - fitzpatrick_scale: false, - category: "symbols" - }, - top: { - keywords: [ "words", "blue-square" ], - char: '\ud83d\udd1d', - fitzpatrick_scale: false, - category: "symbols" - }, - soon: { - keywords: [ "arrow", "words" ], - char: '\ud83d\udd1c', - fitzpatrick_scale: false, - category: "symbols" - }, - ballot_box_with_check: { - keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ], - char: '\u2611\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - radio_button: { - keywords: [ "input", "old", "music", "circle" ], - char: '\ud83d\udd18', - fitzpatrick_scale: false, - category: "symbols" - }, - white_circle: { - keywords: [ "shape", "round" ], - char: '\u26aa', - fitzpatrick_scale: false, - category: "symbols" - }, - black_circle: { - keywords: [ "shape", "button", "round" ], - char: '\u26ab', - fitzpatrick_scale: false, - category: "symbols" - }, - red_circle: { - keywords: [ "shape", "error", "danger" ], - char: '\ud83d\udd34', - fitzpatrick_scale: false, - category: "symbols" - }, - large_blue_circle: { - keywords: [ "shape", "icon", "button" ], - char: '\ud83d\udd35', - fitzpatrick_scale: false, - category: "symbols" - }, - small_orange_diamond: { - keywords: [ "shape", "jewel", "gem" ], - char: '\ud83d\udd38', - fitzpatrick_scale: false, - category: "symbols" - }, - small_blue_diamond: { - keywords: [ "shape", "jewel", "gem" ], - char: '\ud83d\udd39', - fitzpatrick_scale: false, - category: "symbols" - }, - large_orange_diamond: { - keywords: [ "shape", "jewel", "gem" ], - char: '\ud83d\udd36', - fitzpatrick_scale: false, - category: "symbols" - }, - large_blue_diamond: { - keywords: [ "shape", "jewel", "gem" ], - char: '\ud83d\udd37', - fitzpatrick_scale: false, - category: "symbols" - }, - small_red_triangle: { - keywords: [ "shape", "direction", "up", "top" ], - char: '\ud83d\udd3a', - fitzpatrick_scale: false, - category: "symbols" - }, - black_small_square: { - keywords: [ "shape", "icon" ], - char: '\u25aa\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - white_small_square: { - keywords: [ "shape", "icon" ], - char: '\u25ab\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - black_large_square: { - keywords: [ "shape", "icon", "button" ], - char: '\u2b1b', - fitzpatrick_scale: false, - category: "symbols" - }, - white_large_square: { - keywords: [ "shape", "icon", "stone", "button" ], - char: '\u2b1c', - fitzpatrick_scale: false, - category: "symbols" - }, - small_red_triangle_down: { - keywords: [ "shape", "direction", "bottom" ], - char: '\ud83d\udd3b', - fitzpatrick_scale: false, - category: "symbols" - }, - black_medium_square: { - keywords: [ "shape", "button", "icon" ], - char: '\u25fc\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - white_medium_square: { - keywords: [ "shape", "stone", "icon" ], - char: '\u25fb\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - black_medium_small_square: { - keywords: [ "icon", "shape", "button" ], - char: '\u25fe', - fitzpatrick_scale: false, - category: "symbols" - }, - white_medium_small_square: { - keywords: [ "shape", "stone", "icon", "button" ], - char: '\u25fd', - fitzpatrick_scale: false, - category: "symbols" - }, - black_square_button: { - keywords: [ "shape", "input", "frame" ], - char: '\ud83d\udd32', - fitzpatrick_scale: false, - category: "symbols" - }, - white_square_button: { - keywords: [ "shape", "input" ], - char: '\ud83d\udd33', - fitzpatrick_scale: false, - category: "symbols" - }, - speaker: { - keywords: [ "sound", "volume", "silence", "broadcast" ], - char: '\ud83d\udd08', - fitzpatrick_scale: false, - category: "symbols" - }, - sound: { - keywords: [ "volume", "speaker", "broadcast" ], - char: '\ud83d\udd09', - fitzpatrick_scale: false, - category: "symbols" - }, - loud_sound: { - keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ], - char: '\ud83d\udd0a', - fitzpatrick_scale: false, - category: "symbols" - }, - mute: { - keywords: [ "sound", "volume", "silence", "quiet" ], - char: '\ud83d\udd07', - fitzpatrick_scale: false, - category: "symbols" - }, - mega: { - keywords: [ "sound", "speaker", "volume" ], - char: '\ud83d\udce3', - fitzpatrick_scale: false, - category: "symbols" - }, - loudspeaker: { - keywords: [ "volume", "sound" ], - char: '\ud83d\udce2', - fitzpatrick_scale: false, - category: "symbols" - }, - bell: { - keywords: [ "sound", "notification", "christmas", "xmas", "chime" ], - char: '\ud83d\udd14', - fitzpatrick_scale: false, - category: "symbols" - }, - no_bell: { - keywords: [ "sound", "volume", "mute", "quiet", "silent" ], - char: '\ud83d\udd15', - fitzpatrick_scale: false, - category: "symbols" - }, - black_joker: { - keywords: [ "poker", "cards", "game", "play", "magic" ], - char: '\ud83c\udccf', - fitzpatrick_scale: false, - category: "symbols" - }, - mahjong: { - keywords: [ "game", "play", "chinese", "kanji" ], - char: '\ud83c\udc04', - fitzpatrick_scale: false, - category: "symbols" - }, - spades: { - keywords: [ "poker", "cards", "suits", "magic" ], - char: '\u2660\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - clubs: { - keywords: [ "poker", "cards", "magic", "suits" ], - char: '\u2663\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - hearts: { - keywords: [ "poker", "cards", "magic", "suits" ], - char: '\u2665\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - diamonds: { - keywords: [ "poker", "cards", "magic", "suits" ], - char: '\u2666\ufe0f', - fitzpatrick_scale: false, - category: "symbols" - }, - flower_playing_cards: { - keywords: [ "game", "sunset", "red" ], - char: '\ud83c\udfb4', - fitzpatrick_scale: false, - category: "symbols" - }, - thought_balloon: { - keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ], - char: '\ud83d\udcad', - fitzpatrick_scale: false, - category: "symbols" - }, - right_anger_bubble: { - keywords: [ "caption", "speech", "thinking", "mad" ], - char: '\ud83d\uddef', - fitzpatrick_scale: false, - category: "symbols" - }, - speech_balloon: { - keywords: [ "bubble", "words", "message", "talk", "chatting" ], - char: '\ud83d\udcac', - fitzpatrick_scale: false, - category: "symbols" - }, - left_speech_bubble: { - keywords: [ "words", "message", "talk", "chatting" ], - char: '\ud83d\udde8', - fitzpatrick_scale: false, - category: "symbols" - }, - clock1: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd50', - fitzpatrick_scale: false, - category: "symbols" - }, - clock2: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd51', - fitzpatrick_scale: false, - category: "symbols" - }, - clock3: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd52', - fitzpatrick_scale: false, - category: "symbols" - }, - clock4: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd53', - fitzpatrick_scale: false, - category: "symbols" - }, - clock5: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd54', - fitzpatrick_scale: false, - category: "symbols" - }, - clock6: { - keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ], - char: '\ud83d\udd55', - fitzpatrick_scale: false, - category: "symbols" - }, - clock7: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd56', - fitzpatrick_scale: false, - category: "symbols" - }, - clock8: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd57', - fitzpatrick_scale: false, - category: "symbols" - }, - clock9: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd58', - fitzpatrick_scale: false, - category: "symbols" - }, - clock10: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd59', - fitzpatrick_scale: false, - category: "symbols" - }, - clock11: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd5a', - fitzpatrick_scale: false, - category: "symbols" - }, - clock12: { - keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ], - char: '\ud83d\udd5b', - fitzpatrick_scale: false, - category: "symbols" - }, - clock130: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd5c', - fitzpatrick_scale: false, - category: "symbols" - }, - clock230: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd5d', - fitzpatrick_scale: false, - category: "symbols" - }, - clock330: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd5e', - fitzpatrick_scale: false, - category: "symbols" - }, - clock430: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd5f', - fitzpatrick_scale: false, - category: "symbols" - }, - clock530: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd60', - fitzpatrick_scale: false, - category: "symbols" - }, - clock630: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd61', - fitzpatrick_scale: false, - category: "symbols" - }, - clock730: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd62', - fitzpatrick_scale: false, - category: "symbols" - }, - clock830: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd63', - fitzpatrick_scale: false, - category: "symbols" - }, - clock930: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd64', - fitzpatrick_scale: false, - category: "symbols" - }, - clock1030: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd65', - fitzpatrick_scale: false, - category: "symbols" - }, - clock1130: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd66', - fitzpatrick_scale: false, - category: "symbols" - }, - clock1230: { - keywords: [ "time", "late", "early", "schedule" ], - char: '\ud83d\udd67', - fitzpatrick_scale: false, - category: "symbols" - }, - afghanistan: { - keywords: [ "af", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddeb', - fitzpatrick_scale: false, - category: "flags" - }, - aland_islands: { - keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddfd', - fitzpatrick_scale: false, - category: "flags" - }, - albania: { - keywords: [ "al", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddf1', - fitzpatrick_scale: false, - category: "flags" - }, - algeria: { - keywords: [ "dz", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde9\ud83c\uddff', - fitzpatrick_scale: false, - category: "flags" - }, - american_samoa: { - keywords: [ "american", "ws", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - andorra: { - keywords: [ "ad", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\udde9', - fitzpatrick_scale: false, - category: "flags" - }, - angola: { - keywords: [ "ao", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - anguilla: { - keywords: [ "ai", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddee', - fitzpatrick_scale: false, - category: "flags" - }, - antarctica: { - keywords: [ "aq", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddf6', - fitzpatrick_scale: false, - category: "flags" - }, - antigua_barbuda: { - keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - argentina: { - keywords: [ "ar", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - armenia: { - keywords: [ "am", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - aruba: { - keywords: [ "aw", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddfc', - fitzpatrick_scale: false, - category: "flags" - }, - australia: { - keywords: [ "au", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddfa', - fitzpatrick_scale: false, - category: "flags" - }, - austria: { - keywords: [ "at", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - azerbaijan: { - keywords: [ "az", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddff', - fitzpatrick_scale: false, - category: "flags" - }, - bahamas: { - keywords: [ "bs", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - bahrain: { - keywords: [ "bh", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\udded', - fitzpatrick_scale: false, - category: "flags" - }, - bangladesh: { - keywords: [ "bd", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\udde9', - fitzpatrick_scale: false, - category: "flags" - }, - barbados: { - keywords: [ "bb", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\udde7', - fitzpatrick_scale: false, - category: "flags" - }, - belarus: { - keywords: [ "by", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddfe', - fitzpatrick_scale: false, - category: "flags" - }, - belgium: { - keywords: [ "be", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - belize: { - keywords: [ "bz", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddff', - fitzpatrick_scale: false, - category: "flags" - }, - benin: { - keywords: [ "bj", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddef', - fitzpatrick_scale: false, - category: "flags" - }, - bermuda: { - keywords: [ "bm", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - bhutan: { - keywords: [ "bt", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - bolivia: { - keywords: [ "bo", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - caribbean_netherlands: { - keywords: [ "bonaire", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddf6', - fitzpatrick_scale: false, - category: "flags" - }, - bosnia_herzegovina: { - keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - botswana: { - keywords: [ "bw", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddfc', - fitzpatrick_scale: false, - category: "flags" - }, - brazil: { - keywords: [ "br", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - british_indian_ocean_territory: { - keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddee\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - british_virgin_islands: { - keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfb\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - brunei: { - keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - bulgaria: { - keywords: [ "bg", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - burkina_faso: { - keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddeb', - fitzpatrick_scale: false, - category: "flags" - }, - burundi: { - keywords: [ "bi", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddee', - fitzpatrick_scale: false, - category: "flags" - }, - cape_verde: { - keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddfb', - fitzpatrick_scale: false, - category: "flags" - }, - cambodia: { - keywords: [ "kh", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf0\ud83c\udded', - fitzpatrick_scale: false, - category: "flags" - }, - cameroon: { - keywords: [ "cm", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - canada: { - keywords: [ "ca", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - canary_islands: { - keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddee\ud83c\udde8', - fitzpatrick_scale: false, - category: "flags" - }, - cayman_islands: { - keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf0\ud83c\uddfe', - fitzpatrick_scale: false, - category: "flags" - }, - central_african_republic: { - keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddeb', - fitzpatrick_scale: false, - category: "flags" - }, - chad: { - keywords: [ "td", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\udde9', - fitzpatrick_scale: false, - category: "flags" - }, - chile: { - keywords: [ "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddf1', - fitzpatrick_scale: false, - category: "flags" - }, - cn: { - keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ], - char: '\ud83c\udde8\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - christmas_island: { - keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddfd', - fitzpatrick_scale: false, - category: "flags" - }, - cocos_islands: { - keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\udde8', - fitzpatrick_scale: false, - category: "flags" - }, - colombia: { - keywords: [ "co", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - comoros: { - keywords: [ "km", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf0\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - congo_brazzaville: { - keywords: [ "congo", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - congo_kinshasa: { - keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\udde9', - fitzpatrick_scale: false, - category: "flags" - }, - cook_islands: { - keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddf0', - fitzpatrick_scale: false, - category: "flags" - }, - costa_rica: { - keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - croatia: { - keywords: [ "hr", "flag", "nation", "country", "banner" ], - char: '\ud83c\udded\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - cuba: { - keywords: [ "cu", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddfa', - fitzpatrick_scale: false, - category: "flags" - }, - curacao: { - keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddfc', - fitzpatrick_scale: false, - category: "flags" - }, - cyprus: { - keywords: [ "cy", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddfe', - fitzpatrick_scale: false, - category: "flags" - }, - czech_republic: { - keywords: [ "cz", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddff', - fitzpatrick_scale: false, - category: "flags" - }, - denmark: { - keywords: [ "dk", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde9\ud83c\uddf0', - fitzpatrick_scale: false, - category: "flags" - }, - djibouti: { - keywords: [ "dj", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde9\ud83c\uddef', - fitzpatrick_scale: false, - category: "flags" - }, - dominica: { - keywords: [ "dm", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde9\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - dominican_republic: { - keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde9\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - ecuador: { - keywords: [ "ec", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddea\ud83c\udde8', - fitzpatrick_scale: false, - category: "flags" - }, - egypt: { - keywords: [ "eg", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddea\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - el_salvador: { - keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddfb', - fitzpatrick_scale: false, - category: "flags" - }, - equatorial_guinea: { - keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddf6', - fitzpatrick_scale: false, - category: "flags" - }, - eritrea: { - keywords: [ "er", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddea\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - estonia: { - keywords: [ "ee", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddea\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - ethiopia: { - keywords: [ "et", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddea\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - eu: { - keywords: [ "european", "union", "flag", "banner" ], - char: '\ud83c\uddea\ud83c\uddfa', - fitzpatrick_scale: false, - category: "flags" - }, - falkland_islands: { - keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddeb\ud83c\uddf0', - fitzpatrick_scale: false, - category: "flags" - }, - faroe_islands: { - keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddeb\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - fiji: { - keywords: [ "fj", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddeb\ud83c\uddef', - fitzpatrick_scale: false, - category: "flags" - }, - finland: { - keywords: [ "fi", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddeb\ud83c\uddee', - fitzpatrick_scale: false, - category: "flags" - }, - fr: { - keywords: [ "banner", "flag", "nation", "france", "french", "country" ], - char: '\ud83c\uddeb\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - french_guiana: { - keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddeb', - fitzpatrick_scale: false, - category: "flags" - }, - french_polynesia: { - keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddeb', - fitzpatrick_scale: false, - category: "flags" - }, - french_southern_territories: { - keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddeb', - fitzpatrick_scale: false, - category: "flags" - }, - gabon: { - keywords: [ "ga", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - gambia: { - keywords: [ "gm", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - georgia: { - keywords: [ "ge", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - de: { - keywords: [ "german", "nation", "flag", "country", "banner" ], - char: '\ud83c\udde9\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - ghana: { - keywords: [ "gh", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\udded', - fitzpatrick_scale: false, - category: "flags" - }, - gibraltar: { - keywords: [ "gi", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddee', - fitzpatrick_scale: false, - category: "flags" - }, - greece: { - keywords: [ "gr", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - greenland: { - keywords: [ "gl", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddf1', - fitzpatrick_scale: false, - category: "flags" - }, - grenada: { - keywords: [ "gd", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\udde9', - fitzpatrick_scale: false, - category: "flags" - }, - guadeloupe: { - keywords: [ "gp", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddf5', - fitzpatrick_scale: false, - category: "flags" - }, - guam: { - keywords: [ "gu", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddfa', - fitzpatrick_scale: false, - category: "flags" - }, - guatemala: { - keywords: [ "gt", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - guernsey: { - keywords: [ "gg", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - guinea: { - keywords: [ "gn", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - guinea_bissau: { - keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddfc', - fitzpatrick_scale: false, - category: "flags" - }, - guyana: { - keywords: [ "gy", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddfe', - fitzpatrick_scale: false, - category: "flags" - }, - haiti: { - keywords: [ "ht", "flag", "nation", "country", "banner" ], - char: '\ud83c\udded\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - honduras: { - keywords: [ "hn", "flag", "nation", "country", "banner" ], - char: '\ud83c\udded\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - hong_kong: { - keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ], - char: '\ud83c\udded\ud83c\uddf0', - fitzpatrick_scale: false, - category: "flags" - }, - hungary: { - keywords: [ "hu", "flag", "nation", "country", "banner" ], - char: '\ud83c\udded\ud83c\uddfa', - fitzpatrick_scale: false, - category: "flags" - }, - iceland: { - keywords: [ "is", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddee\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - india: { - keywords: [ "in", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddee\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - indonesia: { - keywords: [ "flag", "nation", "country", "banner" ], - char: '\ud83c\uddee\ud83c\udde9', - fitzpatrick_scale: false, - category: "flags" - }, - iran: { - keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddee\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - iraq: { - keywords: [ "iq", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddee\ud83c\uddf6', - fitzpatrick_scale: false, - category: "flags" - }, - ireland: { - keywords: [ "ie", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddee\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - isle_of_man: { - keywords: [ "isle", "man", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddee\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - israel: { - keywords: [ "il", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddee\ud83c\uddf1', - fitzpatrick_scale: false, - category: "flags" - }, - it: { - keywords: [ "italy", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddee\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - cote_divoire: { - keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\uddee', - fitzpatrick_scale: false, - category: "flags" - }, - jamaica: { - keywords: [ "jm", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddef\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - jp: { - keywords: [ "japanese", "nation", "flag", "country", "banner" ], - char: '\ud83c\uddef\ud83c\uddf5', - fitzpatrick_scale: false, - category: "flags" - }, - jersey: { - keywords: [ "je", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddef\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - jordan: { - keywords: [ "jo", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddef\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - kazakhstan: { - keywords: [ "kz", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf0\ud83c\uddff', - fitzpatrick_scale: false, - category: "flags" - }, - kenya: { - keywords: [ "ke", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf0\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - kiribati: { - keywords: [ "ki", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf0\ud83c\uddee', - fitzpatrick_scale: false, - category: "flags" - }, - kosovo: { - keywords: [ "xk", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfd\ud83c\uddf0', - fitzpatrick_scale: false, - category: "flags" - }, - kuwait: { - keywords: [ "kw", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf0\ud83c\uddfc', - fitzpatrick_scale: false, - category: "flags" - }, - kyrgyzstan: { - keywords: [ "kg", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf0\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - laos: { - keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf1\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - latvia: { - keywords: [ "lv", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf1\ud83c\uddfb', - fitzpatrick_scale: false, - category: "flags" - }, - lebanon: { - keywords: [ "lb", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf1\ud83c\udde7', - fitzpatrick_scale: false, - category: "flags" - }, - lesotho: { - keywords: [ "ls", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf1\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - liberia: { - keywords: [ "lr", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf1\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - libya: { - keywords: [ "ly", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf1\ud83c\uddfe', - fitzpatrick_scale: false, - category: "flags" - }, - liechtenstein: { - keywords: [ "li", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf1\ud83c\uddee', - fitzpatrick_scale: false, - category: "flags" - }, - lithuania: { - keywords: [ "lt", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf1\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - luxembourg: { - keywords: [ "lu", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf1\ud83c\uddfa', - fitzpatrick_scale: false, - category: "flags" - }, - macau: { - keywords: [ "macao", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - macedonia: { - keywords: [ "macedonia,", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddf0', - fitzpatrick_scale: false, - category: "flags" - }, - madagascar: { - keywords: [ "mg", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - malawi: { - keywords: [ "mw", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddfc', - fitzpatrick_scale: false, - category: "flags" - }, - malaysia: { - keywords: [ "my", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddfe', - fitzpatrick_scale: false, - category: "flags" - }, - maldives: { - keywords: [ "mv", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddfb', - fitzpatrick_scale: false, - category: "flags" - }, - mali: { - keywords: [ "ml", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddf1', - fitzpatrick_scale: false, - category: "flags" - }, - malta: { - keywords: [ "mt", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - marshall_islands: { - keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\udded', - fitzpatrick_scale: false, - category: "flags" - }, - martinique: { - keywords: [ "mq", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddf6', - fitzpatrick_scale: false, - category: "flags" - }, - mauritania: { - keywords: [ "mr", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - mauritius: { - keywords: [ "mu", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddfa', - fitzpatrick_scale: false, - category: "flags" - }, - mayotte: { - keywords: [ "yt", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfe\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - mexico: { - keywords: [ "mx", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddfd', - fitzpatrick_scale: false, - category: "flags" - }, - micronesia: { - keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddeb\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - moldova: { - keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\udde9', - fitzpatrick_scale: false, - category: "flags" - }, - monaco: { - keywords: [ "mc", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\udde8', - fitzpatrick_scale: false, - category: "flags" - }, - mongolia: { - keywords: [ "mn", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - montenegro: { - keywords: [ "me", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - montserrat: { - keywords: [ "ms", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - morocco: { - keywords: [ "ma", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - mozambique: { - keywords: [ "mz", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddff', - fitzpatrick_scale: false, - category: "flags" - }, - myanmar: { - keywords: [ "mm", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - namibia: { - keywords: [ "na", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - nauru: { - keywords: [ "nr", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - nepal: { - keywords: [ "np", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\uddf5', - fitzpatrick_scale: false, - category: "flags" - }, - netherlands: { - keywords: [ "nl", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\uddf1', - fitzpatrick_scale: false, - category: "flags" - }, - new_caledonia: { - keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\udde8', - fitzpatrick_scale: false, - category: "flags" - }, - new_zealand: { - keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\uddff', - fitzpatrick_scale: false, - category: "flags" - }, - nicaragua: { - keywords: [ "ni", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\uddee', - fitzpatrick_scale: false, - category: "flags" - }, - niger: { - keywords: [ "ne", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - nigeria: { - keywords: [ "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - niue: { - keywords: [ "nu", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\uddfa', - fitzpatrick_scale: false, - category: "flags" - }, - norfolk_island: { - keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\uddeb', - fitzpatrick_scale: false, - category: "flags" - }, - northern_mariana_islands: { - keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf2\ud83c\uddf5', - fitzpatrick_scale: false, - category: "flags" - }, - north_korea: { - keywords: [ "north", "korea", "nation", "flag", "country", "banner" ], - char: '\ud83c\uddf0\ud83c\uddf5', - fitzpatrick_scale: false, - category: "flags" - }, - norway: { - keywords: [ "no", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf3\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - oman: { - keywords: [ "om_symbol", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf4\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - pakistan: { - keywords: [ "pk", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddf0', - fitzpatrick_scale: false, - category: "flags" - }, - palau: { - keywords: [ "pw", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddfc', - fitzpatrick_scale: false, - category: "flags" - }, - palestinian_territories: { - keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - panama: { - keywords: [ "pa", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - papua_new_guinea: { - keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - paraguay: { - keywords: [ "py", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddfe', - fitzpatrick_scale: false, - category: "flags" - }, - peru: { - keywords: [ "pe", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - philippines: { - keywords: [ "ph", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\udded', - fitzpatrick_scale: false, - category: "flags" - }, - pitcairn_islands: { - keywords: [ "pitcairn", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - poland: { - keywords: [ "pl", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddf1', - fitzpatrick_scale: false, - category: "flags" - }, - portugal: { - keywords: [ "pt", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - puerto_rico: { - keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - qatar: { - keywords: [ "qa", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf6\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - reunion: { - keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf7\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - romania: { - keywords: [ "ro", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf7\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - ru: { - keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf7\ud83c\uddfa', - fitzpatrick_scale: false, - category: "flags" - }, - rwanda: { - keywords: [ "rw", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf7\ud83c\uddfc', - fitzpatrick_scale: false, - category: "flags" - }, - st_barthelemy: { - keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde7\ud83c\uddf1', - fitzpatrick_scale: false, - category: "flags" - }, - st_helena: { - keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\udded', - fitzpatrick_scale: false, - category: "flags" - }, - st_kitts_nevis: { - keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf0\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - st_lucia: { - keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf1\ud83c\udde8', - fitzpatrick_scale: false, - category: "flags" - }, - st_pierre_miquelon: { - keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf5\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - st_vincent_grenadines: { - keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfb\ud83c\udde8', - fitzpatrick_scale: false, - category: "flags" - }, - samoa: { - keywords: [ "ws", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfc\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - san_marino: { - keywords: [ "san", "marino", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - sao_tome_principe: { - keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - saudi_arabia: { - keywords: [ "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - senegal: { - keywords: [ "sn", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - serbia: { - keywords: [ "rs", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf7\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - seychelles: { - keywords: [ "sc", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\udde8', - fitzpatrick_scale: false, - category: "flags" - }, - sierra_leone: { - keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddf1', - fitzpatrick_scale: false, - category: "flags" - }, - singapore: { - keywords: [ "sg", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - sint_maarten: { - keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddfd', - fitzpatrick_scale: false, - category: "flags" - }, - slovakia: { - keywords: [ "sk", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddf0', - fitzpatrick_scale: false, - category: "flags" - }, - slovenia: { - keywords: [ "si", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddee', - fitzpatrick_scale: false, - category: "flags" - }, - solomon_islands: { - keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\udde7', - fitzpatrick_scale: false, - category: "flags" - }, - somalia: { - keywords: [ "so", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - south_africa: { - keywords: [ "south", "africa", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddff\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - south_georgia_south_sandwich_islands: { - keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddec\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - kr: { - keywords: [ "south", "korea", "nation", "flag", "country", "banner" ], - char: '\ud83c\uddf0\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - south_sudan: { - keywords: [ "south", "sd", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - es: { - keywords: [ "spain", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddea\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - sri_lanka: { - keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf1\ud83c\uddf0', - fitzpatrick_scale: false, - category: "flags" - }, - sudan: { - keywords: [ "sd", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\udde9', - fitzpatrick_scale: false, - category: "flags" - }, - suriname: { - keywords: [ "sr", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - swaziland: { - keywords: [ "sz", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddff', - fitzpatrick_scale: false, - category: "flags" - }, - sweden: { - keywords: [ "se", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - switzerland: { - keywords: [ "ch", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde8\ud83c\udded', - fitzpatrick_scale: false, - category: "flags" - }, - syria: { - keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf8\ud83c\uddfe', - fitzpatrick_scale: false, - category: "flags" - }, - taiwan: { - keywords: [ "tw", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddfc', - fitzpatrick_scale: false, - category: "flags" - }, - tajikistan: { - keywords: [ "tj", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddef', - fitzpatrick_scale: false, - category: "flags" - }, - tanzania: { - keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddff', - fitzpatrick_scale: false, - category: "flags" - }, - thailand: { - keywords: [ "th", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\udded', - fitzpatrick_scale: false, - category: "flags" - }, - timor_leste: { - keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddf1', - fitzpatrick_scale: false, - category: "flags" - }, - togo: { - keywords: [ "tg", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - tokelau: { - keywords: [ "tk", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddf0', - fitzpatrick_scale: false, - category: "flags" - }, - tonga: { - keywords: [ "to", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddf4', - fitzpatrick_scale: false, - category: "flags" - }, - trinidad_tobago: { - keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddf9', - fitzpatrick_scale: false, - category: "flags" - }, - tunisia: { - keywords: [ "tn", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - tr: { - keywords: [ "turkey", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddf7', - fitzpatrick_scale: false, - category: "flags" - }, - turkmenistan: { - keywords: [ "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - turks_caicos_islands: { - keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\udde8', - fitzpatrick_scale: false, - category: "flags" - }, - tuvalu: { - keywords: [ "flag", "nation", "country", "banner" ], - char: '\ud83c\uddf9\ud83c\uddfb', - fitzpatrick_scale: false, - category: "flags" - }, - uganda: { - keywords: [ "ug", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfa\ud83c\uddec', - fitzpatrick_scale: false, - category: "flags" - }, - ukraine: { - keywords: [ "ua", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfa\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - united_arab_emirates: { - keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ], - char: '\ud83c\udde6\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - uk: { - keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ], - char: '\ud83c\uddec\ud83c\udde7', - fitzpatrick_scale: false, - category: "flags" - }, - england: { - keywords: [ "flag", "english" ], - char: '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f', - fitzpatrick_scale: false, - category: "flags" - }, - scotland: { - keywords: [ "flag", "scottish" ], - char: '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f', - fitzpatrick_scale: false, - category: "flags" - }, - wales: { - keywords: [ "flag", "welsh" ], - char: '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f', - fitzpatrick_scale: false, - category: "flags" - }, - us: { - keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfa\ud83c\uddf8', - fitzpatrick_scale: false, - category: "flags" - }, - us_virgin_islands: { - keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfb\ud83c\uddee', - fitzpatrick_scale: false, - category: "flags" - }, - uruguay: { - keywords: [ "uy", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfa\ud83c\uddfe', - fitzpatrick_scale: false, - category: "flags" - }, - uzbekistan: { - keywords: [ "uz", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfa\ud83c\uddff', - fitzpatrick_scale: false, - category: "flags" - }, - vanuatu: { - keywords: [ "vu", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfb\ud83c\uddfa', - fitzpatrick_scale: false, - category: "flags" - }, - vatican_city: { - keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfb\ud83c\udde6', - fitzpatrick_scale: false, - category: "flags" - }, - venezuela: { - keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfb\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - vietnam: { - keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfb\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - wallis_futuna: { - keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfc\ud83c\uddeb', - fitzpatrick_scale: false, - category: "flags" - }, - western_sahara: { - keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddea\ud83c\udded', - fitzpatrick_scale: false, - category: "flags" - }, - yemen: { - keywords: [ "ye", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddfe\ud83c\uddea', - fitzpatrick_scale: false, - category: "flags" - }, - zambia: { - keywords: [ "zm", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddff\ud83c\uddf2', - fitzpatrick_scale: false, - category: "flags" - }, - zimbabwe: { - keywords: [ "zw", "flag", "nation", "country", "banner" ], - char: '\ud83c\uddff\ud83c\uddfc', - fitzpatrick_scale: false, - category: "flags" - }, - united_nations: { - keywords: [ "un", "flag", "banner" ], - char: '\ud83c\uddfa\ud83c\uddf3', - fitzpatrick_scale: false, - category: "flags" - }, - pirate_flag: { - keywords: [ "skull", "crossbones", "flag", "banner" ], - char: '\ud83c\udff4\u200d\u2620\ufe0f', - fitzpatrick_scale: false, - category: "flags" - } -}); \ No newline at end of file +window.tinymce.Resource.add("tinymce.plugins.emoticons",{100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:'💯',fitzpatrick_scale:false,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:'🔢',fitzpatrick_scale:false,category:"symbols"},grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:'😀',fitzpatrick_scale:false,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:'😬',fitzpatrick_scale:false,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:'😁',fitzpatrick_scale:false,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:'😂',fitzpatrick_scale:false,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:'🤣',fitzpatrick_scale:false,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:'🥳',fitzpatrick_scale:false,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:'😃',fitzpatrick_scale:false,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:'😄',fitzpatrick_scale:false,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:'😅',fitzpatrick_scale:false,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:'😆',fitzpatrick_scale:false,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:'😇',fitzpatrick_scale:false,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:'😉',fitzpatrick_scale:false,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:'😊',fitzpatrick_scale:false,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:'🙂',fitzpatrick_scale:false,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:'🙃',fitzpatrick_scale:false,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:'☺️',fitzpatrick_scale:false,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:'😋',fitzpatrick_scale:false,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:'😌',fitzpatrick_scale:false,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:'😍',fitzpatrick_scale:false,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:'🥰',fitzpatrick_scale:false,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'😘',fitzpatrick_scale:false,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:'😗',fitzpatrick_scale:false,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:'😙',fitzpatrick_scale:false,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'😚',fitzpatrick_scale:false,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:'😜',fitzpatrick_scale:false,category:"people"},zany:{keywords:["face","goofy","crazy"],char:'🤪',fitzpatrick_scale:false,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:'🤨',fitzpatrick_scale:false,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:'🧐',fitzpatrick_scale:false,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:'😝',fitzpatrick_scale:false,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:'😛',fitzpatrick_scale:false,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:'🤑',fitzpatrick_scale:false,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:'🤓',fitzpatrick_scale:false,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:'😎',fitzpatrick_scale:false,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:'🤩',fitzpatrick_scale:false,category:"people"},clown_face:{keywords:["face"],char:'🤡',fitzpatrick_scale:false,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:'🤠',fitzpatrick_scale:false,category:"people"},hugs:{keywords:["face","smile","hug"],char:'🤗',fitzpatrick_scale:false,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:'😏',fitzpatrick_scale:false,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:'😶',fitzpatrick_scale:false,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:'😐',fitzpatrick_scale:false,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:'😑',fitzpatrick_scale:false,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:'😒',fitzpatrick_scale:false,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:'🙄',fitzpatrick_scale:false,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:'🤔',fitzpatrick_scale:false,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:'🤥',fitzpatrick_scale:false,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:'🤭',fitzpatrick_scale:false,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:'🤫',fitzpatrick_scale:false,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:'🤬',fitzpatrick_scale:false,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:'🤯',fitzpatrick_scale:false,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:'😳',fitzpatrick_scale:false,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:'😞',fitzpatrick_scale:false,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:'😟',fitzpatrick_scale:false,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:'😠',fitzpatrick_scale:false,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:'😡',fitzpatrick_scale:false,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:'😔',fitzpatrick_scale:false,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:'😕',fitzpatrick_scale:false,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:'🙁',fitzpatrick_scale:false,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:'☹',fitzpatrick_scale:false,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:'😣',fitzpatrick_scale:false,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:'😖',fitzpatrick_scale:false,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:'😫',fitzpatrick_scale:false,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:'😩',fitzpatrick_scale:false,category:"people"},pleading:{keywords:["face","begging","mercy"],char:'🥺',fitzpatrick_scale:false,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:'😤',fitzpatrick_scale:false,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:'😮',fitzpatrick_scale:false,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:'😱',fitzpatrick_scale:false,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:'😨',fitzpatrick_scale:false,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:'😰',fitzpatrick_scale:false,category:"people"},hushed:{keywords:["face","woo","shh"],char:'😯',fitzpatrick_scale:false,category:"people"},frowning:{keywords:["face","aw","what"],char:'😦',fitzpatrick_scale:false,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:'😧',fitzpatrick_scale:false,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:'😢',fitzpatrick_scale:false,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:'😥',fitzpatrick_scale:false,category:"people"},drooling_face:{keywords:["face"],char:'🤤',fitzpatrick_scale:false,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:'😪',fitzpatrick_scale:false,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:'😓',fitzpatrick_scale:false,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:'🥵',fitzpatrick_scale:false,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:'🥶',fitzpatrick_scale:false,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:'😭',fitzpatrick_scale:false,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:'😵',fitzpatrick_scale:false,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:'😲',fitzpatrick_scale:false,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:'🤐',fitzpatrick_scale:false,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:'🤢',fitzpatrick_scale:false,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:'🤧',fitzpatrick_scale:false,category:"people"},vomiting:{keywords:["face","sick"],char:'🤮',fitzpatrick_scale:false,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:'😷',fitzpatrick_scale:false,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:'🤒',fitzpatrick_scale:false,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:'🤕',fitzpatrick_scale:false,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:'🥴',fitzpatrick_scale:false,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:'😴',fitzpatrick_scale:false,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:'💤',fitzpatrick_scale:false,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:'💩',fitzpatrick_scale:false,category:"people"},smiling_imp:{keywords:["devil","horns"],char:'😈',fitzpatrick_scale:false,category:"people"},imp:{keywords:["devil","angry","horns"],char:'👿',fitzpatrick_scale:false,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:'👹',fitzpatrick_scale:false,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:'👺',fitzpatrick_scale:false,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:'💀',fitzpatrick_scale:false,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:'👻',fitzpatrick_scale:false,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:'👽',fitzpatrick_scale:false,category:"people"},robot:{keywords:["computer","machine","bot"],char:'🤖',fitzpatrick_scale:false,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:'😺',fitzpatrick_scale:false,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:'😸',fitzpatrick_scale:false,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:'😹',fitzpatrick_scale:false,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:'😻',fitzpatrick_scale:false,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:'😼',fitzpatrick_scale:false,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:'😽',fitzpatrick_scale:false,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:'🙀',fitzpatrick_scale:false,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:'😿',fitzpatrick_scale:false,category:"people"},pouting_cat:{keywords:["animal","cats"],char:'😾',fitzpatrick_scale:false,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:'🤲',fitzpatrick_scale:true,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:'🙌',fitzpatrick_scale:true,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:'👏',fitzpatrick_scale:true,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:'👋',fitzpatrick_scale:true,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:'🤙',fitzpatrick_scale:true,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:'👍',fitzpatrick_scale:true,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:'👎',fitzpatrick_scale:true,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:'👊',fitzpatrick_scale:true,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:'✊',fitzpatrick_scale:true,category:"people"},fist_left:{keywords:["hand","fistbump"],char:'🤛',fitzpatrick_scale:true,category:"people"},fist_right:{keywords:["hand","fistbump"],char:'🤜',fitzpatrick_scale:true,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:'✌',fitzpatrick_scale:true,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:'👌',fitzpatrick_scale:true,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:'✋',fitzpatrick_scale:true,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:'🤚',fitzpatrick_scale:true,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:'👐',fitzpatrick_scale:true,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:'💪',fitzpatrick_scale:true,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:'🙏',fitzpatrick_scale:true,category:"people"},foot:{keywords:["kick","stomp"],char:'🦶',fitzpatrick_scale:true,category:"people"},leg:{keywords:["kick","limb"],char:'🦵',fitzpatrick_scale:true,category:"people"},handshake:{keywords:["agreement","shake"],char:'🤝',fitzpatrick_scale:false,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:'☝',fitzpatrick_scale:true,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:'👆',fitzpatrick_scale:true,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:'👇',fitzpatrick_scale:true,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:'👈',fitzpatrick_scale:true,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:'👉',fitzpatrick_scale:true,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:'🖕',fitzpatrick_scale:true,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:'🖐',fitzpatrick_scale:true,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:'🤟',fitzpatrick_scale:true,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:'🤘',fitzpatrick_scale:true,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:'🤞',fitzpatrick_scale:true,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:'🖖',fitzpatrick_scale:true,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:'✍',fitzpatrick_scale:true,category:"people"},selfie:{keywords:["camera","phone"],char:'🤳',fitzpatrick_scale:true,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:'💅',fitzpatrick_scale:true,category:"people"},lips:{keywords:["mouth","kiss"],char:'👄',fitzpatrick_scale:false,category:"people"},tooth:{keywords:["teeth","dentist"],char:'🦷',fitzpatrick_scale:false,category:"people"},tongue:{keywords:["mouth","playful"],char:'👅',fitzpatrick_scale:false,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:'👂',fitzpatrick_scale:true,category:"people"},nose:{keywords:["smell","sniff"],char:'👃',fitzpatrick_scale:true,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:'👁',fitzpatrick_scale:false,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:'👀',fitzpatrick_scale:false,category:"people"},brain:{keywords:["smart","intelligent"],char:'🧠',fitzpatrick_scale:false,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:'👤',fitzpatrick_scale:false,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:'👥',fitzpatrick_scale:false,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:'🗣',fitzpatrick_scale:false,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:'👶',fitzpatrick_scale:true,category:"people"},child:{keywords:["gender-neutral","young"],char:'🧒',fitzpatrick_scale:true,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:'👦',fitzpatrick_scale:true,category:"people"},girl:{keywords:["female","woman","teenager"],char:'👧',fitzpatrick_scale:true,category:"people"},adult:{keywords:["gender-neutral","person"],char:'🧑',fitzpatrick_scale:true,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:'👨',fitzpatrick_scale:true,category:"people"},woman:{keywords:["female","girls","lady"],char:'👩',fitzpatrick_scale:true,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:'👱‍♀️',fitzpatrick_scale:true,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:'👱',fitzpatrick_scale:true,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:'🧔',fitzpatrick_scale:true,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:'🧓',fitzpatrick_scale:true,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:'👴',fitzpatrick_scale:true,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:'👵',fitzpatrick_scale:true,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:'👲',fitzpatrick_scale:true,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:'🧕',fitzpatrick_scale:true,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:'👳‍♀️',fitzpatrick_scale:true,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:'👳',fitzpatrick_scale:true,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:'👮‍♀️',fitzpatrick_scale:true,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:'👮',fitzpatrick_scale:true,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:'👷‍♀️',fitzpatrick_scale:true,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:'👷',fitzpatrick_scale:true,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:'💂‍♀️',fitzpatrick_scale:true,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:'💂',fitzpatrick_scale:true,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:'🕵️‍♀️',fitzpatrick_scale:true,category:"people"},male_detective:{keywords:["human","spy","detective"],char:'🕵',fitzpatrick_scale:true,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:'👩‍⚕️',fitzpatrick_scale:true,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:'👨‍⚕️',fitzpatrick_scale:true,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:'👩‍🌾',fitzpatrick_scale:true,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:'👨‍🌾',fitzpatrick_scale:true,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:'👩‍🍳',fitzpatrick_scale:true,category:"people"},man_cook:{keywords:["chef","man","human"],char:'👨‍🍳',fitzpatrick_scale:true,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:'👩‍🎓',fitzpatrick_scale:true,category:"people"},man_student:{keywords:["graduate","man","human"],char:'👨‍🎓',fitzpatrick_scale:true,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:'👩‍🎤',fitzpatrick_scale:true,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:'👨‍🎤',fitzpatrick_scale:true,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:'👩‍🏫',fitzpatrick_scale:true,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:'👨‍🏫',fitzpatrick_scale:true,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:'👩‍🏭',fitzpatrick_scale:true,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:'👨‍🏭',fitzpatrick_scale:true,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:'👩‍💻',fitzpatrick_scale:true,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:'👨‍💻',fitzpatrick_scale:true,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:'👩‍💼',fitzpatrick_scale:true,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:'👨‍💼',fitzpatrick_scale:true,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:'👩‍🔧',fitzpatrick_scale:true,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:'👨‍🔧',fitzpatrick_scale:true,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:'👩‍🔬',fitzpatrick_scale:true,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:'👨‍🔬',fitzpatrick_scale:true,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:'👩‍🎨',fitzpatrick_scale:true,category:"people"},man_artist:{keywords:["painter","man","human"],char:'👨‍🎨',fitzpatrick_scale:true,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:'👩‍🚒',fitzpatrick_scale:true,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:'👨‍🚒',fitzpatrick_scale:true,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:'👩‍✈️',fitzpatrick_scale:true,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:'👨‍✈️',fitzpatrick_scale:true,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:'👩‍🚀',fitzpatrick_scale:true,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:'👨‍🚀',fitzpatrick_scale:true,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:'👩‍⚖️',fitzpatrick_scale:true,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:'👨‍⚖️',fitzpatrick_scale:true,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:'🦸‍♀️',fitzpatrick_scale:true,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:'🦸‍♂️',fitzpatrick_scale:true,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:'🦹‍♀️',fitzpatrick_scale:true,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:'🦹‍♂️',fitzpatrick_scale:true,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:'🤶',fitzpatrick_scale:true,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:'🎅',fitzpatrick_scale:true,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:'🧙‍♀️',fitzpatrick_scale:true,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:'🧙‍♂️',fitzpatrick_scale:true,category:"people"},woman_elf:{keywords:["woman","female"],char:'🧝‍♀️',fitzpatrick_scale:true,category:"people"},man_elf:{keywords:["man","male"],char:'🧝‍♂️',fitzpatrick_scale:true,category:"people"},woman_vampire:{keywords:["woman","female"],char:'🧛‍♀️',fitzpatrick_scale:true,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:'🧛‍♂️',fitzpatrick_scale:true,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:'🧟‍♀️',fitzpatrick_scale:false,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:'🧟‍♂️',fitzpatrick_scale:false,category:"people"},woman_genie:{keywords:["woman","female"],char:'🧞‍♀️',fitzpatrick_scale:false,category:"people"},man_genie:{keywords:["man","male"],char:'🧞‍♂️',fitzpatrick_scale:false,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:'🧜‍♀️',fitzpatrick_scale:true,category:"people"},merman:{keywords:["man","male","triton"],char:'🧜‍♂️',fitzpatrick_scale:true,category:"people"},woman_fairy:{keywords:["woman","female"],char:'🧚‍♀️',fitzpatrick_scale:true,category:"people"},man_fairy:{keywords:["man","male"],char:'🧚‍♂️',fitzpatrick_scale:true,category:"people"},angel:{keywords:["heaven","wings","halo"],char:'👼',fitzpatrick_scale:true,category:"people"},pregnant_woman:{keywords:["baby"],char:'🤰',fitzpatrick_scale:true,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:'🤱',fitzpatrick_scale:true,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:'👸',fitzpatrick_scale:true,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:'🤴',fitzpatrick_scale:true,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:'👰',fitzpatrick_scale:true,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:'🤵',fitzpatrick_scale:true,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:'🏃‍♀️',fitzpatrick_scale:true,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:'🏃',fitzpatrick_scale:true,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:'🚶‍♀️',fitzpatrick_scale:true,category:"people"},walking_man:{keywords:["human","feet","steps"],char:'🚶',fitzpatrick_scale:true,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:'💃',fitzpatrick_scale:true,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:'🕺',fitzpatrick_scale:true,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:'👯',fitzpatrick_scale:false,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:'👯‍♂️',fitzpatrick_scale:false,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:'👫',fitzpatrick_scale:false,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:'👬',fitzpatrick_scale:false,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:'👭',fitzpatrick_scale:false,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:'🙇‍♀️',fitzpatrick_scale:true,category:"people"},bowing_man:{keywords:["man","male","boy"],char:'🙇',fitzpatrick_scale:true,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:'🤦‍♂️',fitzpatrick_scale:true,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:'🤦‍♀️',fitzpatrick_scale:true,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:'🤷',fitzpatrick_scale:true,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:'🤷‍♂️',fitzpatrick_scale:true,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:'💁',fitzpatrick_scale:true,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:'💁‍♂️',fitzpatrick_scale:true,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:'🙅',fitzpatrick_scale:true,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:'🙅‍♂️',fitzpatrick_scale:true,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:'🙆',fitzpatrick_scale:true,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:'🙆‍♂️',fitzpatrick_scale:true,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:'🙋',fitzpatrick_scale:true,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:'🙋‍♂️',fitzpatrick_scale:true,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:'🙎',fitzpatrick_scale:true,category:"people"},pouting_man:{keywords:["male","boy","man"],char:'🙎‍♂️',fitzpatrick_scale:true,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:'🙍',fitzpatrick_scale:true,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:'🙍‍♂️',fitzpatrick_scale:true,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:'💇',fitzpatrick_scale:true,category:"people"},haircut_man:{keywords:["male","boy","man"],char:'💇‍♂️',fitzpatrick_scale:true,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:'💆',fitzpatrick_scale:true,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:'💆‍♂️',fitzpatrick_scale:true,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:'🧖‍♀️',fitzpatrick_scale:true,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:'🧖‍♂️',fitzpatrick_scale:true,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'💑',fitzpatrick_scale:false,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'👩‍❤️‍👩',fitzpatrick_scale:false,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'👨‍❤️‍👨',fitzpatrick_scale:false,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'💏',fitzpatrick_scale:false,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'👩‍❤️‍💋‍👩',fitzpatrick_scale:false,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:'👨‍❤️‍💋‍👨',fitzpatrick_scale:false,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:'👪',fitzpatrick_scale:false,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:'👨‍👩‍👧',fitzpatrick_scale:false,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'👨‍👩‍👧‍👦',fitzpatrick_scale:false,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'👨‍👩‍👦‍👦',fitzpatrick_scale:false,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'👨‍👩‍👧‍👧',fitzpatrick_scale:false,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:'👩‍👩‍👦',fitzpatrick_scale:false,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:'👩‍👩‍👧',fitzpatrick_scale:false,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'👩‍👩‍👧‍👦',fitzpatrick_scale:false,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'👩‍👩‍👦‍👦',fitzpatrick_scale:false,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'👩‍👩‍👧‍👧',fitzpatrick_scale:false,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:'👨‍👨‍👦',fitzpatrick_scale:false,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:'👨‍👨‍👧',fitzpatrick_scale:false,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:'👨‍👨‍👧‍👦',fitzpatrick_scale:false,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:'👨‍👨‍👦‍👦',fitzpatrick_scale:false,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:'👨‍👨‍👧‍👧',fitzpatrick_scale:false,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:'👩‍👦',fitzpatrick_scale:false,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:'👩‍👧',fitzpatrick_scale:false,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:'👩‍👧‍👦',fitzpatrick_scale:false,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:'👩‍👦‍👦',fitzpatrick_scale:false,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:'👩‍👧‍👧',fitzpatrick_scale:false,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:'👨‍👦',fitzpatrick_scale:false,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:'👨‍👧',fitzpatrick_scale:false,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:'👨‍👧‍👦',fitzpatrick_scale:false,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:'👨‍👦‍👦',fitzpatrick_scale:false,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:'👨‍👧‍👧',fitzpatrick_scale:false,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:'🧶',fitzpatrick_scale:false,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:'🧵',fitzpatrick_scale:false,category:"people"},coat:{keywords:["jacket"],char:'🧥',fitzpatrick_scale:false,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:'🥼',fitzpatrick_scale:false,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:'👚',fitzpatrick_scale:false,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:'👕',fitzpatrick_scale:false,category:"people"},jeans:{keywords:["fashion","shopping"],char:'👖',fitzpatrick_scale:false,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:'👔',fitzpatrick_scale:false,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:'👗',fitzpatrick_scale:false,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:'👙',fitzpatrick_scale:false,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:'👘',fitzpatrick_scale:false,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:'💄',fitzpatrick_scale:false,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:'💋',fitzpatrick_scale:false,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:'👣',fitzpatrick_scale:false,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:'🥿',fitzpatrick_scale:false,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:'👠',fitzpatrick_scale:false,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:'👡',fitzpatrick_scale:false,category:"people"},boot:{keywords:["shoes","fashion"],char:'👢',fitzpatrick_scale:false,category:"people"},mans_shoe:{keywords:["fashion","male"],char:'👞',fitzpatrick_scale:false,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:'👟',fitzpatrick_scale:false,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:'🥾',fitzpatrick_scale:false,category:"people"},socks:{keywords:["stockings","clothes"],char:'🧦',fitzpatrick_scale:false,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:'🧤',fitzpatrick_scale:false,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:'🧣',fitzpatrick_scale:false,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:'👒',fitzpatrick_scale:false,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:'🎩',fitzpatrick_scale:false,category:"people"},billed_hat:{keywords:["cap","baseball"],char:'🧢',fitzpatrick_scale:false,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:'⛑',fitzpatrick_scale:false,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:'🎓',fitzpatrick_scale:false,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:'👑',fitzpatrick_scale:false,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:'🎒',fitzpatrick_scale:false,category:"people"},luggage:{keywords:["packing","travel"],char:'🧳',fitzpatrick_scale:false,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:'👝',fitzpatrick_scale:false,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:'👛',fitzpatrick_scale:false,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:'👜',fitzpatrick_scale:false,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:'💼',fitzpatrick_scale:false,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:'👓',fitzpatrick_scale:false,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:'🕶',fitzpatrick_scale:false,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:'🥽',fitzpatrick_scale:false,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:'💍',fitzpatrick_scale:false,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:'🌂',fitzpatrick_scale:false,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:'🐶',fitzpatrick_scale:false,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:'🐱',fitzpatrick_scale:false,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:'🐭',fitzpatrick_scale:false,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:'🐹',fitzpatrick_scale:false,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:'🐰',fitzpatrick_scale:false,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:'🦊',fitzpatrick_scale:false,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:'🐻',fitzpatrick_scale:false,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:'🐼',fitzpatrick_scale:false,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:'🐨',fitzpatrick_scale:false,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:'🐯',fitzpatrick_scale:false,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:'🦁',fitzpatrick_scale:false,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:'🐮',fitzpatrick_scale:false,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:'🐷',fitzpatrick_scale:false,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:'🐽',fitzpatrick_scale:false,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:'🐸',fitzpatrick_scale:false,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:'🦑',fitzpatrick_scale:false,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:'🐙',fitzpatrick_scale:false,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:'🦐',fitzpatrick_scale:false,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:'🐵',fitzpatrick_scale:false,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:'🦍',fitzpatrick_scale:false,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:'🙈',fitzpatrick_scale:false,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:'🙉',fitzpatrick_scale:false,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:'🙊',fitzpatrick_scale:false,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:'🐒',fitzpatrick_scale:false,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:'🐔',fitzpatrick_scale:false,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:'🐧',fitzpatrick_scale:false,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:'🐦',fitzpatrick_scale:false,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:'🐤',fitzpatrick_scale:false,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:'🐣',fitzpatrick_scale:false,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:'🐥',fitzpatrick_scale:false,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:'🦆',fitzpatrick_scale:false,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:'🦅',fitzpatrick_scale:false,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:'🦉',fitzpatrick_scale:false,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:'🦇',fitzpatrick_scale:false,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:'🐺',fitzpatrick_scale:false,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:'🐗',fitzpatrick_scale:false,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:'🐴',fitzpatrick_scale:false,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:'🦄',fitzpatrick_scale:false,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:'🐝',fitzpatrick_scale:false,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:'🐛',fitzpatrick_scale:false,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:'🦋',fitzpatrick_scale:false,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:'🐌',fitzpatrick_scale:false,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:'🐞',fitzpatrick_scale:false,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:'🐜',fitzpatrick_scale:false,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:'🦗',fitzpatrick_scale:false,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:'🕷',fitzpatrick_scale:false,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:'🦂',fitzpatrick_scale:false,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:'🦀',fitzpatrick_scale:false,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:'🐍',fitzpatrick_scale:false,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:'🦎',fitzpatrick_scale:false,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:'🦖',fitzpatrick_scale:false,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:'🦕',fitzpatrick_scale:false,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:'🐢',fitzpatrick_scale:false,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:'🐠',fitzpatrick_scale:false,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:'🐟',fitzpatrick_scale:false,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:'🐡',fitzpatrick_scale:false,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:'🐬',fitzpatrick_scale:false,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:'🦈',fitzpatrick_scale:false,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:'🐳',fitzpatrick_scale:false,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:'🐋',fitzpatrick_scale:false,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:'🐊',fitzpatrick_scale:false,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:'🐆',fitzpatrick_scale:false,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:'🦓',fitzpatrick_scale:false,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:'🐅',fitzpatrick_scale:false,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:'🐃',fitzpatrick_scale:false,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:'🐂',fitzpatrick_scale:false,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:'🐄',fitzpatrick_scale:false,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:'🦌',fitzpatrick_scale:false,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:'🐪',fitzpatrick_scale:false,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:'🐫',fitzpatrick_scale:false,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:'🦒',fitzpatrick_scale:false,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:'🐘',fitzpatrick_scale:false,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:'🦏',fitzpatrick_scale:false,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:'🐐',fitzpatrick_scale:false,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:'🐏',fitzpatrick_scale:false,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:'🐑',fitzpatrick_scale:false,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:'🐎',fitzpatrick_scale:false,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:'🐖',fitzpatrick_scale:false,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:'🐀',fitzpatrick_scale:false,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:'🐁',fitzpatrick_scale:false,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:'🐓',fitzpatrick_scale:false,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:'🦃',fitzpatrick_scale:false,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:'🕊',fitzpatrick_scale:false,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:'🐕',fitzpatrick_scale:false,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:'🐩',fitzpatrick_scale:false,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:'🐈',fitzpatrick_scale:false,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:'🐇',fitzpatrick_scale:false,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:'🐿',fitzpatrick_scale:false,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:'🦔',fitzpatrick_scale:false,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:'🦝',fitzpatrick_scale:false,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:'🦙',fitzpatrick_scale:false,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:'🦛',fitzpatrick_scale:false,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:'🦘',fitzpatrick_scale:false,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:'🦡',fitzpatrick_scale:false,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:'🦢',fitzpatrick_scale:false,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:'🦚',fitzpatrick_scale:false,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:'🦜',fitzpatrick_scale:false,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:'🦞',fitzpatrick_scale:false,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:'🦟',fitzpatrick_scale:false,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:'🐾',fitzpatrick_scale:false,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:'🐉',fitzpatrick_scale:false,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:'🐲',fitzpatrick_scale:false,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:'🌵',fitzpatrick_scale:false,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:'🎄',fitzpatrick_scale:false,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:'🌲',fitzpatrick_scale:false,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:'🌳',fitzpatrick_scale:false,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:'🌴',fitzpatrick_scale:false,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:'🌱',fitzpatrick_scale:false,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:'🌿',fitzpatrick_scale:false,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:'☘',fitzpatrick_scale:false,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:'🍀',fitzpatrick_scale:false,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:'🎍',fitzpatrick_scale:false,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:'🎋',fitzpatrick_scale:false,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:'🍃',fitzpatrick_scale:false,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:'🍂',fitzpatrick_scale:false,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:'🍁',fitzpatrick_scale:false,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:'🌾',fitzpatrick_scale:false,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:'🌺',fitzpatrick_scale:false,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:'🌻',fitzpatrick_scale:false,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:'🌹',fitzpatrick_scale:false,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:'🥀',fitzpatrick_scale:false,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:'🌷',fitzpatrick_scale:false,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:'🌼',fitzpatrick_scale:false,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:'🌸',fitzpatrick_scale:false,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:'💐',fitzpatrick_scale:false,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:'🍄',fitzpatrick_scale:false,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:'🌰',fitzpatrick_scale:false,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:'🎃',fitzpatrick_scale:false,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:'🐚',fitzpatrick_scale:false,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:'🕸',fitzpatrick_scale:false,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:'🌎',fitzpatrick_scale:false,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:'🌍',fitzpatrick_scale:false,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:'🌏',fitzpatrick_scale:false,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:'🌕',fitzpatrick_scale:false,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:'🌖',fitzpatrick_scale:false,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌗',fitzpatrick_scale:false,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌘',fitzpatrick_scale:false,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌑',fitzpatrick_scale:false,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌒',fitzpatrick_scale:false,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌓',fitzpatrick_scale:false,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:'🌔',fitzpatrick_scale:false,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌚',fitzpatrick_scale:false,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌝',fitzpatrick_scale:false,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌛',fitzpatrick_scale:false,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'🌜',fitzpatrick_scale:false,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:'🌞',fitzpatrick_scale:false,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:'🌙',fitzpatrick_scale:false,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:'⭐',fitzpatrick_scale:false,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:'🌟',fitzpatrick_scale:false,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:'💫',fitzpatrick_scale:false,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:'✨',fitzpatrick_scale:false,category:"animals_and_nature"},comet:{keywords:["space"],char:'☄',fitzpatrick_scale:false,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:'☀️',fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:'🌤',fitzpatrick_scale:false,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:'⛅',fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:'🌥',fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:'🌦',fitzpatrick_scale:false,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:'☁️',fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:'🌧',fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:'⛈',fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:'🌩',fitzpatrick_scale:false,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:'⚡',fitzpatrick_scale:false,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:'🔥',fitzpatrick_scale:false,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:'💥',fitzpatrick_scale:false,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:'❄️',fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:'🌨',fitzpatrick_scale:false,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:'⛄',fitzpatrick_scale:false,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:'☃',fitzpatrick_scale:false,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:'🌬',fitzpatrick_scale:false,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:'💨',fitzpatrick_scale:false,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:'🌪',fitzpatrick_scale:false,category:"animals_and_nature"},fog:{keywords:["weather"],char:'🌫',fitzpatrick_scale:false,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:'☂',fitzpatrick_scale:false,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:'☔',fitzpatrick_scale:false,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:'💧',fitzpatrick_scale:false,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:'💦',fitzpatrick_scale:false,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:'🌊',fitzpatrick_scale:false,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:'🍏',fitzpatrick_scale:false,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:'🍎',fitzpatrick_scale:false,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:'🍐',fitzpatrick_scale:false,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:'🍊',fitzpatrick_scale:false,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:'🍋',fitzpatrick_scale:false,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:'🍌',fitzpatrick_scale:false,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:'🍉',fitzpatrick_scale:false,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:'🍇',fitzpatrick_scale:false,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:'🍓',fitzpatrick_scale:false,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:'🍈',fitzpatrick_scale:false,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:'🍒',fitzpatrick_scale:false,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:'🍑',fitzpatrick_scale:false,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:'🍍',fitzpatrick_scale:false,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:'🥥',fitzpatrick_scale:false,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:'🥝',fitzpatrick_scale:false,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:'🥭',fitzpatrick_scale:false,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:'🥑',fitzpatrick_scale:false,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:'🥦',fitzpatrick_scale:false,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:'🍅',fitzpatrick_scale:false,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:'🍆',fitzpatrick_scale:false,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:'🥒',fitzpatrick_scale:false,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:'🥕',fitzpatrick_scale:false,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:'🌶',fitzpatrick_scale:false,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:'🥔',fitzpatrick_scale:false,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:'🌽',fitzpatrick_scale:false,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:'🥬',fitzpatrick_scale:false,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:'🍠',fitzpatrick_scale:false,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:'🥜',fitzpatrick_scale:false,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:'🍯',fitzpatrick_scale:false,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:'🥐',fitzpatrick_scale:false,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:'🍞',fitzpatrick_scale:false,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:'🥖',fitzpatrick_scale:false,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:'🥯',fitzpatrick_scale:false,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:'🥨',fitzpatrick_scale:false,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:'🧀',fitzpatrick_scale:false,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:'🥚',fitzpatrick_scale:false,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:'🥓',fitzpatrick_scale:false,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:'🥩',fitzpatrick_scale:false,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:'🥞',fitzpatrick_scale:false,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:'🍗',fitzpatrick_scale:false,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:'🍖',fitzpatrick_scale:false,category:"food_and_drink"},bone:{keywords:["skeleton"],char:'🦴',fitzpatrick_scale:false,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:'🍤',fitzpatrick_scale:false,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:'🍳',fitzpatrick_scale:false,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:'🍔',fitzpatrick_scale:false,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:'🍟',fitzpatrick_scale:false,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:'🥙',fitzpatrick_scale:false,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:'🌭',fitzpatrick_scale:false,category:"food_and_drink"},pizza:{keywords:["food","party"],char:'🍕',fitzpatrick_scale:false,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:'🥪',fitzpatrick_scale:false,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:'🥫',fitzpatrick_scale:false,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:'🍝',fitzpatrick_scale:false,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:'🌮',fitzpatrick_scale:false,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:'🌯',fitzpatrick_scale:false,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:'🥗',fitzpatrick_scale:false,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:'🥘',fitzpatrick_scale:false,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:'🍜',fitzpatrick_scale:false,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:'🍲',fitzpatrick_scale:false,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:'🍥',fitzpatrick_scale:false,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:'🥠',fitzpatrick_scale:false,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:'🍣',fitzpatrick_scale:false,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:'🍱',fitzpatrick_scale:false,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:'🍛',fitzpatrick_scale:false,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:'🍙',fitzpatrick_scale:false,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:'🍚',fitzpatrick_scale:false,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:'🍘',fitzpatrick_scale:false,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:'🍢',fitzpatrick_scale:false,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:'🍡',fitzpatrick_scale:false,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:'🍧',fitzpatrick_scale:false,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:'🍨',fitzpatrick_scale:false,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:'🍦',fitzpatrick_scale:false,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:'🥧',fitzpatrick_scale:false,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:'🍰',fitzpatrick_scale:false,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:'🧁',fitzpatrick_scale:false,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:'🥮',fitzpatrick_scale:false,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:'🎂',fitzpatrick_scale:false,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:'🍮',fitzpatrick_scale:false,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:'🍬',fitzpatrick_scale:false,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:'🍭',fitzpatrick_scale:false,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:'🍫',fitzpatrick_scale:false,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:'🍿',fitzpatrick_scale:false,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:'🥟',fitzpatrick_scale:false,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:'🍩',fitzpatrick_scale:false,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:'🍪',fitzpatrick_scale:false,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:'🥛',fitzpatrick_scale:false,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'🍺',fitzpatrick_scale:false,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'🍻',fitzpatrick_scale:false,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:'🥂',fitzpatrick_scale:false,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:'🍷',fitzpatrick_scale:false,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:'🥃',fitzpatrick_scale:false,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:'🍸',fitzpatrick_scale:false,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:'🍹',fitzpatrick_scale:false,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:'🍾',fitzpatrick_scale:false,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:'🍶',fitzpatrick_scale:false,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:'🍵',fitzpatrick_scale:false,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:'🥤',fitzpatrick_scale:false,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:'☕',fitzpatrick_scale:false,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:'🍼',fitzpatrick_scale:false,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:'🧂',fitzpatrick_scale:false,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:'🥄',fitzpatrick_scale:false,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:'🍴',fitzpatrick_scale:false,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:'🍽',fitzpatrick_scale:false,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:'🥣',fitzpatrick_scale:false,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:'🥡',fitzpatrick_scale:false,category:"food_and_drink"},chopsticks:{keywords:["food"],char:'🥢',fitzpatrick_scale:false,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:'⚽',fitzpatrick_scale:false,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:'🏀',fitzpatrick_scale:false,category:"activity"},football:{keywords:["sports","balls","NFL"],char:'🏈',fitzpatrick_scale:false,category:"activity"},baseball:{keywords:["sports","balls"],char:'⚾',fitzpatrick_scale:false,category:"activity"},softball:{keywords:["sports","balls"],char:'🥎',fitzpatrick_scale:false,category:"activity"},tennis:{keywords:["sports","balls","green"],char:'🎾',fitzpatrick_scale:false,category:"activity"},volleyball:{keywords:["sports","balls"],char:'🏐',fitzpatrick_scale:false,category:"activity"},rugby_football:{keywords:["sports","team"],char:'🏉',fitzpatrick_scale:false,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:'🥏',fitzpatrick_scale:false,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:'🎱',fitzpatrick_scale:false,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:'⛳',fitzpatrick_scale:false,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:'🏌️‍♀️',fitzpatrick_scale:false,category:"activity"},golfing_man:{keywords:["sports","business"],char:'🏌',fitzpatrick_scale:true,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:'🏓',fitzpatrick_scale:false,category:"activity"},badminton:{keywords:["sports"],char:'🏸',fitzpatrick_scale:false,category:"activity"},goal_net:{keywords:["sports"],char:'🥅',fitzpatrick_scale:false,category:"activity"},ice_hockey:{keywords:["sports"],char:'🏒',fitzpatrick_scale:false,category:"activity"},field_hockey:{keywords:["sports"],char:'🏑',fitzpatrick_scale:false,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:'🥍',fitzpatrick_scale:false,category:"activity"},cricket:{keywords:["sports"],char:'🏏',fitzpatrick_scale:false,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:'🎿',fitzpatrick_scale:false,category:"activity"},skier:{keywords:["sports","winter","snow"],char:'⛷',fitzpatrick_scale:false,category:"activity"},snowboarder:{keywords:["sports","winter"],char:'🏂',fitzpatrick_scale:true,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:'🤺',fitzpatrick_scale:false,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:'🤼‍♀️',fitzpatrick_scale:false,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:'🤼‍♂️',fitzpatrick_scale:false,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:'🤸‍♀️',fitzpatrick_scale:true,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:'🤸‍♂️',fitzpatrick_scale:true,category:"activity"},woman_playing_handball:{keywords:["sports"],char:'🤾‍♀️',fitzpatrick_scale:true,category:"activity"},man_playing_handball:{keywords:["sports"],char:'🤾‍♂️',fitzpatrick_scale:true,category:"activity"},ice_skate:{keywords:["sports"],char:'⛸',fitzpatrick_scale:false,category:"activity"},curling_stone:{keywords:["sports"],char:'🥌',fitzpatrick_scale:false,category:"activity"},skateboard:{keywords:["board"],char:'🛹',fitzpatrick_scale:false,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:'🛷',fitzpatrick_scale:false,category:"activity"},bow_and_arrow:{keywords:["sports"],char:'🏹',fitzpatrick_scale:false,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:'🎣',fitzpatrick_scale:false,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:'🥊',fitzpatrick_scale:false,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:'🥋',fitzpatrick_scale:false,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:'🚣‍♀️',fitzpatrick_scale:true,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:'🚣',fitzpatrick_scale:true,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:'🧗‍♀️',fitzpatrick_scale:true,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:'🧗‍♂️',fitzpatrick_scale:true,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:'🏊‍♀️',fitzpatrick_scale:true,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:'🏊',fitzpatrick_scale:true,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:'🤽‍♀️',fitzpatrick_scale:true,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:'🤽‍♂️',fitzpatrick_scale:true,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:'🧘‍♀️',fitzpatrick_scale:true,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:'🧘‍♂️',fitzpatrick_scale:true,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:'🏄‍♀️',fitzpatrick_scale:true,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:'🏄',fitzpatrick_scale:true,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:'🛀',fitzpatrick_scale:true,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:'⛹️‍♀️',fitzpatrick_scale:true,category:"activity"},basketball_man:{keywords:["sports","human"],char:'⛹',fitzpatrick_scale:true,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:'🏋️‍♀️',fitzpatrick_scale:true,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:'🏋',fitzpatrick_scale:true,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:'🚴‍♀️',fitzpatrick_scale:true,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:'🚴',fitzpatrick_scale:true,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:'🚵‍♀️',fitzpatrick_scale:true,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:'🚵',fitzpatrick_scale:true,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:'🏇',fitzpatrick_scale:true,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:'🕴',fitzpatrick_scale:true,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:'🏆',fitzpatrick_scale:false,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:'🎽',fitzpatrick_scale:false,category:"activity"},medal_sports:{keywords:["award","winning"],char:'🏅',fitzpatrick_scale:false,category:"activity"},medal_military:{keywords:["award","winning","army"],char:'🎖',fitzpatrick_scale:false,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:'🥇',fitzpatrick_scale:false,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:'🥈',fitzpatrick_scale:false,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:'🥉',fitzpatrick_scale:false,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:'🎗',fitzpatrick_scale:false,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:'🏵',fitzpatrick_scale:false,category:"activity"},ticket:{keywords:["event","concert","pass"],char:'🎫',fitzpatrick_scale:false,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:'🎟',fitzpatrick_scale:false,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:'🎭',fitzpatrick_scale:false,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:'🎨',fitzpatrick_scale:false,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:'🎪',fitzpatrick_scale:false,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:'🤹‍♀️',fitzpatrick_scale:true,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:'🤹‍♂️',fitzpatrick_scale:true,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:'🎤',fitzpatrick_scale:false,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:'🎧',fitzpatrick_scale:false,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:'🎼',fitzpatrick_scale:false,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:'🎹',fitzpatrick_scale:false,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:'🥁',fitzpatrick_scale:false,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:'🎷',fitzpatrick_scale:false,category:"activity"},trumpet:{keywords:["music","brass"],char:'🎺',fitzpatrick_scale:false,category:"activity"},guitar:{keywords:["music","instrument"],char:'🎸',fitzpatrick_scale:false,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:'🎻',fitzpatrick_scale:false,category:"activity"},clapper:{keywords:["movie","film","record"],char:'🎬',fitzpatrick_scale:false,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:'🎮',fitzpatrick_scale:false,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:'👾',fitzpatrick_scale:false,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:'🎯',fitzpatrick_scale:false,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:'🎲',fitzpatrick_scale:false,category:"activity"},chess_pawn:{keywords:["expendable"],char:"♟",fitzpatrick_scale:false,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:'🎰',fitzpatrick_scale:false,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:'🧩',fitzpatrick_scale:false,category:"activity"},bowling:{keywords:["sports","fun","play"],char:'🎳',fitzpatrick_scale:false,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:'🚗',fitzpatrick_scale:false,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:'🚕',fitzpatrick_scale:false,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:'🚙',fitzpatrick_scale:false,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:'🚌',fitzpatrick_scale:false,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:'🚎',fitzpatrick_scale:false,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:'🏎',fitzpatrick_scale:false,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:'🚓',fitzpatrick_scale:false,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:'🚑',fitzpatrick_scale:false,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:'🚒',fitzpatrick_scale:false,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:'🚐',fitzpatrick_scale:false,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:'🚚',fitzpatrick_scale:false,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:'🚛',fitzpatrick_scale:false,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:'🚜',fitzpatrick_scale:false,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:'🛴',fitzpatrick_scale:false,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:'🏍',fitzpatrick_scale:false,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:'🚲',fitzpatrick_scale:false,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:'🛵',fitzpatrick_scale:false,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:'🚨',fitzpatrick_scale:false,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:'🚔',fitzpatrick_scale:false,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:'🚍',fitzpatrick_scale:false,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:'🚘',fitzpatrick_scale:false,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:'🚖',fitzpatrick_scale:false,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:'🚡',fitzpatrick_scale:false,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:'🚠',fitzpatrick_scale:false,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:'🚟',fitzpatrick_scale:false,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:'🚃',fitzpatrick_scale:false,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:'🚋',fitzpatrick_scale:false,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:'🚝',fitzpatrick_scale:false,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:'🚄',fitzpatrick_scale:false,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:'🚅',fitzpatrick_scale:false,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:'🚈',fitzpatrick_scale:false,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:'🚞',fitzpatrick_scale:false,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:'🚂',fitzpatrick_scale:false,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:'🚆',fitzpatrick_scale:false,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:'🚇',fitzpatrick_scale:false,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:'🚊',fitzpatrick_scale:false,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:'🚉',fitzpatrick_scale:false,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:'🛸',fitzpatrick_scale:false,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:'🚁',fitzpatrick_scale:false,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:'🛩',fitzpatrick_scale:false,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:'✈️',fitzpatrick_scale:false,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:'🛫',fitzpatrick_scale:false,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:'🛬',fitzpatrick_scale:false,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:'⛵',fitzpatrick_scale:false,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:'🛥',fitzpatrick_scale:false,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:'🚤',fitzpatrick_scale:false,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:'⛴',fitzpatrick_scale:false,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:'🛳',fitzpatrick_scale:false,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:'🚀',fitzpatrick_scale:false,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:'🛰',fitzpatrick_scale:false,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:'💺',fitzpatrick_scale:false,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:'🛶',fitzpatrick_scale:false,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:'⚓',fitzpatrick_scale:false,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:'🚧',fitzpatrick_scale:false,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:'⛽',fitzpatrick_scale:false,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:'🚏',fitzpatrick_scale:false,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:'🚦',fitzpatrick_scale:false,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:'🚥',fitzpatrick_scale:false,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:'🏁',fitzpatrick_scale:false,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:'🚢',fitzpatrick_scale:false,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:'🎡',fitzpatrick_scale:false,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:'🎢',fitzpatrick_scale:false,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:'🎠',fitzpatrick_scale:false,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:'🏗',fitzpatrick_scale:false,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:'🌁',fitzpatrick_scale:false,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:'🗼',fitzpatrick_scale:false,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:'🏭',fitzpatrick_scale:false,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:'⛲',fitzpatrick_scale:false,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:'🎑',fitzpatrick_scale:false,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:'⛰',fitzpatrick_scale:false,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:'🏔',fitzpatrick_scale:false,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:'🗻',fitzpatrick_scale:false,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:'🌋',fitzpatrick_scale:false,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:'🗾',fitzpatrick_scale:false,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:'🏕',fitzpatrick_scale:false,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:'⛺',fitzpatrick_scale:false,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:'🏞',fitzpatrick_scale:false,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:'🛣',fitzpatrick_scale:false,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:'🛤',fitzpatrick_scale:false,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:'🌅',fitzpatrick_scale:false,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:'🌄',fitzpatrick_scale:false,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:'🏜',fitzpatrick_scale:false,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:'🏖',fitzpatrick_scale:false,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:'🏝',fitzpatrick_scale:false,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:'🌇',fitzpatrick_scale:false,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:'🌆',fitzpatrick_scale:false,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:'🏙',fitzpatrick_scale:false,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:'🌃',fitzpatrick_scale:false,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:'🌉',fitzpatrick_scale:false,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:'🌌',fitzpatrick_scale:false,category:"travel_and_places"},stars:{keywords:["night","photo"],char:'🌠',fitzpatrick_scale:false,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:'🎇',fitzpatrick_scale:false,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:'🎆',fitzpatrick_scale:false,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:'🌈',fitzpatrick_scale:false,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:'🏘',fitzpatrick_scale:false,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:'🏰',fitzpatrick_scale:false,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:'🏯',fitzpatrick_scale:false,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:'🏟',fitzpatrick_scale:false,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:'🗽',fitzpatrick_scale:false,category:"travel_and_places"},house:{keywords:["building","home"],char:'🏠',fitzpatrick_scale:false,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:'🏡',fitzpatrick_scale:false,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:'🏚',fitzpatrick_scale:false,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:'🏢',fitzpatrick_scale:false,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:'🏬',fitzpatrick_scale:false,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:'🏣',fitzpatrick_scale:false,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:'🏤',fitzpatrick_scale:false,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:'🏥',fitzpatrick_scale:false,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:'🏦',fitzpatrick_scale:false,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:'🏨',fitzpatrick_scale:false,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:'🏪',fitzpatrick_scale:false,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:'🏫',fitzpatrick_scale:false,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:'🏩',fitzpatrick_scale:false,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:'💒',fitzpatrick_scale:false,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:'🏛',fitzpatrick_scale:false,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:'⛪',fitzpatrick_scale:false,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:'🕌',fitzpatrick_scale:false,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:'🕍',fitzpatrick_scale:false,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:'🕋',fitzpatrick_scale:false,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:'⛩',fitzpatrick_scale:false,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:'⌚',fitzpatrick_scale:false,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:'📱',fitzpatrick_scale:false,category:"objects"},calling:{keywords:["iphone","incoming"],char:'📲',fitzpatrick_scale:false,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:'💻',fitzpatrick_scale:false,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:'⌨',fitzpatrick_scale:false,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:'🖥',fitzpatrick_scale:false,category:"objects"},printer:{keywords:["paper","ink"],char:'🖨',fitzpatrick_scale:false,category:"objects"},computer_mouse:{keywords:["click"],char:'🖱',fitzpatrick_scale:false,category:"objects"},trackball:{keywords:["technology","trackpad"],char:'🖲',fitzpatrick_scale:false,category:"objects"},joystick:{keywords:["game","play"],char:'🕹',fitzpatrick_scale:false,category:"objects"},clamp:{keywords:["tool"],char:'🗜',fitzpatrick_scale:false,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:'💽',fitzpatrick_scale:false,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:'💾',fitzpatrick_scale:false,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:'💿',fitzpatrick_scale:false,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:'📀',fitzpatrick_scale:false,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:'📼',fitzpatrick_scale:false,category:"objects"},camera:{keywords:["gadgets","photography"],char:'📷',fitzpatrick_scale:false,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:'📸',fitzpatrick_scale:false,category:"objects"},video_camera:{keywords:["film","record"],char:'📹',fitzpatrick_scale:false,category:"objects"},movie_camera:{keywords:["film","record"],char:'🎥',fitzpatrick_scale:false,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:'📽',fitzpatrick_scale:false,category:"objects"},film_strip:{keywords:["movie"],char:'🎞',fitzpatrick_scale:false,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:'📞',fitzpatrick_scale:false,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:'☎️',fitzpatrick_scale:false,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:'📟',fitzpatrick_scale:false,category:"objects"},fax:{keywords:["communication","technology"],char:'📠',fitzpatrick_scale:false,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:'📺',fitzpatrick_scale:false,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:'📻',fitzpatrick_scale:false,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:'🎙',fitzpatrick_scale:false,category:"objects"},level_slider:{keywords:["scale"],char:'🎚',fitzpatrick_scale:false,category:"objects"},control_knobs:{keywords:["dial"],char:'🎛',fitzpatrick_scale:false,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:'🧭',fitzpatrick_scale:false,category:"objects"},stopwatch:{keywords:["time","deadline"],char:'⏱',fitzpatrick_scale:false,category:"objects"},timer_clock:{keywords:["alarm"],char:'⏲',fitzpatrick_scale:false,category:"objects"},alarm_clock:{keywords:["time","wake"],char:'⏰',fitzpatrick_scale:false,category:"objects"},mantelpiece_clock:{keywords:["time"],char:'🕰',fitzpatrick_scale:false,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:'⏳',fitzpatrick_scale:false,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:'⌛',fitzpatrick_scale:false,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:'📡',fitzpatrick_scale:false,category:"objects"},battery:{keywords:["power","energy","sustain"],char:'🔋',fitzpatrick_scale:false,category:"objects"},electric_plug:{keywords:["charger","power"],char:'🔌',fitzpatrick_scale:false,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:'💡',fitzpatrick_scale:false,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:'🔦',fitzpatrick_scale:false,category:"objects"},candle:{keywords:["fire","wax"],char:'🕯',fitzpatrick_scale:false,category:"objects"},fire_extinguisher:{keywords:["quench"],char:'🧯',fitzpatrick_scale:false,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:'🗑',fitzpatrick_scale:false,category:"objects"},oil_drum:{keywords:["barrell"],char:'🛢',fitzpatrick_scale:false,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:'💸',fitzpatrick_scale:false,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:'💵',fitzpatrick_scale:false,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:'💴',fitzpatrick_scale:false,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:'💶',fitzpatrick_scale:false,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:'💷',fitzpatrick_scale:false,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:'💰',fitzpatrick_scale:false,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:'💳',fitzpatrick_scale:false,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:'💎',fitzpatrick_scale:false,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:'⚖',fitzpatrick_scale:false,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:'🧰',fitzpatrick_scale:false,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:'🔧',fitzpatrick_scale:false,category:"objects"},hammer:{keywords:["tools","build","create"],char:'🔨',fitzpatrick_scale:false,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:'⚒',fitzpatrick_scale:false,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:'🛠',fitzpatrick_scale:false,category:"objects"},pick:{keywords:["tools","dig"],char:'⛏',fitzpatrick_scale:false,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:'🔩',fitzpatrick_scale:false,category:"objects"},gear:{keywords:["cog"],char:'⚙',fitzpatrick_scale:false,category:"objects"},brick:{keywords:["bricks"],char:'🧱',fitzpatrick_scale:false,category:"objects"},chains:{keywords:["lock","arrest"],char:'⛓',fitzpatrick_scale:false,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:'🧲',fitzpatrick_scale:false,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:'🔫',fitzpatrick_scale:false,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:'💣',fitzpatrick_scale:false,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:'🧨',fitzpatrick_scale:false,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:'🔪',fitzpatrick_scale:false,category:"objects"},dagger:{keywords:["weapon"],char:'🗡',fitzpatrick_scale:false,category:"objects"},crossed_swords:{keywords:["weapon"],char:'⚔',fitzpatrick_scale:false,category:"objects"},shield:{keywords:["protection","security"],char:'🛡',fitzpatrick_scale:false,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:'🚬',fitzpatrick_scale:false,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:'☠',fitzpatrick_scale:false,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:'⚰',fitzpatrick_scale:false,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:'⚱',fitzpatrick_scale:false,category:"objects"},amphora:{keywords:["vase","jar"],char:'🏺',fitzpatrick_scale:false,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:'🔮',fitzpatrick_scale:false,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:'📿',fitzpatrick_scale:false,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:'🧿',fitzpatrick_scale:false,category:"objects"},barber:{keywords:["hair","salon","style"],char:'💈',fitzpatrick_scale:false,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:'⚗',fitzpatrick_scale:false,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:'🔭',fitzpatrick_scale:false,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:'🔬',fitzpatrick_scale:false,category:"objects"},hole:{keywords:["embarrassing"],char:'🕳',fitzpatrick_scale:false,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:'💊',fitzpatrick_scale:false,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:'💉',fitzpatrick_scale:false,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:'🧬',fitzpatrick_scale:false,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:'🦠',fitzpatrick_scale:false,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:'🧫',fitzpatrick_scale:false,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:'🧪',fitzpatrick_scale:false,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:'🌡',fitzpatrick_scale:false,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:'🧹',fitzpatrick_scale:false,category:"objects"},basket:{keywords:["laundry"],char:'🧺',fitzpatrick_scale:false,category:"objects"},toilet_paper:{keywords:["roll"],char:'🧻',fitzpatrick_scale:false,category:"objects"},label:{keywords:["sale","tag"],char:'🏷',fitzpatrick_scale:false,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:'🔖',fitzpatrick_scale:false,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:'🚽',fitzpatrick_scale:false,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:'🚿',fitzpatrick_scale:false,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:'🛁',fitzpatrick_scale:false,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:'🧼',fitzpatrick_scale:false,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:'🧽',fitzpatrick_scale:false,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:'🧴',fitzpatrick_scale:false,category:"objects"},key:{keywords:["lock","door","password"],char:'🔑',fitzpatrick_scale:false,category:"objects"},old_key:{keywords:["lock","door","password"],char:'🗝',fitzpatrick_scale:false,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:'🛋',fitzpatrick_scale:false,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:'🛌',fitzpatrick_scale:true,category:"objects"},bed:{keywords:["sleep","rest"],char:'🛏',fitzpatrick_scale:false,category:"objects"},door:{keywords:["house","entry","exit"],char:'🚪',fitzpatrick_scale:false,category:"objects"},bellhop_bell:{keywords:["service"],char:'🛎',fitzpatrick_scale:false,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:'🧸',fitzpatrick_scale:false,category:"objects"},framed_picture:{keywords:["photography"],char:'🖼',fitzpatrick_scale:false,category:"objects"},world_map:{keywords:["location","direction"],char:'🗺',fitzpatrick_scale:false,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:'⛱',fitzpatrick_scale:false,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:'🗿',fitzpatrick_scale:false,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:'🛍',fitzpatrick_scale:false,category:"objects"},shopping_cart:{keywords:["trolley"],char:'🛒',fitzpatrick_scale:false,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:'🎈',fitzpatrick_scale:false,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:'🎏',fitzpatrick_scale:false,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:'🎀',fitzpatrick_scale:false,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:'🎁',fitzpatrick_scale:false,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:'🎊',fitzpatrick_scale:false,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:'🎉',fitzpatrick_scale:false,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:'🎎',fitzpatrick_scale:false,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:'🎐',fitzpatrick_scale:false,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:'🎌',fitzpatrick_scale:false,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:'🏮',fitzpatrick_scale:false,category:"objects"},red_envelope:{keywords:["gift"],char:'🧧',fitzpatrick_scale:false,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:'✉️',fitzpatrick_scale:false,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:'📩',fitzpatrick_scale:false,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:'📨',fitzpatrick_scale:false,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:'📧',fitzpatrick_scale:false,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:'💌',fitzpatrick_scale:false,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:'📮',fitzpatrick_scale:false,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:'📪',fitzpatrick_scale:false,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:'📫',fitzpatrick_scale:false,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:'📬',fitzpatrick_scale:false,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:'📭',fitzpatrick_scale:false,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:'📦',fitzpatrick_scale:false,category:"objects"},postal_horn:{keywords:["instrument","music"],char:'📯',fitzpatrick_scale:false,category:"objects"},inbox_tray:{keywords:["email","documents"],char:'📥',fitzpatrick_scale:false,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:'📤',fitzpatrick_scale:false,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:'📜',fitzpatrick_scale:false,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:'📃',fitzpatrick_scale:false,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:'📑',fitzpatrick_scale:false,category:"objects"},receipt:{keywords:["accounting","expenses"],char:'🧾',fitzpatrick_scale:false,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:'📊',fitzpatrick_scale:false,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:'📈',fitzpatrick_scale:false,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:'📉',fitzpatrick_scale:false,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:'📄',fitzpatrick_scale:false,category:"objects"},date:{keywords:["calendar","schedule"],char:'📅',fitzpatrick_scale:false,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:'📆',fitzpatrick_scale:false,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:'🗓',fitzpatrick_scale:false,category:"objects"},card_index:{keywords:["business","stationery"],char:'📇',fitzpatrick_scale:false,category:"objects"},card_file_box:{keywords:["business","stationery"],char:'🗃',fitzpatrick_scale:false,category:"objects"},ballot_box:{keywords:["election","vote"],char:'🗳',fitzpatrick_scale:false,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:'🗄',fitzpatrick_scale:false,category:"objects"},clipboard:{keywords:["stationery","documents"],char:'📋',fitzpatrick_scale:false,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:'🗒',fitzpatrick_scale:false,category:"objects"},file_folder:{keywords:["documents","business","office"],char:'📁',fitzpatrick_scale:false,category:"objects"},open_file_folder:{keywords:["documents","load"],char:'📂',fitzpatrick_scale:false,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:'🗂',fitzpatrick_scale:false,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:'🗞',fitzpatrick_scale:false,category:"objects"},newspaper:{keywords:["press","headline"],char:'📰',fitzpatrick_scale:false,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:'📓',fitzpatrick_scale:false,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:'📕',fitzpatrick_scale:false,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:'📗',fitzpatrick_scale:false,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:'📘',fitzpatrick_scale:false,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:'📙',fitzpatrick_scale:false,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:'📔',fitzpatrick_scale:false,category:"objects"},ledger:{keywords:["notes","paper"],char:'📒',fitzpatrick_scale:false,category:"objects"},books:{keywords:["literature","library","study"],char:'📚',fitzpatrick_scale:false,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:'📖',fitzpatrick_scale:false,category:"objects"},safety_pin:{keywords:["diaper"],char:'🧷',fitzpatrick_scale:false,category:"objects"},link:{keywords:["rings","url"],char:'🔗',fitzpatrick_scale:false,category:"objects"},paperclip:{keywords:["documents","stationery"],char:'📎',fitzpatrick_scale:false,category:"objects"},paperclips:{keywords:["documents","stationery"],char:'🖇',fitzpatrick_scale:false,category:"objects"},scissors:{keywords:["stationery","cut"],char:'✂️',fitzpatrick_scale:false,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:'📐',fitzpatrick_scale:false,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:'📏',fitzpatrick_scale:false,category:"objects"},abacus:{keywords:["calculation"],char:'🧮',fitzpatrick_scale:false,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:'📌',fitzpatrick_scale:false,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:'📍',fitzpatrick_scale:false,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:'🚩',fitzpatrick_scale:false,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:'🏳',fitzpatrick_scale:false,category:"objects"},black_flag:{keywords:["pirate"],char:'🏴',fitzpatrick_scale:false,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:'🏳️‍🌈',fitzpatrick_scale:false,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:'🔐',fitzpatrick_scale:false,category:"objects"},lock:{keywords:["security","password","padlock"],char:'🔒',fitzpatrick_scale:false,category:"objects"},unlock:{keywords:["privacy","security"],char:'🔓',fitzpatrick_scale:false,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:'🔏',fitzpatrick_scale:false,category:"objects"},pen:{keywords:["stationery","writing","write"],char:'🖊',fitzpatrick_scale:false,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:'🖋',fitzpatrick_scale:false,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:'✒️',fitzpatrick_scale:false,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:'📝',fitzpatrick_scale:false,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:'✏️',fitzpatrick_scale:false,category:"objects"},crayon:{keywords:["drawing","creativity"],char:'🖍',fitzpatrick_scale:false,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:'🖌',fitzpatrick_scale:false,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:'🔍',fitzpatrick_scale:false,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:'🔎',fitzpatrick_scale:false,category:"objects"},heart:{keywords:["love","like","valentines"],char:'❤️',fitzpatrick_scale:false,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:'🧡',fitzpatrick_scale:false,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:'💛',fitzpatrick_scale:false,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:'💚',fitzpatrick_scale:false,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:'💙',fitzpatrick_scale:false,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:'💜',fitzpatrick_scale:false,category:"symbols"},black_heart:{keywords:["evil"],char:'🖤',fitzpatrick_scale:false,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:'💔',fitzpatrick_scale:false,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:'❣',fitzpatrick_scale:false,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:'💕',fitzpatrick_scale:false,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:'💞',fitzpatrick_scale:false,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:'💓',fitzpatrick_scale:false,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:'💗',fitzpatrick_scale:false,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:'💖',fitzpatrick_scale:false,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:'💘',fitzpatrick_scale:false,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:'💝',fitzpatrick_scale:false,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:'💟',fitzpatrick_scale:false,category:"symbols"},peace_symbol:{keywords:["hippie"],char:'☮',fitzpatrick_scale:false,category:"symbols"},latin_cross:{keywords:["christianity"],char:'✝',fitzpatrick_scale:false,category:"symbols"},star_and_crescent:{keywords:["islam"],char:'☪',fitzpatrick_scale:false,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'🕉',fitzpatrick_scale:false,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'☸',fitzpatrick_scale:false,category:"symbols"},star_of_david:{keywords:["judaism"],char:'✡',fitzpatrick_scale:false,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:'🔯',fitzpatrick_scale:false,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:'🕎',fitzpatrick_scale:false,category:"symbols"},yin_yang:{keywords:["balance"],char:'☯',fitzpatrick_scale:false,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:'☦',fitzpatrick_scale:false,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:'🛐',fitzpatrick_scale:false,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:'⛎',fitzpatrick_scale:false,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:'♈',fitzpatrick_scale:false,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:'♉',fitzpatrick_scale:false,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:'♊',fitzpatrick_scale:false,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:'♋',fitzpatrick_scale:false,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:'♌',fitzpatrick_scale:false,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:'♍',fitzpatrick_scale:false,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:'♎',fitzpatrick_scale:false,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:'♏',fitzpatrick_scale:false,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:'♐',fitzpatrick_scale:false,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:'♑',fitzpatrick_scale:false,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:'♒',fitzpatrick_scale:false,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:'♓',fitzpatrick_scale:false,category:"symbols"},id:{keywords:["purple-square","words"],char:'🆔',fitzpatrick_scale:false,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:'⚛',fitzpatrick_scale:false,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:'🈳',fitzpatrick_scale:false,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:'🈹',fitzpatrick_scale:false,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:'☢',fitzpatrick_scale:false,category:"symbols"},biohazard:{keywords:["danger"],char:'☣',fitzpatrick_scale:false,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:'📴',fitzpatrick_scale:false,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:'📳',fitzpatrick_scale:false,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:'🈶',fitzpatrick_scale:false,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:'🈚',fitzpatrick_scale:false,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:'🈸',fitzpatrick_scale:false,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:'🈺',fitzpatrick_scale:false,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:'🈷️',fitzpatrick_scale:false,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:'✴️',fitzpatrick_scale:false,category:"symbols"},vs:{keywords:["words","orange-square"],char:'🆚',fitzpatrick_scale:false,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:'🉑',fitzpatrick_scale:false,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:'💮',fitzpatrick_scale:false,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:'🉐',fitzpatrick_scale:false,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:'㊙️',fitzpatrick_scale:false,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:'㊗️',fitzpatrick_scale:false,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:'🈴',fitzpatrick_scale:false,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:'🈵',fitzpatrick_scale:false,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:'🈲',fitzpatrick_scale:false,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:'🅰️',fitzpatrick_scale:false,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:'🅱️',fitzpatrick_scale:false,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:'🆎',fitzpatrick_scale:false,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:'🆑',fitzpatrick_scale:false,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:'🅾️',fitzpatrick_scale:false,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:'🆘',fitzpatrick_scale:false,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:'⛔',fitzpatrick_scale:false,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:'📛',fitzpatrick_scale:false,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:'🚫',fitzpatrick_scale:false,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:'❌',fitzpatrick_scale:false,category:"symbols"},o:{keywords:["circle","round"],char:'⭕',fitzpatrick_scale:false,category:"symbols"},stop_sign:{keywords:["stop"],char:'🛑',fitzpatrick_scale:false,category:"symbols"},anger:{keywords:["angry","mad"],char:'💢',fitzpatrick_scale:false,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:'♨️',fitzpatrick_scale:false,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:'🚷',fitzpatrick_scale:false,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:'🚯',fitzpatrick_scale:false,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:'🚳',fitzpatrick_scale:false,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:'🚱',fitzpatrick_scale:false,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:'🔞',fitzpatrick_scale:false,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:'📵',fitzpatrick_scale:false,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:'❗',fitzpatrick_scale:false,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:'❕',fitzpatrick_scale:false,category:"symbols"},question:{keywords:["doubt","confused"],char:'❓',fitzpatrick_scale:false,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:'❔',fitzpatrick_scale:false,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:'‼️',fitzpatrick_scale:false,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:'⁉️',fitzpatrick_scale:false,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:'🔅',fitzpatrick_scale:false,category:"symbols"},high_brightness:{keywords:["sun","light"],char:'🔆',fitzpatrick_scale:false,category:"symbols"},trident:{keywords:["weapon","spear"],char:'🔱',fitzpatrick_scale:false,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:'⚜',fitzpatrick_scale:false,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:'〽️',fitzpatrick_scale:false,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:'⚠️',fitzpatrick_scale:false,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:'🚸',fitzpatrick_scale:false,category:"symbols"},beginner:{keywords:["badge","shield"],char:'🔰',fitzpatrick_scale:false,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:'♻️',fitzpatrick_scale:false,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:'🈯',fitzpatrick_scale:false,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:'💹',fitzpatrick_scale:false,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:'❇️',fitzpatrick_scale:false,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:'✳️',fitzpatrick_scale:false,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:'❎',fitzpatrick_scale:false,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:'✅',fitzpatrick_scale:false,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:'💠',fitzpatrick_scale:false,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:'🌀',fitzpatrick_scale:false,category:"symbols"},loop:{keywords:["tape","cassette"],char:'➿',fitzpatrick_scale:false,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:'🌐',fitzpatrick_scale:false,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:'Ⓜ️',fitzpatrick_scale:false,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:'🏧',fitzpatrick_scale:false,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:'🈂️',fitzpatrick_scale:false,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:'🛂',fitzpatrick_scale:false,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:'🛃',fitzpatrick_scale:false,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:'🛄',fitzpatrick_scale:false,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:'🛅',fitzpatrick_scale:false,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:'♿',fitzpatrick_scale:false,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:'🚭',fitzpatrick_scale:false,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:'🚾',fitzpatrick_scale:false,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:'🅿️',fitzpatrick_scale:false,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:'🚰',fitzpatrick_scale:false,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:'🚹',fitzpatrick_scale:false,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:'🚺',fitzpatrick_scale:false,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:'🚼',fitzpatrick_scale:false,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:'🚻',fitzpatrick_scale:false,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:'🚮',fitzpatrick_scale:false,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:'🎦',fitzpatrick_scale:false,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:'📶',fitzpatrick_scale:false,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:'🈁',fitzpatrick_scale:false,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:'🆖',fitzpatrick_scale:false,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:'🆗',fitzpatrick_scale:false,category:"symbols"},up:{keywords:["blue-square","above","high"],char:'🆙',fitzpatrick_scale:false,category:"symbols"},cool:{keywords:["words","blue-square"],char:'🆒',fitzpatrick_scale:false,category:"symbols"},new:{keywords:["blue-square","words","start"],char:'🆕',fitzpatrick_scale:false,category:"symbols"},free:{keywords:["blue-square","words"],char:'🆓',fitzpatrick_scale:false,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:'0️⃣',fitzpatrick_scale:false,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:'1️⃣',fitzpatrick_scale:false,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:'2️⃣',fitzpatrick_scale:false,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:'3️⃣',fitzpatrick_scale:false,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:'4️⃣',fitzpatrick_scale:false,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:'5️⃣',fitzpatrick_scale:false,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:'6️⃣',fitzpatrick_scale:false,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:'7️⃣',fitzpatrick_scale:false,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:'8️⃣',fitzpatrick_scale:false,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:'9️⃣',fitzpatrick_scale:false,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:'🔟',fitzpatrick_scale:false,category:"symbols"},asterisk:{keywords:["star","keycap"],char:'*⃣',fitzpatrick_scale:false,category:"symbols"},eject_button:{keywords:["blue-square"],char:'⏏️',fitzpatrick_scale:false,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:'▶️',fitzpatrick_scale:false,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:'⏸',fitzpatrick_scale:false,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:'⏭',fitzpatrick_scale:false,category:"symbols"},stop_button:{keywords:["blue-square"],char:'⏹',fitzpatrick_scale:false,category:"symbols"},record_button:{keywords:["blue-square"],char:'⏺',fitzpatrick_scale:false,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:'⏯',fitzpatrick_scale:false,category:"symbols"},previous_track_button:{keywords:["backward"],char:'⏮',fitzpatrick_scale:false,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:'⏩',fitzpatrick_scale:false,category:"symbols"},rewind:{keywords:["play","blue-square"],char:'⏪',fitzpatrick_scale:false,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:'🔀',fitzpatrick_scale:false,category:"symbols"},repeat:{keywords:["loop","record"],char:'🔁',fitzpatrick_scale:false,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:'🔂',fitzpatrick_scale:false,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:'◀️',fitzpatrick_scale:false,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:'🔼',fitzpatrick_scale:false,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:'🔽',fitzpatrick_scale:false,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:'⏫',fitzpatrick_scale:false,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:'⏬',fitzpatrick_scale:false,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:'➡️',fitzpatrick_scale:false,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:'⬅️',fitzpatrick_scale:false,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:'⬆️',fitzpatrick_scale:false,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:'⬇️',fitzpatrick_scale:false,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:'↗️',fitzpatrick_scale:false,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:'↘️',fitzpatrick_scale:false,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:'↙️',fitzpatrick_scale:false,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:'↖️',fitzpatrick_scale:false,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:'↕️',fitzpatrick_scale:false,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:'↔️',fitzpatrick_scale:false,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:'🔄',fitzpatrick_scale:false,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:'↪️',fitzpatrick_scale:false,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:'↩️',fitzpatrick_scale:false,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:'⤴️',fitzpatrick_scale:false,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:'⤵️',fitzpatrick_scale:false,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:'#️⃣',fitzpatrick_scale:false,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:'ℹ️',fitzpatrick_scale:false,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:'🔤',fitzpatrick_scale:false,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:'🔡',fitzpatrick_scale:false,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:'🔠',fitzpatrick_scale:false,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:'🔣',fitzpatrick_scale:false,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:'🎵',fitzpatrick_scale:false,category:"symbols"},notes:{keywords:["music","score"],char:'🎶',fitzpatrick_scale:false,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:'〰️',fitzpatrick_scale:false,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:'➰',fitzpatrick_scale:false,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:'✔️',fitzpatrick_scale:false,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:'🔃',fitzpatrick_scale:false,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:'➕',fitzpatrick_scale:false,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:'➖',fitzpatrick_scale:false,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:'➗',fitzpatrick_scale:false,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:'✖️',fitzpatrick_scale:false,category:"symbols"},infinity:{keywords:["forever"],char:'♾',fitzpatrick_scale:false,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:'💲',fitzpatrick_scale:false,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:'💱',fitzpatrick_scale:false,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:'©️',fitzpatrick_scale:false,category:"symbols"},registered:{keywords:["alphabet","circle"],char:'®️',fitzpatrick_scale:false,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:'™️',fitzpatrick_scale:false,category:"symbols"},end:{keywords:["words","arrow"],char:'🔚',fitzpatrick_scale:false,category:"symbols"},back:{keywords:["arrow","words","return"],char:'🔙',fitzpatrick_scale:false,category:"symbols"},on:{keywords:["arrow","words"],char:'🔛',fitzpatrick_scale:false,category:"symbols"},top:{keywords:["words","blue-square"],char:'🔝',fitzpatrick_scale:false,category:"symbols"},soon:{keywords:["arrow","words"],char:'🔜',fitzpatrick_scale:false,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:'☑️',fitzpatrick_scale:false,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:'🔘',fitzpatrick_scale:false,category:"symbols"},white_circle:{keywords:["shape","round"],char:'⚪',fitzpatrick_scale:false,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:'⚫',fitzpatrick_scale:false,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:'🔴',fitzpatrick_scale:false,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:'🔵',fitzpatrick_scale:false,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:'🔸',fitzpatrick_scale:false,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:'🔹',fitzpatrick_scale:false,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:'🔶',fitzpatrick_scale:false,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:'🔷',fitzpatrick_scale:false,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:'🔺',fitzpatrick_scale:false,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:'▪️',fitzpatrick_scale:false,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:'▫️',fitzpatrick_scale:false,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:'⬛',fitzpatrick_scale:false,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:'⬜',fitzpatrick_scale:false,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:'🔻',fitzpatrick_scale:false,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:'◼️',fitzpatrick_scale:false,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:'◻️',fitzpatrick_scale:false,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:'◾',fitzpatrick_scale:false,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:'◽',fitzpatrick_scale:false,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:'🔲',fitzpatrick_scale:false,category:"symbols"},white_square_button:{keywords:["shape","input"],char:'🔳',fitzpatrick_scale:false,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:'🔈',fitzpatrick_scale:false,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:'🔉',fitzpatrick_scale:false,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:'🔊',fitzpatrick_scale:false,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:'🔇',fitzpatrick_scale:false,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:'📣',fitzpatrick_scale:false,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:'📢',fitzpatrick_scale:false,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:'🔔',fitzpatrick_scale:false,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:'🔕',fitzpatrick_scale:false,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:'🃏',fitzpatrick_scale:false,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:'🀄',fitzpatrick_scale:false,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:'♠️',fitzpatrick_scale:false,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:'♣️',fitzpatrick_scale:false,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:'♥️',fitzpatrick_scale:false,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:'♦️',fitzpatrick_scale:false,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:'🎴',fitzpatrick_scale:false,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:'💭',fitzpatrick_scale:false,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:'🗯',fitzpatrick_scale:false,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:'💬',fitzpatrick_scale:false,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:'🗨',fitzpatrick_scale:false,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:'🕐',fitzpatrick_scale:false,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:'🕑',fitzpatrick_scale:false,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:'🕒',fitzpatrick_scale:false,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:'🕓',fitzpatrick_scale:false,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:'🕔',fitzpatrick_scale:false,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:'🕕',fitzpatrick_scale:false,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:'🕖',fitzpatrick_scale:false,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:'🕗',fitzpatrick_scale:false,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:'🕘',fitzpatrick_scale:false,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:'🕙',fitzpatrick_scale:false,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:'🕚',fitzpatrick_scale:false,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:'🕛',fitzpatrick_scale:false,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:'🕜',fitzpatrick_scale:false,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:'🕝',fitzpatrick_scale:false,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:'🕞',fitzpatrick_scale:false,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:'🕟',fitzpatrick_scale:false,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:'🕠',fitzpatrick_scale:false,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:'🕡',fitzpatrick_scale:false,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:'🕢',fitzpatrick_scale:false,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:'🕣',fitzpatrick_scale:false,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:'🕤',fitzpatrick_scale:false,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:'🕥',fitzpatrick_scale:false,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:'🕦',fitzpatrick_scale:false,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:'🕧',fitzpatrick_scale:false,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:'🇦🇫',fitzpatrick_scale:false,category:"flags"},aland_islands:{keywords:["Åland","islands","flag","nation","country","banner"],char:'🇦🇽',fitzpatrick_scale:false,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:'🇦🇱',fitzpatrick_scale:false,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:'🇩🇿',fitzpatrick_scale:false,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:'🇦🇸',fitzpatrick_scale:false,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:'🇦🇩',fitzpatrick_scale:false,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:'🇦🇴',fitzpatrick_scale:false,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:'🇦🇮',fitzpatrick_scale:false,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:'🇦🇶',fitzpatrick_scale:false,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:'🇦🇬',fitzpatrick_scale:false,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:'🇦🇷',fitzpatrick_scale:false,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:'🇦🇲',fitzpatrick_scale:false,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:'🇦🇼',fitzpatrick_scale:false,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:'🇦🇺',fitzpatrick_scale:false,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:'🇦🇹',fitzpatrick_scale:false,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:'🇦🇿',fitzpatrick_scale:false,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:'🇧🇸',fitzpatrick_scale:false,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:'🇧🇭',fitzpatrick_scale:false,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:'🇧🇩',fitzpatrick_scale:false,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:'🇧🇧',fitzpatrick_scale:false,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:'🇧🇾',fitzpatrick_scale:false,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:'🇧🇪',fitzpatrick_scale:false,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:'🇧🇿',fitzpatrick_scale:false,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:'🇧🇯',fitzpatrick_scale:false,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:'🇧🇲',fitzpatrick_scale:false,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:'🇧🇹',fitzpatrick_scale:false,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:'🇧🇴',fitzpatrick_scale:false,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:'🇧🇶',fitzpatrick_scale:false,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:'🇧🇦',fitzpatrick_scale:false,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:'🇧🇼',fitzpatrick_scale:false,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:'🇧🇷',fitzpatrick_scale:false,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:'🇮🇴',fitzpatrick_scale:false,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:'🇻🇬',fitzpatrick_scale:false,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:'🇧🇳',fitzpatrick_scale:false,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:'🇧🇬',fitzpatrick_scale:false,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:'🇧🇫',fitzpatrick_scale:false,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:'🇧🇮',fitzpatrick_scale:false,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:'🇨🇻',fitzpatrick_scale:false,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:'🇰🇭',fitzpatrick_scale:false,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:'🇨🇲',fitzpatrick_scale:false,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:'🇨🇦',fitzpatrick_scale:false,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:'🇮🇨',fitzpatrick_scale:false,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:'🇰🇾',fitzpatrick_scale:false,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:'🇨🇫',fitzpatrick_scale:false,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:'🇹🇩',fitzpatrick_scale:false,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:'🇨🇱',fitzpatrick_scale:false,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:'🇨🇳',fitzpatrick_scale:false,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:'🇨🇽',fitzpatrick_scale:false,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:'🇨🇨',fitzpatrick_scale:false,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:'🇨🇴',fitzpatrick_scale:false,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:'🇰🇲',fitzpatrick_scale:false,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:'🇨🇬',fitzpatrick_scale:false,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:'🇨🇩',fitzpatrick_scale:false,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:'🇨🇰',fitzpatrick_scale:false,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:'🇨🇷',fitzpatrick_scale:false,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:'🇭🇷',fitzpatrick_scale:false,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:'🇨🇺',fitzpatrick_scale:false,category:"flags"},curacao:{keywords:["curaçao","flag","nation","country","banner"],char:'🇨🇼',fitzpatrick_scale:false,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:'🇨🇾',fitzpatrick_scale:false,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:'🇨🇿',fitzpatrick_scale:false,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:'🇩🇰',fitzpatrick_scale:false,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:'🇩🇯',fitzpatrick_scale:false,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:'🇩🇲',fitzpatrick_scale:false,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:'🇩🇴',fitzpatrick_scale:false,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:'🇪🇨',fitzpatrick_scale:false,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:'🇪🇬',fitzpatrick_scale:false,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:'🇸🇻',fitzpatrick_scale:false,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:'🇬🇶',fitzpatrick_scale:false,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:'🇪🇷',fitzpatrick_scale:false,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:'🇪🇪',fitzpatrick_scale:false,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:'🇪🇹',fitzpatrick_scale:false,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:'🇪🇺',fitzpatrick_scale:false,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:'🇫🇰',fitzpatrick_scale:false,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:'🇫🇴',fitzpatrick_scale:false,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:'🇫🇯',fitzpatrick_scale:false,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:'🇫🇮',fitzpatrick_scale:false,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:'🇫🇷',fitzpatrick_scale:false,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:'🇬🇫',fitzpatrick_scale:false,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:'🇵🇫',fitzpatrick_scale:false,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:'🇹🇫',fitzpatrick_scale:false,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:'🇬🇦',fitzpatrick_scale:false,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:'🇬🇲',fitzpatrick_scale:false,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:'🇬🇪',fitzpatrick_scale:false,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:'🇩🇪',fitzpatrick_scale:false,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:'🇬🇭',fitzpatrick_scale:false,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:'🇬🇮',fitzpatrick_scale:false,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:'🇬🇷',fitzpatrick_scale:false,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:'🇬🇱',fitzpatrick_scale:false,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:'🇬🇩',fitzpatrick_scale:false,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:'🇬🇵',fitzpatrick_scale:false,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:'🇬🇺',fitzpatrick_scale:false,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:'🇬🇹',fitzpatrick_scale:false,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:'🇬🇬',fitzpatrick_scale:false,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:'🇬🇳',fitzpatrick_scale:false,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:'🇬🇼',fitzpatrick_scale:false,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:'🇬🇾',fitzpatrick_scale:false,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:'🇭🇹',fitzpatrick_scale:false,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:'🇭🇳',fitzpatrick_scale:false,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:'🇭🇰',fitzpatrick_scale:false,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:'🇭🇺',fitzpatrick_scale:false,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:'🇮🇸',fitzpatrick_scale:false,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:'🇮🇳',fitzpatrick_scale:false,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:'🇮🇩',fitzpatrick_scale:false,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:'🇮🇷',fitzpatrick_scale:false,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:'🇮🇶',fitzpatrick_scale:false,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:'🇮🇪',fitzpatrick_scale:false,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:'🇮🇲',fitzpatrick_scale:false,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:'🇮🇱',fitzpatrick_scale:false,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:'🇮🇹',fitzpatrick_scale:false,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:'🇨🇮',fitzpatrick_scale:false,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:'🇯🇲',fitzpatrick_scale:false,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:'🇯🇵',fitzpatrick_scale:false,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:'🇯🇪',fitzpatrick_scale:false,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:'🇯🇴',fitzpatrick_scale:false,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:'🇰🇿',fitzpatrick_scale:false,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:'🇰🇪',fitzpatrick_scale:false,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:'🇰🇮',fitzpatrick_scale:false,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:'🇽🇰',fitzpatrick_scale:false,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:'🇰🇼',fitzpatrick_scale:false,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:'🇰🇬',fitzpatrick_scale:false,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:'🇱🇦',fitzpatrick_scale:false,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:'🇱🇻',fitzpatrick_scale:false,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:'🇱🇧',fitzpatrick_scale:false,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:'🇱🇸',fitzpatrick_scale:false,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:'🇱🇷',fitzpatrick_scale:false,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:'🇱🇾',fitzpatrick_scale:false,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:'🇱🇮',fitzpatrick_scale:false,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:'🇱🇹',fitzpatrick_scale:false,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:'🇱🇺',fitzpatrick_scale:false,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:'🇲🇴',fitzpatrick_scale:false,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:'🇲🇰',fitzpatrick_scale:false,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:'🇲🇬',fitzpatrick_scale:false,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:'🇲🇼',fitzpatrick_scale:false,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:'🇲🇾',fitzpatrick_scale:false,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:'🇲🇻',fitzpatrick_scale:false,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:'🇲🇱',fitzpatrick_scale:false,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:'🇲🇹',fitzpatrick_scale:false,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:'🇲🇭',fitzpatrick_scale:false,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:'🇲🇶',fitzpatrick_scale:false,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:'🇲🇷',fitzpatrick_scale:false,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:'🇲🇺',fitzpatrick_scale:false,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:'🇾🇹',fitzpatrick_scale:false,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:'🇲🇽',fitzpatrick_scale:false,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:'🇫🇲',fitzpatrick_scale:false,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:'🇲🇩',fitzpatrick_scale:false,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:'🇲🇨',fitzpatrick_scale:false,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:'🇲🇳',fitzpatrick_scale:false,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:'🇲🇪',fitzpatrick_scale:false,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:'🇲🇸',fitzpatrick_scale:false,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:'🇲🇦',fitzpatrick_scale:false,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:'🇲🇿',fitzpatrick_scale:false,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:'🇲🇲',fitzpatrick_scale:false,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:'🇳🇦',fitzpatrick_scale:false,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:'🇳🇷',fitzpatrick_scale:false,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:'🇳🇵',fitzpatrick_scale:false,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:'🇳🇱',fitzpatrick_scale:false,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:'🇳🇨',fitzpatrick_scale:false,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:'🇳🇿',fitzpatrick_scale:false,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:'🇳🇮',fitzpatrick_scale:false,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:'🇳🇪',fitzpatrick_scale:false,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:'🇳🇬',fitzpatrick_scale:false,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:'🇳🇺',fitzpatrick_scale:false,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:'🇳🇫',fitzpatrick_scale:false,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:'🇲🇵',fitzpatrick_scale:false,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:'🇰🇵',fitzpatrick_scale:false,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:'🇳🇴',fitzpatrick_scale:false,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:'🇴🇲',fitzpatrick_scale:false,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:'🇵🇰',fitzpatrick_scale:false,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:'🇵🇼',fitzpatrick_scale:false,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:'🇵🇸',fitzpatrick_scale:false,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:'🇵🇦',fitzpatrick_scale:false,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:'🇵🇬',fitzpatrick_scale:false,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:'🇵🇾',fitzpatrick_scale:false,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:'🇵🇪',fitzpatrick_scale:false,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:'🇵🇭',fitzpatrick_scale:false,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:'🇵🇳',fitzpatrick_scale:false,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:'🇵🇱',fitzpatrick_scale:false,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:'🇵🇹',fitzpatrick_scale:false,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:'🇵🇷',fitzpatrick_scale:false,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:'🇶🇦',fitzpatrick_scale:false,category:"flags"},reunion:{keywords:["réunion","flag","nation","country","banner"],char:'🇷🇪',fitzpatrick_scale:false,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:'🇷🇴',fitzpatrick_scale:false,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:'🇷🇺',fitzpatrick_scale:false,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:'🇷🇼',fitzpatrick_scale:false,category:"flags"},st_barthelemy:{keywords:["saint","barthélemy","flag","nation","country","banner"],char:'🇧🇱',fitzpatrick_scale:false,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:'🇸🇭',fitzpatrick_scale:false,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:'🇰🇳',fitzpatrick_scale:false,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:'🇱🇨',fitzpatrick_scale:false,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:'🇵🇲',fitzpatrick_scale:false,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:'🇻🇨',fitzpatrick_scale:false,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:'🇼🇸',fitzpatrick_scale:false,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:'🇸🇲',fitzpatrick_scale:false,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:'🇸🇹',fitzpatrick_scale:false,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:'🇸🇦',fitzpatrick_scale:false,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:'🇸🇳',fitzpatrick_scale:false,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:'🇷🇸',fitzpatrick_scale:false,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:'🇸🇨',fitzpatrick_scale:false,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:'🇸🇱',fitzpatrick_scale:false,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:'🇸🇬',fitzpatrick_scale:false,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:'🇸🇽',fitzpatrick_scale:false,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:'🇸🇰',fitzpatrick_scale:false,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:'🇸🇮',fitzpatrick_scale:false,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:'🇸🇧',fitzpatrick_scale:false,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:'🇸🇴',fitzpatrick_scale:false,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:'🇿🇦',fitzpatrick_scale:false,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:'🇬🇸',fitzpatrick_scale:false,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:'🇰🇷',fitzpatrick_scale:false,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:'🇸🇸',fitzpatrick_scale:false,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:'🇪🇸',fitzpatrick_scale:false,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:'🇱🇰',fitzpatrick_scale:false,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:'🇸🇩',fitzpatrick_scale:false,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:'🇸🇷',fitzpatrick_scale:false,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:'🇸🇿',fitzpatrick_scale:false,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:'🇸🇪',fitzpatrick_scale:false,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:'🇨🇭',fitzpatrick_scale:false,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:'🇸🇾',fitzpatrick_scale:false,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:'🇹🇼',fitzpatrick_scale:false,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:'🇹🇯',fitzpatrick_scale:false,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:'🇹🇿',fitzpatrick_scale:false,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:'🇹🇭',fitzpatrick_scale:false,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:'🇹🇱',fitzpatrick_scale:false,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:'🇹🇬',fitzpatrick_scale:false,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:'🇹🇰',fitzpatrick_scale:false,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:'🇹🇴',fitzpatrick_scale:false,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:'🇹🇹',fitzpatrick_scale:false,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:'🇹🇳',fitzpatrick_scale:false,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:'🇹🇷',fitzpatrick_scale:false,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:'🇹🇲',fitzpatrick_scale:false,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:'🇹🇨',fitzpatrick_scale:false,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:'🇹🇻',fitzpatrick_scale:false,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:'🇺🇬',fitzpatrick_scale:false,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:'🇺🇦',fitzpatrick_scale:false,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:'🇦🇪',fitzpatrick_scale:false,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:'🇬🇧',fitzpatrick_scale:false,category:"flags"},england:{keywords:["flag","english"],char:'🏴󠁧󠁢󠁥󠁮󠁧󠁿',fitzpatrick_scale:false,category:"flags"},scotland:{keywords:["flag","scottish"],char:'🏴󠁧󠁢󠁳󠁣󠁴󠁿',fitzpatrick_scale:false,category:"flags"},wales:{keywords:["flag","welsh"],char:'🏴󠁧󠁢󠁷󠁬󠁳󠁿',fitzpatrick_scale:false,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:'🇺🇸',fitzpatrick_scale:false,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:'🇻🇮',fitzpatrick_scale:false,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:'🇺🇾',fitzpatrick_scale:false,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:'🇺🇿',fitzpatrick_scale:false,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:'🇻🇺',fitzpatrick_scale:false,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:'🇻🇦',fitzpatrick_scale:false,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:'🇻🇪',fitzpatrick_scale:false,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:'🇻🇳',fitzpatrick_scale:false,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:'🇼🇫',fitzpatrick_scale:false,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:'🇪🇭',fitzpatrick_scale:false,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:'🇾🇪',fitzpatrick_scale:false,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:'🇿🇲',fitzpatrick_scale:false,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:'🇿🇼',fitzpatrick_scale:false,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:'🇺🇳',fitzpatrick_scale:false,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:'🏴‍☠️',fitzpatrick_scale:false,category:"flags"}}); \ No newline at end of file diff --git a/public/js/tinymce/plugins/emoticons/js/emojiimages.min.js b/public/js/tinymce/plugins/emoticons/js/emojiimages.min.js index a0451629e..37f3bcf83 100644 --- a/public/js/tinymce/plugins/emoticons/js/emojiimages.min.js +++ b/public/js/tinymce/plugins/emoticons/js/emojiimages.min.js @@ -1,3 +1,3 @@ // Source: npm package: emojilib // Images provided by twemoji: https://github.com/twitter/twemoji -window.tinymce.Resource.add("tinymce.plugins.emoticons",{100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:'\ud83d\udcaf',fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:'\ud83d\udd22',fitzpatrick_scale:!1,category:"symbols"},grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:'\ud83d\ude00',fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:'\ud83d\ude2c',fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:'\ud83d\ude01',fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:'\ud83d\ude02',fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:'\ud83e\udd23',fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:'\ud83e\udd73',fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:'\ud83d\ude03',fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:'\ud83d\ude04',fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:'\ud83d\ude05',fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:'\ud83d\ude06',fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:'\ud83d\ude07',fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:'\ud83d\ude09',fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:'\ud83d\ude0a',fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:'\ud83d\ude42',fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:'\ud83d\ude43',fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:'\u263a\ufe0f',fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:'\ud83d\ude0b',fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:'\ud83d\ude0c',fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:'\ud83d\ude0d',fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:'\ud83e\udd70',fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'\ud83d\ude18',fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:'\ud83d\ude17',fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:'\ud83d\ude19',fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'\ud83d\ude1a',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:'\ud83d\ude1c',fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:'\ud83e\udd2a',fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:'\ud83e\udd28',fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:'\ud83e\uddd0',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:'\ud83d\ude1d',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:'\ud83d\ude1b',fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:'\ud83e\udd11',fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:'\ud83e\udd13',fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:'\ud83d\ude0e',fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:'\ud83e\udd29',fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:'\ud83e\udd21',fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:'\ud83e\udd20',fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:'\ud83e\udd17',fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:'\ud83d\ude0f',fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:'\ud83d\ude36',fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:'\ud83d\ude10',fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:'\ud83d\ude11',fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:'\ud83d\ude12',fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:'\ud83d\ude44',fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:'\ud83e\udd14',fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:'\ud83e\udd25',fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:'\ud83e\udd2d',fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:'\ud83e\udd2b',fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:'\ud83e\udd2c',fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:'\ud83e\udd2f',fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:'\ud83d\ude33',fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:'\ud83d\ude1e',fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:'\ud83d\ude1f',fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:'\ud83d\ude20',fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:'\ud83d\ude21',fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:'\ud83d\ude14',fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:'\ud83d\ude15',fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:'\ud83d\ude41',fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:'\u2639',fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:'\ud83d\ude23',fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:'\ud83d\ude16',fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:'\ud83d\ude2b',fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:'\ud83d\ude29',fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:'\ud83e\udd7a',fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:'\ud83d\ude24',fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:'\ud83d\ude2e',fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:'\ud83d\ude31',fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:'\ud83d\ude28',fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:'\ud83d\ude30',fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:'\ud83d\ude2f',fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:'\ud83d\ude26',fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:'\ud83d\ude27',fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:'\ud83d\ude22',fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:'\ud83d\ude25',fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:'\ud83e\udd24',fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:'\ud83d\ude2a',fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:'\ud83d\ude13',fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:'\ud83e\udd75',fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:'\ud83e\udd76',fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:'\ud83d\ude2d',fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:'\ud83d\ude35',fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:'\ud83d\ude32',fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:'\ud83e\udd10',fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:'\ud83e\udd22',fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:'\ud83e\udd27',fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:'\ud83e\udd2e',fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:'\ud83d\ude37',fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:'\ud83e\udd12',fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:'\ud83e\udd15',fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:'\ud83e\udd74',fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:'\ud83d\ude34',fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:'\ud83d\udca4',fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:'\ud83d\udca9',fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:'\ud83d\ude08',fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:'\ud83d\udc7f',fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:'\ud83d\udc79',fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:'\ud83d\udc7a',fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:'\ud83d\udc80',fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:'\ud83d\udc7b',fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:'\ud83d\udc7d',fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:'\ud83e\udd16',fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:'\ud83d\ude3a',fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:'\ud83d\ude38',fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:'\ud83d\ude39',fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:'\ud83d\ude3b',fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:'\ud83d\ude3c',fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:'\ud83d\ude3d',fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:'\ud83d\ude40',fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:'\ud83d\ude3f',fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:'\ud83d\ude3e',fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:'\ud83e\udd32',fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:'\ud83d\ude4c',fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:'\ud83d\udc4f',fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:'\ud83d\udc4b',fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:'\ud83e\udd19',fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:'\ud83d\udc4d',fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:'\ud83d\udc4e',fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:'\ud83d\udc4a',fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:'\u270a',fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:'\ud83e\udd1b',fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:'\ud83e\udd1c',fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:'\u270c',fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:'\ud83d\udc4c',fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:'\u270b',fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:'\ud83e\udd1a',fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:'\ud83d\udc50',fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:'\ud83d\udcaa',fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:'\ud83d\ude4f',fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:'\ud83e\uddb6',fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:'\ud83e\uddb5',fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:'\ud83e\udd1d',fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:'\u261d',fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:'\ud83d\udc46',fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:'\ud83d\udc47',fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:'\ud83d\udc48',fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:'\ud83d\udc49',fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:'\ud83d\udd95',fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:'\ud83d\udd90',fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:'\ud83e\udd1f',fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:'\ud83e\udd18',fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:'\ud83e\udd1e',fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:'\ud83d\udd96',fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:'\u270d',fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:'\ud83e\udd33',fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:'\ud83d\udc85',fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:'\ud83d\udc44',fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:'\ud83e\uddb7',fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:'\ud83d\udc45',fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:'\ud83d\udc42',fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:'\ud83d\udc43',fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:'\ud83d\udc41',fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:'\ud83d\udc40',fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:'\ud83e\udde0',fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:'\ud83d\udc64',fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:'\ud83d\udc65',fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:'\ud83d\udde3',fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:'\ud83d\udc76',fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:'\ud83e\uddd2',fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:'\ud83d\udc66',fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:'\ud83d\udc67',fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:'\ud83e\uddd1',fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:'\ud83d\udc68',fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:'\ud83d\udc69',fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:'\ud83d\udc71\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:'\ud83d\udc71',fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:'\ud83e\uddd4',fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:'\ud83e\uddd3',fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:'\ud83d\udc74',fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:'\ud83d\udc75',fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:'\ud83d\udc72',fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:'\ud83e\uddd5',fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:'\ud83d\udc73\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:'\ud83d\udc73',fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:'\ud83d\udc6e\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:'\ud83d\udc6e',fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:'\ud83d\udc77\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:'\ud83d\udc77',fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:'\ud83d\udc82\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:'\ud83d\udc82',fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:'\ud83d\udd75\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:'\ud83d\udd75',fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:'\ud83d\udc69\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:'\ud83d\udc68\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udf3e',fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:'\ud83d\udc68\u200d\ud83c\udf3e',fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udf73',fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:'\ud83d\udc68\u200d\ud83c\udf73',fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udf93',fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:'\ud83d\udc68\u200d\ud83c\udf93',fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfa4',fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfa4',fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfeb',fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfeb',fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfed',fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfed',fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:'\ud83d\udc69\u200d\ud83d\udcbb',fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:'\ud83d\udc68\u200d\ud83d\udcbb',fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:'\ud83d\udc69\u200d\ud83d\udcbc',fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:'\ud83d\udc68\u200d\ud83d\udcbc',fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:'\ud83d\udc69\u200d\ud83d\udd27',fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:'\ud83d\udc68\u200d\ud83d\udd27',fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:'\ud83d\udc69\u200d\ud83d\udd2c',fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:'\ud83d\udc68\u200d\ud83d\udd2c',fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfa8',fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfa8',fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:'\ud83d\udc69\u200d\ud83d\ude92',fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:'\ud83d\udc68\u200d\ud83d\ude92',fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:'\ud83d\udc69\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:'\ud83d\udc68\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:'\ud83d\udc69\u200d\ud83d\ude80',fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:'\ud83d\udc68\u200d\ud83d\ude80',fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:'\ud83d\udc69\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:'\ud83d\udc68\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:'\ud83e\uddb8\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:'\ud83e\uddb8\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:'\ud83e\uddb9\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:'\ud83e\uddb9\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:'\ud83e\udd36',fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:'\ud83c\udf85',fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:'\ud83e\uddd9\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:'\ud83e\uddd9\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:'\ud83e\udddd\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:'\ud83e\udddd\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:'\ud83e\udddb\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:'\ud83e\udddb\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:'\ud83e\udddf\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:'\ud83e\udddf\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:'\ud83e\uddde\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:'\ud83e\uddde\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:'\ud83e\udddc\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:'\ud83e\udddc\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:'\ud83e\uddda\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:'\ud83e\uddda\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:'\ud83d\udc7c',fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:'\ud83e\udd30',fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:'\ud83e\udd31',fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:'\ud83d\udc78',fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:'\ud83e\udd34',fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:'\ud83d\udc70',fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:'\ud83e\udd35',fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:'\ud83c\udfc3\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:'\ud83c\udfc3',fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:'\ud83d\udeb6\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:'\ud83d\udeb6',fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:'\ud83d\udc83',fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:'\ud83d\udd7a',fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:'\ud83d\udc6f',fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:'\ud83d\udc6f\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:'\ud83d\udc6b',fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:'\ud83d\udc6c',fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:'\ud83d\udc6d',fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:'\ud83d\ude47\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:'\ud83d\ude47',fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:'\ud83e\udd26\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:'\ud83e\udd26\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:'\ud83e\udd37',fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:'\ud83e\udd37\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:'\ud83d\udc81',fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:'\ud83d\udc81\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:'\ud83d\ude45',fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:'\ud83d\ude45\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:'\ud83d\ude46',fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:'\ud83d\ude46\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:'\ud83d\ude4b',fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:'\ud83d\ude4b\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:'\ud83d\ude4e',fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:'\ud83d\ude4e\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:'\ud83d\ude4d',fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:'\ud83d\ude4d\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:'\ud83d\udc87',fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:'\ud83d\udc87\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:'\ud83d\udc86',fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:'\ud83d\udc86\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:'\ud83e\uddd6\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:'\ud83e\uddd6\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\ud83d\udc91',fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69',fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68',fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\ud83d\udc8f',fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69',fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:'\ud83d\udc6a',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc69\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc68\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc68\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:'\ud83e\uddf6',fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:'\ud83e\uddf5',fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:'\ud83e\udde5',fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:'\ud83e\udd7c',fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:'\ud83d\udc5a',fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:'\ud83d\udc55',fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:'\ud83d\udc56',fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:'\ud83d\udc54',fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:'\ud83d\udc57',fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:'\ud83d\udc59',fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:'\ud83d\udc58',fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:'\ud83d\udc84',fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:'\ud83d\udc8b',fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:'\ud83d\udc63',fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:'\ud83e\udd7f',fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:'\ud83d\udc60',fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:'\ud83d\udc61',fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:'\ud83d\udc62',fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:'\ud83d\udc5e',fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:'\ud83d\udc5f',fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:'\ud83e\udd7e',fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:'\ud83e\udde6',fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:'\ud83e\udde4',fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:'\ud83e\udde3',fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:'\ud83d\udc52',fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:'\ud83c\udfa9',fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:'\ud83e\udde2',fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:'\u26d1',fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:'\ud83c\udf93',fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:'\ud83d\udc51',fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:'\ud83c\udf92',fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:'\ud83e\uddf3',fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:'\ud83d\udc5d',fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:'\ud83d\udc5b',fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:'\ud83d\udc5c',fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:'\ud83d\udcbc',fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:'\ud83d\udc53',fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:'\ud83d\udd76',fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:'\ud83e\udd7d',fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:'\ud83d\udc8d',fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:'\ud83c\udf02',fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:'\ud83d\udc36',fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:'\ud83d\udc31',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:'\ud83d\udc2d',fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:'\ud83d\udc39',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:'\ud83d\udc30',fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:'\ud83e\udd8a',fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:'\ud83d\udc3b',fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:'\ud83d\udc3c',fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:'\ud83d\udc28',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:'\ud83d\udc2f',fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:'\ud83e\udd81',fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:'\ud83d\udc2e',fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:'\ud83d\udc37',fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:'\ud83d\udc3d',fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:'\ud83d\udc38',fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:'\ud83e\udd91',fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:'\ud83d\udc19',fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:'\ud83e\udd90',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:'\ud83d\udc35',fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:'\ud83e\udd8d',fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:'\ud83d\ude48',fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:'\ud83d\ude49',fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:'\ud83d\ude4a',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:'\ud83d\udc12',fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:'\ud83d\udc14',fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:'\ud83d\udc27',fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:'\ud83d\udc26',fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:'\ud83d\udc24',fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:'\ud83d\udc23',fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:'\ud83d\udc25',fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:'\ud83e\udd86',fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:'\ud83e\udd85',fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:'\ud83e\udd89',fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:'\ud83e\udd87',fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:'\ud83d\udc3a',fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:'\ud83d\udc17',fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:'\ud83d\udc34',fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:'\ud83e\udd84',fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:'\ud83d\udc1d',fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:'\ud83d\udc1b',fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:'\ud83e\udd8b',fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:'\ud83d\udc0c',fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:'\ud83d\udc1e',fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:'\ud83d\udc1c',fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:'\ud83e\udd97',fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:'\ud83d\udd77',fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:'\ud83e\udd82',fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:'\ud83e\udd80',fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:'\ud83d\udc0d',fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:'\ud83e\udd8e',fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:'\ud83e\udd96',fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:'\ud83e\udd95',fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:'\ud83d\udc22',fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:'\ud83d\udc20',fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:'\ud83d\udc1f',fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:'\ud83d\udc21',fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:'\ud83d\udc2c',fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:'\ud83e\udd88',fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:'\ud83d\udc33',fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:'\ud83d\udc0b',fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:'\ud83d\udc0a',fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:'\ud83d\udc06',fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:'\ud83e\udd93',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:'\ud83d\udc05',fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:'\ud83d\udc03',fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:'\ud83d\udc02',fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:'\ud83d\udc04',fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:'\ud83e\udd8c',fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:'\ud83d\udc2a',fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:'\ud83d\udc2b',fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:'\ud83e\udd92',fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:'\ud83d\udc18',fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:'\ud83e\udd8f',fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:'\ud83d\udc10',fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:'\ud83d\udc0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:'\ud83d\udc11',fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:'\ud83d\udc0e',fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:'\ud83d\udc16',fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:'\ud83d\udc00',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:'\ud83d\udc01',fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:'\ud83d\udc13',fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:'\ud83e\udd83',fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:'\ud83d\udd4a',fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:'\ud83d\udc15',fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:'\ud83d\udc29',fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:'\ud83d\udc08',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:'\ud83d\udc07',fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:'\ud83d\udc3f',fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:'\ud83e\udd94',fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:'\ud83e\udd9d',fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:'\ud83e\udd99',fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:'\ud83e\udd9b',fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:'\ud83e\udd98',fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:'\ud83e\udda1',fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:'\ud83e\udda2',fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:'\ud83e\udd9a',fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:'\ud83e\udd9c',fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:'\ud83e\udd9e',fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:'\ud83e\udd9f',fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:'\ud83d\udc3e',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:'\ud83d\udc09',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:'\ud83d\udc32',fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:'\ud83c\udf35',fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:'\ud83c\udf84',fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:'\ud83c\udf32',fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:'\ud83c\udf33',fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:'\ud83c\udf34',fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:'\ud83c\udf31',fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:'\ud83c\udf3f',fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:'\u2618',fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:'\ud83c\udf40',fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:'\ud83c\udf8d',fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:'\ud83c\udf8b',fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:'\ud83c\udf43',fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:'\ud83c\udf42',fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:'\ud83c\udf41',fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:'\ud83c\udf3e',fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:'\ud83c\udf3a',fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:'\ud83c\udf3b',fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:'\ud83c\udf39',fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:'\ud83e\udd40',fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:'\ud83c\udf37',fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:'\ud83c\udf3c',fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:'\ud83c\udf38',fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:'\ud83d\udc90',fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:'\ud83c\udf44',fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:'\ud83c\udf30',fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:'\ud83c\udf83',fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:'\ud83d\udc1a',fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:'\ud83d\udd78',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:'\ud83c\udf0e',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:'\ud83c\udf0d',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:'\ud83c\udf0f',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf15',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:'\ud83c\udf16',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf17',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf18',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf11',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf12',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf13',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:'\ud83c\udf14',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1a',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1d',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1b',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1c',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:'\ud83c\udf1e',fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:'\ud83c\udf19',fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:'\u2b50',fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:'\ud83c\udf1f',fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:'\ud83d\udcab',fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:'\u2728',fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:'\u2604',fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:'\u2600\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:'\ud83c\udf24',fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:'\u26c5',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:'\ud83c\udf25',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:'\ud83c\udf26',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:'\u2601\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:'\ud83c\udf27',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:'\u26c8',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:'\ud83c\udf29',fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:'\u26a1',fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:'\ud83d\udd25',fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:'\ud83d\udca5',fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:'\u2744\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:'\ud83c\udf28',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:'\u26c4',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:'\u2603',fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:'\ud83c\udf2c',fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:'\ud83d\udca8',fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:'\ud83c\udf2a',fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:'\ud83c\udf2b',fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:'\u2602',fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:'\u2614',fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:'\ud83d\udca7',fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:'\ud83d\udca6',fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:'\ud83c\udf0a',fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:'\ud83c\udf4f',fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:'\ud83c\udf4e',fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:'\ud83c\udf50',fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:'\ud83c\udf4a',fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:'\ud83c\udf4b',fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:'\ud83c\udf4c',fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:'\ud83c\udf49',fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:'\ud83c\udf47',fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:'\ud83c\udf53',fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:'\ud83c\udf48',fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:'\ud83c\udf52',fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:'\ud83c\udf51',fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:'\ud83c\udf4d',fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:'\ud83e\udd65',fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:'\ud83e\udd5d',fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:'\ud83e\udd6d',fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:'\ud83e\udd51',fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:'\ud83e\udd66',fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:'\ud83c\udf45',fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:'\ud83c\udf46',fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:'\ud83e\udd52',fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:'\ud83e\udd55',fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:'\ud83c\udf36',fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:'\ud83e\udd54',fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:'\ud83c\udf3d',fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:'\ud83e\udd6c',fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:'\ud83c\udf60',fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:'\ud83e\udd5c',fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:'\ud83c\udf6f',fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:'\ud83e\udd50',fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:'\ud83c\udf5e',fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:'\ud83e\udd56',fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:'\ud83e\udd6f',fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:'\ud83e\udd68',fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:'\ud83e\uddc0',fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:'\ud83e\udd5a',fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:'\ud83e\udd53',fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:'\ud83e\udd69',fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:'\ud83e\udd5e',fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:'\ud83c\udf57',fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:'\ud83c\udf56',fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:'\ud83e\uddb4',fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:'\ud83c\udf64',fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:'\ud83c\udf73',fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:'\ud83c\udf54',fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:'\ud83c\udf5f',fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:'\ud83e\udd59',fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:'\ud83c\udf2d',fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:'\ud83c\udf55',fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:'\ud83e\udd6a',fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:'\ud83e\udd6b',fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:'\ud83c\udf5d',fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:'\ud83c\udf2e',fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:'\ud83c\udf2f',fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:'\ud83e\udd57',fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:'\ud83e\udd58',fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:'\ud83c\udf5c',fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:'\ud83c\udf72',fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:'\ud83c\udf65',fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:'\ud83e\udd60',fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:'\ud83c\udf63',fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:'\ud83c\udf71',fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:'\ud83c\udf5b',fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:'\ud83c\udf59',fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:'\ud83c\udf5a',fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:'\ud83c\udf58',fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:'\ud83c\udf62',fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:'\ud83c\udf61',fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:'\ud83c\udf67',fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:'\ud83c\udf68',fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:'\ud83c\udf66',fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:'\ud83e\udd67',fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:'\ud83c\udf70',fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:'\ud83e\uddc1',fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:'\ud83e\udd6e',fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:'\ud83c\udf82',fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:'\ud83c\udf6e',fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:'\ud83c\udf6c',fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:'\ud83c\udf6d',fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:'\ud83c\udf6b',fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:'\ud83c\udf7f',fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:'\ud83e\udd5f',fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:'\ud83c\udf69',fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:'\ud83c\udf6a',fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:'\ud83e\udd5b',fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'\ud83c\udf7a',fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'\ud83c\udf7b',fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:'\ud83e\udd42',fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:'\ud83c\udf77',fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:'\ud83e\udd43',fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:'\ud83c\udf78',fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:'\ud83c\udf79',fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:'\ud83c\udf7e',fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:'\ud83c\udf76',fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:'\ud83c\udf75',fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:'\ud83e\udd64',fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:'\u2615',fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:'\ud83c\udf7c',fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:'\ud83e\uddc2',fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:'\ud83e\udd44',fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:'\ud83c\udf74',fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:'\ud83c\udf7d',fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:'\ud83e\udd63',fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:'\ud83e\udd61',fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:'\ud83e\udd62',fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:'\u26bd',fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:'\ud83c\udfc0',fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:'\ud83c\udfc8',fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:'\u26be',fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:'\ud83e\udd4e',fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:'\ud83c\udfbe',fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:'\ud83c\udfd0',fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:'\ud83c\udfc9',fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:'\ud83e\udd4f',fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:'\ud83c\udfb1',fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:'\u26f3',fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:'\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:'\ud83c\udfcc',fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:'\ud83c\udfd3',fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:'\ud83c\udff8',fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:'\ud83e\udd45',fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:'\ud83c\udfd2',fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:'\ud83c\udfd1',fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:'\ud83e\udd4d',fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:'\ud83c\udfcf',fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:'\ud83c\udfbf',fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:'\u26f7',fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:'\ud83c\udfc2',fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:'\ud83e\udd3a',fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:'\ud83e\udd3c\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:'\ud83e\udd3c\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:'\ud83e\udd38\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:'\ud83e\udd38\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:'\ud83e\udd3e\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:'\ud83e\udd3e\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:'\u26f8',fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:'\ud83e\udd4c',fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:'\ud83d\udef9',fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:'\ud83d\udef7',fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:'\ud83c\udff9',fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:'\ud83c\udfa3',fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:'\ud83e\udd4a',fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:'\ud83e\udd4b',fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:'\ud83d\udea3\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:'\ud83d\udea3',fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:'\ud83e\uddd7\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:'\ud83e\uddd7\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:'\ud83c\udfca\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:'\ud83c\udfca',fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:'\ud83e\udd3d\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:'\ud83e\udd3d\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:'\ud83e\uddd8\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:'\ud83e\uddd8\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:'\ud83c\udfc4\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:'\ud83c\udfc4',fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:'\ud83d\udec0',fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:'\u26f9\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:'\u26f9',fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:'\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:'\ud83c\udfcb',fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:'\ud83d\udeb4\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:'\ud83d\udeb4',fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:'\ud83d\udeb5\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:'\ud83d\udeb5',fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:'\ud83c\udfc7',fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:'\ud83d\udd74',fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:'\ud83c\udfc6',fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:'\ud83c\udfbd',fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:'\ud83c\udfc5',fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:'\ud83c\udf96',fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:'\ud83e\udd47',fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:'\ud83e\udd48',fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:'\ud83e\udd49',fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:'\ud83c\udf97',fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:'\ud83c\udff5',fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:'\ud83c\udfab',fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:'\ud83c\udf9f',fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:'\ud83c\udfad',fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:'\ud83c\udfa8',fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:'\ud83c\udfaa',fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:'\ud83e\udd39\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:'\ud83e\udd39\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:'\ud83c\udfa4',fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:'\ud83c\udfa7',fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:'\ud83c\udfbc',fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:'\ud83c\udfb9',fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:'\ud83e\udd41',fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:'\ud83c\udfb7',fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:'\ud83c\udfba',fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:'\ud83c\udfb8',fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:'\ud83c\udfbb',fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:'\ud83c\udfac',fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:'\ud83c\udfae',fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:'\ud83d\udc7e',fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:'\ud83c\udfaf',fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:'\ud83c\udfb2',fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:'\ud83c\udfb0',fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:'\ud83e\udde9',fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:'\ud83c\udfb3',fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:'\ud83d\ude97',fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:'\ud83d\ude95',fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:'\ud83d\ude99',fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:'\ud83d\ude8c',fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:'\ud83d\ude8e',fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:'\ud83c\udfce',fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:'\ud83d\ude93',fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:'\ud83d\ude91',fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:'\ud83d\ude92',fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:'\ud83d\ude90',fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:'\ud83d\ude9a',fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:'\ud83d\ude9b',fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:'\ud83d\ude9c',fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:'\ud83d\udef4',fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:'\ud83c\udfcd',fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:'\ud83d\udeb2',fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:'\ud83d\udef5',fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:'\ud83d\udea8',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:'\ud83d\ude94',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:'\ud83d\ude8d',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:'\ud83d\ude98',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:'\ud83d\ude96',fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:'\ud83d\udea1',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:'\ud83d\udea0',fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:'\ud83d\ude9f',fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:'\ud83d\ude83',fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:'\ud83d\ude8b',fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:'\ud83d\ude9d',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:'\ud83d\ude84',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:'\ud83d\ude85',fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:'\ud83d\ude88',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:'\ud83d\ude9e',fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:'\ud83d\ude82',fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:'\ud83d\ude86',fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:'\ud83d\ude87',fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:'\ud83d\ude8a',fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:'\ud83d\ude89',fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:'\ud83d\udef8',fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:'\ud83d\ude81',fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:'\ud83d\udee9',fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:'\u2708\ufe0f',fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:'\ud83d\udeeb',fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:'\ud83d\udeec',fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:'\u26f5',fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:'\ud83d\udee5',fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:'\ud83d\udea4',fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:'\u26f4',fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:'\ud83d\udef3',fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:'\ud83d\ude80',fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:'\ud83d\udef0',fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:'\ud83d\udcba',fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:'\ud83d\udef6',fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:'\u2693',fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:'\ud83d\udea7',fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:'\u26fd',fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:'\ud83d\ude8f',fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:'\ud83d\udea6',fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:'\ud83d\udea5',fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:'\ud83c\udfc1',fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:'\ud83d\udea2',fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:'\ud83c\udfa1',fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:'\ud83c\udfa2',fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:'\ud83c\udfa0',fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:'\ud83c\udfd7',fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:'\ud83c\udf01',fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:'\ud83d\uddfc',fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:'\ud83c\udfed',fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:'\u26f2',fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:'\ud83c\udf91',fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:'\u26f0',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:'\ud83c\udfd4',fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:'\ud83d\uddfb',fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:'\ud83c\udf0b',fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:'\ud83d\uddfe',fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:'\ud83c\udfd5',fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:'\u26fa',fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:'\ud83c\udfde',fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:'\ud83d\udee3',fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:'\ud83d\udee4',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:'\ud83c\udf05',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:'\ud83c\udf04',fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:'\ud83c\udfdc',fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:'\ud83c\udfd6',fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:'\ud83c\udfdd',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:'\ud83c\udf07',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:'\ud83c\udf06',fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:'\ud83c\udfd9',fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:'\ud83c\udf03',fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:'\ud83c\udf09',fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:'\ud83c\udf0c',fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:'\ud83c\udf20',fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:'\ud83c\udf87',fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:'\ud83c\udf86',fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:'\ud83c\udf08',fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:'\ud83c\udfd8',fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:'\ud83c\udff0',fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:'\ud83c\udfef',fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:'\ud83c\udfdf',fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:'\ud83d\uddfd',fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:'\ud83c\udfe0',fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:'\ud83c\udfe1',fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:'\ud83c\udfda',fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:'\ud83c\udfe2',fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:'\ud83c\udfec',fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:'\ud83c\udfe3',fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:'\ud83c\udfe4',fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:'\ud83c\udfe5',fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:'\ud83c\udfe6',fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:'\ud83c\udfe8',fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:'\ud83c\udfea',fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:'\ud83c\udfeb',fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:'\ud83c\udfe9',fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:'\ud83d\udc92',fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:'\ud83c\udfdb',fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:'\u26ea',fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:'\ud83d\udd4c',fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:'\ud83d\udd4d',fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:'\ud83d\udd4b',fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:'\u26e9',fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:'\u231a',fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:'\ud83d\udcf1',fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:'\ud83d\udcf2',fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:'\ud83d\udcbb',fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:'\u2328',fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:'\ud83d\udda5',fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:'\ud83d\udda8',fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:'\ud83d\uddb1',fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:'\ud83d\uddb2',fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:'\ud83d\udd79',fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:'\ud83d\udddc',fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:'\ud83d\udcbd',fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:'\ud83d\udcbe',fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:'\ud83d\udcbf',fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:'\ud83d\udcc0',fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:'\ud83d\udcfc',fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:'\ud83d\udcf7',fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:'\ud83d\udcf8',fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:'\ud83d\udcf9',fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:'\ud83c\udfa5',fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:'\ud83d\udcfd',fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:'\ud83c\udf9e',fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:'\ud83d\udcde',fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:'\u260e\ufe0f',fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:'\ud83d\udcdf',fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:'\ud83d\udce0',fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:'\ud83d\udcfa',fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:'\ud83d\udcfb',fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:'\ud83c\udf99',fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:'\ud83c\udf9a',fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:'\ud83c\udf9b',fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:'\ud83e\udded',fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:'\u23f1',fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:'\u23f2',fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:'\u23f0',fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:'\ud83d\udd70',fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:'\u23f3',fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:'\u231b',fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:'\ud83d\udce1',fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:'\ud83d\udd0b',fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:'\ud83d\udd0c',fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:'\ud83d\udca1',fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:'\ud83d\udd26',fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:'\ud83d\udd6f',fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:'\ud83e\uddef',fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:'\ud83d\uddd1',fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:'\ud83d\udee2',fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:'\ud83d\udcb8',fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:'\ud83d\udcb5',fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:'\ud83d\udcb4',fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:'\ud83d\udcb6',fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:'\ud83d\udcb7',fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:'\ud83d\udcb0',fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:'\ud83d\udcb3',fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:'\ud83d\udc8e',fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:'\u2696',fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:'\ud83e\uddf0',fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:'\ud83d\udd27',fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:'\ud83d\udd28',fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:'\u2692',fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:'\ud83d\udee0',fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:'\u26cf',fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:'\ud83d\udd29',fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:'\u2699',fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:'\ud83e\uddf1',fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:'\u26d3',fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:'\ud83e\uddf2',fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:'\ud83d\udd2b',fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:'\ud83d\udca3',fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:'\ud83e\udde8',fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:'\ud83d\udd2a',fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:'\ud83d\udde1',fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:'\u2694',fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:'\ud83d\udee1',fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:'\ud83d\udeac',fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:'\u2620',fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:'\u26b0',fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:'\u26b1',fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:'\ud83c\udffa',fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:'\ud83d\udd2e',fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:'\ud83d\udcff',fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:'\ud83e\uddff',fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:'\ud83d\udc88',fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:'\u2697',fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:'\ud83d\udd2d',fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:'\ud83d\udd2c',fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:'\ud83d\udd73',fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:'\ud83d\udc8a',fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:'\ud83d\udc89',fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:'\ud83e\uddec',fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:'\ud83e\udda0',fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:'\ud83e\uddeb',fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:'\ud83e\uddea',fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:'\ud83c\udf21',fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:'\ud83e\uddf9',fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:'\ud83e\uddfa',fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:'\ud83e\uddfb',fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:'\ud83c\udff7',fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:'\ud83d\udd16',fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:'\ud83d\udebd',fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:'\ud83d\udebf',fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:'\ud83d\udec1',fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:'\ud83e\uddfc',fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:'\ud83e\uddfd',fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:'\ud83e\uddf4',fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:'\ud83d\udd11',fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:'\ud83d\udddd',fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:'\ud83d\udecb',fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:'\ud83d\udecc',fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:'\ud83d\udecf',fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:'\ud83d\udeaa',fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:'\ud83d\udece',fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:'\ud83e\uddf8',fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:'\ud83d\uddbc',fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:'\ud83d\uddfa',fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:'\u26f1',fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:'\ud83d\uddff',fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:'\ud83d\udecd',fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:'\ud83d\uded2',fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:'\ud83c\udf88',fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:'\ud83c\udf8f',fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:'\ud83c\udf80',fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:'\ud83c\udf81',fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:'\ud83c\udf8a',fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:'\ud83c\udf89',fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:'\ud83c\udf8e',fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:'\ud83c\udf90',fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:'\ud83c\udf8c',fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:'\ud83c\udfee',fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:'\ud83e\udde7',fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:'\u2709\ufe0f',fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:'\ud83d\udce9',fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:'\ud83d\udce8',fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:'\ud83d\udce7',fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:'\ud83d\udc8c',fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:'\ud83d\udcee',fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:'\ud83d\udcea',fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:'\ud83d\udceb',fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:'\ud83d\udcec',fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:'\ud83d\udced',fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:'\ud83d\udce6',fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:'\ud83d\udcef',fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:'\ud83d\udce5',fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:'\ud83d\udce4',fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:'\ud83d\udcdc',fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:'\ud83d\udcc3',fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:'\ud83d\udcd1',fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:'\ud83e\uddfe',fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:'\ud83d\udcca',fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:'\ud83d\udcc8',fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:'\ud83d\udcc9',fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:'\ud83d\udcc4',fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:'\ud83d\udcc5',fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:'\ud83d\udcc6',fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:'\ud83d\uddd3',fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:'\ud83d\udcc7',fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:'\ud83d\uddc3',fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:'\ud83d\uddf3',fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:'\ud83d\uddc4',fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:'\ud83d\udccb',fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:'\ud83d\uddd2',fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:'\ud83d\udcc1',fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:'\ud83d\udcc2',fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:'\ud83d\uddc2',fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:'\ud83d\uddde',fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:'\ud83d\udcf0',fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:'\ud83d\udcd3',fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:'\ud83d\udcd5',fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:'\ud83d\udcd7',fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:'\ud83d\udcd8',fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:'\ud83d\udcd9',fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:'\ud83d\udcd4',fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:'\ud83d\udcd2',fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:'\ud83d\udcda',fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:'\ud83d\udcd6',fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:'\ud83e\uddf7',fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:'\ud83d\udd17',fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:'\ud83d\udcce',fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:'\ud83d\udd87',fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:'\u2702\ufe0f',fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:'\ud83d\udcd0',fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:'\ud83d\udccf',fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:'\ud83e\uddee',fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:'\ud83d\udccc',fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:'\ud83d\udccd',fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:'\ud83d\udea9',fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:'\ud83c\udff3',fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:'\ud83c\udff4',fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:'\ud83c\udff3\ufe0f\u200d\ud83c\udf08',fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:'\ud83d\udd10',fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:'\ud83d\udd12',fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:'\ud83d\udd13',fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:'\ud83d\udd0f',fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:'\ud83d\udd8a',fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:'\ud83d\udd8b',fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:'\u2712\ufe0f',fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:'\ud83d\udcdd',fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:'\u270f\ufe0f',fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:'\ud83d\udd8d',fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:'\ud83d\udd8c',fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:'\ud83d\udd0d',fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:'\ud83d\udd0e',fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:'\u2764\ufe0f',fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:'\ud83e\udde1',fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9b',fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9a',fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc99',fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9c',fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:'\ud83d\udda4',fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:'\ud83d\udc94',fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:'\u2763',fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:'\ud83d\udc95',fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9e',fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:'\ud83d\udc93',fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:'\ud83d\udc97',fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc96',fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:'\ud83d\udc98',fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:'\ud83d\udc9d',fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:'\ud83d\udc9f',fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:'\u262e',fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:'\u271d',fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:'\u262a',fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'\ud83d\udd49',fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'\u2638',fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:'\u2721',fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:'\ud83d\udd2f',fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:'\ud83d\udd4e',fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:'\u262f',fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:'\u2626',fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:'\ud83d\uded0',fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:'\u26ce',fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u2648',fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:'\u2649',fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264a',fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264b',fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u264c',fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264d',fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u264e',fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:'\u264f',fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u2650',fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u2651',fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u2652',fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:'\u2653',fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:'\ud83c\udd94',fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:'\u269b',fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:'\ud83c\ude33',fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:'\ud83c\ude39',fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:'\u2622',fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:'\u2623',fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:'\ud83d\udcf4',fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:'\ud83d\udcf3',fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:'\ud83c\ude36',fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:'\ud83c\ude1a',fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:'\ud83c\ude38',fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:'\ud83c\ude3a',fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:'\ud83c\ude37\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:'\u2734\ufe0f',fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:'\ud83c\udd9a',fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:'\ud83c\ude51',fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:'\ud83d\udcae',fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:'\ud83c\ude50',fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:'\u3299\ufe0f',fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:'\u3297\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:'\ud83c\ude34',fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:'\ud83c\ude35',fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:'\ud83c\ude32',fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:'\ud83c\udd70\ufe0f',fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:'\ud83c\udd71\ufe0f',fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:'\ud83c\udd8e',fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:'\ud83c\udd91',fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:'\ud83c\udd7e\ufe0f',fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:'\ud83c\udd98',fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:'\u26d4',fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:'\ud83d\udcdb',fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:'\ud83d\udeab',fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:'\u274c',fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:'\u2b55',fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:'\ud83d\uded1',fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:'\ud83d\udca2',fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:'\u2668\ufe0f',fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:'\ud83d\udeb7',fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:'\ud83d\udeaf',fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:'\ud83d\udeb3',fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:'\ud83d\udeb1',fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:'\ud83d\udd1e',fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:'\ud83d\udcf5',fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:'\u2757',fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:'\u2755',fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:'\u2753',fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:'\u2754',fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:'\u203c\ufe0f',fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:'\u2049\ufe0f',fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:'\ud83d\udd05',fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:'\ud83d\udd06',fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:'\ud83d\udd31',fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:'\u269c',fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:'\u303d\ufe0f',fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:'\u26a0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:'\ud83d\udeb8',fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:'\ud83d\udd30',fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:'\u267b\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:'\ud83c\ude2f',fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:'\ud83d\udcb9',fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:'\u2747\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:'\u2733\ufe0f',fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:'\u274e',fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:'\u2705',fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:'\ud83d\udca0',fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:'\ud83c\udf00',fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:'\u27bf',fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:'\ud83c\udf10',fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:'\u24c2\ufe0f',fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:'\ud83c\udfe7',fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:'\ud83c\ude02\ufe0f',fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:'\ud83d\udec2',fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:'\ud83d\udec3',fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:'\ud83d\udec4',fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:'\ud83d\udec5',fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:'\u267f',fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:'\ud83d\udead',fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:'\ud83d\udebe',fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:'\ud83c\udd7f\ufe0f',fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:'\ud83d\udeb0',fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:'\ud83d\udeb9',fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:'\ud83d\udeba',fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:'\ud83d\udebc',fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:'\ud83d\udebb',fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:'\ud83d\udeae',fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:'\ud83c\udfa6',fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:'\ud83d\udcf6',fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:'\ud83c\ude01',fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:'\ud83c\udd96',fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:'\ud83c\udd97',fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:'\ud83c\udd99',fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:'\ud83c\udd92',fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:'\ud83c\udd95',fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:'\ud83c\udd93',fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:'0\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:'1\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:'2\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:'3\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:'4\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:'5\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:'6\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:'7\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:'8\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:'9\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:'\ud83d\udd1f',fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:'*\u20e3',fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:'\u23cf\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:'\u25b6\ufe0f',fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:'\u23f8',fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:'\u23ed',fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:'\u23f9',fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:'\u23fa',fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:'\u23ef',fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:'\u23ee',fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:'\u23e9',fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:'\u23ea',fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:'\ud83d\udd00',fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:'\ud83d\udd01',fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:'\ud83d\udd02',fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:'\u25c0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:'\ud83d\udd3c',fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:'\ud83d\udd3d',fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:'\u23eb',fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:'\u23ec',fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:'\u27a1\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:'\u2b05\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:'\u2b06\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:'\u2b07\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:'\u2197\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:'\u2198\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:'\u2199\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:'\u2196\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:'\u2195\ufe0f',fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:'\u2194\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:'\ud83d\udd04',fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:'\u21aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:'\u21a9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:'\u2934\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:'\u2935\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:'#\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:'\u2139\ufe0f',fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:'\ud83d\udd24',fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:'\ud83d\udd21',fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:'\ud83d\udd20',fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:'\ud83d\udd23',fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:'\ud83c\udfb5',fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:'\ud83c\udfb6',fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:'\u3030\ufe0f',fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:'\u27b0',fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:'\u2714\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:'\ud83d\udd03',fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:'\u2795',fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:'\u2796',fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:'\u2797',fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:'\u2716\ufe0f',fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:'\u267e',fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:'\ud83d\udcb2',fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:'\ud83d\udcb1',fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:'\xa9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:'\xae\ufe0f',fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:'\u2122\ufe0f',fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:'\ud83d\udd1a',fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:'\ud83d\udd19',fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:'\ud83d\udd1b',fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:'\ud83d\udd1d',fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:'\ud83d\udd1c',fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:'\u2611\ufe0f',fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:'\ud83d\udd18',fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:'\u26aa',fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:'\u26ab',fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:'\ud83d\udd34',fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:'\ud83d\udd35',fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd38',fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd39',fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd36',fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd37',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:'\ud83d\udd3a',fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:'\u25aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:'\u25ab\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:'\u2b1b',fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:'\u2b1c',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:'\ud83d\udd3b',fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:'\u25fc\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:'\u25fb\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:'\u25fe',fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:'\u25fd',fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:'\ud83d\udd32',fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:'\ud83d\udd33',fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:'\ud83d\udd08',fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:'\ud83d\udd09',fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:'\ud83d\udd0a',fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:'\ud83d\udd07',fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:'\ud83d\udce3',fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:'\ud83d\udce2',fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:'\ud83d\udd14',fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:'\ud83d\udd15',fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:'\ud83c\udccf',fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:'\ud83c\udc04',fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:'\u2660\ufe0f',fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:'\u2663\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:'\u2665\ufe0f',fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:'\u2666\ufe0f',fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:'\ud83c\udfb4',fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:'\ud83d\udcad',fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:'\ud83d\uddef',fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:'\ud83d\udcac',fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:'\ud83d\udde8',fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:'\ud83d\udd50',fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:'\ud83d\udd51',fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:'\ud83d\udd52',fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:'\ud83d\udd53',fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:'\ud83d\udd54',fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:'\ud83d\udd55',fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:'\ud83d\udd56',fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:'\ud83d\udd57',fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:'\ud83d\udd58',fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:'\ud83d\udd59',fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5a',fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:'\ud83d\udd5b',fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5c',fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5d',fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5e',fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5f',fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:'\ud83d\udd60',fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:'\ud83d\udd61',fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:'\ud83d\udd62',fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:'\ud83d\udd63',fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:'\ud83d\udd64',fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:'\ud83d\udd65',fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:'\ud83d\udd66',fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:'\ud83d\udd67',fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:'\ud83c\udde8\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:'\ud83c\uddea\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:'\ud83c\uddeb\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:'\ud83c\udde9\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:'\ud83c\uddef\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:'\ud83c\uddef\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:'\ud83c\uddef\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:'\ud83c\uddef\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:'\ud83c\uddfd\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:'\ud83c\uddfe\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:'\ud83c\uddf0\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:'\ud83c\uddf4\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:'\ud83c\uddf6\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:'\ud83c\uddfc\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:'\ud83c\uddff\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:'\ud83c\uddf0\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:'\ud83c\uddec\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:'\ud83c\uddfc\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:'\ud83c\uddfe\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:'\ud83c\uddff\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:'\ud83c\uddff\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:'\ud83c\uddfa\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:'\ud83c\udff4\u200d\u2620\ufe0f',fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file +window.tinymce.Resource.add("tinymce.plugins.emoticons",{100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:'\u{1f4af}',fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:'\u{1f522}',fitzpatrick_scale:!1,category:"symbols"},grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:'\u{1f600}',fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:'\u{1f62c}',fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:'\u{1f601}',fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:'\u{1f602}',fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:'\u{1f923}',fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:'\u{1f973}',fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:'\u{1f603}',fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:'\u{1f604}',fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:'\u{1f605}',fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:'\u{1f606}',fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:'\u{1f607}',fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:'\u{1f609}',fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:'\u{1f60a}',fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:'\u{1f642}',fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:'\u{1f643}',fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:'\u263a\ufe0f',fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:'\u{1f60b}',fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:'\u{1f60c}',fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:'\u{1f60d}',fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:'\u{1f970}',fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'\u{1f618}',fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:'\u{1f617}',fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:'\u{1f619}',fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'\u{1f61a}',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:'\u{1f61c}',fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:'\u{1f92a}',fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:'\u{1f928}',fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:'\u{1f9d0}',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:'\u{1f61d}',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:'\u{1f61b}',fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:'\u{1f911}',fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:'\u{1f913}',fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:'\u{1f60e}',fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:'\u{1f929}',fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:'\u{1f921}',fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:'\u{1f920}',fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:'\u{1f917}',fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:'\u{1f60f}',fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:'\u{1f636}',fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:'\u{1f610}',fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:'\u{1f611}',fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:'\u{1f612}',fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:'\u{1f644}',fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:'\u{1f914}',fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:'\u{1f925}',fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:'\u{1f92d}',fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:'\u{1f92b}',fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:'\u{1f92c}',fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:'\u{1f92f}',fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:'\u{1f633}',fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:'\u{1f61e}',fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:'\u{1f61f}',fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:'\u{1f620}',fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:'\u{1f621}',fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:'\u{1f614}',fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:'\u{1f615}',fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:'\u{1f641}',fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:'\u2639',fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:'\u{1f623}',fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:'\u{1f616}',fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:'\u{1f62b}',fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:'\u{1f629}',fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:'\u{1f97a}',fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:'\u{1f624}',fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:'\u{1f62e}',fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:'\u{1f631}',fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:'\u{1f628}',fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:'\u{1f630}',fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:'\u{1f62f}',fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:'\u{1f626}',fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:'\u{1f627}',fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:'\u{1f622}',fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:'\u{1f625}',fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:'\u{1f924}',fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:'\u{1f62a}',fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:'\u{1f613}',fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:'\u{1f975}',fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:'\u{1f976}',fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:'\u{1f62d}',fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:'\u{1f635}',fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:'\u{1f632}',fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:'\u{1f910}',fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:'\u{1f922}',fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:'\u{1f927}',fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:'\u{1f92e}',fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:'\u{1f637}',fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:'\u{1f912}',fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:'\u{1f915}',fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:'\u{1f974}',fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:'\u{1f634}',fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:'\u{1f4a4}',fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:'\u{1f4a9}',fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:'\u{1f608}',fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:'\u{1f47f}',fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:'\u{1f479}',fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:'\u{1f47a}',fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:'\u{1f480}',fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:'\u{1f47b}',fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:'\u{1f47d}',fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:'\u{1f916}',fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:'\u{1f63a}',fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:'\u{1f638}',fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:'\u{1f639}',fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:'\u{1f63b}',fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:'\u{1f63c}',fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:'\u{1f63d}',fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:'\u{1f640}',fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:'\u{1f63f}',fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:'\u{1f63e}',fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:'\u{1f932}',fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:'\u{1f64c}',fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:'\u{1f44f}',fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:'\u{1f44b}',fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:'\u{1f919}',fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:'\u{1f44d}',fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:'\u{1f44e}',fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:'\u{1f44a}',fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:'\u270a',fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:'\u{1f91b}',fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:'\u{1f91c}',fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:'\u270c',fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:'\u{1f44c}',fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:'\u270b',fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:'\u{1f91a}',fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:'\u{1f450}',fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:'\u{1f4aa}',fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:'\u{1f64f}',fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:'\u{1f9b6}',fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:'\u{1f9b5}',fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:'\u{1f91d}',fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:'\u261d',fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:'\u{1f446}',fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:'\u{1f447}',fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:'\u{1f448}',fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:'\u{1f449}',fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:'\u{1f595}',fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:'\u{1f590}',fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:'\u{1f91f}',fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:'\u{1f918}',fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:'\u{1f91e}',fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:'\u{1f596}',fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:'\u270d',fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:'\u{1f933}',fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:'\u{1f485}',fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:'\u{1f444}',fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:'\u{1f9b7}',fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:'\u{1f445}',fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:'\u{1f442}',fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:'\u{1f443}',fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:'\u{1f441}',fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:'\u{1f440}',fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:'\u{1f9e0}',fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:'\u{1f464}',fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:'\u{1f465}',fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:'\u{1f5e3}',fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:'\u{1f476}',fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:'\u{1f9d2}',fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:'\u{1f466}',fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:'\u{1f467}',fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:'\u{1f9d1}',fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:'\u{1f468}',fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:'\u{1f469}',fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:'\u{1f471}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:'\u{1f471}',fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:'\u{1f9d4}',fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:'\u{1f9d3}',fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:'\u{1f474}',fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:'\u{1f475}',fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:'\u{1f472}',fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:'\u{1f9d5}',fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:'\u{1f473}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:'\u{1f473}',fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:'\u{1f46e}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:'\u{1f46e}',fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:'\u{1f477}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:'\u{1f477}',fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:'\u{1f482}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:'\u{1f482}',fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:'\u{1f575}\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:'\u{1f575}',fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:'\u{1f469}\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:'\u{1f468}\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:'\u{1f469}\u200d\u{1f33e}',fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:'\u{1f468}\u200d\u{1f33e}',fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:'\u{1f469}\u200d\u{1f373}',fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:'\u{1f468}\u200d\u{1f373}',fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:'\u{1f469}\u200d\u{1f393}',fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:'\u{1f468}\u200d\u{1f393}',fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:'\u{1f469}\u200d\u{1f3a4}',fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:'\u{1f468}\u200d\u{1f3a4}',fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:'\u{1f469}\u200d\u{1f3eb}',fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:'\u{1f468}\u200d\u{1f3eb}',fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:'\u{1f469}\u200d\u{1f3ed}',fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:'\u{1f468}\u200d\u{1f3ed}',fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:'\u{1f469}\u200d\u{1f4bb}',fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:'\u{1f468}\u200d\u{1f4bb}',fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:'\u{1f469}\u200d\u{1f4bc}',fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:'\u{1f468}\u200d\u{1f4bc}',fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:'\u{1f469}\u200d\u{1f527}',fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:'\u{1f468}\u200d\u{1f527}',fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:'\u{1f469}\u200d\u{1f52c}',fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:'\u{1f468}\u200d\u{1f52c}',fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:'\u{1f469}\u200d\u{1f3a8}',fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:'\u{1f468}\u200d\u{1f3a8}',fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:'\u{1f469}\u200d\u{1f692}',fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:'\u{1f468}\u200d\u{1f692}',fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:'\u{1f469}\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:'\u{1f468}\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:'\u{1f469}\u200d\u{1f680}',fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:'\u{1f468}\u200d\u{1f680}',fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:'\u{1f469}\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:'\u{1f468}\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:'\u{1f9b8}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:'\u{1f9b8}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:'\u{1f9b9}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:'\u{1f9b9}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:'\u{1f936}',fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:'\u{1f385}',fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:'\u{1f9d9}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:'\u{1f9d9}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:'\u{1f9dd}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:'\u{1f9dd}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:'\u{1f9db}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:'\u{1f9db}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:'\u{1f9df}\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:'\u{1f9df}\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:'\u{1f9de}\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:'\u{1f9de}\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:'\u{1f9dc}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:'\u{1f9dc}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:'\u{1f9da}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:'\u{1f9da}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:'\u{1f47c}',fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:'\u{1f930}',fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:'\u{1f931}',fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:'\u{1f478}',fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:'\u{1f934}',fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:'\u{1f470}',fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:'\u{1f935}',fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:'\u{1f3c3}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:'\u{1f3c3}',fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:'\u{1f6b6}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:'\u{1f6b6}',fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:'\u{1f483}',fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:'\u{1f57a}',fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:'\u{1f46f}',fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:'\u{1f46f}\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:'\u{1f46b}',fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:'\u{1f46c}',fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:'\u{1f46d}',fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:'\u{1f647}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:'\u{1f647}',fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:'\u{1f926}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:'\u{1f926}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:'\u{1f937}',fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:'\u{1f937}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:'\u{1f481}',fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:'\u{1f481}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:'\u{1f645}',fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:'\u{1f645}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:'\u{1f646}',fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:'\u{1f646}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:'\u{1f64b}',fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:'\u{1f64b}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:'\u{1f64e}',fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:'\u{1f64e}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:'\u{1f64d}',fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:'\u{1f64d}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:'\u{1f487}',fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:'\u{1f487}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:'\u{1f486}',fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:'\u{1f486}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:'\u{1f9d6}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:'\u{1f9d6}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\u{1f491}',fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\u{1f469}\u200d\u2764\ufe0f\u200d\u{1f469}',fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\u{1f468}\u200d\u2764\ufe0f\u200d\u{1f468}',fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\u{1f48f}',fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\u{1f469}\u200d\u2764\ufe0f\u200d\u{1f48b}\u200d\u{1f469}',fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\u{1f468}\u200d\u2764\ufe0f\u200d\u{1f48b}\u200d\u{1f468}',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:'\u{1f46a}',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:'\u{1f468}\u200d\u{1f469}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f469}\u200d\u{1f466}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f469}\u200d\u{1f469}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:'\u{1f469}\u200d\u{1f469}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f469}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f469}\u200d\u{1f469}\u200d\u{1f466}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'\u{1f469}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f468}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f468}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f468}\u200d\u{1f467}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f468}\u200d\u{1f466}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:'\u{1f468}\u200d\u{1f468}\u200d\u{1f467}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:'\u{1f469}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:'\u{1f469}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:'\u{1f469}\u200d\u{1f467}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:'\u{1f469}\u200d\u{1f466}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:'\u{1f469}\u200d\u{1f467}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:'\u{1f468}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:'\u{1f468}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:'\u{1f468}\u200d\u{1f467}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:'\u{1f468}\u200d\u{1f466}\u200d\u{1f466}',fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:'\u{1f468}\u200d\u{1f467}\u200d\u{1f467}',fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:'\u{1f9f6}',fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:'\u{1f9f5}',fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:'\u{1f9e5}',fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:'\u{1f97c}',fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:'\u{1f45a}',fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:'\u{1f455}',fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:'\u{1f456}',fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:'\u{1f454}',fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:'\u{1f457}',fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:'\u{1f459}',fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:'\u{1f458}',fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:'\u{1f484}',fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:'\u{1f48b}',fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:'\u{1f463}',fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:'\u{1f97f}',fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:'\u{1f460}',fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:'\u{1f461}',fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:'\u{1f462}',fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:'\u{1f45e}',fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:'\u{1f45f}',fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:'\u{1f97e}',fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:'\u{1f9e6}',fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:'\u{1f9e4}',fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:'\u{1f9e3}',fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:'\u{1f452}',fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:'\u{1f3a9}',fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:'\u{1f9e2}',fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:'\u26d1',fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:'\u{1f393}',fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:'\u{1f451}',fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:'\u{1f392}',fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:'\u{1f9f3}',fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:'\u{1f45d}',fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:'\u{1f45b}',fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:'\u{1f45c}',fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:'\u{1f4bc}',fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:'\u{1f453}',fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:'\u{1f576}',fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:'\u{1f97d}',fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:'\u{1f48d}',fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:'\u{1f302}',fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:'\u{1f436}',fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:'\u{1f431}',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:'\u{1f42d}',fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:'\u{1f439}',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:'\u{1f430}',fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:'\u{1f98a}',fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:'\u{1f43b}',fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:'\u{1f43c}',fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:'\u{1f428}',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:'\u{1f42f}',fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:'\u{1f981}',fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:'\u{1f42e}',fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:'\u{1f437}',fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:'\u{1f43d}',fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:'\u{1f438}',fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:'\u{1f991}',fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:'\u{1f419}',fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:'\u{1f990}',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:'\u{1f435}',fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:'\u{1f98d}',fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:'\u{1f648}',fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:'\u{1f649}',fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:'\u{1f64a}',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:'\u{1f412}',fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:'\u{1f414}',fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:'\u{1f427}',fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:'\u{1f426}',fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:'\u{1f424}',fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:'\u{1f423}',fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:'\u{1f425}',fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:'\u{1f986}',fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:'\u{1f985}',fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:'\u{1f989}',fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:'\u{1f987}',fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:'\u{1f43a}',fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:'\u{1f417}',fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:'\u{1f434}',fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:'\u{1f984}',fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:'\u{1f41d}',fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:'\u{1f41b}',fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:'\u{1f98b}',fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:'\u{1f40c}',fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:'\u{1f41e}',fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:'\u{1f41c}',fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:'\u{1f997}',fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:'\u{1f577}',fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:'\u{1f982}',fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:'\u{1f980}',fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:'\u{1f40d}',fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:'\u{1f98e}',fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:'\u{1f996}',fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:'\u{1f995}',fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:'\u{1f422}',fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:'\u{1f420}',fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:'\u{1f41f}',fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:'\u{1f421}',fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:'\u{1f42c}',fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:'\u{1f988}',fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:'\u{1f433}',fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:'\u{1f40b}',fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:'\u{1f40a}',fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:'\u{1f406}',fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:'\u{1f993}',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:'\u{1f405}',fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:'\u{1f403}',fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:'\u{1f402}',fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:'\u{1f404}',fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:'\u{1f98c}',fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:'\u{1f42a}',fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:'\u{1f42b}',fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:'\u{1f992}',fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:'\u{1f418}',fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:'\u{1f98f}',fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:'\u{1f410}',fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:'\u{1f40f}',fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:'\u{1f411}',fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:'\u{1f40e}',fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:'\u{1f416}',fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:'\u{1f400}',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:'\u{1f401}',fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:'\u{1f413}',fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:'\u{1f983}',fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:'\u{1f54a}',fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:'\u{1f415}',fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:'\u{1f429}',fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:'\u{1f408}',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:'\u{1f407}',fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:'\u{1f43f}',fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:'\u{1f994}',fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:'\u{1f99d}',fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:'\u{1f999}',fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:'\u{1f99b}',fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:'\u{1f998}',fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:'\u{1f9a1}',fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:'\u{1f9a2}',fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:'\u{1f99a}',fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:'\u{1f99c}',fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:'\u{1f99e}',fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:'\u{1f99f}',fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:'\u{1f43e}',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:'\u{1f409}',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:'\u{1f432}',fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:'\u{1f335}',fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:'\u{1f384}',fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:'\u{1f332}',fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:'\u{1f333}',fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:'\u{1f334}',fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:'\u{1f331}',fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:'\u{1f33f}',fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:'\u2618',fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:'\u{1f340}',fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:'\u{1f38d}',fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:'\u{1f38b}',fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:'\u{1f343}',fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:'\u{1f342}',fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:'\u{1f341}',fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:'\u{1f33e}',fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:'\u{1f33a}',fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:'\u{1f33b}',fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:'\u{1f339}',fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:'\u{1f940}',fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:'\u{1f337}',fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:'\u{1f33c}',fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:'\u{1f338}',fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:'\u{1f490}',fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:'\u{1f344}',fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:'\u{1f330}',fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:'\u{1f383}',fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:'\u{1f41a}',fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:'\u{1f578}',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:'\u{1f30e}',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:'\u{1f30d}',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:'\u{1f30f}',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:'\u{1f315}',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:'\u{1f316}',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f317}',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f318}',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f311}',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f312}',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f313}',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:'\u{1f314}',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f31a}',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f31d}',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f31b}',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\u{1f31c}',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:'\u{1f31e}',fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:'\u{1f319}',fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:'\u2b50',fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:'\u{1f31f}',fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:'\u{1f4ab}',fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:'\u2728',fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:'\u2604',fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:'\u2600\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:'\u{1f324}',fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:'\u26c5',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:'\u{1f325}',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:'\u{1f326}',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:'\u2601\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:'\u{1f327}',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:'\u26c8',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:'\u{1f329}',fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:'\u26a1',fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:'\u{1f525}',fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:'\u{1f4a5}',fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:'\u2744\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:'\u{1f328}',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:'\u26c4',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:'\u2603',fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:'\u{1f32c}',fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:'\u{1f4a8}',fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:'\u{1f32a}',fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:'\u{1f32b}',fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:'\u2602',fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:'\u2614',fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:'\u{1f4a7}',fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:'\u{1f4a6}',fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:'\u{1f30a}',fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:'\u{1f34f}',fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:'\u{1f34e}',fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:'\u{1f350}',fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:'\u{1f34a}',fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:'\u{1f34b}',fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:'\u{1f34c}',fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:'\u{1f349}',fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:'\u{1f347}',fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:'\u{1f353}',fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:'\u{1f348}',fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:'\u{1f352}',fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:'\u{1f351}',fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:'\u{1f34d}',fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:'\u{1f965}',fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:'\u{1f95d}',fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:'\u{1f96d}',fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:'\u{1f951}',fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:'\u{1f966}',fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:'\u{1f345}',fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:'\u{1f346}',fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:'\u{1f952}',fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:'\u{1f955}',fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:'\u{1f336}',fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:'\u{1f954}',fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:'\u{1f33d}',fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:'\u{1f96c}',fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:'\u{1f360}',fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:'\u{1f95c}',fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:'\u{1f36f}',fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:'\u{1f950}',fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:'\u{1f35e}',fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:'\u{1f956}',fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:'\u{1f96f}',fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:'\u{1f968}',fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:'\u{1f9c0}',fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:'\u{1f95a}',fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:'\u{1f953}',fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:'\u{1f969}',fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:'\u{1f95e}',fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:'\u{1f357}',fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:'\u{1f356}',fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:'\u{1f9b4}',fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:'\u{1f364}',fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:'\u{1f373}',fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:'\u{1f354}',fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:'\u{1f35f}',fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:'\u{1f959}',fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:'\u{1f32d}',fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:'\u{1f355}',fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:'\u{1f96a}',fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:'\u{1f96b}',fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:'\u{1f35d}',fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:'\u{1f32e}',fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:'\u{1f32f}',fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:'\u{1f957}',fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:'\u{1f958}',fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:'\u{1f35c}',fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:'\u{1f372}',fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:'\u{1f365}',fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:'\u{1f960}',fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:'\u{1f363}',fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:'\u{1f371}',fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:'\u{1f35b}',fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:'\u{1f359}',fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:'\u{1f35a}',fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:'\u{1f358}',fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:'\u{1f362}',fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:'\u{1f361}',fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:'\u{1f367}',fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:'\u{1f368}',fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:'\u{1f366}',fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:'\u{1f967}',fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:'\u{1f370}',fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:'\u{1f9c1}',fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:'\u{1f96e}',fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:'\u{1f382}',fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:'\u{1f36e}',fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:'\u{1f36c}',fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:'\u{1f36d}',fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:'\u{1f36b}',fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:'\u{1f37f}',fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:'\u{1f95f}',fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:'\u{1f369}',fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:'\u{1f36a}',fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:'\u{1f95b}',fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'\u{1f37a}',fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'\u{1f37b}',fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:'\u{1f942}',fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:'\u{1f377}',fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:'\u{1f943}',fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:'\u{1f378}',fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:'\u{1f379}',fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:'\u{1f37e}',fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:'\u{1f376}',fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:'\u{1f375}',fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:'\u{1f964}',fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:'\u2615',fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:'\u{1f37c}',fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:'\u{1f9c2}',fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:'\u{1f944}',fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:'\u{1f374}',fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:'\u{1f37d}',fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:'\u{1f963}',fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:'\u{1f961}',fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:'\u{1f962}',fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:'\u26bd',fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:'\u{1f3c0}',fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:'\u{1f3c8}',fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:'\u26be',fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:'\u{1f94e}',fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:'\u{1f3be}',fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:'\u{1f3d0}',fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:'\u{1f3c9}',fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:'\u{1f94f}',fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:'\u{1f3b1}',fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:'\u26f3',fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:'\u{1f3cc}\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:'\u{1f3cc}',fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:'\u{1f3d3}',fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:'\u{1f3f8}',fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:'\u{1f945}',fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:'\u{1f3d2}',fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:'\u{1f3d1}',fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:'\u{1f94d}',fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:'\u{1f3cf}',fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:'\u{1f3bf}',fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:'\u26f7',fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:'\u{1f3c2}',fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:'\u{1f93a}',fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:'\u{1f93c}\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:'\u{1f93c}\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:'\u{1f938}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:'\u{1f938}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:'\u{1f93e}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:'\u{1f93e}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:'\u26f8',fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:'\u{1f94c}',fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:'\u{1f6f9}',fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:'\u{1f6f7}',fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:'\u{1f3f9}',fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:'\u{1f3a3}',fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:'\u{1f94a}',fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:'\u{1f94b}',fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:'\u{1f6a3}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:'\u{1f6a3}',fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:'\u{1f9d7}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:'\u{1f9d7}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:'\u{1f3ca}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:'\u{1f3ca}',fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:'\u{1f93d}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:'\u{1f93d}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:'\u{1f9d8}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:'\u{1f9d8}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:'\u{1f3c4}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:'\u{1f3c4}',fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:'\u{1f6c0}',fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:'\u26f9\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:'\u26f9',fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:'\u{1f3cb}\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:'\u{1f3cb}',fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:'\u{1f6b4}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:'\u{1f6b4}',fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:'\u{1f6b5}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:'\u{1f6b5}',fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:'\u{1f3c7}',fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:'\u{1f574}',fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:'\u{1f3c6}',fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:'\u{1f3bd}',fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:'\u{1f3c5}',fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:'\u{1f396}',fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:'\u{1f947}',fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:'\u{1f948}',fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:'\u{1f949}',fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:'\u{1f397}',fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:'\u{1f3f5}',fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:'\u{1f3ab}',fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:'\u{1f39f}',fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:'\u{1f3ad}',fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:'\u{1f3a8}',fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:'\u{1f3aa}',fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:'\u{1f939}\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:'\u{1f939}\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:'\u{1f3a4}',fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:'\u{1f3a7}',fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:'\u{1f3bc}',fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:'\u{1f3b9}',fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:'\u{1f941}',fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:'\u{1f3b7}',fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:'\u{1f3ba}',fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:'\u{1f3b8}',fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:'\u{1f3bb}',fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:'\u{1f3ac}',fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:'\u{1f3ae}',fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:'\u{1f47e}',fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:'\u{1f3af}',fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:'\u{1f3b2}',fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:'\u{1f3b0}',fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:'\u{1f9e9}',fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:'\u{1f3b3}',fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:'\u{1f697}',fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:'\u{1f695}',fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:'\u{1f699}',fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:'\u{1f68c}',fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:'\u{1f68e}',fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:'\u{1f3ce}',fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:'\u{1f693}',fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:'\u{1f691}',fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:'\u{1f692}',fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:'\u{1f690}',fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:'\u{1f69a}',fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:'\u{1f69b}',fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:'\u{1f69c}',fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:'\u{1f6f4}',fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:'\u{1f3cd}',fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:'\u{1f6b2}',fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:'\u{1f6f5}',fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:'\u{1f6a8}',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:'\u{1f694}',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:'\u{1f68d}',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:'\u{1f698}',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:'\u{1f696}',fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:'\u{1f6a1}',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:'\u{1f6a0}',fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:'\u{1f69f}',fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:'\u{1f683}',fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:'\u{1f68b}',fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:'\u{1f69d}',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:'\u{1f684}',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:'\u{1f685}',fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:'\u{1f688}',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:'\u{1f69e}',fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:'\u{1f682}',fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:'\u{1f686}',fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:'\u{1f687}',fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:'\u{1f68a}',fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:'\u{1f689}',fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:'\u{1f6f8}',fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:'\u{1f681}',fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:'\u{1f6e9}',fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:'\u2708\ufe0f',fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:'\u{1f6eb}',fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:'\u{1f6ec}',fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:'\u26f5',fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:'\u{1f6e5}',fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:'\u{1f6a4}',fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:'\u26f4',fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:'\u{1f6f3}',fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:'\u{1f680}',fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:'\u{1f6f0}',fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:'\u{1f4ba}',fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:'\u{1f6f6}',fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:'\u2693',fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:'\u{1f6a7}',fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:'\u26fd',fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:'\u{1f68f}',fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:'\u{1f6a6}',fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:'\u{1f6a5}',fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:'\u{1f3c1}',fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:'\u{1f6a2}',fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:'\u{1f3a1}',fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:'\u{1f3a2}',fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:'\u{1f3a0}',fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:'\u{1f3d7}',fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:'\u{1f301}',fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:'\u{1f5fc}',fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:'\u{1f3ed}',fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:'\u26f2',fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:'\u{1f391}',fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:'\u26f0',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:'\u{1f3d4}',fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:'\u{1f5fb}',fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:'\u{1f30b}',fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:'\u{1f5fe}',fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:'\u{1f3d5}',fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:'\u26fa',fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:'\u{1f3de}',fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:'\u{1f6e3}',fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:'\u{1f6e4}',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:'\u{1f305}',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:'\u{1f304}',fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:'\u{1f3dc}',fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:'\u{1f3d6}',fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:'\u{1f3dd}',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:'\u{1f307}',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:'\u{1f306}',fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:'\u{1f3d9}',fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:'\u{1f303}',fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:'\u{1f309}',fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:'\u{1f30c}',fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:'\u{1f320}',fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:'\u{1f387}',fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:'\u{1f386}',fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:'\u{1f308}',fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:'\u{1f3d8}',fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:'\u{1f3f0}',fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:'\u{1f3ef}',fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:'\u{1f3df}',fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:'\u{1f5fd}',fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:'\u{1f3e0}',fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:'\u{1f3e1}',fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:'\u{1f3da}',fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:'\u{1f3e2}',fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:'\u{1f3ec}',fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:'\u{1f3e3}',fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:'\u{1f3e4}',fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:'\u{1f3e5}',fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:'\u{1f3e6}',fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:'\u{1f3e8}',fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:'\u{1f3ea}',fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:'\u{1f3eb}',fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:'\u{1f3e9}',fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:'\u{1f492}',fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:'\u{1f3db}',fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:'\u26ea',fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:'\u{1f54c}',fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:'\u{1f54d}',fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:'\u{1f54b}',fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:'\u26e9',fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:'\u231a',fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:'\u{1f4f1}',fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:'\u{1f4f2}',fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:'\u{1f4bb}',fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:'\u2328',fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:'\u{1f5a5}',fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:'\u{1f5a8}',fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:'\u{1f5b1}',fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:'\u{1f5b2}',fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:'\u{1f579}',fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:'\u{1f5dc}',fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:'\u{1f4bd}',fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:'\u{1f4be}',fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:'\u{1f4bf}',fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:'\u{1f4c0}',fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:'\u{1f4fc}',fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:'\u{1f4f7}',fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:'\u{1f4f8}',fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:'\u{1f4f9}',fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:'\u{1f3a5}',fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:'\u{1f4fd}',fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:'\u{1f39e}',fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:'\u{1f4de}',fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:'\u260e\ufe0f',fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:'\u{1f4df}',fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:'\u{1f4e0}',fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:'\u{1f4fa}',fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:'\u{1f4fb}',fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:'\u{1f399}',fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:'\u{1f39a}',fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:'\u{1f39b}',fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:'\u{1f9ed}',fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:'\u23f1',fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:'\u23f2',fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:'\u23f0',fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:'\u{1f570}',fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:'\u23f3',fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:'\u231b',fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:'\u{1f4e1}',fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:'\u{1f50b}',fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:'\u{1f50c}',fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:'\u{1f4a1}',fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:'\u{1f526}',fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:'\u{1f56f}',fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:'\u{1f9ef}',fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:'\u{1f5d1}',fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:'\u{1f6e2}',fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:'\u{1f4b8}',fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:'\u{1f4b5}',fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:'\u{1f4b4}',fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:'\u{1f4b6}',fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:'\u{1f4b7}',fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:'\u{1f4b0}',fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:'\u{1f4b3}',fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:'\u{1f48e}',fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:'\u2696',fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:'\u{1f9f0}',fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:'\u{1f527}',fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:'\u{1f528}',fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:'\u2692',fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:'\u{1f6e0}',fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:'\u26cf',fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:'\u{1f529}',fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:'\u2699',fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:'\u{1f9f1}',fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:'\u26d3',fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:'\u{1f9f2}',fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:'\u{1f52b}',fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:'\u{1f4a3}',fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:'\u{1f9e8}',fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:'\u{1f52a}',fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:'\u{1f5e1}',fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:'\u2694',fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:'\u{1f6e1}',fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:'\u{1f6ac}',fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:'\u2620',fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:'\u26b0',fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:'\u26b1',fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:'\u{1f3fa}',fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:'\u{1f52e}',fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:'\u{1f4ff}',fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:'\u{1f9ff}',fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:'\u{1f488}',fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:'\u2697',fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:'\u{1f52d}',fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:'\u{1f52c}',fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:'\u{1f573}',fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:'\u{1f48a}',fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:'\u{1f489}',fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:'\u{1f9ec}',fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:'\u{1f9a0}',fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:'\u{1f9eb}',fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:'\u{1f9ea}',fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:'\u{1f321}',fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:'\u{1f9f9}',fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:'\u{1f9fa}',fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:'\u{1f9fb}',fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:'\u{1f3f7}',fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:'\u{1f516}',fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:'\u{1f6bd}',fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:'\u{1f6bf}',fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:'\u{1f6c1}',fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:'\u{1f9fc}',fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:'\u{1f9fd}',fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:'\u{1f9f4}',fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:'\u{1f511}',fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:'\u{1f5dd}',fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:'\u{1f6cb}',fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:'\u{1f6cc}',fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:'\u{1f6cf}',fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:'\u{1f6aa}',fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:'\u{1f6ce}',fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:'\u{1f9f8}',fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:'\u{1f5bc}',fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:'\u{1f5fa}',fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:'\u26f1',fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:'\u{1f5ff}',fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:'\u{1f6cd}',fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:'\u{1f6d2}',fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:'\u{1f388}',fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:'\u{1f38f}',fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:'\u{1f380}',fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:'\u{1f381}',fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:'\u{1f38a}',fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:'\u{1f389}',fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:'\u{1f38e}',fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:'\u{1f390}',fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:'\u{1f38c}',fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:'\u{1f3ee}',fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:'\u{1f9e7}',fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:'\u2709\ufe0f',fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:'\u{1f4e9}',fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:'\u{1f4e8}',fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:'\u{1f4e7}',fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:'\u{1f48c}',fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:'\u{1f4ee}',fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:'\u{1f4ea}',fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:'\u{1f4eb}',fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:'\u{1f4ec}',fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:'\u{1f4ed}',fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:'\u{1f4e6}',fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:'\u{1f4ef}',fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:'\u{1f4e5}',fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:'\u{1f4e4}',fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:'\u{1f4dc}',fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:'\u{1f4c3}',fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:'\u{1f4d1}',fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:'\u{1f9fe}',fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:'\u{1f4ca}',fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:'\u{1f4c8}',fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:'\u{1f4c9}',fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:'\u{1f4c4}',fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:'\u{1f4c5}',fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:'\u{1f4c6}',fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:'\u{1f5d3}',fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:'\u{1f4c7}',fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:'\u{1f5c3}',fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:'\u{1f5f3}',fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:'\u{1f5c4}',fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:'\u{1f4cb}',fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:'\u{1f5d2}',fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:'\u{1f4c1}',fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:'\u{1f4c2}',fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:'\u{1f5c2}',fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:'\u{1f5de}',fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:'\u{1f4f0}',fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:'\u{1f4d3}',fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:'\u{1f4d5}',fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:'\u{1f4d7}',fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:'\u{1f4d8}',fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:'\u{1f4d9}',fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:'\u{1f4d4}',fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:'\u{1f4d2}',fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:'\u{1f4da}',fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:'\u{1f4d6}',fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:'\u{1f9f7}',fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:'\u{1f517}',fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:'\u{1f4ce}',fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:'\u{1f587}',fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:'\u2702\ufe0f',fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:'\u{1f4d0}',fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:'\u{1f4cf}',fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:'\u{1f9ee}',fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:'\u{1f4cc}',fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:'\u{1f4cd}',fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:'\u{1f6a9}',fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:'\u{1f3f3}',fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:'\u{1f3f4}',fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:'\u{1f3f3}\ufe0f\u200d\u{1f308}',fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:'\u{1f510}',fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:'\u{1f512}',fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:'\u{1f513}',fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:'\u{1f50f}',fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:'\u{1f58a}',fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:'\u{1f58b}',fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:'\u2712\ufe0f',fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:'\u{1f4dd}',fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:'\u270f\ufe0f',fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:'\u{1f58d}',fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:'\u{1f58c}',fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:'\u{1f50d}',fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:'\u{1f50e}',fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:'\u2764\ufe0f',fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f9e1}',fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f49b}',fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f49a}',fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f499}',fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f49c}',fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:'\u{1f5a4}',fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:'\u{1f494}',fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:'\u2763',fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:'\u{1f495}',fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:'\u{1f49e}',fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:'\u{1f493}',fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:'\u{1f497}',fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:'\u{1f496}',fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:'\u{1f498}',fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:'\u{1f49d}',fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:'\u{1f49f}',fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:'\u262e',fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:'\u271d',fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:'\u262a',fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'\u{1f549}',fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'\u2638',fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:'\u2721',fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:'\u{1f52f}',fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:'\u{1f54e}',fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:'\u262f',fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:'\u2626',fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:'\u{1f6d0}',fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:'\u26ce',fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u2648',fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:'\u2649',fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264a',fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264b',fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u264c',fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264d',fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u264e',fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:'\u264f',fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u2650',fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u2651',fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u2652',fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:'\u2653',fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:'\u{1f194}',fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:'\u269b',fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:'\u{1f233}',fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:'\u{1f239}',fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:'\u2622',fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:'\u2623',fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:'\u{1f4f4}',fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:'\u{1f4f3}',fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:'\u{1f236}',fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:'\u{1f21a}',fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:'\u{1f238}',fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:'\u{1f23a}',fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:'\u{1f237}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:'\u2734\ufe0f',fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:'\u{1f19a}',fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:'\u{1f251}',fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:'\u{1f4ae}',fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:'\u{1f250}',fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:'\u3299\ufe0f',fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:'\u3297\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:'\u{1f234}',fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:'\u{1f235}',fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:'\u{1f232}',fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:'\u{1f170}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:'\u{1f171}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:'\u{1f18e}',fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:'\u{1f191}',fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:'\u{1f17e}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:'\u{1f198}',fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:'\u26d4',fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:'\u{1f4db}',fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:'\u{1f6ab}',fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:'\u274c',fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:'\u2b55',fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:'\u{1f6d1}',fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:'\u{1f4a2}',fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:'\u2668\ufe0f',fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:'\u{1f6b7}',fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:'\u{1f6af}',fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:'\u{1f6b3}',fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:'\u{1f6b1}',fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:'\u{1f51e}',fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:'\u{1f4f5}',fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:'\u2757',fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:'\u2755',fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:'\u2753',fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:'\u2754',fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:'\u203c\ufe0f',fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:'\u2049\ufe0f',fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:'\u{1f505}',fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:'\u{1f506}',fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:'\u{1f531}',fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:'\u269c',fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:'\u303d\ufe0f',fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:'\u26a0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:'\u{1f6b8}',fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:'\u{1f530}',fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:'\u267b\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:'\u{1f22f}',fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:'\u{1f4b9}',fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:'\u2747\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:'\u2733\ufe0f',fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:'\u274e',fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:'\u2705',fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:'\u{1f4a0}',fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:'\u{1f300}',fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:'\u27bf',fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:'\u{1f310}',fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:'\u24c2\ufe0f',fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:'\u{1f3e7}',fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:'\u{1f202}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:'\u{1f6c2}',fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:'\u{1f6c3}',fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:'\u{1f6c4}',fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:'\u{1f6c5}',fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:'\u267f',fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:'\u{1f6ad}',fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:'\u{1f6be}',fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:'\u{1f17f}\ufe0f',fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:'\u{1f6b0}',fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:'\u{1f6b9}',fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:'\u{1f6ba}',fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:'\u{1f6bc}',fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:'\u{1f6bb}',fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:'\u{1f6ae}',fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:'\u{1f3a6}',fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:'\u{1f4f6}',fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:'\u{1f201}',fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:'\u{1f196}',fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:'\u{1f197}',fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:'\u{1f199}',fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:'\u{1f192}',fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:'\u{1f195}',fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:'\u{1f193}',fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:'0\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:'1\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:'2\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:'3\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:'4\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:'5\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:'6\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:'7\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:'8\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:'9\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:'\u{1f51f}',fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:'*\u20e3',fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:'\u23cf\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:'\u25b6\ufe0f',fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:'\u23f8',fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:'\u23ed',fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:'\u23f9',fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:'\u23fa',fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:'\u23ef',fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:'\u23ee',fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:'\u23e9',fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:'\u23ea',fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:'\u{1f500}',fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:'\u{1f501}',fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:'\u{1f502}',fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:'\u25c0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:'\u{1f53c}',fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:'\u{1f53d}',fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:'\u23eb',fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:'\u23ec',fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:'\u27a1\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:'\u2b05\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:'\u2b06\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:'\u2b07\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:'\u2197\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:'\u2198\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:'\u2199\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:'\u2196\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:'\u2195\ufe0f',fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:'\u2194\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:'\u{1f504}',fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:'\u21aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:'\u21a9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:'\u2934\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:'\u2935\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:'#\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:'\u2139\ufe0f',fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:'\u{1f524}',fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:'\u{1f521}',fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:'\u{1f520}',fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:'\u{1f523}',fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:'\u{1f3b5}',fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:'\u{1f3b6}',fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:'\u3030\ufe0f',fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:'\u27b0',fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:'\u2714\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:'\u{1f503}',fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:'\u2795',fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:'\u2796',fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:'\u2797',fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:'\u2716\ufe0f',fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:'\u267e',fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:'\u{1f4b2}',fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:'\u{1f4b1}',fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:'\xa9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:'\xae\ufe0f',fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:'\u2122\ufe0f',fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:'\u{1f51a}',fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:'\u{1f519}',fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:'\u{1f51b}',fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:'\u{1f51d}',fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:'\u{1f51c}',fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:'\u2611\ufe0f',fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:'\u{1f518}',fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:'\u26aa',fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:'\u26ab',fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:'\u{1f534}',fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:'\u{1f535}',fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:'\u{1f538}',fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:'\u{1f539}',fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:'\u{1f536}',fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:'\u{1f537}',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:'\u{1f53a}',fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:'\u25aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:'\u25ab\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:'\u2b1b',fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:'\u2b1c',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:'\u{1f53b}',fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:'\u25fc\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:'\u25fb\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:'\u25fe',fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:'\u25fd',fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:'\u{1f532}',fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:'\u{1f533}',fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:'\u{1f508}',fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:'\u{1f509}',fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:'\u{1f50a}',fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:'\u{1f507}',fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:'\u{1f4e3}',fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:'\u{1f4e2}',fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:'\u{1f514}',fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:'\u{1f515}',fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:'\u{1f0cf}',fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:'\u{1f004}',fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:'\u2660\ufe0f',fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:'\u2663\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:'\u2665\ufe0f',fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:'\u2666\ufe0f',fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:'\u{1f3b4}',fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:'\u{1f4ad}',fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:'\u{1f5ef}',fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:'\u{1f4ac}',fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:'\u{1f5e8}',fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:'\u{1f550}',fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:'\u{1f551}',fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:'\u{1f552}',fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:'\u{1f553}',fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:'\u{1f554}',fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:'\u{1f555}',fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:'\u{1f556}',fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:'\u{1f557}',fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:'\u{1f558}',fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:'\u{1f559}',fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:'\u{1f55a}',fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:'\u{1f55b}',fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:'\u{1f55c}',fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:'\u{1f55d}',fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:'\u{1f55e}',fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:'\u{1f55f}',fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:'\u{1f560}',fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:'\u{1f561}',fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:'\u{1f562}',fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:'\u{1f563}',fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:'\u{1f564}',fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:'\u{1f565}',fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:'\u{1f566}',fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:'\u{1f567}',fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1fd}',fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:'\u{1f1e9}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f6}',fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1e7}',fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ef}',fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f6}',fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1fb}',fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:'\u{1f1e8}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1fd}',fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:'\u{1f1ed}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:'\u{1f1e9}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:'\u{1f1e9}\u{1f1ef}',fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:'\u{1f1e9}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:'\u{1f1e9}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1fb}',fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f6}',fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:'\u{1f1ea}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:'\u{1f1eb}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:'\u{1f1eb}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:'\u{1f1eb}\u{1f1ef}',fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:'\u{1f1eb}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:'\u{1f1eb}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:'\u{1f1e9}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f5}',fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:'\u{1f1ed}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:'\u{1f1ed}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:'\u{1f1ed}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:'\u{1f1ed}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f6}',fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:'\u{1f1ee}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:'\u{1f1ef}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:'\u{1f1ef}\u{1f1f5}',fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:'\u{1f1ef}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:'\u{1f1ef}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:'\u{1f1fd}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1fb}',fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1e7}',fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1fb}',fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f6}',fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:'\u{1f1fe}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1fd}',fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:'\u{1f1eb}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1f5}',fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:'\u{1f1f2}\u{1f1f5}',fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:'\u{1f1f0}\u{1f1f5}',fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:'\u{1f1f3}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:'\u{1f1f4}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:'\u{1f1f6}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:'\u{1f1f7}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:'\u{1f1f7}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:'\u{1f1f7}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:'\u{1f1f7}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:'\u{1f1e7}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:'\u{1f1f0}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:'\u{1f1f5}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:'\u{1f1fc}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:'\u{1f1f7}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1fd}',fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1e7}',fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:'\u{1f1ff}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:'\u{1f1ec}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:'\u{1f1f0}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:'\u{1f1f1}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1e9}',fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:'\u{1f1e8}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:'\u{1f1f8}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1ef}',fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f1}',fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f0}',fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f4}',fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f9}',fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f7}',fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1e8}',fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:'\u{1f1f9}\u{1f1fb}',fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:'\u{1f1fa}\u{1f1ec}',fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:'\u{1f1fa}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:'\u{1f1e6}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:'\u{1f1ec}\u{1f1e7}',fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:'\u{1f3f4}\u{e0067}\u{e0062}\u{e0065}\u{e006e}\u{e0067}\u{e007f}',fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:'\u{1f3f4}\u{e0067}\u{e0062}\u{e0073}\u{e0063}\u{e0074}\u{e007f}',fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:'\u{1f3f4}\u{e0067}\u{e0062}\u{e0077}\u{e006c}\u{e0073}\u{e007f}',fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:'\u{1f1fa}\u{1f1f8}',fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1ee}',fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:'\u{1f1fa}\u{1f1fe}',fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:'\u{1f1fa}\u{1f1ff}',fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1fa}',fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1e6}',fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:'\u{1f1fb}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:'\u{1f1fc}\u{1f1eb}',fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:'\u{1f1ea}\u{1f1ed}',fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:'\u{1f1fe}\u{1f1ea}',fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:'\u{1f1ff}\u{1f1f2}',fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:'\u{1f1ff}\u{1f1fc}',fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:'\u{1f1fa}\u{1f1f3}',fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:'\u{1f3f4}\u200d\u2620\ufe0f',fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/public/js/tinymce/plugins/emoticons/js/emojis.js b/public/js/tinymce/plugins/emoticons/js/emojis.js index cf7f472bf..88455e9a4 100644 --- a/public/js/tinymce/plugins/emoticons/js/emojis.js +++ b/public/js/tinymce/plugins/emoticons/js/emojis.js @@ -1,9423 +1 @@ -// Source: npm package: emojilib, file:emojis.json -window.tinymce.Resource.add("tinymce.plugins.emoticons", { - grinning: { - keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ], - char: "\ud83d\ude00", - fitzpatrick_scale: false, - category: "people" - }, - grimacing: { - keywords: [ "face", "grimace", "teeth" ], - char: "\ud83d\ude2c", - fitzpatrick_scale: false, - category: "people" - }, - grin: { - keywords: [ "face", "happy", "smile", "joy", "kawaii" ], - char: "\ud83d\ude01", - fitzpatrick_scale: false, - category: "people" - }, - joy: { - keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ], - char: "\ud83d\ude02", - fitzpatrick_scale: false, - category: "people" - }, - rofl: { - keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ], - char: "\ud83e\udd23", - fitzpatrick_scale: false, - category: "people" - }, - partying: { - keywords: [ "face", "celebration", "woohoo" ], - char: "\ud83e\udd73", - fitzpatrick_scale: false, - category: "people" - }, - smiley: { - keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ], - char: "\ud83d\ude03", - fitzpatrick_scale: false, - category: "people" - }, - smile: { - keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ], - char: "\ud83d\ude04", - fitzpatrick_scale: false, - category: "people" - }, - sweat_smile: { - keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ], - char: "\ud83d\ude05", - fitzpatrick_scale: false, - category: "people" - }, - laughing: { - keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ], - char: "\ud83d\ude06", - fitzpatrick_scale: false, - category: "people" - }, - innocent: { - keywords: [ "face", "angel", "heaven", "halo" ], - char: "\ud83d\ude07", - fitzpatrick_scale: false, - category: "people" - }, - wink: { - keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ], - char: "\ud83d\ude09", - fitzpatrick_scale: false, - category: "people" - }, - blush: { - keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ], - char: "\ud83d\ude0a", - fitzpatrick_scale: false, - category: "people" - }, - slightly_smiling_face: { - keywords: [ "face", "smile" ], - char: "\ud83d\ude42", - fitzpatrick_scale: false, - category: "people" - }, - upside_down_face: { - keywords: [ "face", "flipped", "silly", "smile" ], - char: "\ud83d\ude43", - fitzpatrick_scale: false, - category: "people" - }, - relaxed: { - keywords: [ "face", "blush", "massage", "happiness" ], - char: "\u263a\ufe0f", - fitzpatrick_scale: false, - category: "people" - }, - yum: { - keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ], - char: "\ud83d\ude0b", - fitzpatrick_scale: false, - category: "people" - }, - relieved: { - keywords: [ "face", "relaxed", "phew", "massage", "happiness" ], - char: "\ud83d\ude0c", - fitzpatrick_scale: false, - category: "people" - }, - heart_eyes: { - keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ], - char: "\ud83d\ude0d", - fitzpatrick_scale: false, - category: "people" - }, - smiling_face_with_three_hearts: { - keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ], - char: "\ud83e\udd70", - fitzpatrick_scale: false, - category: "people" - }, - kissing_heart: { - keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], - char: "\ud83d\ude18", - fitzpatrick_scale: false, - category: "people" - }, - kissing: { - keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ], - char: "\ud83d\ude17", - fitzpatrick_scale: false, - category: "people" - }, - kissing_smiling_eyes: { - keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ], - char: "\ud83d\ude19", - fitzpatrick_scale: false, - category: "people" - }, - kissing_closed_eyes: { - keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], - char: "\ud83d\ude1a", - fitzpatrick_scale: false, - category: "people" - }, - stuck_out_tongue_winking_eye: { - keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ], - char: "\ud83d\ude1c", - fitzpatrick_scale: false, - category: "people" - }, - zany: { - keywords: [ "face", "goofy", "crazy" ], - char: "\ud83e\udd2a", - fitzpatrick_scale: false, - category: "people" - }, - raised_eyebrow: { - keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ], - char: "\ud83e\udd28", - fitzpatrick_scale: false, - category: "people" - }, - monocle: { - keywords: [ "face", "stuffy", "wealthy" ], - char: "\ud83e\uddd0", - fitzpatrick_scale: false, - category: "people" - }, - stuck_out_tongue_closed_eyes: { - keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ], - char: "\ud83d\ude1d", - fitzpatrick_scale: false, - category: "people" - }, - stuck_out_tongue: { - keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ], - char: "\ud83d\ude1b", - fitzpatrick_scale: false, - category: "people" - }, - money_mouth_face: { - keywords: [ "face", "rich", "dollar", "money" ], - char: "\ud83e\udd11", - fitzpatrick_scale: false, - category: "people" - }, - nerd_face: { - keywords: [ "face", "nerdy", "geek", "dork" ], - char: "\ud83e\udd13", - fitzpatrick_scale: false, - category: "people" - }, - sunglasses: { - keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ], - char: "\ud83d\ude0e", - fitzpatrick_scale: false, - category: "people" - }, - star_struck: { - keywords: [ "face", "smile", "starry", "eyes", "grinning" ], - char: "\ud83e\udd29", - fitzpatrick_scale: false, - category: "people" - }, - clown_face: { - keywords: [ "face" ], - char: "\ud83e\udd21", - fitzpatrick_scale: false, - category: "people" - }, - cowboy_hat_face: { - keywords: [ "face", "cowgirl", "hat" ], - char: "\ud83e\udd20", - fitzpatrick_scale: false, - category: "people" - }, - hugs: { - keywords: [ "face", "smile", "hug" ], - char: "\ud83e\udd17", - fitzpatrick_scale: false, - category: "people" - }, - smirk: { - keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ], - char: "\ud83d\ude0f", - fitzpatrick_scale: false, - category: "people" - }, - no_mouth: { - keywords: [ "face", "hellokitty" ], - char: "\ud83d\ude36", - fitzpatrick_scale: false, - category: "people" - }, - neutral_face: { - keywords: [ "indifference", "meh", ":|", "neutral" ], - char: "\ud83d\ude10", - fitzpatrick_scale: false, - category: "people" - }, - expressionless: { - keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ], - char: "\ud83d\ude11", - fitzpatrick_scale: false, - category: "people" - }, - unamused: { - keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ], - char: "\ud83d\ude12", - fitzpatrick_scale: false, - category: "people" - }, - roll_eyes: { - keywords: [ "face", "eyeroll", "frustrated" ], - char: "\ud83d\ude44", - fitzpatrick_scale: false, - category: "people" - }, - thinking: { - keywords: [ "face", "hmmm", "think", "consider" ], - char: "\ud83e\udd14", - fitzpatrick_scale: false, - category: "people" - }, - lying_face: { - keywords: [ "face", "lie", "pinocchio" ], - char: "\ud83e\udd25", - fitzpatrick_scale: false, - category: "people" - }, - hand_over_mouth: { - keywords: [ "face", "whoops", "shock", "surprise" ], - char: "\ud83e\udd2d", - fitzpatrick_scale: false, - category: "people" - }, - shushing: { - keywords: [ "face", "quiet", "shhh" ], - char: "\ud83e\udd2b", - fitzpatrick_scale: false, - category: "people" - }, - symbols_over_mouth: { - keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ], - char: "\ud83e\udd2c", - fitzpatrick_scale: false, - category: "people" - }, - exploding_head: { - keywords: [ "face", "shocked", "mind", "blown" ], - char: "\ud83e\udd2f", - fitzpatrick_scale: false, - category: "people" - }, - flushed: { - keywords: [ "face", "blush", "shy", "flattered" ], - char: "\ud83d\ude33", - fitzpatrick_scale: false, - category: "people" - }, - disappointed: { - keywords: [ "face", "sad", "upset", "depressed", ":(" ], - char: "\ud83d\ude1e", - fitzpatrick_scale: false, - category: "people" - }, - worried: { - keywords: [ "face", "concern", "nervous", ":(" ], - char: "\ud83d\ude1f", - fitzpatrick_scale: false, - category: "people" - }, - angry: { - keywords: [ "mad", "face", "annoyed", "frustrated" ], - char: "\ud83d\ude20", - fitzpatrick_scale: false, - category: "people" - }, - rage: { - keywords: [ "angry", "mad", "hate", "despise" ], - char: "\ud83d\ude21", - fitzpatrick_scale: false, - category: "people" - }, - pensive: { - keywords: [ "face", "sad", "depressed", "upset" ], - char: "\ud83d\ude14", - fitzpatrick_scale: false, - category: "people" - }, - confused: { - keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ], - char: "\ud83d\ude15", - fitzpatrick_scale: false, - category: "people" - }, - slightly_frowning_face: { - keywords: [ "face", "frowning", "disappointed", "sad", "upset" ], - char: "\ud83d\ude41", - fitzpatrick_scale: false, - category: "people" - }, - frowning_face: { - keywords: [ "face", "sad", "upset", "frown" ], - char: "\u2639", - fitzpatrick_scale: false, - category: "people" - }, - persevere: { - keywords: [ "face", "sick", "no", "upset", "oops" ], - char: "\ud83d\ude23", - fitzpatrick_scale: false, - category: "people" - }, - confounded: { - keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ], - char: "\ud83d\ude16", - fitzpatrick_scale: false, - category: "people" - }, - tired_face: { - keywords: [ "sick", "whine", "upset", "frustrated" ], - char: "\ud83d\ude2b", - fitzpatrick_scale: false, - category: "people" - }, - weary: { - keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ], - char: "\ud83d\ude29", - fitzpatrick_scale: false, - category: "people" - }, - pleading: { - keywords: [ "face", "begging", "mercy" ], - char: "\ud83e\udd7a", - fitzpatrick_scale: false, - category: "people" - }, - triumph: { - keywords: [ "face", "gas", "phew", "proud", "pride" ], - char: "\ud83d\ude24", - fitzpatrick_scale: false, - category: "people" - }, - open_mouth: { - keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ], - char: "\ud83d\ude2e", - fitzpatrick_scale: false, - category: "people" - }, - scream: { - keywords: [ "face", "munch", "scared", "omg" ], - char: "\ud83d\ude31", - fitzpatrick_scale: false, - category: "people" - }, - fearful: { - keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ], - char: "\ud83d\ude28", - fitzpatrick_scale: false, - category: "people" - }, - cold_sweat: { - keywords: [ "face", "nervous", "sweat" ], - char: "\ud83d\ude30", - fitzpatrick_scale: false, - category: "people" - }, - hushed: { - keywords: [ "face", "woo", "shh" ], - char: "\ud83d\ude2f", - fitzpatrick_scale: false, - category: "people" - }, - frowning: { - keywords: [ "face", "aw", "what" ], - char: "\ud83d\ude26", - fitzpatrick_scale: false, - category: "people" - }, - anguished: { - keywords: [ "face", "stunned", "nervous" ], - char: "\ud83d\ude27", - fitzpatrick_scale: false, - category: "people" - }, - cry: { - keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ], - char: "\ud83d\ude22", - fitzpatrick_scale: false, - category: "people" - }, - disappointed_relieved: { - keywords: [ "face", "phew", "sweat", "nervous" ], - char: "\ud83d\ude25", - fitzpatrick_scale: false, - category: "people" - }, - drooling_face: { - keywords: [ "face" ], - char: "\ud83e\udd24", - fitzpatrick_scale: false, - category: "people" - }, - sleepy: { - keywords: [ "face", "tired", "rest", "nap" ], - char: "\ud83d\ude2a", - fitzpatrick_scale: false, - category: "people" - }, - sweat: { - keywords: [ "face", "hot", "sad", "tired", "exercise" ], - char: "\ud83d\ude13", - fitzpatrick_scale: false, - category: "people" - }, - hot: { - keywords: [ "face", "feverish", "heat", "red", "sweating" ], - char: "\ud83e\udd75", - fitzpatrick_scale: false, - category: "people" - }, - cold: { - keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ], - char: "\ud83e\udd76", - fitzpatrick_scale: false, - category: "people" - }, - sob: { - keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ], - char: "\ud83d\ude2d", - fitzpatrick_scale: false, - category: "people" - }, - dizzy_face: { - keywords: [ "spent", "unconscious", "xox", "dizzy" ], - char: "\ud83d\ude35", - fitzpatrick_scale: false, - category: "people" - }, - astonished: { - keywords: [ "face", "xox", "surprised", "poisoned" ], - char: "\ud83d\ude32", - fitzpatrick_scale: false, - category: "people" - }, - zipper_mouth_face: { - keywords: [ "face", "sealed", "zipper", "secret" ], - char: "\ud83e\udd10", - fitzpatrick_scale: false, - category: "people" - }, - nauseated_face: { - keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ], - char: "\ud83e\udd22", - fitzpatrick_scale: false, - category: "people" - }, - sneezing_face: { - keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ], - char: "\ud83e\udd27", - fitzpatrick_scale: false, - category: "people" - }, - vomiting: { - keywords: [ "face", "sick" ], - char: "\ud83e\udd2e", - fitzpatrick_scale: false, - category: "people" - }, - mask: { - keywords: [ "face", "sick", "ill", "disease" ], - char: "\ud83d\ude37", - fitzpatrick_scale: false, - category: "people" - }, - face_with_thermometer: { - keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ], - char: "\ud83e\udd12", - fitzpatrick_scale: false, - category: "people" - }, - face_with_head_bandage: { - keywords: [ "injured", "clumsy", "bandage", "hurt" ], - char: "\ud83e\udd15", - fitzpatrick_scale: false, - category: "people" - }, - woozy: { - keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ], - char: "\ud83e\udd74", - fitzpatrick_scale: false, - category: "people" - }, - sleeping: { - keywords: [ "face", "tired", "sleepy", "night", "zzz" ], - char: "\ud83d\ude34", - fitzpatrick_scale: false, - category: "people" - }, - zzz: { - keywords: [ "sleepy", "tired", "dream" ], - char: "\ud83d\udca4", - fitzpatrick_scale: false, - category: "people" - }, - poop: { - keywords: [ "hankey", "shitface", "fail", "turd", "shit" ], - char: "\ud83d\udca9", - fitzpatrick_scale: false, - category: "people" - }, - smiling_imp: { - keywords: [ "devil", "horns" ], - char: "\ud83d\ude08", - fitzpatrick_scale: false, - category: "people" - }, - imp: { - keywords: [ "devil", "angry", "horns" ], - char: "\ud83d\udc7f", - fitzpatrick_scale: false, - category: "people" - }, - japanese_ogre: { - keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ], - char: "\ud83d\udc79", - fitzpatrick_scale: false, - category: "people" - }, - japanese_goblin: { - keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ], - char: "\ud83d\udc7a", - fitzpatrick_scale: false, - category: "people" - }, - skull: { - keywords: [ "dead", "skeleton", "creepy", "death" ], - char: "\ud83d\udc80", - fitzpatrick_scale: false, - category: "people" - }, - ghost: { - keywords: [ "halloween", "spooky", "scary" ], - char: "\ud83d\udc7b", - fitzpatrick_scale: false, - category: "people" - }, - alien: { - keywords: [ "UFO", "paul", "weird", "outer_space" ], - char: "\ud83d\udc7d", - fitzpatrick_scale: false, - category: "people" - }, - robot: { - keywords: [ "computer", "machine", "bot" ], - char: "\ud83e\udd16", - fitzpatrick_scale: false, - category: "people" - }, - smiley_cat: { - keywords: [ "animal", "cats", "happy", "smile" ], - char: "\ud83d\ude3a", - fitzpatrick_scale: false, - category: "people" - }, - smile_cat: { - keywords: [ "animal", "cats", "smile" ], - char: "\ud83d\ude38", - fitzpatrick_scale: false, - category: "people" - }, - joy_cat: { - keywords: [ "animal", "cats", "haha", "happy", "tears" ], - char: "\ud83d\ude39", - fitzpatrick_scale: false, - category: "people" - }, - heart_eyes_cat: { - keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ], - char: "\ud83d\ude3b", - fitzpatrick_scale: false, - category: "people" - }, - smirk_cat: { - keywords: [ "animal", "cats", "smirk" ], - char: "\ud83d\ude3c", - fitzpatrick_scale: false, - category: "people" - }, - kissing_cat: { - keywords: [ "animal", "cats", "kiss" ], - char: "\ud83d\ude3d", - fitzpatrick_scale: false, - category: "people" - }, - scream_cat: { - keywords: [ "animal", "cats", "munch", "scared", "scream" ], - char: "\ud83d\ude40", - fitzpatrick_scale: false, - category: "people" - }, - crying_cat_face: { - keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ], - char: "\ud83d\ude3f", - fitzpatrick_scale: false, - category: "people" - }, - pouting_cat: { - keywords: [ "animal", "cats" ], - char: "\ud83d\ude3e", - fitzpatrick_scale: false, - category: "people" - }, - palms_up: { - keywords: [ "hands", "gesture", "cupped", "prayer" ], - char: "\ud83e\udd32", - fitzpatrick_scale: true, - category: "people" - }, - raised_hands: { - keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ], - char: "\ud83d\ude4c", - fitzpatrick_scale: true, - category: "people" - }, - clap: { - keywords: [ "hands", "praise", "applause", "congrats", "yay" ], - char: "\ud83d\udc4f", - fitzpatrick_scale: true, - category: "people" - }, - wave: { - keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ], - char: "\ud83d\udc4b", - fitzpatrick_scale: true, - category: "people" - }, - call_me_hand: { - keywords: [ "hands", "gesture" ], - char: "\ud83e\udd19", - fitzpatrick_scale: true, - category: "people" - }, - "+1": { - keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ], - char: "\ud83d\udc4d", - fitzpatrick_scale: true, - category: "people" - }, - "-1": { - keywords: [ "thumbsdown", "no", "dislike", "hand" ], - char: "\ud83d\udc4e", - fitzpatrick_scale: true, - category: "people" - }, - facepunch: { - keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ], - char: "\ud83d\udc4a", - fitzpatrick_scale: true, - category: "people" - }, - fist: { - keywords: [ "fingers", "hand", "grasp" ], - char: "\u270a", - fitzpatrick_scale: true, - category: "people" - }, - fist_left: { - keywords: [ "hand", "fistbump" ], - char: "\ud83e\udd1b", - fitzpatrick_scale: true, - category: "people" - }, - fist_right: { - keywords: [ "hand", "fistbump" ], - char: "\ud83e\udd1c", - fitzpatrick_scale: true, - category: "people" - }, - v: { - keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ], - char: "\u270c", - fitzpatrick_scale: true, - category: "people" - }, - ok_hand: { - keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ], - char: "\ud83d\udc4c", - fitzpatrick_scale: true, - category: "people" - }, - raised_hand: { - keywords: [ "fingers", "stop", "highfive", "palm", "ban" ], - char: "\u270b", - fitzpatrick_scale: true, - category: "people" - }, - raised_back_of_hand: { - keywords: [ "fingers", "raised", "backhand" ], - char: "\ud83e\udd1a", - fitzpatrick_scale: true, - category: "people" - }, - open_hands: { - keywords: [ "fingers", "butterfly", "hands", "open" ], - char: "\ud83d\udc50", - fitzpatrick_scale: true, - category: "people" - }, - muscle: { - keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ], - char: "\ud83d\udcaa", - fitzpatrick_scale: true, - category: "people" - }, - pray: { - keywords: [ "please", "hope", "wish", "namaste", "highfive" ], - char: "\ud83d\ude4f", - fitzpatrick_scale: true, - category: "people" - }, - foot: { - keywords: [ "kick", "stomp" ], - char: "\ud83e\uddb6", - fitzpatrick_scale: true, - category: "people" - }, - leg: { - keywords: [ "kick", "limb" ], - char: "\ud83e\uddb5", - fitzpatrick_scale: true, - category: "people" - }, - handshake: { - keywords: [ "agreement", "shake" ], - char: "\ud83e\udd1d", - fitzpatrick_scale: false, - category: "people" - }, - point_up: { - keywords: [ "hand", "fingers", "direction", "up" ], - char: "\u261d", - fitzpatrick_scale: true, - category: "people" - }, - point_up_2: { - keywords: [ "fingers", "hand", "direction", "up" ], - char: "\ud83d\udc46", - fitzpatrick_scale: true, - category: "people" - }, - point_down: { - keywords: [ "fingers", "hand", "direction", "down" ], - char: "\ud83d\udc47", - fitzpatrick_scale: true, - category: "people" - }, - point_left: { - keywords: [ "direction", "fingers", "hand", "left" ], - char: "\ud83d\udc48", - fitzpatrick_scale: true, - category: "people" - }, - point_right: { - keywords: [ "fingers", "hand", "direction", "right" ], - char: "\ud83d\udc49", - fitzpatrick_scale: true, - category: "people" - }, - fu: { - keywords: [ "hand", "fingers", "rude", "middle", "flipping" ], - char: "\ud83d\udd95", - fitzpatrick_scale: true, - category: "people" - }, - raised_hand_with_fingers_splayed: { - keywords: [ "hand", "fingers", "palm" ], - char: "\ud83d\udd90", - fitzpatrick_scale: true, - category: "people" - }, - love_you: { - keywords: [ "hand", "fingers", "gesture" ], - char: "\ud83e\udd1f", - fitzpatrick_scale: true, - category: "people" - }, - metal: { - keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ], - char: "\ud83e\udd18", - fitzpatrick_scale: true, - category: "people" - }, - crossed_fingers: { - keywords: [ "good", "lucky" ], - char: "\ud83e\udd1e", - fitzpatrick_scale: true, - category: "people" - }, - vulcan_salute: { - keywords: [ "hand", "fingers", "spock", "star trek" ], - char: "\ud83d\udd96", - fitzpatrick_scale: true, - category: "people" - }, - writing_hand: { - keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ], - char: "\u270d", - fitzpatrick_scale: true, - category: "people" - }, - selfie: { - keywords: [ "camera", "phone" ], - char: "\ud83e\udd33", - fitzpatrick_scale: true, - category: "people" - }, - nail_care: { - keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ], - char: "\ud83d\udc85", - fitzpatrick_scale: true, - category: "people" - }, - lips: { - keywords: [ "mouth", "kiss" ], - char: "\ud83d\udc44", - fitzpatrick_scale: false, - category: "people" - }, - tooth: { - keywords: [ "teeth", "dentist" ], - char: "\ud83e\uddb7", - fitzpatrick_scale: false, - category: "people" - }, - tongue: { - keywords: [ "mouth", "playful" ], - char: "\ud83d\udc45", - fitzpatrick_scale: false, - category: "people" - }, - ear: { - keywords: [ "face", "hear", "sound", "listen" ], - char: "\ud83d\udc42", - fitzpatrick_scale: true, - category: "people" - }, - nose: { - keywords: [ "smell", "sniff" ], - char: "\ud83d\udc43", - fitzpatrick_scale: true, - category: "people" - }, - eye: { - keywords: [ "face", "look", "see", "watch", "stare" ], - char: "\ud83d\udc41", - fitzpatrick_scale: false, - category: "people" - }, - eyes: { - keywords: [ "look", "watch", "stalk", "peek", "see" ], - char: "\ud83d\udc40", - fitzpatrick_scale: false, - category: "people" - }, - brain: { - keywords: [ "smart", "intelligent" ], - char: "\ud83e\udde0", - fitzpatrick_scale: false, - category: "people" - }, - bust_in_silhouette: { - keywords: [ "user", "person", "human" ], - char: "\ud83d\udc64", - fitzpatrick_scale: false, - category: "people" - }, - busts_in_silhouette: { - keywords: [ "user", "person", "human", "group", "team" ], - char: "\ud83d\udc65", - fitzpatrick_scale: false, - category: "people" - }, - speaking_head: { - keywords: [ "user", "person", "human", "sing", "say", "talk" ], - char: "\ud83d\udde3", - fitzpatrick_scale: false, - category: "people" - }, - baby: { - keywords: [ "child", "boy", "girl", "toddler" ], - char: "\ud83d\udc76", - fitzpatrick_scale: true, - category: "people" - }, - child: { - keywords: [ "gender-neutral", "young" ], - char: "\ud83e\uddd2", - fitzpatrick_scale: true, - category: "people" - }, - boy: { - keywords: [ "man", "male", "guy", "teenager" ], - char: "\ud83d\udc66", - fitzpatrick_scale: true, - category: "people" - }, - girl: { - keywords: [ "female", "woman", "teenager" ], - char: "\ud83d\udc67", - fitzpatrick_scale: true, - category: "people" - }, - adult: { - keywords: [ "gender-neutral", "person" ], - char: "\ud83e\uddd1", - fitzpatrick_scale: true, - category: "people" - }, - man: { - keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ], - char: "\ud83d\udc68", - fitzpatrick_scale: true, - category: "people" - }, - woman: { - keywords: [ "female", "girls", "lady" ], - char: "\ud83d\udc69", - fitzpatrick_scale: true, - category: "people" - }, - blonde_woman: { - keywords: [ "woman", "female", "girl", "blonde", "person" ], - char: "\ud83d\udc71\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - blonde_man: { - keywords: [ "man", "male", "boy", "blonde", "guy", "person" ], - char: "\ud83d\udc71", - fitzpatrick_scale: true, - category: "people" - }, - bearded_person: { - keywords: [ "person", "bewhiskered" ], - char: "\ud83e\uddd4", - fitzpatrick_scale: true, - category: "people" - }, - older_adult: { - keywords: [ "human", "elder", "senior", "gender-neutral" ], - char: "\ud83e\uddd3", - fitzpatrick_scale: true, - category: "people" - }, - older_man: { - keywords: [ "human", "male", "men", "old", "elder", "senior" ], - char: "\ud83d\udc74", - fitzpatrick_scale: true, - category: "people" - }, - older_woman: { - keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ], - char: "\ud83d\udc75", - fitzpatrick_scale: true, - category: "people" - }, - man_with_gua_pi_mao: { - keywords: [ "male", "boy", "chinese" ], - char: "\ud83d\udc72", - fitzpatrick_scale: true, - category: "people" - }, - woman_with_headscarf: { - keywords: [ "female", "hijab", "mantilla", "tichel" ], - char: "\ud83e\uddd5", - fitzpatrick_scale: true, - category: "people" - }, - woman_with_turban: { - keywords: [ "female", "indian", "hinduism", "arabs", "woman" ], - char: "\ud83d\udc73\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - man_with_turban: { - keywords: [ "male", "indian", "hinduism", "arabs" ], - char: "\ud83d\udc73", - fitzpatrick_scale: true, - category: "people" - }, - policewoman: { - keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ], - char: "\ud83d\udc6e\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - policeman: { - keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ], - char: "\ud83d\udc6e", - fitzpatrick_scale: true, - category: "people" - }, - construction_worker_woman: { - keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ], - char: "\ud83d\udc77\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - construction_worker_man: { - keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ], - char: "\ud83d\udc77", - fitzpatrick_scale: true, - category: "people" - }, - guardswoman: { - keywords: [ "uk", "gb", "british", "female", "royal", "woman" ], - char: "\ud83d\udc82\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - guardsman: { - keywords: [ "uk", "gb", "british", "male", "guy", "royal" ], - char: "\ud83d\udc82", - fitzpatrick_scale: true, - category: "people" - }, - female_detective: { - keywords: [ "human", "spy", "detective", "female", "woman" ], - char: "\ud83d\udd75\ufe0f\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - male_detective: { - keywords: [ "human", "spy", "detective" ], - char: "\ud83d\udd75", - fitzpatrick_scale: true, - category: "people" - }, - woman_health_worker: { - keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ], - char: "\ud83d\udc69\u200d\u2695\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - man_health_worker: { - keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ], - char: "\ud83d\udc68\u200d\u2695\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - woman_farmer: { - keywords: [ "rancher", "gardener", "woman", "human" ], - char: "\ud83d\udc69\u200d\ud83c\udf3e", - fitzpatrick_scale: true, - category: "people" - }, - man_farmer: { - keywords: [ "rancher", "gardener", "man", "human" ], - char: "\ud83d\udc68\u200d\ud83c\udf3e", - fitzpatrick_scale: true, - category: "people" - }, - woman_cook: { - keywords: [ "chef", "woman", "human" ], - char: "\ud83d\udc69\u200d\ud83c\udf73", - fitzpatrick_scale: true, - category: "people" - }, - man_cook: { - keywords: [ "chef", "man", "human" ], - char: "\ud83d\udc68\u200d\ud83c\udf73", - fitzpatrick_scale: true, - category: "people" - }, - woman_student: { - keywords: [ "graduate", "woman", "human" ], - char: "\ud83d\udc69\u200d\ud83c\udf93", - fitzpatrick_scale: true, - category: "people" - }, - man_student: { - keywords: [ "graduate", "man", "human" ], - char: "\ud83d\udc68\u200d\ud83c\udf93", - fitzpatrick_scale: true, - category: "people" - }, - woman_singer: { - keywords: [ "rockstar", "entertainer", "woman", "human" ], - char: "\ud83d\udc69\u200d\ud83c\udfa4", - fitzpatrick_scale: true, - category: "people" - }, - man_singer: { - keywords: [ "rockstar", "entertainer", "man", "human" ], - char: "\ud83d\udc68\u200d\ud83c\udfa4", - fitzpatrick_scale: true, - category: "people" - }, - woman_teacher: { - keywords: [ "instructor", "professor", "woman", "human" ], - char: "\ud83d\udc69\u200d\ud83c\udfeb", - fitzpatrick_scale: true, - category: "people" - }, - man_teacher: { - keywords: [ "instructor", "professor", "man", "human" ], - char: "\ud83d\udc68\u200d\ud83c\udfeb", - fitzpatrick_scale: true, - category: "people" - }, - woman_factory_worker: { - keywords: [ "assembly", "industrial", "woman", "human" ], - char: "\ud83d\udc69\u200d\ud83c\udfed", - fitzpatrick_scale: true, - category: "people" - }, - man_factory_worker: { - keywords: [ "assembly", "industrial", "man", "human" ], - char: "\ud83d\udc68\u200d\ud83c\udfed", - fitzpatrick_scale: true, - category: "people" - }, - woman_technologist: { - keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ], - char: "\ud83d\udc69\u200d\ud83d\udcbb", - fitzpatrick_scale: true, - category: "people" - }, - man_technologist: { - keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ], - char: "\ud83d\udc68\u200d\ud83d\udcbb", - fitzpatrick_scale: true, - category: "people" - }, - woman_office_worker: { - keywords: [ "business", "manager", "woman", "human" ], - char: "\ud83d\udc69\u200d\ud83d\udcbc", - fitzpatrick_scale: true, - category: "people" - }, - man_office_worker: { - keywords: [ "business", "manager", "man", "human" ], - char: "\ud83d\udc68\u200d\ud83d\udcbc", - fitzpatrick_scale: true, - category: "people" - }, - woman_mechanic: { - keywords: [ "plumber", "woman", "human", "wrench" ], - char: "\ud83d\udc69\u200d\ud83d\udd27", - fitzpatrick_scale: true, - category: "people" - }, - man_mechanic: { - keywords: [ "plumber", "man", "human", "wrench" ], - char: "\ud83d\udc68\u200d\ud83d\udd27", - fitzpatrick_scale: true, - category: "people" - }, - woman_scientist: { - keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ], - char: "\ud83d\udc69\u200d\ud83d\udd2c", - fitzpatrick_scale: true, - category: "people" - }, - man_scientist: { - keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ], - char: "\ud83d\udc68\u200d\ud83d\udd2c", - fitzpatrick_scale: true, - category: "people" - }, - woman_artist: { - keywords: [ "painter", "woman", "human" ], - char: "\ud83d\udc69\u200d\ud83c\udfa8", - fitzpatrick_scale: true, - category: "people" - }, - man_artist: { - keywords: [ "painter", "man", "human" ], - char: "\ud83d\udc68\u200d\ud83c\udfa8", - fitzpatrick_scale: true, - category: "people" - }, - woman_firefighter: { - keywords: [ "fireman", "woman", "human" ], - char: "\ud83d\udc69\u200d\ud83d\ude92", - fitzpatrick_scale: true, - category: "people" - }, - man_firefighter: { - keywords: [ "fireman", "man", "human" ], - char: "\ud83d\udc68\u200d\ud83d\ude92", - fitzpatrick_scale: true, - category: "people" - }, - woman_pilot: { - keywords: [ "aviator", "plane", "woman", "human" ], - char: "\ud83d\udc69\u200d\u2708\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - man_pilot: { - keywords: [ "aviator", "plane", "man", "human" ], - char: "\ud83d\udc68\u200d\u2708\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - woman_astronaut: { - keywords: [ "space", "rocket", "woman", "human" ], - char: "\ud83d\udc69\u200d\ud83d\ude80", - fitzpatrick_scale: true, - category: "people" - }, - man_astronaut: { - keywords: [ "space", "rocket", "man", "human" ], - char: "\ud83d\udc68\u200d\ud83d\ude80", - fitzpatrick_scale: true, - category: "people" - }, - woman_judge: { - keywords: [ "justice", "court", "woman", "human" ], - char: "\ud83d\udc69\u200d\u2696\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - man_judge: { - keywords: [ "justice", "court", "man", "human" ], - char: "\ud83d\udc68\u200d\u2696\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - woman_superhero: { - keywords: [ "woman", "female", "good", "heroine", "superpowers" ], - char: "\ud83e\uddb8\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - man_superhero: { - keywords: [ "man", "male", "good", "hero", "superpowers" ], - char: "\ud83e\uddb8\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - woman_supervillain: { - keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ], - char: "\ud83e\uddb9\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - man_supervillain: { - keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ], - char: "\ud83e\uddb9\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - mrs_claus: { - keywords: [ "woman", "female", "xmas", "mother christmas" ], - char: "\ud83e\udd36", - fitzpatrick_scale: true, - category: "people" - }, - santa: { - keywords: [ "festival", "man", "male", "xmas", "father christmas" ], - char: "\ud83c\udf85", - fitzpatrick_scale: true, - category: "people" - }, - sorceress: { - keywords: [ "woman", "female", "mage", "witch" ], - char: "\ud83e\uddd9\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - wizard: { - keywords: [ "man", "male", "mage", "sorcerer" ], - char: "\ud83e\uddd9\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - woman_elf: { - keywords: [ "woman", "female" ], - char: "\ud83e\udddd\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - man_elf: { - keywords: [ "man", "male" ], - char: "\ud83e\udddd\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - woman_vampire: { - keywords: [ "woman", "female" ], - char: "\ud83e\udddb\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - man_vampire: { - keywords: [ "man", "male", "dracula" ], - char: "\ud83e\udddb\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - woman_zombie: { - keywords: [ "woman", "female", "undead", "walking dead" ], - char: "\ud83e\udddf\u200d\u2640\ufe0f", - fitzpatrick_scale: false, - category: "people" - }, - man_zombie: { - keywords: [ "man", "male", "dracula", "undead", "walking dead" ], - char: "\ud83e\udddf\u200d\u2642\ufe0f", - fitzpatrick_scale: false, - category: "people" - }, - woman_genie: { - keywords: [ "woman", "female" ], - char: "\ud83e\uddde\u200d\u2640\ufe0f", - fitzpatrick_scale: false, - category: "people" - }, - man_genie: { - keywords: [ "man", "male" ], - char: "\ud83e\uddde\u200d\u2642\ufe0f", - fitzpatrick_scale: false, - category: "people" - }, - mermaid: { - keywords: [ "woman", "female", "merwoman", "ariel" ], - char: "\ud83e\udddc\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - merman: { - keywords: [ "man", "male", "triton" ], - char: "\ud83e\udddc\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - woman_fairy: { - keywords: [ "woman", "female" ], - char: "\ud83e\uddda\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - man_fairy: { - keywords: [ "man", "male" ], - char: "\ud83e\uddda\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - angel: { - keywords: [ "heaven", "wings", "halo" ], - char: "\ud83d\udc7c", - fitzpatrick_scale: true, - category: "people" - }, - pregnant_woman: { - keywords: [ "baby" ], - char: "\ud83e\udd30", - fitzpatrick_scale: true, - category: "people" - }, - breastfeeding: { - keywords: [ "nursing", "baby" ], - char: "\ud83e\udd31", - fitzpatrick_scale: true, - category: "people" - }, - princess: { - keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ], - char: "\ud83d\udc78", - fitzpatrick_scale: true, - category: "people" - }, - prince: { - keywords: [ "boy", "man", "male", "crown", "royal", "king" ], - char: "\ud83e\udd34", - fitzpatrick_scale: true, - category: "people" - }, - bride_with_veil: { - keywords: [ "couple", "marriage", "wedding", "woman", "bride" ], - char: "\ud83d\udc70", - fitzpatrick_scale: true, - category: "people" - }, - man_in_tuxedo: { - keywords: [ "couple", "marriage", "wedding", "groom" ], - char: "\ud83e\udd35", - fitzpatrick_scale: true, - category: "people" - }, - running_woman: { - keywords: [ "woman", "walking", "exercise", "race", "running", "female" ], - char: "\ud83c\udfc3\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - running_man: { - keywords: [ "man", "walking", "exercise", "race", "running" ], - char: "\ud83c\udfc3", - fitzpatrick_scale: true, - category: "people" - }, - walking_woman: { - keywords: [ "human", "feet", "steps", "woman", "female" ], - char: "\ud83d\udeb6\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - walking_man: { - keywords: [ "human", "feet", "steps" ], - char: "\ud83d\udeb6", - fitzpatrick_scale: true, - category: "people" - }, - dancer: { - keywords: [ "female", "girl", "woman", "fun" ], - char: "\ud83d\udc83", - fitzpatrick_scale: true, - category: "people" - }, - man_dancing: { - keywords: [ "male", "boy", "fun", "dancer" ], - char: "\ud83d\udd7a", - fitzpatrick_scale: true, - category: "people" - }, - dancing_women: { - keywords: [ "female", "bunny", "women", "girls" ], - char: "\ud83d\udc6f", - fitzpatrick_scale: false, - category: "people" - }, - dancing_men: { - keywords: [ "male", "bunny", "men", "boys" ], - char: "\ud83d\udc6f\u200d\u2642\ufe0f", - fitzpatrick_scale: false, - category: "people" - }, - couple: { - keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ], - char: "\ud83d\udc6b", - fitzpatrick_scale: false, - category: "people" - }, - two_men_holding_hands: { - keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ], - char: "\ud83d\udc6c", - fitzpatrick_scale: false, - category: "people" - }, - two_women_holding_hands: { - keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ], - char: "\ud83d\udc6d", - fitzpatrick_scale: false, - category: "people" - }, - bowing_woman: { - keywords: [ "woman", "female", "girl" ], - char: "\ud83d\ude47\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - bowing_man: { - keywords: [ "man", "male", "boy" ], - char: "\ud83d\ude47", - fitzpatrick_scale: true, - category: "people" - }, - man_facepalming: { - keywords: [ "man", "male", "boy", "disbelief" ], - char: "\ud83e\udd26\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - woman_facepalming: { - keywords: [ "woman", "female", "girl", "disbelief" ], - char: "\ud83e\udd26\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - woman_shrugging: { - keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ], - char: "\ud83e\udd37", - fitzpatrick_scale: true, - category: "people" - }, - man_shrugging: { - keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ], - char: "\ud83e\udd37\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - tipping_hand_woman: { - keywords: [ "female", "girl", "woman", "human", "information" ], - char: "\ud83d\udc81", - fitzpatrick_scale: true, - category: "people" - }, - tipping_hand_man: { - keywords: [ "male", "boy", "man", "human", "information" ], - char: "\ud83d\udc81\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - no_good_woman: { - keywords: [ "female", "girl", "woman", "nope" ], - char: "\ud83d\ude45", - fitzpatrick_scale: true, - category: "people" - }, - no_good_man: { - keywords: [ "male", "boy", "man", "nope" ], - char: "\ud83d\ude45\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - ok_woman: { - keywords: [ "women", "girl", "female", "pink", "human", "woman" ], - char: "\ud83d\ude46", - fitzpatrick_scale: true, - category: "people" - }, - ok_man: { - keywords: [ "men", "boy", "male", "blue", "human", "man" ], - char: "\ud83d\ude46\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - raising_hand_woman: { - keywords: [ "female", "girl", "woman" ], - char: "\ud83d\ude4b", - fitzpatrick_scale: true, - category: "people" - }, - raising_hand_man: { - keywords: [ "male", "boy", "man" ], - char: "\ud83d\ude4b\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - pouting_woman: { - keywords: [ "female", "girl", "woman" ], - char: "\ud83d\ude4e", - fitzpatrick_scale: true, - category: "people" - }, - pouting_man: { - keywords: [ "male", "boy", "man" ], - char: "\ud83d\ude4e\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - frowning_woman: { - keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ], - char: "\ud83d\ude4d", - fitzpatrick_scale: true, - category: "people" - }, - frowning_man: { - keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ], - char: "\ud83d\ude4d\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - haircut_woman: { - keywords: [ "female", "girl", "woman" ], - char: "\ud83d\udc87", - fitzpatrick_scale: true, - category: "people" - }, - haircut_man: { - keywords: [ "male", "boy", "man" ], - char: "\ud83d\udc87\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - massage_woman: { - keywords: [ "female", "girl", "woman", "head" ], - char: "\ud83d\udc86", - fitzpatrick_scale: true, - category: "people" - }, - massage_man: { - keywords: [ "male", "boy", "man", "head" ], - char: "\ud83d\udc86\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - woman_in_steamy_room: { - keywords: [ "female", "woman", "spa", "steamroom", "sauna" ], - char: "\ud83e\uddd6\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - man_in_steamy_room: { - keywords: [ "male", "man", "spa", "steamroom", "sauna" ], - char: "\ud83e\uddd6\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "people" - }, - couple_with_heart_woman_man: { - keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], - char: "\ud83d\udc91", - fitzpatrick_scale: false, - category: "people" - }, - couple_with_heart_woman_woman: { - keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], - char: "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69", - fitzpatrick_scale: false, - category: "people" - }, - couple_with_heart_man_man: { - keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], - char: "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68", - fitzpatrick_scale: false, - category: "people" - }, - couplekiss_man_woman: { - keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], - char: "\ud83d\udc8f", - fitzpatrick_scale: false, - category: "people" - }, - couplekiss_woman_woman: { - keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], - char: "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69", - fitzpatrick_scale: false, - category: "people" - }, - couplekiss_man_man: { - keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], - char: "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68", - fitzpatrick_scale: false, - category: "people" - }, - family_man_woman_boy: { - keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ], - char: "\ud83d\udc6a", - fitzpatrick_scale: false, - category: "people" - }, - family_man_woman_girl: { - keywords: [ "home", "parents", "people", "human", "child" ], - char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67", - fitzpatrick_scale: false, - category: "people" - }, - family_man_woman_girl_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_man_woman_boy_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_man_woman_girl_girl: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", - fitzpatrick_scale: false, - category: "people" - }, - family_woman_woman_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_woman_woman_girl: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67", - fitzpatrick_scale: false, - category: "people" - }, - family_woman_woman_girl_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_woman_woman_boy_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_woman_woman_girl_girl: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", - fitzpatrick_scale: false, - category: "people" - }, - family_man_man_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_man_man_girl: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67", - fitzpatrick_scale: false, - category: "people" - }, - family_man_man_girl_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_man_man_boy_boy: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_man_man_girl_girl: { - keywords: [ "home", "parents", "people", "human", "children" ], - char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67", - fitzpatrick_scale: false, - category: "people" - }, - family_woman_boy: { - keywords: [ "home", "parent", "people", "human", "child" ], - char: "\ud83d\udc69\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_woman_girl: { - keywords: [ "home", "parent", "people", "human", "child" ], - char: "\ud83d\udc69\u200d\ud83d\udc67", - fitzpatrick_scale: false, - category: "people" - }, - family_woman_girl_boy: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_woman_boy_boy: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: "\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_woman_girl_girl: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", - fitzpatrick_scale: false, - category: "people" - }, - family_man_boy: { - keywords: [ "home", "parent", "people", "human", "child" ], - char: "\ud83d\udc68\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_man_girl: { - keywords: [ "home", "parent", "people", "human", "child" ], - char: "\ud83d\udc68\u200d\ud83d\udc67", - fitzpatrick_scale: false, - category: "people" - }, - family_man_girl_boy: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_man_boy_boy: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: "\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66", - fitzpatrick_scale: false, - category: "people" - }, - family_man_girl_girl: { - keywords: [ "home", "parent", "people", "human", "children" ], - char: "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67", - fitzpatrick_scale: false, - category: "people" - }, - yarn: { - keywords: [ "ball", "crochet", "knit" ], - char: "\ud83e\uddf6", - fitzpatrick_scale: false, - category: "people" - }, - thread: { - keywords: [ "needle", "sewing", "spool", "string" ], - char: "\ud83e\uddf5", - fitzpatrick_scale: false, - category: "people" - }, - coat: { - keywords: [ "jacket" ], - char: "\ud83e\udde5", - fitzpatrick_scale: false, - category: "people" - }, - labcoat: { - keywords: [ "doctor", "experiment", "scientist", "chemist" ], - char: "\ud83e\udd7c", - fitzpatrick_scale: false, - category: "people" - }, - womans_clothes: { - keywords: [ "fashion", "shopping_bags", "female" ], - char: "\ud83d\udc5a", - fitzpatrick_scale: false, - category: "people" - }, - tshirt: { - keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ], - char: "\ud83d\udc55", - fitzpatrick_scale: false, - category: "people" - }, - jeans: { - keywords: [ "fashion", "shopping" ], - char: "\ud83d\udc56", - fitzpatrick_scale: false, - category: "people" - }, - necktie: { - keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ], - char: "\ud83d\udc54", - fitzpatrick_scale: false, - category: "people" - }, - dress: { - keywords: [ "clothes", "fashion", "shopping" ], - char: "\ud83d\udc57", - fitzpatrick_scale: false, - category: "people" - }, - bikini: { - keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ], - char: "\ud83d\udc59", - fitzpatrick_scale: false, - category: "people" - }, - kimono: { - keywords: [ "dress", "fashion", "women", "female", "japanese" ], - char: "\ud83d\udc58", - fitzpatrick_scale: false, - category: "people" - }, - lipstick: { - keywords: [ "female", "girl", "fashion", "woman" ], - char: "\ud83d\udc84", - fitzpatrick_scale: false, - category: "people" - }, - kiss: { - keywords: [ "face", "lips", "love", "like", "affection", "valentines" ], - char: "\ud83d\udc8b", - fitzpatrick_scale: false, - category: "people" - }, - footprints: { - keywords: [ "feet", "tracking", "walking", "beach" ], - char: "\ud83d\udc63", - fitzpatrick_scale: false, - category: "people" - }, - flat_shoe: { - keywords: [ "ballet", "slip-on", "slipper" ], - char: "\ud83e\udd7f", - fitzpatrick_scale: false, - category: "people" - }, - high_heel: { - keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ], - char: "\ud83d\udc60", - fitzpatrick_scale: false, - category: "people" - }, - sandal: { - keywords: [ "shoes", "fashion", "flip flops" ], - char: "\ud83d\udc61", - fitzpatrick_scale: false, - category: "people" - }, - boot: { - keywords: [ "shoes", "fashion" ], - char: "\ud83d\udc62", - fitzpatrick_scale: false, - category: "people" - }, - mans_shoe: { - keywords: [ "fashion", "male" ], - char: "\ud83d\udc5e", - fitzpatrick_scale: false, - category: "people" - }, - athletic_shoe: { - keywords: [ "shoes", "sports", "sneakers" ], - char: "\ud83d\udc5f", - fitzpatrick_scale: false, - category: "people" - }, - hiking_boot: { - keywords: [ "backpacking", "camping", "hiking" ], - char: "\ud83e\udd7e", - fitzpatrick_scale: false, - category: "people" - }, - socks: { - keywords: [ "stockings", "clothes" ], - char: "\ud83e\udde6", - fitzpatrick_scale: false, - category: "people" - }, - gloves: { - keywords: [ "hands", "winter", "clothes" ], - char: "\ud83e\udde4", - fitzpatrick_scale: false, - category: "people" - }, - scarf: { - keywords: [ "neck", "winter", "clothes" ], - char: "\ud83e\udde3", - fitzpatrick_scale: false, - category: "people" - }, - womans_hat: { - keywords: [ "fashion", "accessories", "female", "lady", "spring" ], - char: "\ud83d\udc52", - fitzpatrick_scale: false, - category: "people" - }, - tophat: { - keywords: [ "magic", "gentleman", "classy", "circus" ], - char: "\ud83c\udfa9", - fitzpatrick_scale: false, - category: "people" - }, - billed_hat: { - keywords: [ "cap", "baseball" ], - char: "\ud83e\udde2", - fitzpatrick_scale: false, - category: "people" - }, - rescue_worker_helmet: { - keywords: [ "construction", "build" ], - char: "\u26d1", - fitzpatrick_scale: false, - category: "people" - }, - mortar_board: { - keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ], - char: "\ud83c\udf93", - fitzpatrick_scale: false, - category: "people" - }, - crown: { - keywords: [ "king", "kod", "leader", "royalty", "lord" ], - char: "\ud83d\udc51", - fitzpatrick_scale: false, - category: "people" - }, - school_satchel: { - keywords: [ "student", "education", "bag", "backpack" ], - char: "\ud83c\udf92", - fitzpatrick_scale: false, - category: "people" - }, - luggage: { - keywords: [ "packing", "travel" ], - char: "\ud83e\uddf3", - fitzpatrick_scale: false, - category: "people" - }, - pouch: { - keywords: [ "bag", "accessories", "shopping" ], - char: "\ud83d\udc5d", - fitzpatrick_scale: false, - category: "people" - }, - purse: { - keywords: [ "fashion", "accessories", "money", "sales", "shopping" ], - char: "\ud83d\udc5b", - fitzpatrick_scale: false, - category: "people" - }, - handbag: { - keywords: [ "fashion", "accessory", "accessories", "shopping" ], - char: "\ud83d\udc5c", - fitzpatrick_scale: false, - category: "people" - }, - briefcase: { - keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ], - char: "\ud83d\udcbc", - fitzpatrick_scale: false, - category: "people" - }, - eyeglasses: { - keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ], - char: "\ud83d\udc53", - fitzpatrick_scale: false, - category: "people" - }, - dark_sunglasses: { - keywords: [ "face", "cool", "accessories" ], - char: "\ud83d\udd76", - fitzpatrick_scale: false, - category: "people" - }, - goggles: { - keywords: [ "eyes", "protection", "safety" ], - char: "\ud83e\udd7d", - fitzpatrick_scale: false, - category: "people" - }, - ring: { - keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ], - char: "\ud83d\udc8d", - fitzpatrick_scale: false, - category: "people" - }, - closed_umbrella: { - keywords: [ "weather", "rain", "drizzle" ], - char: "\ud83c\udf02", - fitzpatrick_scale: false, - category: "people" - }, - dog: { - keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ], - char: "\ud83d\udc36", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cat: { - keywords: [ "animal", "meow", "nature", "pet", "kitten" ], - char: "\ud83d\udc31", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - mouse: { - keywords: [ "animal", "nature", "cheese_wedge", "rodent" ], - char: "\ud83d\udc2d", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hamster: { - keywords: [ "animal", "nature" ], - char: "\ud83d\udc39", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rabbit: { - keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ], - char: "\ud83d\udc30", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - fox_face: { - keywords: [ "animal", "nature", "face" ], - char: "\ud83e\udd8a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bear: { - keywords: [ "animal", "nature", "wild" ], - char: "\ud83d\udc3b", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - panda_face: { - keywords: [ "animal", "nature", "panda" ], - char: "\ud83d\udc3c", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - koala: { - keywords: [ "animal", "nature" ], - char: "\ud83d\udc28", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tiger: { - keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ], - char: "\ud83d\udc2f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - lion: { - keywords: [ "animal", "nature" ], - char: "\ud83e\udd81", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cow: { - keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], - char: "\ud83d\udc2e", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - pig: { - keywords: [ "animal", "oink", "nature" ], - char: "\ud83d\udc37", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - pig_nose: { - keywords: [ "animal", "oink" ], - char: "\ud83d\udc3d", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - frog: { - keywords: [ "animal", "nature", "croak", "toad" ], - char: "\ud83d\udc38", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - squid: { - keywords: [ "animal", "nature", "ocean", "sea" ], - char: "\ud83e\udd91", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - octopus: { - keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ], - char: "\ud83d\udc19", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - shrimp: { - keywords: [ "animal", "ocean", "nature", "seafood" ], - char: "\ud83e\udd90", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - monkey_face: { - keywords: [ "animal", "nature", "circus" ], - char: "\ud83d\udc35", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - gorilla: { - keywords: [ "animal", "nature", "circus" ], - char: "\ud83e\udd8d", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - see_no_evil: { - keywords: [ "monkey", "animal", "nature", "haha" ], - char: "\ud83d\ude48", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hear_no_evil: { - keywords: [ "animal", "monkey", "nature" ], - char: "\ud83d\ude49", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - speak_no_evil: { - keywords: [ "monkey", "animal", "nature", "omg" ], - char: "\ud83d\ude4a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - monkey: { - keywords: [ "animal", "nature", "banana", "circus" ], - char: "\ud83d\udc12", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - chicken: { - keywords: [ "animal", "cluck", "nature", "bird" ], - char: "\ud83d\udc14", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - penguin: { - keywords: [ "animal", "nature" ], - char: "\ud83d\udc27", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bird: { - keywords: [ "animal", "nature", "fly", "tweet", "spring" ], - char: "\ud83d\udc26", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - baby_chick: { - keywords: [ "animal", "chicken", "bird" ], - char: "\ud83d\udc24", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hatching_chick: { - keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ], - char: "\ud83d\udc23", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hatched_chick: { - keywords: [ "animal", "chicken", "baby", "bird" ], - char: "\ud83d\udc25", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - duck: { - keywords: [ "animal", "nature", "bird", "mallard" ], - char: "\ud83e\udd86", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - eagle: { - keywords: [ "animal", "nature", "bird" ], - char: "\ud83e\udd85", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - owl: { - keywords: [ "animal", "nature", "bird", "hoot" ], - char: "\ud83e\udd89", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bat: { - keywords: [ "animal", "nature", "blind", "vampire" ], - char: "\ud83e\udd87", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - wolf: { - keywords: [ "animal", "nature", "wild" ], - char: "\ud83d\udc3a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - boar: { - keywords: [ "animal", "nature" ], - char: "\ud83d\udc17", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - horse: { - keywords: [ "animal", "brown", "nature" ], - char: "\ud83d\udc34", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - unicorn: { - keywords: [ "animal", "nature", "mystical" ], - char: "\ud83e\udd84", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - honeybee: { - keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ], - char: "\ud83d\udc1d", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bug: { - keywords: [ "animal", "insect", "nature", "worm" ], - char: "\ud83d\udc1b", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - butterfly: { - keywords: [ "animal", "insect", "nature", "caterpillar" ], - char: "\ud83e\udd8b", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - snail: { - keywords: [ "slow", "animal", "shell" ], - char: "\ud83d\udc0c", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - beetle: { - keywords: [ "animal", "insect", "nature", "ladybug" ], - char: "\ud83d\udc1e", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - ant: { - keywords: [ "animal", "insect", "nature", "bug" ], - char: "\ud83d\udc1c", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - grasshopper: { - keywords: [ "animal", "cricket", "chirp" ], - char: "\ud83e\udd97", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - spider: { - keywords: [ "animal", "arachnid" ], - char: "\ud83d\udd77", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - scorpion: { - keywords: [ "animal", "arachnid" ], - char: "\ud83e\udd82", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - crab: { - keywords: [ "animal", "crustacean" ], - char: "\ud83e\udd80", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - snake: { - keywords: [ "animal", "evil", "nature", "hiss", "python" ], - char: "\ud83d\udc0d", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - lizard: { - keywords: [ "animal", "nature", "reptile" ], - char: "\ud83e\udd8e", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - "t-rex": { - keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ], - char: "\ud83e\udd96", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sauropod: { - keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ], - char: "\ud83e\udd95", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - turtle: { - keywords: [ "animal", "slow", "nature", "tortoise" ], - char: "\ud83d\udc22", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tropical_fish: { - keywords: [ "animal", "swim", "ocean", "beach", "nemo" ], - char: "\ud83d\udc20", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - fish: { - keywords: [ "animal", "food", "nature" ], - char: "\ud83d\udc1f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - blowfish: { - keywords: [ "animal", "nature", "food", "sea", "ocean" ], - char: "\ud83d\udc21", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dolphin: { - keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ], - char: "\ud83d\udc2c", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - shark: { - keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ], - char: "\ud83e\udd88", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - whale: { - keywords: [ "animal", "nature", "sea", "ocean" ], - char: "\ud83d\udc33", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - whale2: { - keywords: [ "animal", "nature", "sea", "ocean" ], - char: "\ud83d\udc0b", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - crocodile: { - keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ], - char: "\ud83d\udc0a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - leopard: { - keywords: [ "animal", "nature" ], - char: "\ud83d\udc06", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - zebra: { - keywords: [ "animal", "nature", "stripes", "safari" ], - char: "\ud83e\udd93", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tiger2: { - keywords: [ "animal", "nature", "roar" ], - char: "\ud83d\udc05", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - water_buffalo: { - keywords: [ "animal", "nature", "ox", "cow" ], - char: "\ud83d\udc03", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - ox: { - keywords: [ "animal", "cow", "beef" ], - char: "\ud83d\udc02", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cow2: { - keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], - char: "\ud83d\udc04", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - deer: { - keywords: [ "animal", "nature", "horns", "venison" ], - char: "\ud83e\udd8c", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dromedary_camel: { - keywords: [ "animal", "hot", "desert", "hump" ], - char: "\ud83d\udc2a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - camel: { - keywords: [ "animal", "nature", "hot", "desert", "hump" ], - char: "\ud83d\udc2b", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - giraffe: { - keywords: [ "animal", "nature", "spots", "safari" ], - char: "\ud83e\udd92", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - elephant: { - keywords: [ "animal", "nature", "nose", "th", "circus" ], - char: "\ud83d\udc18", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rhinoceros: { - keywords: [ "animal", "nature", "horn" ], - char: "\ud83e\udd8f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - goat: { - keywords: [ "animal", "nature" ], - char: "\ud83d\udc10", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - ram: { - keywords: [ "animal", "sheep", "nature" ], - char: "\ud83d\udc0f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sheep: { - keywords: [ "animal", "nature", "wool", "shipit" ], - char: "\ud83d\udc11", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - racehorse: { - keywords: [ "animal", "gamble", "luck" ], - char: "\ud83d\udc0e", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - pig2: { - keywords: [ "animal", "nature" ], - char: "\ud83d\udc16", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rat: { - keywords: [ "animal", "mouse", "rodent" ], - char: "\ud83d\udc00", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - mouse2: { - keywords: [ "animal", "nature", "rodent" ], - char: "\ud83d\udc01", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rooster: { - keywords: [ "animal", "nature", "chicken" ], - char: "\ud83d\udc13", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - turkey: { - keywords: [ "animal", "bird" ], - char: "\ud83e\udd83", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dove: { - keywords: [ "animal", "bird" ], - char: "\ud83d\udd4a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dog2: { - keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ], - char: "\ud83d\udc15", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - poodle: { - keywords: [ "dog", "animal", "101", "nature", "pet" ], - char: "\ud83d\udc29", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cat2: { - keywords: [ "animal", "meow", "pet", "cats" ], - char: "\ud83d\udc08", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rabbit2: { - keywords: [ "animal", "nature", "pet", "magic", "spring" ], - char: "\ud83d\udc07", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - chipmunk: { - keywords: [ "animal", "nature", "rodent", "squirrel" ], - char: "\ud83d\udc3f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hedgehog: { - keywords: [ "animal", "nature", "spiny" ], - char: "\ud83e\udd94", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - raccoon: { - keywords: [ "animal", "nature" ], - char: "\ud83e\udd9d", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - llama: { - keywords: [ "animal", "nature", "alpaca" ], - char: "\ud83e\udd99", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hippopotamus: { - keywords: [ "animal", "nature" ], - char: "\ud83e\udd9b", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - kangaroo: { - keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ], - char: "\ud83e\udd98", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - badger: { - keywords: [ "animal", "nature", "honey" ], - char: "\ud83e\udda1", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - swan: { - keywords: [ "animal", "nature", "bird" ], - char: "\ud83e\udda2", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - peacock: { - keywords: [ "animal", "nature", "peahen", "bird" ], - char: "\ud83e\udd9a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - parrot: { - keywords: [ "animal", "nature", "bird", "pirate", "talk" ], - char: "\ud83e\udd9c", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - lobster: { - keywords: [ "animal", "nature", "bisque", "claws", "seafood" ], - char: "\ud83e\udd9e", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - mosquito: { - keywords: [ "animal", "nature", "insect", "malaria" ], - char: "\ud83e\udd9f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - paw_prints: { - keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ], - char: "\ud83d\udc3e", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dragon: { - keywords: [ "animal", "myth", "nature", "chinese", "green" ], - char: "\ud83d\udc09", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dragon_face: { - keywords: [ "animal", "myth", "nature", "chinese", "green" ], - char: "\ud83d\udc32", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cactus: { - keywords: [ "vegetable", "plant", "nature" ], - char: "\ud83c\udf35", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - christmas_tree: { - keywords: [ "festival", "vacation", "december", "xmas", "celebration" ], - char: "\ud83c\udf84", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - evergreen_tree: { - keywords: [ "plant", "nature" ], - char: "\ud83c\udf32", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - deciduous_tree: { - keywords: [ "plant", "nature" ], - char: "\ud83c\udf33", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - palm_tree: { - keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ], - char: "\ud83c\udf34", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - seedling: { - keywords: [ "plant", "nature", "grass", "lawn", "spring" ], - char: "\ud83c\udf31", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - herb: { - keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ], - char: "\ud83c\udf3f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - shamrock: { - keywords: [ "vegetable", "plant", "nature", "irish", "clover" ], - char: "\u2618", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - four_leaf_clover: { - keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ], - char: "\ud83c\udf40", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bamboo: { - keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ], - char: "\ud83c\udf8d", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tanabata_tree: { - keywords: [ "plant", "nature", "branch", "summer" ], - char: "\ud83c\udf8b", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - leaves: { - keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ], - char: "\ud83c\udf43", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - fallen_leaf: { - keywords: [ "nature", "plant", "vegetable", "leaves" ], - char: "\ud83c\udf42", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - maple_leaf: { - keywords: [ "nature", "plant", "vegetable", "ca", "fall" ], - char: "\ud83c\udf41", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - ear_of_rice: { - keywords: [ "nature", "plant" ], - char: "\ud83c\udf3e", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - hibiscus: { - keywords: [ "plant", "vegetable", "flowers", "beach" ], - char: "\ud83c\udf3a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sunflower: { - keywords: [ "nature", "plant", "fall" ], - char: "\ud83c\udf3b", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - rose: { - keywords: [ "flowers", "valentines", "love", "spring" ], - char: "\ud83c\udf39", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - wilted_flower: { - keywords: [ "plant", "nature", "flower" ], - char: "\ud83e\udd40", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tulip: { - keywords: [ "flowers", "plant", "nature", "summer", "spring" ], - char: "\ud83c\udf37", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - blossom: { - keywords: [ "nature", "flowers", "yellow" ], - char: "\ud83c\udf3c", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cherry_blossom: { - keywords: [ "nature", "plant", "spring", "flower" ], - char: "\ud83c\udf38", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - bouquet: { - keywords: [ "flowers", "nature", "spring" ], - char: "\ud83d\udc90", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - mushroom: { - keywords: [ "plant", "vegetable" ], - char: "\ud83c\udf44", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - chestnut: { - keywords: [ "food", "squirrel" ], - char: "\ud83c\udf30", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - jack_o_lantern: { - keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ], - char: "\ud83c\udf83", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - shell: { - keywords: [ "nature", "sea", "beach" ], - char: "\ud83d\udc1a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - spider_web: { - keywords: [ "animal", "insect", "arachnid", "silk" ], - char: "\ud83d\udd78", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - earth_americas: { - keywords: [ "globe", "world", "USA", "international" ], - char: "\ud83c\udf0e", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - earth_africa: { - keywords: [ "globe", "world", "international" ], - char: "\ud83c\udf0d", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - earth_asia: { - keywords: [ "globe", "world", "east", "international" ], - char: "\ud83c\udf0f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - full_moon: { - keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: "\ud83c\udf15", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - waning_gibbous_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ], - char: "\ud83c\udf16", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - last_quarter_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: "\ud83c\udf17", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - waning_crescent_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: "\ud83c\udf18", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - new_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: "\ud83c\udf11", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - waxing_crescent_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: "\ud83c\udf12", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - first_quarter_moon: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: "\ud83c\udf13", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - waxing_gibbous_moon: { - keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ], - char: "\ud83c\udf14", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - new_moon_with_face: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: "\ud83c\udf1a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - full_moon_with_face: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: "\ud83c\udf1d", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - first_quarter_moon_with_face: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: "\ud83c\udf1b", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - last_quarter_moon_with_face: { - keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], - char: "\ud83c\udf1c", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sun_with_face: { - keywords: [ "nature", "morning", "sky" ], - char: "\ud83c\udf1e", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - crescent_moon: { - keywords: [ "night", "sleep", "sky", "evening", "magic" ], - char: "\ud83c\udf19", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - star: { - keywords: [ "night", "yellow" ], - char: "\u2b50", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - star2: { - keywords: [ "night", "sparkle", "awesome", "good", "magic" ], - char: "\ud83c\udf1f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dizzy: { - keywords: [ "star", "sparkle", "shoot", "magic" ], - char: "\ud83d\udcab", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sparkles: { - keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ], - char: "\u2728", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - comet: { - keywords: [ "space" ], - char: "\u2604", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sunny: { - keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ], - char: "\u2600\ufe0f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sun_behind_small_cloud: { - keywords: [ "weather" ], - char: "\ud83c\udf24", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - partly_sunny: { - keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ], - char: "\u26c5", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sun_behind_large_cloud: { - keywords: [ "weather" ], - char: "\ud83c\udf25", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sun_behind_rain_cloud: { - keywords: [ "weather" ], - char: "\ud83c\udf26", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cloud: { - keywords: [ "weather", "sky" ], - char: "\u2601\ufe0f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cloud_with_rain: { - keywords: [ "weather" ], - char: "\ud83c\udf27", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cloud_with_lightning_and_rain: { - keywords: [ "weather", "lightning" ], - char: "\u26c8", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cloud_with_lightning: { - keywords: [ "weather", "thunder" ], - char: "\ud83c\udf29", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - zap: { - keywords: [ "thunder", "weather", "lightning bolt", "fast" ], - char: "\u26a1", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - fire: { - keywords: [ "hot", "cook", "flame" ], - char: "\ud83d\udd25", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - boom: { - keywords: [ "bomb", "explode", "explosion", "collision", "blown" ], - char: "\ud83d\udca5", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - snowflake: { - keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ], - char: "\u2744\ufe0f", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - cloud_with_snow: { - keywords: [ "weather" ], - char: "\ud83c\udf28", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - snowman: { - keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ], - char: "\u26c4", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - snowman_with_snow: { - keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ], - char: "\u2603", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - wind_face: { - keywords: [ "gust", "air" ], - char: "\ud83c\udf2c", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - dash: { - keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ], - char: "\ud83d\udca8", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - tornado: { - keywords: [ "weather", "cyclone", "twister" ], - char: "\ud83c\udf2a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - fog: { - keywords: [ "weather" ], - char: "\ud83c\udf2b", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - open_umbrella: { - keywords: [ "weather", "spring" ], - char: "\u2602", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - umbrella: { - keywords: [ "rainy", "weather", "spring" ], - char: "\u2614", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - droplet: { - keywords: [ "water", "drip", "faucet", "spring" ], - char: "\ud83d\udca7", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - sweat_drops: { - keywords: [ "water", "drip", "oops" ], - char: "\ud83d\udca6", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - ocean: { - keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ], - char: "\ud83c\udf0a", - fitzpatrick_scale: false, - category: "animals_and_nature" - }, - green_apple: { - keywords: [ "fruit", "nature" ], - char: "\ud83c\udf4f", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - apple: { - keywords: [ "fruit", "mac", "school" ], - char: "\ud83c\udf4e", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pear: { - keywords: [ "fruit", "nature", "food" ], - char: "\ud83c\udf50", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - tangerine: { - keywords: [ "food", "fruit", "nature", "orange" ], - char: "\ud83c\udf4a", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - lemon: { - keywords: [ "fruit", "nature" ], - char: "\ud83c\udf4b", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - banana: { - keywords: [ "fruit", "food", "monkey" ], - char: "\ud83c\udf4c", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - watermelon: { - keywords: [ "fruit", "food", "picnic", "summer" ], - char: "\ud83c\udf49", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - grapes: { - keywords: [ "fruit", "food", "wine" ], - char: "\ud83c\udf47", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - strawberry: { - keywords: [ "fruit", "food", "nature" ], - char: "\ud83c\udf53", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - melon: { - keywords: [ "fruit", "nature", "food" ], - char: "\ud83c\udf48", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cherries: { - keywords: [ "food", "fruit" ], - char: "\ud83c\udf52", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - peach: { - keywords: [ "fruit", "nature", "food" ], - char: "\ud83c\udf51", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pineapple: { - keywords: [ "fruit", "nature", "food" ], - char: "\ud83c\udf4d", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - coconut: { - keywords: [ "fruit", "nature", "food", "palm" ], - char: "\ud83e\udd65", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - kiwi_fruit: { - keywords: [ "fruit", "food" ], - char: "\ud83e\udd5d", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - mango: { - keywords: [ "fruit", "food", "tropical" ], - char: "\ud83e\udd6d", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - avocado: { - keywords: [ "fruit", "food" ], - char: "\ud83e\udd51", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - broccoli: { - keywords: [ "fruit", "food", "vegetable" ], - char: "\ud83e\udd66", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - tomato: { - keywords: [ "fruit", "vegetable", "nature", "food" ], - char: "\ud83c\udf45", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - eggplant: { - keywords: [ "vegetable", "nature", "food", "aubergine" ], - char: "\ud83c\udf46", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cucumber: { - keywords: [ "fruit", "food", "pickle" ], - char: "\ud83e\udd52", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - carrot: { - keywords: [ "vegetable", "food", "orange" ], - char: "\ud83e\udd55", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - hot_pepper: { - keywords: [ "food", "spicy", "chilli", "chili" ], - char: "\ud83c\udf36", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - potato: { - keywords: [ "food", "tuber", "vegatable", "starch" ], - char: "\ud83e\udd54", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - corn: { - keywords: [ "food", "vegetable", "plant" ], - char: "\ud83c\udf3d", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - leafy_greens: { - keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ], - char: "\ud83e\udd6c", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - sweet_potato: { - keywords: [ "food", "nature" ], - char: "\ud83c\udf60", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - peanuts: { - keywords: [ "food", "nut" ], - char: "\ud83e\udd5c", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - honey_pot: { - keywords: [ "bees", "sweet", "kitchen" ], - char: "\ud83c\udf6f", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - croissant: { - keywords: [ "food", "bread", "french" ], - char: "\ud83e\udd50", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bread: { - keywords: [ "food", "wheat", "breakfast", "toast" ], - char: "\ud83c\udf5e", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - baguette_bread: { - keywords: [ "food", "bread", "french" ], - char: "\ud83e\udd56", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bagel: { - keywords: [ "food", "bread", "bakery", "schmear" ], - char: "\ud83e\udd6f", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pretzel: { - keywords: [ "food", "bread", "twisted" ], - char: "\ud83e\udd68", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cheese: { - keywords: [ "food", "chadder" ], - char: "\ud83e\uddc0", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - egg: { - keywords: [ "food", "chicken", "breakfast" ], - char: "\ud83e\udd5a", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bacon: { - keywords: [ "food", "breakfast", "pork", "pig", "meat" ], - char: "\ud83e\udd53", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - steak: { - keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ], - char: "\ud83e\udd69", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pancakes: { - keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ], - char: "\ud83e\udd5e", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - poultry_leg: { - keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ], - char: "\ud83c\udf57", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - meat_on_bone: { - keywords: [ "good", "food", "drumstick" ], - char: "\ud83c\udf56", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bone: { - keywords: [ "skeleton" ], - char: "\ud83e\uddb4", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fried_shrimp: { - keywords: [ "food", "animal", "appetizer", "summer" ], - char: "\ud83c\udf64", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fried_egg: { - keywords: [ "food", "breakfast", "kitchen", "egg" ], - char: "\ud83c\udf73", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - hamburger: { - keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ], - char: "\ud83c\udf54", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fries: { - keywords: [ "chips", "snack", "fast food" ], - char: "\ud83c\udf5f", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - stuffed_flatbread: { - keywords: [ "food", "flatbread", "stuffed", "gyro" ], - char: "\ud83e\udd59", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - hotdog: { - keywords: [ "food", "frankfurter" ], - char: "\ud83c\udf2d", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pizza: { - keywords: [ "food", "party" ], - char: "\ud83c\udf55", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - sandwich: { - keywords: [ "food", "lunch", "bread" ], - char: "\ud83e\udd6a", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - canned_food: { - keywords: [ "food", "soup" ], - char: "\ud83e\udd6b", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - spaghetti: { - keywords: [ "food", "italian", "noodle" ], - char: "\ud83c\udf5d", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - taco: { - keywords: [ "food", "mexican" ], - char: "\ud83c\udf2e", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - burrito: { - keywords: [ "food", "mexican" ], - char: "\ud83c\udf2f", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - green_salad: { - keywords: [ "food", "healthy", "lettuce" ], - char: "\ud83e\udd57", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - shallow_pan_of_food: { - keywords: [ "food", "cooking", "casserole", "paella" ], - char: "\ud83e\udd58", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - ramen: { - keywords: [ "food", "japanese", "noodle", "chopsticks" ], - char: "\ud83c\udf5c", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - stew: { - keywords: [ "food", "meat", "soup" ], - char: "\ud83c\udf72", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fish_cake: { - keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ], - char: "\ud83c\udf65", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fortune_cookie: { - keywords: [ "food", "prophecy" ], - char: "\ud83e\udd60", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - sushi: { - keywords: [ "food", "fish", "japanese", "rice" ], - char: "\ud83c\udf63", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bento: { - keywords: [ "food", "japanese", "box" ], - char: "\ud83c\udf71", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - curry: { - keywords: [ "food", "spicy", "hot", "indian" ], - char: "\ud83c\udf5b", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - rice_ball: { - keywords: [ "food", "japanese" ], - char: "\ud83c\udf59", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - rice: { - keywords: [ "food", "china", "asian" ], - char: "\ud83c\udf5a", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - rice_cracker: { - keywords: [ "food", "japanese" ], - char: "\ud83c\udf58", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - oden: { - keywords: [ "food", "japanese" ], - char: "\ud83c\udf62", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - dango: { - keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ], - char: "\ud83c\udf61", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - shaved_ice: { - keywords: [ "hot", "dessert", "summer" ], - char: "\ud83c\udf67", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - ice_cream: { - keywords: [ "food", "hot", "dessert" ], - char: "\ud83c\udf68", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - icecream: { - keywords: [ "food", "hot", "dessert", "summer" ], - char: "\ud83c\udf66", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - pie: { - keywords: [ "food", "dessert", "pastry" ], - char: "\ud83e\udd67", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cake: { - keywords: [ "food", "dessert" ], - char: "\ud83c\udf70", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cupcake: { - keywords: [ "food", "dessert", "bakery", "sweet" ], - char: "\ud83e\uddc1", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - moon_cake: { - keywords: [ "food", "autumn" ], - char: "\ud83e\udd6e", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - birthday: { - keywords: [ "food", "dessert", "cake" ], - char: "\ud83c\udf82", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - custard: { - keywords: [ "dessert", "food" ], - char: "\ud83c\udf6e", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - candy: { - keywords: [ "snack", "dessert", "sweet", "lolly" ], - char: "\ud83c\udf6c", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - lollipop: { - keywords: [ "food", "snack", "candy", "sweet" ], - char: "\ud83c\udf6d", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - chocolate_bar: { - keywords: [ "food", "snack", "dessert", "sweet" ], - char: "\ud83c\udf6b", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - popcorn: { - keywords: [ "food", "movie theater", "films", "snack" ], - char: "\ud83c\udf7f", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - dumpling: { - keywords: [ "food", "empanada", "pierogi", "potsticker" ], - char: "\ud83e\udd5f", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - doughnut: { - keywords: [ "food", "dessert", "snack", "sweet", "donut" ], - char: "\ud83c\udf69", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cookie: { - keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ], - char: "\ud83c\udf6a", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - milk_glass: { - keywords: [ "beverage", "drink", "cow" ], - char: "\ud83e\udd5b", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - beer: { - keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], - char: "\ud83c\udf7a", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - beers: { - keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], - char: "\ud83c\udf7b", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - clinking_glasses: { - keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ], - char: "\ud83e\udd42", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - wine_glass: { - keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ], - char: "\ud83c\udf77", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - tumbler_glass: { - keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ], - char: "\ud83e\udd43", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cocktail: { - keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ], - char: "\ud83c\udf78", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - tropical_drink: { - keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ], - char: "\ud83c\udf79", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - champagne: { - keywords: [ "drink", "wine", "bottle", "celebration" ], - char: "\ud83c\udf7e", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - sake: { - keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ], - char: "\ud83c\udf76", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - tea: { - keywords: [ "drink", "bowl", "breakfast", "green", "british" ], - char: "\ud83c\udf75", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - cup_with_straw: { - keywords: [ "drink", "soda" ], - char: "\ud83e\udd64", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - coffee: { - keywords: [ "beverage", "caffeine", "latte", "espresso" ], - char: "\u2615", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - baby_bottle: { - keywords: [ "food", "container", "milk" ], - char: "\ud83c\udf7c", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - salt: { - keywords: [ "condiment", "shaker" ], - char: "\ud83e\uddc2", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - spoon: { - keywords: [ "cutlery", "kitchen", "tableware" ], - char: "\ud83e\udd44", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - fork_and_knife: { - keywords: [ "cutlery", "kitchen" ], - char: "\ud83c\udf74", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - plate_with_cutlery: { - keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ], - char: "\ud83c\udf7d", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - bowl_with_spoon: { - keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ], - char: "\ud83e\udd63", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - takeout_box: { - keywords: [ "food", "leftovers" ], - char: "\ud83e\udd61", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - chopsticks: { - keywords: [ "food" ], - char: "\ud83e\udd62", - fitzpatrick_scale: false, - category: "food_and_drink" - }, - soccer: { - keywords: [ "sports", "football" ], - char: "\u26bd", - fitzpatrick_scale: false, - category: "activity" - }, - basketball: { - keywords: [ "sports", "balls", "NBA" ], - char: "\ud83c\udfc0", - fitzpatrick_scale: false, - category: "activity" - }, - football: { - keywords: [ "sports", "balls", "NFL" ], - char: "\ud83c\udfc8", - fitzpatrick_scale: false, - category: "activity" - }, - baseball: { - keywords: [ "sports", "balls" ], - char: "\u26be", - fitzpatrick_scale: false, - category: "activity" - }, - softball: { - keywords: [ "sports", "balls" ], - char: "\ud83e\udd4e", - fitzpatrick_scale: false, - category: "activity" - }, - tennis: { - keywords: [ "sports", "balls", "green" ], - char: "\ud83c\udfbe", - fitzpatrick_scale: false, - category: "activity" - }, - volleyball: { - keywords: [ "sports", "balls" ], - char: "\ud83c\udfd0", - fitzpatrick_scale: false, - category: "activity" - }, - rugby_football: { - keywords: [ "sports", "team" ], - char: "\ud83c\udfc9", - fitzpatrick_scale: false, - category: "activity" - }, - flying_disc: { - keywords: [ "sports", "frisbee", "ultimate" ], - char: "\ud83e\udd4f", - fitzpatrick_scale: false, - category: "activity" - }, - "8ball": { - keywords: [ "pool", "hobby", "game", "luck", "magic" ], - char: "\ud83c\udfb1", - fitzpatrick_scale: false, - category: "activity" - }, - golf: { - keywords: [ "sports", "business", "flag", "hole", "summer" ], - char: "\u26f3", - fitzpatrick_scale: false, - category: "activity" - }, - golfing_woman: { - keywords: [ "sports", "business", "woman", "female" ], - char: "\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f", - fitzpatrick_scale: false, - category: "activity" - }, - golfing_man: { - keywords: [ "sports", "business" ], - char: "\ud83c\udfcc", - fitzpatrick_scale: true, - category: "activity" - }, - ping_pong: { - keywords: [ "sports", "pingpong" ], - char: "\ud83c\udfd3", - fitzpatrick_scale: false, - category: "activity" - }, - badminton: { - keywords: [ "sports" ], - char: "\ud83c\udff8", - fitzpatrick_scale: false, - category: "activity" - }, - goal_net: { - keywords: [ "sports" ], - char: "\ud83e\udd45", - fitzpatrick_scale: false, - category: "activity" - }, - ice_hockey: { - keywords: [ "sports" ], - char: "\ud83c\udfd2", - fitzpatrick_scale: false, - category: "activity" - }, - field_hockey: { - keywords: [ "sports" ], - char: "\ud83c\udfd1", - fitzpatrick_scale: false, - category: "activity" - }, - lacrosse: { - keywords: [ "sports", "ball", "stick" ], - char: "\ud83e\udd4d", - fitzpatrick_scale: false, - category: "activity" - }, - cricket: { - keywords: [ "sports" ], - char: "\ud83c\udfcf", - fitzpatrick_scale: false, - category: "activity" - }, - ski: { - keywords: [ "sports", "winter", "cold", "snow" ], - char: "\ud83c\udfbf", - fitzpatrick_scale: false, - category: "activity" - }, - skier: { - keywords: [ "sports", "winter", "snow" ], - char: "\u26f7", - fitzpatrick_scale: false, - category: "activity" - }, - snowboarder: { - keywords: [ "sports", "winter" ], - char: "\ud83c\udfc2", - fitzpatrick_scale: true, - category: "activity" - }, - person_fencing: { - keywords: [ "sports", "fencing", "sword" ], - char: "\ud83e\udd3a", - fitzpatrick_scale: false, - category: "activity" - }, - women_wrestling: { - keywords: [ "sports", "wrestlers" ], - char: "\ud83e\udd3c\u200d\u2640\ufe0f", - fitzpatrick_scale: false, - category: "activity" - }, - men_wrestling: { - keywords: [ "sports", "wrestlers" ], - char: "\ud83e\udd3c\u200d\u2642\ufe0f", - fitzpatrick_scale: false, - category: "activity" - }, - woman_cartwheeling: { - keywords: [ "gymnastics" ], - char: "\ud83e\udd38\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - man_cartwheeling: { - keywords: [ "gymnastics" ], - char: "\ud83e\udd38\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - woman_playing_handball: { - keywords: [ "sports" ], - char: "\ud83e\udd3e\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - man_playing_handball: { - keywords: [ "sports" ], - char: "\ud83e\udd3e\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - ice_skate: { - keywords: [ "sports" ], - char: "\u26f8", - fitzpatrick_scale: false, - category: "activity" - }, - curling_stone: { - keywords: [ "sports" ], - char: "\ud83e\udd4c", - fitzpatrick_scale: false, - category: "activity" - }, - skateboard: { - keywords: [ "board" ], - char: "\ud83d\udef9", - fitzpatrick_scale: false, - category: "activity" - }, - sled: { - keywords: [ "sleigh", "luge", "toboggan" ], - char: "\ud83d\udef7", - fitzpatrick_scale: false, - category: "activity" - }, - bow_and_arrow: { - keywords: [ "sports" ], - char: "\ud83c\udff9", - fitzpatrick_scale: false, - category: "activity" - }, - fishing_pole_and_fish: { - keywords: [ "food", "hobby", "summer" ], - char: "\ud83c\udfa3", - fitzpatrick_scale: false, - category: "activity" - }, - boxing_glove: { - keywords: [ "sports", "fighting" ], - char: "\ud83e\udd4a", - fitzpatrick_scale: false, - category: "activity" - }, - martial_arts_uniform: { - keywords: [ "judo", "karate", "taekwondo" ], - char: "\ud83e\udd4b", - fitzpatrick_scale: false, - category: "activity" - }, - rowing_woman: { - keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ], - char: "\ud83d\udea3\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - rowing_man: { - keywords: [ "sports", "hobby", "water", "ship" ], - char: "\ud83d\udea3", - fitzpatrick_scale: true, - category: "activity" - }, - climbing_woman: { - keywords: [ "sports", "hobby", "woman", "female", "rock" ], - char: "\ud83e\uddd7\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - climbing_man: { - keywords: [ "sports", "hobby", "man", "male", "rock" ], - char: "\ud83e\uddd7\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - swimming_woman: { - keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ], - char: "\ud83c\udfca\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - swimming_man: { - keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ], - char: "\ud83c\udfca", - fitzpatrick_scale: true, - category: "activity" - }, - woman_playing_water_polo: { - keywords: [ "sports", "pool" ], - char: "\ud83e\udd3d\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - man_playing_water_polo: { - keywords: [ "sports", "pool" ], - char: "\ud83e\udd3d\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - woman_in_lotus_position: { - keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ], - char: "\ud83e\uddd8\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - man_in_lotus_position: { - keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ], - char: "\ud83e\uddd8\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - surfing_woman: { - keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ], - char: "\ud83c\udfc4\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - surfing_man: { - keywords: [ "sports", "ocean", "sea", "summer", "beach" ], - char: "\ud83c\udfc4", - fitzpatrick_scale: true, - category: "activity" - }, - bath: { - keywords: [ "clean", "shower", "bathroom" ], - char: "\ud83d\udec0", - fitzpatrick_scale: true, - category: "activity" - }, - basketball_woman: { - keywords: [ "sports", "human", "woman", "female" ], - char: "\u26f9\ufe0f\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - basketball_man: { - keywords: [ "sports", "human" ], - char: "\u26f9", - fitzpatrick_scale: true, - category: "activity" - }, - weight_lifting_woman: { - keywords: [ "sports", "training", "exercise", "woman", "female" ], - char: "\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - weight_lifting_man: { - keywords: [ "sports", "training", "exercise" ], - char: "\ud83c\udfcb", - fitzpatrick_scale: true, - category: "activity" - }, - biking_woman: { - keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ], - char: "\ud83d\udeb4\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - biking_man: { - keywords: [ "sports", "bike", "exercise", "hipster" ], - char: "\ud83d\udeb4", - fitzpatrick_scale: true, - category: "activity" - }, - mountain_biking_woman: { - keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ], - char: "\ud83d\udeb5\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - mountain_biking_man: { - keywords: [ "transportation", "sports", "human", "race", "bike" ], - char: "\ud83d\udeb5", - fitzpatrick_scale: true, - category: "activity" - }, - horse_racing: { - keywords: [ "animal", "betting", "competition", "gambling", "luck" ], - char: "\ud83c\udfc7", - fitzpatrick_scale: true, - category: "activity" - }, - business_suit_levitating: { - keywords: [ "suit", "business", "levitate", "hover", "jump" ], - char: "\ud83d\udd74", - fitzpatrick_scale: true, - category: "activity" - }, - trophy: { - keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ], - char: "\ud83c\udfc6", - fitzpatrick_scale: false, - category: "activity" - }, - running_shirt_with_sash: { - keywords: [ "play", "pageant" ], - char: "\ud83c\udfbd", - fitzpatrick_scale: false, - category: "activity" - }, - medal_sports: { - keywords: [ "award", "winning" ], - char: "\ud83c\udfc5", - fitzpatrick_scale: false, - category: "activity" - }, - medal_military: { - keywords: [ "award", "winning", "army" ], - char: "\ud83c\udf96", - fitzpatrick_scale: false, - category: "activity" - }, - "1st_place_medal": { - keywords: [ "award", "winning", "first" ], - char: "\ud83e\udd47", - fitzpatrick_scale: false, - category: "activity" - }, - "2nd_place_medal": { - keywords: [ "award", "second" ], - char: "\ud83e\udd48", - fitzpatrick_scale: false, - category: "activity" - }, - "3rd_place_medal": { - keywords: [ "award", "third" ], - char: "\ud83e\udd49", - fitzpatrick_scale: false, - category: "activity" - }, - reminder_ribbon: { - keywords: [ "sports", "cause", "support", "awareness" ], - char: "\ud83c\udf97", - fitzpatrick_scale: false, - category: "activity" - }, - rosette: { - keywords: [ "flower", "decoration", "military" ], - char: "\ud83c\udff5", - fitzpatrick_scale: false, - category: "activity" - }, - ticket: { - keywords: [ "event", "concert", "pass" ], - char: "\ud83c\udfab", - fitzpatrick_scale: false, - category: "activity" - }, - tickets: { - keywords: [ "sports", "concert", "entrance" ], - char: "\ud83c\udf9f", - fitzpatrick_scale: false, - category: "activity" - }, - performing_arts: { - keywords: [ "acting", "theater", "drama" ], - char: "\ud83c\udfad", - fitzpatrick_scale: false, - category: "activity" - }, - art: { - keywords: [ "design", "paint", "draw", "colors" ], - char: "\ud83c\udfa8", - fitzpatrick_scale: false, - category: "activity" - }, - circus_tent: { - keywords: [ "festival", "carnival", "party" ], - char: "\ud83c\udfaa", - fitzpatrick_scale: false, - category: "activity" - }, - woman_juggling: { - keywords: [ "juggle", "balance", "skill", "multitask" ], - char: "\ud83e\udd39\u200d\u2640\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - man_juggling: { - keywords: [ "juggle", "balance", "skill", "multitask" ], - char: "\ud83e\udd39\u200d\u2642\ufe0f", - fitzpatrick_scale: true, - category: "activity" - }, - microphone: { - keywords: [ "sound", "music", "PA", "sing", "talkshow" ], - char: "\ud83c\udfa4", - fitzpatrick_scale: false, - category: "activity" - }, - headphones: { - keywords: [ "music", "score", "gadgets" ], - char: "\ud83c\udfa7", - fitzpatrick_scale: false, - category: "activity" - }, - musical_score: { - keywords: [ "treble", "clef", "compose" ], - char: "\ud83c\udfbc", - fitzpatrick_scale: false, - category: "activity" - }, - musical_keyboard: { - keywords: [ "piano", "instrument", "compose" ], - char: "\ud83c\udfb9", - fitzpatrick_scale: false, - category: "activity" - }, - drum: { - keywords: [ "music", "instrument", "drumsticks", "snare" ], - char: "\ud83e\udd41", - fitzpatrick_scale: false, - category: "activity" - }, - saxophone: { - keywords: [ "music", "instrument", "jazz", "blues" ], - char: "\ud83c\udfb7", - fitzpatrick_scale: false, - category: "activity" - }, - trumpet: { - keywords: [ "music", "brass" ], - char: "\ud83c\udfba", - fitzpatrick_scale: false, - category: "activity" - }, - guitar: { - keywords: [ "music", "instrument" ], - char: "\ud83c\udfb8", - fitzpatrick_scale: false, - category: "activity" - }, - violin: { - keywords: [ "music", "instrument", "orchestra", "symphony" ], - char: "\ud83c\udfbb", - fitzpatrick_scale: false, - category: "activity" - }, - clapper: { - keywords: [ "movie", "film", "record" ], - char: "\ud83c\udfac", - fitzpatrick_scale: false, - category: "activity" - }, - video_game: { - keywords: [ "play", "console", "PS4", "controller" ], - char: "\ud83c\udfae", - fitzpatrick_scale: false, - category: "activity" - }, - space_invader: { - keywords: [ "game", "arcade", "play" ], - char: "\ud83d\udc7e", - fitzpatrick_scale: false, - category: "activity" - }, - dart: { - keywords: [ "game", "play", "bar", "target", "bullseye" ], - char: "\ud83c\udfaf", - fitzpatrick_scale: false, - category: "activity" - }, - game_die: { - keywords: [ "dice", "random", "tabletop", "play", "luck" ], - char: "\ud83c\udfb2", - fitzpatrick_scale: false, - category: "activity" - }, - chess_pawn: { - keywords: [ "expendable" ], - char: "\u265f", - fitzpatrick_scale: false, - category: "activity" - }, - slot_machine: { - keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ], - char: "\ud83c\udfb0", - fitzpatrick_scale: false, - category: "activity" - }, - jigsaw: { - keywords: [ "interlocking", "puzzle", "piece" ], - char: "\ud83e\udde9", - fitzpatrick_scale: false, - category: "activity" - }, - bowling: { - keywords: [ "sports", "fun", "play" ], - char: "\ud83c\udfb3", - fitzpatrick_scale: false, - category: "activity" - }, - red_car: { - keywords: [ "red", "transportation", "vehicle" ], - char: "\ud83d\ude97", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - taxi: { - keywords: [ "uber", "vehicle", "cars", "transportation" ], - char: "\ud83d\ude95", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - blue_car: { - keywords: [ "transportation", "vehicle" ], - char: "\ud83d\ude99", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bus: { - keywords: [ "car", "vehicle", "transportation" ], - char: "\ud83d\ude8c", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - trolleybus: { - keywords: [ "bart", "transportation", "vehicle" ], - char: "\ud83d\ude8e", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - racing_car: { - keywords: [ "sports", "race", "fast", "formula", "f1" ], - char: "\ud83c\udfce", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - police_car: { - keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ], - char: "\ud83d\ude93", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - ambulance: { - keywords: [ "health", "911", "hospital" ], - char: "\ud83d\ude91", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - fire_engine: { - keywords: [ "transportation", "cars", "vehicle" ], - char: "\ud83d\ude92", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - minibus: { - keywords: [ "vehicle", "car", "transportation" ], - char: "\ud83d\ude90", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - truck: { - keywords: [ "cars", "transportation" ], - char: "\ud83d\ude9a", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - articulated_lorry: { - keywords: [ "vehicle", "cars", "transportation", "express" ], - char: "\ud83d\ude9b", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - tractor: { - keywords: [ "vehicle", "car", "farming", "agriculture" ], - char: "\ud83d\ude9c", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - kick_scooter: { - keywords: [ "vehicle", "kick", "razor" ], - char: "\ud83d\udef4", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - motorcycle: { - keywords: [ "race", "sports", "fast" ], - char: "\ud83c\udfcd", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bike: { - keywords: [ "sports", "bicycle", "exercise", "hipster" ], - char: "\ud83d\udeb2", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - motor_scooter: { - keywords: [ "vehicle", "vespa", "sasha" ], - char: "\ud83d\udef5", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - rotating_light: { - keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ], - char: "\ud83d\udea8", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - oncoming_police_car: { - keywords: [ "vehicle", "law", "legal", "enforcement", "911" ], - char: "\ud83d\ude94", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - oncoming_bus: { - keywords: [ "vehicle", "transportation" ], - char: "\ud83d\ude8d", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - oncoming_automobile: { - keywords: [ "car", "vehicle", "transportation" ], - char: "\ud83d\ude98", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - oncoming_taxi: { - keywords: [ "vehicle", "cars", "uber" ], - char: "\ud83d\ude96", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - aerial_tramway: { - keywords: [ "transportation", "vehicle", "ski" ], - char: "\ud83d\udea1", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mountain_cableway: { - keywords: [ "transportation", "vehicle", "ski" ], - char: "\ud83d\udea0", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - suspension_railway: { - keywords: [ "vehicle", "transportation" ], - char: "\ud83d\ude9f", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - railway_car: { - keywords: [ "transportation", "vehicle" ], - char: "\ud83d\ude83", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - train: { - keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ], - char: "\ud83d\ude8b", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - monorail: { - keywords: [ "transportation", "vehicle" ], - char: "\ud83d\ude9d", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bullettrain_side: { - keywords: [ "transportation", "vehicle" ], - char: "\ud83d\ude84", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bullettrain_front: { - keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ], - char: "\ud83d\ude85", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - light_rail: { - keywords: [ "transportation", "vehicle" ], - char: "\ud83d\ude88", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mountain_railway: { - keywords: [ "transportation", "vehicle" ], - char: "\ud83d\ude9e", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - steam_locomotive: { - keywords: [ "transportation", "vehicle", "train" ], - char: "\ud83d\ude82", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - train2: { - keywords: [ "transportation", "vehicle" ], - char: "\ud83d\ude86", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - metro: { - keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ], - char: "\ud83d\ude87", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - tram: { - keywords: [ "transportation", "vehicle" ], - char: "\ud83d\ude8a", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - station: { - keywords: [ "transportation", "vehicle", "public" ], - char: "\ud83d\ude89", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - flying_saucer: { - keywords: [ "transportation", "vehicle", "ufo" ], - char: "\ud83d\udef8", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - helicopter: { - keywords: [ "transportation", "vehicle", "fly" ], - char: "\ud83d\ude81", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - small_airplane: { - keywords: [ "flight", "transportation", "fly", "vehicle" ], - char: "\ud83d\udee9", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - airplane: { - keywords: [ "vehicle", "transportation", "flight", "fly" ], - char: "\u2708\ufe0f", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - flight_departure: { - keywords: [ "airport", "flight", "landing" ], - char: "\ud83d\udeeb", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - flight_arrival: { - keywords: [ "airport", "flight", "boarding" ], - char: "\ud83d\udeec", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - sailboat: { - keywords: [ "ship", "summer", "transportation", "water", "sailing" ], - char: "\u26f5", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - motor_boat: { - keywords: [ "ship" ], - char: "\ud83d\udee5", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - speedboat: { - keywords: [ "ship", "transportation", "vehicle", "summer" ], - char: "\ud83d\udea4", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - ferry: { - keywords: [ "boat", "ship", "yacht" ], - char: "\u26f4", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - passenger_ship: { - keywords: [ "yacht", "cruise", "ferry" ], - char: "\ud83d\udef3", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - rocket: { - keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ], - char: "\ud83d\ude80", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - artificial_satellite: { - keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ], - char: "\ud83d\udef0", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - seat: { - keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ], - char: "\ud83d\udcba", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - canoe: { - keywords: [ "boat", "paddle", "water", "ship" ], - char: "\ud83d\udef6", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - anchor: { - keywords: [ "ship", "ferry", "sea", "boat" ], - char: "\u2693", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - construction: { - keywords: [ "wip", "progress", "caution", "warning" ], - char: "\ud83d\udea7", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - fuelpump: { - keywords: [ "gas station", "petroleum" ], - char: "\u26fd", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - busstop: { - keywords: [ "transportation", "wait" ], - char: "\ud83d\ude8f", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - vertical_traffic_light: { - keywords: [ "transportation", "driving" ], - char: "\ud83d\udea6", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - traffic_light: { - keywords: [ "transportation", "signal" ], - char: "\ud83d\udea5", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - checkered_flag: { - keywords: [ "contest", "finishline", "race", "gokart" ], - char: "\ud83c\udfc1", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - ship: { - keywords: [ "transportation", "titanic", "deploy" ], - char: "\ud83d\udea2", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - ferris_wheel: { - keywords: [ "photo", "carnival", "londoneye" ], - char: "\ud83c\udfa1", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - roller_coaster: { - keywords: [ "carnival", "playground", "photo", "fun" ], - char: "\ud83c\udfa2", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - carousel_horse: { - keywords: [ "photo", "carnival" ], - char: "\ud83c\udfa0", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - building_construction: { - keywords: [ "wip", "working", "progress" ], - char: "\ud83c\udfd7", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - foggy: { - keywords: [ "photo", "mountain" ], - char: "\ud83c\udf01", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - tokyo_tower: { - keywords: [ "photo", "japanese" ], - char: "\ud83d\uddfc", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - factory: { - keywords: [ "building", "industry", "pollution", "smoke" ], - char: "\ud83c\udfed", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - fountain: { - keywords: [ "photo", "summer", "water", "fresh" ], - char: "\u26f2", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - rice_scene: { - keywords: [ "photo", "japan", "asia", "tsukimi" ], - char: "\ud83c\udf91", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mountain: { - keywords: [ "photo", "nature", "environment" ], - char: "\u26f0", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mountain_snow: { - keywords: [ "photo", "nature", "environment", "winter", "cold" ], - char: "\ud83c\udfd4", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mount_fuji: { - keywords: [ "photo", "mountain", "nature", "japanese" ], - char: "\ud83d\uddfb", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - volcano: { - keywords: [ "photo", "nature", "disaster" ], - char: "\ud83c\udf0b", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - japan: { - keywords: [ "nation", "country", "japanese", "asia" ], - char: "\ud83d\uddfe", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - camping: { - keywords: [ "photo", "outdoors", "tent" ], - char: "\ud83c\udfd5", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - tent: { - keywords: [ "photo", "camping", "outdoors" ], - char: "\u26fa", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - national_park: { - keywords: [ "photo", "environment", "nature" ], - char: "\ud83c\udfde", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - motorway: { - keywords: [ "road", "cupertino", "interstate", "highway" ], - char: "\ud83d\udee3", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - railway_track: { - keywords: [ "train", "transportation" ], - char: "\ud83d\udee4", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - sunrise: { - keywords: [ "morning", "view", "vacation", "photo" ], - char: "\ud83c\udf05", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - sunrise_over_mountains: { - keywords: [ "view", "vacation", "photo" ], - char: "\ud83c\udf04", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - desert: { - keywords: [ "photo", "warm", "saharah" ], - char: "\ud83c\udfdc", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - beach_umbrella: { - keywords: [ "weather", "summer", "sunny", "sand", "mojito" ], - char: "\ud83c\udfd6", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - desert_island: { - keywords: [ "photo", "tropical", "mojito" ], - char: "\ud83c\udfdd", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - city_sunrise: { - keywords: [ "photo", "good morning", "dawn" ], - char: "\ud83c\udf07", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - city_sunset: { - keywords: [ "photo", "evening", "sky", "buildings" ], - char: "\ud83c\udf06", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - cityscape: { - keywords: [ "photo", "night life", "urban" ], - char: "\ud83c\udfd9", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - night_with_stars: { - keywords: [ "evening", "city", "downtown" ], - char: "\ud83c\udf03", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bridge_at_night: { - keywords: [ "photo", "sanfrancisco" ], - char: "\ud83c\udf09", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - milky_way: { - keywords: [ "photo", "space", "stars" ], - char: "\ud83c\udf0c", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - stars: { - keywords: [ "night", "photo" ], - char: "\ud83c\udf20", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - sparkler: { - keywords: [ "stars", "night", "shine" ], - char: "\ud83c\udf87", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - fireworks: { - keywords: [ "photo", "festival", "carnival", "congratulations" ], - char: "\ud83c\udf86", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - rainbow: { - keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ], - char: "\ud83c\udf08", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - houses: { - keywords: [ "buildings", "photo" ], - char: "\ud83c\udfd8", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - european_castle: { - keywords: [ "building", "royalty", "history" ], - char: "\ud83c\udff0", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - japanese_castle: { - keywords: [ "photo", "building" ], - char: "\ud83c\udfef", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - stadium: { - keywords: [ "photo", "place", "sports", "concert", "venue" ], - char: "\ud83c\udfdf", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - statue_of_liberty: { - keywords: [ "american", "newyork" ], - char: "\ud83d\uddfd", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - house: { - keywords: [ "building", "home" ], - char: "\ud83c\udfe0", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - house_with_garden: { - keywords: [ "home", "plant", "nature" ], - char: "\ud83c\udfe1", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - derelict_house: { - keywords: [ "abandon", "evict", "broken", "building" ], - char: "\ud83c\udfda", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - office: { - keywords: [ "building", "bureau", "work" ], - char: "\ud83c\udfe2", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - department_store: { - keywords: [ "building", "shopping", "mall" ], - char: "\ud83c\udfec", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - post_office: { - keywords: [ "building", "envelope", "communication" ], - char: "\ud83c\udfe3", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - european_post_office: { - keywords: [ "building", "email" ], - char: "\ud83c\udfe4", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - hospital: { - keywords: [ "building", "health", "surgery", "doctor" ], - char: "\ud83c\udfe5", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - bank: { - keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ], - char: "\ud83c\udfe6", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - hotel: { - keywords: [ "building", "accomodation", "checkin" ], - char: "\ud83c\udfe8", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - convenience_store: { - keywords: [ "building", "shopping", "groceries" ], - char: "\ud83c\udfea", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - school: { - keywords: [ "building", "student", "education", "learn", "teach" ], - char: "\ud83c\udfeb", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - love_hotel: { - keywords: [ "like", "affection", "dating" ], - char: "\ud83c\udfe9", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - wedding: { - keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ], - char: "\ud83d\udc92", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - classical_building: { - keywords: [ "art", "culture", "history" ], - char: "\ud83c\udfdb", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - church: { - keywords: [ "building", "religion", "christ" ], - char: "\u26ea", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - mosque: { - keywords: [ "islam", "worship", "minaret" ], - char: "\ud83d\udd4c", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - synagogue: { - keywords: [ "judaism", "worship", "temple", "jewish" ], - char: "\ud83d\udd4d", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - kaaba: { - keywords: [ "mecca", "mosque", "islam" ], - char: "\ud83d\udd4b", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - shinto_shrine: { - keywords: [ "temple", "japan", "kyoto" ], - char: "\u26e9", - fitzpatrick_scale: false, - category: "travel_and_places" - }, - watch: { - keywords: [ "time", "accessories" ], - char: "\u231a", - fitzpatrick_scale: false, - category: "objects" - }, - iphone: { - keywords: [ "technology", "apple", "gadgets", "dial" ], - char: "\ud83d\udcf1", - fitzpatrick_scale: false, - category: "objects" - }, - calling: { - keywords: [ "iphone", "incoming" ], - char: "\ud83d\udcf2", - fitzpatrick_scale: false, - category: "objects" - }, - computer: { - keywords: [ "technology", "laptop", "screen", "display", "monitor" ], - char: "\ud83d\udcbb", - fitzpatrick_scale: false, - category: "objects" - }, - keyboard: { - keywords: [ "technology", "computer", "type", "input", "text" ], - char: "\u2328", - fitzpatrick_scale: false, - category: "objects" - }, - desktop_computer: { - keywords: [ "technology", "computing", "screen" ], - char: "\ud83d\udda5", - fitzpatrick_scale: false, - category: "objects" - }, - printer: { - keywords: [ "paper", "ink" ], - char: "\ud83d\udda8", - fitzpatrick_scale: false, - category: "objects" - }, - computer_mouse: { - keywords: [ "click" ], - char: "\ud83d\uddb1", - fitzpatrick_scale: false, - category: "objects" - }, - trackball: { - keywords: [ "technology", "trackpad" ], - char: "\ud83d\uddb2", - fitzpatrick_scale: false, - category: "objects" - }, - joystick: { - keywords: [ "game", "play" ], - char: "\ud83d\udd79", - fitzpatrick_scale: false, - category: "objects" - }, - clamp: { - keywords: [ "tool" ], - char: "\ud83d\udddc", - fitzpatrick_scale: false, - category: "objects" - }, - minidisc: { - keywords: [ "technology", "record", "data", "disk", "90s" ], - char: "\ud83d\udcbd", - fitzpatrick_scale: false, - category: "objects" - }, - floppy_disk: { - keywords: [ "oldschool", "technology", "save", "90s", "80s" ], - char: "\ud83d\udcbe", - fitzpatrick_scale: false, - category: "objects" - }, - cd: { - keywords: [ "technology", "dvd", "disk", "disc", "90s" ], - char: "\ud83d\udcbf", - fitzpatrick_scale: false, - category: "objects" - }, - dvd: { - keywords: [ "cd", "disk", "disc" ], - char: "\ud83d\udcc0", - fitzpatrick_scale: false, - category: "objects" - }, - vhs: { - keywords: [ "record", "video", "oldschool", "90s", "80s" ], - char: "\ud83d\udcfc", - fitzpatrick_scale: false, - category: "objects" - }, - camera: { - keywords: [ "gadgets", "photography" ], - char: "\ud83d\udcf7", - fitzpatrick_scale: false, - category: "objects" - }, - camera_flash: { - keywords: [ "photography", "gadgets" ], - char: "\ud83d\udcf8", - fitzpatrick_scale: false, - category: "objects" - }, - video_camera: { - keywords: [ "film", "record" ], - char: "\ud83d\udcf9", - fitzpatrick_scale: false, - category: "objects" - }, - movie_camera: { - keywords: [ "film", "record" ], - char: "\ud83c\udfa5", - fitzpatrick_scale: false, - category: "objects" - }, - film_projector: { - keywords: [ "video", "tape", "record", "movie" ], - char: "\ud83d\udcfd", - fitzpatrick_scale: false, - category: "objects" - }, - film_strip: { - keywords: [ "movie" ], - char: "\ud83c\udf9e", - fitzpatrick_scale: false, - category: "objects" - }, - telephone_receiver: { - keywords: [ "technology", "communication", "dial" ], - char: "\ud83d\udcde", - fitzpatrick_scale: false, - category: "objects" - }, - phone: { - keywords: [ "technology", "communication", "dial", "telephone" ], - char: "\u260e\ufe0f", - fitzpatrick_scale: false, - category: "objects" - }, - pager: { - keywords: [ "bbcall", "oldschool", "90s" ], - char: "\ud83d\udcdf", - fitzpatrick_scale: false, - category: "objects" - }, - fax: { - keywords: [ "communication", "technology" ], - char: "\ud83d\udce0", - fitzpatrick_scale: false, - category: "objects" - }, - tv: { - keywords: [ "technology", "program", "oldschool", "show", "television" ], - char: "\ud83d\udcfa", - fitzpatrick_scale: false, - category: "objects" - }, - radio: { - keywords: [ "communication", "music", "podcast", "program" ], - char: "\ud83d\udcfb", - fitzpatrick_scale: false, - category: "objects" - }, - studio_microphone: { - keywords: [ "sing", "recording", "artist", "talkshow" ], - char: "\ud83c\udf99", - fitzpatrick_scale: false, - category: "objects" - }, - level_slider: { - keywords: [ "scale" ], - char: "\ud83c\udf9a", - fitzpatrick_scale: false, - category: "objects" - }, - control_knobs: { - keywords: [ "dial" ], - char: "\ud83c\udf9b", - fitzpatrick_scale: false, - category: "objects" - }, - compass: { - keywords: [ "magnetic", "navigation", "orienteering" ], - char: "\ud83e\udded", - fitzpatrick_scale: false, - category: "objects" - }, - stopwatch: { - keywords: [ "time", "deadline" ], - char: "\u23f1", - fitzpatrick_scale: false, - category: "objects" - }, - timer_clock: { - keywords: [ "alarm" ], - char: "\u23f2", - fitzpatrick_scale: false, - category: "objects" - }, - alarm_clock: { - keywords: [ "time", "wake" ], - char: "\u23f0", - fitzpatrick_scale: false, - category: "objects" - }, - mantelpiece_clock: { - keywords: [ "time" ], - char: "\ud83d\udd70", - fitzpatrick_scale: false, - category: "objects" - }, - hourglass_flowing_sand: { - keywords: [ "oldschool", "time", "countdown" ], - char: "\u23f3", - fitzpatrick_scale: false, - category: "objects" - }, - hourglass: { - keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ], - char: "\u231b", - fitzpatrick_scale: false, - category: "objects" - }, - satellite: { - keywords: [ "communication", "future", "radio", "space" ], - char: "\ud83d\udce1", - fitzpatrick_scale: false, - category: "objects" - }, - battery: { - keywords: [ "power", "energy", "sustain" ], - char: "\ud83d\udd0b", - fitzpatrick_scale: false, - category: "objects" - }, - electric_plug: { - keywords: [ "charger", "power" ], - char: "\ud83d\udd0c", - fitzpatrick_scale: false, - category: "objects" - }, - bulb: { - keywords: [ "light", "electricity", "idea" ], - char: "\ud83d\udca1", - fitzpatrick_scale: false, - category: "objects" - }, - flashlight: { - keywords: [ "dark", "camping", "sight", "night" ], - char: "\ud83d\udd26", - fitzpatrick_scale: false, - category: "objects" - }, - candle: { - keywords: [ "fire", "wax" ], - char: "\ud83d\udd6f", - fitzpatrick_scale: false, - category: "objects" - }, - fire_extinguisher: { - keywords: [ "quench" ], - char: "\ud83e\uddef", - fitzpatrick_scale: false, - category: "objects" - }, - wastebasket: { - keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ], - char: "\ud83d\uddd1", - fitzpatrick_scale: false, - category: "objects" - }, - oil_drum: { - keywords: [ "barrell" ], - char: "\ud83d\udee2", - fitzpatrick_scale: false, - category: "objects" - }, - money_with_wings: { - keywords: [ "dollar", "bills", "payment", "sale" ], - char: "\ud83d\udcb8", - fitzpatrick_scale: false, - category: "objects" - }, - dollar: { - keywords: [ "money", "sales", "bill", "currency" ], - char: "\ud83d\udcb5", - fitzpatrick_scale: false, - category: "objects" - }, - yen: { - keywords: [ "money", "sales", "japanese", "dollar", "currency" ], - char: "\ud83d\udcb4", - fitzpatrick_scale: false, - category: "objects" - }, - euro: { - keywords: [ "money", "sales", "dollar", "currency" ], - char: "\ud83d\udcb6", - fitzpatrick_scale: false, - category: "objects" - }, - pound: { - keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ], - char: "\ud83d\udcb7", - fitzpatrick_scale: false, - category: "objects" - }, - moneybag: { - keywords: [ "dollar", "payment", "coins", "sale" ], - char: "\ud83d\udcb0", - fitzpatrick_scale: false, - category: "objects" - }, - credit_card: { - keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ], - char: "\ud83d\udcb3", - fitzpatrick_scale: false, - category: "objects" - }, - gem: { - keywords: [ "blue", "ruby", "diamond", "jewelry" ], - char: "\ud83d\udc8e", - fitzpatrick_scale: false, - category: "objects" - }, - balance_scale: { - keywords: [ "law", "fairness", "weight" ], - char: "\u2696", - fitzpatrick_scale: false, - category: "objects" - }, - toolbox: { - keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ], - char: "\ud83e\uddf0", - fitzpatrick_scale: false, - category: "objects" - }, - wrench: { - keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ], - char: "\ud83d\udd27", - fitzpatrick_scale: false, - category: "objects" - }, - hammer: { - keywords: [ "tools", "build", "create" ], - char: "\ud83d\udd28", - fitzpatrick_scale: false, - category: "objects" - }, - hammer_and_pick: { - keywords: [ "tools", "build", "create" ], - char: "\u2692", - fitzpatrick_scale: false, - category: "objects" - }, - hammer_and_wrench: { - keywords: [ "tools", "build", "create" ], - char: "\ud83d\udee0", - fitzpatrick_scale: false, - category: "objects" - }, - pick: { - keywords: [ "tools", "dig" ], - char: "\u26cf", - fitzpatrick_scale: false, - category: "objects" - }, - nut_and_bolt: { - keywords: [ "handy", "tools", "fix" ], - char: "\ud83d\udd29", - fitzpatrick_scale: false, - category: "objects" - }, - gear: { - keywords: [ "cog" ], - char: "\u2699", - fitzpatrick_scale: false, - category: "objects" - }, - brick: { - keywords: [ "bricks" ], - char: "\ud83e\uddf1", - fitzpatrick_scale: false, - category: "objects" - }, - chains: { - keywords: [ "lock", "arrest" ], - char: "\u26d3", - fitzpatrick_scale: false, - category: "objects" - }, - magnet: { - keywords: [ "attraction", "magnetic" ], - char: "\ud83e\uddf2", - fitzpatrick_scale: false, - category: "objects" - }, - gun: { - keywords: [ "violence", "weapon", "pistol", "revolver" ], - char: "\ud83d\udd2b", - fitzpatrick_scale: false, - category: "objects" - }, - bomb: { - keywords: [ "boom", "explode", "explosion", "terrorism" ], - char: "\ud83d\udca3", - fitzpatrick_scale: false, - category: "objects" - }, - firecracker: { - keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ], - char: "\ud83e\udde8", - fitzpatrick_scale: false, - category: "objects" - }, - hocho: { - keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ], - char: "\ud83d\udd2a", - fitzpatrick_scale: false, - category: "objects" - }, - dagger: { - keywords: [ "weapon" ], - char: "\ud83d\udde1", - fitzpatrick_scale: false, - category: "objects" - }, - crossed_swords: { - keywords: [ "weapon" ], - char: "\u2694", - fitzpatrick_scale: false, - category: "objects" - }, - shield: { - keywords: [ "protection", "security" ], - char: "\ud83d\udee1", - fitzpatrick_scale: false, - category: "objects" - }, - smoking: { - keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ], - char: "\ud83d\udeac", - fitzpatrick_scale: false, - category: "objects" - }, - skull_and_crossbones: { - keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ], - char: "\u2620", - fitzpatrick_scale: false, - category: "objects" - }, - coffin: { - keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ], - char: "\u26b0", - fitzpatrick_scale: false, - category: "objects" - }, - funeral_urn: { - keywords: [ "dead", "die", "death", "rip", "ashes" ], - char: "\u26b1", - fitzpatrick_scale: false, - category: "objects" - }, - amphora: { - keywords: [ "vase", "jar" ], - char: "\ud83c\udffa", - fitzpatrick_scale: false, - category: "objects" - }, - crystal_ball: { - keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ], - char: "\ud83d\udd2e", - fitzpatrick_scale: false, - category: "objects" - }, - prayer_beads: { - keywords: [ "dhikr", "religious" ], - char: "\ud83d\udcff", - fitzpatrick_scale: false, - category: "objects" - }, - nazar_amulet: { - keywords: [ "bead", "charm" ], - char: "\ud83e\uddff", - fitzpatrick_scale: false, - category: "objects" - }, - barber: { - keywords: [ "hair", "salon", "style" ], - char: "\ud83d\udc88", - fitzpatrick_scale: false, - category: "objects" - }, - alembic: { - keywords: [ "distilling", "science", "experiment", "chemistry" ], - char: "\u2697", - fitzpatrick_scale: false, - category: "objects" - }, - telescope: { - keywords: [ "stars", "space", "zoom", "science", "astronomy" ], - char: "\ud83d\udd2d", - fitzpatrick_scale: false, - category: "objects" - }, - microscope: { - keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ], - char: "\ud83d\udd2c", - fitzpatrick_scale: false, - category: "objects" - }, - hole: { - keywords: [ "embarrassing" ], - char: "\ud83d\udd73", - fitzpatrick_scale: false, - category: "objects" - }, - pill: { - keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ], - char: "\ud83d\udc8a", - fitzpatrick_scale: false, - category: "objects" - }, - syringe: { - keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ], - char: "\ud83d\udc89", - fitzpatrick_scale: false, - category: "objects" - }, - dna: { - keywords: [ "biologist", "genetics", "life" ], - char: "\ud83e\uddec", - fitzpatrick_scale: false, - category: "objects" - }, - microbe: { - keywords: [ "amoeba", "bacteria", "germs" ], - char: "\ud83e\udda0", - fitzpatrick_scale: false, - category: "objects" - }, - petri_dish: { - keywords: [ "bacteria", "biology", "culture", "lab" ], - char: "\ud83e\uddeb", - fitzpatrick_scale: false, - category: "objects" - }, - test_tube: { - keywords: [ "chemistry", "experiment", "lab", "science" ], - char: "\ud83e\uddea", - fitzpatrick_scale: false, - category: "objects" - }, - thermometer: { - keywords: [ "weather", "temperature", "hot", "cold" ], - char: "\ud83c\udf21", - fitzpatrick_scale: false, - category: "objects" - }, - broom: { - keywords: [ "cleaning", "sweeping", "witch" ], - char: "\ud83e\uddf9", - fitzpatrick_scale: false, - category: "objects" - }, - basket: { - keywords: [ "laundry" ], - char: "\ud83e\uddfa", - fitzpatrick_scale: false, - category: "objects" - }, - toilet_paper: { - keywords: [ "roll" ], - char: "\ud83e\uddfb", - fitzpatrick_scale: false, - category: "objects" - }, - label: { - keywords: [ "sale", "tag" ], - char: "\ud83c\udff7", - fitzpatrick_scale: false, - category: "objects" - }, - bookmark: { - keywords: [ "favorite", "label", "save" ], - char: "\ud83d\udd16", - fitzpatrick_scale: false, - category: "objects" - }, - toilet: { - keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ], - char: "\ud83d\udebd", - fitzpatrick_scale: false, - category: "objects" - }, - shower: { - keywords: [ "clean", "water", "bathroom" ], - char: "\ud83d\udebf", - fitzpatrick_scale: false, - category: "objects" - }, - bathtub: { - keywords: [ "clean", "shower", "bathroom" ], - char: "\ud83d\udec1", - fitzpatrick_scale: false, - category: "objects" - }, - soap: { - keywords: [ "bar", "bathing", "cleaning", "lather" ], - char: "\ud83e\uddfc", - fitzpatrick_scale: false, - category: "objects" - }, - sponge: { - keywords: [ "absorbing", "cleaning", "porous" ], - char: "\ud83e\uddfd", - fitzpatrick_scale: false, - category: "objects" - }, - lotion_bottle: { - keywords: [ "moisturizer", "sunscreen" ], - char: "\ud83e\uddf4", - fitzpatrick_scale: false, - category: "objects" - }, - key: { - keywords: [ "lock", "door", "password" ], - char: "\ud83d\udd11", - fitzpatrick_scale: false, - category: "objects" - }, - old_key: { - keywords: [ "lock", "door", "password" ], - char: "\ud83d\udddd", - fitzpatrick_scale: false, - category: "objects" - }, - couch_and_lamp: { - keywords: [ "read", "chill" ], - char: "\ud83d\udecb", - fitzpatrick_scale: false, - category: "objects" - }, - sleeping_bed: { - keywords: [ "bed", "rest" ], - char: "\ud83d\udecc", - fitzpatrick_scale: true, - category: "objects" - }, - bed: { - keywords: [ "sleep", "rest" ], - char: "\ud83d\udecf", - fitzpatrick_scale: false, - category: "objects" - }, - door: { - keywords: [ "house", "entry", "exit" ], - char: "\ud83d\udeaa", - fitzpatrick_scale: false, - category: "objects" - }, - bellhop_bell: { - keywords: [ "service" ], - char: "\ud83d\udece", - fitzpatrick_scale: false, - category: "objects" - }, - teddy_bear: { - keywords: [ "plush", "stuffed" ], - char: "\ud83e\uddf8", - fitzpatrick_scale: false, - category: "objects" - }, - framed_picture: { - keywords: [ "photography" ], - char: "\ud83d\uddbc", - fitzpatrick_scale: false, - category: "objects" - }, - world_map: { - keywords: [ "location", "direction" ], - char: "\ud83d\uddfa", - fitzpatrick_scale: false, - category: "objects" - }, - parasol_on_ground: { - keywords: [ "weather", "summer" ], - char: "\u26f1", - fitzpatrick_scale: false, - category: "objects" - }, - moyai: { - keywords: [ "rock", "easter island", "moai" ], - char: "\ud83d\uddff", - fitzpatrick_scale: false, - category: "objects" - }, - shopping: { - keywords: [ "mall", "buy", "purchase" ], - char: "\ud83d\udecd", - fitzpatrick_scale: false, - category: "objects" - }, - shopping_cart: { - keywords: [ "trolley" ], - char: "\ud83d\uded2", - fitzpatrick_scale: false, - category: "objects" - }, - balloon: { - keywords: [ "party", "celebration", "birthday", "circus" ], - char: "\ud83c\udf88", - fitzpatrick_scale: false, - category: "objects" - }, - flags: { - keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ], - char: "\ud83c\udf8f", - fitzpatrick_scale: false, - category: "objects" - }, - ribbon: { - keywords: [ "decoration", "pink", "girl", "bowtie" ], - char: "\ud83c\udf80", - fitzpatrick_scale: false, - category: "objects" - }, - gift: { - keywords: [ "present", "birthday", "christmas", "xmas" ], - char: "\ud83c\udf81", - fitzpatrick_scale: false, - category: "objects" - }, - confetti_ball: { - keywords: [ "festival", "party", "birthday", "circus" ], - char: "\ud83c\udf8a", - fitzpatrick_scale: false, - category: "objects" - }, - tada: { - keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ], - char: "\ud83c\udf89", - fitzpatrick_scale: false, - category: "objects" - }, - dolls: { - keywords: [ "japanese", "toy", "kimono" ], - char: "\ud83c\udf8e", - fitzpatrick_scale: false, - category: "objects" - }, - wind_chime: { - keywords: [ "nature", "ding", "spring", "bell" ], - char: "\ud83c\udf90", - fitzpatrick_scale: false, - category: "objects" - }, - crossed_flags: { - keywords: [ "japanese", "nation", "country", "border" ], - char: "\ud83c\udf8c", - fitzpatrick_scale: false, - category: "objects" - }, - izakaya_lantern: { - keywords: [ "light", "paper", "halloween", "spooky" ], - char: "\ud83c\udfee", - fitzpatrick_scale: false, - category: "objects" - }, - red_envelope: { - keywords: [ "gift" ], - char: "\ud83e\udde7", - fitzpatrick_scale: false, - category: "objects" - }, - email: { - keywords: [ "letter", "postal", "inbox", "communication" ], - char: "\u2709\ufe0f", - fitzpatrick_scale: false, - category: "objects" - }, - envelope_with_arrow: { - keywords: [ "email", "communication" ], - char: "\ud83d\udce9", - fitzpatrick_scale: false, - category: "objects" - }, - incoming_envelope: { - keywords: [ "email", "inbox" ], - char: "\ud83d\udce8", - fitzpatrick_scale: false, - category: "objects" - }, - "e-mail": { - keywords: [ "communication", "inbox" ], - char: "\ud83d\udce7", - fitzpatrick_scale: false, - category: "objects" - }, - love_letter: { - keywords: [ "email", "like", "affection", "envelope", "valentines" ], - char: "\ud83d\udc8c", - fitzpatrick_scale: false, - category: "objects" - }, - postbox: { - keywords: [ "email", "letter", "envelope" ], - char: "\ud83d\udcee", - fitzpatrick_scale: false, - category: "objects" - }, - mailbox_closed: { - keywords: [ "email", "communication", "inbox" ], - char: "\ud83d\udcea", - fitzpatrick_scale: false, - category: "objects" - }, - mailbox: { - keywords: [ "email", "inbox", "communication" ], - char: "\ud83d\udceb", - fitzpatrick_scale: false, - category: "objects" - }, - mailbox_with_mail: { - keywords: [ "email", "inbox", "communication" ], - char: "\ud83d\udcec", - fitzpatrick_scale: false, - category: "objects" - }, - mailbox_with_no_mail: { - keywords: [ "email", "inbox" ], - char: "\ud83d\udced", - fitzpatrick_scale: false, - category: "objects" - }, - package: { - keywords: [ "mail", "gift", "cardboard", "box", "moving" ], - char: "\ud83d\udce6", - fitzpatrick_scale: false, - category: "objects" - }, - postal_horn: { - keywords: [ "instrument", "music" ], - char: "\ud83d\udcef", - fitzpatrick_scale: false, - category: "objects" - }, - inbox_tray: { - keywords: [ "email", "documents" ], - char: "\ud83d\udce5", - fitzpatrick_scale: false, - category: "objects" - }, - outbox_tray: { - keywords: [ "inbox", "email" ], - char: "\ud83d\udce4", - fitzpatrick_scale: false, - category: "objects" - }, - scroll: { - keywords: [ "documents", "ancient", "history", "paper" ], - char: "\ud83d\udcdc", - fitzpatrick_scale: false, - category: "objects" - }, - page_with_curl: { - keywords: [ "documents", "office", "paper" ], - char: "\ud83d\udcc3", - fitzpatrick_scale: false, - category: "objects" - }, - bookmark_tabs: { - keywords: [ "favorite", "save", "order", "tidy" ], - char: "\ud83d\udcd1", - fitzpatrick_scale: false, - category: "objects" - }, - receipt: { - keywords: [ "accounting", "expenses" ], - char: "\ud83e\uddfe", - fitzpatrick_scale: false, - category: "objects" - }, - bar_chart: { - keywords: [ "graph", "presentation", "stats" ], - char: "\ud83d\udcca", - fitzpatrick_scale: false, - category: "objects" - }, - chart_with_upwards_trend: { - keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ], - char: "\ud83d\udcc8", - fitzpatrick_scale: false, - category: "objects" - }, - chart_with_downwards_trend: { - keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ], - char: "\ud83d\udcc9", - fitzpatrick_scale: false, - category: "objects" - }, - page_facing_up: { - keywords: [ "documents", "office", "paper", "information" ], - char: "\ud83d\udcc4", - fitzpatrick_scale: false, - category: "objects" - }, - date: { - keywords: [ "calendar", "schedule" ], - char: "\ud83d\udcc5", - fitzpatrick_scale: false, - category: "objects" - }, - calendar: { - keywords: [ "schedule", "date", "planning" ], - char: "\ud83d\udcc6", - fitzpatrick_scale: false, - category: "objects" - }, - spiral_calendar: { - keywords: [ "date", "schedule", "planning" ], - char: "\ud83d\uddd3", - fitzpatrick_scale: false, - category: "objects" - }, - card_index: { - keywords: [ "business", "stationery" ], - char: "\ud83d\udcc7", - fitzpatrick_scale: false, - category: "objects" - }, - card_file_box: { - keywords: [ "business", "stationery" ], - char: "\ud83d\uddc3", - fitzpatrick_scale: false, - category: "objects" - }, - ballot_box: { - keywords: [ "election", "vote" ], - char: "\ud83d\uddf3", - fitzpatrick_scale: false, - category: "objects" - }, - file_cabinet: { - keywords: [ "filing", "organizing" ], - char: "\ud83d\uddc4", - fitzpatrick_scale: false, - category: "objects" - }, - clipboard: { - keywords: [ "stationery", "documents" ], - char: "\ud83d\udccb", - fitzpatrick_scale: false, - category: "objects" - }, - spiral_notepad: { - keywords: [ "memo", "stationery" ], - char: "\ud83d\uddd2", - fitzpatrick_scale: false, - category: "objects" - }, - file_folder: { - keywords: [ "documents", "business", "office" ], - char: "\ud83d\udcc1", - fitzpatrick_scale: false, - category: "objects" - }, - open_file_folder: { - keywords: [ "documents", "load" ], - char: "\ud83d\udcc2", - fitzpatrick_scale: false, - category: "objects" - }, - card_index_dividers: { - keywords: [ "organizing", "business", "stationery" ], - char: "\ud83d\uddc2", - fitzpatrick_scale: false, - category: "objects" - }, - newspaper_roll: { - keywords: [ "press", "headline" ], - char: "\ud83d\uddde", - fitzpatrick_scale: false, - category: "objects" - }, - newspaper: { - keywords: [ "press", "headline" ], - char: "\ud83d\udcf0", - fitzpatrick_scale: false, - category: "objects" - }, - notebook: { - keywords: [ "stationery", "record", "notes", "paper", "study" ], - char: "\ud83d\udcd3", - fitzpatrick_scale: false, - category: "objects" - }, - closed_book: { - keywords: [ "read", "library", "knowledge", "textbook", "learn" ], - char: "\ud83d\udcd5", - fitzpatrick_scale: false, - category: "objects" - }, - green_book: { - keywords: [ "read", "library", "knowledge", "study" ], - char: "\ud83d\udcd7", - fitzpatrick_scale: false, - category: "objects" - }, - blue_book: { - keywords: [ "read", "library", "knowledge", "learn", "study" ], - char: "\ud83d\udcd8", - fitzpatrick_scale: false, - category: "objects" - }, - orange_book: { - keywords: [ "read", "library", "knowledge", "textbook", "study" ], - char: "\ud83d\udcd9", - fitzpatrick_scale: false, - category: "objects" - }, - notebook_with_decorative_cover: { - keywords: [ "classroom", "notes", "record", "paper", "study" ], - char: "\ud83d\udcd4", - fitzpatrick_scale: false, - category: "objects" - }, - ledger: { - keywords: [ "notes", "paper" ], - char: "\ud83d\udcd2", - fitzpatrick_scale: false, - category: "objects" - }, - books: { - keywords: [ "literature", "library", "study" ], - char: "\ud83d\udcda", - fitzpatrick_scale: false, - category: "objects" - }, - open_book: { - keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ], - char: "\ud83d\udcd6", - fitzpatrick_scale: false, - category: "objects" - }, - safety_pin: { - keywords: [ "diaper" ], - char: "\ud83e\uddf7", - fitzpatrick_scale: false, - category: "objects" - }, - link: { - keywords: [ "rings", "url" ], - char: "\ud83d\udd17", - fitzpatrick_scale: false, - category: "objects" - }, - paperclip: { - keywords: [ "documents", "stationery" ], - char: "\ud83d\udcce", - fitzpatrick_scale: false, - category: "objects" - }, - paperclips: { - keywords: [ "documents", "stationery" ], - char: "\ud83d\udd87", - fitzpatrick_scale: false, - category: "objects" - }, - scissors: { - keywords: [ "stationery", "cut" ], - char: "\u2702\ufe0f", - fitzpatrick_scale: false, - category: "objects" - }, - triangular_ruler: { - keywords: [ "stationery", "math", "architect", "sketch" ], - char: "\ud83d\udcd0", - fitzpatrick_scale: false, - category: "objects" - }, - straight_ruler: { - keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ], - char: "\ud83d\udccf", - fitzpatrick_scale: false, - category: "objects" - }, - abacus: { - keywords: [ "calculation" ], - char: "\ud83e\uddee", - fitzpatrick_scale: false, - category: "objects" - }, - pushpin: { - keywords: [ "stationery", "mark", "here" ], - char: "\ud83d\udccc", - fitzpatrick_scale: false, - category: "objects" - }, - round_pushpin: { - keywords: [ "stationery", "location", "map", "here" ], - char: "\ud83d\udccd", - fitzpatrick_scale: false, - category: "objects" - }, - triangular_flag_on_post: { - keywords: [ "mark", "milestone", "place" ], - char: "\ud83d\udea9", - fitzpatrick_scale: false, - category: "objects" - }, - white_flag: { - keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ], - char: "\ud83c\udff3", - fitzpatrick_scale: false, - category: "objects" - }, - black_flag: { - keywords: [ "pirate" ], - char: "\ud83c\udff4", - fitzpatrick_scale: false, - category: "objects" - }, - rainbow_flag: { - keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ], - char: "\ud83c\udff3\ufe0f\u200d\ud83c\udf08", - fitzpatrick_scale: false, - category: "objects" - }, - closed_lock_with_key: { - keywords: [ "security", "privacy" ], - char: "\ud83d\udd10", - fitzpatrick_scale: false, - category: "objects" - }, - lock: { - keywords: [ "security", "password", "padlock" ], - char: "\ud83d\udd12", - fitzpatrick_scale: false, - category: "objects" - }, - unlock: { - keywords: [ "privacy", "security" ], - char: "\ud83d\udd13", - fitzpatrick_scale: false, - category: "objects" - }, - lock_with_ink_pen: { - keywords: [ "security", "secret" ], - char: "\ud83d\udd0f", - fitzpatrick_scale: false, - category: "objects" - }, - pen: { - keywords: [ "stationery", "writing", "write" ], - char: "\ud83d\udd8a", - fitzpatrick_scale: false, - category: "objects" - }, - fountain_pen: { - keywords: [ "stationery", "writing", "write" ], - char: "\ud83d\udd8b", - fitzpatrick_scale: false, - category: "objects" - }, - black_nib: { - keywords: [ "pen", "stationery", "writing", "write" ], - char: "\u2712\ufe0f", - fitzpatrick_scale: false, - category: "objects" - }, - memo: { - keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ], - char: "\ud83d\udcdd", - fitzpatrick_scale: false, - category: "objects" - }, - pencil2: { - keywords: [ "stationery", "write", "paper", "writing", "school", "study" ], - char: "\u270f\ufe0f", - fitzpatrick_scale: false, - category: "objects" - }, - crayon: { - keywords: [ "drawing", "creativity" ], - char: "\ud83d\udd8d", - fitzpatrick_scale: false, - category: "objects" - }, - paintbrush: { - keywords: [ "drawing", "creativity", "art" ], - char: "\ud83d\udd8c", - fitzpatrick_scale: false, - category: "objects" - }, - mag: { - keywords: [ "search", "zoom", "find", "detective" ], - char: "\ud83d\udd0d", - fitzpatrick_scale: false, - category: "objects" - }, - mag_right: { - keywords: [ "search", "zoom", "find", "detective" ], - char: "\ud83d\udd0e", - fitzpatrick_scale: false, - category: "objects" - }, - heart: { - keywords: [ "love", "like", "valentines" ], - char: "\u2764\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - orange_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: "\ud83e\udde1", - fitzpatrick_scale: false, - category: "symbols" - }, - yellow_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: "\ud83d\udc9b", - fitzpatrick_scale: false, - category: "symbols" - }, - green_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: "\ud83d\udc9a", - fitzpatrick_scale: false, - category: "symbols" - }, - blue_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: "\ud83d\udc99", - fitzpatrick_scale: false, - category: "symbols" - }, - purple_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: "\ud83d\udc9c", - fitzpatrick_scale: false, - category: "symbols" - }, - black_heart: { - keywords: [ "evil" ], - char: "\ud83d\udda4", - fitzpatrick_scale: false, - category: "symbols" - }, - broken_heart: { - keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ], - char: "\ud83d\udc94", - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_heart_exclamation: { - keywords: [ "decoration", "love" ], - char: "\u2763", - fitzpatrick_scale: false, - category: "symbols" - }, - two_hearts: { - keywords: [ "love", "like", "affection", "valentines", "heart" ], - char: "\ud83d\udc95", - fitzpatrick_scale: false, - category: "symbols" - }, - revolving_hearts: { - keywords: [ "love", "like", "affection", "valentines" ], - char: "\ud83d\udc9e", - fitzpatrick_scale: false, - category: "symbols" - }, - heartbeat: { - keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ], - char: "\ud83d\udc93", - fitzpatrick_scale: false, - category: "symbols" - }, - heartpulse: { - keywords: [ "like", "love", "affection", "valentines", "pink" ], - char: "\ud83d\udc97", - fitzpatrick_scale: false, - category: "symbols" - }, - sparkling_heart: { - keywords: [ "love", "like", "affection", "valentines" ], - char: "\ud83d\udc96", - fitzpatrick_scale: false, - category: "symbols" - }, - cupid: { - keywords: [ "love", "like", "heart", "affection", "valentines" ], - char: "\ud83d\udc98", - fitzpatrick_scale: false, - category: "symbols" - }, - gift_heart: { - keywords: [ "love", "valentines" ], - char: "\ud83d\udc9d", - fitzpatrick_scale: false, - category: "symbols" - }, - heart_decoration: { - keywords: [ "purple-square", "love", "like" ], - char: "\ud83d\udc9f", - fitzpatrick_scale: false, - category: "symbols" - }, - peace_symbol: { - keywords: [ "hippie" ], - char: "\u262e", - fitzpatrick_scale: false, - category: "symbols" - }, - latin_cross: { - keywords: [ "christianity" ], - char: "\u271d", - fitzpatrick_scale: false, - category: "symbols" - }, - star_and_crescent: { - keywords: [ "islam" ], - char: "\u262a", - fitzpatrick_scale: false, - category: "symbols" - }, - om: { - keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], - char: "\ud83d\udd49", - fitzpatrick_scale: false, - category: "symbols" - }, - wheel_of_dharma: { - keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], - char: "\u2638", - fitzpatrick_scale: false, - category: "symbols" - }, - star_of_david: { - keywords: [ "judaism" ], - char: "\u2721", - fitzpatrick_scale: false, - category: "symbols" - }, - six_pointed_star: { - keywords: [ "purple-square", "religion", "jewish", "hexagram" ], - char: "\ud83d\udd2f", - fitzpatrick_scale: false, - category: "symbols" - }, - menorah: { - keywords: [ "hanukkah", "candles", "jewish" ], - char: "\ud83d\udd4e", - fitzpatrick_scale: false, - category: "symbols" - }, - yin_yang: { - keywords: [ "balance" ], - char: "\u262f", - fitzpatrick_scale: false, - category: "symbols" - }, - orthodox_cross: { - keywords: [ "suppedaneum", "religion" ], - char: "\u2626", - fitzpatrick_scale: false, - category: "symbols" - }, - place_of_worship: { - keywords: [ "religion", "church", "temple", "prayer" ], - char: "\ud83d\uded0", - fitzpatrick_scale: false, - category: "symbols" - }, - ophiuchus: { - keywords: [ "sign", "purple-square", "constellation", "astrology" ], - char: "\u26ce", - fitzpatrick_scale: false, - category: "symbols" - }, - aries: { - keywords: [ "sign", "purple-square", "zodiac", "astrology" ], - char: "\u2648", - fitzpatrick_scale: false, - category: "symbols" - }, - taurus: { - keywords: [ "purple-square", "sign", "zodiac", "astrology" ], - char: "\u2649", - fitzpatrick_scale: false, - category: "symbols" - }, - gemini: { - keywords: [ "sign", "zodiac", "purple-square", "astrology" ], - char: "\u264a", - fitzpatrick_scale: false, - category: "symbols" - }, - cancer: { - keywords: [ "sign", "zodiac", "purple-square", "astrology" ], - char: "\u264b", - fitzpatrick_scale: false, - category: "symbols" - }, - leo: { - keywords: [ "sign", "purple-square", "zodiac", "astrology" ], - char: "\u264c", - fitzpatrick_scale: false, - category: "symbols" - }, - virgo: { - keywords: [ "sign", "zodiac", "purple-square", "astrology" ], - char: "\u264d", - fitzpatrick_scale: false, - category: "symbols" - }, - libra: { - keywords: [ "sign", "purple-square", "zodiac", "astrology" ], - char: "\u264e", - fitzpatrick_scale: false, - category: "symbols" - }, - scorpius: { - keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ], - char: "\u264f", - fitzpatrick_scale: false, - category: "symbols" - }, - sagittarius: { - keywords: [ "sign", "zodiac", "purple-square", "astrology" ], - char: "\u2650", - fitzpatrick_scale: false, - category: "symbols" - }, - capricorn: { - keywords: [ "sign", "zodiac", "purple-square", "astrology" ], - char: "\u2651", - fitzpatrick_scale: false, - category: "symbols" - }, - aquarius: { - keywords: [ "sign", "purple-square", "zodiac", "astrology" ], - char: "\u2652", - fitzpatrick_scale: false, - category: "symbols" - }, - pisces: { - keywords: [ "purple-square", "sign", "zodiac", "astrology" ], - char: "\u2653", - fitzpatrick_scale: false, - category: "symbols" - }, - id: { - keywords: [ "purple-square", "words" ], - char: "\ud83c\udd94", - fitzpatrick_scale: false, - category: "symbols" - }, - atom_symbol: { - keywords: [ "science", "physics", "chemistry" ], - char: "\u269b", - fitzpatrick_scale: false, - category: "symbols" - }, - u7a7a: { - keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ], - char: "\ud83c\ude33", - fitzpatrick_scale: false, - category: "symbols" - }, - u5272: { - keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ], - char: "\ud83c\ude39", - fitzpatrick_scale: false, - category: "symbols" - }, - radioactive: { - keywords: [ "nuclear", "danger" ], - char: "\u2622", - fitzpatrick_scale: false, - category: "symbols" - }, - biohazard: { - keywords: [ "danger" ], - char: "\u2623", - fitzpatrick_scale: false, - category: "symbols" - }, - mobile_phone_off: { - keywords: [ "mute", "orange-square", "silence", "quiet" ], - char: "\ud83d\udcf4", - fitzpatrick_scale: false, - category: "symbols" - }, - vibration_mode: { - keywords: [ "orange-square", "phone" ], - char: "\ud83d\udcf3", - fitzpatrick_scale: false, - category: "symbols" - }, - u6709: { - keywords: [ "orange-square", "chinese", "have", "kanji" ], - char: "\ud83c\ude36", - fitzpatrick_scale: false, - category: "symbols" - }, - u7121: { - keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ], - char: "\ud83c\ude1a", - fitzpatrick_scale: false, - category: "symbols" - }, - u7533: { - keywords: [ "chinese", "japanese", "kanji", "orange-square" ], - char: "\ud83c\ude38", - fitzpatrick_scale: false, - category: "symbols" - }, - u55b6: { - keywords: [ "japanese", "opening hours", "orange-square" ], - char: "\ud83c\ude3a", - fitzpatrick_scale: false, - category: "symbols" - }, - u6708: { - keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ], - char: "\ud83c\ude37\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - eight_pointed_black_star: { - keywords: [ "orange-square", "shape", "polygon" ], - char: "\u2734\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - vs: { - keywords: [ "words", "orange-square" ], - char: "\ud83c\udd9a", - fitzpatrick_scale: false, - category: "symbols" - }, - accept: { - keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ], - char: "\ud83c\ude51", - fitzpatrick_scale: false, - category: "symbols" - }, - white_flower: { - keywords: [ "japanese", "spring" ], - char: "\ud83d\udcae", - fitzpatrick_scale: false, - category: "symbols" - }, - ideograph_advantage: { - keywords: [ "chinese", "kanji", "obtain", "get", "circle" ], - char: "\ud83c\ude50", - fitzpatrick_scale: false, - category: "symbols" - }, - secret: { - keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ], - char: "\u3299\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - congratulations: { - keywords: [ "chinese", "kanji", "japanese", "red-circle" ], - char: "\u3297\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - u5408: { - keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ], - char: "\ud83c\ude34", - fitzpatrick_scale: false, - category: "symbols" - }, - u6e80: { - keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ], - char: "\ud83c\ude35", - fitzpatrick_scale: false, - category: "symbols" - }, - u7981: { - keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ], - char: "\ud83c\ude32", - fitzpatrick_scale: false, - category: "symbols" - }, - a: { - keywords: [ "red-square", "alphabet", "letter" ], - char: "\ud83c\udd70\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - b: { - keywords: [ "red-square", "alphabet", "letter" ], - char: "\ud83c\udd71\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - ab: { - keywords: [ "red-square", "alphabet" ], - char: "\ud83c\udd8e", - fitzpatrick_scale: false, - category: "symbols" - }, - cl: { - keywords: [ "alphabet", "words", "red-square" ], - char: "\ud83c\udd91", - fitzpatrick_scale: false, - category: "symbols" - }, - o2: { - keywords: [ "alphabet", "red-square", "letter" ], - char: "\ud83c\udd7e\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - sos: { - keywords: [ "help", "red-square", "words", "emergency", "911" ], - char: "\ud83c\udd98", - fitzpatrick_scale: false, - category: "symbols" - }, - no_entry: { - keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ], - char: "\u26d4", - fitzpatrick_scale: false, - category: "symbols" - }, - name_badge: { - keywords: [ "fire", "forbid" ], - char: "\ud83d\udcdb", - fitzpatrick_scale: false, - category: "symbols" - }, - no_entry_sign: { - keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ], - char: "\ud83d\udeab", - fitzpatrick_scale: false, - category: "symbols" - }, - x: { - keywords: [ "no", "delete", "remove", "cancel", "red" ], - char: "\u274c", - fitzpatrick_scale: false, - category: "symbols" - }, - o: { - keywords: [ "circle", "round" ], - char: "\u2b55", - fitzpatrick_scale: false, - category: "symbols" - }, - stop_sign: { - keywords: [ "stop" ], - char: "\ud83d\uded1", - fitzpatrick_scale: false, - category: "symbols" - }, - anger: { - keywords: [ "angry", "mad" ], - char: "\ud83d\udca2", - fitzpatrick_scale: false, - category: "symbols" - }, - hotsprings: { - keywords: [ "bath", "warm", "relax" ], - char: "\u2668\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - no_pedestrians: { - keywords: [ "rules", "crossing", "walking", "circle" ], - char: "\ud83d\udeb7", - fitzpatrick_scale: false, - category: "symbols" - }, - do_not_litter: { - keywords: [ "trash", "bin", "garbage", "circle" ], - char: "\ud83d\udeaf", - fitzpatrick_scale: false, - category: "symbols" - }, - no_bicycles: { - keywords: [ "cyclist", "prohibited", "circle" ], - char: "\ud83d\udeb3", - fitzpatrick_scale: false, - category: "symbols" - }, - "non-potable_water": { - keywords: [ "drink", "faucet", "tap", "circle" ], - char: "\ud83d\udeb1", - fitzpatrick_scale: false, - category: "symbols" - }, - underage: { - keywords: [ "18", "drink", "pub", "night", "minor", "circle" ], - char: "\ud83d\udd1e", - fitzpatrick_scale: false, - category: "symbols" - }, - no_mobile_phones: { - keywords: [ "iphone", "mute", "circle" ], - char: "\ud83d\udcf5", - fitzpatrick_scale: false, - category: "symbols" - }, - exclamation: { - keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ], - char: "\u2757", - fitzpatrick_scale: false, - category: "symbols" - }, - grey_exclamation: { - keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ], - char: "\u2755", - fitzpatrick_scale: false, - category: "symbols" - }, - question: { - keywords: [ "doubt", "confused" ], - char: "\u2753", - fitzpatrick_scale: false, - category: "symbols" - }, - grey_question: { - keywords: [ "doubts", "gray", "huh", "confused" ], - char: "\u2754", - fitzpatrick_scale: false, - category: "symbols" - }, - bangbang: { - keywords: [ "exclamation", "surprise" ], - char: "\u203c\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - interrobang: { - keywords: [ "wat", "punctuation", "surprise" ], - char: "\u2049\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - 100: { - keywords: [ "score", "perfect", "numbers", "century", "exam", "quiz", "test", "pass", "hundred" ], - char: "\ud83d\udcaf", - fitzpatrick_scale: false, - category: "symbols" - }, - low_brightness: { - keywords: [ "sun", "afternoon", "warm", "summer" ], - char: "\ud83d\udd05", - fitzpatrick_scale: false, - category: "symbols" - }, - high_brightness: { - keywords: [ "sun", "light" ], - char: "\ud83d\udd06", - fitzpatrick_scale: false, - category: "symbols" - }, - trident: { - keywords: [ "weapon", "spear" ], - char: "\ud83d\udd31", - fitzpatrick_scale: false, - category: "symbols" - }, - fleur_de_lis: { - keywords: [ "decorative", "scout" ], - char: "\u269c", - fitzpatrick_scale: false, - category: "symbols" - }, - part_alternation_mark: { - keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ], - char: "\u303d\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - warning: { - keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ], - char: "\u26a0\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - children_crossing: { - keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ], - char: "\ud83d\udeb8", - fitzpatrick_scale: false, - category: "symbols" - }, - beginner: { - keywords: [ "badge", "shield" ], - char: "\ud83d\udd30", - fitzpatrick_scale: false, - category: "symbols" - }, - recycle: { - keywords: [ "arrow", "environment", "garbage", "trash" ], - char: "\u267b\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - u6307: { - keywords: [ "chinese", "point", "green-square", "kanji" ], - char: "\ud83c\ude2f", - fitzpatrick_scale: false, - category: "symbols" - }, - chart: { - keywords: [ "green-square", "graph", "presentation", "stats" ], - char: "\ud83d\udcb9", - fitzpatrick_scale: false, - category: "symbols" - }, - sparkle: { - keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ], - char: "\u2747\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - eight_spoked_asterisk: { - keywords: [ "star", "sparkle", "green-square" ], - char: "\u2733\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - negative_squared_cross_mark: { - keywords: [ "x", "green-square", "no", "deny" ], - char: "\u274e", - fitzpatrick_scale: false, - category: "symbols" - }, - white_check_mark: { - keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ], - char: "\u2705", - fitzpatrick_scale: false, - category: "symbols" - }, - diamond_shape_with_a_dot_inside: { - keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ], - char: "\ud83d\udca0", - fitzpatrick_scale: false, - category: "symbols" - }, - cyclone: { - keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ], - char: "\ud83c\udf00", - fitzpatrick_scale: false, - category: "symbols" - }, - loop: { - keywords: [ "tape", "cassette" ], - char: "\u27bf", - fitzpatrick_scale: false, - category: "symbols" - }, - globe_with_meridians: { - keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ], - char: "\ud83c\udf10", - fitzpatrick_scale: false, - category: "symbols" - }, - m: { - keywords: [ "alphabet", "blue-circle", "letter" ], - char: "\u24c2\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - atm: { - keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ], - char: "\ud83c\udfe7", - fitzpatrick_scale: false, - category: "symbols" - }, - sa: { - keywords: [ "japanese", "blue-square", "katakana" ], - char: "\ud83c\ude02\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - passport_control: { - keywords: [ "custom", "blue-square" ], - char: "\ud83d\udec2", - fitzpatrick_scale: false, - category: "symbols" - }, - customs: { - keywords: [ "passport", "border", "blue-square" ], - char: "\ud83d\udec3", - fitzpatrick_scale: false, - category: "symbols" - }, - baggage_claim: { - keywords: [ "blue-square", "airport", "transport" ], - char: "\ud83d\udec4", - fitzpatrick_scale: false, - category: "symbols" - }, - left_luggage: { - keywords: [ "blue-square", "travel" ], - char: "\ud83d\udec5", - fitzpatrick_scale: false, - category: "symbols" - }, - wheelchair: { - keywords: [ "blue-square", "disabled", "a11y", "accessibility" ], - char: "\u267f", - fitzpatrick_scale: false, - category: "symbols" - }, - no_smoking: { - keywords: [ "cigarette", "blue-square", "smell", "smoke" ], - char: "\ud83d\udead", - fitzpatrick_scale: false, - category: "symbols" - }, - wc: { - keywords: [ "toilet", "restroom", "blue-square" ], - char: "\ud83d\udebe", - fitzpatrick_scale: false, - category: "symbols" - }, - parking: { - keywords: [ "cars", "blue-square", "alphabet", "letter" ], - char: "\ud83c\udd7f\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - potable_water: { - keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ], - char: "\ud83d\udeb0", - fitzpatrick_scale: false, - category: "symbols" - }, - mens: { - keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ], - char: "\ud83d\udeb9", - fitzpatrick_scale: false, - category: "symbols" - }, - womens: { - keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ], - char: "\ud83d\udeba", - fitzpatrick_scale: false, - category: "symbols" - }, - baby_symbol: { - keywords: [ "orange-square", "child" ], - char: "\ud83d\udebc", - fitzpatrick_scale: false, - category: "symbols" - }, - restroom: { - keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ], - char: "\ud83d\udebb", - fitzpatrick_scale: false, - category: "symbols" - }, - put_litter_in_its_place: { - keywords: [ "blue-square", "sign", "human", "info" ], - char: "\ud83d\udeae", - fitzpatrick_scale: false, - category: "symbols" - }, - cinema: { - keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ], - char: "\ud83c\udfa6", - fitzpatrick_scale: false, - category: "symbols" - }, - signal_strength: { - keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ], - char: "\ud83d\udcf6", - fitzpatrick_scale: false, - category: "symbols" - }, - koko: { - keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ], - char: "\ud83c\ude01", - fitzpatrick_scale: false, - category: "symbols" - }, - ng: { - keywords: [ "blue-square", "words", "shape", "icon" ], - char: "\ud83c\udd96", - fitzpatrick_scale: false, - category: "symbols" - }, - ok: { - keywords: [ "good", "agree", "yes", "blue-square" ], - char: "\ud83c\udd97", - fitzpatrick_scale: false, - category: "symbols" - }, - up: { - keywords: [ "blue-square", "above", "high" ], - char: "\ud83c\udd99", - fitzpatrick_scale: false, - category: "symbols" - }, - cool: { - keywords: [ "words", "blue-square" ], - char: "\ud83c\udd92", - fitzpatrick_scale: false, - category: "symbols" - }, - new: { - keywords: [ "blue-square", "words", "start" ], - char: "\ud83c\udd95", - fitzpatrick_scale: false, - category: "symbols" - }, - free: { - keywords: [ "blue-square", "words" ], - char: "\ud83c\udd93", - fitzpatrick_scale: false, - category: "symbols" - }, - zero: { - keywords: [ "0", "numbers", "blue-square", "null" ], - char: "0\ufe0f\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - one: { - keywords: [ "blue-square", "numbers", "1" ], - char: "1\ufe0f\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - two: { - keywords: [ "numbers", "2", "prime", "blue-square" ], - char: "2\ufe0f\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - three: { - keywords: [ "3", "numbers", "prime", "blue-square" ], - char: "3\ufe0f\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - four: { - keywords: [ "4", "numbers", "blue-square" ], - char: "4\ufe0f\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - five: { - keywords: [ "5", "numbers", "blue-square", "prime" ], - char: "5\ufe0f\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - six: { - keywords: [ "6", "numbers", "blue-square" ], - char: "6\ufe0f\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - seven: { - keywords: [ "7", "numbers", "blue-square", "prime" ], - char: "7\ufe0f\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - eight: { - keywords: [ "8", "blue-square", "numbers" ], - char: "8\ufe0f\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - nine: { - keywords: [ "blue-square", "numbers", "9" ], - char: "9\ufe0f\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - keycap_ten: { - keywords: [ "numbers", "10", "blue-square" ], - char: "\ud83d\udd1f", - fitzpatrick_scale: false, - category: "symbols" - }, - asterisk: { - keywords: [ "star", "keycap" ], - char: "*\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - 1234: { - keywords: [ "numbers", "blue-square" ], - char: "\ud83d\udd22", - fitzpatrick_scale: false, - category: "symbols" - }, - eject_button: { - keywords: [ "blue-square" ], - char: "\u23cf\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_forward: { - keywords: [ "blue-square", "right", "direction", "play" ], - char: "\u25b6\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - pause_button: { - keywords: [ "pause", "blue-square" ], - char: "\u23f8", - fitzpatrick_scale: false, - category: "symbols" - }, - next_track_button: { - keywords: [ "forward", "next", "blue-square" ], - char: "\u23ed", - fitzpatrick_scale: false, - category: "symbols" - }, - stop_button: { - keywords: [ "blue-square" ], - char: "\u23f9", - fitzpatrick_scale: false, - category: "symbols" - }, - record_button: { - keywords: [ "blue-square" ], - char: "\u23fa", - fitzpatrick_scale: false, - category: "symbols" - }, - play_or_pause_button: { - keywords: [ "blue-square", "play", "pause" ], - char: "\u23ef", - fitzpatrick_scale: false, - category: "symbols" - }, - previous_track_button: { - keywords: [ "backward" ], - char: "\u23ee", - fitzpatrick_scale: false, - category: "symbols" - }, - fast_forward: { - keywords: [ "blue-square", "play", "speed", "continue" ], - char: "\u23e9", - fitzpatrick_scale: false, - category: "symbols" - }, - rewind: { - keywords: [ "play", "blue-square" ], - char: "\u23ea", - fitzpatrick_scale: false, - category: "symbols" - }, - twisted_rightwards_arrows: { - keywords: [ "blue-square", "shuffle", "music", "random" ], - char: "\ud83d\udd00", - fitzpatrick_scale: false, - category: "symbols" - }, - repeat: { - keywords: [ "loop", "record" ], - char: "\ud83d\udd01", - fitzpatrick_scale: false, - category: "symbols" - }, - repeat_one: { - keywords: [ "blue-square", "loop" ], - char: "\ud83d\udd02", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_backward: { - keywords: [ "blue-square", "left", "direction" ], - char: "\u25c0\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_up_small: { - keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ], - char: "\ud83d\udd3c", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_down_small: { - keywords: [ "blue-square", "direction", "bottom" ], - char: "\ud83d\udd3d", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_double_up: { - keywords: [ "blue-square", "direction", "top" ], - char: "\u23eb", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_double_down: { - keywords: [ "blue-square", "direction", "bottom" ], - char: "\u23ec", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_right: { - keywords: [ "blue-square", "next" ], - char: "\u27a1\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_left: { - keywords: [ "blue-square", "previous", "back" ], - char: "\u2b05\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_up: { - keywords: [ "blue-square", "continue", "top", "direction" ], - char: "\u2b06\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_down: { - keywords: [ "blue-square", "direction", "bottom" ], - char: "\u2b07\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_upper_right: { - keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ], - char: "\u2197\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_lower_right: { - keywords: [ "blue-square", "direction", "diagonal", "southeast" ], - char: "\u2198\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_lower_left: { - keywords: [ "blue-square", "direction", "diagonal", "southwest" ], - char: "\u2199\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_upper_left: { - keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ], - char: "\u2196\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_up_down: { - keywords: [ "blue-square", "direction", "way", "vertical" ], - char: "\u2195\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - left_right_arrow: { - keywords: [ "shape", "direction", "horizontal", "sideways" ], - char: "\u2194\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrows_counterclockwise: { - keywords: [ "blue-square", "sync", "cycle" ], - char: "\ud83d\udd04", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_right_hook: { - keywords: [ "blue-square", "return", "rotate", "direction" ], - char: "\u21aa\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - leftwards_arrow_with_hook: { - keywords: [ "back", "return", "blue-square", "undo", "enter" ], - char: "\u21a9\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_heading_up: { - keywords: [ "blue-square", "direction", "top" ], - char: "\u2934\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrow_heading_down: { - keywords: [ "blue-square", "direction", "bottom" ], - char: "\u2935\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - hash: { - keywords: [ "symbol", "blue-square", "twitter" ], - char: "#\ufe0f\u20e3", - fitzpatrick_scale: false, - category: "symbols" - }, - information_source: { - keywords: [ "blue-square", "alphabet", "letter" ], - char: "\u2139\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - abc: { - keywords: [ "blue-square", "alphabet" ], - char: "\ud83d\udd24", - fitzpatrick_scale: false, - category: "symbols" - }, - abcd: { - keywords: [ "blue-square", "alphabet" ], - char: "\ud83d\udd21", - fitzpatrick_scale: false, - category: "symbols" - }, - capital_abcd: { - keywords: [ "alphabet", "words", "blue-square" ], - char: "\ud83d\udd20", - fitzpatrick_scale: false, - category: "symbols" - }, - symbols: { - keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ], - char: "\ud83d\udd23", - fitzpatrick_scale: false, - category: "symbols" - }, - musical_note: { - keywords: [ "score", "tone", "sound" ], - char: "\ud83c\udfb5", - fitzpatrick_scale: false, - category: "symbols" - }, - notes: { - keywords: [ "music", "score" ], - char: "\ud83c\udfb6", - fitzpatrick_scale: false, - category: "symbols" - }, - wavy_dash: { - keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ], - char: "\u3030\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - curly_loop: { - keywords: [ "scribble", "draw", "shape", "squiggle" ], - char: "\u27b0", - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_check_mark: { - keywords: [ "ok", "nike", "answer", "yes", "tick" ], - char: "\u2714\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - arrows_clockwise: { - keywords: [ "sync", "cycle", "round", "repeat" ], - char: "\ud83d\udd03", - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_plus_sign: { - keywords: [ "math", "calculation", "addition", "more", "increase" ], - char: "\u2795", - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_minus_sign: { - keywords: [ "math", "calculation", "subtract", "less" ], - char: "\u2796", - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_division_sign: { - keywords: [ "divide", "math", "calculation" ], - char: "\u2797", - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_multiplication_x: { - keywords: [ "math", "calculation" ], - char: "\u2716\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - infinity: { - keywords: [ "forever" ], - char: "\u267e", - fitzpatrick_scale: false, - category: "symbols" - }, - heavy_dollar_sign: { - keywords: [ "money", "sales", "payment", "currency", "buck" ], - char: "\ud83d\udcb2", - fitzpatrick_scale: false, - category: "symbols" - }, - currency_exchange: { - keywords: [ "money", "sales", "dollar", "travel" ], - char: "\ud83d\udcb1", - fitzpatrick_scale: false, - category: "symbols" - }, - copyright: { - keywords: [ "ip", "license", "circle", "law", "legal" ], - char: "\xa9\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - registered: { - keywords: [ "alphabet", "circle" ], - char: "\xae\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - tm: { - keywords: [ "trademark", "brand", "law", "legal" ], - char: "\u2122\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - end: { - keywords: [ "words", "arrow" ], - char: "\ud83d\udd1a", - fitzpatrick_scale: false, - category: "symbols" - }, - back: { - keywords: [ "arrow", "words", "return" ], - char: "\ud83d\udd19", - fitzpatrick_scale: false, - category: "symbols" - }, - on: { - keywords: [ "arrow", "words" ], - char: "\ud83d\udd1b", - fitzpatrick_scale: false, - category: "symbols" - }, - top: { - keywords: [ "words", "blue-square" ], - char: "\ud83d\udd1d", - fitzpatrick_scale: false, - category: "symbols" - }, - soon: { - keywords: [ "arrow", "words" ], - char: "\ud83d\udd1c", - fitzpatrick_scale: false, - category: "symbols" - }, - ballot_box_with_check: { - keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ], - char: "\u2611\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - radio_button: { - keywords: [ "input", "old", "music", "circle" ], - char: "\ud83d\udd18", - fitzpatrick_scale: false, - category: "symbols" - }, - white_circle: { - keywords: [ "shape", "round" ], - char: "\u26aa", - fitzpatrick_scale: false, - category: "symbols" - }, - black_circle: { - keywords: [ "shape", "button", "round" ], - char: "\u26ab", - fitzpatrick_scale: false, - category: "symbols" - }, - red_circle: { - keywords: [ "shape", "error", "danger" ], - char: "\ud83d\udd34", - fitzpatrick_scale: false, - category: "symbols" - }, - large_blue_circle: { - keywords: [ "shape", "icon", "button" ], - char: "\ud83d\udd35", - fitzpatrick_scale: false, - category: "symbols" - }, - small_orange_diamond: { - keywords: [ "shape", "jewel", "gem" ], - char: "\ud83d\udd38", - fitzpatrick_scale: false, - category: "symbols" - }, - small_blue_diamond: { - keywords: [ "shape", "jewel", "gem" ], - char: "\ud83d\udd39", - fitzpatrick_scale: false, - category: "symbols" - }, - large_orange_diamond: { - keywords: [ "shape", "jewel", "gem" ], - char: "\ud83d\udd36", - fitzpatrick_scale: false, - category: "symbols" - }, - large_blue_diamond: { - keywords: [ "shape", "jewel", "gem" ], - char: "\ud83d\udd37", - fitzpatrick_scale: false, - category: "symbols" - }, - small_red_triangle: { - keywords: [ "shape", "direction", "up", "top" ], - char: "\ud83d\udd3a", - fitzpatrick_scale: false, - category: "symbols" - }, - black_small_square: { - keywords: [ "shape", "icon" ], - char: "\u25aa\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - white_small_square: { - keywords: [ "shape", "icon" ], - char: "\u25ab\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - black_large_square: { - keywords: [ "shape", "icon", "button" ], - char: "\u2b1b", - fitzpatrick_scale: false, - category: "symbols" - }, - white_large_square: { - keywords: [ "shape", "icon", "stone", "button" ], - char: "\u2b1c", - fitzpatrick_scale: false, - category: "symbols" - }, - small_red_triangle_down: { - keywords: [ "shape", "direction", "bottom" ], - char: "\ud83d\udd3b", - fitzpatrick_scale: false, - category: "symbols" - }, - black_medium_square: { - keywords: [ "shape", "button", "icon" ], - char: "\u25fc\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - white_medium_square: { - keywords: [ "shape", "stone", "icon" ], - char: "\u25fb\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - black_medium_small_square: { - keywords: [ "icon", "shape", "button" ], - char: "\u25fe", - fitzpatrick_scale: false, - category: "symbols" - }, - white_medium_small_square: { - keywords: [ "shape", "stone", "icon", "button" ], - char: "\u25fd", - fitzpatrick_scale: false, - category: "symbols" - }, - black_square_button: { - keywords: [ "shape", "input", "frame" ], - char: "\ud83d\udd32", - fitzpatrick_scale: false, - category: "symbols" - }, - white_square_button: { - keywords: [ "shape", "input" ], - char: "\ud83d\udd33", - fitzpatrick_scale: false, - category: "symbols" - }, - speaker: { - keywords: [ "sound", "volume", "silence", "broadcast" ], - char: "\ud83d\udd08", - fitzpatrick_scale: false, - category: "symbols" - }, - sound: { - keywords: [ "volume", "speaker", "broadcast" ], - char: "\ud83d\udd09", - fitzpatrick_scale: false, - category: "symbols" - }, - loud_sound: { - keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ], - char: "\ud83d\udd0a", - fitzpatrick_scale: false, - category: "symbols" - }, - mute: { - keywords: [ "sound", "volume", "silence", "quiet" ], - char: "\ud83d\udd07", - fitzpatrick_scale: false, - category: "symbols" - }, - mega: { - keywords: [ "sound", "speaker", "volume" ], - char: "\ud83d\udce3", - fitzpatrick_scale: false, - category: "symbols" - }, - loudspeaker: { - keywords: [ "volume", "sound" ], - char: "\ud83d\udce2", - fitzpatrick_scale: false, - category: "symbols" - }, - bell: { - keywords: [ "sound", "notification", "christmas", "xmas", "chime" ], - char: "\ud83d\udd14", - fitzpatrick_scale: false, - category: "symbols" - }, - no_bell: { - keywords: [ "sound", "volume", "mute", "quiet", "silent" ], - char: "\ud83d\udd15", - fitzpatrick_scale: false, - category: "symbols" - }, - black_joker: { - keywords: [ "poker", "cards", "game", "play", "magic" ], - char: "\ud83c\udccf", - fitzpatrick_scale: false, - category: "symbols" - }, - mahjong: { - keywords: [ "game", "play", "chinese", "kanji" ], - char: "\ud83c\udc04", - fitzpatrick_scale: false, - category: "symbols" - }, - spades: { - keywords: [ "poker", "cards", "suits", "magic" ], - char: "\u2660\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - clubs: { - keywords: [ "poker", "cards", "magic", "suits" ], - char: "\u2663\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - hearts: { - keywords: [ "poker", "cards", "magic", "suits" ], - char: "\u2665\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - diamonds: { - keywords: [ "poker", "cards", "magic", "suits" ], - char: "\u2666\ufe0f", - fitzpatrick_scale: false, - category: "symbols" - }, - flower_playing_cards: { - keywords: [ "game", "sunset", "red" ], - char: "\ud83c\udfb4", - fitzpatrick_scale: false, - category: "symbols" - }, - thought_balloon: { - keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ], - char: "\ud83d\udcad", - fitzpatrick_scale: false, - category: "symbols" - }, - right_anger_bubble: { - keywords: [ "caption", "speech", "thinking", "mad" ], - char: "\ud83d\uddef", - fitzpatrick_scale: false, - category: "symbols" - }, - speech_balloon: { - keywords: [ "bubble", "words", "message", "talk", "chatting" ], - char: "\ud83d\udcac", - fitzpatrick_scale: false, - category: "symbols" - }, - left_speech_bubble: { - keywords: [ "words", "message", "talk", "chatting" ], - char: "\ud83d\udde8", - fitzpatrick_scale: false, - category: "symbols" - }, - clock1: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd50", - fitzpatrick_scale: false, - category: "symbols" - }, - clock2: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd51", - fitzpatrick_scale: false, - category: "symbols" - }, - clock3: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd52", - fitzpatrick_scale: false, - category: "symbols" - }, - clock4: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd53", - fitzpatrick_scale: false, - category: "symbols" - }, - clock5: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd54", - fitzpatrick_scale: false, - category: "symbols" - }, - clock6: { - keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ], - char: "\ud83d\udd55", - fitzpatrick_scale: false, - category: "symbols" - }, - clock7: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd56", - fitzpatrick_scale: false, - category: "symbols" - }, - clock8: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd57", - fitzpatrick_scale: false, - category: "symbols" - }, - clock9: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd58", - fitzpatrick_scale: false, - category: "symbols" - }, - clock10: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd59", - fitzpatrick_scale: false, - category: "symbols" - }, - clock11: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd5a", - fitzpatrick_scale: false, - category: "symbols" - }, - clock12: { - keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ], - char: "\ud83d\udd5b", - fitzpatrick_scale: false, - category: "symbols" - }, - clock130: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd5c", - fitzpatrick_scale: false, - category: "symbols" - }, - clock230: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd5d", - fitzpatrick_scale: false, - category: "symbols" - }, - clock330: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd5e", - fitzpatrick_scale: false, - category: "symbols" - }, - clock430: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd5f", - fitzpatrick_scale: false, - category: "symbols" - }, - clock530: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd60", - fitzpatrick_scale: false, - category: "symbols" - }, - clock630: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd61", - fitzpatrick_scale: false, - category: "symbols" - }, - clock730: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd62", - fitzpatrick_scale: false, - category: "symbols" - }, - clock830: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd63", - fitzpatrick_scale: false, - category: "symbols" - }, - clock930: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd64", - fitzpatrick_scale: false, - category: "symbols" - }, - clock1030: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd65", - fitzpatrick_scale: false, - category: "symbols" - }, - clock1130: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd66", - fitzpatrick_scale: false, - category: "symbols" - }, - clock1230: { - keywords: [ "time", "late", "early", "schedule" ], - char: "\ud83d\udd67", - fitzpatrick_scale: false, - category: "symbols" - }, - afghanistan: { - keywords: [ "af", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddeb", - fitzpatrick_scale: false, - category: "flags" - }, - aland_islands: { - keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddfd", - fitzpatrick_scale: false, - category: "flags" - }, - albania: { - keywords: [ "al", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddf1", - fitzpatrick_scale: false, - category: "flags" - }, - algeria: { - keywords: [ "dz", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde9\ud83c\uddff", - fitzpatrick_scale: false, - category: "flags" - }, - american_samoa: { - keywords: [ "american", "ws", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - andorra: { - keywords: [ "ad", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\udde9", - fitzpatrick_scale: false, - category: "flags" - }, - angola: { - keywords: [ "ao", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - anguilla: { - keywords: [ "ai", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddee", - fitzpatrick_scale: false, - category: "flags" - }, - antarctica: { - keywords: [ "aq", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddf6", - fitzpatrick_scale: false, - category: "flags" - }, - antigua_barbuda: { - keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - argentina: { - keywords: [ "ar", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - armenia: { - keywords: [ "am", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - aruba: { - keywords: [ "aw", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddfc", - fitzpatrick_scale: false, - category: "flags" - }, - australia: { - keywords: [ "au", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddfa", - fitzpatrick_scale: false, - category: "flags" - }, - austria: { - keywords: [ "at", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - azerbaijan: { - keywords: [ "az", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddff", - fitzpatrick_scale: false, - category: "flags" - }, - bahamas: { - keywords: [ "bs", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - bahrain: { - keywords: [ "bh", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\udded", - fitzpatrick_scale: false, - category: "flags" - }, - bangladesh: { - keywords: [ "bd", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\udde9", - fitzpatrick_scale: false, - category: "flags" - }, - barbados: { - keywords: [ "bb", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\udde7", - fitzpatrick_scale: false, - category: "flags" - }, - belarus: { - keywords: [ "by", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddfe", - fitzpatrick_scale: false, - category: "flags" - }, - belgium: { - keywords: [ "be", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - belize: { - keywords: [ "bz", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddff", - fitzpatrick_scale: false, - category: "flags" - }, - benin: { - keywords: [ "bj", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddef", - fitzpatrick_scale: false, - category: "flags" - }, - bermuda: { - keywords: [ "bm", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - bhutan: { - keywords: [ "bt", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - bolivia: { - keywords: [ "bo", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - caribbean_netherlands: { - keywords: [ "bonaire", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddf6", - fitzpatrick_scale: false, - category: "flags" - }, - bosnia_herzegovina: { - keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - botswana: { - keywords: [ "bw", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddfc", - fitzpatrick_scale: false, - category: "flags" - }, - brazil: { - keywords: [ "br", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - british_indian_ocean_territory: { - keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddee\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - british_virgin_islands: { - keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfb\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - brunei: { - keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - bulgaria: { - keywords: [ "bg", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - burkina_faso: { - keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddeb", - fitzpatrick_scale: false, - category: "flags" - }, - burundi: { - keywords: [ "bi", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddee", - fitzpatrick_scale: false, - category: "flags" - }, - cape_verde: { - keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddfb", - fitzpatrick_scale: false, - category: "flags" - }, - cambodia: { - keywords: [ "kh", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf0\ud83c\udded", - fitzpatrick_scale: false, - category: "flags" - }, - cameroon: { - keywords: [ "cm", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - canada: { - keywords: [ "ca", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - canary_islands: { - keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddee\ud83c\udde8", - fitzpatrick_scale: false, - category: "flags" - }, - cayman_islands: { - keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf0\ud83c\uddfe", - fitzpatrick_scale: false, - category: "flags" - }, - central_african_republic: { - keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddeb", - fitzpatrick_scale: false, - category: "flags" - }, - chad: { - keywords: [ "td", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\udde9", - fitzpatrick_scale: false, - category: "flags" - }, - chile: { - keywords: [ "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddf1", - fitzpatrick_scale: false, - category: "flags" - }, - cn: { - keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ], - char: "\ud83c\udde8\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - christmas_island: { - keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddfd", - fitzpatrick_scale: false, - category: "flags" - }, - cocos_islands: { - keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\udde8", - fitzpatrick_scale: false, - category: "flags" - }, - colombia: { - keywords: [ "co", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - comoros: { - keywords: [ "km", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf0\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - congo_brazzaville: { - keywords: [ "congo", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - congo_kinshasa: { - keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\udde9", - fitzpatrick_scale: false, - category: "flags" - }, - cook_islands: { - keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddf0", - fitzpatrick_scale: false, - category: "flags" - }, - costa_rica: { - keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - croatia: { - keywords: [ "hr", "flag", "nation", "country", "banner" ], - char: "\ud83c\udded\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - cuba: { - keywords: [ "cu", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddfa", - fitzpatrick_scale: false, - category: "flags" - }, - curacao: { - keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddfc", - fitzpatrick_scale: false, - category: "flags" - }, - cyprus: { - keywords: [ "cy", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddfe", - fitzpatrick_scale: false, - category: "flags" - }, - czech_republic: { - keywords: [ "cz", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddff", - fitzpatrick_scale: false, - category: "flags" - }, - denmark: { - keywords: [ "dk", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde9\ud83c\uddf0", - fitzpatrick_scale: false, - category: "flags" - }, - djibouti: { - keywords: [ "dj", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde9\ud83c\uddef", - fitzpatrick_scale: false, - category: "flags" - }, - dominica: { - keywords: [ "dm", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde9\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - dominican_republic: { - keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde9\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - ecuador: { - keywords: [ "ec", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddea\ud83c\udde8", - fitzpatrick_scale: false, - category: "flags" - }, - egypt: { - keywords: [ "eg", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddea\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - el_salvador: { - keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddfb", - fitzpatrick_scale: false, - category: "flags" - }, - equatorial_guinea: { - keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddf6", - fitzpatrick_scale: false, - category: "flags" - }, - eritrea: { - keywords: [ "er", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddea\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - estonia: { - keywords: [ "ee", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddea\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - ethiopia: { - keywords: [ "et", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddea\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - eu: { - keywords: [ "european", "union", "flag", "banner" ], - char: "\ud83c\uddea\ud83c\uddfa", - fitzpatrick_scale: false, - category: "flags" - }, - falkland_islands: { - keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddeb\ud83c\uddf0", - fitzpatrick_scale: false, - category: "flags" - }, - faroe_islands: { - keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddeb\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - fiji: { - keywords: [ "fj", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddeb\ud83c\uddef", - fitzpatrick_scale: false, - category: "flags" - }, - finland: { - keywords: [ "fi", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddeb\ud83c\uddee", - fitzpatrick_scale: false, - category: "flags" - }, - fr: { - keywords: [ "banner", "flag", "nation", "france", "french", "country" ], - char: "\ud83c\uddeb\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - french_guiana: { - keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddeb", - fitzpatrick_scale: false, - category: "flags" - }, - french_polynesia: { - keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddeb", - fitzpatrick_scale: false, - category: "flags" - }, - french_southern_territories: { - keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddeb", - fitzpatrick_scale: false, - category: "flags" - }, - gabon: { - keywords: [ "ga", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - gambia: { - keywords: [ "gm", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - georgia: { - keywords: [ "ge", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - de: { - keywords: [ "german", "nation", "flag", "country", "banner" ], - char: "\ud83c\udde9\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - ghana: { - keywords: [ "gh", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\udded", - fitzpatrick_scale: false, - category: "flags" - }, - gibraltar: { - keywords: [ "gi", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddee", - fitzpatrick_scale: false, - category: "flags" - }, - greece: { - keywords: [ "gr", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - greenland: { - keywords: [ "gl", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddf1", - fitzpatrick_scale: false, - category: "flags" - }, - grenada: { - keywords: [ "gd", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\udde9", - fitzpatrick_scale: false, - category: "flags" - }, - guadeloupe: { - keywords: [ "gp", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddf5", - fitzpatrick_scale: false, - category: "flags" - }, - guam: { - keywords: [ "gu", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddfa", - fitzpatrick_scale: false, - category: "flags" - }, - guatemala: { - keywords: [ "gt", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - guernsey: { - keywords: [ "gg", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - guinea: { - keywords: [ "gn", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - guinea_bissau: { - keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddfc", - fitzpatrick_scale: false, - category: "flags" - }, - guyana: { - keywords: [ "gy", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddfe", - fitzpatrick_scale: false, - category: "flags" - }, - haiti: { - keywords: [ "ht", "flag", "nation", "country", "banner" ], - char: "\ud83c\udded\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - honduras: { - keywords: [ "hn", "flag", "nation", "country", "banner" ], - char: "\ud83c\udded\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - hong_kong: { - keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ], - char: "\ud83c\udded\ud83c\uddf0", - fitzpatrick_scale: false, - category: "flags" - }, - hungary: { - keywords: [ "hu", "flag", "nation", "country", "banner" ], - char: "\ud83c\udded\ud83c\uddfa", - fitzpatrick_scale: false, - category: "flags" - }, - iceland: { - keywords: [ "is", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddee\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - india: { - keywords: [ "in", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddee\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - indonesia: { - keywords: [ "flag", "nation", "country", "banner" ], - char: "\ud83c\uddee\ud83c\udde9", - fitzpatrick_scale: false, - category: "flags" - }, - iran: { - keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddee\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - iraq: { - keywords: [ "iq", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddee\ud83c\uddf6", - fitzpatrick_scale: false, - category: "flags" - }, - ireland: { - keywords: [ "ie", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddee\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - isle_of_man: { - keywords: [ "isle", "man", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddee\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - israel: { - keywords: [ "il", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddee\ud83c\uddf1", - fitzpatrick_scale: false, - category: "flags" - }, - it: { - keywords: [ "italy", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddee\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - cote_divoire: { - keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\uddee", - fitzpatrick_scale: false, - category: "flags" - }, - jamaica: { - keywords: [ "jm", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddef\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - jp: { - keywords: [ "japanese", "nation", "flag", "country", "banner" ], - char: "\ud83c\uddef\ud83c\uddf5", - fitzpatrick_scale: false, - category: "flags" - }, - jersey: { - keywords: [ "je", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddef\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - jordan: { - keywords: [ "jo", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddef\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - kazakhstan: { - keywords: [ "kz", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf0\ud83c\uddff", - fitzpatrick_scale: false, - category: "flags" - }, - kenya: { - keywords: [ "ke", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf0\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - kiribati: { - keywords: [ "ki", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf0\ud83c\uddee", - fitzpatrick_scale: false, - category: "flags" - }, - kosovo: { - keywords: [ "xk", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfd\ud83c\uddf0", - fitzpatrick_scale: false, - category: "flags" - }, - kuwait: { - keywords: [ "kw", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf0\ud83c\uddfc", - fitzpatrick_scale: false, - category: "flags" - }, - kyrgyzstan: { - keywords: [ "kg", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf0\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - laos: { - keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf1\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - latvia: { - keywords: [ "lv", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf1\ud83c\uddfb", - fitzpatrick_scale: false, - category: "flags" - }, - lebanon: { - keywords: [ "lb", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf1\ud83c\udde7", - fitzpatrick_scale: false, - category: "flags" - }, - lesotho: { - keywords: [ "ls", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf1\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - liberia: { - keywords: [ "lr", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf1\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - libya: { - keywords: [ "ly", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf1\ud83c\uddfe", - fitzpatrick_scale: false, - category: "flags" - }, - liechtenstein: { - keywords: [ "li", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf1\ud83c\uddee", - fitzpatrick_scale: false, - category: "flags" - }, - lithuania: { - keywords: [ "lt", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf1\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - luxembourg: { - keywords: [ "lu", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf1\ud83c\uddfa", - fitzpatrick_scale: false, - category: "flags" - }, - macau: { - keywords: [ "macao", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - macedonia: { - keywords: [ "macedonia,", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddf0", - fitzpatrick_scale: false, - category: "flags" - }, - madagascar: { - keywords: [ "mg", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - malawi: { - keywords: [ "mw", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddfc", - fitzpatrick_scale: false, - category: "flags" - }, - malaysia: { - keywords: [ "my", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddfe", - fitzpatrick_scale: false, - category: "flags" - }, - maldives: { - keywords: [ "mv", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddfb", - fitzpatrick_scale: false, - category: "flags" - }, - mali: { - keywords: [ "ml", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddf1", - fitzpatrick_scale: false, - category: "flags" - }, - malta: { - keywords: [ "mt", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - marshall_islands: { - keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\udded", - fitzpatrick_scale: false, - category: "flags" - }, - martinique: { - keywords: [ "mq", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddf6", - fitzpatrick_scale: false, - category: "flags" - }, - mauritania: { - keywords: [ "mr", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - mauritius: { - keywords: [ "mu", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddfa", - fitzpatrick_scale: false, - category: "flags" - }, - mayotte: { - keywords: [ "yt", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfe\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - mexico: { - keywords: [ "mx", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddfd", - fitzpatrick_scale: false, - category: "flags" - }, - micronesia: { - keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddeb\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - moldova: { - keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\udde9", - fitzpatrick_scale: false, - category: "flags" - }, - monaco: { - keywords: [ "mc", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\udde8", - fitzpatrick_scale: false, - category: "flags" - }, - mongolia: { - keywords: [ "mn", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - montenegro: { - keywords: [ "me", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - montserrat: { - keywords: [ "ms", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - morocco: { - keywords: [ "ma", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - mozambique: { - keywords: [ "mz", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddff", - fitzpatrick_scale: false, - category: "flags" - }, - myanmar: { - keywords: [ "mm", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - namibia: { - keywords: [ "na", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - nauru: { - keywords: [ "nr", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - nepal: { - keywords: [ "np", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\uddf5", - fitzpatrick_scale: false, - category: "flags" - }, - netherlands: { - keywords: [ "nl", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\uddf1", - fitzpatrick_scale: false, - category: "flags" - }, - new_caledonia: { - keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\udde8", - fitzpatrick_scale: false, - category: "flags" - }, - new_zealand: { - keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\uddff", - fitzpatrick_scale: false, - category: "flags" - }, - nicaragua: { - keywords: [ "ni", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\uddee", - fitzpatrick_scale: false, - category: "flags" - }, - niger: { - keywords: [ "ne", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - nigeria: { - keywords: [ "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - niue: { - keywords: [ "nu", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\uddfa", - fitzpatrick_scale: false, - category: "flags" - }, - norfolk_island: { - keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\uddeb", - fitzpatrick_scale: false, - category: "flags" - }, - northern_mariana_islands: { - keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf2\ud83c\uddf5", - fitzpatrick_scale: false, - category: "flags" - }, - north_korea: { - keywords: [ "north", "korea", "nation", "flag", "country", "banner" ], - char: "\ud83c\uddf0\ud83c\uddf5", - fitzpatrick_scale: false, - category: "flags" - }, - norway: { - keywords: [ "no", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf3\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - oman: { - keywords: [ "om_symbol", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf4\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - pakistan: { - keywords: [ "pk", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddf0", - fitzpatrick_scale: false, - category: "flags" - }, - palau: { - keywords: [ "pw", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddfc", - fitzpatrick_scale: false, - category: "flags" - }, - palestinian_territories: { - keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - panama: { - keywords: [ "pa", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - papua_new_guinea: { - keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - paraguay: { - keywords: [ "py", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddfe", - fitzpatrick_scale: false, - category: "flags" - }, - peru: { - keywords: [ "pe", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - philippines: { - keywords: [ "ph", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\udded", - fitzpatrick_scale: false, - category: "flags" - }, - pitcairn_islands: { - keywords: [ "pitcairn", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - poland: { - keywords: [ "pl", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddf1", - fitzpatrick_scale: false, - category: "flags" - }, - portugal: { - keywords: [ "pt", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - puerto_rico: { - keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - qatar: { - keywords: [ "qa", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf6\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - reunion: { - keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf7\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - romania: { - keywords: [ "ro", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf7\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - ru: { - keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf7\ud83c\uddfa", - fitzpatrick_scale: false, - category: "flags" - }, - rwanda: { - keywords: [ "rw", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf7\ud83c\uddfc", - fitzpatrick_scale: false, - category: "flags" - }, - st_barthelemy: { - keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde7\ud83c\uddf1", - fitzpatrick_scale: false, - category: "flags" - }, - st_helena: { - keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\udded", - fitzpatrick_scale: false, - category: "flags" - }, - st_kitts_nevis: { - keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf0\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - st_lucia: { - keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf1\ud83c\udde8", - fitzpatrick_scale: false, - category: "flags" - }, - st_pierre_miquelon: { - keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf5\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - st_vincent_grenadines: { - keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfb\ud83c\udde8", - fitzpatrick_scale: false, - category: "flags" - }, - samoa: { - keywords: [ "ws", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfc\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - san_marino: { - keywords: [ "san", "marino", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - sao_tome_principe: { - keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - saudi_arabia: { - keywords: [ "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - senegal: { - keywords: [ "sn", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - serbia: { - keywords: [ "rs", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf7\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - seychelles: { - keywords: [ "sc", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\udde8", - fitzpatrick_scale: false, - category: "flags" - }, - sierra_leone: { - keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddf1", - fitzpatrick_scale: false, - category: "flags" - }, - singapore: { - keywords: [ "sg", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - sint_maarten: { - keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddfd", - fitzpatrick_scale: false, - category: "flags" - }, - slovakia: { - keywords: [ "sk", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddf0", - fitzpatrick_scale: false, - category: "flags" - }, - slovenia: { - keywords: [ "si", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddee", - fitzpatrick_scale: false, - category: "flags" - }, - solomon_islands: { - keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\udde7", - fitzpatrick_scale: false, - category: "flags" - }, - somalia: { - keywords: [ "so", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - south_africa: { - keywords: [ "south", "africa", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddff\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - south_georgia_south_sandwich_islands: { - keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddec\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - kr: { - keywords: [ "south", "korea", "nation", "flag", "country", "banner" ], - char: "\ud83c\uddf0\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - south_sudan: { - keywords: [ "south", "sd", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - es: { - keywords: [ "spain", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddea\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - sri_lanka: { - keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf1\ud83c\uddf0", - fitzpatrick_scale: false, - category: "flags" - }, - sudan: { - keywords: [ "sd", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\udde9", - fitzpatrick_scale: false, - category: "flags" - }, - suriname: { - keywords: [ "sr", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - swaziland: { - keywords: [ "sz", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddff", - fitzpatrick_scale: false, - category: "flags" - }, - sweden: { - keywords: [ "se", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - switzerland: { - keywords: [ "ch", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde8\ud83c\udded", - fitzpatrick_scale: false, - category: "flags" - }, - syria: { - keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf8\ud83c\uddfe", - fitzpatrick_scale: false, - category: "flags" - }, - taiwan: { - keywords: [ "tw", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddfc", - fitzpatrick_scale: false, - category: "flags" - }, - tajikistan: { - keywords: [ "tj", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddef", - fitzpatrick_scale: false, - category: "flags" - }, - tanzania: { - keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddff", - fitzpatrick_scale: false, - category: "flags" - }, - thailand: { - keywords: [ "th", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\udded", - fitzpatrick_scale: false, - category: "flags" - }, - timor_leste: { - keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddf1", - fitzpatrick_scale: false, - category: "flags" - }, - togo: { - keywords: [ "tg", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - tokelau: { - keywords: [ "tk", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddf0", - fitzpatrick_scale: false, - category: "flags" - }, - tonga: { - keywords: [ "to", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddf4", - fitzpatrick_scale: false, - category: "flags" - }, - trinidad_tobago: { - keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddf9", - fitzpatrick_scale: false, - category: "flags" - }, - tunisia: { - keywords: [ "tn", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - tr: { - keywords: [ "turkey", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddf7", - fitzpatrick_scale: false, - category: "flags" - }, - turkmenistan: { - keywords: [ "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - turks_caicos_islands: { - keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\udde8", - fitzpatrick_scale: false, - category: "flags" - }, - tuvalu: { - keywords: [ "flag", "nation", "country", "banner" ], - char: "\ud83c\uddf9\ud83c\uddfb", - fitzpatrick_scale: false, - category: "flags" - }, - uganda: { - keywords: [ "ug", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfa\ud83c\uddec", - fitzpatrick_scale: false, - category: "flags" - }, - ukraine: { - keywords: [ "ua", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfa\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - united_arab_emirates: { - keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ], - char: "\ud83c\udde6\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - uk: { - keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ], - char: "\ud83c\uddec\ud83c\udde7", - fitzpatrick_scale: false, - category: "flags" - }, - england: { - keywords: [ "flag", "english" ], - char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f", - fitzpatrick_scale: false, - category: "flags" - }, - scotland: { - keywords: [ "flag", "scottish" ], - char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f", - fitzpatrick_scale: false, - category: "flags" - }, - wales: { - keywords: [ "flag", "welsh" ], - char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f", - fitzpatrick_scale: false, - category: "flags" - }, - us: { - keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfa\ud83c\uddf8", - fitzpatrick_scale: false, - category: "flags" - }, - us_virgin_islands: { - keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfb\ud83c\uddee", - fitzpatrick_scale: false, - category: "flags" - }, - uruguay: { - keywords: [ "uy", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfa\ud83c\uddfe", - fitzpatrick_scale: false, - category: "flags" - }, - uzbekistan: { - keywords: [ "uz", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfa\ud83c\uddff", - fitzpatrick_scale: false, - category: "flags" - }, - vanuatu: { - keywords: [ "vu", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfb\ud83c\uddfa", - fitzpatrick_scale: false, - category: "flags" - }, - vatican_city: { - keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfb\ud83c\udde6", - fitzpatrick_scale: false, - category: "flags" - }, - venezuela: { - keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfb\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - vietnam: { - keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfb\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - wallis_futuna: { - keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfc\ud83c\uddeb", - fitzpatrick_scale: false, - category: "flags" - }, - western_sahara: { - keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddea\ud83c\udded", - fitzpatrick_scale: false, - category: "flags" - }, - yemen: { - keywords: [ "ye", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddfe\ud83c\uddea", - fitzpatrick_scale: false, - category: "flags" - }, - zambia: { - keywords: [ "zm", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddff\ud83c\uddf2", - fitzpatrick_scale: false, - category: "flags" - }, - zimbabwe: { - keywords: [ "zw", "flag", "nation", "country", "banner" ], - char: "\ud83c\uddff\ud83c\uddfc", - fitzpatrick_scale: false, - category: "flags" - }, - united_nations: { - keywords: [ "un", "flag", "banner" ], - char: "\ud83c\uddfa\ud83c\uddf3", - fitzpatrick_scale: false, - category: "flags" - }, - pirate_flag: { - keywords: [ "skull", "crossbones", "flag", "banner" ], - char: "\ud83c\udff4\u200d\u2620\ufe0f", - fitzpatrick_scale: false, - category: "flags" - } -}); \ No newline at end of file +window.tinymce.Resource.add("tinymce.plugins.emoticons",{grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:"😀",fitzpatrick_scale:false,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:"😬",fitzpatrick_scale:false,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:"😁",fitzpatrick_scale:false,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:"😂",fitzpatrick_scale:false,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:"🤣",fitzpatrick_scale:false,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:"🥳",fitzpatrick_scale:false,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:"😃",fitzpatrick_scale:false,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:"😄",fitzpatrick_scale:false,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:"😅",fitzpatrick_scale:false,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:"😆",fitzpatrick_scale:false,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:"😇",fitzpatrick_scale:false,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:"😉",fitzpatrick_scale:false,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:"😊",fitzpatrick_scale:false,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:"🙂",fitzpatrick_scale:false,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:"🙃",fitzpatrick_scale:false,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:"☺️",fitzpatrick_scale:false,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:"😋",fitzpatrick_scale:false,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:"😌",fitzpatrick_scale:false,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:"😍",fitzpatrick_scale:false,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:"🥰",fitzpatrick_scale:false,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"😘",fitzpatrick_scale:false,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:"😗",fitzpatrick_scale:false,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:"😙",fitzpatrick_scale:false,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"😚",fitzpatrick_scale:false,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:"😜",fitzpatrick_scale:false,category:"people"},zany:{keywords:["face","goofy","crazy"],char:"🤪",fitzpatrick_scale:false,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:"🤨",fitzpatrick_scale:false,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:"🧐",fitzpatrick_scale:false,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:"😝",fitzpatrick_scale:false,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:"😛",fitzpatrick_scale:false,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:"🤑",fitzpatrick_scale:false,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:"🤓",fitzpatrick_scale:false,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:"😎",fitzpatrick_scale:false,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:"🤩",fitzpatrick_scale:false,category:"people"},clown_face:{keywords:["face"],char:"🤡",fitzpatrick_scale:false,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:"🤠",fitzpatrick_scale:false,category:"people"},hugs:{keywords:["face","smile","hug"],char:"🤗",fitzpatrick_scale:false,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:"😏",fitzpatrick_scale:false,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:"😶",fitzpatrick_scale:false,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:"😐",fitzpatrick_scale:false,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:"😑",fitzpatrick_scale:false,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:"😒",fitzpatrick_scale:false,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:"🙄",fitzpatrick_scale:false,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:"🤔",fitzpatrick_scale:false,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:"🤥",fitzpatrick_scale:false,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:"🤭",fitzpatrick_scale:false,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:"🤫",fitzpatrick_scale:false,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:"🤬",fitzpatrick_scale:false,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:"🤯",fitzpatrick_scale:false,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:"😳",fitzpatrick_scale:false,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:"😞",fitzpatrick_scale:false,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:"😟",fitzpatrick_scale:false,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:"😠",fitzpatrick_scale:false,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:"😡",fitzpatrick_scale:false,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:"😔",fitzpatrick_scale:false,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:"😕",fitzpatrick_scale:false,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:"🙁",fitzpatrick_scale:false,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:"☹",fitzpatrick_scale:false,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:"😣",fitzpatrick_scale:false,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:"😖",fitzpatrick_scale:false,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:"😫",fitzpatrick_scale:false,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:"😩",fitzpatrick_scale:false,category:"people"},pleading:{keywords:["face","begging","mercy"],char:"🥺",fitzpatrick_scale:false,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:"😤",fitzpatrick_scale:false,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:"😮",fitzpatrick_scale:false,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:"😱",fitzpatrick_scale:false,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:"😨",fitzpatrick_scale:false,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:"😰",fitzpatrick_scale:false,category:"people"},hushed:{keywords:["face","woo","shh"],char:"😯",fitzpatrick_scale:false,category:"people"},frowning:{keywords:["face","aw","what"],char:"😦",fitzpatrick_scale:false,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:"😧",fitzpatrick_scale:false,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:"😢",fitzpatrick_scale:false,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:"😥",fitzpatrick_scale:false,category:"people"},drooling_face:{keywords:["face"],char:"🤤",fitzpatrick_scale:false,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:"😪",fitzpatrick_scale:false,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:"😓",fitzpatrick_scale:false,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:"🥵",fitzpatrick_scale:false,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:"🥶",fitzpatrick_scale:false,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:"😭",fitzpatrick_scale:false,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:"😵",fitzpatrick_scale:false,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:"😲",fitzpatrick_scale:false,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:"🤐",fitzpatrick_scale:false,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:"🤢",fitzpatrick_scale:false,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:"🤧",fitzpatrick_scale:false,category:"people"},vomiting:{keywords:["face","sick"],char:"🤮",fitzpatrick_scale:false,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:"😷",fitzpatrick_scale:false,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:"🤒",fitzpatrick_scale:false,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:"🤕",fitzpatrick_scale:false,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:"🥴",fitzpatrick_scale:false,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:"😴",fitzpatrick_scale:false,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:"💤",fitzpatrick_scale:false,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:"💩",fitzpatrick_scale:false,category:"people"},smiling_imp:{keywords:["devil","horns"],char:"😈",fitzpatrick_scale:false,category:"people"},imp:{keywords:["devil","angry","horns"],char:"👿",fitzpatrick_scale:false,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:"👹",fitzpatrick_scale:false,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:"👺",fitzpatrick_scale:false,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:"💀",fitzpatrick_scale:false,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:"👻",fitzpatrick_scale:false,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:"👽",fitzpatrick_scale:false,category:"people"},robot:{keywords:["computer","machine","bot"],char:"🤖",fitzpatrick_scale:false,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:"😺",fitzpatrick_scale:false,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:"😸",fitzpatrick_scale:false,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:"😹",fitzpatrick_scale:false,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:"😻",fitzpatrick_scale:false,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:"😼",fitzpatrick_scale:false,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:"😽",fitzpatrick_scale:false,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:"🙀",fitzpatrick_scale:false,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:"😿",fitzpatrick_scale:false,category:"people"},pouting_cat:{keywords:["animal","cats"],char:"😾",fitzpatrick_scale:false,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:"🤲",fitzpatrick_scale:true,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:"🙌",fitzpatrick_scale:true,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:"👏",fitzpatrick_scale:true,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:"👋",fitzpatrick_scale:true,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:"🤙",fitzpatrick_scale:true,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:"👍",fitzpatrick_scale:true,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:"👎",fitzpatrick_scale:true,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:"👊",fitzpatrick_scale:true,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:"✊",fitzpatrick_scale:true,category:"people"},fist_left:{keywords:["hand","fistbump"],char:"🤛",fitzpatrick_scale:true,category:"people"},fist_right:{keywords:["hand","fistbump"],char:"🤜",fitzpatrick_scale:true,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:"✌",fitzpatrick_scale:true,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:"👌",fitzpatrick_scale:true,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:"✋",fitzpatrick_scale:true,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:"🤚",fitzpatrick_scale:true,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:"👐",fitzpatrick_scale:true,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:"💪",fitzpatrick_scale:true,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:"🙏",fitzpatrick_scale:true,category:"people"},foot:{keywords:["kick","stomp"],char:"🦶",fitzpatrick_scale:true,category:"people"},leg:{keywords:["kick","limb"],char:"🦵",fitzpatrick_scale:true,category:"people"},handshake:{keywords:["agreement","shake"],char:"🤝",fitzpatrick_scale:false,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:"☝",fitzpatrick_scale:true,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:"👆",fitzpatrick_scale:true,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:"👇",fitzpatrick_scale:true,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:"👈",fitzpatrick_scale:true,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:"👉",fitzpatrick_scale:true,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:"🖕",fitzpatrick_scale:true,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:"🖐",fitzpatrick_scale:true,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:"🤟",fitzpatrick_scale:true,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:"🤘",fitzpatrick_scale:true,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:"🤞",fitzpatrick_scale:true,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:"🖖",fitzpatrick_scale:true,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:"✍",fitzpatrick_scale:true,category:"people"},selfie:{keywords:["camera","phone"],char:"🤳",fitzpatrick_scale:true,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:"💅",fitzpatrick_scale:true,category:"people"},lips:{keywords:["mouth","kiss"],char:"👄",fitzpatrick_scale:false,category:"people"},tooth:{keywords:["teeth","dentist"],char:"🦷",fitzpatrick_scale:false,category:"people"},tongue:{keywords:["mouth","playful"],char:"👅",fitzpatrick_scale:false,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:"👂",fitzpatrick_scale:true,category:"people"},nose:{keywords:["smell","sniff"],char:"👃",fitzpatrick_scale:true,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:"👁",fitzpatrick_scale:false,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:"👀",fitzpatrick_scale:false,category:"people"},brain:{keywords:["smart","intelligent"],char:"🧠",fitzpatrick_scale:false,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:"👤",fitzpatrick_scale:false,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:"👥",fitzpatrick_scale:false,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:"🗣",fitzpatrick_scale:false,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:"👶",fitzpatrick_scale:true,category:"people"},child:{keywords:["gender-neutral","young"],char:"🧒",fitzpatrick_scale:true,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:"👦",fitzpatrick_scale:true,category:"people"},girl:{keywords:["female","woman","teenager"],char:"👧",fitzpatrick_scale:true,category:"people"},adult:{keywords:["gender-neutral","person"],char:"🧑",fitzpatrick_scale:true,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:"👨",fitzpatrick_scale:true,category:"people"},woman:{keywords:["female","girls","lady"],char:"👩",fitzpatrick_scale:true,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:"👱‍♀️",fitzpatrick_scale:true,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:"👱",fitzpatrick_scale:true,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:"🧔",fitzpatrick_scale:true,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:"🧓",fitzpatrick_scale:true,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:"👴",fitzpatrick_scale:true,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:"👵",fitzpatrick_scale:true,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:"👲",fitzpatrick_scale:true,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:"🧕",fitzpatrick_scale:true,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:"👳‍♀️",fitzpatrick_scale:true,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:"👳",fitzpatrick_scale:true,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:"👮‍♀️",fitzpatrick_scale:true,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:"👮",fitzpatrick_scale:true,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:"👷‍♀️",fitzpatrick_scale:true,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:"👷",fitzpatrick_scale:true,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:"💂‍♀️",fitzpatrick_scale:true,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:"💂",fitzpatrick_scale:true,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:"🕵️‍♀️",fitzpatrick_scale:true,category:"people"},male_detective:{keywords:["human","spy","detective"],char:"🕵",fitzpatrick_scale:true,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:"👩‍⚕️",fitzpatrick_scale:true,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:"👨‍⚕️",fitzpatrick_scale:true,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:"👩‍🌾",fitzpatrick_scale:true,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:"👨‍🌾",fitzpatrick_scale:true,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:"👩‍🍳",fitzpatrick_scale:true,category:"people"},man_cook:{keywords:["chef","man","human"],char:"👨‍🍳",fitzpatrick_scale:true,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:"👩‍🎓",fitzpatrick_scale:true,category:"people"},man_student:{keywords:["graduate","man","human"],char:"👨‍🎓",fitzpatrick_scale:true,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:"👩‍🎤",fitzpatrick_scale:true,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:"👨‍🎤",fitzpatrick_scale:true,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:"👩‍🏫",fitzpatrick_scale:true,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:"👨‍🏫",fitzpatrick_scale:true,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:"👩‍🏭",fitzpatrick_scale:true,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:"👨‍🏭",fitzpatrick_scale:true,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:"👩‍💻",fitzpatrick_scale:true,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:"👨‍💻",fitzpatrick_scale:true,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:"👩‍💼",fitzpatrick_scale:true,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:"👨‍💼",fitzpatrick_scale:true,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:"👩‍🔧",fitzpatrick_scale:true,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:"👨‍🔧",fitzpatrick_scale:true,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:"👩‍🔬",fitzpatrick_scale:true,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:"👨‍🔬",fitzpatrick_scale:true,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:"👩‍🎨",fitzpatrick_scale:true,category:"people"},man_artist:{keywords:["painter","man","human"],char:"👨‍🎨",fitzpatrick_scale:true,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:"👩‍🚒",fitzpatrick_scale:true,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:"👨‍🚒",fitzpatrick_scale:true,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:"👩‍✈️",fitzpatrick_scale:true,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:"👨‍✈️",fitzpatrick_scale:true,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:"👩‍🚀",fitzpatrick_scale:true,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:"👨‍🚀",fitzpatrick_scale:true,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:"👩‍⚖️",fitzpatrick_scale:true,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:"👨‍⚖️",fitzpatrick_scale:true,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:"🦸‍♀️",fitzpatrick_scale:true,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:"🦸‍♂️",fitzpatrick_scale:true,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:"🦹‍♀️",fitzpatrick_scale:true,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:"🦹‍♂️",fitzpatrick_scale:true,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:"🤶",fitzpatrick_scale:true,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:"🎅",fitzpatrick_scale:true,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:"🧙‍♀️",fitzpatrick_scale:true,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:"🧙‍♂️",fitzpatrick_scale:true,category:"people"},woman_elf:{keywords:["woman","female"],char:"🧝‍♀️",fitzpatrick_scale:true,category:"people"},man_elf:{keywords:["man","male"],char:"🧝‍♂️",fitzpatrick_scale:true,category:"people"},woman_vampire:{keywords:["woman","female"],char:"🧛‍♀️",fitzpatrick_scale:true,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:"🧛‍♂️",fitzpatrick_scale:true,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:"🧟‍♀️",fitzpatrick_scale:false,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:"🧟‍♂️",fitzpatrick_scale:false,category:"people"},woman_genie:{keywords:["woman","female"],char:"🧞‍♀️",fitzpatrick_scale:false,category:"people"},man_genie:{keywords:["man","male"],char:"🧞‍♂️",fitzpatrick_scale:false,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:"🧜‍♀️",fitzpatrick_scale:true,category:"people"},merman:{keywords:["man","male","triton"],char:"🧜‍♂️",fitzpatrick_scale:true,category:"people"},woman_fairy:{keywords:["woman","female"],char:"🧚‍♀️",fitzpatrick_scale:true,category:"people"},man_fairy:{keywords:["man","male"],char:"🧚‍♂️",fitzpatrick_scale:true,category:"people"},angel:{keywords:["heaven","wings","halo"],char:"👼",fitzpatrick_scale:true,category:"people"},pregnant_woman:{keywords:["baby"],char:"🤰",fitzpatrick_scale:true,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:"🤱",fitzpatrick_scale:true,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:"👸",fitzpatrick_scale:true,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:"🤴",fitzpatrick_scale:true,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:"👰",fitzpatrick_scale:true,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:"🤵",fitzpatrick_scale:true,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:"🏃‍♀️",fitzpatrick_scale:true,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:"🏃",fitzpatrick_scale:true,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:"🚶‍♀️",fitzpatrick_scale:true,category:"people"},walking_man:{keywords:["human","feet","steps"],char:"🚶",fitzpatrick_scale:true,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:"💃",fitzpatrick_scale:true,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:"🕺",fitzpatrick_scale:true,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:"👯",fitzpatrick_scale:false,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:"👯‍♂️",fitzpatrick_scale:false,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:"👫",fitzpatrick_scale:false,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:"👬",fitzpatrick_scale:false,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:"👭",fitzpatrick_scale:false,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:"🙇‍♀️",fitzpatrick_scale:true,category:"people"},bowing_man:{keywords:["man","male","boy"],char:"🙇",fitzpatrick_scale:true,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:"🤦‍♂️",fitzpatrick_scale:true,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:"🤦‍♀️",fitzpatrick_scale:true,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:"🤷",fitzpatrick_scale:true,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:"🤷‍♂️",fitzpatrick_scale:true,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:"💁",fitzpatrick_scale:true,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:"💁‍♂️",fitzpatrick_scale:true,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:"🙅",fitzpatrick_scale:true,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:"🙅‍♂️",fitzpatrick_scale:true,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:"🙆",fitzpatrick_scale:true,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:"🙆‍♂️",fitzpatrick_scale:true,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:"🙋",fitzpatrick_scale:true,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:"🙋‍♂️",fitzpatrick_scale:true,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:"🙎",fitzpatrick_scale:true,category:"people"},pouting_man:{keywords:["male","boy","man"],char:"🙎‍♂️",fitzpatrick_scale:true,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:"🙍",fitzpatrick_scale:true,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:"🙍‍♂️",fitzpatrick_scale:true,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:"💇",fitzpatrick_scale:true,category:"people"},haircut_man:{keywords:["male","boy","man"],char:"💇‍♂️",fitzpatrick_scale:true,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:"💆",fitzpatrick_scale:true,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:"💆‍♂️",fitzpatrick_scale:true,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:"🧖‍♀️",fitzpatrick_scale:true,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:"🧖‍♂️",fitzpatrick_scale:true,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"💑",fitzpatrick_scale:false,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"👩‍❤️‍👩",fitzpatrick_scale:false,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"👨‍❤️‍👨",fitzpatrick_scale:false,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"💏",fitzpatrick_scale:false,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"👩‍❤️‍💋‍👩",fitzpatrick_scale:false,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:"👨‍❤️‍💋‍👨",fitzpatrick_scale:false,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:"👪",fitzpatrick_scale:false,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:"👨‍👩‍👧",fitzpatrick_scale:false,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"👨‍👩‍👧‍👦",fitzpatrick_scale:false,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"👨‍👩‍👦‍👦",fitzpatrick_scale:false,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"👨‍👩‍👧‍👧",fitzpatrick_scale:false,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:"👩‍👩‍👦",fitzpatrick_scale:false,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:"👩‍👩‍👧",fitzpatrick_scale:false,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"👩‍👩‍👧‍👦",fitzpatrick_scale:false,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"👩‍👩‍👦‍👦",fitzpatrick_scale:false,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"👩‍👩‍👧‍👧",fitzpatrick_scale:false,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:"👨‍👨‍👦",fitzpatrick_scale:false,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:"👨‍👨‍👧",fitzpatrick_scale:false,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:"👨‍👨‍👧‍👦",fitzpatrick_scale:false,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:"👨‍👨‍👦‍👦",fitzpatrick_scale:false,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:"👨‍👨‍👧‍👧",fitzpatrick_scale:false,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:"👩‍👦",fitzpatrick_scale:false,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:"👩‍👧",fitzpatrick_scale:false,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:"👩‍👧‍👦",fitzpatrick_scale:false,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:"👩‍👦‍👦",fitzpatrick_scale:false,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:"👩‍👧‍👧",fitzpatrick_scale:false,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:"👨‍👦",fitzpatrick_scale:false,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:"👨‍👧",fitzpatrick_scale:false,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:"👨‍👧‍👦",fitzpatrick_scale:false,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:"👨‍👦‍👦",fitzpatrick_scale:false,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:"👨‍👧‍👧",fitzpatrick_scale:false,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:"🧶",fitzpatrick_scale:false,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:"🧵",fitzpatrick_scale:false,category:"people"},coat:{keywords:["jacket"],char:"🧥",fitzpatrick_scale:false,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:"🥼",fitzpatrick_scale:false,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:"👚",fitzpatrick_scale:false,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:"👕",fitzpatrick_scale:false,category:"people"},jeans:{keywords:["fashion","shopping"],char:"👖",fitzpatrick_scale:false,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:"👔",fitzpatrick_scale:false,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:"👗",fitzpatrick_scale:false,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:"👙",fitzpatrick_scale:false,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:"👘",fitzpatrick_scale:false,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:"💄",fitzpatrick_scale:false,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:"💋",fitzpatrick_scale:false,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:"👣",fitzpatrick_scale:false,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:"🥿",fitzpatrick_scale:false,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:"👠",fitzpatrick_scale:false,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:"👡",fitzpatrick_scale:false,category:"people"},boot:{keywords:["shoes","fashion"],char:"👢",fitzpatrick_scale:false,category:"people"},mans_shoe:{keywords:["fashion","male"],char:"👞",fitzpatrick_scale:false,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:"👟",fitzpatrick_scale:false,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:"🥾",fitzpatrick_scale:false,category:"people"},socks:{keywords:["stockings","clothes"],char:"🧦",fitzpatrick_scale:false,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:"🧤",fitzpatrick_scale:false,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:"🧣",fitzpatrick_scale:false,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:"👒",fitzpatrick_scale:false,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:"🎩",fitzpatrick_scale:false,category:"people"},billed_hat:{keywords:["cap","baseball"],char:"🧢",fitzpatrick_scale:false,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:"⛑",fitzpatrick_scale:false,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:"🎓",fitzpatrick_scale:false,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:"👑",fitzpatrick_scale:false,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:"🎒",fitzpatrick_scale:false,category:"people"},luggage:{keywords:["packing","travel"],char:"🧳",fitzpatrick_scale:false,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:"👝",fitzpatrick_scale:false,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:"👛",fitzpatrick_scale:false,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:"👜",fitzpatrick_scale:false,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:"💼",fitzpatrick_scale:false,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:"👓",fitzpatrick_scale:false,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:"🕶",fitzpatrick_scale:false,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:"🥽",fitzpatrick_scale:false,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:"💍",fitzpatrick_scale:false,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:"🌂",fitzpatrick_scale:false,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:"🐶",fitzpatrick_scale:false,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:"🐱",fitzpatrick_scale:false,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:"🐭",fitzpatrick_scale:false,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:"🐹",fitzpatrick_scale:false,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:"🐰",fitzpatrick_scale:false,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:"🦊",fitzpatrick_scale:false,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:"🐻",fitzpatrick_scale:false,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:"🐼",fitzpatrick_scale:false,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:"🐨",fitzpatrick_scale:false,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:"🐯",fitzpatrick_scale:false,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:"🦁",fitzpatrick_scale:false,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:"🐮",fitzpatrick_scale:false,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:"🐷",fitzpatrick_scale:false,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:"🐽",fitzpatrick_scale:false,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:"🐸",fitzpatrick_scale:false,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:"🦑",fitzpatrick_scale:false,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:"🐙",fitzpatrick_scale:false,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:"🦐",fitzpatrick_scale:false,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:"🐵",fitzpatrick_scale:false,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:"🦍",fitzpatrick_scale:false,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:"🙈",fitzpatrick_scale:false,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:"🙉",fitzpatrick_scale:false,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:"🙊",fitzpatrick_scale:false,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:"🐒",fitzpatrick_scale:false,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:"🐔",fitzpatrick_scale:false,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:"🐧",fitzpatrick_scale:false,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:"🐦",fitzpatrick_scale:false,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:"🐤",fitzpatrick_scale:false,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:"🐣",fitzpatrick_scale:false,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:"🐥",fitzpatrick_scale:false,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:"🦆",fitzpatrick_scale:false,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:"🦅",fitzpatrick_scale:false,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:"🦉",fitzpatrick_scale:false,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:"🦇",fitzpatrick_scale:false,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:"🐺",fitzpatrick_scale:false,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:"🐗",fitzpatrick_scale:false,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:"🐴",fitzpatrick_scale:false,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:"🦄",fitzpatrick_scale:false,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:"🐝",fitzpatrick_scale:false,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:"🐛",fitzpatrick_scale:false,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:"🦋",fitzpatrick_scale:false,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:"🐌",fitzpatrick_scale:false,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:"🐞",fitzpatrick_scale:false,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:"🐜",fitzpatrick_scale:false,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:"🦗",fitzpatrick_scale:false,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:"🕷",fitzpatrick_scale:false,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:"🦂",fitzpatrick_scale:false,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:"🦀",fitzpatrick_scale:false,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:"🐍",fitzpatrick_scale:false,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:"🦎",fitzpatrick_scale:false,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:"🦖",fitzpatrick_scale:false,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:"🦕",fitzpatrick_scale:false,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:"🐢",fitzpatrick_scale:false,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:"🐠",fitzpatrick_scale:false,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:"🐟",fitzpatrick_scale:false,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:"🐡",fitzpatrick_scale:false,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:"🐬",fitzpatrick_scale:false,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:"🦈",fitzpatrick_scale:false,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:"🐳",fitzpatrick_scale:false,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:"🐋",fitzpatrick_scale:false,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:"🐊",fitzpatrick_scale:false,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:"🐆",fitzpatrick_scale:false,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:"🦓",fitzpatrick_scale:false,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:"🐅",fitzpatrick_scale:false,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:"🐃",fitzpatrick_scale:false,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:"🐂",fitzpatrick_scale:false,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:"🐄",fitzpatrick_scale:false,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:"🦌",fitzpatrick_scale:false,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:"🐪",fitzpatrick_scale:false,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:"🐫",fitzpatrick_scale:false,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:"🦒",fitzpatrick_scale:false,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:"🐘",fitzpatrick_scale:false,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:"🦏",fitzpatrick_scale:false,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:"🐐",fitzpatrick_scale:false,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:"🐏",fitzpatrick_scale:false,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:"🐑",fitzpatrick_scale:false,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:"🐎",fitzpatrick_scale:false,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:"🐖",fitzpatrick_scale:false,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:"🐀",fitzpatrick_scale:false,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:"🐁",fitzpatrick_scale:false,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:"🐓",fitzpatrick_scale:false,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:"🦃",fitzpatrick_scale:false,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:"🕊",fitzpatrick_scale:false,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:"🐕",fitzpatrick_scale:false,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:"🐩",fitzpatrick_scale:false,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:"🐈",fitzpatrick_scale:false,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:"🐇",fitzpatrick_scale:false,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:"🐿",fitzpatrick_scale:false,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:"🦔",fitzpatrick_scale:false,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:"🦝",fitzpatrick_scale:false,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:"🦙",fitzpatrick_scale:false,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:"🦛",fitzpatrick_scale:false,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:"🦘",fitzpatrick_scale:false,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:"🦡",fitzpatrick_scale:false,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:"🦢",fitzpatrick_scale:false,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:"🦚",fitzpatrick_scale:false,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:"🦜",fitzpatrick_scale:false,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:"🦞",fitzpatrick_scale:false,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:"🦟",fitzpatrick_scale:false,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:"🐾",fitzpatrick_scale:false,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:"🐉",fitzpatrick_scale:false,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:"🐲",fitzpatrick_scale:false,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:"🌵",fitzpatrick_scale:false,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:"🎄",fitzpatrick_scale:false,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:"🌲",fitzpatrick_scale:false,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:"🌳",fitzpatrick_scale:false,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:"🌴",fitzpatrick_scale:false,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:"🌱",fitzpatrick_scale:false,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:"🌿",fitzpatrick_scale:false,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:"☘",fitzpatrick_scale:false,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:"🍀",fitzpatrick_scale:false,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:"🎍",fitzpatrick_scale:false,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:"🎋",fitzpatrick_scale:false,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:"🍃",fitzpatrick_scale:false,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:"🍂",fitzpatrick_scale:false,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:"🍁",fitzpatrick_scale:false,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:"🌾",fitzpatrick_scale:false,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:"🌺",fitzpatrick_scale:false,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:"🌻",fitzpatrick_scale:false,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:"🌹",fitzpatrick_scale:false,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:"🥀",fitzpatrick_scale:false,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:"🌷",fitzpatrick_scale:false,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:"🌼",fitzpatrick_scale:false,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:"🌸",fitzpatrick_scale:false,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:"💐",fitzpatrick_scale:false,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:"🍄",fitzpatrick_scale:false,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:"🌰",fitzpatrick_scale:false,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:"🎃",fitzpatrick_scale:false,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:"🐚",fitzpatrick_scale:false,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:"🕸",fitzpatrick_scale:false,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:"🌎",fitzpatrick_scale:false,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:"🌍",fitzpatrick_scale:false,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:"🌏",fitzpatrick_scale:false,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:"🌕",fitzpatrick_scale:false,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:"🌖",fitzpatrick_scale:false,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌗",fitzpatrick_scale:false,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌘",fitzpatrick_scale:false,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌑",fitzpatrick_scale:false,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌒",fitzpatrick_scale:false,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌓",fitzpatrick_scale:false,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:"🌔",fitzpatrick_scale:false,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌚",fitzpatrick_scale:false,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌝",fitzpatrick_scale:false,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌛",fitzpatrick_scale:false,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"🌜",fitzpatrick_scale:false,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:"🌞",fitzpatrick_scale:false,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:"🌙",fitzpatrick_scale:false,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:"⭐",fitzpatrick_scale:false,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:"🌟",fitzpatrick_scale:false,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:"💫",fitzpatrick_scale:false,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:"✨",fitzpatrick_scale:false,category:"animals_and_nature"},comet:{keywords:["space"],char:"☄",fitzpatrick_scale:false,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:"☀️",fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:"🌤",fitzpatrick_scale:false,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:"⛅",fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:"🌥",fitzpatrick_scale:false,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:"🌦",fitzpatrick_scale:false,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:"☁️",fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:"🌧",fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:"⛈",fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:"🌩",fitzpatrick_scale:false,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:"⚡",fitzpatrick_scale:false,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:"🔥",fitzpatrick_scale:false,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:"💥",fitzpatrick_scale:false,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:"❄️",fitzpatrick_scale:false,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:"🌨",fitzpatrick_scale:false,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:"⛄",fitzpatrick_scale:false,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:"☃",fitzpatrick_scale:false,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:"🌬",fitzpatrick_scale:false,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:"💨",fitzpatrick_scale:false,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:"🌪",fitzpatrick_scale:false,category:"animals_and_nature"},fog:{keywords:["weather"],char:"🌫",fitzpatrick_scale:false,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:"☂",fitzpatrick_scale:false,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:"☔",fitzpatrick_scale:false,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:"💧",fitzpatrick_scale:false,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:"💦",fitzpatrick_scale:false,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:"🌊",fitzpatrick_scale:false,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:"🍏",fitzpatrick_scale:false,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:"🍎",fitzpatrick_scale:false,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:"🍐",fitzpatrick_scale:false,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:"🍊",fitzpatrick_scale:false,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:"🍋",fitzpatrick_scale:false,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:"🍌",fitzpatrick_scale:false,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:"🍉",fitzpatrick_scale:false,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:"🍇",fitzpatrick_scale:false,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:"🍓",fitzpatrick_scale:false,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:"🍈",fitzpatrick_scale:false,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:"🍒",fitzpatrick_scale:false,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:"🍑",fitzpatrick_scale:false,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:"🍍",fitzpatrick_scale:false,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:"🥥",fitzpatrick_scale:false,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:"🥝",fitzpatrick_scale:false,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:"🥭",fitzpatrick_scale:false,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:"🥑",fitzpatrick_scale:false,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:"🥦",fitzpatrick_scale:false,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:"🍅",fitzpatrick_scale:false,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:"🍆",fitzpatrick_scale:false,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:"🥒",fitzpatrick_scale:false,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:"🥕",fitzpatrick_scale:false,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:"🌶",fitzpatrick_scale:false,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:"🥔",fitzpatrick_scale:false,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:"🌽",fitzpatrick_scale:false,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:"🥬",fitzpatrick_scale:false,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:"🍠",fitzpatrick_scale:false,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:"🥜",fitzpatrick_scale:false,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:"🍯",fitzpatrick_scale:false,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:"🥐",fitzpatrick_scale:false,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:"🍞",fitzpatrick_scale:false,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:"🥖",fitzpatrick_scale:false,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:"🥯",fitzpatrick_scale:false,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:"🥨",fitzpatrick_scale:false,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:"🧀",fitzpatrick_scale:false,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:"🥚",fitzpatrick_scale:false,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:"🥓",fitzpatrick_scale:false,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:"🥩",fitzpatrick_scale:false,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:"🥞",fitzpatrick_scale:false,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:"🍗",fitzpatrick_scale:false,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:"🍖",fitzpatrick_scale:false,category:"food_and_drink"},bone:{keywords:["skeleton"],char:"🦴",fitzpatrick_scale:false,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:"🍤",fitzpatrick_scale:false,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:"🍳",fitzpatrick_scale:false,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:"🍔",fitzpatrick_scale:false,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:"🍟",fitzpatrick_scale:false,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:"🥙",fitzpatrick_scale:false,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:"🌭",fitzpatrick_scale:false,category:"food_and_drink"},pizza:{keywords:["food","party"],char:"🍕",fitzpatrick_scale:false,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:"🥪",fitzpatrick_scale:false,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:"🥫",fitzpatrick_scale:false,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:"🍝",fitzpatrick_scale:false,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:"🌮",fitzpatrick_scale:false,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:"🌯",fitzpatrick_scale:false,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:"🥗",fitzpatrick_scale:false,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:"🥘",fitzpatrick_scale:false,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:"🍜",fitzpatrick_scale:false,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:"🍲",fitzpatrick_scale:false,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:"🍥",fitzpatrick_scale:false,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:"🥠",fitzpatrick_scale:false,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:"🍣",fitzpatrick_scale:false,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:"🍱",fitzpatrick_scale:false,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:"🍛",fitzpatrick_scale:false,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:"🍙",fitzpatrick_scale:false,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:"🍚",fitzpatrick_scale:false,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:"🍘",fitzpatrick_scale:false,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:"🍢",fitzpatrick_scale:false,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:"🍡",fitzpatrick_scale:false,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:"🍧",fitzpatrick_scale:false,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:"🍨",fitzpatrick_scale:false,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:"🍦",fitzpatrick_scale:false,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:"🥧",fitzpatrick_scale:false,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:"🍰",fitzpatrick_scale:false,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:"🧁",fitzpatrick_scale:false,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:"🥮",fitzpatrick_scale:false,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:"🎂",fitzpatrick_scale:false,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:"🍮",fitzpatrick_scale:false,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:"🍬",fitzpatrick_scale:false,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:"🍭",fitzpatrick_scale:false,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:"🍫",fitzpatrick_scale:false,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:"🍿",fitzpatrick_scale:false,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:"🥟",fitzpatrick_scale:false,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:"🍩",fitzpatrick_scale:false,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:"🍪",fitzpatrick_scale:false,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:"🥛",fitzpatrick_scale:false,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"🍺",fitzpatrick_scale:false,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"🍻",fitzpatrick_scale:false,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:"🥂",fitzpatrick_scale:false,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:"🍷",fitzpatrick_scale:false,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:"🥃",fitzpatrick_scale:false,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:"🍸",fitzpatrick_scale:false,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:"🍹",fitzpatrick_scale:false,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:"🍾",fitzpatrick_scale:false,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:"🍶",fitzpatrick_scale:false,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:"🍵",fitzpatrick_scale:false,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:"🥤",fitzpatrick_scale:false,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:"☕",fitzpatrick_scale:false,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:"🍼",fitzpatrick_scale:false,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:"🧂",fitzpatrick_scale:false,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:"🥄",fitzpatrick_scale:false,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:"🍴",fitzpatrick_scale:false,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:"🍽",fitzpatrick_scale:false,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:"🥣",fitzpatrick_scale:false,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:"🥡",fitzpatrick_scale:false,category:"food_and_drink"},chopsticks:{keywords:["food"],char:"🥢",fitzpatrick_scale:false,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:"⚽",fitzpatrick_scale:false,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:"🏀",fitzpatrick_scale:false,category:"activity"},football:{keywords:["sports","balls","NFL"],char:"🏈",fitzpatrick_scale:false,category:"activity"},baseball:{keywords:["sports","balls"],char:"⚾",fitzpatrick_scale:false,category:"activity"},softball:{keywords:["sports","balls"],char:"🥎",fitzpatrick_scale:false,category:"activity"},tennis:{keywords:["sports","balls","green"],char:"🎾",fitzpatrick_scale:false,category:"activity"},volleyball:{keywords:["sports","balls"],char:"🏐",fitzpatrick_scale:false,category:"activity"},rugby_football:{keywords:["sports","team"],char:"🏉",fitzpatrick_scale:false,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:"🥏",fitzpatrick_scale:false,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:"🎱",fitzpatrick_scale:false,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:"⛳",fitzpatrick_scale:false,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:"🏌️‍♀️",fitzpatrick_scale:false,category:"activity"},golfing_man:{keywords:["sports","business"],char:"🏌",fitzpatrick_scale:true,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:"🏓",fitzpatrick_scale:false,category:"activity"},badminton:{keywords:["sports"],char:"🏸",fitzpatrick_scale:false,category:"activity"},goal_net:{keywords:["sports"],char:"🥅",fitzpatrick_scale:false,category:"activity"},ice_hockey:{keywords:["sports"],char:"🏒",fitzpatrick_scale:false,category:"activity"},field_hockey:{keywords:["sports"],char:"🏑",fitzpatrick_scale:false,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:"🥍",fitzpatrick_scale:false,category:"activity"},cricket:{keywords:["sports"],char:"🏏",fitzpatrick_scale:false,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:"🎿",fitzpatrick_scale:false,category:"activity"},skier:{keywords:["sports","winter","snow"],char:"⛷",fitzpatrick_scale:false,category:"activity"},snowboarder:{keywords:["sports","winter"],char:"🏂",fitzpatrick_scale:true,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:"🤺",fitzpatrick_scale:false,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:"🤼‍♀️",fitzpatrick_scale:false,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:"🤼‍♂️",fitzpatrick_scale:false,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:"🤸‍♀️",fitzpatrick_scale:true,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:"🤸‍♂️",fitzpatrick_scale:true,category:"activity"},woman_playing_handball:{keywords:["sports"],char:"🤾‍♀️",fitzpatrick_scale:true,category:"activity"},man_playing_handball:{keywords:["sports"],char:"🤾‍♂️",fitzpatrick_scale:true,category:"activity"},ice_skate:{keywords:["sports"],char:"⛸",fitzpatrick_scale:false,category:"activity"},curling_stone:{keywords:["sports"],char:"🥌",fitzpatrick_scale:false,category:"activity"},skateboard:{keywords:["board"],char:"🛹",fitzpatrick_scale:false,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:"🛷",fitzpatrick_scale:false,category:"activity"},bow_and_arrow:{keywords:["sports"],char:"🏹",fitzpatrick_scale:false,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:"🎣",fitzpatrick_scale:false,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:"🥊",fitzpatrick_scale:false,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:"🥋",fitzpatrick_scale:false,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:"🚣‍♀️",fitzpatrick_scale:true,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:"🚣",fitzpatrick_scale:true,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:"🧗‍♀️",fitzpatrick_scale:true,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:"🧗‍♂️",fitzpatrick_scale:true,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:"🏊‍♀️",fitzpatrick_scale:true,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:"🏊",fitzpatrick_scale:true,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:"🤽‍♀️",fitzpatrick_scale:true,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:"🤽‍♂️",fitzpatrick_scale:true,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:"🧘‍♀️",fitzpatrick_scale:true,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:"🧘‍♂️",fitzpatrick_scale:true,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:"🏄‍♀️",fitzpatrick_scale:true,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:"🏄",fitzpatrick_scale:true,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:"🛀",fitzpatrick_scale:true,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:"⛹️‍♀️",fitzpatrick_scale:true,category:"activity"},basketball_man:{keywords:["sports","human"],char:"⛹",fitzpatrick_scale:true,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:"🏋️‍♀️",fitzpatrick_scale:true,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:"🏋",fitzpatrick_scale:true,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:"🚴‍♀️",fitzpatrick_scale:true,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:"🚴",fitzpatrick_scale:true,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:"🚵‍♀️",fitzpatrick_scale:true,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:"🚵",fitzpatrick_scale:true,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:"🏇",fitzpatrick_scale:true,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:"🕴",fitzpatrick_scale:true,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:"🏆",fitzpatrick_scale:false,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:"🎽",fitzpatrick_scale:false,category:"activity"},medal_sports:{keywords:["award","winning"],char:"🏅",fitzpatrick_scale:false,category:"activity"},medal_military:{keywords:["award","winning","army"],char:"🎖",fitzpatrick_scale:false,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:"🥇",fitzpatrick_scale:false,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:"🥈",fitzpatrick_scale:false,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:"🥉",fitzpatrick_scale:false,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:"🎗",fitzpatrick_scale:false,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:"🏵",fitzpatrick_scale:false,category:"activity"},ticket:{keywords:["event","concert","pass"],char:"🎫",fitzpatrick_scale:false,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:"🎟",fitzpatrick_scale:false,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:"🎭",fitzpatrick_scale:false,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:"🎨",fitzpatrick_scale:false,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:"🎪",fitzpatrick_scale:false,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:"🤹‍♀️",fitzpatrick_scale:true,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:"🤹‍♂️",fitzpatrick_scale:true,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:"🎤",fitzpatrick_scale:false,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:"🎧",fitzpatrick_scale:false,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:"🎼",fitzpatrick_scale:false,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:"🎹",fitzpatrick_scale:false,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:"🥁",fitzpatrick_scale:false,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:"🎷",fitzpatrick_scale:false,category:"activity"},trumpet:{keywords:["music","brass"],char:"🎺",fitzpatrick_scale:false,category:"activity"},guitar:{keywords:["music","instrument"],char:"🎸",fitzpatrick_scale:false,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:"🎻",fitzpatrick_scale:false,category:"activity"},clapper:{keywords:["movie","film","record"],char:"🎬",fitzpatrick_scale:false,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:"🎮",fitzpatrick_scale:false,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:"👾",fitzpatrick_scale:false,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:"🎯",fitzpatrick_scale:false,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:"🎲",fitzpatrick_scale:false,category:"activity"},chess_pawn:{keywords:["expendable"],char:"♟",fitzpatrick_scale:false,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:"🎰",fitzpatrick_scale:false,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:"🧩",fitzpatrick_scale:false,category:"activity"},bowling:{keywords:["sports","fun","play"],char:"🎳",fitzpatrick_scale:false,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:"🚗",fitzpatrick_scale:false,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:"🚕",fitzpatrick_scale:false,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:"🚙",fitzpatrick_scale:false,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:"🚌",fitzpatrick_scale:false,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:"🚎",fitzpatrick_scale:false,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:"🏎",fitzpatrick_scale:false,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:"🚓",fitzpatrick_scale:false,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:"🚑",fitzpatrick_scale:false,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:"🚒",fitzpatrick_scale:false,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:"🚐",fitzpatrick_scale:false,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:"🚚",fitzpatrick_scale:false,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:"🚛",fitzpatrick_scale:false,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:"🚜",fitzpatrick_scale:false,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:"🛴",fitzpatrick_scale:false,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:"🏍",fitzpatrick_scale:false,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:"🚲",fitzpatrick_scale:false,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:"🛵",fitzpatrick_scale:false,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:"🚨",fitzpatrick_scale:false,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:"🚔",fitzpatrick_scale:false,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:"🚍",fitzpatrick_scale:false,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:"🚘",fitzpatrick_scale:false,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:"🚖",fitzpatrick_scale:false,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:"🚡",fitzpatrick_scale:false,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:"🚠",fitzpatrick_scale:false,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:"🚟",fitzpatrick_scale:false,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:"🚃",fitzpatrick_scale:false,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:"🚋",fitzpatrick_scale:false,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:"🚝",fitzpatrick_scale:false,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:"🚄",fitzpatrick_scale:false,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:"🚅",fitzpatrick_scale:false,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:"🚈",fitzpatrick_scale:false,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:"🚞",fitzpatrick_scale:false,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:"🚂",fitzpatrick_scale:false,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:"🚆",fitzpatrick_scale:false,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:"🚇",fitzpatrick_scale:false,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:"🚊",fitzpatrick_scale:false,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:"🚉",fitzpatrick_scale:false,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:"🛸",fitzpatrick_scale:false,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:"🚁",fitzpatrick_scale:false,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:"🛩",fitzpatrick_scale:false,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:"✈️",fitzpatrick_scale:false,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:"🛫",fitzpatrick_scale:false,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:"🛬",fitzpatrick_scale:false,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:"⛵",fitzpatrick_scale:false,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:"🛥",fitzpatrick_scale:false,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:"🚤",fitzpatrick_scale:false,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:"⛴",fitzpatrick_scale:false,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:"🛳",fitzpatrick_scale:false,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:"🚀",fitzpatrick_scale:false,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:"🛰",fitzpatrick_scale:false,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:"💺",fitzpatrick_scale:false,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:"🛶",fitzpatrick_scale:false,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:"⚓",fitzpatrick_scale:false,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:"🚧",fitzpatrick_scale:false,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:"⛽",fitzpatrick_scale:false,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:"🚏",fitzpatrick_scale:false,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:"🚦",fitzpatrick_scale:false,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:"🚥",fitzpatrick_scale:false,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:"🏁",fitzpatrick_scale:false,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:"🚢",fitzpatrick_scale:false,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:"🎡",fitzpatrick_scale:false,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:"🎢",fitzpatrick_scale:false,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:"🎠",fitzpatrick_scale:false,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:"🏗",fitzpatrick_scale:false,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:"🌁",fitzpatrick_scale:false,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:"🗼",fitzpatrick_scale:false,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:"🏭",fitzpatrick_scale:false,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:"⛲",fitzpatrick_scale:false,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:"🎑",fitzpatrick_scale:false,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:"⛰",fitzpatrick_scale:false,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:"🏔",fitzpatrick_scale:false,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:"🗻",fitzpatrick_scale:false,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:"🌋",fitzpatrick_scale:false,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:"🗾",fitzpatrick_scale:false,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:"🏕",fitzpatrick_scale:false,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:"⛺",fitzpatrick_scale:false,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:"🏞",fitzpatrick_scale:false,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:"🛣",fitzpatrick_scale:false,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:"🛤",fitzpatrick_scale:false,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:"🌅",fitzpatrick_scale:false,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:"🌄",fitzpatrick_scale:false,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:"🏜",fitzpatrick_scale:false,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:"🏖",fitzpatrick_scale:false,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:"🏝",fitzpatrick_scale:false,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:"🌇",fitzpatrick_scale:false,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:"🌆",fitzpatrick_scale:false,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:"🏙",fitzpatrick_scale:false,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:"🌃",fitzpatrick_scale:false,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:"🌉",fitzpatrick_scale:false,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:"🌌",fitzpatrick_scale:false,category:"travel_and_places"},stars:{keywords:["night","photo"],char:"🌠",fitzpatrick_scale:false,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:"🎇",fitzpatrick_scale:false,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:"🎆",fitzpatrick_scale:false,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:"🌈",fitzpatrick_scale:false,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:"🏘",fitzpatrick_scale:false,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:"🏰",fitzpatrick_scale:false,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:"🏯",fitzpatrick_scale:false,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:"🏟",fitzpatrick_scale:false,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:"🗽",fitzpatrick_scale:false,category:"travel_and_places"},house:{keywords:["building","home"],char:"🏠",fitzpatrick_scale:false,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:"🏡",fitzpatrick_scale:false,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:"🏚",fitzpatrick_scale:false,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:"🏢",fitzpatrick_scale:false,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:"🏬",fitzpatrick_scale:false,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:"🏣",fitzpatrick_scale:false,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:"🏤",fitzpatrick_scale:false,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:"🏥",fitzpatrick_scale:false,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:"🏦",fitzpatrick_scale:false,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:"🏨",fitzpatrick_scale:false,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:"🏪",fitzpatrick_scale:false,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:"🏫",fitzpatrick_scale:false,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:"🏩",fitzpatrick_scale:false,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:"💒",fitzpatrick_scale:false,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:"🏛",fitzpatrick_scale:false,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:"⛪",fitzpatrick_scale:false,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:"🕌",fitzpatrick_scale:false,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:"🕍",fitzpatrick_scale:false,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:"🕋",fitzpatrick_scale:false,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:"⛩",fitzpatrick_scale:false,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:"⌚",fitzpatrick_scale:false,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:"📱",fitzpatrick_scale:false,category:"objects"},calling:{keywords:["iphone","incoming"],char:"📲",fitzpatrick_scale:false,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:"💻",fitzpatrick_scale:false,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:"⌨",fitzpatrick_scale:false,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:"🖥",fitzpatrick_scale:false,category:"objects"},printer:{keywords:["paper","ink"],char:"🖨",fitzpatrick_scale:false,category:"objects"},computer_mouse:{keywords:["click"],char:"🖱",fitzpatrick_scale:false,category:"objects"},trackball:{keywords:["technology","trackpad"],char:"🖲",fitzpatrick_scale:false,category:"objects"},joystick:{keywords:["game","play"],char:"🕹",fitzpatrick_scale:false,category:"objects"},clamp:{keywords:["tool"],char:"🗜",fitzpatrick_scale:false,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:"💽",fitzpatrick_scale:false,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:"💾",fitzpatrick_scale:false,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:"💿",fitzpatrick_scale:false,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:"📀",fitzpatrick_scale:false,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:"📼",fitzpatrick_scale:false,category:"objects"},camera:{keywords:["gadgets","photography"],char:"📷",fitzpatrick_scale:false,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:"📸",fitzpatrick_scale:false,category:"objects"},video_camera:{keywords:["film","record"],char:"📹",fitzpatrick_scale:false,category:"objects"},movie_camera:{keywords:["film","record"],char:"🎥",fitzpatrick_scale:false,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:"📽",fitzpatrick_scale:false,category:"objects"},film_strip:{keywords:["movie"],char:"🎞",fitzpatrick_scale:false,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:"📞",fitzpatrick_scale:false,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:"☎️",fitzpatrick_scale:false,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:"📟",fitzpatrick_scale:false,category:"objects"},fax:{keywords:["communication","technology"],char:"📠",fitzpatrick_scale:false,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:"📺",fitzpatrick_scale:false,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:"📻",fitzpatrick_scale:false,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:"🎙",fitzpatrick_scale:false,category:"objects"},level_slider:{keywords:["scale"],char:"🎚",fitzpatrick_scale:false,category:"objects"},control_knobs:{keywords:["dial"],char:"🎛",fitzpatrick_scale:false,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:"🧭",fitzpatrick_scale:false,category:"objects"},stopwatch:{keywords:["time","deadline"],char:"⏱",fitzpatrick_scale:false,category:"objects"},timer_clock:{keywords:["alarm"],char:"⏲",fitzpatrick_scale:false,category:"objects"},alarm_clock:{keywords:["time","wake"],char:"⏰",fitzpatrick_scale:false,category:"objects"},mantelpiece_clock:{keywords:["time"],char:"🕰",fitzpatrick_scale:false,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:"⏳",fitzpatrick_scale:false,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:"⌛",fitzpatrick_scale:false,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:"📡",fitzpatrick_scale:false,category:"objects"},battery:{keywords:["power","energy","sustain"],char:"🔋",fitzpatrick_scale:false,category:"objects"},electric_plug:{keywords:["charger","power"],char:"🔌",fitzpatrick_scale:false,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:"💡",fitzpatrick_scale:false,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:"🔦",fitzpatrick_scale:false,category:"objects"},candle:{keywords:["fire","wax"],char:"🕯",fitzpatrick_scale:false,category:"objects"},fire_extinguisher:{keywords:["quench"],char:"🧯",fitzpatrick_scale:false,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:"🗑",fitzpatrick_scale:false,category:"objects"},oil_drum:{keywords:["barrell"],char:"🛢",fitzpatrick_scale:false,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:"💸",fitzpatrick_scale:false,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:"💵",fitzpatrick_scale:false,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:"💴",fitzpatrick_scale:false,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:"💶",fitzpatrick_scale:false,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:"💷",fitzpatrick_scale:false,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:"💰",fitzpatrick_scale:false,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:"💳",fitzpatrick_scale:false,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:"💎",fitzpatrick_scale:false,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:"⚖",fitzpatrick_scale:false,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:"🧰",fitzpatrick_scale:false,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:"🔧",fitzpatrick_scale:false,category:"objects"},hammer:{keywords:["tools","build","create"],char:"🔨",fitzpatrick_scale:false,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:"⚒",fitzpatrick_scale:false,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:"🛠",fitzpatrick_scale:false,category:"objects"},pick:{keywords:["tools","dig"],char:"⛏",fitzpatrick_scale:false,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:"🔩",fitzpatrick_scale:false,category:"objects"},gear:{keywords:["cog"],char:"⚙",fitzpatrick_scale:false,category:"objects"},brick:{keywords:["bricks"],char:"🧱",fitzpatrick_scale:false,category:"objects"},chains:{keywords:["lock","arrest"],char:"⛓",fitzpatrick_scale:false,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:"🧲",fitzpatrick_scale:false,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:"🔫",fitzpatrick_scale:false,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:"💣",fitzpatrick_scale:false,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:"🧨",fitzpatrick_scale:false,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:"🔪",fitzpatrick_scale:false,category:"objects"},dagger:{keywords:["weapon"],char:"🗡",fitzpatrick_scale:false,category:"objects"},crossed_swords:{keywords:["weapon"],char:"⚔",fitzpatrick_scale:false,category:"objects"},shield:{keywords:["protection","security"],char:"🛡",fitzpatrick_scale:false,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:"🚬",fitzpatrick_scale:false,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:"☠",fitzpatrick_scale:false,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:"⚰",fitzpatrick_scale:false,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:"⚱",fitzpatrick_scale:false,category:"objects"},amphora:{keywords:["vase","jar"],char:"🏺",fitzpatrick_scale:false,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:"🔮",fitzpatrick_scale:false,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:"📿",fitzpatrick_scale:false,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:"🧿",fitzpatrick_scale:false,category:"objects"},barber:{keywords:["hair","salon","style"],char:"💈",fitzpatrick_scale:false,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:"⚗",fitzpatrick_scale:false,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:"🔭",fitzpatrick_scale:false,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:"🔬",fitzpatrick_scale:false,category:"objects"},hole:{keywords:["embarrassing"],char:"🕳",fitzpatrick_scale:false,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:"💊",fitzpatrick_scale:false,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:"💉",fitzpatrick_scale:false,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:"🧬",fitzpatrick_scale:false,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:"🦠",fitzpatrick_scale:false,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:"🧫",fitzpatrick_scale:false,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:"🧪",fitzpatrick_scale:false,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:"🌡",fitzpatrick_scale:false,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:"🧹",fitzpatrick_scale:false,category:"objects"},basket:{keywords:["laundry"],char:"🧺",fitzpatrick_scale:false,category:"objects"},toilet_paper:{keywords:["roll"],char:"🧻",fitzpatrick_scale:false,category:"objects"},label:{keywords:["sale","tag"],char:"🏷",fitzpatrick_scale:false,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:"🔖",fitzpatrick_scale:false,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:"🚽",fitzpatrick_scale:false,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:"🚿",fitzpatrick_scale:false,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:"🛁",fitzpatrick_scale:false,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:"🧼",fitzpatrick_scale:false,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:"🧽",fitzpatrick_scale:false,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:"🧴",fitzpatrick_scale:false,category:"objects"},key:{keywords:["lock","door","password"],char:"🔑",fitzpatrick_scale:false,category:"objects"},old_key:{keywords:["lock","door","password"],char:"🗝",fitzpatrick_scale:false,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:"🛋",fitzpatrick_scale:false,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:"🛌",fitzpatrick_scale:true,category:"objects"},bed:{keywords:["sleep","rest"],char:"🛏",fitzpatrick_scale:false,category:"objects"},door:{keywords:["house","entry","exit"],char:"🚪",fitzpatrick_scale:false,category:"objects"},bellhop_bell:{keywords:["service"],char:"🛎",fitzpatrick_scale:false,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:"🧸",fitzpatrick_scale:false,category:"objects"},framed_picture:{keywords:["photography"],char:"🖼",fitzpatrick_scale:false,category:"objects"},world_map:{keywords:["location","direction"],char:"🗺",fitzpatrick_scale:false,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:"⛱",fitzpatrick_scale:false,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:"🗿",fitzpatrick_scale:false,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:"🛍",fitzpatrick_scale:false,category:"objects"},shopping_cart:{keywords:["trolley"],char:"🛒",fitzpatrick_scale:false,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:"🎈",fitzpatrick_scale:false,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:"🎏",fitzpatrick_scale:false,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:"🎀",fitzpatrick_scale:false,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:"🎁",fitzpatrick_scale:false,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:"🎊",fitzpatrick_scale:false,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:"🎉",fitzpatrick_scale:false,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:"🎎",fitzpatrick_scale:false,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:"🎐",fitzpatrick_scale:false,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:"🎌",fitzpatrick_scale:false,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:"🏮",fitzpatrick_scale:false,category:"objects"},red_envelope:{keywords:["gift"],char:"🧧",fitzpatrick_scale:false,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:"✉️",fitzpatrick_scale:false,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:"📩",fitzpatrick_scale:false,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:"📨",fitzpatrick_scale:false,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:"📧",fitzpatrick_scale:false,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:"💌",fitzpatrick_scale:false,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:"📮",fitzpatrick_scale:false,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:"📪",fitzpatrick_scale:false,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:"📫",fitzpatrick_scale:false,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:"📬",fitzpatrick_scale:false,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:"📭",fitzpatrick_scale:false,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:"📦",fitzpatrick_scale:false,category:"objects"},postal_horn:{keywords:["instrument","music"],char:"📯",fitzpatrick_scale:false,category:"objects"},inbox_tray:{keywords:["email","documents"],char:"📥",fitzpatrick_scale:false,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:"📤",fitzpatrick_scale:false,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:"📜",fitzpatrick_scale:false,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:"📃",fitzpatrick_scale:false,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:"📑",fitzpatrick_scale:false,category:"objects"},receipt:{keywords:["accounting","expenses"],char:"🧾",fitzpatrick_scale:false,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:"📊",fitzpatrick_scale:false,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:"📈",fitzpatrick_scale:false,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:"📉",fitzpatrick_scale:false,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:"📄",fitzpatrick_scale:false,category:"objects"},date:{keywords:["calendar","schedule"],char:"📅",fitzpatrick_scale:false,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:"📆",fitzpatrick_scale:false,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:"🗓",fitzpatrick_scale:false,category:"objects"},card_index:{keywords:["business","stationery"],char:"📇",fitzpatrick_scale:false,category:"objects"},card_file_box:{keywords:["business","stationery"],char:"🗃",fitzpatrick_scale:false,category:"objects"},ballot_box:{keywords:["election","vote"],char:"🗳",fitzpatrick_scale:false,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:"🗄",fitzpatrick_scale:false,category:"objects"},clipboard:{keywords:["stationery","documents"],char:"📋",fitzpatrick_scale:false,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:"🗒",fitzpatrick_scale:false,category:"objects"},file_folder:{keywords:["documents","business","office"],char:"📁",fitzpatrick_scale:false,category:"objects"},open_file_folder:{keywords:["documents","load"],char:"📂",fitzpatrick_scale:false,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:"🗂",fitzpatrick_scale:false,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:"🗞",fitzpatrick_scale:false,category:"objects"},newspaper:{keywords:["press","headline"],char:"📰",fitzpatrick_scale:false,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:"📓",fitzpatrick_scale:false,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:"📕",fitzpatrick_scale:false,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:"📗",fitzpatrick_scale:false,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:"📘",fitzpatrick_scale:false,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:"📙",fitzpatrick_scale:false,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:"📔",fitzpatrick_scale:false,category:"objects"},ledger:{keywords:["notes","paper"],char:"📒",fitzpatrick_scale:false,category:"objects"},books:{keywords:["literature","library","study"],char:"📚",fitzpatrick_scale:false,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:"📖",fitzpatrick_scale:false,category:"objects"},safety_pin:{keywords:["diaper"],char:"🧷",fitzpatrick_scale:false,category:"objects"},link:{keywords:["rings","url"],char:"🔗",fitzpatrick_scale:false,category:"objects"},paperclip:{keywords:["documents","stationery"],char:"📎",fitzpatrick_scale:false,category:"objects"},paperclips:{keywords:["documents","stationery"],char:"🖇",fitzpatrick_scale:false,category:"objects"},scissors:{keywords:["stationery","cut"],char:"✂️",fitzpatrick_scale:false,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:"📐",fitzpatrick_scale:false,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:"📏",fitzpatrick_scale:false,category:"objects"},abacus:{keywords:["calculation"],char:"🧮",fitzpatrick_scale:false,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:"📌",fitzpatrick_scale:false,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:"📍",fitzpatrick_scale:false,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:"🚩",fitzpatrick_scale:false,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:"🏳",fitzpatrick_scale:false,category:"objects"},black_flag:{keywords:["pirate"],char:"🏴",fitzpatrick_scale:false,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:"🏳️‍🌈",fitzpatrick_scale:false,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:"🔐",fitzpatrick_scale:false,category:"objects"},lock:{keywords:["security","password","padlock"],char:"🔒",fitzpatrick_scale:false,category:"objects"},unlock:{keywords:["privacy","security"],char:"🔓",fitzpatrick_scale:false,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:"🔏",fitzpatrick_scale:false,category:"objects"},pen:{keywords:["stationery","writing","write"],char:"🖊",fitzpatrick_scale:false,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:"🖋",fitzpatrick_scale:false,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:"✒️",fitzpatrick_scale:false,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:"📝",fitzpatrick_scale:false,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:"✏️",fitzpatrick_scale:false,category:"objects"},crayon:{keywords:["drawing","creativity"],char:"🖍",fitzpatrick_scale:false,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:"🖌",fitzpatrick_scale:false,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:"🔍",fitzpatrick_scale:false,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:"🔎",fitzpatrick_scale:false,category:"objects"},heart:{keywords:["love","like","valentines"],char:"❤️",fitzpatrick_scale:false,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:"🧡",fitzpatrick_scale:false,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:"💛",fitzpatrick_scale:false,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:"💚",fitzpatrick_scale:false,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:"💙",fitzpatrick_scale:false,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:"💜",fitzpatrick_scale:false,category:"symbols"},black_heart:{keywords:["evil"],char:"🖤",fitzpatrick_scale:false,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:"💔",fitzpatrick_scale:false,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:"❣",fitzpatrick_scale:false,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:"💕",fitzpatrick_scale:false,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:"💞",fitzpatrick_scale:false,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:"💓",fitzpatrick_scale:false,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:"💗",fitzpatrick_scale:false,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:"💖",fitzpatrick_scale:false,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:"💘",fitzpatrick_scale:false,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:"💝",fitzpatrick_scale:false,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:"💟",fitzpatrick_scale:false,category:"symbols"},peace_symbol:{keywords:["hippie"],char:"☮",fitzpatrick_scale:false,category:"symbols"},latin_cross:{keywords:["christianity"],char:"✝",fitzpatrick_scale:false,category:"symbols"},star_and_crescent:{keywords:["islam"],char:"☪",fitzpatrick_scale:false,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"🕉",fitzpatrick_scale:false,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"☸",fitzpatrick_scale:false,category:"symbols"},star_of_david:{keywords:["judaism"],char:"✡",fitzpatrick_scale:false,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:"🔯",fitzpatrick_scale:false,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:"🕎",fitzpatrick_scale:false,category:"symbols"},yin_yang:{keywords:["balance"],char:"☯",fitzpatrick_scale:false,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:"☦",fitzpatrick_scale:false,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:"🛐",fitzpatrick_scale:false,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:"⛎",fitzpatrick_scale:false,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:"♈",fitzpatrick_scale:false,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:"♉",fitzpatrick_scale:false,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:"♊",fitzpatrick_scale:false,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:"♋",fitzpatrick_scale:false,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:"♌",fitzpatrick_scale:false,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:"♍",fitzpatrick_scale:false,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:"♎",fitzpatrick_scale:false,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:"♏",fitzpatrick_scale:false,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:"♐",fitzpatrick_scale:false,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:"♑",fitzpatrick_scale:false,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:"♒",fitzpatrick_scale:false,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:"♓",fitzpatrick_scale:false,category:"symbols"},id:{keywords:["purple-square","words"],char:"🆔",fitzpatrick_scale:false,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:"⚛",fitzpatrick_scale:false,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:"🈳",fitzpatrick_scale:false,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:"🈹",fitzpatrick_scale:false,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:"☢",fitzpatrick_scale:false,category:"symbols"},biohazard:{keywords:["danger"],char:"☣",fitzpatrick_scale:false,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:"📴",fitzpatrick_scale:false,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:"📳",fitzpatrick_scale:false,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:"🈶",fitzpatrick_scale:false,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:"🈚",fitzpatrick_scale:false,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:"🈸",fitzpatrick_scale:false,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:"🈺",fitzpatrick_scale:false,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:"🈷️",fitzpatrick_scale:false,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:"✴️",fitzpatrick_scale:false,category:"symbols"},vs:{keywords:["words","orange-square"],char:"🆚",fitzpatrick_scale:false,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:"🉑",fitzpatrick_scale:false,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:"💮",fitzpatrick_scale:false,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:"🉐",fitzpatrick_scale:false,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:"㊙️",fitzpatrick_scale:false,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:"㊗️",fitzpatrick_scale:false,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:"🈴",fitzpatrick_scale:false,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:"🈵",fitzpatrick_scale:false,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:"🈲",fitzpatrick_scale:false,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:"🅰️",fitzpatrick_scale:false,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:"🅱️",fitzpatrick_scale:false,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:"🆎",fitzpatrick_scale:false,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:"🆑",fitzpatrick_scale:false,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:"🅾️",fitzpatrick_scale:false,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:"🆘",fitzpatrick_scale:false,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:"⛔",fitzpatrick_scale:false,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:"📛",fitzpatrick_scale:false,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:"🚫",fitzpatrick_scale:false,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:"❌",fitzpatrick_scale:false,category:"symbols"},o:{keywords:["circle","round"],char:"⭕",fitzpatrick_scale:false,category:"symbols"},stop_sign:{keywords:["stop"],char:"🛑",fitzpatrick_scale:false,category:"symbols"},anger:{keywords:["angry","mad"],char:"💢",fitzpatrick_scale:false,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:"♨️",fitzpatrick_scale:false,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:"🚷",fitzpatrick_scale:false,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:"🚯",fitzpatrick_scale:false,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:"🚳",fitzpatrick_scale:false,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:"🚱",fitzpatrick_scale:false,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:"🔞",fitzpatrick_scale:false,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:"📵",fitzpatrick_scale:false,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:"❗",fitzpatrick_scale:false,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:"❕",fitzpatrick_scale:false,category:"symbols"},question:{keywords:["doubt","confused"],char:"❓",fitzpatrick_scale:false,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:"❔",fitzpatrick_scale:false,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:"‼️",fitzpatrick_scale:false,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:"⁉️",fitzpatrick_scale:false,category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:"💯",fitzpatrick_scale:false,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:"🔅",fitzpatrick_scale:false,category:"symbols"},high_brightness:{keywords:["sun","light"],char:"🔆",fitzpatrick_scale:false,category:"symbols"},trident:{keywords:["weapon","spear"],char:"🔱",fitzpatrick_scale:false,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:"⚜",fitzpatrick_scale:false,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:"〽️",fitzpatrick_scale:false,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:"⚠️",fitzpatrick_scale:false,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:"🚸",fitzpatrick_scale:false,category:"symbols"},beginner:{keywords:["badge","shield"],char:"🔰",fitzpatrick_scale:false,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:"♻️",fitzpatrick_scale:false,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:"🈯",fitzpatrick_scale:false,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:"💹",fitzpatrick_scale:false,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:"❇️",fitzpatrick_scale:false,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:"✳️",fitzpatrick_scale:false,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:"❎",fitzpatrick_scale:false,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:"✅",fitzpatrick_scale:false,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:"💠",fitzpatrick_scale:false,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:"🌀",fitzpatrick_scale:false,category:"symbols"},loop:{keywords:["tape","cassette"],char:"➿",fitzpatrick_scale:false,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:"🌐",fitzpatrick_scale:false,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:"Ⓜ️",fitzpatrick_scale:false,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:"🏧",fitzpatrick_scale:false,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:"🈂️",fitzpatrick_scale:false,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:"🛂",fitzpatrick_scale:false,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:"🛃",fitzpatrick_scale:false,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:"🛄",fitzpatrick_scale:false,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:"🛅",fitzpatrick_scale:false,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:"♿",fitzpatrick_scale:false,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:"🚭",fitzpatrick_scale:false,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:"🚾",fitzpatrick_scale:false,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:"🅿️",fitzpatrick_scale:false,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:"🚰",fitzpatrick_scale:false,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:"🚹",fitzpatrick_scale:false,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:"🚺",fitzpatrick_scale:false,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:"🚼",fitzpatrick_scale:false,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:"🚻",fitzpatrick_scale:false,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:"🚮",fitzpatrick_scale:false,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:"🎦",fitzpatrick_scale:false,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:"📶",fitzpatrick_scale:false,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:"🈁",fitzpatrick_scale:false,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:"🆖",fitzpatrick_scale:false,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:"🆗",fitzpatrick_scale:false,category:"symbols"},up:{keywords:["blue-square","above","high"],char:"🆙",fitzpatrick_scale:false,category:"symbols"},cool:{keywords:["words","blue-square"],char:"🆒",fitzpatrick_scale:false,category:"symbols"},new:{keywords:["blue-square","words","start"],char:"🆕",fitzpatrick_scale:false,category:"symbols"},free:{keywords:["blue-square","words"],char:"🆓",fitzpatrick_scale:false,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:"0️⃣",fitzpatrick_scale:false,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:"1️⃣",fitzpatrick_scale:false,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:"2️⃣",fitzpatrick_scale:false,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:"3️⃣",fitzpatrick_scale:false,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:"4️⃣",fitzpatrick_scale:false,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:"5️⃣",fitzpatrick_scale:false,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:"6️⃣",fitzpatrick_scale:false,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:"7️⃣",fitzpatrick_scale:false,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:"8️⃣",fitzpatrick_scale:false,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:"9️⃣",fitzpatrick_scale:false,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:"🔟",fitzpatrick_scale:false,category:"symbols"},asterisk:{keywords:["star","keycap"],char:"*⃣",fitzpatrick_scale:false,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:"🔢",fitzpatrick_scale:false,category:"symbols"},eject_button:{keywords:["blue-square"],char:"⏏️",fitzpatrick_scale:false,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:"▶️",fitzpatrick_scale:false,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:"⏸",fitzpatrick_scale:false,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:"⏭",fitzpatrick_scale:false,category:"symbols"},stop_button:{keywords:["blue-square"],char:"⏹",fitzpatrick_scale:false,category:"symbols"},record_button:{keywords:["blue-square"],char:"⏺",fitzpatrick_scale:false,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:"⏯",fitzpatrick_scale:false,category:"symbols"},previous_track_button:{keywords:["backward"],char:"⏮",fitzpatrick_scale:false,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:"⏩",fitzpatrick_scale:false,category:"symbols"},rewind:{keywords:["play","blue-square"],char:"⏪",fitzpatrick_scale:false,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:"🔀",fitzpatrick_scale:false,category:"symbols"},repeat:{keywords:["loop","record"],char:"🔁",fitzpatrick_scale:false,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:"🔂",fitzpatrick_scale:false,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:"◀️",fitzpatrick_scale:false,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:"🔼",fitzpatrick_scale:false,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:"🔽",fitzpatrick_scale:false,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:"⏫",fitzpatrick_scale:false,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:"⏬",fitzpatrick_scale:false,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:"➡️",fitzpatrick_scale:false,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:"⬅️",fitzpatrick_scale:false,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:"⬆️",fitzpatrick_scale:false,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:"⬇️",fitzpatrick_scale:false,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:"↗️",fitzpatrick_scale:false,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:"↘️",fitzpatrick_scale:false,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:"↙️",fitzpatrick_scale:false,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:"↖️",fitzpatrick_scale:false,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:"↕️",fitzpatrick_scale:false,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:"↔️",fitzpatrick_scale:false,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:"🔄",fitzpatrick_scale:false,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:"↪️",fitzpatrick_scale:false,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:"↩️",fitzpatrick_scale:false,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:"⤴️",fitzpatrick_scale:false,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:"⤵️",fitzpatrick_scale:false,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:"#️⃣",fitzpatrick_scale:false,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:"ℹ️",fitzpatrick_scale:false,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:"🔤",fitzpatrick_scale:false,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:"🔡",fitzpatrick_scale:false,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:"🔠",fitzpatrick_scale:false,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:"🔣",fitzpatrick_scale:false,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:"🎵",fitzpatrick_scale:false,category:"symbols"},notes:{keywords:["music","score"],char:"🎶",fitzpatrick_scale:false,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:"〰️",fitzpatrick_scale:false,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:"➰",fitzpatrick_scale:false,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:"✔️",fitzpatrick_scale:false,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:"🔃",fitzpatrick_scale:false,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:"➕",fitzpatrick_scale:false,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:"➖",fitzpatrick_scale:false,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:"➗",fitzpatrick_scale:false,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:"✖️",fitzpatrick_scale:false,category:"symbols"},infinity:{keywords:["forever"],char:"♾",fitzpatrick_scale:false,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:"💲",fitzpatrick_scale:false,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:"💱",fitzpatrick_scale:false,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:"©️",fitzpatrick_scale:false,category:"symbols"},registered:{keywords:["alphabet","circle"],char:"®️",fitzpatrick_scale:false,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:"™️",fitzpatrick_scale:false,category:"symbols"},end:{keywords:["words","arrow"],char:"🔚",fitzpatrick_scale:false,category:"symbols"},back:{keywords:["arrow","words","return"],char:"🔙",fitzpatrick_scale:false,category:"symbols"},on:{keywords:["arrow","words"],char:"🔛",fitzpatrick_scale:false,category:"symbols"},top:{keywords:["words","blue-square"],char:"🔝",fitzpatrick_scale:false,category:"symbols"},soon:{keywords:["arrow","words"],char:"🔜",fitzpatrick_scale:false,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:"☑️",fitzpatrick_scale:false,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:"🔘",fitzpatrick_scale:false,category:"symbols"},white_circle:{keywords:["shape","round"],char:"⚪",fitzpatrick_scale:false,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:"⚫",fitzpatrick_scale:false,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:"🔴",fitzpatrick_scale:false,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:"🔵",fitzpatrick_scale:false,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:"🔸",fitzpatrick_scale:false,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:"🔹",fitzpatrick_scale:false,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:"🔶",fitzpatrick_scale:false,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:"🔷",fitzpatrick_scale:false,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:"🔺",fitzpatrick_scale:false,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:"▪️",fitzpatrick_scale:false,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:"▫️",fitzpatrick_scale:false,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:"⬛",fitzpatrick_scale:false,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:"⬜",fitzpatrick_scale:false,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:"🔻",fitzpatrick_scale:false,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:"◼️",fitzpatrick_scale:false,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:"◻️",fitzpatrick_scale:false,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:"◾",fitzpatrick_scale:false,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:"◽",fitzpatrick_scale:false,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:"🔲",fitzpatrick_scale:false,category:"symbols"},white_square_button:{keywords:["shape","input"],char:"🔳",fitzpatrick_scale:false,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:"🔈",fitzpatrick_scale:false,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:"🔉",fitzpatrick_scale:false,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:"🔊",fitzpatrick_scale:false,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:"🔇",fitzpatrick_scale:false,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:"📣",fitzpatrick_scale:false,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:"📢",fitzpatrick_scale:false,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:"🔔",fitzpatrick_scale:false,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:"🔕",fitzpatrick_scale:false,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:"🃏",fitzpatrick_scale:false,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:"🀄",fitzpatrick_scale:false,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:"♠️",fitzpatrick_scale:false,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:"♣️",fitzpatrick_scale:false,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:"♥️",fitzpatrick_scale:false,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:"♦️",fitzpatrick_scale:false,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:"🎴",fitzpatrick_scale:false,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:"💭",fitzpatrick_scale:false,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:"🗯",fitzpatrick_scale:false,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:"💬",fitzpatrick_scale:false,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:"🗨",fitzpatrick_scale:false,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:"🕐",fitzpatrick_scale:false,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:"🕑",fitzpatrick_scale:false,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:"🕒",fitzpatrick_scale:false,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:"🕓",fitzpatrick_scale:false,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:"🕔",fitzpatrick_scale:false,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:"🕕",fitzpatrick_scale:false,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:"🕖",fitzpatrick_scale:false,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:"🕗",fitzpatrick_scale:false,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:"🕘",fitzpatrick_scale:false,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:"🕙",fitzpatrick_scale:false,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:"🕚",fitzpatrick_scale:false,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:"🕛",fitzpatrick_scale:false,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:"🕜",fitzpatrick_scale:false,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:"🕝",fitzpatrick_scale:false,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:"🕞",fitzpatrick_scale:false,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:"🕟",fitzpatrick_scale:false,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:"🕠",fitzpatrick_scale:false,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:"🕡",fitzpatrick_scale:false,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:"🕢",fitzpatrick_scale:false,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:"🕣",fitzpatrick_scale:false,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:"🕤",fitzpatrick_scale:false,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:"🕥",fitzpatrick_scale:false,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:"🕦",fitzpatrick_scale:false,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:"🕧",fitzpatrick_scale:false,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:"🇦🇫",fitzpatrick_scale:false,category:"flags"},aland_islands:{keywords:["Åland","islands","flag","nation","country","banner"],char:"🇦🇽",fitzpatrick_scale:false,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:"🇦🇱",fitzpatrick_scale:false,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:"🇩🇿",fitzpatrick_scale:false,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:"🇦🇸",fitzpatrick_scale:false,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:"🇦🇩",fitzpatrick_scale:false,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:"🇦🇴",fitzpatrick_scale:false,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:"🇦🇮",fitzpatrick_scale:false,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:"🇦🇶",fitzpatrick_scale:false,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:"🇦🇬",fitzpatrick_scale:false,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:"🇦🇷",fitzpatrick_scale:false,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:"🇦🇲",fitzpatrick_scale:false,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:"🇦🇼",fitzpatrick_scale:false,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:"🇦🇺",fitzpatrick_scale:false,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:"🇦🇹",fitzpatrick_scale:false,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:"🇦🇿",fitzpatrick_scale:false,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:"🇧🇸",fitzpatrick_scale:false,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:"🇧🇭",fitzpatrick_scale:false,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:"🇧🇩",fitzpatrick_scale:false,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:"🇧🇧",fitzpatrick_scale:false,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:"🇧🇾",fitzpatrick_scale:false,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:"🇧🇪",fitzpatrick_scale:false,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:"🇧🇿",fitzpatrick_scale:false,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:"🇧🇯",fitzpatrick_scale:false,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:"🇧🇲",fitzpatrick_scale:false,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:"🇧🇹",fitzpatrick_scale:false,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:"🇧🇴",fitzpatrick_scale:false,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:"🇧🇶",fitzpatrick_scale:false,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:"🇧🇦",fitzpatrick_scale:false,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:"🇧🇼",fitzpatrick_scale:false,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:"🇧🇷",fitzpatrick_scale:false,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:"🇮🇴",fitzpatrick_scale:false,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:"🇻🇬",fitzpatrick_scale:false,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:"🇧🇳",fitzpatrick_scale:false,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:"🇧🇬",fitzpatrick_scale:false,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:"🇧🇫",fitzpatrick_scale:false,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:"🇧🇮",fitzpatrick_scale:false,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:"🇨🇻",fitzpatrick_scale:false,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:"🇰🇭",fitzpatrick_scale:false,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:"🇨🇲",fitzpatrick_scale:false,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:"🇨🇦",fitzpatrick_scale:false,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:"🇮🇨",fitzpatrick_scale:false,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:"🇰🇾",fitzpatrick_scale:false,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:"🇨🇫",fitzpatrick_scale:false,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:"🇹🇩",fitzpatrick_scale:false,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:"🇨🇱",fitzpatrick_scale:false,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:"🇨🇳",fitzpatrick_scale:false,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:"🇨🇽",fitzpatrick_scale:false,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:"🇨🇨",fitzpatrick_scale:false,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:"🇨🇴",fitzpatrick_scale:false,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:"🇰🇲",fitzpatrick_scale:false,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:"🇨🇬",fitzpatrick_scale:false,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:"🇨🇩",fitzpatrick_scale:false,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:"🇨🇰",fitzpatrick_scale:false,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:"🇨🇷",fitzpatrick_scale:false,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:"🇭🇷",fitzpatrick_scale:false,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:"🇨🇺",fitzpatrick_scale:false,category:"flags"},curacao:{keywords:["curaçao","flag","nation","country","banner"],char:"🇨🇼",fitzpatrick_scale:false,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:"🇨🇾",fitzpatrick_scale:false,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:"🇨🇿",fitzpatrick_scale:false,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:"🇩🇰",fitzpatrick_scale:false,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:"🇩🇯",fitzpatrick_scale:false,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:"🇩🇲",fitzpatrick_scale:false,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:"🇩🇴",fitzpatrick_scale:false,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:"🇪🇨",fitzpatrick_scale:false,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:"🇪🇬",fitzpatrick_scale:false,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:"🇸🇻",fitzpatrick_scale:false,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:"🇬🇶",fitzpatrick_scale:false,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:"🇪🇷",fitzpatrick_scale:false,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:"🇪🇪",fitzpatrick_scale:false,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:"🇪🇹",fitzpatrick_scale:false,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:"🇪🇺",fitzpatrick_scale:false,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:"🇫🇰",fitzpatrick_scale:false,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:"🇫🇴",fitzpatrick_scale:false,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:"🇫🇯",fitzpatrick_scale:false,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:"🇫🇮",fitzpatrick_scale:false,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:"🇫🇷",fitzpatrick_scale:false,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:"🇬🇫",fitzpatrick_scale:false,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:"🇵🇫",fitzpatrick_scale:false,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:"🇹🇫",fitzpatrick_scale:false,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:"🇬🇦",fitzpatrick_scale:false,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:"🇬🇲",fitzpatrick_scale:false,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:"🇬🇪",fitzpatrick_scale:false,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:"🇩🇪",fitzpatrick_scale:false,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:"🇬🇭",fitzpatrick_scale:false,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:"🇬🇮",fitzpatrick_scale:false,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:"🇬🇷",fitzpatrick_scale:false,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:"🇬🇱",fitzpatrick_scale:false,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:"🇬🇩",fitzpatrick_scale:false,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:"🇬🇵",fitzpatrick_scale:false,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:"🇬🇺",fitzpatrick_scale:false,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:"🇬🇹",fitzpatrick_scale:false,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:"🇬🇬",fitzpatrick_scale:false,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:"🇬🇳",fitzpatrick_scale:false,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:"🇬🇼",fitzpatrick_scale:false,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:"🇬🇾",fitzpatrick_scale:false,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:"🇭🇹",fitzpatrick_scale:false,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:"🇭🇳",fitzpatrick_scale:false,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:"🇭🇰",fitzpatrick_scale:false,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:"🇭🇺",fitzpatrick_scale:false,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:"🇮🇸",fitzpatrick_scale:false,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:"🇮🇳",fitzpatrick_scale:false,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:"🇮🇩",fitzpatrick_scale:false,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:"🇮🇷",fitzpatrick_scale:false,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:"🇮🇶",fitzpatrick_scale:false,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:"🇮🇪",fitzpatrick_scale:false,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:"🇮🇲",fitzpatrick_scale:false,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:"🇮🇱",fitzpatrick_scale:false,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:"🇮🇹",fitzpatrick_scale:false,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:"🇨🇮",fitzpatrick_scale:false,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:"🇯🇲",fitzpatrick_scale:false,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:"🇯🇵",fitzpatrick_scale:false,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:"🇯🇪",fitzpatrick_scale:false,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:"🇯🇴",fitzpatrick_scale:false,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:"🇰🇿",fitzpatrick_scale:false,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:"🇰🇪",fitzpatrick_scale:false,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:"🇰🇮",fitzpatrick_scale:false,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:"🇽🇰",fitzpatrick_scale:false,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:"🇰🇼",fitzpatrick_scale:false,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:"🇰🇬",fitzpatrick_scale:false,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:"🇱🇦",fitzpatrick_scale:false,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:"🇱🇻",fitzpatrick_scale:false,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:"🇱🇧",fitzpatrick_scale:false,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:"🇱🇸",fitzpatrick_scale:false,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:"🇱🇷",fitzpatrick_scale:false,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:"🇱🇾",fitzpatrick_scale:false,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:"🇱🇮",fitzpatrick_scale:false,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:"🇱🇹",fitzpatrick_scale:false,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:"🇱🇺",fitzpatrick_scale:false,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:"🇲🇴",fitzpatrick_scale:false,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:"🇲🇰",fitzpatrick_scale:false,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:"🇲🇬",fitzpatrick_scale:false,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:"🇲🇼",fitzpatrick_scale:false,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:"🇲🇾",fitzpatrick_scale:false,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:"🇲🇻",fitzpatrick_scale:false,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:"🇲🇱",fitzpatrick_scale:false,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:"🇲🇹",fitzpatrick_scale:false,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:"🇲🇭",fitzpatrick_scale:false,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:"🇲🇶",fitzpatrick_scale:false,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:"🇲🇷",fitzpatrick_scale:false,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:"🇲🇺",fitzpatrick_scale:false,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:"🇾🇹",fitzpatrick_scale:false,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:"🇲🇽",fitzpatrick_scale:false,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:"🇫🇲",fitzpatrick_scale:false,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:"🇲🇩",fitzpatrick_scale:false,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:"🇲🇨",fitzpatrick_scale:false,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:"🇲🇳",fitzpatrick_scale:false,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:"🇲🇪",fitzpatrick_scale:false,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:"🇲🇸",fitzpatrick_scale:false,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:"🇲🇦",fitzpatrick_scale:false,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:"🇲🇿",fitzpatrick_scale:false,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:"🇲🇲",fitzpatrick_scale:false,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:"🇳🇦",fitzpatrick_scale:false,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:"🇳🇷",fitzpatrick_scale:false,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:"🇳🇵",fitzpatrick_scale:false,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:"🇳🇱",fitzpatrick_scale:false,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:"🇳🇨",fitzpatrick_scale:false,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:"🇳🇿",fitzpatrick_scale:false,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:"🇳🇮",fitzpatrick_scale:false,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:"🇳🇪",fitzpatrick_scale:false,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:"🇳🇬",fitzpatrick_scale:false,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:"🇳🇺",fitzpatrick_scale:false,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:"🇳🇫",fitzpatrick_scale:false,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:"🇲🇵",fitzpatrick_scale:false,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:"🇰🇵",fitzpatrick_scale:false,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:"🇳🇴",fitzpatrick_scale:false,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:"🇴🇲",fitzpatrick_scale:false,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:"🇵🇰",fitzpatrick_scale:false,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:"🇵🇼",fitzpatrick_scale:false,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:"🇵🇸",fitzpatrick_scale:false,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:"🇵🇦",fitzpatrick_scale:false,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:"🇵🇬",fitzpatrick_scale:false,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:"🇵🇾",fitzpatrick_scale:false,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:"🇵🇪",fitzpatrick_scale:false,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:"🇵🇭",fitzpatrick_scale:false,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:"🇵🇳",fitzpatrick_scale:false,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:"🇵🇱",fitzpatrick_scale:false,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:"🇵🇹",fitzpatrick_scale:false,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:"🇵🇷",fitzpatrick_scale:false,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:"🇶🇦",fitzpatrick_scale:false,category:"flags"},reunion:{keywords:["réunion","flag","nation","country","banner"],char:"🇷🇪",fitzpatrick_scale:false,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:"🇷🇴",fitzpatrick_scale:false,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:"🇷🇺",fitzpatrick_scale:false,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:"🇷🇼",fitzpatrick_scale:false,category:"flags"},st_barthelemy:{keywords:["saint","barthélemy","flag","nation","country","banner"],char:"🇧🇱",fitzpatrick_scale:false,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:"🇸🇭",fitzpatrick_scale:false,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:"🇰🇳",fitzpatrick_scale:false,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:"🇱🇨",fitzpatrick_scale:false,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:"🇵🇲",fitzpatrick_scale:false,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:"🇻🇨",fitzpatrick_scale:false,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:"🇼🇸",fitzpatrick_scale:false,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:"🇸🇲",fitzpatrick_scale:false,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:"🇸🇹",fitzpatrick_scale:false,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:"🇸🇦",fitzpatrick_scale:false,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:"🇸🇳",fitzpatrick_scale:false,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:"🇷🇸",fitzpatrick_scale:false,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:"🇸🇨",fitzpatrick_scale:false,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:"🇸🇱",fitzpatrick_scale:false,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:"🇸🇬",fitzpatrick_scale:false,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:"🇸🇽",fitzpatrick_scale:false,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:"🇸🇰",fitzpatrick_scale:false,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:"🇸🇮",fitzpatrick_scale:false,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:"🇸🇧",fitzpatrick_scale:false,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:"🇸🇴",fitzpatrick_scale:false,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:"🇿🇦",fitzpatrick_scale:false,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:"🇬🇸",fitzpatrick_scale:false,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:"🇰🇷",fitzpatrick_scale:false,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:"🇸🇸",fitzpatrick_scale:false,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:"🇪🇸",fitzpatrick_scale:false,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:"🇱🇰",fitzpatrick_scale:false,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:"🇸🇩",fitzpatrick_scale:false,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:"🇸🇷",fitzpatrick_scale:false,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:"🇸🇿",fitzpatrick_scale:false,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:"🇸🇪",fitzpatrick_scale:false,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:"🇨🇭",fitzpatrick_scale:false,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:"🇸🇾",fitzpatrick_scale:false,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:"🇹🇼",fitzpatrick_scale:false,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:"🇹🇯",fitzpatrick_scale:false,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:"🇹🇿",fitzpatrick_scale:false,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:"🇹🇭",fitzpatrick_scale:false,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:"🇹🇱",fitzpatrick_scale:false,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:"🇹🇬",fitzpatrick_scale:false,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:"🇹🇰",fitzpatrick_scale:false,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:"🇹🇴",fitzpatrick_scale:false,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:"🇹🇹",fitzpatrick_scale:false,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:"🇹🇳",fitzpatrick_scale:false,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:"🇹🇷",fitzpatrick_scale:false,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:"🇹🇲",fitzpatrick_scale:false,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:"🇹🇨",fitzpatrick_scale:false,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:"🇹🇻",fitzpatrick_scale:false,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:"🇺🇬",fitzpatrick_scale:false,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:"🇺🇦",fitzpatrick_scale:false,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:"🇦🇪",fitzpatrick_scale:false,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:"🇬🇧",fitzpatrick_scale:false,category:"flags"},england:{keywords:["flag","english"],char:"🏴󠁧󠁢󠁥󠁮󠁧󠁿",fitzpatrick_scale:false,category:"flags"},scotland:{keywords:["flag","scottish"],char:"🏴󠁧󠁢󠁳󠁣󠁴󠁿",fitzpatrick_scale:false,category:"flags"},wales:{keywords:["flag","welsh"],char:"🏴󠁧󠁢󠁷󠁬󠁳󠁿",fitzpatrick_scale:false,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:"🇺🇸",fitzpatrick_scale:false,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:"🇻🇮",fitzpatrick_scale:false,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:"🇺🇾",fitzpatrick_scale:false,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:"🇺🇿",fitzpatrick_scale:false,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:"🇻🇺",fitzpatrick_scale:false,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:"🇻🇦",fitzpatrick_scale:false,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:"🇻🇪",fitzpatrick_scale:false,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:"🇻🇳",fitzpatrick_scale:false,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:"🇼🇫",fitzpatrick_scale:false,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:"🇪🇭",fitzpatrick_scale:false,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:"🇾🇪",fitzpatrick_scale:false,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:"🇿🇲",fitzpatrick_scale:false,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:"🇿🇼",fitzpatrick_scale:false,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:"🇺🇳",fitzpatrick_scale:false,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:"🏴‍☠️",fitzpatrick_scale:false,category:"flags"}}); \ No newline at end of file diff --git a/public/js/tinymce/plugins/emoticons/js/emojis.min.js b/public/js/tinymce/plugins/emoticons/js/emojis.min.js index 42cea9ab4..5a1c49160 100644 --- a/public/js/tinymce/plugins/emoticons/js/emojis.min.js +++ b/public/js/tinymce/plugins/emoticons/js/emojis.min.js @@ -1,2 +1,2 @@ // Source: npm package: emojilib, file:emojis.json -window.tinymce.Resource.add("tinymce.plugins.emoticons",{grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:"\ud83d\ude00",fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:"\ud83d\ude2c",fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:"\ud83d\ude01",fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:"\ud83d\ude02",fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:"\ud83e\udd23",fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:"\ud83e\udd73",fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:"\ud83d\ude03",fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:"\ud83d\ude04",fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:"\ud83d\ude05",fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:"\ud83d\ude06",fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:"\ud83d\ude07",fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:"\ud83d\ude09",fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:"\ud83d\ude0a",fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:"\ud83d\ude42",fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:"\ud83d\ude43",fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:"\u263a\ufe0f",fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:"\ud83d\ude0b",fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:"\ud83d\ude0c",fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:"\ud83d\ude0d",fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:"\ud83e\udd70",fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\ud83d\ude18",fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:"\ud83d\ude17",fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:"\ud83d\ude19",fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\ud83d\ude1a",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:"\ud83d\ude1c",fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:"\ud83e\udd2a",fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:"\ud83e\udd28",fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:"\ud83e\uddd0",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:"\ud83d\ude1d",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:"\ud83d\ude1b",fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:"\ud83e\udd11",fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:"\ud83e\udd13",fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:"\ud83d\ude0e",fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:"\ud83e\udd29",fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:"\ud83e\udd21",fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:"\ud83e\udd20",fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:"\ud83e\udd17",fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:"\ud83d\ude0f",fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:"\ud83d\ude36",fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:"\ud83d\ude10",fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:"\ud83d\ude11",fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:"\ud83d\ude12",fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:"\ud83d\ude44",fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:"\ud83e\udd14",fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:"\ud83e\udd25",fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:"\ud83e\udd2d",fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:"\ud83e\udd2b",fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:"\ud83e\udd2c",fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:"\ud83e\udd2f",fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:"\ud83d\ude33",fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:"\ud83d\ude1e",fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:"\ud83d\ude1f",fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:"\ud83d\ude20",fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:"\ud83d\ude21",fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:"\ud83d\ude14",fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:"\ud83d\ude15",fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:"\ud83d\ude41",fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:"\u2639",fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:"\ud83d\ude23",fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:"\ud83d\ude16",fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:"\ud83d\ude2b",fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:"\ud83d\ude29",fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:"\ud83e\udd7a",fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:"\ud83d\ude24",fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:"\ud83d\ude2e",fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:"\ud83d\ude31",fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:"\ud83d\ude28",fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:"\ud83d\ude30",fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:"\ud83d\ude2f",fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:"\ud83d\ude26",fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:"\ud83d\ude27",fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:"\ud83d\ude22",fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:"\ud83d\ude25",fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:"\ud83e\udd24",fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:"\ud83d\ude2a",fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:"\ud83d\ude13",fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:"\ud83e\udd75",fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:"\ud83e\udd76",fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:"\ud83d\ude2d",fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:"\ud83d\ude35",fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:"\ud83d\ude32",fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:"\ud83e\udd10",fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:"\ud83e\udd22",fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:"\ud83e\udd27",fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:"\ud83e\udd2e",fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:"\ud83d\ude37",fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:"\ud83e\udd12",fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:"\ud83e\udd15",fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:"\ud83e\udd74",fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:"\ud83d\ude34",fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:"\ud83d\udca4",fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:"\ud83d\udca9",fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:"\ud83d\ude08",fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:"\ud83d\udc7f",fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:"\ud83d\udc79",fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:"\ud83d\udc7a",fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:"\ud83d\udc80",fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:"\ud83d\udc7b",fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:"\ud83d\udc7d",fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:"\ud83e\udd16",fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:"\ud83d\ude3a",fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:"\ud83d\ude38",fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:"\ud83d\ude39",fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:"\ud83d\ude3b",fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:"\ud83d\ude3c",fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:"\ud83d\ude3d",fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:"\ud83d\ude40",fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:"\ud83d\ude3f",fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:"\ud83d\ude3e",fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:"\ud83e\udd32",fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:"\ud83d\ude4c",fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:"\ud83d\udc4f",fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:"\ud83d\udc4b",fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:"\ud83e\udd19",fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:"\ud83d\udc4d",fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:"\ud83d\udc4e",fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:"\ud83d\udc4a",fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:"\u270a",fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:"\ud83e\udd1b",fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:"\ud83e\udd1c",fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:"\u270c",fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:"\ud83d\udc4c",fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:"\u270b",fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:"\ud83e\udd1a",fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:"\ud83d\udc50",fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:"\ud83d\udcaa",fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:"\ud83d\ude4f",fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:"\ud83e\uddb6",fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:"\ud83e\uddb5",fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:"\ud83e\udd1d",fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:"\u261d",fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:"\ud83d\udc46",fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:"\ud83d\udc47",fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:"\ud83d\udc48",fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:"\ud83d\udc49",fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:"\ud83d\udd95",fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:"\ud83d\udd90",fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:"\ud83e\udd1f",fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:"\ud83e\udd18",fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:"\ud83e\udd1e",fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:"\ud83d\udd96",fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:"\u270d",fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:"\ud83e\udd33",fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:"\ud83d\udc85",fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:"\ud83d\udc44",fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:"\ud83e\uddb7",fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:"\ud83d\udc45",fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:"\ud83d\udc42",fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:"\ud83d\udc43",fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:"\ud83d\udc41",fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:"\ud83d\udc40",fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:"\ud83e\udde0",fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:"\ud83d\udc64",fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:"\ud83d\udc65",fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:"\ud83d\udde3",fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:"\ud83d\udc76",fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:"\ud83e\uddd2",fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:"\ud83d\udc66",fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:"\ud83d\udc67",fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:"\ud83e\uddd1",fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:"\ud83d\udc68",fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:"\ud83d\udc69",fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:"\ud83d\udc71\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:"\ud83d\udc71",fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:"\ud83e\uddd4",fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:"\ud83e\uddd3",fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:"\ud83d\udc74",fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:"\ud83d\udc75",fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:"\ud83d\udc72",fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:"\ud83e\uddd5",fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:"\ud83d\udc73\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:"\ud83d\udc73",fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:"\ud83d\udc6e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:"\ud83d\udc6e",fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:"\ud83d\udc77\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:"\ud83d\udc77",fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:"\ud83d\udc82\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:"\ud83d\udc82",fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:"\ud83d\udd75\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:"\ud83d\udd75",fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:"\ud83d\udc69\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:"\ud83d\udc68\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:"\ud83d\udc69\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:"\ud83d\udc68\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:"\ud83d\udc69\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:"\ud83d\udc68\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:"\ud83d\udc69\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:"\ud83d\udc68\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:"\ud83d\udc69\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:"\ud83d\udc68\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:"\ud83d\udc69\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:"\ud83d\udc68\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:"\ud83d\udc69\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:"\ud83d\udc68\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:"\ud83d\udc69\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:"\ud83d\udc68\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:"\ud83d\udc69\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:"\ud83d\udc68\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:"\ud83e\uddb8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:"\ud83e\uddb8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:"\ud83e\uddb9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:"\ud83e\uddb9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:"\ud83e\udd36",fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:"\ud83c\udf85",fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:"\ud83e\uddd9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:"\ud83e\uddd9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:"\ud83e\udddd\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:"\ud83e\udddd\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:"\ud83e\udddb\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:"\ud83e\udddb\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:"\ud83e\udddf\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:"\ud83e\udddf\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:"\ud83e\uddde\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:"\ud83e\uddde\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:"\ud83e\udddc\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:"\ud83e\udddc\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:"\ud83e\uddda\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:"\ud83e\uddda\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:"\ud83d\udc7c",fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:"\ud83e\udd30",fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:"\ud83e\udd31",fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:"\ud83d\udc78",fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:"\ud83e\udd34",fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:"\ud83d\udc70",fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:"\ud83e\udd35",fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:"\ud83c\udfc3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:"\ud83c\udfc3",fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:"\ud83d\udeb6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:"\ud83d\udeb6",fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:"\ud83d\udc83",fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:"\ud83d\udd7a",fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:"\ud83d\udc6f",fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:"\ud83d\udc6f\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:"\ud83d\udc6b",fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:"\ud83d\udc6c",fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:"\ud83d\udc6d",fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:"\ud83d\ude47\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:"\ud83d\ude47",fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:"\ud83e\udd26\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:"\ud83e\udd26\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:"\ud83e\udd37",fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:"\ud83e\udd37\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:"\ud83d\udc81",fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:"\ud83d\udc81\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:"\ud83d\ude45",fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:"\ud83d\ude45\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:"\ud83d\ude46",fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:"\ud83d\ude46\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:"\ud83d\ude4b",fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:"\ud83d\ude4b\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:"\ud83d\ude4e",fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:"\ud83d\ude4e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:"\ud83d\ude4d",fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:"\ud83d\ude4d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:"\ud83d\udc87",fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:"\ud83d\udc87\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:"\ud83d\udc86",fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:"\ud83d\udc86\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:"\ud83e\uddd6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:"\ud83e\uddd6\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc91",fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc8f",fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:"\ud83d\udc6a",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:"\ud83e\uddf6",fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:"\ud83e\uddf5",fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:"\ud83e\udde5",fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:"\ud83e\udd7c",fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:"\ud83d\udc5a",fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:"\ud83d\udc55",fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:"\ud83d\udc56",fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:"\ud83d\udc54",fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:"\ud83d\udc57",fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:"\ud83d\udc59",fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:"\ud83d\udc58",fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:"\ud83d\udc84",fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:"\ud83d\udc8b",fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:"\ud83d\udc63",fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:"\ud83e\udd7f",fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:"\ud83d\udc60",fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:"\ud83d\udc61",fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:"\ud83d\udc62",fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:"\ud83d\udc5e",fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:"\ud83d\udc5f",fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:"\ud83e\udd7e",fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:"\ud83e\udde6",fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:"\ud83e\udde4",fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:"\ud83e\udde3",fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:"\ud83d\udc52",fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:"\ud83c\udfa9",fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:"\ud83e\udde2",fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:"\u26d1",fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:"\ud83c\udf93",fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:"\ud83d\udc51",fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:"\ud83c\udf92",fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:"\ud83e\uddf3",fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:"\ud83d\udc5d",fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:"\ud83d\udc5b",fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:"\ud83d\udc5c",fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:"\ud83d\udcbc",fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:"\ud83d\udc53",fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:"\ud83d\udd76",fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:"\ud83e\udd7d",fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:"\ud83d\udc8d",fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:"\ud83c\udf02",fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:"\ud83d\udc36",fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:"\ud83d\udc31",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:"\ud83d\udc2d",fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:"\ud83d\udc39",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:"\ud83d\udc30",fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:"\ud83e\udd8a",fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:"\ud83d\udc3b",fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:"\ud83d\udc3c",fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:"\ud83d\udc28",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:"\ud83d\udc2f",fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:"\ud83e\udd81",fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\ud83d\udc2e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:"\ud83d\udc37",fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:"\ud83d\udc3d",fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:"\ud83d\udc38",fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:"\ud83e\udd91",fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:"\ud83d\udc19",fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:"\ud83e\udd90",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:"\ud83d\udc35",fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:"\ud83e\udd8d",fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:"\ud83d\ude48",fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:"\ud83d\ude49",fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:"\ud83d\ude4a",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:"\ud83d\udc12",fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:"\ud83d\udc14",fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:"\ud83d\udc27",fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:"\ud83d\udc26",fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:"\ud83d\udc24",fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:"\ud83d\udc23",fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:"\ud83d\udc25",fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:"\ud83e\udd86",fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:"\ud83e\udd85",fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:"\ud83e\udd89",fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:"\ud83e\udd87",fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:"\ud83d\udc3a",fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:"\ud83d\udc17",fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:"\ud83d\udc34",fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:"\ud83e\udd84",fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:"\ud83d\udc1d",fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:"\ud83d\udc1b",fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:"\ud83e\udd8b",fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:"\ud83d\udc0c",fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:"\ud83d\udc1e",fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:"\ud83d\udc1c",fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:"\ud83e\udd97",fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:"\ud83d\udd77",fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:"\ud83e\udd82",fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:"\ud83e\udd80",fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:"\ud83d\udc0d",fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:"\ud83e\udd8e",fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:"\ud83e\udd96",fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:"\ud83e\udd95",fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:"\ud83d\udc22",fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:"\ud83d\udc20",fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:"\ud83d\udc1f",fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:"\ud83d\udc21",fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:"\ud83d\udc2c",fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:"\ud83e\udd88",fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:"\ud83d\udc33",fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:"\ud83d\udc0b",fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:"\ud83d\udc0a",fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:"\ud83d\udc06",fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:"\ud83e\udd93",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:"\ud83d\udc05",fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:"\ud83d\udc03",fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:"\ud83d\udc02",fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\ud83d\udc04",fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:"\ud83e\udd8c",fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:"\ud83d\udc2a",fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:"\ud83d\udc2b",fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:"\ud83e\udd92",fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:"\ud83d\udc18",fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:"\ud83e\udd8f",fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:"\ud83d\udc10",fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:"\ud83d\udc0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:"\ud83d\udc11",fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:"\ud83d\udc0e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:"\ud83d\udc16",fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:"\ud83d\udc00",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:"\ud83d\udc01",fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:"\ud83d\udc13",fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:"\ud83e\udd83",fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:"\ud83d\udd4a",fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:"\ud83d\udc15",fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:"\ud83d\udc29",fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:"\ud83d\udc08",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:"\ud83d\udc07",fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:"\ud83d\udc3f",fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:"\ud83e\udd94",fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:"\ud83e\udd9d",fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:"\ud83e\udd99",fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:"\ud83e\udd9b",fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:"\ud83e\udd98",fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:"\ud83e\udda1",fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:"\ud83e\udda2",fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:"\ud83e\udd9a",fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:"\ud83e\udd9c",fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:"\ud83e\udd9e",fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:"\ud83e\udd9f",fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:"\ud83d\udc3e",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:"\ud83d\udc09",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:"\ud83d\udc32",fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:"\ud83c\udf35",fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:"\ud83c\udf84",fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:"\ud83c\udf32",fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:"\ud83c\udf33",fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:"\ud83c\udf34",fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:"\ud83c\udf31",fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:"\ud83c\udf3f",fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:"\u2618",fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:"\ud83c\udf40",fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:"\ud83c\udf8d",fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:"\ud83c\udf8b",fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:"\ud83c\udf43",fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:"\ud83c\udf42",fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:"\ud83c\udf41",fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:"\ud83c\udf3e",fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:"\ud83c\udf3a",fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:"\ud83c\udf3b",fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:"\ud83c\udf39",fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:"\ud83e\udd40",fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:"\ud83c\udf37",fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:"\ud83c\udf3c",fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:"\ud83c\udf38",fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:"\ud83d\udc90",fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:"\ud83c\udf44",fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:"\ud83c\udf30",fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:"\ud83c\udf83",fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:"\ud83d\udc1a",fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:"\ud83d\udd78",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:"\ud83c\udf0e",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:"\ud83c\udf0d",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:"\ud83c\udf0f",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf15",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:"\ud83c\udf16",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf17",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf18",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf11",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf12",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf13",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:"\ud83c\udf14",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1a",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1d",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1b",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1c",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:"\ud83c\udf1e",fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:"\ud83c\udf19",fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:"\u2b50",fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:"\ud83c\udf1f",fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:"\ud83d\udcab",fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:"\u2728",fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:"\u2604",fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:"\u2600\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:"\ud83c\udf24",fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:"\u26c5",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:"\ud83c\udf25",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:"\ud83c\udf26",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:"\u2601\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:"\ud83c\udf27",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:"\u26c8",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:"\ud83c\udf29",fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:"\u26a1",fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:"\ud83d\udd25",fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:"\ud83d\udca5",fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:"\u2744\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:"\ud83c\udf28",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:"\u26c4",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:"\u2603",fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:"\ud83c\udf2c",fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:"\ud83d\udca8",fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:"\ud83c\udf2a",fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:"\ud83c\udf2b",fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:"\u2602",fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:"\u2614",fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:"\ud83d\udca7",fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:"\ud83d\udca6",fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:"\ud83c\udf0a",fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:"\ud83c\udf4f",fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:"\ud83c\udf4e",fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:"\ud83c\udf50",fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:"\ud83c\udf4a",fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:"\ud83c\udf4b",fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:"\ud83c\udf4c",fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:"\ud83c\udf49",fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:"\ud83c\udf47",fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:"\ud83c\udf53",fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:"\ud83c\udf48",fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:"\ud83c\udf52",fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:"\ud83c\udf51",fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:"\ud83c\udf4d",fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:"\ud83e\udd65",fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:"\ud83e\udd5d",fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:"\ud83e\udd6d",fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:"\ud83e\udd51",fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:"\ud83e\udd66",fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:"\ud83c\udf45",fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:"\ud83c\udf46",fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:"\ud83e\udd52",fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:"\ud83e\udd55",fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:"\ud83c\udf36",fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:"\ud83e\udd54",fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:"\ud83c\udf3d",fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:"\ud83e\udd6c",fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:"\ud83c\udf60",fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:"\ud83e\udd5c",fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:"\ud83c\udf6f",fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:"\ud83e\udd50",fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:"\ud83c\udf5e",fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:"\ud83e\udd56",fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:"\ud83e\udd6f",fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:"\ud83e\udd68",fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:"\ud83e\uddc0",fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:"\ud83e\udd5a",fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:"\ud83e\udd53",fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:"\ud83e\udd69",fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:"\ud83e\udd5e",fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:"\ud83c\udf57",fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:"\ud83c\udf56",fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:"\ud83e\uddb4",fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:"\ud83c\udf64",fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:"\ud83c\udf73",fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:"\ud83c\udf54",fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:"\ud83c\udf5f",fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:"\ud83e\udd59",fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:"\ud83c\udf2d",fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:"\ud83c\udf55",fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:"\ud83e\udd6a",fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:"\ud83e\udd6b",fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:"\ud83c\udf5d",fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:"\ud83c\udf2e",fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:"\ud83c\udf2f",fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:"\ud83e\udd57",fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:"\ud83e\udd58",fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:"\ud83c\udf5c",fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:"\ud83c\udf72",fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:"\ud83c\udf65",fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:"\ud83e\udd60",fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:"\ud83c\udf63",fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:"\ud83c\udf71",fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:"\ud83c\udf5b",fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:"\ud83c\udf59",fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:"\ud83c\udf5a",fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:"\ud83c\udf58",fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:"\ud83c\udf62",fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:"\ud83c\udf61",fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:"\ud83c\udf67",fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:"\ud83c\udf68",fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:"\ud83c\udf66",fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:"\ud83e\udd67",fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:"\ud83c\udf70",fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:"\ud83e\uddc1",fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:"\ud83e\udd6e",fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:"\ud83c\udf82",fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:"\ud83c\udf6e",fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:"\ud83c\udf6c",fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:"\ud83c\udf6d",fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:"\ud83c\udf6b",fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:"\ud83c\udf7f",fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:"\ud83e\udd5f",fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:"\ud83c\udf69",fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:"\ud83c\udf6a",fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:"\ud83e\udd5b",fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\ud83c\udf7a",fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\ud83c\udf7b",fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:"\ud83e\udd42",fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:"\ud83c\udf77",fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:"\ud83e\udd43",fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:"\ud83c\udf78",fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:"\ud83c\udf79",fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:"\ud83c\udf7e",fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:"\ud83c\udf76",fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:"\ud83c\udf75",fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:"\ud83e\udd64",fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:"\u2615",fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:"\ud83c\udf7c",fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:"\ud83e\uddc2",fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:"\ud83e\udd44",fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:"\ud83c\udf74",fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:"\ud83c\udf7d",fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:"\ud83e\udd63",fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:"\ud83e\udd61",fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:"\ud83e\udd62",fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:"\u26bd",fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:"\ud83c\udfc0",fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:"\ud83c\udfc8",fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:"\u26be",fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:"\ud83e\udd4e",fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:"\ud83c\udfbe",fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:"\ud83c\udfd0",fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:"\ud83c\udfc9",fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:"\ud83e\udd4f",fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:"\ud83c\udfb1",fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:"\u26f3",fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:"\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:"\ud83c\udfcc",fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:"\ud83c\udfd3",fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:"\ud83c\udff8",fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:"\ud83e\udd45",fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:"\ud83c\udfd2",fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:"\ud83c\udfd1",fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:"\ud83e\udd4d",fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:"\ud83c\udfcf",fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:"\ud83c\udfbf",fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:"\u26f7",fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:"\ud83c\udfc2",fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:"\ud83e\udd3a",fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:"\ud83e\udd3c\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:"\ud83e\udd3c\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:"\ud83e\udd38\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:"\ud83e\udd38\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:"\ud83e\udd3e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:"\ud83e\udd3e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:"\u26f8",fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:"\ud83e\udd4c",fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:"\ud83d\udef9",fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:"\ud83d\udef7",fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:"\ud83c\udff9",fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:"\ud83c\udfa3",fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:"\ud83e\udd4a",fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:"\ud83e\udd4b",fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:"\ud83d\udea3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:"\ud83d\udea3",fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:"\ud83e\uddd7\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:"\ud83e\uddd7\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:"\ud83c\udfca\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:"\ud83c\udfca",fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:"\ud83e\udd3d\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:"\ud83e\udd3d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:"\ud83e\uddd8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:"\ud83e\uddd8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:"\ud83c\udfc4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:"\ud83c\udfc4",fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:"\ud83d\udec0",fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:"\u26f9\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:"\u26f9",fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:"\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:"\ud83c\udfcb",fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:"\ud83d\udeb4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:"\ud83d\udeb4",fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:"\ud83d\udeb5\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:"\ud83d\udeb5",fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:"\ud83c\udfc7",fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:"\ud83d\udd74",fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:"\ud83c\udfc6",fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:"\ud83c\udfbd",fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:"\ud83c\udfc5",fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:"\ud83c\udf96",fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:"\ud83e\udd47",fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:"\ud83e\udd48",fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:"\ud83e\udd49",fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:"\ud83c\udf97",fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:"\ud83c\udff5",fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:"\ud83c\udfab",fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:"\ud83c\udf9f",fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:"\ud83c\udfad",fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:"\ud83c\udfa8",fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:"\ud83c\udfaa",fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\ud83e\udd39\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\ud83e\udd39\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:"\ud83c\udfa4",fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:"\ud83c\udfa7",fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:"\ud83c\udfbc",fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:"\ud83c\udfb9",fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:"\ud83e\udd41",fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:"\ud83c\udfb7",fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:"\ud83c\udfba",fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:"\ud83c\udfb8",fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:"\ud83c\udfbb",fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:"\ud83c\udfac",fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:"\ud83c\udfae",fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:"\ud83d\udc7e",fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:"\ud83c\udfaf",fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:"\ud83c\udfb2",fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:"\ud83c\udfb0",fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:"\ud83e\udde9",fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:"\ud83c\udfb3",fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:"\ud83d\ude97",fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:"\ud83d\ude95",fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:"\ud83d\ude99",fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:"\ud83d\ude8c",fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:"\ud83d\ude8e",fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:"\ud83c\udfce",fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:"\ud83d\ude93",fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:"\ud83d\ude91",fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:"\ud83d\ude92",fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:"\ud83d\ude90",fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:"\ud83d\ude9a",fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:"\ud83d\ude9b",fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:"\ud83d\ude9c",fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:"\ud83d\udef4",fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:"\ud83c\udfcd",fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:"\ud83d\udeb2",fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:"\ud83d\udef5",fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:"\ud83d\udea8",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:"\ud83d\ude94",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:"\ud83d\ude8d",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:"\ud83d\ude98",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:"\ud83d\ude96",fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:"\ud83d\udea1",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:"\ud83d\udea0",fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:"\ud83d\ude9f",fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:"\ud83d\ude83",fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:"\ud83d\ude8b",fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:"\ud83d\ude9d",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:"\ud83d\ude84",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:"\ud83d\ude85",fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:"\ud83d\ude88",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:"\ud83d\ude9e",fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:"\ud83d\ude82",fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:"\ud83d\ude86",fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:"\ud83d\ude87",fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:"\ud83d\ude8a",fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:"\ud83d\ude89",fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:"\ud83d\udef8",fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:"\ud83d\ude81",fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:"\ud83d\udee9",fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:"\u2708\ufe0f",fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:"\ud83d\udeeb",fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:"\ud83d\udeec",fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:"\u26f5",fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:"\ud83d\udee5",fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:"\ud83d\udea4",fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:"\u26f4",fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:"\ud83d\udef3",fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:"\ud83d\ude80",fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:"\ud83d\udef0",fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:"\ud83d\udcba",fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:"\ud83d\udef6",fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:"\u2693",fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:"\ud83d\udea7",fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:"\u26fd",fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:"\ud83d\ude8f",fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:"\ud83d\udea6",fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:"\ud83d\udea5",fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:"\ud83c\udfc1",fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:"\ud83d\udea2",fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:"\ud83c\udfa1",fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:"\ud83c\udfa2",fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:"\ud83c\udfa0",fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:"\ud83c\udfd7",fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:"\ud83c\udf01",fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:"\ud83d\uddfc",fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:"\ud83c\udfed",fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:"\u26f2",fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:"\ud83c\udf91",fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:"\u26f0",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:"\ud83c\udfd4",fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:"\ud83d\uddfb",fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:"\ud83c\udf0b",fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:"\ud83d\uddfe",fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:"\ud83c\udfd5",fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:"\u26fa",fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:"\ud83c\udfde",fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:"\ud83d\udee3",fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:"\ud83d\udee4",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:"\ud83c\udf05",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:"\ud83c\udf04",fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:"\ud83c\udfdc",fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:"\ud83c\udfd6",fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:"\ud83c\udfdd",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:"\ud83c\udf07",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:"\ud83c\udf06",fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:"\ud83c\udfd9",fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:"\ud83c\udf03",fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:"\ud83c\udf09",fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:"\ud83c\udf0c",fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:"\ud83c\udf20",fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:"\ud83c\udf87",fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:"\ud83c\udf86",fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:"\ud83c\udf08",fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:"\ud83c\udfd8",fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:"\ud83c\udff0",fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:"\ud83c\udfef",fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:"\ud83c\udfdf",fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:"\ud83d\uddfd",fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:"\ud83c\udfe0",fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:"\ud83c\udfe1",fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:"\ud83c\udfda",fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:"\ud83c\udfe2",fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:"\ud83c\udfec",fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:"\ud83c\udfe3",fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:"\ud83c\udfe4",fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:"\ud83c\udfe5",fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:"\ud83c\udfe6",fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:"\ud83c\udfe8",fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:"\ud83c\udfea",fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:"\ud83c\udfeb",fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:"\ud83c\udfe9",fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:"\ud83d\udc92",fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:"\ud83c\udfdb",fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:"\u26ea",fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:"\ud83d\udd4c",fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:"\ud83d\udd4d",fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:"\ud83d\udd4b",fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:"\u26e9",fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:"\u231a",fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:"\ud83d\udcf1",fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:"\ud83d\udcf2",fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:"\ud83d\udcbb",fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:"\u2328",fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:"\ud83d\udda5",fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:"\ud83d\udda8",fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:"\ud83d\uddb1",fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:"\ud83d\uddb2",fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:"\ud83d\udd79",fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:"\ud83d\udddc",fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:"\ud83d\udcbd",fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:"\ud83d\udcbe",fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:"\ud83d\udcbf",fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:"\ud83d\udcc0",fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:"\ud83d\udcfc",fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:"\ud83d\udcf7",fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:"\ud83d\udcf8",fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:"\ud83d\udcf9",fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:"\ud83c\udfa5",fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:"\ud83d\udcfd",fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:"\ud83c\udf9e",fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:"\ud83d\udcde",fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:"\u260e\ufe0f",fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:"\ud83d\udcdf",fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:"\ud83d\udce0",fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:"\ud83d\udcfa",fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:"\ud83d\udcfb",fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:"\ud83c\udf99",fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:"\ud83c\udf9a",fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:"\ud83c\udf9b",fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:"\ud83e\udded",fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:"\u23f1",fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:"\u23f2",fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:"\u23f0",fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:"\ud83d\udd70",fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:"\u23f3",fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:"\u231b",fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:"\ud83d\udce1",fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:"\ud83d\udd0b",fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:"\ud83d\udd0c",fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:"\ud83d\udca1",fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:"\ud83d\udd26",fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:"\ud83d\udd6f",fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:"\ud83e\uddef",fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:"\ud83d\uddd1",fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:"\ud83d\udee2",fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:"\ud83d\udcb8",fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:"\ud83d\udcb5",fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:"\ud83d\udcb4",fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:"\ud83d\udcb6",fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:"\ud83d\udcb7",fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:"\ud83d\udcb0",fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:"\ud83d\udcb3",fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:"\ud83d\udc8e",fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:"\u2696",fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:"\ud83e\uddf0",fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:"\ud83d\udd27",fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:"\ud83d\udd28",fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:"\u2692",fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:"\ud83d\udee0",fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:"\u26cf",fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:"\ud83d\udd29",fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:"\u2699",fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:"\ud83e\uddf1",fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:"\u26d3",fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:"\ud83e\uddf2",fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:"\ud83d\udd2b",fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:"\ud83d\udca3",fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:"\ud83e\udde8",fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:"\ud83d\udd2a",fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:"\ud83d\udde1",fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:"\u2694",fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:"\ud83d\udee1",fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:"\ud83d\udeac",fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:"\u2620",fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:"\u26b0",fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:"\u26b1",fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:"\ud83c\udffa",fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:"\ud83d\udd2e",fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:"\ud83d\udcff",fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:"\ud83e\uddff",fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:"\ud83d\udc88",fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:"\u2697",fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:"\ud83d\udd2d",fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:"\ud83d\udd2c",fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:"\ud83d\udd73",fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:"\ud83d\udc8a",fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:"\ud83d\udc89",fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:"\ud83e\uddec",fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:"\ud83e\udda0",fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:"\ud83e\uddeb",fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:"\ud83e\uddea",fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:"\ud83c\udf21",fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:"\ud83e\uddf9",fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:"\ud83e\uddfa",fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:"\ud83e\uddfb",fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:"\ud83c\udff7",fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:"\ud83d\udd16",fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:"\ud83d\udebd",fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:"\ud83d\udebf",fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:"\ud83d\udec1",fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:"\ud83e\uddfc",fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:"\ud83e\uddfd",fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:"\ud83e\uddf4",fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:"\ud83d\udd11",fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:"\ud83d\udddd",fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:"\ud83d\udecb",fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:"\ud83d\udecc",fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:"\ud83d\udecf",fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:"\ud83d\udeaa",fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:"\ud83d\udece",fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:"\ud83e\uddf8",fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:"\ud83d\uddbc",fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:"\ud83d\uddfa",fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:"\u26f1",fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:"\ud83d\uddff",fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:"\ud83d\udecd",fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:"\ud83d\uded2",fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:"\ud83c\udf88",fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:"\ud83c\udf8f",fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:"\ud83c\udf80",fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:"\ud83c\udf81",fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:"\ud83c\udf8a",fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:"\ud83c\udf89",fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:"\ud83c\udf8e",fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:"\ud83c\udf90",fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:"\ud83c\udf8c",fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:"\ud83c\udfee",fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:"\ud83e\udde7",fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:"\u2709\ufe0f",fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:"\ud83d\udce9",fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:"\ud83d\udce8",fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:"\ud83d\udce7",fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:"\ud83d\udc8c",fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:"\ud83d\udcee",fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:"\ud83d\udcea",fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:"\ud83d\udceb",fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:"\ud83d\udcec",fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:"\ud83d\udced",fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:"\ud83d\udce6",fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:"\ud83d\udcef",fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:"\ud83d\udce5",fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:"\ud83d\udce4",fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:"\ud83d\udcdc",fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:"\ud83d\udcc3",fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:"\ud83d\udcd1",fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:"\ud83e\uddfe",fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:"\ud83d\udcca",fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:"\ud83d\udcc8",fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:"\ud83d\udcc9",fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:"\ud83d\udcc4",fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:"\ud83d\udcc5",fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:"\ud83d\udcc6",fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:"\ud83d\uddd3",fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:"\ud83d\udcc7",fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:"\ud83d\uddc3",fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:"\ud83d\uddf3",fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:"\ud83d\uddc4",fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:"\ud83d\udccb",fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:"\ud83d\uddd2",fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:"\ud83d\udcc1",fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:"\ud83d\udcc2",fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:"\ud83d\uddc2",fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:"\ud83d\uddde",fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:"\ud83d\udcf0",fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:"\ud83d\udcd3",fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:"\ud83d\udcd5",fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:"\ud83d\udcd7",fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:"\ud83d\udcd8",fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:"\ud83d\udcd9",fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:"\ud83d\udcd4",fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:"\ud83d\udcd2",fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:"\ud83d\udcda",fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:"\ud83d\udcd6",fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:"\ud83e\uddf7",fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:"\ud83d\udd17",fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:"\ud83d\udcce",fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:"\ud83d\udd87",fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:"\u2702\ufe0f",fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:"\ud83d\udcd0",fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:"\ud83d\udccf",fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:"\ud83e\uddee",fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:"\ud83d\udccc",fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:"\ud83d\udccd",fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:"\ud83d\udea9",fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:"\ud83c\udff3",fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:"\ud83c\udff4",fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:"\ud83c\udff3\ufe0f\u200d\ud83c\udf08",fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:"\ud83d\udd10",fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:"\ud83d\udd12",fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:"\ud83d\udd13",fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:"\ud83d\udd0f",fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:"\ud83d\udd8a",fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:"\ud83d\udd8b",fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:"\u2712\ufe0f",fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:"\ud83d\udcdd",fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:"\u270f\ufe0f",fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:"\ud83d\udd8d",fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:"\ud83d\udd8c",fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:"\ud83d\udd0d",fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:"\ud83d\udd0e",fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:"\u2764\ufe0f",fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:"\ud83e\udde1",fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9b",fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9a",fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc99",fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9c",fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:"\ud83d\udda4",fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:"\ud83d\udc94",fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:"\u2763",fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:"\ud83d\udc95",fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9e",fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:"\ud83d\udc93",fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:"\ud83d\udc97",fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc96",fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:"\ud83d\udc98",fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:"\ud83d\udc9d",fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:"\ud83d\udc9f",fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:"\u262e",fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:"\u271d",fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:"\u262a",fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\ud83d\udd49",fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\u2638",fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:"\u2721",fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:"\ud83d\udd2f",fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:"\ud83d\udd4e",fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:"\u262f",fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:"\u2626",fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:"\ud83d\uded0",fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:"\u26ce",fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2648",fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2649",fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264a",fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264b",fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264c",fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264d",fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264e",fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:"\u264f",fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2650",fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2651",fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2652",fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2653",fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:"\ud83c\udd94",fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:"\u269b",fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:"\ud83c\ude33",fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:"\ud83c\ude39",fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:"\u2622",fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:"\u2623",fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:"\ud83d\udcf4",fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:"\ud83d\udcf3",fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:"\ud83c\ude36",fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:"\ud83c\ude1a",fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:"\ud83c\ude38",fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:"\ud83c\ude3a",fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:"\ud83c\ude37\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:"\u2734\ufe0f",fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:"\ud83c\udd9a",fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:"\ud83c\ude51",fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:"\ud83d\udcae",fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:"\ud83c\ude50",fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:"\u3299\ufe0f",fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:"\u3297\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:"\ud83c\ude34",fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:"\ud83c\ude35",fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:"\ud83c\ude32",fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:"\ud83c\udd70\ufe0f",fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:"\ud83c\udd71\ufe0f",fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:"\ud83c\udd8e",fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:"\ud83c\udd91",fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:"\ud83c\udd7e\ufe0f",fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:"\ud83c\udd98",fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:"\u26d4",fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:"\ud83d\udcdb",fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:"\ud83d\udeab",fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:"\u274c",fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:"\u2b55",fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:"\ud83d\uded1",fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:"\ud83d\udca2",fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:"\u2668\ufe0f",fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:"\ud83d\udeb7",fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:"\ud83d\udeaf",fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:"\ud83d\udeb3",fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:"\ud83d\udeb1",fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:"\ud83d\udd1e",fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:"\ud83d\udcf5",fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:"\u2757",fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:"\u2755",fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:"\u2753",fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:"\u2754",fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:"\u203c\ufe0f",fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:"\u2049\ufe0f",fitzpatrick_scale:!1,category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:"\ud83d\udcaf",fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:"\ud83d\udd05",fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:"\ud83d\udd06",fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:"\ud83d\udd31",fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:"\u269c",fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:"\u303d\ufe0f",fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:"\u26a0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:"\ud83d\udeb8",fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:"\ud83d\udd30",fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:"\u267b\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:"\ud83c\ude2f",fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:"\ud83d\udcb9",fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:"\u2747\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:"\u2733\ufe0f",fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:"\u274e",fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:"\u2705",fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:"\ud83d\udca0",fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:"\ud83c\udf00",fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:"\u27bf",fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:"\ud83c\udf10",fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:"\u24c2\ufe0f",fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:"\ud83c\udfe7",fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:"\ud83c\ude02\ufe0f",fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:"\ud83d\udec2",fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:"\ud83d\udec3",fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:"\ud83d\udec4",fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:"\ud83d\udec5",fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:"\u267f",fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:"\ud83d\udead",fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:"\ud83d\udebe",fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:"\ud83c\udd7f\ufe0f",fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:"\ud83d\udeb0",fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:"\ud83d\udeb9",fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:"\ud83d\udeba",fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:"\ud83d\udebc",fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:"\ud83d\udebb",fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:"\ud83d\udeae",fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:"\ud83c\udfa6",fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:"\ud83d\udcf6",fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:"\ud83c\ude01",fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:"\ud83c\udd96",fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:"\ud83c\udd97",fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:"\ud83c\udd99",fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:"\ud83c\udd92",fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:"\ud83c\udd95",fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:"\ud83c\udd93",fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:"0\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:"1\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:"2\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:"3\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:"4\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:"5\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:"6\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:"7\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:"8\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:"9\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:"\ud83d\udd1f",fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:"*\u20e3",fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:"\ud83d\udd22",fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:"\u23cf\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:"\u25b6\ufe0f",fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:"\u23f8",fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:"\u23ed",fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:"\u23f9",fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:"\u23fa",fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:"\u23ef",fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:"\u23ee",fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:"\u23e9",fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:"\u23ea",fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:"\ud83d\udd00",fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:"\ud83d\udd01",fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:"\ud83d\udd02",fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:"\u25c0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:"\ud83d\udd3c",fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:"\ud83d\udd3d",fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:"\u23eb",fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:"\u23ec",fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:"\u27a1\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:"\u2b05\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:"\u2b06\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:"\u2b07\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:"\u2197\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:"\u2198\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:"\u2199\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:"\u2196\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:"\u2195\ufe0f",fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:"\u2194\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:"\ud83d\udd04",fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:"\u21aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:"\u21a9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:"\u2934\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:"\u2935\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:"#\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:"\u2139\ufe0f",fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:"\ud83d\udd24",fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:"\ud83d\udd21",fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:"\ud83d\udd20",fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:"\ud83d\udd23",fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:"\ud83c\udfb5",fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:"\ud83c\udfb6",fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:"\u3030\ufe0f",fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:"\u27b0",fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:"\u2714\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:"\ud83d\udd03",fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:"\u2795",fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:"\u2796",fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:"\u2797",fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:"\u2716\ufe0f",fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:"\u267e",fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:"\ud83d\udcb2",fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:"\ud83d\udcb1",fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:"\xa9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:"\xae\ufe0f",fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:"\u2122\ufe0f",fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:"\ud83d\udd1a",fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:"\ud83d\udd19",fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:"\ud83d\udd1b",fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:"\ud83d\udd1d",fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:"\ud83d\udd1c",fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:"\u2611\ufe0f",fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:"\ud83d\udd18",fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:"\u26aa",fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:"\u26ab",fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:"\ud83d\udd34",fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:"\ud83d\udd35",fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd38",fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd39",fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd36",fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd37",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:"\ud83d\udd3a",fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:"\u25aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:"\u25ab\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:"\u2b1b",fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:"\u2b1c",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:"\ud83d\udd3b",fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:"\u25fc\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:"\u25fb\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:"\u25fe",fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:"\u25fd",fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:"\ud83d\udd32",fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:"\ud83d\udd33",fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:"\ud83d\udd08",fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:"\ud83d\udd09",fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:"\ud83d\udd0a",fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:"\ud83d\udd07",fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:"\ud83d\udce3",fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:"\ud83d\udce2",fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:"\ud83d\udd14",fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:"\ud83d\udd15",fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:"\ud83c\udccf",fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:"\ud83c\udc04",fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:"\u2660\ufe0f",fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:"\u2663\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:"\u2665\ufe0f",fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:"\u2666\ufe0f",fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:"\ud83c\udfb4",fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:"\ud83d\udcad",fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:"\ud83d\uddef",fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:"\ud83d\udcac",fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:"\ud83d\udde8",fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:"\ud83d\udd50",fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:"\ud83d\udd51",fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:"\ud83d\udd52",fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:"\ud83d\udd53",fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:"\ud83d\udd54",fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:"\ud83d\udd55",fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:"\ud83d\udd56",fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:"\ud83d\udd57",fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:"\ud83d\udd58",fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:"\ud83d\udd59",fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5a",fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:"\ud83d\udd5b",fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5c",fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5d",fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5e",fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5f",fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:"\ud83d\udd60",fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:"\ud83d\udd61",fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:"\ud83d\udd62",fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:"\ud83d\udd63",fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:"\ud83d\udd64",fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:"\ud83d\udd65",fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:"\ud83d\udd66",fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:"\ud83d\udd67",fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:"\ud83c\udde8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:"\ud83c\uddea\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:"\ud83c\uddeb\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:"\ud83c\udde9\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:"\ud83c\uddef\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:"\ud83c\uddfd\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:"\ud83c\uddfe\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:"\ud83c\uddf0\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:"\ud83c\uddf4\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:"\ud83c\uddf6\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:"\ud83c\uddfc\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:"\ud83c\uddf0\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:"\ud83c\uddec\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:"\ud83c\uddfc\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:"\ud83c\uddfe\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:"\ud83c\uddfa\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:"\ud83c\udff4\u200d\u2620\ufe0f",fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file +window.tinymce.Resource.add("tinymce.plugins.emoticons",{grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:"\u{1f600}",fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:"\u{1f62c}",fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:"\u{1f601}",fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:"\u{1f602}",fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:"\u{1f923}",fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:"\u{1f973}",fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:"\u{1f603}",fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:"\u{1f604}",fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:"\u{1f605}",fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:"\u{1f606}",fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:"\u{1f607}",fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:"\u{1f609}",fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:"\u{1f60a}",fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:"\u{1f642}",fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:"\u{1f643}",fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:"\u263a\ufe0f",fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:"\u{1f60b}",fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:"\u{1f60c}",fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:"\u{1f60d}",fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:"\u{1f970}",fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\u{1f618}",fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:"\u{1f617}",fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:"\u{1f619}",fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\u{1f61a}",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:"\u{1f61c}",fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:"\u{1f92a}",fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:"\u{1f928}",fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:"\u{1f9d0}",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:"\u{1f61d}",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:"\u{1f61b}",fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:"\u{1f911}",fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:"\u{1f913}",fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:"\u{1f60e}",fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:"\u{1f929}",fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:"\u{1f921}",fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:"\u{1f920}",fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:"\u{1f917}",fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:"\u{1f60f}",fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:"\u{1f636}",fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:"\u{1f610}",fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:"\u{1f611}",fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:"\u{1f612}",fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:"\u{1f644}",fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:"\u{1f914}",fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:"\u{1f925}",fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:"\u{1f92d}",fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:"\u{1f92b}",fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:"\u{1f92c}",fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:"\u{1f92f}",fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:"\u{1f633}",fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:"\u{1f61e}",fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:"\u{1f61f}",fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:"\u{1f620}",fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:"\u{1f621}",fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:"\u{1f614}",fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:"\u{1f615}",fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:"\u{1f641}",fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:"\u2639",fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:"\u{1f623}",fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:"\u{1f616}",fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:"\u{1f62b}",fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:"\u{1f629}",fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:"\u{1f97a}",fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:"\u{1f624}",fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:"\u{1f62e}",fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:"\u{1f631}",fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:"\u{1f628}",fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:"\u{1f630}",fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:"\u{1f62f}",fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:"\u{1f626}",fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:"\u{1f627}",fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:"\u{1f622}",fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:"\u{1f625}",fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:"\u{1f924}",fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:"\u{1f62a}",fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:"\u{1f613}",fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:"\u{1f975}",fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:"\u{1f976}",fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:"\u{1f62d}",fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:"\u{1f635}",fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:"\u{1f632}",fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:"\u{1f910}",fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:"\u{1f922}",fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:"\u{1f927}",fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:"\u{1f92e}",fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:"\u{1f637}",fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:"\u{1f912}",fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:"\u{1f915}",fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:"\u{1f974}",fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:"\u{1f634}",fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:"\u{1f4a4}",fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:"\u{1f4a9}",fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:"\u{1f608}",fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:"\u{1f47f}",fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:"\u{1f479}",fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:"\u{1f47a}",fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:"\u{1f480}",fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:"\u{1f47b}",fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:"\u{1f47d}",fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:"\u{1f916}",fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:"\u{1f63a}",fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:"\u{1f638}",fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:"\u{1f639}",fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:"\u{1f63b}",fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:"\u{1f63c}",fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:"\u{1f63d}",fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:"\u{1f640}",fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:"\u{1f63f}",fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:"\u{1f63e}",fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:"\u{1f932}",fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:"\u{1f64c}",fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:"\u{1f44f}",fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:"\u{1f44b}",fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:"\u{1f919}",fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:"\u{1f44d}",fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:"\u{1f44e}",fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:"\u{1f44a}",fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:"\u270a",fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:"\u{1f91b}",fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:"\u{1f91c}",fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:"\u270c",fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:"\u{1f44c}",fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:"\u270b",fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:"\u{1f91a}",fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:"\u{1f450}",fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:"\u{1f4aa}",fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:"\u{1f64f}",fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:"\u{1f9b6}",fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:"\u{1f9b5}",fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:"\u{1f91d}",fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:"\u261d",fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:"\u{1f446}",fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:"\u{1f447}",fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:"\u{1f448}",fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:"\u{1f449}",fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:"\u{1f595}",fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:"\u{1f590}",fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:"\u{1f91f}",fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:"\u{1f918}",fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:"\u{1f91e}",fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:"\u{1f596}",fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:"\u270d",fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:"\u{1f933}",fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:"\u{1f485}",fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:"\u{1f444}",fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:"\u{1f9b7}",fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:"\u{1f445}",fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:"\u{1f442}",fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:"\u{1f443}",fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:"\u{1f441}",fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:"\u{1f440}",fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:"\u{1f9e0}",fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:"\u{1f464}",fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:"\u{1f465}",fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:"\u{1f5e3}",fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:"\u{1f476}",fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:"\u{1f9d2}",fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:"\u{1f466}",fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:"\u{1f467}",fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:"\u{1f9d1}",fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:"\u{1f468}",fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:"\u{1f469}",fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:"\u{1f471}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:"\u{1f471}",fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:"\u{1f9d4}",fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:"\u{1f9d3}",fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:"\u{1f474}",fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:"\u{1f475}",fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:"\u{1f472}",fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:"\u{1f9d5}",fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:"\u{1f473}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:"\u{1f473}",fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:"\u{1f46e}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:"\u{1f46e}",fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:"\u{1f477}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:"\u{1f477}",fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:"\u{1f482}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:"\u{1f482}",fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:"\u{1f575}\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:"\u{1f575}",fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:"\u{1f469}\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:"\u{1f468}\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:"\u{1f469}\u200d\u{1f33e}",fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:"\u{1f468}\u200d\u{1f33e}",fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:"\u{1f469}\u200d\u{1f373}",fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:"\u{1f468}\u200d\u{1f373}",fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:"\u{1f469}\u200d\u{1f393}",fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:"\u{1f468}\u200d\u{1f393}",fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:"\u{1f469}\u200d\u{1f3a4}",fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:"\u{1f468}\u200d\u{1f3a4}",fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:"\u{1f469}\u200d\u{1f3eb}",fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:"\u{1f468}\u200d\u{1f3eb}",fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:"\u{1f469}\u200d\u{1f3ed}",fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:"\u{1f468}\u200d\u{1f3ed}",fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:"\u{1f469}\u200d\u{1f4bb}",fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:"\u{1f468}\u200d\u{1f4bb}",fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:"\u{1f469}\u200d\u{1f4bc}",fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:"\u{1f468}\u200d\u{1f4bc}",fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:"\u{1f469}\u200d\u{1f527}",fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:"\u{1f468}\u200d\u{1f527}",fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:"\u{1f469}\u200d\u{1f52c}",fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:"\u{1f468}\u200d\u{1f52c}",fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:"\u{1f469}\u200d\u{1f3a8}",fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:"\u{1f468}\u200d\u{1f3a8}",fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:"\u{1f469}\u200d\u{1f692}",fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:"\u{1f468}\u200d\u{1f692}",fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:"\u{1f469}\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:"\u{1f468}\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:"\u{1f469}\u200d\u{1f680}",fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:"\u{1f468}\u200d\u{1f680}",fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:"\u{1f469}\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:"\u{1f468}\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:"\u{1f9b8}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:"\u{1f9b8}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:"\u{1f9b9}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:"\u{1f9b9}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:"\u{1f936}",fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:"\u{1f385}",fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:"\u{1f9d9}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:"\u{1f9d9}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:"\u{1f9dd}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:"\u{1f9dd}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:"\u{1f9db}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:"\u{1f9db}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:"\u{1f9df}\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:"\u{1f9df}\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:"\u{1f9de}\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:"\u{1f9de}\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:"\u{1f9dc}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:"\u{1f9dc}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:"\u{1f9da}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:"\u{1f9da}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:"\u{1f47c}",fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:"\u{1f930}",fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:"\u{1f931}",fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:"\u{1f478}",fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:"\u{1f934}",fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:"\u{1f470}",fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:"\u{1f935}",fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:"\u{1f3c3}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:"\u{1f3c3}",fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:"\u{1f6b6}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:"\u{1f6b6}",fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:"\u{1f483}",fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:"\u{1f57a}",fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:"\u{1f46f}",fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:"\u{1f46f}\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:"\u{1f46b}",fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:"\u{1f46c}",fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:"\u{1f46d}",fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:"\u{1f647}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:"\u{1f647}",fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:"\u{1f926}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:"\u{1f926}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:"\u{1f937}",fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:"\u{1f937}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:"\u{1f481}",fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:"\u{1f481}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:"\u{1f645}",fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:"\u{1f645}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:"\u{1f646}",fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:"\u{1f646}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:"\u{1f64b}",fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:"\u{1f64b}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:"\u{1f64e}",fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:"\u{1f64e}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:"\u{1f64d}",fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:"\u{1f64d}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:"\u{1f487}",fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:"\u{1f487}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:"\u{1f486}",fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:"\u{1f486}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:"\u{1f9d6}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:"\u{1f9d6}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\u{1f491}",fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\u{1f469}\u200d\u2764\ufe0f\u200d\u{1f469}",fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\u{1f468}\u200d\u2764\ufe0f\u200d\u{1f468}",fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\u{1f48f}",fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\u{1f469}\u200d\u2764\ufe0f\u200d\u{1f48b}\u200d\u{1f469}",fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\u{1f468}\u200d\u2764\ufe0f\u200d\u{1f48b}\u200d\u{1f468}",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:"\u{1f46a}",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:"\u{1f468}\u200d\u{1f469}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f469}\u200d\u{1f466}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f469}\u200d\u{1f469}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:"\u{1f469}\u200d\u{1f469}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f469}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f469}\u200d\u{1f469}\u200d\u{1f466}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\u{1f469}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f468}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f468}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f468}\u200d\u{1f467}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f468}\u200d\u{1f466}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:"\u{1f468}\u200d\u{1f468}\u200d\u{1f467}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:"\u{1f469}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:"\u{1f469}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:"\u{1f469}\u200d\u{1f467}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:"\u{1f469}\u200d\u{1f466}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:"\u{1f469}\u200d\u{1f467}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:"\u{1f468}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:"\u{1f468}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:"\u{1f468}\u200d\u{1f467}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:"\u{1f468}\u200d\u{1f466}\u200d\u{1f466}",fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:"\u{1f468}\u200d\u{1f467}\u200d\u{1f467}",fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:"\u{1f9f6}",fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:"\u{1f9f5}",fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:"\u{1f9e5}",fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:"\u{1f97c}",fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:"\u{1f45a}",fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:"\u{1f455}",fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:"\u{1f456}",fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:"\u{1f454}",fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:"\u{1f457}",fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:"\u{1f459}",fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:"\u{1f458}",fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:"\u{1f484}",fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:"\u{1f48b}",fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:"\u{1f463}",fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:"\u{1f97f}",fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:"\u{1f460}",fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:"\u{1f461}",fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:"\u{1f462}",fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:"\u{1f45e}",fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:"\u{1f45f}",fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:"\u{1f97e}",fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:"\u{1f9e6}",fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:"\u{1f9e4}",fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:"\u{1f9e3}",fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:"\u{1f452}",fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:"\u{1f3a9}",fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:"\u{1f9e2}",fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:"\u26d1",fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:"\u{1f393}",fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:"\u{1f451}",fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:"\u{1f392}",fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:"\u{1f9f3}",fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:"\u{1f45d}",fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:"\u{1f45b}",fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:"\u{1f45c}",fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:"\u{1f4bc}",fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:"\u{1f453}",fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:"\u{1f576}",fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:"\u{1f97d}",fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:"\u{1f48d}",fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:"\u{1f302}",fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:"\u{1f436}",fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:"\u{1f431}",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:"\u{1f42d}",fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:"\u{1f439}",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:"\u{1f430}",fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:"\u{1f98a}",fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:"\u{1f43b}",fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:"\u{1f43c}",fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:"\u{1f428}",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:"\u{1f42f}",fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:"\u{1f981}",fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\u{1f42e}",fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:"\u{1f437}",fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:"\u{1f43d}",fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:"\u{1f438}",fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:"\u{1f991}",fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:"\u{1f419}",fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:"\u{1f990}",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:"\u{1f435}",fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:"\u{1f98d}",fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:"\u{1f648}",fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:"\u{1f649}",fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:"\u{1f64a}",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:"\u{1f412}",fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:"\u{1f414}",fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:"\u{1f427}",fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:"\u{1f426}",fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:"\u{1f424}",fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:"\u{1f423}",fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:"\u{1f425}",fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:"\u{1f986}",fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:"\u{1f985}",fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:"\u{1f989}",fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:"\u{1f987}",fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:"\u{1f43a}",fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:"\u{1f417}",fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:"\u{1f434}",fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:"\u{1f984}",fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:"\u{1f41d}",fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:"\u{1f41b}",fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:"\u{1f98b}",fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:"\u{1f40c}",fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:"\u{1f41e}",fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:"\u{1f41c}",fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:"\u{1f997}",fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:"\u{1f577}",fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:"\u{1f982}",fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:"\u{1f980}",fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:"\u{1f40d}",fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:"\u{1f98e}",fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:"\u{1f996}",fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:"\u{1f995}",fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:"\u{1f422}",fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:"\u{1f420}",fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:"\u{1f41f}",fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:"\u{1f421}",fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:"\u{1f42c}",fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:"\u{1f988}",fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:"\u{1f433}",fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:"\u{1f40b}",fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:"\u{1f40a}",fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:"\u{1f406}",fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:"\u{1f993}",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:"\u{1f405}",fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:"\u{1f403}",fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:"\u{1f402}",fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\u{1f404}",fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:"\u{1f98c}",fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:"\u{1f42a}",fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:"\u{1f42b}",fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:"\u{1f992}",fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:"\u{1f418}",fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:"\u{1f98f}",fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:"\u{1f410}",fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:"\u{1f40f}",fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:"\u{1f411}",fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:"\u{1f40e}",fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:"\u{1f416}",fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:"\u{1f400}",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:"\u{1f401}",fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:"\u{1f413}",fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:"\u{1f983}",fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:"\u{1f54a}",fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:"\u{1f415}",fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:"\u{1f429}",fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:"\u{1f408}",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:"\u{1f407}",fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:"\u{1f43f}",fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:"\u{1f994}",fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:"\u{1f99d}",fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:"\u{1f999}",fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:"\u{1f99b}",fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:"\u{1f998}",fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:"\u{1f9a1}",fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:"\u{1f9a2}",fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:"\u{1f99a}",fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:"\u{1f99c}",fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:"\u{1f99e}",fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:"\u{1f99f}",fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:"\u{1f43e}",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:"\u{1f409}",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:"\u{1f432}",fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:"\u{1f335}",fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:"\u{1f384}",fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:"\u{1f332}",fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:"\u{1f333}",fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:"\u{1f334}",fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:"\u{1f331}",fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:"\u{1f33f}",fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:"\u2618",fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:"\u{1f340}",fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:"\u{1f38d}",fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:"\u{1f38b}",fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:"\u{1f343}",fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:"\u{1f342}",fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:"\u{1f341}",fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:"\u{1f33e}",fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:"\u{1f33a}",fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:"\u{1f33b}",fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:"\u{1f339}",fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:"\u{1f940}",fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:"\u{1f337}",fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:"\u{1f33c}",fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:"\u{1f338}",fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:"\u{1f490}",fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:"\u{1f344}",fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:"\u{1f330}",fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:"\u{1f383}",fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:"\u{1f41a}",fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:"\u{1f578}",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:"\u{1f30e}",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:"\u{1f30d}",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:"\u{1f30f}",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:"\u{1f315}",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:"\u{1f316}",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f317}",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f318}",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f311}",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f312}",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f313}",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:"\u{1f314}",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f31a}",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f31d}",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f31b}",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\u{1f31c}",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:"\u{1f31e}",fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:"\u{1f319}",fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:"\u2b50",fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:"\u{1f31f}",fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:"\u{1f4ab}",fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:"\u2728",fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:"\u2604",fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:"\u2600\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:"\u{1f324}",fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:"\u26c5",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:"\u{1f325}",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:"\u{1f326}",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:"\u2601\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:"\u{1f327}",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:"\u26c8",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:"\u{1f329}",fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:"\u26a1",fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:"\u{1f525}",fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:"\u{1f4a5}",fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:"\u2744\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:"\u{1f328}",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:"\u26c4",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:"\u2603",fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:"\u{1f32c}",fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:"\u{1f4a8}",fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:"\u{1f32a}",fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:"\u{1f32b}",fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:"\u2602",fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:"\u2614",fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:"\u{1f4a7}",fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:"\u{1f4a6}",fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:"\u{1f30a}",fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:"\u{1f34f}",fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:"\u{1f34e}",fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:"\u{1f350}",fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:"\u{1f34a}",fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:"\u{1f34b}",fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:"\u{1f34c}",fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:"\u{1f349}",fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:"\u{1f347}",fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:"\u{1f353}",fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:"\u{1f348}",fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:"\u{1f352}",fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:"\u{1f351}",fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:"\u{1f34d}",fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:"\u{1f965}",fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:"\u{1f95d}",fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:"\u{1f96d}",fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:"\u{1f951}",fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:"\u{1f966}",fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:"\u{1f345}",fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:"\u{1f346}",fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:"\u{1f952}",fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:"\u{1f955}",fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:"\u{1f336}",fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:"\u{1f954}",fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:"\u{1f33d}",fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:"\u{1f96c}",fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:"\u{1f360}",fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:"\u{1f95c}",fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:"\u{1f36f}",fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:"\u{1f950}",fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:"\u{1f35e}",fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:"\u{1f956}",fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:"\u{1f96f}",fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:"\u{1f968}",fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:"\u{1f9c0}",fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:"\u{1f95a}",fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:"\u{1f953}",fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:"\u{1f969}",fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:"\u{1f95e}",fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:"\u{1f357}",fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:"\u{1f356}",fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:"\u{1f9b4}",fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:"\u{1f364}",fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:"\u{1f373}",fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:"\u{1f354}",fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:"\u{1f35f}",fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:"\u{1f959}",fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:"\u{1f32d}",fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:"\u{1f355}",fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:"\u{1f96a}",fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:"\u{1f96b}",fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:"\u{1f35d}",fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:"\u{1f32e}",fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:"\u{1f32f}",fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:"\u{1f957}",fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:"\u{1f958}",fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:"\u{1f35c}",fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:"\u{1f372}",fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:"\u{1f365}",fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:"\u{1f960}",fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:"\u{1f363}",fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:"\u{1f371}",fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:"\u{1f35b}",fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:"\u{1f359}",fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:"\u{1f35a}",fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:"\u{1f358}",fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:"\u{1f362}",fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:"\u{1f361}",fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:"\u{1f367}",fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:"\u{1f368}",fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:"\u{1f366}",fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:"\u{1f967}",fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:"\u{1f370}",fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:"\u{1f9c1}",fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:"\u{1f96e}",fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:"\u{1f382}",fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:"\u{1f36e}",fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:"\u{1f36c}",fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:"\u{1f36d}",fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:"\u{1f36b}",fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:"\u{1f37f}",fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:"\u{1f95f}",fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:"\u{1f369}",fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:"\u{1f36a}",fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:"\u{1f95b}",fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\u{1f37a}",fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\u{1f37b}",fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:"\u{1f942}",fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:"\u{1f377}",fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:"\u{1f943}",fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:"\u{1f378}",fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:"\u{1f379}",fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:"\u{1f37e}",fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:"\u{1f376}",fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:"\u{1f375}",fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:"\u{1f964}",fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:"\u2615",fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:"\u{1f37c}",fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:"\u{1f9c2}",fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:"\u{1f944}",fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:"\u{1f374}",fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:"\u{1f37d}",fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:"\u{1f963}",fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:"\u{1f961}",fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:"\u{1f962}",fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:"\u26bd",fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:"\u{1f3c0}",fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:"\u{1f3c8}",fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:"\u26be",fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:"\u{1f94e}",fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:"\u{1f3be}",fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:"\u{1f3d0}",fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:"\u{1f3c9}",fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:"\u{1f94f}",fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:"\u{1f3b1}",fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:"\u26f3",fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:"\u{1f3cc}\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:"\u{1f3cc}",fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:"\u{1f3d3}",fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:"\u{1f3f8}",fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:"\u{1f945}",fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:"\u{1f3d2}",fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:"\u{1f3d1}",fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:"\u{1f94d}",fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:"\u{1f3cf}",fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:"\u{1f3bf}",fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:"\u26f7",fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:"\u{1f3c2}",fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:"\u{1f93a}",fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:"\u{1f93c}\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:"\u{1f93c}\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:"\u{1f938}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:"\u{1f938}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:"\u{1f93e}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:"\u{1f93e}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:"\u26f8",fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:"\u{1f94c}",fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:"\u{1f6f9}",fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:"\u{1f6f7}",fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:"\u{1f3f9}",fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:"\u{1f3a3}",fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:"\u{1f94a}",fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:"\u{1f94b}",fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:"\u{1f6a3}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:"\u{1f6a3}",fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:"\u{1f9d7}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:"\u{1f9d7}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:"\u{1f3ca}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:"\u{1f3ca}",fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:"\u{1f93d}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:"\u{1f93d}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:"\u{1f9d8}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:"\u{1f9d8}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:"\u{1f3c4}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:"\u{1f3c4}",fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:"\u{1f6c0}",fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:"\u26f9\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:"\u26f9",fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:"\u{1f3cb}\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:"\u{1f3cb}",fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:"\u{1f6b4}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:"\u{1f6b4}",fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:"\u{1f6b5}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:"\u{1f6b5}",fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:"\u{1f3c7}",fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:"\u{1f574}",fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:"\u{1f3c6}",fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:"\u{1f3bd}",fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:"\u{1f3c5}",fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:"\u{1f396}",fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:"\u{1f947}",fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:"\u{1f948}",fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:"\u{1f949}",fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:"\u{1f397}",fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:"\u{1f3f5}",fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:"\u{1f3ab}",fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:"\u{1f39f}",fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:"\u{1f3ad}",fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:"\u{1f3a8}",fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:"\u{1f3aa}",fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\u{1f939}\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\u{1f939}\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:"\u{1f3a4}",fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:"\u{1f3a7}",fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:"\u{1f3bc}",fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:"\u{1f3b9}",fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:"\u{1f941}",fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:"\u{1f3b7}",fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:"\u{1f3ba}",fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:"\u{1f3b8}",fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:"\u{1f3bb}",fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:"\u{1f3ac}",fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:"\u{1f3ae}",fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:"\u{1f47e}",fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:"\u{1f3af}",fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:"\u{1f3b2}",fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:"\u{1f3b0}",fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:"\u{1f9e9}",fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:"\u{1f3b3}",fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:"\u{1f697}",fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:"\u{1f695}",fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:"\u{1f699}",fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:"\u{1f68c}",fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:"\u{1f68e}",fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:"\u{1f3ce}",fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:"\u{1f693}",fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:"\u{1f691}",fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:"\u{1f692}",fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:"\u{1f690}",fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:"\u{1f69a}",fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:"\u{1f69b}",fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:"\u{1f69c}",fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:"\u{1f6f4}",fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:"\u{1f3cd}",fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:"\u{1f6b2}",fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:"\u{1f6f5}",fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:"\u{1f6a8}",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:"\u{1f694}",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:"\u{1f68d}",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:"\u{1f698}",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:"\u{1f696}",fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:"\u{1f6a1}",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:"\u{1f6a0}",fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:"\u{1f69f}",fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:"\u{1f683}",fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:"\u{1f68b}",fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:"\u{1f69d}",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:"\u{1f684}",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:"\u{1f685}",fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:"\u{1f688}",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:"\u{1f69e}",fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:"\u{1f682}",fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:"\u{1f686}",fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:"\u{1f687}",fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:"\u{1f68a}",fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:"\u{1f689}",fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:"\u{1f6f8}",fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:"\u{1f681}",fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:"\u{1f6e9}",fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:"\u2708\ufe0f",fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:"\u{1f6eb}",fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:"\u{1f6ec}",fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:"\u26f5",fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:"\u{1f6e5}",fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:"\u{1f6a4}",fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:"\u26f4",fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:"\u{1f6f3}",fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:"\u{1f680}",fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:"\u{1f6f0}",fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:"\u{1f4ba}",fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:"\u{1f6f6}",fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:"\u2693",fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:"\u{1f6a7}",fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:"\u26fd",fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:"\u{1f68f}",fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:"\u{1f6a6}",fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:"\u{1f6a5}",fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:"\u{1f3c1}",fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:"\u{1f6a2}",fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:"\u{1f3a1}",fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:"\u{1f3a2}",fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:"\u{1f3a0}",fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:"\u{1f3d7}",fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:"\u{1f301}",fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:"\u{1f5fc}",fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:"\u{1f3ed}",fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:"\u26f2",fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:"\u{1f391}",fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:"\u26f0",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:"\u{1f3d4}",fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:"\u{1f5fb}",fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:"\u{1f30b}",fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:"\u{1f5fe}",fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:"\u{1f3d5}",fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:"\u26fa",fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:"\u{1f3de}",fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:"\u{1f6e3}",fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:"\u{1f6e4}",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:"\u{1f305}",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:"\u{1f304}",fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:"\u{1f3dc}",fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:"\u{1f3d6}",fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:"\u{1f3dd}",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:"\u{1f307}",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:"\u{1f306}",fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:"\u{1f3d9}",fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:"\u{1f303}",fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:"\u{1f309}",fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:"\u{1f30c}",fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:"\u{1f320}",fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:"\u{1f387}",fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:"\u{1f386}",fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:"\u{1f308}",fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:"\u{1f3d8}",fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:"\u{1f3f0}",fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:"\u{1f3ef}",fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:"\u{1f3df}",fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:"\u{1f5fd}",fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:"\u{1f3e0}",fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:"\u{1f3e1}",fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:"\u{1f3da}",fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:"\u{1f3e2}",fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:"\u{1f3ec}",fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:"\u{1f3e3}",fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:"\u{1f3e4}",fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:"\u{1f3e5}",fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:"\u{1f3e6}",fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:"\u{1f3e8}",fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:"\u{1f3ea}",fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:"\u{1f3eb}",fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:"\u{1f3e9}",fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:"\u{1f492}",fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:"\u{1f3db}",fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:"\u26ea",fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:"\u{1f54c}",fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:"\u{1f54d}",fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:"\u{1f54b}",fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:"\u26e9",fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:"\u231a",fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:"\u{1f4f1}",fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:"\u{1f4f2}",fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:"\u{1f4bb}",fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:"\u2328",fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:"\u{1f5a5}",fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:"\u{1f5a8}",fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:"\u{1f5b1}",fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:"\u{1f5b2}",fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:"\u{1f579}",fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:"\u{1f5dc}",fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:"\u{1f4bd}",fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:"\u{1f4be}",fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:"\u{1f4bf}",fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:"\u{1f4c0}",fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:"\u{1f4fc}",fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:"\u{1f4f7}",fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:"\u{1f4f8}",fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:"\u{1f4f9}",fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:"\u{1f3a5}",fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:"\u{1f4fd}",fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:"\u{1f39e}",fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:"\u{1f4de}",fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:"\u260e\ufe0f",fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:"\u{1f4df}",fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:"\u{1f4e0}",fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:"\u{1f4fa}",fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:"\u{1f4fb}",fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:"\u{1f399}",fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:"\u{1f39a}",fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:"\u{1f39b}",fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:"\u{1f9ed}",fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:"\u23f1",fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:"\u23f2",fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:"\u23f0",fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:"\u{1f570}",fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:"\u23f3",fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:"\u231b",fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:"\u{1f4e1}",fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:"\u{1f50b}",fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:"\u{1f50c}",fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:"\u{1f4a1}",fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:"\u{1f526}",fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:"\u{1f56f}",fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:"\u{1f9ef}",fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:"\u{1f5d1}",fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:"\u{1f6e2}",fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:"\u{1f4b8}",fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:"\u{1f4b5}",fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:"\u{1f4b4}",fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:"\u{1f4b6}",fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:"\u{1f4b7}",fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:"\u{1f4b0}",fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:"\u{1f4b3}",fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:"\u{1f48e}",fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:"\u2696",fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:"\u{1f9f0}",fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:"\u{1f527}",fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:"\u{1f528}",fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:"\u2692",fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:"\u{1f6e0}",fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:"\u26cf",fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:"\u{1f529}",fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:"\u2699",fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:"\u{1f9f1}",fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:"\u26d3",fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:"\u{1f9f2}",fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:"\u{1f52b}",fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:"\u{1f4a3}",fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:"\u{1f9e8}",fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:"\u{1f52a}",fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:"\u{1f5e1}",fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:"\u2694",fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:"\u{1f6e1}",fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:"\u{1f6ac}",fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:"\u2620",fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:"\u26b0",fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:"\u26b1",fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:"\u{1f3fa}",fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:"\u{1f52e}",fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:"\u{1f4ff}",fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:"\u{1f9ff}",fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:"\u{1f488}",fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:"\u2697",fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:"\u{1f52d}",fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:"\u{1f52c}",fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:"\u{1f573}",fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:"\u{1f48a}",fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:"\u{1f489}",fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:"\u{1f9ec}",fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:"\u{1f9a0}",fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:"\u{1f9eb}",fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:"\u{1f9ea}",fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:"\u{1f321}",fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:"\u{1f9f9}",fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:"\u{1f9fa}",fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:"\u{1f9fb}",fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:"\u{1f3f7}",fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:"\u{1f516}",fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:"\u{1f6bd}",fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:"\u{1f6bf}",fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:"\u{1f6c1}",fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:"\u{1f9fc}",fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:"\u{1f9fd}",fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:"\u{1f9f4}",fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:"\u{1f511}",fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:"\u{1f5dd}",fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:"\u{1f6cb}",fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:"\u{1f6cc}",fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:"\u{1f6cf}",fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:"\u{1f6aa}",fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:"\u{1f6ce}",fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:"\u{1f9f8}",fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:"\u{1f5bc}",fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:"\u{1f5fa}",fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:"\u26f1",fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:"\u{1f5ff}",fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:"\u{1f6cd}",fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:"\u{1f6d2}",fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:"\u{1f388}",fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:"\u{1f38f}",fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:"\u{1f380}",fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:"\u{1f381}",fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:"\u{1f38a}",fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:"\u{1f389}",fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:"\u{1f38e}",fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:"\u{1f390}",fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:"\u{1f38c}",fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:"\u{1f3ee}",fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:"\u{1f9e7}",fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:"\u2709\ufe0f",fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:"\u{1f4e9}",fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:"\u{1f4e8}",fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:"\u{1f4e7}",fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:"\u{1f48c}",fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:"\u{1f4ee}",fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:"\u{1f4ea}",fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:"\u{1f4eb}",fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:"\u{1f4ec}",fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:"\u{1f4ed}",fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:"\u{1f4e6}",fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:"\u{1f4ef}",fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:"\u{1f4e5}",fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:"\u{1f4e4}",fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:"\u{1f4dc}",fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:"\u{1f4c3}",fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:"\u{1f4d1}",fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:"\u{1f9fe}",fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:"\u{1f4ca}",fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:"\u{1f4c8}",fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:"\u{1f4c9}",fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:"\u{1f4c4}",fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:"\u{1f4c5}",fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:"\u{1f4c6}",fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:"\u{1f5d3}",fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:"\u{1f4c7}",fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:"\u{1f5c3}",fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:"\u{1f5f3}",fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:"\u{1f5c4}",fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:"\u{1f4cb}",fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:"\u{1f5d2}",fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:"\u{1f4c1}",fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:"\u{1f4c2}",fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:"\u{1f5c2}",fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:"\u{1f5de}",fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:"\u{1f4f0}",fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:"\u{1f4d3}",fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:"\u{1f4d5}",fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:"\u{1f4d7}",fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:"\u{1f4d8}",fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:"\u{1f4d9}",fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:"\u{1f4d4}",fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:"\u{1f4d2}",fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:"\u{1f4da}",fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:"\u{1f4d6}",fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:"\u{1f9f7}",fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:"\u{1f517}",fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:"\u{1f4ce}",fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:"\u{1f587}",fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:"\u2702\ufe0f",fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:"\u{1f4d0}",fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:"\u{1f4cf}",fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:"\u{1f9ee}",fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:"\u{1f4cc}",fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:"\u{1f4cd}",fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:"\u{1f6a9}",fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:"\u{1f3f3}",fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:"\u{1f3f4}",fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:"\u{1f3f3}\ufe0f\u200d\u{1f308}",fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:"\u{1f510}",fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:"\u{1f512}",fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:"\u{1f513}",fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:"\u{1f50f}",fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:"\u{1f58a}",fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:"\u{1f58b}",fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:"\u2712\ufe0f",fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:"\u{1f4dd}",fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:"\u270f\ufe0f",fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:"\u{1f58d}",fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:"\u{1f58c}",fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:"\u{1f50d}",fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:"\u{1f50e}",fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:"\u2764\ufe0f",fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f9e1}",fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f49b}",fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f49a}",fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f499}",fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f49c}",fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:"\u{1f5a4}",fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:"\u{1f494}",fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:"\u2763",fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:"\u{1f495}",fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:"\u{1f49e}",fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:"\u{1f493}",fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:"\u{1f497}",fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:"\u{1f496}",fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:"\u{1f498}",fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:"\u{1f49d}",fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:"\u{1f49f}",fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:"\u262e",fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:"\u271d",fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:"\u262a",fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\u{1f549}",fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\u2638",fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:"\u2721",fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:"\u{1f52f}",fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:"\u{1f54e}",fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:"\u262f",fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:"\u2626",fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:"\u{1f6d0}",fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:"\u26ce",fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2648",fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2649",fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264a",fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264b",fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264c",fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264d",fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264e",fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:"\u264f",fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2650",fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2651",fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2652",fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2653",fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:"\u{1f194}",fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:"\u269b",fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:"\u{1f233}",fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:"\u{1f239}",fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:"\u2622",fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:"\u2623",fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:"\u{1f4f4}",fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:"\u{1f4f3}",fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:"\u{1f236}",fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:"\u{1f21a}",fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:"\u{1f238}",fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:"\u{1f23a}",fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:"\u{1f237}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:"\u2734\ufe0f",fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:"\u{1f19a}",fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:"\u{1f251}",fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:"\u{1f4ae}",fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:"\u{1f250}",fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:"\u3299\ufe0f",fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:"\u3297\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:"\u{1f234}",fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:"\u{1f235}",fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:"\u{1f232}",fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:"\u{1f170}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:"\u{1f171}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:"\u{1f18e}",fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:"\u{1f191}",fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:"\u{1f17e}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:"\u{1f198}",fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:"\u26d4",fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:"\u{1f4db}",fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:"\u{1f6ab}",fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:"\u274c",fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:"\u2b55",fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:"\u{1f6d1}",fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:"\u{1f4a2}",fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:"\u2668\ufe0f",fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:"\u{1f6b7}",fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:"\u{1f6af}",fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:"\u{1f6b3}",fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:"\u{1f6b1}",fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:"\u{1f51e}",fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:"\u{1f4f5}",fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:"\u2757",fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:"\u2755",fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:"\u2753",fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:"\u2754",fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:"\u203c\ufe0f",fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:"\u2049\ufe0f",fitzpatrick_scale:!1,category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:"\u{1f4af}",fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:"\u{1f505}",fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:"\u{1f506}",fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:"\u{1f531}",fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:"\u269c",fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:"\u303d\ufe0f",fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:"\u26a0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:"\u{1f6b8}",fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:"\u{1f530}",fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:"\u267b\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:"\u{1f22f}",fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:"\u{1f4b9}",fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:"\u2747\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:"\u2733\ufe0f",fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:"\u274e",fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:"\u2705",fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:"\u{1f4a0}",fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:"\u{1f300}",fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:"\u27bf",fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:"\u{1f310}",fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:"\u24c2\ufe0f",fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:"\u{1f3e7}",fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:"\u{1f202}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:"\u{1f6c2}",fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:"\u{1f6c3}",fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:"\u{1f6c4}",fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:"\u{1f6c5}",fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:"\u267f",fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:"\u{1f6ad}",fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:"\u{1f6be}",fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:"\u{1f17f}\ufe0f",fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:"\u{1f6b0}",fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:"\u{1f6b9}",fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:"\u{1f6ba}",fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:"\u{1f6bc}",fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:"\u{1f6bb}",fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:"\u{1f6ae}",fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:"\u{1f3a6}",fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:"\u{1f4f6}",fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:"\u{1f201}",fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:"\u{1f196}",fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:"\u{1f197}",fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:"\u{1f199}",fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:"\u{1f192}",fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:"\u{1f195}",fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:"\u{1f193}",fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:"0\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:"1\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:"2\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:"3\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:"4\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:"5\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:"6\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:"7\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:"8\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:"9\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:"\u{1f51f}",fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:"*\u20e3",fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:"\u{1f522}",fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:"\u23cf\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:"\u25b6\ufe0f",fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:"\u23f8",fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:"\u23ed",fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:"\u23f9",fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:"\u23fa",fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:"\u23ef",fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:"\u23ee",fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:"\u23e9",fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:"\u23ea",fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:"\u{1f500}",fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:"\u{1f501}",fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:"\u{1f502}",fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:"\u25c0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:"\u{1f53c}",fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:"\u{1f53d}",fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:"\u23eb",fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:"\u23ec",fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:"\u27a1\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:"\u2b05\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:"\u2b06\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:"\u2b07\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:"\u2197\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:"\u2198\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:"\u2199\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:"\u2196\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:"\u2195\ufe0f",fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:"\u2194\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:"\u{1f504}",fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:"\u21aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:"\u21a9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:"\u2934\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:"\u2935\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:"#\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:"\u2139\ufe0f",fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:"\u{1f524}",fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:"\u{1f521}",fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:"\u{1f520}",fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:"\u{1f523}",fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:"\u{1f3b5}",fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:"\u{1f3b6}",fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:"\u3030\ufe0f",fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:"\u27b0",fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:"\u2714\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:"\u{1f503}",fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:"\u2795",fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:"\u2796",fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:"\u2797",fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:"\u2716\ufe0f",fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:"\u267e",fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:"\u{1f4b2}",fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:"\u{1f4b1}",fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:"\xa9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:"\xae\ufe0f",fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:"\u2122\ufe0f",fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:"\u{1f51a}",fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:"\u{1f519}",fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:"\u{1f51b}",fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:"\u{1f51d}",fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:"\u{1f51c}",fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:"\u2611\ufe0f",fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:"\u{1f518}",fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:"\u26aa",fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:"\u26ab",fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:"\u{1f534}",fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:"\u{1f535}",fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:"\u{1f538}",fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:"\u{1f539}",fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:"\u{1f536}",fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:"\u{1f537}",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:"\u{1f53a}",fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:"\u25aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:"\u25ab\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:"\u2b1b",fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:"\u2b1c",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:"\u{1f53b}",fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:"\u25fc\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:"\u25fb\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:"\u25fe",fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:"\u25fd",fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:"\u{1f532}",fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:"\u{1f533}",fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:"\u{1f508}",fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:"\u{1f509}",fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:"\u{1f50a}",fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:"\u{1f507}",fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:"\u{1f4e3}",fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:"\u{1f4e2}",fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:"\u{1f514}",fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:"\u{1f515}",fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:"\u{1f0cf}",fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:"\u{1f004}",fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:"\u2660\ufe0f",fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:"\u2663\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:"\u2665\ufe0f",fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:"\u2666\ufe0f",fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:"\u{1f3b4}",fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:"\u{1f4ad}",fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:"\u{1f5ef}",fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:"\u{1f4ac}",fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:"\u{1f5e8}",fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:"\u{1f550}",fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:"\u{1f551}",fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:"\u{1f552}",fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:"\u{1f553}",fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:"\u{1f554}",fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:"\u{1f555}",fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:"\u{1f556}",fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:"\u{1f557}",fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:"\u{1f558}",fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:"\u{1f559}",fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:"\u{1f55a}",fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:"\u{1f55b}",fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:"\u{1f55c}",fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:"\u{1f55d}",fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:"\u{1f55e}",fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:"\u{1f55f}",fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:"\u{1f560}",fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:"\u{1f561}",fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:"\u{1f562}",fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:"\u{1f563}",fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:"\u{1f564}",fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:"\u{1f565}",fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:"\u{1f566}",fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:"\u{1f567}",fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1fd}",fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:"\u{1f1e9}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f6}",fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1e7}",fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ef}",fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f6}",fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1fb}",fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:"\u{1f1e8}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1fd}",fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:"\u{1f1ed}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:"\u{1f1e9}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:"\u{1f1e9}\u{1f1ef}",fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:"\u{1f1e9}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:"\u{1f1e9}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1fb}",fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f6}",fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:"\u{1f1ea}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:"\u{1f1eb}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:"\u{1f1eb}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:"\u{1f1eb}\u{1f1ef}",fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:"\u{1f1eb}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:"\u{1f1eb}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:"\u{1f1e9}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f5}",fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:"\u{1f1ed}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:"\u{1f1ed}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:"\u{1f1ed}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:"\u{1f1ed}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f6}",fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:"\u{1f1ee}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:"\u{1f1ef}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:"\u{1f1ef}\u{1f1f5}",fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:"\u{1f1ef}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:"\u{1f1ef}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:"\u{1f1fd}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1fb}",fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1e7}",fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1fb}",fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f6}",fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:"\u{1f1fe}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1fd}",fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:"\u{1f1eb}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1f5}",fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:"\u{1f1f2}\u{1f1f5}",fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:"\u{1f1f0}\u{1f1f5}",fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:"\u{1f1f3}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:"\u{1f1f4}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:"\u{1f1f6}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:"\u{1f1f7}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:"\u{1f1f7}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:"\u{1f1f7}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:"\u{1f1f7}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:"\u{1f1e7}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:"\u{1f1f0}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:"\u{1f1f5}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:"\u{1f1fc}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:"\u{1f1f7}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1fd}",fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1e7}",fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:"\u{1f1ff}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:"\u{1f1ec}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:"\u{1f1f0}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:"\u{1f1f1}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1e9}",fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:"\u{1f1e8}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:"\u{1f1f8}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1ef}",fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f1}",fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f0}",fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f4}",fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f9}",fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f7}",fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1e8}",fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:"\u{1f1f9}\u{1f1fb}",fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:"\u{1f1fa}\u{1f1ec}",fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:"\u{1f1fa}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:"\u{1f1e6}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:"\u{1f1ec}\u{1f1e7}",fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:"\u{1f3f4}\u{e0067}\u{e0062}\u{e0065}\u{e006e}\u{e0067}\u{e007f}",fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:"\u{1f3f4}\u{e0067}\u{e0062}\u{e0073}\u{e0063}\u{e0074}\u{e007f}",fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:"\u{1f3f4}\u{e0067}\u{e0062}\u{e0077}\u{e006c}\u{e0073}\u{e007f}",fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:"\u{1f1fa}\u{1f1f8}",fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1ee}",fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:"\u{1f1fa}\u{1f1fe}",fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:"\u{1f1fa}\u{1f1ff}",fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1fa}",fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1e6}",fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:"\u{1f1fb}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:"\u{1f1fc}\u{1f1eb}",fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:"\u{1f1ea}\u{1f1ed}",fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:"\u{1f1fe}\u{1f1ea}",fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:"\u{1f1ff}\u{1f1f2}",fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:"\u{1f1ff}\u{1f1fc}",fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:"\u{1f1fa}\u{1f1f3}",fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:"\u{1f3f4}\u200d\u2620\ufe0f",fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/public/js/tinymce/plugins/emoticons/plugin.js b/public/js/tinymce/plugins/emoticons/plugin.js index 36d527b8f..ac2bfeeb8 100644 --- a/public/js/tinymce/plugins/emoticons/plugin.js +++ b/public/js/tinymce/plugins/emoticons/plugin.js @@ -1,252 +1,222 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; - var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var eq = function (t) { - return function (a) { - return t === a; - }; - }; - var isNull = eq(null); + const eq = t => a => t === a; + const isNull = eq(null); + const isUndefined = eq(undefined); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); - var noop = function () { + const noop = () => { }; - var constant = function (value) { - return function () { + const constant = value => { + return () => { return value; }; }; - var identity = function (x) { - return x; - }; - var never = constant(false); - var always = constant(true); + const never = constant(false); - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from - }; + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); - var exists = function (xs, pred) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const exists = (xs, pred) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; if (pred(x, i)) { return true; } } return false; }; - var map$1 = function (xs, f) { - var len = xs.length; - var r = new Array(len); - for (var i = 0; i < len; i++) { - var x = xs[i]; + const map$1 = (xs, f) => { + const len = xs.length; + const r = new Array(len); + for (let i = 0; i < len; i++) { + const x = xs[i]; r[i] = f(x, i); } return r; }; - var each$1 = function (xs, f) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const each$1 = (xs, f) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; f(x, i); } }; - var Cell = function (initial) { - var value = initial; - var get = function () { + const Cell = initial => { + let value = initial; + const get = () => { return value; }; - var set = function (v) { + const set = v => { value = v; }; return { - get: get, - set: set + get, + set }; }; - var last = function (fn, rate) { - var timer = null; - var cancel = function () { + const last = (fn, rate) => { + let timer = null; + const cancel = () => { if (!isNull(timer)) { clearTimeout(timer); timer = null; } }; - var throttle = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } + const throttle = (...args) => { cancel(); - timer = setTimeout(function () { + timer = setTimeout(() => { timer = null; fn.apply(null, args); }, rate); }; return { - cancel: cancel, - throttle: throttle + cancel, + throttle }; }; - var insertEmoticon = function (editor, ch) { + const insertEmoticon = (editor, ch) => { editor.insertContent(ch); }; - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - - var keys = Object.keys; - var hasOwnProperty = Object.hasOwnProperty; - var each = function (obj, f) { - var props = keys(obj); - for (var k = 0, len = props.length; k < len; k++) { - var i = props[k]; - var x = obj[i]; + const keys = Object.keys; + const hasOwnProperty = Object.hasOwnProperty; + const each = (obj, f) => { + const props = keys(obj); + for (let k = 0, len = props.length; k < len; k++) { + const i = props[k]; + const x = obj[i]; f(x, i); } }; - var map = function (obj, f) { - return tupleMap(obj, function (x, i) { - return { - k: i, - v: f(x, i) - }; - }); + const map = (obj, f) => { + return tupleMap(obj, (x, i) => ({ + k: i, + v: f(x, i) + })); }; - var tupleMap = function (obj, f) { - var r = {}; - each(obj, function (x, i) { - var tuple = f(x, i); + const tupleMap = (obj, f) => { + const r = {}; + each(obj, (x, i) => { + const tuple = f(x, i); r[tuple.k] = tuple.v; }); return r; }; - var has = function (obj, key) { - return hasOwnProperty.call(obj, key); - }; + const has = (obj, key) => hasOwnProperty.call(obj, key); - var shallow = function (old, nu) { + const shallow = (old, nu) => { return nu; }; - var baseMerge = function (merger) { - return function () { - var objects = []; - for (var _i = 0; _i < arguments.length; _i++) { - objects[_i] = arguments[_i]; - } + const baseMerge = merger => { + return (...objects) => { if (objects.length === 0) { - throw new Error('Can\'t merge zero objects'); + throw new Error(`Can't merge zero objects`); } - var ret = {}; - for (var j = 0; j < objects.length; j++) { - var curObject = objects[j]; - for (var key in curObject) { + const ret = {}; + for (let j = 0; j < objects.length; j++) { + const curObject = objects[j]; + for (const key in curObject) { if (has(curObject, key)) { ret[key] = merger(ret[key], curObject[key]); } @@ -255,78 +225,85 @@ return ret; }; }; - var merge = baseMerge(shallow); + const merge = baseMerge(shallow); - var singleton = function (doRevoke) { - var subject = Cell(Optional.none()); - var revoke = function () { - return subject.get().each(doRevoke); - }; - var clear = function () { + const singleton = doRevoke => { + const subject = Cell(Optional.none()); + const revoke = () => subject.get().each(doRevoke); + const clear = () => { revoke(); subject.set(Optional.none()); }; - var isSet = function () { - return subject.get().isSome(); - }; - var get = function () { - return subject.get(); - }; - var set = function (s) { + const isSet = () => subject.get().isSome(); + const get = () => subject.get(); + const set = s => { revoke(); subject.set(Optional.some(s)); }; return { - clear: clear, - isSet: isSet, - get: get, - set: set + clear, + isSet, + get, + set }; }; - var value = function () { - var subject = singleton(noop); - var on = function (f) { - return subject.get().each(f); + const value = () => { + const subject = singleton(noop); + const on = f => subject.get().each(f); + return { + ...subject, + on }; - return __assign(__assign({}, subject), { on: on }); }; - var checkRange = function (str, substr, start) { - return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; - }; - var contains = function (str, substr) { - return str.indexOf(substr) !== -1; + const checkRange = (str, substr, start) => substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; + const contains = (str, substr, start = 0, end) => { + const idx = str.indexOf(substr, start); + if (idx !== -1) { + return isUndefined(end) ? true : idx + substr.length <= end; + } else { + return false; + } }; - var startsWith = function (str, prefix) { + const startsWith = (str, prefix) => { return checkRange(str, prefix, 0); }; - var global$2 = tinymce.util.Tools.resolve('tinymce.Resource'); - - var global$1 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + var global = tinymce.util.Tools.resolve('tinymce.Resource'); - var global = tinymce.util.Tools.resolve('tinymce.util.Promise'); - - var DEFAULT_ID = 'tinymce.plugins.emoticons'; - var getEmoticonDatabase = function (editor) { - return editor.getParam('emoticons_database', 'emojis', 'string'); - }; - var getEmoticonDatabaseUrl = function (editor, pluginUrl) { - var database = getEmoticonDatabase(editor); - return editor.getParam('emoticons_database_url', pluginUrl + '/js/' + database + editor.suffix + '.js', 'string'); - }; - var getEmoticonDatabaseId = function (editor) { - return editor.getParam('emoticons_database_id', DEFAULT_ID, 'string'); - }; - var getAppendedEmoticons = function (editor) { - return editor.getParam('emoticons_append', {}, 'object'); - }; - var getEmotionsImageUrl = function (editor) { - return editor.getParam('emoticons_images_url', 'https://twemoji.maxcdn.com/v/13.0.1/72x72/', 'string'); + const DEFAULT_ID = 'tinymce.plugins.emoticons'; + const option = name => editor => editor.options.get(name); + const register$2 = (editor, pluginUrl) => { + const registerOption = editor.options.register; + registerOption('emoticons_database', { + processor: 'string', + default: 'emojis' + }); + registerOption('emoticons_database_url', { + processor: 'string', + default: `${ pluginUrl }/js/${ getEmojiDatabase(editor) }${ editor.suffix }.js` + }); + registerOption('emoticons_database_id', { + processor: 'string', + default: DEFAULT_ID + }); + registerOption('emoticons_append', { + processor: 'object', + default: {} + }); + registerOption('emoticons_images_url', { + processor: 'string', + default: 'https://twemoji.maxcdn.com/v/13.0.1/72x72/' + }); }; + const getEmojiDatabase = option('emoticons_database'); + const getEmojiDatabaseUrl = option('emoticons_database_url'); + const getEmojiDatabaseId = option('emoticons_database_id'); + const getAppendedEmoji = option('emoticons_append'); + const getEmojiImageUrl = option('emoticons_images_url'); - var ALL_CATEGORY = 'All'; - var categoryNameMap = { + const ALL_CATEGORY = 'All'; + const categoryNameMap = { symbols: 'Symbols', people: 'People', animals_and_nature: 'Animals and Nature', @@ -337,87 +314,76 @@ flags: 'Flags', user: 'User Defined' }; - var translateCategory = function (categories, name) { - return has(categories, name) ? categories[name] : name; - }; - var getUserDefinedEmoticons = function (editor) { - var userDefinedEmoticons = getAppendedEmoticons(editor); - return map(userDefinedEmoticons, function (value) { - return __assign({ - keywords: [], - category: 'user' - }, value); - }); - }; - var initDatabase = function (editor, databaseUrl, databaseId) { - var categories = value(); - var all = value(); - var emojiImagesUrl = getEmotionsImageUrl(editor); - var getEmoji = function (lib) { + const translateCategory = (categories, name) => has(categories, name) ? categories[name] : name; + const getUserDefinedEmoji = editor => { + const userDefinedEmoticons = getAppendedEmoji(editor); + return map(userDefinedEmoticons, value => ({ + keywords: [], + category: 'user', + ...value + })); + }; + const initDatabase = (editor, databaseUrl, databaseId) => { + const categories = value(); + const all = value(); + const emojiImagesUrl = getEmojiImageUrl(editor); + const getEmoji = lib => { if (startsWith(lib.char, ' `src="${ emojiImagesUrl }${ url }"`); } else { return lib.char; } }; - var processEmojis = function (emojis) { - var cats = {}; - var everything = []; - each(emojis, function (lib, title) { - var entry = { - title: title, + const processEmojis = emojis => { + const cats = {}; + const everything = []; + each(emojis, (lib, title) => { + const entry = { + title, keywords: lib.keywords, char: getEmoji(lib), category: translateCategory(categoryNameMap, lib.category) }; - var current = cats[entry.category] !== undefined ? cats[entry.category] : []; + const current = cats[entry.category] !== undefined ? cats[entry.category] : []; cats[entry.category] = current.concat([entry]); everything.push(entry); }); categories.set(cats); all.set(everything); }; - editor.on('init', function () { - global$2.load(databaseId, databaseUrl).then(function (emojis) { - var userEmojis = getUserDefinedEmoticons(editor); + editor.on('init', () => { + global.load(databaseId, databaseUrl).then(emojis => { + const userEmojis = getUserDefinedEmoji(editor); processEmojis(merge(emojis, userEmojis)); - }, function (err) { - console.log('Failed to load emoticons: ' + err); + }, err => { + console.log(`Failed to load emojis: ${ err }`); categories.set({}); all.set([]); }); }); - var listCategory = function (category) { + const listCategory = category => { if (category === ALL_CATEGORY) { return listAll(); } - return categories.get().bind(function (cats) { - return Optional.from(cats[category]); - }).getOr([]); - }; - var listAll = function () { - return all.get().getOr([]); - }; - var listCategories = function () { - return [ALL_CATEGORY].concat(keys(categories.get().getOr({}))); + return categories.get().bind(cats => Optional.from(cats[category])).getOr([]); }; - var waitForLoad = function () { + const listAll = () => all.get().getOr([]); + const listCategories = () => [ALL_CATEGORY].concat(keys(categories.get().getOr({}))); + const waitForLoad = () => { if (hasLoaded()) { - return global.resolve(true); + return Promise.resolve(true); } else { - return new global(function (resolve, reject) { - var numRetries = 15; - var interval = global$1.setInterval(function () { + return new Promise((resolve, reject) => { + let numRetries = 15; + const interval = setInterval(() => { if (hasLoaded()) { - global$1.clearInterval(interval); + clearInterval(interval); resolve(true); } else { numRetries--; if (numRetries < 0) { console.log('Could not load emojis from url: ' + databaseUrl); - global$1.clearInterval(interval); + clearInterval(interval); reject(false); } } @@ -425,34 +391,22 @@ }); } }; - var hasLoaded = function () { - return categories.isSet() && all.isSet(); - }; + const hasLoaded = () => categories.isSet() && all.isSet(); return { - listCategories: listCategories, - hasLoaded: hasLoaded, - waitForLoad: waitForLoad, - listAll: listAll, - listCategory: listCategory + listCategories, + hasLoaded, + waitForLoad, + listAll, + listCategory }; }; - var emojiMatches = function (emoji, lowerCasePattern) { - return contains(emoji.title.toLowerCase(), lowerCasePattern) || exists(emoji.keywords, function (k) { - return contains(k.toLowerCase(), lowerCasePattern); - }); - }; - var emojisFrom = function (list, pattern, maxResults) { - var matches = []; - var lowerCasePattern = pattern.toLowerCase(); - var reachedLimit = maxResults.fold(function () { - return never; - }, function (max) { - return function (size) { - return size >= max; - }; - }); - for (var i = 0; i < list.length; i++) { + const emojiMatches = (emoji, lowerCasePattern) => contains(emoji.title.toLowerCase(), lowerCasePattern) || exists(emoji.keywords, k => contains(k.toLowerCase(), lowerCasePattern)); + const emojisFrom = (list, pattern, maxResults) => { + const matches = []; + const lowerCasePattern = pattern.toLowerCase(); + const reachedLimit = maxResults.fold(() => never, max => size => size >= max); + for (let i = 0; i < list.length; i++) { if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) { matches.push({ value: list[i].char, @@ -467,57 +421,55 @@ return matches; }; - var patternName = 'pattern'; - var open = function (editor, database) { - var initialState = { + const patternName = 'pattern'; + const open = (editor, database) => { + const initialState = { pattern: '', results: emojisFrom(database.listAll(), '', Optional.some(300)) }; - var currentTab = Cell(ALL_CATEGORY); - var scan = function (dialogApi) { - var dialogData = dialogApi.getData(); - var category = currentTab.get(); - var candidates = database.listCategory(category); - var results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Optional.some(300) : Optional.none()); - dialogApi.setData({ results: results }); + const currentTab = Cell(ALL_CATEGORY); + const scan = dialogApi => { + const dialogData = dialogApi.getData(); + const category = currentTab.get(); + const candidates = database.listCategory(category); + const results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Optional.some(300) : Optional.none()); + dialogApi.setData({ results }); }; - var updateFilter = last(function (dialogApi) { + const updateFilter = last(dialogApi => { scan(dialogApi); }, 200); - var searchField = { + const searchField = { label: 'Search', type: 'input', name: patternName }; - var resultsField = { + const resultsField = { type: 'collection', name: 'results' }; - var getInitialState = function () { - var body = { + const getInitialState = () => { + const body = { type: 'tabpanel', - tabs: map$1(database.listCategories(), function (cat) { - return { - title: cat, - name: cat, - items: [ - searchField, - resultsField - ] - }; - }) + tabs: map$1(database.listCategories(), cat => ({ + title: cat, + name: cat, + items: [ + searchField, + resultsField + ] + })) }; return { - title: 'Emoticons', + title: 'Emojis', size: 'normal', - body: body, + body, initialData: initialState, - onTabChange: function (dialogApi, details) { + onTabChange: (dialogApi, details) => { currentTab.set(details.newTabName); updateFilter.throttle(dialogApi); }, onChange: updateFilter.throttle, - onAction: function (dialogApi, actionData) { + onAction: (dialogApi, actionData) => { if (actionData.name === 'results') { insertEmoticon(editor, actionData.value); dialogApi.close(); @@ -530,25 +482,25 @@ }] }; }; - var dialogApi = editor.windowManager.open(getInitialState()); + const dialogApi = editor.windowManager.open(getInitialState()); dialogApi.focus(patternName); if (!database.hasLoaded()) { - dialogApi.block('Loading emoticons...'); - database.waitForLoad().then(function () { + dialogApi.block('Loading emojis...'); + database.waitForLoad().then(() => { dialogApi.redial(getInitialState()); updateFilter.throttle(dialogApi); dialogApi.focus(patternName); dialogApi.unblock(); - }).catch(function (_err) { + }).catch(_err => { dialogApi.redial({ - title: 'Emoticons', + title: 'Emojis', body: { type: 'panel', items: [{ type: 'alertbanner', level: 'error', icon: 'warning', - text: '

    Could not load emoticons

    ' + text: 'Could not load emojis' }] }, buttons: [{ @@ -567,16 +519,14 @@ } }; - var register$1 = function (editor, database) { - editor.addCommand('mceEmoticons', function () { - return open(editor, database); - }); + const register$1 = (editor, database) => { + editor.addCommand('mceEmoticons', () => open(editor, database)); }; - var setup = function (editor) { - editor.on('PreInit', function () { - editor.parser.addAttributeFilter('data-emoticon', function (nodes) { - each$1(nodes, function (node) { + const setup = editor => { + editor.on('PreInit', () => { + editor.parser.addAttributeFilter('data-emoticon', nodes => { + each$1(nodes, node => { node.attr('data-mce-resize', 'false'); node.attr('data-mce-placeholder', '1'); }); @@ -584,18 +534,16 @@ }); }; - var init = function (editor, database) { + const init = (editor, database) => { editor.ui.registry.addAutocompleter('emoticons', { - ch: ':', + trigger: ':', columns: 'auto', minChars: 2, - fetch: function (pattern, maxResults) { - return database.waitForLoad().then(function () { - var candidates = database.listAll(); - return emojisFrom(candidates, pattern, Optional.some(maxResults)); - }); - }, - onAction: function (autocompleteApi, rng, value) { + fetch: (pattern, maxResults) => database.waitForLoad().then(() => { + const candidates = database.listAll(); + return emojisFrom(candidates, pattern, Optional.some(maxResults)); + }), + onAction: (autocompleteApi, rng, value) => { editor.selection.setRng(rng); editor.insertContent(value); autocompleteApi.hide(); @@ -603,34 +551,45 @@ }); }; - var register = function (editor) { - var onAction = function () { - return editor.execCommand('mceEmoticons'); + const onSetupEditable = editor => api => { + const nodeChanged = () => { + api.setEnabled(editor.selection.isEditable()); + }; + editor.on('NodeChange', nodeChanged); + nodeChanged(); + return () => { + editor.off('NodeChange', nodeChanged); }; + }; + const register = editor => { + const onAction = () => editor.execCommand('mceEmoticons'); editor.ui.registry.addButton('emoticons', { - tooltip: 'Emoticons', + tooltip: 'Emojis', icon: 'emoji', - onAction: onAction + onAction, + onSetup: onSetupEditable(editor) }); editor.ui.registry.addMenuItem('emoticons', { - text: 'Emoticons...', + text: 'Emojis...', icon: 'emoji', - onAction: onAction + onAction, + onSetup: onSetupEditable(editor) }); }; - function Plugin () { - global$3.add('emoticons', function (editor, pluginUrl) { - var databaseUrl = getEmoticonDatabaseUrl(editor, pluginUrl); - var databaseId = getEmoticonDatabaseId(editor); - var database = initDatabase(editor, databaseUrl, databaseId); + var Plugin = () => { + global$1.add('emoticons', (editor, pluginUrl) => { + register$2(editor, pluginUrl); + const databaseUrl = getEmojiDatabaseUrl(editor); + const databaseId = getEmojiDatabaseId(editor); + const database = initDatabase(editor, databaseUrl, databaseId); register$1(editor, database); register(editor); init(editor, database); setup(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/emoticons/plugin.min.js b/public/js/tinymce/plugins/emoticons/plugin.min.js index a52cfed0b..69be32cf3 100644 --- a/public/js/tinymce/plugins/emoticons/plugin.min.js +++ b/public/js/tinymce/plugins/emoticons/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function r(){}function i(t){return function(){return t}}function t(t){return t}function n(){return c}var m,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=i(!1),a=i(!(m=null)),c={fold:function(t,n){return t()},isSome:l,isNone:a,getOr:t,getOrThunk:o,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:t,orThunk:o,map:n,each:r,bind:n,exists:l,forall:a,filter:function(){return c},toArray:function(){return[]},toString:i("none()")};function o(t){return t()}function g(t){var n=t;return{get:function(){return n},set:function(t){n=t}}}function d(t,n){for(var e=k(t),o=0,r=e.length;o=(a="Could not load emoticons

    "}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),f.focus(S),f.unblock()}))}function b(t){t.on("PreInit",function(){t.parser.addAttributeFilter("data-emoticon",function(t){!function(t){for(var n,e=0,o=t.length;ee=>t===e,o=e(null),n=e(void 0),s=()=>{},r=()=>!1;class a{constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(null!=t?t:"Called getOrDie on None")}static from(t){return null==t?a.none():a.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}a.singletonNone=new a(!1);const i=(t,e)=>{const o=t.length,n=new Array(o);for(let s=0;s{let e=t;return{get:()=>e,set:t=>{e=t}}},c=Object.keys,u=Object.hasOwnProperty,g=(t,e)=>{const o=c(t);for(let n=0,s=o.length;nu.call(t,e),d=(h=(t,e)=>e,(...t)=>{if(0===t.length)throw new Error("Can't merge zero objects");const e={};for(let o=0;o{const t=(t=>{const e=l(a.none()),o=()=>e.get().each(t);return{clear:()=>{o(),e.set(a.none())},isSet:()=>e.get().isSome(),get:()=>e.get(),set:t=>{o(),e.set(a.some(t))}}})(s);return{...t,on:e=>t.get().each(e)}},v=(t,e,o=0,s)=>{const r=t.indexOf(e,o);return-1!==r&&(!!n(s)||r+e.length<=s)};var y=tinymce.util.Tools.resolve("tinymce.Resource");const f=t=>e=>e.options.get(t),b=f("emoticons_database"),w=f("emoticons_database_url"),C=f("emoticons_database_id"),_=f("emoticons_append"),j=f("emoticons_images_url"),k="All",A={symbols:"Symbols",people:"People",animals_and_nature:"Animals and Nature",food_and_drink:"Food and Drink",activity:"Activity",travel_and_places:"Travel and Places",objects:"Objects",flags:"Flags",user:"User Defined"},O=(t,e)=>m(t,e)?t[e]:e,x=t=>{const e=_(t);return o=t=>({keywords:[],category:"user",...t}),((t,e)=>{const o={};return g(t,((t,n)=>{const s=e(t,n);o[s.k]=s.v})),o})(e,((t,e)=>({k:e,v:o(t)})));var o},E=(t,e)=>v(t.title.toLowerCase(),e)||((t,o)=>{for(let o=0,s=t.length;o{const n=[],s=e.toLowerCase(),a=o.fold((()=>r),(t=>e=>e>=t));for(let o=0;o{const n={pattern:"",results:S(e.listAll(),"",a.some(300))},s=l(k),r=((t,e)=>{let n=null;const s=()=>{o(n)||(clearTimeout(n),n=null)};return{cancel:s,throttle:(...e)=>{s(),n=setTimeout((()=>{n=null,t.apply(null,e)}),200)}}})((t=>{(t=>{const o=t.getData(),n=s.get(),r=e.listCategory(n),i=S(r,o[L],n===k?a.some(300):a.none());t.setData({results:i})})(t)})),c={label:"Search",type:"input",name:L},u={type:"collection",name:"results"},g=()=>({title:"Emojis",size:"normal",body:{type:"tabpanel",tabs:i(e.listCategories(),(t=>({title:t,name:t,items:[c,u]})))},initialData:n,onTabChange:(t,e)=>{s.set(e.newTabName),r.throttle(t)},onChange:r.throttle,onAction:(e,o)=>{"results"===o.name&&(((t,e)=>{t.insertContent(e)})(t,o.value),e.close())},buttons:[{type:"cancel",text:"Close",primary:!0}]}),m=t.windowManager.open(g());m.focus(L),e.hasLoaded()||(m.block("Loading emojis..."),e.waitForLoad().then((()=>{m.redial(g()),r.throttle(m),m.focus(L),m.unblock()})).catch((t=>{m.redial({title:"Emojis",body:{type:"panel",items:[{type:"alertbanner",level:"error",icon:"warning",text:"Could not load emojis"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),m.focus(L),m.unblock()})))},T=t=>e=>{const o=()=>{e.setEnabled(t.selection.isEditable())};return t.on("NodeChange",o),o(),()=>{t.off("NodeChange",o)}};t.add("emoticons",((t,e)=>{((t,e)=>{const o=t.options.register;o("emoticons_database",{processor:"string",default:"emojis"}),o("emoticons_database_url",{processor:"string",default:`${e}/js/${b(t)}${t.suffix}.js`}),o("emoticons_database_id",{processor:"string",default:"tinymce.plugins.emoticons"}),o("emoticons_append",{processor:"object",default:{}}),o("emoticons_images_url",{processor:"string",default:"https://twemoji.maxcdn.com/v/13.0.1/72x72/"})})(t,e);const o=((t,e,o)=>{const n=p(),s=p(),r=j(t),i=t=>{return o="=4&&e.substr(0,4)===o?t.char.replace(/src="([^"]+)"/,((t,e)=>`src="${r}${e}"`)):t.char;var e,o};t.on("init",(()=>{y.load(o,e).then((e=>{const o=x(t);(t=>{const e={},o=[];g(t,((t,n)=>{const s={title:n,keywords:t.keywords,char:i(t),category:O(A,t.category)},r=void 0!==e[s.category]?e[s.category]:[];e[s.category]=r.concat([s]),o.push(s)})),n.set(e),s.set(o)})(d(e,o))}),(t=>{console.log(`Failed to load emojis: ${t}`),n.set({}),s.set([])}))}));const l=()=>s.get().getOr([]),u=()=>n.isSet()&&s.isSet();return{listCategories:()=>[k].concat(c(n.get().getOr({}))),hasLoaded:u,waitForLoad:()=>u()?Promise.resolve(!0):new Promise(((t,o)=>{let n=15;const s=setInterval((()=>{u()?(clearInterval(s),t(!0)):(n--,n<0&&(console.log("Could not load emojis from url: "+e),clearInterval(s),o(!1)))}),100)})),listAll:l,listCategory:t=>t===k?l():n.get().bind((e=>a.from(e[t]))).getOr([])}})(t,w(t),C(t));((t,e)=>{t.addCommand("mceEmoticons",(()=>N(t,e)))})(t,o),(t=>{const e=()=>t.execCommand("mceEmoticons");t.ui.registry.addButton("emoticons",{tooltip:"Emojis",icon:"emoji",onAction:e,onSetup:T(t)}),t.ui.registry.addMenuItem("emoticons",{text:"Emojis...",icon:"emoji",onAction:e,onSetup:T(t)})})(t),((t,e)=>{t.ui.registry.addAutocompleter("emoticons",{trigger:":",columns:"auto",minChars:2,fetch:(t,o)=>e.waitForLoad().then((()=>{const n=e.listAll();return S(n,t,a.some(o))})),onAction:(e,o,n)=>{t.selection.setRng(o),t.insertContent(n),e.hide()}})})(t,o),(t=>{t.on("PreInit",(()=>{t.parser.addAttributeFilter("data-emoticon",(t=>{((t,e)=>{for(let e=0,n=t.length;e'); - }; - var getProtect = function (editor) { - return editor.getParam('protect'); - }; - - var parseHeader = function (editor, head) { - return global$2({ - validate: false, - root_name: '#document' - }, editor.schema).parse(head, { format: 'xhtml' }); - }; - var htmlToData = function (editor, head) { - var headerFragment = parseHeader(editor, head); - var data = {}; - var elm, matches; - var getAttr = function (elm, name) { - var value = elm.attr(name); - return value || ''; - }; - data.fontface = getDefaultFontFamily(editor); - data.fontsize = getDefaultFontSize(editor); - elm = headerFragment.firstChild; - if (elm.type === 7) { - data.xml_pi = true; - matches = /encoding="([^"]+)"/.exec(elm.value); - if (matches) { - data.docencoding = matches[1]; - } - } - elm = headerFragment.getAll('#doctype')[0]; - if (elm) { - data.doctype = ''; - } - elm = headerFragment.getAll('title')[0]; - if (elm && elm.firstChild) { - data.title = elm.firstChild.value; - } - global$3.each(headerFragment.getAll('meta'), function (meta) { - var name = meta.attr('name'); - var httpEquiv = meta.attr('http-equiv'); - var matches; - if (name) { - data[name.toLowerCase()] = meta.attr('content'); - } else if (httpEquiv === 'Content-Type') { - matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); - if (matches) { - data.docencoding = matches[1]; - } - } - }); - elm = headerFragment.getAll('html')[0]; - if (elm) { - data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); - } - data.stylesheets = []; - global$3.each(headerFragment.getAll('link'), function (link) { - if (link.attr('rel') === 'stylesheet') { - data.stylesheets.push(link.attr('href')); - } - }); - elm = headerFragment.getAll('body')[0]; - if (elm) { - data.langdir = getAttr(elm, 'dir'); - data.style = getAttr(elm, 'style'); - data.visited_color = getAttr(elm, 'vlink'); - data.link_color = getAttr(elm, 'link'); - data.active_color = getAttr(elm, 'alink'); - } - return data; - }; - var dataToHtml = function (editor, data, head) { - var headElement, elm; - var dom = editor.dom; - var setAttr = function (elm, name, value) { - elm.attr(name, value ? value : undefined); - }; - var addHeadNode = function (node) { - if (headElement.firstChild) { - headElement.insert(node, headElement.firstChild); - } else { - headElement.append(node); - } - }; - var headerFragment = parseHeader(editor, head); - headElement = headerFragment.getAll('head')[0]; - if (!headElement) { - elm = headerFragment.getAll('html')[0]; - headElement = new global$1('head', 1); - if (elm.firstChild) { - elm.insert(headElement, elm.firstChild, true); - } else { - elm.append(headElement); - } - } - elm = headerFragment.firstChild; - if (data.xml_pi) { - var value = 'version="1.0"'; - if (data.docencoding) { - value += ' encoding="' + data.docencoding + '"'; - } - if (elm.type !== 7) { - elm = new global$1('xml', 7); - headerFragment.insert(elm, headerFragment.firstChild, true); - } - elm.value = value; - } else if (elm && elm.type === 7) { - elm.remove(); - } - elm = headerFragment.getAll('#doctype')[0]; - if (data.doctype) { - if (!elm) { - elm = new global$1('#doctype', 10); - if (data.xml_pi) { - headerFragment.insert(elm, headerFragment.firstChild); - } else { - addHeadNode(elm); - } - } - elm.value = data.doctype.substring(9, data.doctype.length - 1); - } else if (elm) { - elm.remove(); - } - elm = null; - global$3.each(headerFragment.getAll('meta'), function (meta) { - if (meta.attr('http-equiv') === 'Content-Type') { - elm = meta; - } - }); - if (data.docencoding) { - if (!elm) { - elm = new global$1('meta', 1); - elm.attr('http-equiv', 'Content-Type'); - elm.shortEnded = true; - addHeadNode(elm); - } - elm.attr('content', 'text/html; charset=' + data.docencoding); - } else if (elm) { - elm.remove(); - } - elm = headerFragment.getAll('title')[0]; - if (data.title) { - if (!elm) { - elm = new global$1('title', 1); - addHeadNode(elm); - } else { - elm.empty(); - } - elm.append(new global$1('#text', 3)).value = data.title; - } else if (elm) { - elm.remove(); - } - global$3.each('keywords,description,author,copyright,robots'.split(','), function (name) { - var nodes = headerFragment.getAll('meta'); - var i, meta; - var value = data[name]; - for (i = 0; i < nodes.length; i++) { - meta = nodes[i]; - if (meta.attr('name') === name) { - if (value) { - meta.attr('content', value); - } else { - meta.remove(); - } - return; - } - } - if (value) { - elm = new global$1('meta', 1); - elm.attr('name', name); - elm.attr('content', value); - elm.shortEnded = true; - addHeadNode(elm); - } - }); - var currentStyleSheetsMap = {}; - global$3.each(headerFragment.getAll('link'), function (stylesheet) { - if (stylesheet.attr('rel') === 'stylesheet') { - currentStyleSheetsMap[stylesheet.attr('href')] = stylesheet; - } - }); - global$3.each(data.stylesheets, function (stylesheet) { - if (!currentStyleSheetsMap[stylesheet]) { - elm = new global$1('link', 1); - elm.attr({ - rel: 'stylesheet', - text: 'text/css', - href: stylesheet - }); - elm.shortEnded = true; - addHeadNode(elm); - } - delete currentStyleSheetsMap[stylesheet]; - }); - global$3.each(currentStyleSheetsMap, function (stylesheet) { - stylesheet.remove(); - }); - elm = headerFragment.getAll('body')[0]; - if (elm) { - setAttr(elm, 'dir', data.langdir); - setAttr(elm, 'style', data.style); - setAttr(elm, 'vlink', data.visited_color); - setAttr(elm, 'link', data.link_color); - setAttr(elm, 'alink', data.active_color); - dom.setAttribs(editor.getBody(), { - style: data.style, - dir: data.dir, - vLink: data.visited_color, - link: data.link_color, - aLink: data.active_color - }); - } - elm = headerFragment.getAll('html')[0]; - if (elm) { - setAttr(elm, 'lang', data.langcode); - setAttr(elm, 'xml:lang', data.langcode); - } - if (!headElement.firstChild) { - headElement.remove(); - } - var html = global({ - validate: false, - indent: true, - indent_before: 'head,html,body,meta,title,script,link,style', - indent_after: 'head,html,body,meta,title,script,link,style' - }).serialize(headerFragment); - return html.substring(0, html.indexOf('')); - }; - - var open = function (editor, headState) { - var data = htmlToData(editor, headState.get()); - var defaultData = { - title: '', - keywords: '', - description: '', - robots: '', - author: '', - docencoding: '' - }; - var initialData = __assign(__assign({}, defaultData), data); - editor.windowManager.open({ - title: 'Metadata and Document Properties', - size: 'normal', - body: { - type: 'panel', - items: [ - { - name: 'title', - type: 'input', - label: 'Title' - }, - { - name: 'keywords', - type: 'input', - label: 'Keywords' - }, - { - name: 'description', - type: 'input', - label: 'Description' - }, - { - name: 'robots', - type: 'input', - label: 'Robots' - }, - { - name: 'author', - type: 'input', - label: 'Author' - }, - { - name: 'docencoding', - type: 'input', - label: 'Encoding' - } - ] - }, - buttons: [ - { - type: 'cancel', - name: 'cancel', - text: 'Cancel' - }, - { - type: 'submit', - name: 'save', - text: 'Save', - primary: true - } - ], - initialData: initialData, - onSubmit: function (api) { - var nuData = api.getData(); - var headHtml = dataToHtml(editor, global$3.extend(data, nuData), headState.get()); - headState.set(headHtml); - api.close(); - } - }); - }; - - var register$1 = function (editor, headState) { - editor.addCommand('mceFullPageProperties', function () { - open(editor, headState); - }); - }; - - var protectHtml = function (protect, html) { - global$3.each(protect, function (pattern) { - html = html.replace(pattern, function (str) { - return ''; - }); - }); - return html; - }; - var unprotectHtml = function (html) { - return html.replace(//g, function (a, m) { - return unescape(m); - }); - }; - - var each = global$3.each; - var low = function (s) { - return s.replace(/<\/?[A-Z]+/g, function (a) { - return a.toLowerCase(); - }); - }; - var handleSetContent = function (editor, headState, footState, evt) { - var startPos, endPos, content, styles = ''; - var dom = editor.dom; - if (evt.selection) { - return; - } - content = protectHtml(getProtect(editor), evt.content); - if (evt.format === 'raw' && headState.get()) { - return; - } - if (evt.source_view && shouldHideInSourceView(editor)) { - return; - } - if (content.length === 0 && !evt.source_view) { - content = global$3.trim(headState.get()) + '\n' + global$3.trim(content) + '\n' + global$3.trim(footState.get()); - } - content = content.replace(/<(\/?)BODY/gi, '<$1body'); - startPos = content.indexOf('', startPos); - headState.set(low(content.substring(0, startPos + 1))); - endPos = content.indexOf('\n'); - } - var headerFragment = parseHeader(editor, headState.get()); - each(headerFragment.getAll('style'), function (node) { - if (node.firstChild) { - styles += node.firstChild.value; - } - }); - var bodyElm = headerFragment.getAll('body')[0]; - if (bodyElm) { - dom.setAttribs(editor.getBody(), { - style: bodyElm.attr('style') || '', - dir: bodyElm.attr('dir') || '', - vLink: bodyElm.attr('vlink') || '', - link: bodyElm.attr('link') || '', - aLink: bodyElm.attr('alink') || '' - }); - } - dom.remove('fullpage_styles'); - var headElm = editor.getDoc().getElementsByTagName('head')[0]; - if (styles) { - var styleElm = dom.add(headElm, 'style', { id: 'fullpage_styles' }); - styleElm.appendChild(document.createTextNode(styles)); - } - var currentStyleSheetsMap = {}; - global$3.each(headElm.getElementsByTagName('link'), function (stylesheet) { - if (stylesheet.rel === 'stylesheet' && stylesheet.getAttribute('data-mce-fullpage')) { - currentStyleSheetsMap[stylesheet.href] = stylesheet; - } - }); - global$3.each(headerFragment.getAll('link'), function (stylesheet) { - var href = stylesheet.attr('href'); - if (!href) { - return true; - } - if (!currentStyleSheetsMap[href] && stylesheet.attr('rel') === 'stylesheet') { - dom.add(headElm, 'link', { - 'rel': 'stylesheet', - 'text': 'text/css', - href: href, - 'data-mce-fullpage': '1' - }); - } - delete currentStyleSheetsMap[href]; - }); - global$3.each(currentStyleSheetsMap, function (stylesheet) { - stylesheet.parentNode.removeChild(stylesheet); - }); - }; - var getDefaultHeader = function (editor) { - var header = '', value, styles = ''; - if (getDefaultXmlPi(editor)) { - var piEncoding = getDefaultEncoding(editor); - header += '\n'; - } - header += getDefaultDocType(editor); - header += '\n\n\n'; - if (value = getDefaultTitle(editor)) { - header += '' + value + '\n'; - } - if (value = getDefaultEncoding(editor)) { - header += '\n'; - } - if (value = getDefaultFontFamily(editor)) { - styles += 'font-family: ' + value + ';'; - } - if (value = getDefaultFontSize(editor)) { - styles += 'font-size: ' + value + ';'; - } - if (value = getDefaultTextColor(editor)) { - styles += 'color: ' + value + ';'; - } - header += '\n\n'; - return header; - }; - var handleGetContent = function (editor, head, foot, evt) { - if (evt.format === 'html' && !evt.selection && (!evt.source_view || !shouldHideInSourceView(editor))) { - evt.content = unprotectHtml(global$3.trim(head) + '\n' + global$3.trim(evt.content) + '\n' + global$3.trim(foot)); - } - }; - var setup = function (editor, headState, footState) { - editor.on('BeforeSetContent', function (evt) { - handleSetContent(editor, headState, footState, evt); - }); - editor.on('GetContent', function (evt) { - handleGetContent(editor, headState.get(), footState.get(), evt); - }); - }; - - var register = function (editor) { - editor.ui.registry.addButton('fullpage', { - tooltip: 'Metadata and document properties', - icon: 'document-properties', - onAction: function () { - editor.execCommand('mceFullPageProperties'); - } - }); - editor.ui.registry.addMenuItem('fullpage', { - text: 'Metadata and document properties', - icon: 'document-properties', - onAction: function () { - editor.execCommand('mceFullPageProperties'); - } - }); - }; - - function Plugin () { - global$4.add('fullpage', function (editor) { - var headState = Cell(''), footState = Cell(''); - register$1(editor, headState); - register(editor); - setup(editor, headState, footState); - }); - } - - Plugin(); - -}()); diff --git a/public/js/tinymce/plugins/fullpage/plugin.min.js b/public/js/tinymce/plugins/fullpage/plugin.min.js index be7f88d11..a53d735f7 100644 --- a/public/js/tinymce/plugins/fullpage/plugin.min.js +++ b/public/js/tinymce/plugins/fullpage/plugin.min.js @@ -4,6 +4,6 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * - * Version: 5.10.3 (2022-02-09) + * Version: 5.10.5 (2022-05-25) */ !function(){"use strict";function i(e){var t=e;return{get:function(){return t},set:function(e){t=e}}}function _(e){return e.getParam("fullpage_hide_in_source_view")}function b(e){return e.getParam("fullpage_default_encoding")}function x(e){return e.getParam("fullpage_default_font_family")}function k(e){return e.getParam("fullpage_default_font_size")}function C(e,t){return n({validate:!1,root_name:"#document"},e.schema).parse(t,{format:"xhtml"})}function c(u,m){u.addCommand("mceFullPageProperties",function(){var l,i,o,e,t,n,r,a,c,s;function d(e,t){return e.attr(t)||""}t=l=u,n=(i=m).get(),c=C(t,n),(s={}).fontface=x(t),s.fontsize=k(t),7===(r=c.firstChild).type&&(s.xml_pi=!0,(a=/encoding="([^"]+)"/.exec(r.value))&&(s.docencoding=a[1])),(r=c.getAll("#doctype")[0])&&(s.doctype=""),(r=c.getAll("title")[0])&&r.firstChild&&(s.title=r.firstChild.value),w.each(c.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?s[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(s.docencoding=t[1])}),(r=c.getAll("html")[0])&&(s.langcode=d(r,"lang")||d(r,"xml:lang")),s.stylesheets=[],w.each(c.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&s.stylesheets.push(e.attr("href"))}),(r=c.getAll("body")[0])&&(s.langdir=d(r,"dir"),s.style=d(r,"style"),s.visited_color=d(r,"vlink"),s.link_color=d(r,"link"),s.active_color=d(r,"alink")),o=s,e=g(g({},{title:"",keywords:"",description:"",robots:"",author:"",docencoding:""}),o),l.windowManager.open({title:"Metadata and Document Properties",size:"normal",body:{type:"panel",items:[{name:"title",type:"input",label:"Title"},{name:"keywords",type:"input",label:"Keywords"},{name:"description",type:"input",label:"Description"},{name:"robots",type:"input",label:"Robots"},{name:"author",type:"input",label:"Author"},{name:"docencoding",type:"input",label:"Encoding"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:e,onSubmit:function(e){var t=e.getData(),n=function(e,o,t){function n(e,t,n){e.attr(t,n||void 0)}function r(e){s.firstChild?s.insert(e,s.firstChild):s.append(e)}var a,l,i=e.dom,c=C(e,t),s=c.getAll("head")[0];s||(a=c.getAll("html")[0],s=new f("head",1),a.firstChild?a.insert(s,a.firstChild,!0):a.append(s)),a=c.firstChild,o.xml_pi?(l='version="1.0"',o.docencoding&&(l+=' encoding="'+o.docencoding+'"'),7!==a.type&&(a=new f("xml",7),c.insert(a,c.firstChild,!0)),a.value=l):a&&7===a.type&&a.remove(),a=c.getAll("#doctype")[0],o.doctype?(a||(a=new f("#doctype",10),o.xml_pi?c.insert(a,c.firstChild):r(a)),a.value=o.doctype.substring(9,o.doctype.length-1)):a&&a.remove(),a=null,w.each(c.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(a=e)}),o.docencoding?(a||((a=new f("meta",1)).attr("http-equiv","Content-Type"),a.shortEnded=!0,r(a)),a.attr("content","text/html; charset="+o.docencoding)):a&&a.remove(),a=c.getAll("title")[0],o.title?(a?a.empty():r(a=new f("title",1)),a.append(new f("#text",3)).value=o.title):a&&a.remove(),w.each("keywords,description,author,copyright,robots".split(","),function(e){for(var t,n=c.getAll("meta"),l=o[e],i=0;i"))}(l,w.extend(o,t),i.get());i.set(n),e.close()}})})}function A(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})}function s(e,t,n,l){var i,o,r,a,c,s,d,u,m,g,f,p,h,y="",v=e.dom;l.selection||(a=e.getParam("protect"),c=l.content,w.each(a,function(e){c=c.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),r=c,"raw"===l.format&&t.get()||l.source_view&&_(e)||(-1!==(i=(r=(r=0!==r.length||l.source_view?r:w.trim(t.get())+"\n"+w.trim(r)+"\n"+w.trim(n.get())).replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",i),t.set(A(r.substring(0,i+1))),-1===(o=r.indexOf("\n'),p+=g.getParam("fullpage_default_doctype",""),p+="\n\n\n",(f=g.getParam("fullpage_default_title"))&&(p+=""+f+"\n"),(f=b(g))&&(p+='\n'),(f=x(g))&&(h+="font-family: "+f+";"),(f=k(g))&&(h+="font-size: "+f+";"),(f=g.getParam("fullpage_default_text_color"))&&(h+="color: "+f+";"),p+="\n\n")),n.set("\n\n")),s=C(e,t.get()),P(s.getAll("style"),function(e){e.firstChild&&(y+=e.firstChild.value)}),(d=s.getAll("body")[0])&&v.setAttribs(e.getBody(),{style:d.attr("style")||"",dir:d.attr("dir")||"",vLink:d.attr("vlink")||"",link:d.attr("link")||"",aLink:d.attr("alink")||""}),v.remove("fullpage_styles"),u=e.getDoc().getElementsByTagName("head")[0],y&&v.add(u,"style",{id:"fullpage_styles"}).appendChild(document.createTextNode(y)),m={},w.each(u.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(m[e.href]=e)}),w.each(s.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;m[t]||"stylesheet"!==e.attr("rel")||v.add(u,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete m[t]}),w.each(m,function(e){e.parentNode.removeChild(e)})))}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=function(){return(g=Object.assign||function(e){for(var t,n=1,l=arguments.length;n/g,function(e,t){return unescape(t)}))})})}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/fullscreen/plugin.js b/public/js/tinymce/plugins/fullscreen/plugin.js index c6068d868..3b3b583fe 100644 --- a/public/js/tinymce/plugins/fullscreen/plugin.js +++ b/public/js/tinymce/plugins/fullscreen/plugin.js @@ -1,283 +1,257 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; - var Cell = function (initial) { - var value = initial; - var get = function () { + const Cell = initial => { + let value = initial; + const get = () => { return value; }; - var set = function (v) { + const set = v => { value = v; }; return { - get: get, - set: set + get, + set }; }; - var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var get$5 = function (fullscreenState) { - return { - isFullscreen: function () { - return fullscreenState.get() !== null; - } - }; - }; + const get$5 = fullscreenState => ({ isFullscreen: () => fullscreenState.get() !== null }); - var typeOf = function (x) { - var t = typeof x; + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } + }; + const typeOf = x => { + const t = typeof x; if (x === null) { return 'null'; - } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + } else if (t === 'object' && Array.isArray(x)) { return 'array'; - } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { return 'string'; } else { return t; } }; - var isType$1 = function (type) { - return function (value) { - return typeOf(value) === type; - }; - }; - var isSimpleType = function (type) { - return function (value) { - return typeof value === type; - }; - }; - var isString = isType$1('string'); - var isArray = isType$1('array'); - var isBoolean = isSimpleType('boolean'); - var isNullable = function (a) { - return a === null || a === undefined; - }; - var isNonNullable = function (a) { - return !isNullable(a); - }; - var isFunction = isSimpleType('function'); - var isNumber = isSimpleType('number'); + const isType$1 = type => value => typeOf(value) === type; + const isSimpleType = type => value => typeof value === type; + const eq$1 = t => a => t === a; + const isString = isType$1('string'); + const isArray = isType$1('array'); + const isNull = eq$1(null); + const isBoolean = isSimpleType('boolean'); + const isUndefined = eq$1(undefined); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); + const isFunction = isSimpleType('function'); + const isNumber = isSimpleType('number'); - var noop = function () { + const noop = () => { }; - var compose = function (fa, fb) { - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } + const compose = (fa, fb) => { + return (...args) => { return fa(fb.apply(null, args)); }; }; - var compose1 = function (fbc, fab) { - return function (a) { - return fbc(fab(a)); - }; - }; - var constant = function (value) { - return function () { + const compose1 = (fbc, fab) => a => fbc(fab(a)); + const constant = value => { + return () => { return value; }; }; - var identity = function (x) { - return x; - }; - function curry(fn) { - var initialArgs = []; - for (var _i = 1; _i < arguments.length; _i++) { - initialArgs[_i - 1] = arguments[_i]; - } - return function () { - var restArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - restArgs[_i] = arguments[_i]; - } - var all = initialArgs.concat(restArgs); + function curry(fn, ...initialArgs) { + return (...restArgs) => { + const all = initialArgs.concat(restArgs); return fn.apply(null, all); }; } - var never = constant(false); - var always = constant(true); + const never = constant(false); + const always = constant(true); - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from - }; - - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); } - return t; - }; - return __assign.apply(this, arguments); - }; + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); - var singleton = function (doRevoke) { - var subject = Cell(Optional.none()); - var revoke = function () { - return subject.get().each(doRevoke); - }; - var clear = function () { + const singleton = doRevoke => { + const subject = Cell(Optional.none()); + const revoke = () => subject.get().each(doRevoke); + const clear = () => { revoke(); subject.set(Optional.none()); }; - var isSet = function () { - return subject.get().isSome(); - }; - var get = function () { - return subject.get(); - }; - var set = function (s) { + const isSet = () => subject.get().isSome(); + const get = () => subject.get(); + const set = s => { revoke(); subject.set(Optional.some(s)); }; return { - clear: clear, - isSet: isSet, - get: get, - set: set + clear, + isSet, + get, + set }; }; - var unbindable = function () { - return singleton(function (s) { - return s.unbind(); - }); + const unbindable = () => singleton(s => s.unbind()); + const value = () => { + const subject = singleton(noop); + const on = f => subject.get().each(f); + return { + ...subject, + on + }; }; - var value = function () { - var subject = singleton(noop); - var on = function (f) { - return subject.get().each(f); + + const first = (fn, rate) => { + let timer = null; + const cancel = () => { + if (!isNull(timer)) { + clearTimeout(timer); + timer = null; + } + }; + const throttle = (...args) => { + if (isNull(timer)) { + timer = setTimeout(() => { + timer = null; + fn.apply(null, args); + }, rate); + } + }; + return { + cancel, + throttle }; - return __assign(__assign({}, subject), { on: on }); }; - var nativePush = Array.prototype.push; - var map = function (xs, f) { - var len = xs.length; - var r = new Array(len); - for (var i = 0; i < len; i++) { - var x = xs[i]; + const nativePush = Array.prototype.push; + const map = (xs, f) => { + const len = xs.length; + const r = new Array(len); + for (let i = 0; i < len; i++) { + const x = xs[i]; r[i] = f(x, i); } return r; }; - var each$1 = function (xs, f) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const each$1 = (xs, f) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; f(x, i); } }; - var filter$1 = function (xs, pred) { - var r = []; - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const filter$1 = (xs, pred) => { + const r = []; + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; if (pred(x, i)) { r.push(x); } } return r; }; - var findUntil = function (xs, pred, until) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const findUntil = (xs, pred, until) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; if (pred(x, i)) { return Optional.some(x); } else if (until(x, i)) { @@ -286,12 +260,12 @@ } return Optional.none(); }; - var find$1 = function (xs, pred) { + const find$1 = (xs, pred) => { return findUntil(xs, pred, never); }; - var flatten = function (xs) { - var r = []; - for (var i = 0, len = xs.length; i < len; ++i) { + const flatten = xs => { + const r = []; + for (let i = 0, len = xs.length; i < len; ++i) { if (!isArray(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } @@ -299,18 +273,12 @@ } return r; }; - var bind$3 = function (xs, f) { - return flatten(map(xs, f)); - }; - var get$4 = function (xs, i) { - return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); - }; - var head = function (xs) { - return get$4(xs, 0); - }; - var findMap = function (arr, f) { - for (var i = 0; i < arr.length; i++) { - var r = f(arr[i], i); + const bind$3 = (xs, f) => flatten(map(xs, f)); + const get$4 = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + const head = xs => get$4(xs, 0); + const findMap = (arr, f) => { + for (let i = 0; i < arr.length; i++) { + const r = f(arr[i], i); if (r.isSome()) { return r; } @@ -318,89 +286,250 @@ return Optional.none(); }; - var keys = Object.keys; - var each = function (obj, f) { - var props = keys(obj); - for (var k = 0, len = props.length; k < len; k++) { - var i = props[k]; - var x = obj[i]; + const keys = Object.keys; + const each = (obj, f) => { + const props = keys(obj); + for (let k = 0, len = props.length; k < len; k++) { + const i = props[k]; + const x = obj[i]; f(x, i); } }; - var contains = function (str, substr) { - return str.indexOf(substr) !== -1; + const contains = (str, substr, start = 0, end) => { + const idx = str.indexOf(substr, start); + if (idx !== -1) { + return isUndefined(end) ? true : idx + substr.length <= end; + } else { + return false; + } }; - var isSupported$1 = function (dom) { - return dom.style !== undefined && isFunction(dom.style.getPropertyValue); - }; + const isSupported$1 = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue); - var fromHtml = function (html, scope) { - var doc = scope || document; - var div = doc.createElement('div'); + const fromHtml = (html, scope) => { + const doc = scope || document; + const div = doc.createElement('div'); div.innerHTML = html; if (!div.hasChildNodes() || div.childNodes.length > 1) { - console.error('HTML does not have a single root node', html); - throw new Error('HTML must have a single root node'); + const message = 'HTML does not have a single root node'; + console.error(message, html); + throw new Error(message); } return fromDom(div.childNodes[0]); }; - var fromTag = function (tag, scope) { - var doc = scope || document; - var node = doc.createElement(tag); + const fromTag = (tag, scope) => { + const doc = scope || document; + const node = doc.createElement(tag); return fromDom(node); }; - var fromText = function (text, scope) { - var doc = scope || document; - var node = doc.createTextNode(text); + const fromText = (text, scope) => { + const doc = scope || document; + const node = doc.createTextNode(text); return fromDom(node); }; - var fromDom = function (node) { + const fromDom = node => { if (node === null || node === undefined) { throw new Error('Node cannot be null or undefined'); } return { dom: node }; }; - var fromPoint = function (docElm, x, y) { - return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); - }; - var SugarElement = { - fromHtml: fromHtml, - fromTag: fromTag, - fromText: fromText, - fromDom: fromDom, - fromPoint: fromPoint + const fromPoint = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + const SugarElement = { + fromHtml, + fromTag, + fromText, + fromDom, + fromPoint }; typeof window !== 'undefined' ? window : Function('return this;')(); - var DOCUMENT = 9; - var DOCUMENT_FRAGMENT = 11; - var ELEMENT = 1; - var TEXT = 3; + const DOCUMENT = 9; + const DOCUMENT_FRAGMENT = 11; + const ELEMENT = 1; + const TEXT = 3; - var type = function (element) { - return element.dom.nodeType; + const type = element => element.dom.nodeType; + const isType = t => element => type(element) === t; + const isElement = isType(ELEMENT); + const isText = isType(TEXT); + const isDocument = isType(DOCUMENT); + const isDocumentFragment = isType(DOCUMENT_FRAGMENT); + + const is = (element, selector) => { + const dom = element.dom; + if (dom.nodeType !== ELEMENT) { + return false; + } else { + const elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } }; - var isType = function (t) { - return function (element) { - return type(element) === t; - }; + const bypassSelector = dom => dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0; + const all$1 = (selector, scope) => { + const base = scope === undefined ? document : scope.dom; + return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom); }; - var isElement = isType(ELEMENT); - var isText = isType(TEXT); - var isDocument = isType(DOCUMENT); - var isDocumentFragment = isType(DOCUMENT_FRAGMENT); - var cached = function (f) { - var called = false; - var r; - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; + const eq = (e1, e2) => e1.dom === e2.dom; + + const owner = element => SugarElement.fromDom(element.dom.ownerDocument); + const documentOrOwner = dos => isDocument(dos) ? dos : owner(dos); + const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom); + const parents = (element, isRoot) => { + const stop = isFunction(isRoot) ? isRoot : never; + let dom = element.dom; + const ret = []; + while (dom.parentNode !== null && dom.parentNode !== undefined) { + const rawParent = dom.parentNode; + const p = SugarElement.fromDom(rawParent); + ret.push(p); + if (stop(p) === true) { + break; + } else { + dom = rawParent; } + } + return ret; + }; + const siblings$2 = element => { + const filterSelf = elements => filter$1(elements, x => !eq(element, x)); + return parent(element).map(children).map(filterSelf).getOr([]); + }; + const children = element => map(element.dom.childNodes, SugarElement.fromDom); + + const isShadowRoot = dos => isDocumentFragment(dos) && isNonNullable(dos.dom.host); + const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); + const isSupported = constant(supported); + const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner; + const getShadowRoot = e => { + const r = getRootNode(e); + return isShadowRoot(r) ? Optional.some(r) : Optional.none(); + }; + const getShadowHost = e => SugarElement.fromDom(e.dom.host); + const getOriginalEventTarget = event => { + if (isSupported() && isNonNullable(event.target)) { + const el = SugarElement.fromDom(event.target); + if (isElement(el) && isOpenShadowHost(el)) { + if (event.composed && event.composedPath) { + const composedPath = event.composedPath(); + if (composedPath) { + return head(composedPath); + } + } + } + } + return Optional.from(event.target); + }; + const isOpenShadowHost = element => isNonNullable(element.dom.shadowRoot); + + const inBody = element => { + const dom = isText(element) ? element.dom.parentNode : element.dom; + if (dom === undefined || dom === null || dom.ownerDocument === null) { + return false; + } + const doc = dom.ownerDocument; + return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost)); + }; + const getBody = doc => { + const b = doc.dom.body; + if (b === null || b === undefined) { + throw new Error('Body is not available yet'); + } + return SugarElement.fromDom(b); + }; + + const rawSet = (dom, key, value) => { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + const set = (element, key, value) => { + rawSet(element.dom, key, value); + }; + const get$3 = (element, key) => { + const v = element.dom.getAttribute(key); + return v === null ? undefined : v; + }; + const remove = (element, key) => { + element.dom.removeAttribute(key); + }; + + const internalSet = (dom, property, value) => { + if (!isString(value)) { + console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported$1(dom)) { + dom.style.setProperty(property, value); + } + }; + const setAll = (element, css) => { + const dom = element.dom; + each(css, (v, k) => { + internalSet(dom, k, v); + }); + }; + const get$2 = (element, property) => { + const dom = element.dom; + const styles = window.getComputedStyle(dom); + const r = styles.getPropertyValue(property); + return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + }; + const getUnsafeProperty = (dom, property) => isSupported$1(dom) ? dom.style.getPropertyValue(property) : ''; + + const mkEvent = (target, x, y, stop, prevent, kill, raw) => ({ + target, + x, + y, + stop, + prevent, + kill, + raw + }); + const fromRawEvent = rawEvent => { + const target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target)); + const stop = () => rawEvent.stopPropagation(); + const prevent = () => rawEvent.preventDefault(); + const kill = compose(prevent, stop); + return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); + }; + const handle = (filter, handler) => rawEvent => { + if (filter(rawEvent)) { + handler(fromRawEvent(rawEvent)); + } + }; + const binder = (element, event, filter, handler, useCapture) => { + const wrapped = handle(filter, handler); + element.dom.addEventListener(event, wrapped, useCapture); + return { unbind: curry(unbind, element, event, wrapped, useCapture) }; + }; + const bind$2 = (element, event, filter, handler) => binder(element, event, filter, handler, false); + const unbind = (element, event, handler, useCapture) => { + element.dom.removeEventListener(event, handler, useCapture); + }; + + const filter = always; + const bind$1 = (element, event, handler) => bind$2(element, event, filter, handler); + + const cached = f => { + let called = false; + let r; + return (...args) => { if (!called) { called = true; r = f.apply(null, args); @@ -409,15 +538,15 @@ }; }; - var DeviceType = function (os, browser, userAgent, mediaMatch) { - var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; - var isiPhone = os.isiOS() && !isiPad; - var isMobile = os.isiOS() || os.isAndroid(); - var isTouch = isMobile || mediaMatch('(pointer:coarse)'); - var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); - var isPhone = isiPhone || isMobile && !isTablet; - var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; - var isDesktop = !isPhone && !isTablet && !iOSwebview; + const DeviceType = (os, browser, userAgent, mediaMatch) => { + const isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; + const isiPhone = os.isiOS() && !isiPad; + const isMobile = os.isiOS() || os.isAndroid(); + const isTouch = isMobile || mediaMatch('(pointer:coarse)'); + const isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); + const isPhone = isiPhone || isMobile && !isTablet; + const iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; + const isDesktop = !isPhone && !isTablet && !iOSwebview; return { isiPad: constant(isiPad), isiPhone: constant(isiPhone), @@ -431,112 +560,110 @@ }; }; - var firstMatch = function (regexes, s) { - for (var i = 0; i < regexes.length; i++) { - var x = regexes[i]; + const firstMatch = (regexes, s) => { + for (let i = 0; i < regexes.length; i++) { + const x = regexes[i]; if (x.test(s)) { return x; } } return undefined; }; - var find = function (regexes, agent) { - var r = firstMatch(regexes, agent); + const find = (regexes, agent) => { + const r = firstMatch(regexes, agent); if (!r) { return { major: 0, minor: 0 }; } - var group = function (i) { + const group = i => { return Number(agent.replace(r, '$' + i)); }; return nu$2(group(1), group(2)); }; - var detect$3 = function (versionRegexes, agent) { - var cleanedAgent = String(agent).toLowerCase(); + const detect$3 = (versionRegexes, agent) => { + const cleanedAgent = String(agent).toLowerCase(); if (versionRegexes.length === 0) { return unknown$2(); } return find(versionRegexes, cleanedAgent); }; - var unknown$2 = function () { + const unknown$2 = () => { return nu$2(0, 0); }; - var nu$2 = function (major, minor) { + const nu$2 = (major, minor) => { return { - major: major, - minor: minor + major, + minor }; }; - var Version = { + const Version = { nu: nu$2, detect: detect$3, unknown: unknown$2 }; - var detectBrowser$1 = function (browsers, userAgentData) { - return findMap(userAgentData.brands, function (uaBrand) { - var lcBrand = uaBrand.brand.toLowerCase(); - return find$1(browsers, function (browser) { + const detectBrowser$1 = (browsers, userAgentData) => { + return findMap(userAgentData.brands, uaBrand => { + const lcBrand = uaBrand.brand.toLowerCase(); + return find$1(browsers, browser => { var _a; return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase()); - }).map(function (info) { - return { - current: info.name, - version: Version.nu(parseInt(uaBrand.version, 10), 0) - }; - }); + }).map(info => ({ + current: info.name, + version: Version.nu(parseInt(uaBrand.version, 10), 0) + })); }); }; - var detect$2 = function (candidates, userAgent) { - var agent = String(userAgent).toLowerCase(); - return find$1(candidates, function (candidate) { + const detect$2 = (candidates, userAgent) => { + const agent = String(userAgent).toLowerCase(); + return find$1(candidates, candidate => { return candidate.search(agent); }); }; - var detectBrowser = function (browsers, userAgent) { - return detect$2(browsers, userAgent).map(function (browser) { - var version = Version.detect(browser.versionRegexes, userAgent); + const detectBrowser = (browsers, userAgent) => { + return detect$2(browsers, userAgent).map(browser => { + const version = Version.detect(browser.versionRegexes, userAgent); return { current: browser.name, - version: version + version }; }); }; - var detectOs = function (oses, userAgent) { - return detect$2(oses, userAgent).map(function (os) { - var version = Version.detect(os.versionRegexes, userAgent); + const detectOs = (oses, userAgent) => { + return detect$2(oses, userAgent).map(os => { + const version = Version.detect(os.versionRegexes, userAgent); return { current: os.name, - version: version + version }; }); }; - var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; - var checkContains = function (target) { - return function (uastring) { + const normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; + const checkContains = target => { + return uastring => { return contains(uastring, target); }; }; - var browsers = [ + const browsers = [ { name: 'Edge', versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], - search: function (uastring) { + search: uastring => { return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); } }, { - name: 'Chrome', + name: 'Chromium', brand: 'Chromium', versionRegexes: [ /.*?chrome\/([0-9]+)\.([0-9]+).*/, normalVersionRegex ], - search: function (uastring) { + search: uastring => { return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); } }, @@ -546,7 +673,7 @@ /.*?msie\ ?([0-9]+)\.([0-9]+).*/, /.*?rv:([0-9]+)\.([0-9]+).*/ ], - search: function (uastring) { + search: uastring => { return contains(uastring, 'msie') || contains(uastring, 'trident'); } }, @@ -569,12 +696,12 @@ normalVersionRegex, /.*?cpu os ([0-9]+)_([0-9]+).*/ ], - search: function (uastring) { + search: uastring => { return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit'); } } ]; - var oses = [ + const oses = [ { name: 'Windows', search: checkContains('win'), @@ -582,7 +709,7 @@ }, { name: 'iOS', - search: function (uastring) { + search: uastring => { return contains(uastring, 'iphone') || contains(uastring, 'ipad'); }, versionRegexes: [ @@ -597,7 +724,7 @@ versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] }, { - name: 'OSX', + name: 'macOS', search: checkContains('mac os x'), versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] }, @@ -622,425 +749,185 @@ versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] } ]; - var PlatformInfo = { + const PlatformInfo = { browsers: constant(browsers), oses: constant(oses) }; - var edge = 'Edge'; - var chrome = 'Chrome'; - var ie = 'IE'; - var opera = 'Opera'; - var firefox = 'Firefox'; - var safari = 'Safari'; - var unknown$1 = function () { + const edge = 'Edge'; + const chromium = 'Chromium'; + const ie = 'IE'; + const opera = 'Opera'; + const firefox = 'Firefox'; + const safari = 'Safari'; + const unknown$1 = () => { return nu$1({ current: undefined, version: Version.unknown() }); }; - var nu$1 = function (info) { - var current = info.current; - var version = info.version; - var isBrowser = function (name) { - return function () { - return current === name; - }; - }; + const nu$1 = info => { + const current = info.current; + const version = info.version; + const isBrowser = name => () => current === name; return { - current: current, - version: version, + current, + version, isEdge: isBrowser(edge), - isChrome: isBrowser(chrome), + isChromium: isBrowser(chromium), isIE: isBrowser(ie), isOpera: isBrowser(opera), isFirefox: isBrowser(firefox), isSafari: isBrowser(safari) }; }; - var Browser = { + const Browser = { unknown: unknown$1, nu: nu$1, edge: constant(edge), - chrome: constant(chrome), + chromium: constant(chromium), ie: constant(ie), opera: constant(opera), firefox: constant(firefox), safari: constant(safari) }; - var windows = 'Windows'; - var ios = 'iOS'; - var android = 'Android'; - var linux = 'Linux'; - var osx = 'OSX'; - var solaris = 'Solaris'; - var freebsd = 'FreeBSD'; - var chromeos = 'ChromeOS'; - var unknown = function () { + const windows = 'Windows'; + const ios = 'iOS'; + const android = 'Android'; + const linux = 'Linux'; + const macos = 'macOS'; + const solaris = 'Solaris'; + const freebsd = 'FreeBSD'; + const chromeos = 'ChromeOS'; + const unknown = () => { return nu({ current: undefined, version: Version.unknown() }); }; - var nu = function (info) { - var current = info.current; - var version = info.version; - var isOS = function (name) { - return function () { - return current === name; - }; - }; + const nu = info => { + const current = info.current; + const version = info.version; + const isOS = name => () => current === name; return { - current: current, - version: version, + current, + version, isWindows: isOS(windows), isiOS: isOS(ios), isAndroid: isOS(android), - isOSX: isOS(osx), + isMacOS: isOS(macos), isLinux: isOS(linux), isSolaris: isOS(solaris), isFreeBSD: isOS(freebsd), isChromeOS: isOS(chromeos) }; }; - var OperatingSystem = { - unknown: unknown, - nu: nu, + const OperatingSystem = { + unknown, + nu, windows: constant(windows), ios: constant(ios), android: constant(android), linux: constant(linux), - osx: constant(osx), + macos: constant(macos), solaris: constant(solaris), freebsd: constant(freebsd), chromeos: constant(chromeos) }; - var detect$1 = function (userAgent, userAgentDataOpt, mediaMatch) { - var browsers = PlatformInfo.browsers(); - var oses = PlatformInfo.oses(); - var browser = userAgentDataOpt.bind(function (userAgentData) { - return detectBrowser$1(browsers, userAgentData); - }).orThunk(function () { - return detectBrowser(browsers, userAgent); - }).fold(Browser.unknown, Browser.nu); - var os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); - var deviceType = DeviceType(os, browser, userAgent, mediaMatch); + const detect$1 = (userAgent, userAgentDataOpt, mediaMatch) => { + const browsers = PlatformInfo.browsers(); + const oses = PlatformInfo.oses(); + const browser = userAgentDataOpt.bind(userAgentData => detectBrowser$1(browsers, userAgentData)).orThunk(() => detectBrowser(browsers, userAgent)).fold(Browser.unknown, Browser.nu); + const os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); + const deviceType = DeviceType(os, browser, userAgent, mediaMatch); return { - browser: browser, - os: os, - deviceType: deviceType - }; - }; - var PlatformDetection = { detect: detect$1 }; - - var mediaMatch = function (query) { - return window.matchMedia(query).matches; - }; - var platform = cached(function () { - return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch); - }); - var detect = function () { - return platform(); - }; - - var is = function (element, selector) { - var dom = element.dom; - if (dom.nodeType !== ELEMENT) { - return false; - } else { - var elem = dom; - if (elem.matches !== undefined) { - return elem.matches(selector); - } else if (elem.msMatchesSelector !== undefined) { - return elem.msMatchesSelector(selector); - } else if (elem.webkitMatchesSelector !== undefined) { - return elem.webkitMatchesSelector(selector); - } else if (elem.mozMatchesSelector !== undefined) { - return elem.mozMatchesSelector(selector); - } else { - throw new Error('Browser lacks native selectors'); - } - } - }; - var bypassSelector = function (dom) { - return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0; - }; - var all$1 = function (selector, scope) { - var base = scope === undefined ? document : scope.dom; - return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom); - }; - - var eq = function (e1, e2) { - return e1.dom === e2.dom; - }; - - var owner = function (element) { - return SugarElement.fromDom(element.dom.ownerDocument); - }; - var documentOrOwner = function (dos) { - return isDocument(dos) ? dos : owner(dos); - }; - var parent = function (element) { - return Optional.from(element.dom.parentNode).map(SugarElement.fromDom); - }; - var parents = function (element, isRoot) { - var stop = isFunction(isRoot) ? isRoot : never; - var dom = element.dom; - var ret = []; - while (dom.parentNode !== null && dom.parentNode !== undefined) { - var rawParent = dom.parentNode; - var p = SugarElement.fromDom(rawParent); - ret.push(p); - if (stop(p) === true) { - break; - } else { - dom = rawParent; - } - } - return ret; - }; - var siblings$2 = function (element) { - var filterSelf = function (elements) { - return filter$1(elements, function (x) { - return !eq(element, x); - }); + browser, + os, + deviceType }; - return parent(element).map(children).map(filterSelf).getOr([]); - }; - var children = function (element) { - return map(element.dom.childNodes, SugarElement.fromDom); }; + const PlatformDetection = { detect: detect$1 }; - var isShadowRoot = function (dos) { - return isDocumentFragment(dos) && isNonNullable(dos.dom.host); - }; - var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); - var isSupported = constant(supported); - var getRootNode = supported ? function (e) { - return SugarElement.fromDom(e.dom.getRootNode()); - } : documentOrOwner; - var getShadowRoot = function (e) { - var r = getRootNode(e); - return isShadowRoot(r) ? Optional.some(r) : Optional.none(); - }; - var getShadowHost = function (e) { - return SugarElement.fromDom(e.dom.host); - }; - var getOriginalEventTarget = function (event) { - if (isSupported() && isNonNullable(event.target)) { - var el = SugarElement.fromDom(event.target); - if (isElement(el) && isOpenShadowHost(el)) { - if (event.composed && event.composedPath) { - var composedPath = event.composedPath(); - if (composedPath) { - return head(composedPath); - } - } - } - } - return Optional.from(event.target); - }; - var isOpenShadowHost = function (element) { - return isNonNullable(element.dom.shadowRoot); - }; + const mediaMatch = query => window.matchMedia(query).matches; + let platform = cached(() => PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch)); + const detect = () => platform(); - var inBody = function (element) { - var dom = isText(element) ? element.dom.parentNode : element.dom; - if (dom === undefined || dom === null || dom.ownerDocument === null) { - return false; - } - var doc = dom.ownerDocument; - return getShadowRoot(SugarElement.fromDom(dom)).fold(function () { - return doc.body.contains(dom); - }, compose1(inBody, getShadowHost)); - }; - var getBody = function (doc) { - var b = doc.dom.body; - if (b === null || b === undefined) { - throw new Error('Body is not available yet'); - } - return SugarElement.fromDom(b); - }; - - var rawSet = function (dom, key, value) { - if (isString(value) || isBoolean(value) || isNumber(value)) { - dom.setAttribute(key, value + ''); - } else { - console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); - throw new Error('Attribute value was not simple'); - } - }; - var set = function (element, key, value) { - rawSet(element.dom, key, value); - }; - var get$3 = function (element, key) { - var v = element.dom.getAttribute(key); - return v === null ? undefined : v; - }; - var remove = function (element, key) { - element.dom.removeAttribute(key); - }; - - var internalSet = function (dom, property, value) { - if (!isString(value)) { - console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); - throw new Error('CSS value must be a string: ' + value); - } - if (isSupported$1(dom)) { - dom.style.setProperty(property, value); - } - }; - var setAll = function (element, css) { - var dom = element.dom; - each(css, function (v, k) { - internalSet(dom, k, v); - }); - }; - var get$2 = function (element, property) { - var dom = element.dom; - var styles = window.getComputedStyle(dom); - var r = styles.getPropertyValue(property); - return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; - }; - var getUnsafeProperty = function (dom, property) { - return isSupported$1(dom) ? dom.style.getPropertyValue(property) : ''; - }; - - var mkEvent = function (target, x, y, stop, prevent, kill, raw) { + const r = (left, top) => { + const translate = (x, y) => r(left + x, top + y); return { - target: target, - x: x, - y: y, - stop: stop, - prevent: prevent, - kill: kill, - raw: raw - }; - }; - var fromRawEvent = function (rawEvent) { - var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target)); - var stop = function () { - return rawEvent.stopPropagation(); - }; - var prevent = function () { - return rawEvent.preventDefault(); - }; - var kill = compose(prevent, stop); - return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); - }; - var handle = function (filter, handler) { - return function (rawEvent) { - if (filter(rawEvent)) { - handler(fromRawEvent(rawEvent)); - } + left, + top, + translate }; }; - var binder = function (element, event, filter, handler, useCapture) { - var wrapped = handle(filter, handler); - element.dom.addEventListener(event, wrapped, useCapture); - return { unbind: curry(unbind, element, event, wrapped, useCapture) }; - }; - var bind$2 = function (element, event, filter, handler) { - return binder(element, event, filter, handler, false); - }; - var unbind = function (element, event, handler, useCapture) { - element.dom.removeEventListener(event, handler, useCapture); - }; + const SugarPosition = r; - var filter = always; - var bind$1 = function (element, event, handler) { - return bind$2(element, event, filter, handler); - }; - - var r = function (left, top) { - var translate = function (x, y) { - return r(left + x, top + y); - }; - return { - left: left, - top: top, - translate: translate - }; - }; - var SugarPosition = r; - - var get$1 = function (_DOC) { - var doc = _DOC !== undefined ? _DOC.dom : document; - var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; - var y = doc.body.scrollTop || doc.documentElement.scrollTop; + const get$1 = _DOC => { + const doc = _DOC !== undefined ? _DOC.dom : document; + const x = doc.body.scrollLeft || doc.documentElement.scrollLeft; + const y = doc.body.scrollTop || doc.documentElement.scrollTop; return SugarPosition(x, y); }; - var get = function (_win) { - var win = _win === undefined ? window : _win; + const get = _win => { + const win = _win === undefined ? window : _win; if (detect().browser.isFirefox()) { return Optional.none(); } else { - return Optional.from(win['visualViewport']); + return Optional.from(win.visualViewport); } }; - var bounds = function (x, y, width, height) { - return { - x: x, - y: y, - width: width, - height: height, - right: x + width, - bottom: y + height - }; - }; - var getBounds = function (_win) { - var win = _win === undefined ? window : _win; - var doc = win.document; - var scroll = get$1(SugarElement.fromDom(doc)); - return get(win).fold(function () { - var html = win.document.documentElement; - var width = html.clientWidth; - var height = html.clientHeight; + const bounds = (x, y, width, height) => ({ + x, + y, + width, + height, + right: x + width, + bottom: y + height + }); + const getBounds = _win => { + const win = _win === undefined ? window : _win; + const doc = win.document; + const scroll = get$1(SugarElement.fromDom(doc)); + return get(win).fold(() => { + const html = win.document.documentElement; + const width = html.clientWidth; + const height = html.clientHeight; return bounds(scroll.left, scroll.top, width, height); - }, function (visualViewport) { - return bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height); - }); - }; - var bind = function (name, callback, _win) { - return get(_win).map(function (visualViewport) { - var handler = function (e) { - return callback(fromRawEvent(e)); - }; - visualViewport.addEventListener(name, handler); - return { - unbind: function () { - return visualViewport.removeEventListener(name, handler); - } - }; - }).getOrThunk(function () { - return { unbind: noop }; - }); + }, visualViewport => bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height)); }; + const bind = (name, callback, _win) => get(_win).map(visualViewport => { + const handler = e => callback(fromRawEvent(e)); + visualViewport.addEventListener(name, handler); + return { unbind: () => visualViewport.removeEventListener(name, handler) }; + }).getOrThunk(() => ({ unbind: noop })); - var global$2 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); - var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); + var global = tinymce.util.Tools.resolve('tinymce.Env'); - var global = tinymce.util.Tools.resolve('tinymce.util.Delay'); - - var fireFullscreenStateChanged = function (editor, state) { - editor.fire('FullscreenStateChanged', { state: state }); + const fireFullscreenStateChanged = (editor, state) => { + editor.dispatch('FullscreenStateChanged', { state }); + editor.dispatch('ResizeEditor'); }; - var getFullscreenNative = function (editor) { - return editor.getParam('fullscreen_native', false, 'boolean'); + const option = name => editor => editor.options.get(name); + const register$2 = editor => { + const registerOption = editor.options.register; + registerOption('fullscreen_native', { + processor: 'boolean', + default: false + }); }; + const getFullscreenNative = option('fullscreen_native'); - var getFullscreenRoot = function (editor) { - var elem = SugarElement.fromDom(editor.getElement()); - return getShadowRoot(elem).map(getShadowHost).getOrThunk(function () { - return getBody(owner(elem)); - }); + const getFullscreenRoot = editor => { + const elem = SugarElement.fromDom(editor.getElement()); + return getShadowRoot(elem).map(getShadowHost).getOrThunk(() => getBody(owner(elem))); }; - var getFullscreenElement = function (root) { + const getFullscreenElement = root => { if (root.fullscreenElement !== undefined) { return root.fullscreenElement; } else if (root.msFullscreenElement !== undefined) { @@ -1051,7 +938,7 @@ return null; } }; - var getFullscreenchangeEventName = function () { + const getFullscreenchangeEventName = () => { if (document.fullscreenElement !== undefined) { return 'fullscreenchange'; } else if (document.msFullscreenElement !== undefined) { @@ -1062,8 +949,8 @@ return 'fullscreenchange'; } }; - var requestFullscreen = function (sugarElem) { - var elem = sugarElem.dom; + const requestFullscreen = sugarElem => { + const elem = sugarElem.dom; if (elem.requestFullscreen) { elem.requestFullscreen(); } else if (elem.msRequestFullscreen) { @@ -1072,8 +959,8 @@ elem.webkitRequestFullScreen(); } }; - var exitFullscreen = function (sugarDoc) { - var doc = sugarDoc.dom; + const exitFullscreen = sugarDoc => { + const doc = sugarDoc.dom; if (doc.exitFullscreen) { doc.exitFullscreen(); } else if (doc.msExitFullscreen) { @@ -1082,70 +969,52 @@ doc.webkitCancelFullScreen(); } }; - var isFullscreenElement = function (elem) { - return elem.dom === getFullscreenElement(owner(elem).dom); - }; + const isFullscreenElement = elem => elem.dom === getFullscreenElement(owner(elem).dom); - var ancestors$1 = function (scope, predicate, isRoot) { - return filter$1(parents(scope, isRoot), predicate); - }; - var siblings$1 = function (scope, predicate) { - return filter$1(siblings$2(scope), predicate); - }; + const ancestors$1 = (scope, predicate, isRoot) => filter$1(parents(scope, isRoot), predicate); + const siblings$1 = (scope, predicate) => filter$1(siblings$2(scope), predicate); - var all = function (selector) { - return all$1(selector); - }; - var ancestors = function (scope, selector, isRoot) { - return ancestors$1(scope, function (e) { - return is(e, selector); - }, isRoot); - }; - var siblings = function (scope, selector) { - return siblings$1(scope, function (e) { - return is(e, selector); - }); - }; + const all = selector => all$1(selector); + const ancestors = (scope, selector, isRoot) => ancestors$1(scope, e => is(e, selector), isRoot); + const siblings = (scope, selector) => siblings$1(scope, e => is(e, selector)); - var attr = 'data-ephox-mobile-fullscreen-style'; - var siblingStyles = 'display:none!important;'; - var ancestorPosition = 'position:absolute!important;'; - var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;'; - var bgFallback = 'background-color:rgb(255,255,255)!important;'; - var isAndroid = global$1.os.isAndroid(); - var matchColor = function (editorBody) { - var color = get$2(editorBody, 'background-color'); + const attr = 'data-ephox-mobile-fullscreen-style'; + const siblingStyles = 'display:none!important;'; + const ancestorPosition = 'position:absolute!important;'; + const ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;'; + const bgFallback = 'background-color:rgb(255,255,255)!important;'; + const isAndroid = global.os.isAndroid(); + const matchColor = editorBody => { + const color = get$2(editorBody, 'background-color'); return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback; }; - var clobberStyles = function (dom, container, editorBody) { - var gatherSiblings = function (element) { + const clobberStyles = (dom, container, editorBody) => { + const gatherSiblings = element => { return siblings(element, '*:not(.tox-silver-sink)'); }; - var clobber = function (clobberStyle) { - return function (element) { - var styles = get$3(element, 'style'); - var backup = styles === undefined ? 'no-styles' : styles.trim(); - if (backup === clobberStyle) { - return; - } else { - set(element, attr, backup); - setAll(element, dom.parseStyle(clobberStyle)); - } - }; + const clobber = clobberStyle => element => { + const styles = get$3(element, 'style'); + const backup = styles === undefined ? 'no-styles' : styles.trim(); + if (backup === clobberStyle) { + return; + } else { + set(element, attr, backup); + setAll(element, dom.parseStyle(clobberStyle)); + } }; - var ancestors$1 = ancestors(container, '*'); - var siblings$1 = bind$3(ancestors$1, gatherSiblings); - var bgColor = matchColor(editorBody); + const ancestors$1 = ancestors(container, '*'); + const siblings$1 = bind$3(ancestors$1, gatherSiblings); + const bgColor = matchColor(editorBody); each$1(siblings$1, clobber(siblingStyles)); each$1(ancestors$1, clobber(ancestorPosition + ancestorStyles + bgColor)); - var containerStyles = isAndroid === true ? '' : ancestorPosition; + const containerStyles = isAndroid === true ? '' : ancestorPosition; clobber(containerStyles + ancestorStyles + bgColor)(container); }; - var restoreStyles = function (dom) { - var clobberedEls = all('[' + attr + ']'); - each$1(clobberedEls, function (element) { - var restore = get$3(element, attr); - if (restore !== 'no-styles') { + const restoreStyles = dom => { + const clobberedEls = all('[' + attr + ']'); + each$1(clobberedEls, element => { + const restore = get$3(element, attr); + if (restore && restore !== 'no-styles') { setAll(element, dom.parseStyle(restore)); } else { remove(element, 'style'); @@ -1154,50 +1023,42 @@ }); }; - var DOM = global$2.DOM; - var getScrollPos = function () { - return getBounds(window); - }; - var setScrollPos = function (pos) { - return window.scrollTo(pos.x, pos.y); - }; - var viewportUpdate = get().fold(function () { - return { - bind: noop, - unbind: noop - }; - }, function (visualViewport) { - var editorContainer = value(); - var resizeBinder = unbindable(); - var scrollBinder = unbindable(); - var refreshScroll = function () { + const DOM = global$1.DOM; + const getScrollPos = () => getBounds(window); + const setScrollPos = pos => window.scrollTo(pos.x, pos.y); + const viewportUpdate = get().fold(() => ({ + bind: noop, + unbind: noop + }), visualViewport => { + const editorContainer = value(); + const resizeBinder = unbindable(); + const scrollBinder = unbindable(); + const refreshScroll = () => { document.body.scrollTop = 0; document.documentElement.scrollTop = 0; }; - var refreshVisualViewport = function () { - window.requestAnimationFrame(function () { - editorContainer.on(function (container) { - return setAll(container, { - top: visualViewport.offsetTop + 'px', - left: visualViewport.offsetLeft + 'px', - height: visualViewport.height + 'px', - width: visualViewport.width + 'px' - }); - }); + const refreshVisualViewport = () => { + window.requestAnimationFrame(() => { + editorContainer.on(container => setAll(container, { + top: visualViewport.offsetTop + 'px', + left: visualViewport.offsetLeft + 'px', + height: visualViewport.height + 'px', + width: visualViewport.width + 'px' + })); }); }; - var update = global.throttle(function () { + const update = first(() => { refreshScroll(); refreshVisualViewport(); }, 50); - var bind$1 = function (element) { + const bind$1 = element => { editorContainer.set(element); - update(); - resizeBinder.set(bind('resize', update)); - scrollBinder.set(bind('scroll', update)); + update.throttle(); + resizeBinder.set(bind('resize', update.throttle)); + scrollBinder.set(bind('scroll', update.throttle)); }; - var unbind = function () { - editorContainer.on(function () { + const unbind = () => { + editorContainer.on(() => { resizeBinder.clear(); scrollBinder.clear(); }); @@ -1205,51 +1066,47 @@ }; return { bind: bind$1, - unbind: unbind + unbind }; }); - var toggleFullscreen = function (editor, fullscreenState) { - var body = document.body; - var documentElement = document.documentElement; - var editorContainer = editor.getContainer(); - var editorContainerS = SugarElement.fromDom(editorContainer); - var fullscreenRoot = getFullscreenRoot(editor); - var fullscreenInfo = fullscreenState.get(); - var editorBody = SugarElement.fromDom(editor.getBody()); - var isTouch = global$1.deviceType.isTouch(); - var editorContainerStyle = editorContainer.style; - var iframe = editor.iframeElement; - var iframeStyle = iframe.style; - var handleClasses = function (handler) { + const toggleFullscreen = (editor, fullscreenState) => { + const body = document.body; + const documentElement = document.documentElement; + const editorContainer = editor.getContainer(); + const editorContainerS = SugarElement.fromDom(editorContainer); + const fullscreenRoot = getFullscreenRoot(editor); + const fullscreenInfo = fullscreenState.get(); + const editorBody = SugarElement.fromDom(editor.getBody()); + const isTouch = global.deviceType.isTouch(); + const editorContainerStyle = editorContainer.style; + const iframe = editor.iframeElement; + const iframeStyle = iframe === null || iframe === void 0 ? void 0 : iframe.style; + const handleClasses = handler => { handler(body, 'tox-fullscreen'); handler(documentElement, 'tox-fullscreen'); handler(editorContainer, 'tox-fullscreen'); - getShadowRoot(editorContainerS).map(function (root) { - return getShadowHost(root).dom; - }).each(function (host) { + getShadowRoot(editorContainerS).map(root => getShadowHost(root).dom).each(host => { handler(host, 'tox-fullscreen'); handler(host, 'tox-shadowhost'); }); }; - var cleanup = function () { + const cleanup = () => { if (isTouch) { restoreStyles(editor.dom); } handleClasses(DOM.removeClass); viewportUpdate.unbind(); - Optional.from(fullscreenState.get()).each(function (info) { - return info.fullscreenChangeHandler.unbind(); - }); + Optional.from(fullscreenState.get()).each(info => info.fullscreenChangeHandler.unbind()); }; if (!fullscreenInfo) { - var fullscreenChangeHandler = bind$1(owner(fullscreenRoot), getFullscreenchangeEventName(), function (_evt) { + const fullscreenChangeHandler = bind$1(owner(fullscreenRoot), getFullscreenchangeEventName(), _evt => { if (getFullscreenNative(editor)) { if (!isFullscreenElement(fullscreenRoot) && fullscreenState.get() !== null) { toggleFullscreen(editor, fullscreenState); } } }); - var newFullScreenInfo = { + const newFullScreenInfo = { scrollPos: getScrollPos(), containerWidth: editorContainerStyle.width, containerHeight: editorContainerStyle.height, @@ -1257,7 +1114,7 @@ containerLeft: editorContainerStyle.left, iframeWidth: iframeStyle.width, iframeHeight: iframeStyle.height, - fullscreenChangeHandler: fullscreenChangeHandler + fullscreenChangeHandler }; if (isTouch) { clobberStyles(editor.dom, editorContainerS, editorBody); @@ -1291,56 +1148,49 @@ } }; - var register$1 = function (editor, fullscreenState) { - editor.addCommand('mceFullScreen', function () { + const register$1 = (editor, fullscreenState) => { + editor.addCommand('mceFullScreen', () => { toggleFullscreen(editor, fullscreenState); }); }; - var makeSetupHandler = function (editor, fullscreenState) { - return function (api) { - api.setActive(fullscreenState.get() !== null); - var editorEventCallback = function (e) { - return api.setActive(e.state); - }; - editor.on('FullscreenStateChanged', editorEventCallback); - return function () { - return editor.off('FullscreenStateChanged', editorEventCallback); - }; - }; - }; - var register = function (editor, fullscreenState) { - var onAction = function () { - return editor.execCommand('mceFullScreen'); - }; + const makeSetupHandler = (editor, fullscreenState) => api => { + api.setActive(fullscreenState.get() !== null); + const editorEventCallback = e => api.setActive(e.state); + editor.on('FullscreenStateChanged', editorEventCallback); + return () => editor.off('FullscreenStateChanged', editorEventCallback); + }; + const register = (editor, fullscreenState) => { + const onAction = () => editor.execCommand('mceFullScreen'); editor.ui.registry.addToggleMenuItem('fullscreen', { text: 'Fullscreen', icon: 'fullscreen', shortcut: 'Meta+Shift+F', - onAction: onAction, + onAction, onSetup: makeSetupHandler(editor, fullscreenState) }); editor.ui.registry.addToggleButton('fullscreen', { tooltip: 'Fullscreen', icon: 'fullscreen', - onAction: onAction, + onAction, onSetup: makeSetupHandler(editor, fullscreenState) }); }; - function Plugin () { - global$3.add('fullscreen', function (editor) { - var fullscreenState = Cell(null); + var Plugin = () => { + global$2.add('fullscreen', editor => { + const fullscreenState = Cell(null); if (editor.inline) { return get$5(fullscreenState); } + register$2(editor); register$1(editor, fullscreenState); register(editor, fullscreenState); editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen'); return get$5(fullscreenState); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/fullscreen/plugin.min.js b/public/js/tinymce/plugins/fullscreen/plugin.min.js index 9186bcc25..e127e5097 100644 --- a/public/js/tinymce/plugins/fullscreen/plugin.min.js +++ b/public/js/tinymce/plugins/fullscreen/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function a(e){var n=e;return{get:function(){return n},set:function(e){n=e}}}function e(t){return function(e){return r=typeof(n=e),(null===n?"null":"object"==r&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":r)===t;var n,r}}function n(n){return function(e){return typeof e===n}}function c(e){return!(null==e)}function s(){}function y(e){return function(){return e}}function r(e){return e}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=e("string"),d=e("array"),o=n("boolean"),h=n("function"),i=n("number");function u(){return m}var v=y(!1),f=y(!0),m={fold:function(e,n){return e()},isSome:v,isNone:f,getOr:r,getOrThunk:g,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:y(null),getOrUndefined:y(void 0),or:r,orThunk:g,map:u,each:s,bind:u,exists:v,forall:f,filter:function(){return m},toArray:function(){return[]},toString:y("none()")};function g(e){return e()}function p(e){function n(){return r.get().each(e)}var r=a(A.none());return{clear:function(){n(),r.set(A.none())},isSet:function(){return r.get().isSome()},get:function(){return r.get()},set:function(e){n(),r.set(A.some(e))}}}function w(){return p(function(e){return e.unbind()})}function C(e,n){for(var r=e.length,t=new Array(r),o=0;o{let t=e;return{get:()=>t,set:e=>{t=e}}};var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const n=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=r=e,(o=String).prototype.isPrototypeOf(n)||(null===(s=r.constructor)||void 0===s?void 0:s.name)===o.name)?"string":t;var n,r,o,s})(t)===e,r=e=>t=>typeof t===e,o=e=>t=>e===t,s=n("string"),i=n("array"),l=o(null),a=r("boolean"),c=o(void 0),u=e=>!(e=>null==e)(e),d=r("function"),m=r("number"),h=()=>{},g=e=>()=>e;function p(e,...t){return(...n)=>{const r=t.concat(n);return e.apply(null,r)}}const f=g(!1),v=g(!0);class w{constructor(e,t){this.tag=e,this.value=t}static some(e){return new w(!0,e)}static none(){return w.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?w.some(e(this.value)):w.none()}bind(e){return this.tag?e(this.value):w.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:w.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return u(e)?w.some(e):w.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}w.singletonNone=new w(!1);const y=t=>{const n=e(w.none()),r=()=>n.get().each(t);return{clear:()=>{r(),n.set(w.none())},isSet:()=>n.get().isSome(),get:()=>n.get(),set:e=>{r(),n.set(w.some(e))}}},b=()=>y((e=>e.unbind())),S=Array.prototype.push,x=(e,t)=>{const n=e.length,r=new Array(n);for(let o=0;o{for(let n=0,r=e.length;n{const n=[];for(let r=0,o=e.length;r((e,t,n)=>{for(let r=0,o=e.length;r{const o=e.indexOf(t,n);return-1!==o&&(!!c(r)||o+t.length<=r)},C=e=>void 0!==e.style&&d(e.style.getPropertyValue),A=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},R=A;"undefined"!=typeof window?window:Function("return this;")();const L=e=>t=>(e=>e.dom.nodeType)(t)===e,M=L(1),N=L(3),P=L(9),D=L(11),W=(e,t)=>{const n=e.dom;if(1!==n.nodeType)return!1;{const e=n;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},q=e=>R(e.dom.ownerDocument),H=e=>x(e.dom.childNodes,R),I=d(Element.prototype.attachShadow)&&d(Node.prototype.getRootNode),B=g(I),V=I?e=>R(e.dom.getRootNode()):e=>P(e)?e:q(e),_=e=>{const t=V(e);return D(n=t)&&u(n.dom.host)?w.some(t):w.none();var n},j=e=>R(e.dom.host),z=e=>{const t=N(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const n=t.ownerDocument;return _(R(t)).fold((()=>n.body.contains(t)),(r=z,o=j,e=>r(o(e))));var r,o},$=(e,t)=>{const n=e.dom.getAttribute(t);return null===n?void 0:n},U=(e,t)=>{e.dom.removeAttribute(t)},K=(e,t)=>{const n=e.dom;((e,t)=>{const n=T(e);for(let r=0,o=n.length;r{((e,t,n)=>{if(!s(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);C(e)&&e.style.setProperty(t,n)})(n,t,e)}))},X=e=>{const t=R((e=>{if(B()&&u(e.target)){const t=R(e.target);if(M(t)&&u(t.dom.shadowRoot)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return((e,t)=>0e.stopPropagation(),r=()=>e.preventDefault(),o=(s=r,i=n,(...e)=>s(i.apply(null,e)));var s,i;return((e,t,n,r,o,s,i)=>({target:e,x:t,y:n,stop:r,prevent:o,kill:s,raw:i}))(t,e.clientX,e.clientY,n,r,o,e)},Y=(e,t,n,r)=>{e.dom.removeEventListener(t,n,r)},G=v,J=(e,t,n)=>((e,t,n,r)=>((e,t,n,r,o)=>{const s=((e,t)=>n=>{e(n)&&t(X(n))})(n,r);return e.dom.addEventListener(t,s,o),{unbind:p(Y,e,t,s,o)}})(e,t,n,r,!1))(e,t,G,n),Q=()=>Z(0,0),Z=(e,t)=>({major:e,minor:t}),ee={nu:Z,detect:(e,t)=>{const n=String(t).toLowerCase();return 0===e.length?Q():((e,t)=>{const n=((e,t)=>{for(let n=0;nNumber(t.replace(n,"$"+e));return Z(r(1),r(2))})(e,n)},unknown:Q},te=(e,t)=>{const n=String(t).toLowerCase();return O(e,(e=>e.search(n)))},ne=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,re=e=>t=>k(t,e),oe=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>k(e,"edge/")&&k(e,"chrome")&&k(e,"safari")&&k(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,ne],search:e=>k(e,"chrome")&&!k(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>k(e,"msie")||k(e,"trident")},{name:"Opera",versionRegexes:[ne,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:re("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:re("firefox")},{name:"Safari",versionRegexes:[ne,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(k(e,"safari")||k(e,"mobile/"))&&k(e,"applewebkit")}],se=[{name:"Windows",search:re("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>k(e,"iphone")||k(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:re("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:re("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:re("linux"),versionRegexes:[]},{name:"Solaris",search:re("sunos"),versionRegexes:[]},{name:"FreeBSD",search:re("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:re("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],ie={browsers:g(oe),oses:g(se)},le="Edge",ae="Chromium",ce="Opera",ue="Firefox",de="Safari",me=e=>{const t=e.current,n=e.version,r=e=>()=>t===e;return{current:t,version:n,isEdge:r(le),isChromium:r(ae),isIE:r("IE"),isOpera:r(ce),isFirefox:r(ue),isSafari:r(de)}},he=()=>me({current:void 0,version:ee.unknown()}),ge=me,pe=(g(le),g(ae),g("IE"),g(ce),g(ue),g(de),"Windows"),fe="Android",ve="Linux",we="macOS",ye="Solaris",be="FreeBSD",Se="ChromeOS",xe=e=>{const t=e.current,n=e.version,r=e=>()=>t===e;return{current:t,version:n,isWindows:r(pe),isiOS:r("iOS"),isAndroid:r(fe),isMacOS:r(we),isLinux:r(ve),isSolaris:r(ye),isFreeBSD:r(be),isChromeOS:r(Se)}},Ee=()=>xe({current:void 0,version:ee.unknown()}),Fe=xe,Oe=(g(pe),g("iOS"),g(fe),g(ve),g(we),g(ye),g(be),g(Se),(e,t,n)=>{const r=ie.browsers(),o=ie.oses(),s=t.bind((e=>((e,t)=>((e,t)=>{for(let n=0;n{const n=t.brand.toLowerCase();return O(e,(e=>{var t;return n===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())})).map((e=>({current:e.name,version:ee.nu(parseInt(t.version,10),0)})))})))(r,e))).orThunk((()=>((e,t)=>te(e,t).map((e=>{const n=ee.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(r,e))).fold(he,ge),i=((e,t)=>te(e,t).map((e=>{const n=ee.detect(e.versionRegexes,t);return{current:e.name,version:n}})))(o,e).fold(Ee,Fe),l=((e,t,n,r)=>{const o=e.isiOS()&&!0===/ipad/i.test(n),s=e.isiOS()&&!o,i=e.isiOS()||e.isAndroid(),l=i||r("(pointer:coarse)"),a=o||!s&&i&&r("(min-device-width:768px)"),c=s||i&&!a,u=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(n),d=!c&&!a&&!u;return{isiPad:g(o),isiPhone:g(s),isTablet:g(a),isPhone:g(c),isTouch:g(l),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:g(u),isDesktop:g(d)}})(i,s,e,n);return{browser:s,os:i,deviceType:l}}),Te=e=>window.matchMedia(e).matches;let ke=(e=>{let t,n=!1;return(...r)=>(n||(n=!0,t=e.apply(null,r)),t)})((()=>Oe(navigator.userAgent,w.from(navigator.userAgentData),Te)));const Ce=(e,t)=>({left:e,top:t,translate:(n,r)=>Ce(e+n,t+r)}),Ae=Ce,Re=e=>{const t=void 0===e?window:e;return ke().browser.isFirefox()?w.none():w.from(t.visualViewport)},Le=(e,t,n,r)=>({x:e,y:t,width:n,height:r,right:e+n,bottom:t+r}),Me=e=>{const t=void 0===e?window:e,n=t.document,r=(e=>{const t=void 0!==e?e.dom:document,n=t.body.scrollLeft||t.documentElement.scrollLeft,r=t.body.scrollTop||t.documentElement.scrollTop;return Ae(n,r)})(R(n));return Re(t).fold((()=>{const e=t.document.documentElement,n=e.clientWidth,o=e.clientHeight;return Le(r.left,r.top,n,o)}),(e=>Le(Math.max(e.pageLeft,r.left),Math.max(e.pageTop,r.top),e.width,e.height)))},Ne=(e,t,n)=>Re(n).map((n=>{const r=e=>t(X(e));return n.addEventListener(e,r),{unbind:()=>n.removeEventListener(e,r)}})).getOrThunk((()=>({unbind:h})));var Pe=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),De=tinymce.util.Tools.resolve("tinymce.Env");const We=(e,t)=>{e.dispatch("FullscreenStateChanged",{state:t}),e.dispatch("ResizeEditor")},qe=("fullscreen_native",e=>e.options.get("fullscreen_native"));const He=e=>{return e.dom===(void 0!==(t=q(e).dom).fullscreenElement?t.fullscreenElement:void 0!==t.msFullscreenElement?t.msFullscreenElement:void 0!==t.webkitFullscreenElement?t.webkitFullscreenElement:null);var t},Ie=(e,t,n)=>((e,t,n)=>F(((e,t)=>{const n=d(t)?t:f;let r=e.dom;const o=[];for(;null!==r.parentNode&&void 0!==r.parentNode;){const e=r.parentNode,t=R(e);if(o.push(t),!0===n(t))break;r=e}return o})(e,n),t))(e,(e=>W(e,t)),n),Be=(e,t)=>((e,n)=>{return F((e=>w.from(e.dom.parentNode).map(R))(r=e).map(H).map((e=>F(e,(e=>{return t=e,!(r.dom===t.dom);var t})))).getOr([]),(e=>W(e,t)));var r})(e),Ve="data-ephox-mobile-fullscreen-style",_e="position:absolute!important;",je="top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;",ze=De.os.isAndroid(),$e=e=>{const t=((e,t)=>{const n=e.dom,r=window.getComputedStyle(n).getPropertyValue(t);return""!==r||z(e)?r:((e,t)=>C(e)?e.style.getPropertyValue(t):"")(n,t)})(e,"background-color");return void 0!==t&&""!==t?"background-color:"+t+"!important":"background-color:rgb(255,255,255)!important;"},Ue=Pe.DOM,Ke=Re().fold((()=>({bind:h,unbind:h})),(e=>{const t=(()=>{const e=y(h);return{...e,on:t=>e.get().each(t)}})(),n=b(),r=b(),o=((e,t)=>{let n=null;return{cancel:()=>{l(n)||(clearTimeout(n),n=null)},throttle:(...t)=>{l(n)&&(n=setTimeout((()=>{n=null,e.apply(null,t)}),50))}}})((()=>{document.body.scrollTop=0,document.documentElement.scrollTop=0,window.requestAnimationFrame((()=>{t.on((t=>K(t,{top:e.offsetTop+"px",left:e.offsetLeft+"px",height:e.height+"px",width:e.width+"px"})))}))}));return{bind:e=>{t.set(e),o.throttle(),n.set(Ne("resize",o.throttle)),r.set(Ne("scroll",o.throttle))},unbind:()=>{t.on((()=>{n.clear(),r.clear()})),t.clear()}}})),Xe=(e,t)=>{const n=document.body,r=document.documentElement,o=e.getContainer(),l=R(o),c=(e=>{const t=R(e.getElement());return _(t).map(j).getOrThunk((()=>(e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return R(t)})(q(t))))})(e),u=t.get(),d=R(e.getBody()),h=De.deviceType.isTouch(),g=o.style,p=e.iframeElement,f=null==p?void 0:p.style,v=e=>{e(n,"tox-fullscreen"),e(r,"tox-fullscreen"),e(o,"tox-fullscreen"),_(l).map((e=>j(e).dom)).each((t=>{e(t,"tox-fullscreen"),e(t,"tox-shadowhost")}))},y=()=>{h&&(e=>{const t=((e,t)=>{const n=document;return 1!==(r=n).nodeType&&9!==r.nodeType&&11!==r.nodeType||0===r.childElementCount?[]:x(n.querySelectorAll(e),R);var r})("["+Ve+"]");E(t,(t=>{const n=$(t,Ve);n&&"no-styles"!==n?K(t,e.parseStyle(n)):U(t,"style"),U(t,Ve)}))})(e.dom),v(Ue.removeClass),Ke.unbind(),w.from(t.get()).each((e=>e.fullscreenChangeHandler.unbind()))};if(u)u.fullscreenChangeHandler.unbind(),qe(e)&&He(c)&&(e=>{const t=e.dom;t.exitFullscreen?t.exitFullscreen():t.msExitFullscreen?t.msExitFullscreen():t.webkitCancelFullScreen&&t.webkitCancelFullScreen()})(q(c)),f.width=u.iframeWidth,f.height=u.iframeHeight,g.width=u.containerWidth,g.height=u.containerHeight,g.top=u.containerTop,g.left=u.containerLeft,y(),b=u.scrollPos,window.scrollTo(b.x,b.y),t.set(null),We(e,!1),e.off("remove",y);else{const n=J(q(c),void 0!==document.fullscreenElement?"fullscreenchange":void 0!==document.msFullscreenElement?"MSFullscreenChange":void 0!==document.webkitFullscreenElement?"webkitfullscreenchange":"fullscreenchange",(n=>{qe(e)&&(He(c)||null===t.get()||Xe(e,t))})),r={scrollPos:Me(window),containerWidth:g.width,containerHeight:g.height,containerTop:g.top,containerLeft:g.left,iframeWidth:f.width,iframeHeight:f.height,fullscreenChangeHandler:n};h&&((e,t,n)=>{const r=t=>n=>{const r=$(n,"style"),o=void 0===r?"no-styles":r.trim();o!==t&&(((e,t,n)=>{((e,t,n)=>{if(!(s(n)||a(n)||m(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")})(e.dom,t,n)})(n,Ve,o),K(n,e.parseStyle(t)))},o=Ie(t,"*"),l=(e=>{const t=[];for(let n=0,r=e.length;nBe(e,"*:not(.tox-silver-sink)")))),c=$e(n);E(l,r("display:none!important;")),E(o,r(_e+je+c)),r((!0===ze?"":_e)+je+c)(t)})(e.dom,l,d),f.width=f.height="100%",g.width=g.height="",v(Ue.addClass),Ke.bind(l),e.on("remove",y),t.set(r),qe(e)&&(e=>{const t=e.dom;t.requestFullscreen?t.requestFullscreen():t.msRequestFullscreen?t.msRequestFullscreen():t.webkitRequestFullScreen&&t.webkitRequestFullScreen()})(c),We(e,!0)}var b},Ye=(e,t)=>n=>{n.setActive(null!==t.get());const r=e=>n.setActive(e.state);return e.on("FullscreenStateChanged",r),()=>e.off("FullscreenStateChanged",r)};t.add("fullscreen",(t=>{const n=e(null);return t.inline||((e=>{(0,e.options.register)("fullscreen_native",{processor:"boolean",default:!1})})(t),((e,t)=>{e.addCommand("mceFullScreen",(()=>{Xe(e,t)}))})(t,n),((e,t)=>{const n=()=>e.execCommand("mceFullScreen");e.ui.registry.addToggleMenuItem("fullscreen",{text:"Fullscreen",icon:"fullscreen",shortcut:"Meta+Shift+F",onAction:n,onSetup:Ye(e,t)}),e.ui.registry.addToggleButton("fullscreen",{tooltip:"Fullscreen",icon:"fullscreen",onAction:n,onSetup:Ye(e,t)})})(t,n),t.addShortcut("Meta+Shift+F","","mceFullScreen")),(e=>({isFullscreen:()=>null!==e.get()}))(n)}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/ar.js b/public/js/tinymce/plugins/help/js/i18n/keynav/ar.js new file mode 100644 index 000000000..e6ae0e81f --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/ar.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ar', +'

    بدء التنقل بواسطة لوحة المفاتيح

    \n' + + '\n' + + '
    \n' + + '
    التركيز على شريط القوائم
    \n' + + '
    نظاما التشغيل Windows أو Linux: Alt + F9
    \n' + + '
    نظام التشغيل macOS: ⌥F9
    \n' + + '
    التركيز على شريط الأدوات
    \n' + + '
    نظاما التشغيل Windows أو Linux: Alt + F10
    \n' + + '
    نظام التشغيل macOS: ⌥F10
    \n' + + '
    التركيز على التذييل
    \n' + + '
    نظاما التشغيل Windows أو Linux: Alt + F11
    \n' + + '
    نظام التشغيل macOS: ⌥F11
    \n' + + '
    التركيز على شريط أدوات السياق
    \n' + + '
    أنظمة التشغيل Windows أو Linux أو macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    سيبدأ التنقل عند عنصر واجهة المستخدم الأول، والذي سيتم تمييزه أو تسطيره في حالة العنصر الأول في\n' + + ' مسار عنصر التذييل.

    \n' + + '\n' + + '

    التنقل بين أقسام واجهة المستخدم

    \n' + + '\n' + + '

    للانتقال من أحد أقسام واجهة المستخدم إلى القسم التالي، اضغط على Tab.

    \n' + + '\n' + + '

    للانتقال من أحد أقسام واجهة المستخدم إلى القسم السابق، اضغط على Shift+Tab.

    \n' + + '\n' + + '

    ترتيب علامات Tab لأقسام واجهة المستخدم هذه هو:\n' + + '\n' + + '

      \n' + + '
    1. شريط القوائم
    2. \n' + + '
    3. كل مجموعة شريط الأدوات
    4. \n' + + '
    5. الشريط الجانبي
    6. \n' + + '
    7. مسار العنصر في التذييل
    8. \n' + + '
    9. زر تبديل عدد الكلمات في التذييل
    10. \n' + + '
    11. رابط إدراج العلامة التجارية في التذييل
    12. \n' + + '
    13. مؤشر تغيير حجم المحرر في التذييل
    14. \n' + + '
    \n' + + '\n' + + '

    إذا لم يكن قسم واجهة المستخدم موجودًا، فسيتم تخطيه.

    \n' + + '\n' + + '

    إذا كان التذييل يحتوي على التركيز على ‏‫التنقل بواسطة لوحة المفاتيح، ولا يوجد شريط جانبي مرئي، فإن الضغط على Shift+Tab\n' + + ' ينقل التركيز إلى مجموعة شريط الأدوات الأولى، وليس الأخيرة.\n' + + '\n' + + '

    التنقل بين أقسام واجهة المستخدم

    \n' + + '\n' + + '

    للانتقال من أحد عناصر واجهة المستخدم إلى العنصر التالي، اضغط على مفتاح السهم المناسب.

    \n' + + '\n' + + '

    مفتاحا السهمين اليسار‎ واليمين‎

    \n' + + '\n' + + '
      \n' + + '
    • التنقل بين القوائم في شريط القوائم.
    • \n' + + '
    • فتح قائمة فرعية في القائمة.
    • \n' + + '
    • التنقل بين الأزرار في مجموعة شريط الأدوات.
    • \n' + + '
    • التنقل بين العناصر في مسار عنصر التذييل.
    • \n' + + '
    \n' + + '\n' + + '

    مفتاحا السهمين لأسفل‎ ولأعلى‎\n' + + '\n' + + '

      \n' + + '
    • التنقل بين عناصر القائمة في القائمة.
    • \n' + + '
    • التنقل بين العناصر في قائمة شريط الأدوات المنبثقة.
    • \n' + + '
    \n' + + '\n' + + '

    دورة مفاتيح الأسهم‎ داخل قسم واجهة المستخدم التي تم التركيز عليها.

    \n' + + '\n' + + '

    لإغلاق قائمة مفتوحة أو قائمة فرعية مفتوحة أو قائمة منبثقة مفتوحة، اضغط على مفتاح Esc.\n' + + '\n' + + '

    إذا كان التركيز الحالي على "الجزء العلوي" من قسم معين لواجهة المستخدم، فإن الضغط على مفتاح Esc يؤدي أيضًا إلى الخروج\n' + + ' من التنقل بواسطة لوحة المفاتيح بالكامل.

    \n' + + '\n' + + '

    تنفيذ عنصر قائمة أو زر شريط أدوات

    \n' + + '\n' + + '

    عندما يتم تمييز عنصر القائمة المطلوب أو زر شريط الأدوات، اضغط على زر Return، أو Enter،\n' + + ' أو مفتاح المسافة لتنفيذ العنصر.\n' + + '\n' + + '

    التنقل في مربعات الحوار غير المبوبة

    \n' + + '\n' + + '

    في مربعات الحوار غير المبوبة، يتم التركيز على المكون التفاعلي الأول عند فتح مربع الحوار.

    \n' + + '\n' + + '

    التنقل بين مكونات الحوار التفاعلي بالضغط على زر Tab أو Shift+Tab.

    \n' + + '\n' + + '

    التنقل في مربعات الحوار المبوبة

    \n' + + '\n' + + '

    في مربعات الحوار المبوبة، يتم التركيز على الزر الأول في قائمة علامات التبويب عند فتح مربع الحوار.

    \n' + + '\n' + + '

    التنقل بين المكونات التفاعلية لعلامة التبويب لمربع الحوار هذه بالضغط على زر Tab أو\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    التبديل إلى علامة تبويب أخرى لمربع الحوار من خلال التركيز على قائمة علامة التبويب ثم الضغط على زر السهم المناسب\n' + + ' مفتاح للتنقل بين علامات التبويب المتاحة.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/bg_BG.js b/public/js/tinymce/plugins/help/js/i18n/keynav/bg_BG.js new file mode 100644 index 000000000..ad904db1a --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/bg_BG.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.bg_BG', +'

    Начало на навигацията с клавиатурата

    \n' + + '\n' + + '
    \n' + + '
    Фокусиране върху лентата с менюта
    \n' + + '
    Windows или Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Фокусиране върху лентата с инструменти
    \n' + + '
    Windows или Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Фокусиране върху долния колонтитул
    \n' + + '
    Windows или Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Фокусиране върху контекстуалната лента с инструменти
    \n' + + '
    Windows, Linux или macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Навигацията ще започне с първия елемент на ПИ, който ще бъде маркиран или подчертан в случая на първия елемент в\n' + + ' пътя до елемента в долния колонтитул.

    \n' + + '\n' + + '

    Навигиране между раздели на ПИ

    \n' + + '\n' + + '

    За да преминете от един раздел на ПИ към следващия, натиснете Tab.

    \n' + + '\n' + + '

    За да преминете от един раздел на ПИ към предишния, натиснете Shift+Tab.

    \n' + + '\n' + + '

    Редът за обхождане с табулация на тези раздели на ПИ е:\n' + + '\n' + + '

      \n' + + '
    1. Лентата с менюта
    2. \n' + + '
    3. Всяка група на лентата с инструменти
    4. \n' + + '
    5. Страничната лента
    6. \n' + + '
    7. Пътят до елемента в долния колонтитул
    8. \n' + + '
    9. Бутонът за превключване на броя на думите в долния колонтитул
    10. \n' + + '
    11. Връзката за търговска марка в долния колонтитул
    12. \n' + + '
    13. Манипулаторът за преоразмеряване на редактора в долния колонтитул
    14. \n' + + '
    \n' + + '\n' + + '

    Ако някой раздел на ПИ липсва, той се пропуска.

    \n' + + '\n' + + '

    Ако долният колонтитул има фокус за навигация с клавиатурата и няма странична лента, натискането на Shift+Tab\n' + + ' премества фокуса към първата група на лентата с инструменти, а не към последната.\n' + + '\n' + + '

    Навигиране в разделите на ПИ

    \n' + + '\n' + + '

    За да преминете от един елемент на ПИ към следващия, натиснете съответния клавиш със стрелка.

    \n' + + '\n' + + '

    С клавишите със стрелка наляво и надясно

    \n' + + '\n' + + '
      \n' + + '
    • се придвижвате между менютата в лентата с менюто;
    • \n' + + '
    • отваряте подменю в меню;
    • \n' + + '
    • се придвижвате между бутоните в група на лентата с инструменти;
    • \n' + + '
    • се придвижвате между елементи в пътя до елемент в долния колонтитул.
    • \n' + + '
    \n' + + '\n' + + '

    С клавишите със стрелка надолу и нагоре\n' + + '\n' + + '

      \n' + + '
    • се придвижвате между елементите от менюто в дадено меню;
    • \n' + + '
    • се придвижвате между елементите в изскачащо меню на лентата с инструменти.
    • \n' + + '
    \n' + + '\n' + + '

    Клавишите със стрелки се придвижват в рамките на фокусирания раздел на ПИ.

    \n' + + '\n' + + '

    За да затворите отворено меню, подменю или изскачащо меню, натиснете клавиша Esc.\n' + + '\n' + + '

    Ако текущият фокус е върху „горната част“ на конкретен раздел на ПИ, натискането на клавиша Esc също излиза\n' + + ' напълно от навигацията с клавиатурата.

    \n' + + '\n' + + '

    Изпълнение на елемент от менюто или бутон от лентата с инструменти

    \n' + + '\n' + + '

    Когато желаният елемент от менюто или бутон от лентата с инструменти е маркиран, натиснете Return, Enter\n' + + ' или клавиша за интервал, за да изпълните елемента.\n' + + '\n' + + '

    Навигиране в диалогови прозорци без раздели

    \n' + + '\n' + + '

    В диалоговите прозорци без раздели първият интерактивен компонент се фокусира, когато се отвори диалоговият прозорец.

    \n' + + '\n' + + '

    Навигирайте между интерактивните компоненти на диалоговия прозорец, като натиснете Tab или Shift+Tab.

    \n' + + '\n' + + '

    Навигиране в диалогови прозорци с раздели

    \n' + + '\n' + + '

    В диалоговите прозорци с раздели първият бутон в менюто с раздели се фокусира, когато се отвори диалоговият прозорец.

    \n' + + '\n' + + '

    Навигирайте между интерактивните компоненти на този диалогов раздел, като натиснете Tab или\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Превключете към друг диалогов раздел, като фокусирате върху менюто с раздели и след това натиснете съответния клавиш със стрелка,\n' + + ' за да преминете през наличните раздели.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/ca.js b/public/js/tinymce/plugins/help/js/i18n/keynav/ca.js new file mode 100644 index 000000000..6d9ad54a5 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/ca.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ca', +'

    Inici de la navegació amb el teclat

    \n' + + '\n' + + '
    \n' + + '
    Enfocar la barra de menús
    \n' + + '
    Windows o Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + "
    Enfocar la barra d'eines
    \n" + + '
    Windows o Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Enfocar el peu de pàgina
    \n' + + '
    Windows o Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + "
    Enfocar una barra d'eines contextual
    \n" + + '
    Windows, Linux o macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + "

    La navegació començarà en el primer element de la interfície d'usuari, que es ressaltarà o subratllarà per al primer element a\n" + + " la ruta de l'element de peu de pàgina.

    \n" + + '\n' + + "

    Navegació entre seccions de la interfície d'usuari

    \n" + + '\n' + + "

    Per desplaçar-vos des d'una secció de la interfície d'usuari a la següent, premeu la tecla Tab.

    \n" + + '\n' + + "

    Per desplaçar-vos des d'una secció de la interfície d'usuari a l'anterior, premeu les tecles Maj+Tab.

    \n" + + '\n' + + "

    L'ordre en prémer la tecla Tab d'aquestes secciones de la interfície d'usuari és:\n" + + '\n' + + '

      \n' + + '
    1. Barra de menús
    2. \n' + + "
    3. Cada grup de la barra d'eines
    4. \n" + + '
    5. Barra lateral
    6. \n' + + "
    7. Ruta de l'element del peu de pàgina
    8. \n" + + '
    9. Botó de commutació de recompte de paraules al peu de pàgina
    10. \n' + + '
    11. Enllaç de marca del peu de pàgina
    12. \n' + + "
    13. Control de canvi de mida de l'editor al peu de pàgina
    14. \n" + + '
    \n' + + '\n' + + "

    Si no hi ha una secció de la interfície d'usuari, s'ometrà.

    \n" + + '\n' + + '

    Si el peu de pàgina té el focus de navegació del teclat i no hi ha cap barra lateral visible, en prémer Maj+Tab\n' + + " el focus es mou al primer grup de la barra d'eines, no l'últim.\n" + + '\n' + + "

    Navegació dins de les seccions de la interfície d'usuari

    \n" + + '\n' + + "

    Per desplaçar-vos des d'un element de la interfície d'usuari al següent, premeu la tecla de Fletxa adequada.

    \n" + + '\n' + + '

    Les tecles de fletxa Esquerra i Dreta

    \n' + + '\n' + + '
      \n' + + '
    • us permeten desplaçar-vos entre menús de la barra de menús.
    • \n' + + '
    • obren un submenú en un menú.
    • \n' + + "
    • us permeten desplaçar-vos entre botons d'un grup de la barra d'eines.
    • \n" + + "
    • us permeten desplaçar-vos entre elements de la ruta d'elements del peu de pàgina.
    • \n" + + '
    \n' + + '\n' + + '

    Les tecles de fletxa Avall i Amunt\n' + + '\n' + + '

      \n' + + "
    • us permeten desplaçar-vos entre elements de menú d'un menú.
    • \n" + + "
    • us permeten desplaçar-vos entre elements d'un menú emergent de la barra d'eines.
    • \n" + + '
    \n' + + '\n' + + "

    Les tecles de Fletxa us permeten desplaçar-vos dins de la secció de la interfície d'usuari que té el focus.

    \n" + + '\n' + + '

    Per tancar un menú, un submenú o un menú emergent oberts, premeu la tecla Esc.\n' + + '\n' + + "

    Si el focus actual es troba a la ‘part superior’ d'una secció específica de la interfície d'usuari, en prémer la tecla Esc també es tanca\n" + + ' completament la navegació amb el teclat.

    \n' + + '\n' + + "

    Execució d'un element de menú o d'un botó de la barra d'eines

    \n" + + '\n' + + "

    Quan l'element del menú o el botó de la barra d'eines que desitgeu estigui ressaltat, premeu Retorn, Intro\n" + + " o la barra d'espai per executar l'element.\n" + + '\n' + + '

    Navegació per quadres de diàleg sense pestanyes

    \n' + + '\n' + + "

    En els quadres de diàleg sense pestanyes, el primer component interactiu pren el focus quan s'obre el quadre diàleg.

    \n" + + '\n' + + '

    Premeu la tecla Tab o les tecles Maj+Tab per desplaçar-vos entre components interactius del quadre de diàleg.

    \n' + + '\n' + + '

    Navegació per quadres de diàleg amb pestanyes

    \n' + + '\n' + + "

    En els quadres de diàleg amb pestanyes, el primer botó del menú de la pestanya pren el focus quan s'obre el quadre diàleg.

    \n" + + '\n' + + "

    Per desplaçar-vos entre components interactius d'aquest quadre de diàleg, premeu la tecla Tab o\n" + + ' les tecles Maj+Tab.

    \n' + + '\n' + + "

    Canvieu a la pestanya d'un altre quadre de diàleg, tot enfocant el menú de la pestanya, i després premeu la tecla Fletxa adequada\n" + + ' per canviar entre les pestanyes disponibles.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/cs.js b/public/js/tinymce/plugins/help/js/i18n/keynav/cs.js new file mode 100644 index 000000000..e9103f7ab --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/cs.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.cs', +'

    Začínáme navigovat pomocí klávesnice

    \n' + + '\n' + + '
    \n' + + '
    Přejít na řádek nabídek
    \n' + + '
    Windows nebo Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Přejít na panel nástrojů
    \n' + + '
    Windows nebo Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Přejít na zápatí
    \n' + + '
    Windows nebo Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Přejít na kontextový panel nástrojů
    \n' + + '
    Windows, Linux nebo macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Navigace začne u první položky uživatelského rozhraní, která bude zvýrazněna nebo v případě první položky\n' + + ' cesty k prvku zápatí podtržena.

    \n' + + '\n' + + '

    Navigace mezi oddíly uživatelského rozhraní

    \n' + + '\n' + + '

    Stisknutím klávesy Tab se posunete z jednoho oddílu uživatelského rozhraní na další.

    \n' + + '\n' + + '

    Stisknutím kláves Shift+Tab se posunete z jednoho oddílu uživatelského rozhraní na předchozí.

    \n' + + '\n' + + '

    Pořadí přepínání mezi oddíly uživatelského rozhraní pomocí klávesy Tab:\n' + + '\n' + + '

      \n' + + '
    1. Řádek nabídek
    2. \n' + + '
    3. Každá skupina panelu nástrojů
    4. \n' + + '
    5. Boční panel
    6. \n' + + '
    7. Cesta k prvku v zápatí.
    8. \n' + + '
    9. Tlačítko přepínače počtu slov v zápatí
    10. \n' + + '
    11. Odkaz na informace o značce v zápatí
    12. \n' + + '
    13. Úchyt pro změnu velikosti editoru v zápatí
    14. \n' + + '
    \n' + + '\n' + + '

    Pokud nějaký oddíl uživatelského rozhraní není přítomen, je přeskočen.

    \n' + + '\n' + + '

    Pokud je zápatí vybrané pro navigaci pomocí klávesnice a není zobrazen žádný boční panel, stisknutím kláves Shift+Tab\n' + + ' přejdete na první skupinu panelu nástrojů, nikoli na poslední.\n' + + '\n' + + '

    Navigace v rámci oddílů uživatelského rozhraní

    \n' + + '\n' + + '

    Chcete-li se přesunout z jednoho prvku uživatelského rozhraní na další, stiskněte příslušnou klávesu s šipkou.

    \n' + + '\n' + + '

    Klávesy s šipkou vlevovpravo

    \n' + + '\n' + + '
      \n' + + '
    • umožňují přesun mezi nabídkami na řádku nabídek;
    • \n' + + '
    • otevírají podnabídku nabídky;
    • \n' + + '
    • umožňují přesun mezi tlačítky ve skupině panelu nástrojů;
    • \n' + + '
    • umožňují přesun mezi položkami cesty prvku v zápatí.
    • \n' + + '
    \n' + + '\n' + + '

    Klávesy se šipkou dolůnahoru\n' + + '\n' + + '

      \n' + + '
    • umožňují přesun mezi položkami nabídky;
    • \n' + + '
    • umožňují přesun mezi položkami místní nabídky panelu nástrojů.
    • \n' + + '
    \n' + + '\n' + + '

    Šipky provádí přepínání v rámci vybraného oddílu uživatelského rozhraní.

    \n' + + '\n' + + '

    Chcete-li zavřít otevřenou nabídku, podnabídku nebo místní nabídku, stiskněte klávesu Esc.\n' + + '\n' + + '

    Pokud je aktuálně vybrána horní část oddílu uživatelského rozhraní, stisknutím klávesy Esc zcela ukončíte také\n' + + ' navigaci pomocí klávesnice.

    \n' + + '\n' + + '

    Provedení příkazu položky nabídky nebo tlačítka panelu nástrojů

    \n' + + '\n' + + '

    Pokud je zvýrazněna požadovaná položka nabídky nebo tlačítko panelu nástrojů, stisknutím klávesy Return, Enter\n' + + ' nebo mezerníku provedete příslušný příkaz.\n' + + '\n' + + '

    Navigace v dialogových oknech bez záložek

    \n' + + '\n' + + '

    Při otevření dialogových oken bez záložek přejdete na první interaktivní komponentu.

    \n' + + '\n' + + '

    Přecházet mezi interaktivními komponentami dialogového okna můžete stisknutím klávesy Tab nebo kombinace Shift+Tab.

    \n' + + '\n' + + '

    Navigace v dialogových oknech se záložkami

    \n' + + '\n' + + '

    Při otevření dialogových oken se záložkami přejdete na první tlačítko v nabídce záložek.

    \n' + + '\n' + + '

    Přecházet mezi interaktivními komponentami této záložky dialogového okna můžete stisknutím klávesy Tab nebo\n' + + ' kombinace Shift+Tab.

    \n' + + '\n' + + '

    Chcete-li přepnout na další záložku dialogového okna, přejděte na nabídku záložek a poté můžete stisknutím požadované šipky\n' + + ' přepínat mezi dostupnými záložkami.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/da.js b/public/js/tinymce/plugins/help/js/i18n/keynav/da.js new file mode 100644 index 000000000..f3989a0da --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/da.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.da', +'

    Start tastaturnavigation

    \n' + + '\n' + + '
    \n' + + '
    Fokuser på menulinjen
    \n' + + '
    Windows eller Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Fokuser på værktøjslinjen
    \n' + + '
    Windows eller Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Fokuser på sidefoden
    \n' + + '
    Windows eller Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Fokuser på kontekstuel værktøjslinje
    \n' + + '
    Windows, Linux eller macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Navigationen starter ved det første UI-element, som fremhæves eller understreges hvad angår det første element i\n' + + ' sidefodens sti til elementet.

    \n' + + '\n' + + '

    Naviger mellem UI-sektioner

    \n' + + '\n' + + '

    Gå fra én UI-sektion til den næste ved at trykke på Tab.

    \n' + + '\n' + + '

    Gå fra én UI-sektion til den forrige ved at trykke på Shift+Tab.

    \n' + + '\n' + + '

    Tab-rækkefølgen af disse UI-sektioner er:\n' + + '\n' + + '

      \n' + + '
    1. Menulinje
    2. \n' + + '
    3. Hver værktøjsgruppe
    4. \n' + + '
    5. Sidepanel
    6. \n' + + '
    7. Sti til elementet i sidefoden
    8. \n' + + '
    9. Til/fra-knap for ordoptælling i sidefoden
    10. \n' + + '
    11. Brandinglink i sidefoden
    12. \n' + + '
    13. Tilpasningshåndtag for editor i sidefoden
    14. \n' + + '
    \n' + + '\n' + + '

    Hvis en UI-sektion ikke er til stede, springes den over.

    \n' + + '\n' + + '

    Hvis sidefoden har fokus til tastaturnavigation, og der ikke er noget synligt sidepanel, kan der trykkes på Shift+Tab\n' + + ' for at flytte fokus til den første værktøjsgruppe, ikke den sidste.\n' + + '\n' + + '

    Naviger inden for UI-sektioner

    \n' + + '\n' + + '

    Gå fra ét UI-element til det næste ved at trykke på den relevante piletast.

    \n' + + '\n' + + '

    Venstre og højre piletast

    \n' + + '\n' + + '
      \n' + + '
    • flytter mellem menuerne i menulinjen.
    • \n' + + '
    • åbner en undermenu i en menu.
    • \n' + + '
    • flytter mellem knapperne i en værktøjsgruppe.
    • \n' + + '
    • flytter mellem elementer i sidefodens sti til elementet.
    • \n' + + '
    \n' + + '\n' + + '

    Pil ned og op\n' + + '\n' + + '

      \n' + + '
    • flytter mellem menupunkterne i en menu.
    • \n' + + '
    • flytter mellem punkterne i en genvejsmenu i værktøjslinjen.
    • \n' + + '
    \n' + + '\n' + + '

    Piletasterne kører rundt inden for UI-sektionen, der fokuseres på.

    \n' + + '\n' + + '

    For at lukke en åben menu, en åben undermenu eller en åben genvejsmenu trykkes der på Esc-tasten.\n' + + '\n' + + "

    Hvis det aktuelle fokus er i 'toppen' af en bestemt UI-sektion, vil tryk på Esc-tasten også afslutte\n" + + ' tastaturnavigationen helt.

    \n' + + '\n' + + '

    Udfør et menupunkt eller en værktøjslinjeknap

    \n' + + '\n' + + '

    Når det ønskede menupunkt eller den ønskede værktøjslinjeknap er fremhævet, trykkes der på Retur, Enter\n' + + ' eller mellemrumstasten for at udføre elementet.\n' + + '\n' + + '

    Naviger i ikke-faneopdelte dialogbokse

    \n' + + '\n' + + '

    I ikke-faneopdelte dialogbokse får den første interaktive komponent fokus, når dialogboksen åbnes.

    \n' + + '\n' + + '

    Naviger mellem interaktive dialogbokskomponenter ved at trykke på Tab eller Shift+Tab.

    \n' + + '\n' + + '

    Naviger i faneopdelte dialogbokse

    \n' + + '\n' + + '

    I faneopdelte dialogbokse får den første knap i fanemenuen fokus, når dialogboksen åbnes.

    \n' + + '\n' + + '

    Naviger mellem interaktive komponenter i denne dialogboksfane ved at trykke på Tab eller\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Skift til en anden dialogboksfane ved at fokusere på fanemenuen og derefter trykke på den relevante piletast\n' + + ' for at køre igennem de tilgængelige faner.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/de.js b/public/js/tinymce/plugins/help/js/i18n/keynav/de.js new file mode 100644 index 000000000..9f0c5dbb3 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/de.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.de', +'

    Grundlagen der Tastaturnavigation

    \n' + + '\n' + + '
    \n' + + '
    Fokus auf Menüleiste
    \n' + + '
    Windows oder Linux: ALT+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Fokus auf Symbolleiste
    \n' + + '
    Windows oder Linux: ALT+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Fokus auf Fußzeile
    \n' + + '
    Windows oder Linux: ALT+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Fokus auf kontextbezogene Symbolleiste
    \n' + + '
    Windows, Linux oder macOS: STRG+F9\n' + + '
    \n' + + '\n' + + '

    Die Navigation beginnt beim ersten Benutzeroberflächenelement, welches hervorgehoben ist. Falls sich das erste Element im Pfad der Fußzeile befindet,\n' + + ' ist es unterstrichen.

    \n' + + '\n' + + '

    Zwischen Abschnitten der Benutzeroberfläche navigieren

    \n' + + '\n' + + '

    Um von einem Abschnitt der Benutzeroberfläche zum nächsten zu wechseln, drücken Sie TAB.

    \n' + + '\n' + + '

    Um von einem Abschnitt der Benutzeroberfläche zum vorherigen zu wechseln, drücken Sie UMSCHALT+TAB.

    \n' + + '\n' + + '

    Die Abschnitte der Benutzeroberfläche haben folgende TAB-Reihenfolge:\n' + + '\n' + + '

      \n' + + '
    1. Menüleiste
    2. \n' + + '
    3. Einzelne Gruppen der Symbolleiste
    4. \n' + + '
    5. Randleiste
    6. \n' + + '
    7. Elementpfad in der Fußzeile
    8. \n' + + '
    9. Umschaltfläche „Wörter zählen“ in der Fußzeile
    10. \n' + + '
    11. Branding-Link in der Fußzeile
    12. \n' + + '
    13. Editor-Ziehpunkt zur Größenänderung in der Fußzeile
    14. \n' + + '
    \n' + + '\n' + + '

    Falls ein Abschnitt der Benutzeroberflächen nicht vorhanden ist, wird er übersprungen.

    \n' + + '\n' + + '

    Wenn in der Fußzeile die Tastaturnavigation fokussiert ist und keine Randleiste angezeigt wird, wechselt der Fokus durch Drücken von UMSCHALT+TAB\n' + + ' zur ersten Gruppe der Symbolleiste, nicht zur letzten.\n' + + '\n' + + '

    Innerhalb von Abschnitten der Benutzeroberfläche navigieren

    \n' + + '\n' + + '

    Um von einem Element der Benutzeroberfläche zum nächsten zu wechseln, drücken Sie die entsprechende Pfeiltaste.

    \n' + + '\n' + + '

    Die Pfeiltasten Links und Rechts

    \n' + + '\n' + + '
      \n' + + '
    • wechseln zwischen Menüs in der Menüleiste.
    • \n' + + '
    • öffnen das Untermenü eines Menüs.
    • \n' + + '
    • wechseln zwischen Schaltflächen in einer Gruppe der Symbolleiste.
    • \n' + + '
    • wechseln zwischen Elementen im Elementpfad der Fußzeile.
    • \n' + + '
    \n' + + '\n' + + '

    Die Pfeiltasten Abwärts und Aufwärts\n' + + '\n' + + '

      \n' + + '
    • wechseln zwischen Menüelementen in einem Menü.
    • \n' + + '
    • wechseln zwischen Elementen in einem Popupmenü der Symbolleiste.
    • \n' + + '
    \n' + + '\n' + + '

    Die Pfeiltasten rotieren innerhalb des fokussierten Abschnitts der Benutzeroberfläche.

    \n' + + '\n' + + '

    Um ein geöffnetes Menü, ein geöffnetes Untermenü oder ein geöffnetes Popupmenü zu schließen, drücken Sie die ESC-Taste.\n' + + '\n' + + '

    Wenn sich der aktuelle Fokus ganz oben in einem bestimmten Abschnitt der Benutzeroberfläche befindet, wird durch Drücken der ESC-Taste auch\n' + + ' die Tastaturnavigation beendet.

    \n' + + '\n' + + '

    Ein Menüelement oder eine Symbolleistenschaltfläche ausführen

    \n' + + '\n' + + '

    Wenn das gewünschte Menüelement oder die gewünschte Symbolleistenschaltfläche hervorgehoben ist, drücken Sie Zurück, Eingabe\n' + + ' oder die Leertaste, um das Element auszuführen.\n' + + '\n' + + '

    In Dialogfeldern ohne Registerkarten navigieren

    \n' + + '\n' + + '

    In Dialogfeldern ohne Registerkarten ist beim Öffnen eines Dialogfelds die erste interaktive Komponente fokussiert.

    \n' + + '\n' + + '

    Navigieren Sie zwischen den interaktiven Komponenten eines Dialogfelds, indem Sie TAB oder UMSCHALT+TAB drücken.

    \n' + + '\n' + + '

    In Dialogfeldern mit Registerkarten navigieren

    \n' + + '\n' + + '

    In Dialogfeldern mit Registerkarten ist beim Öffnen eines Dialogfelds die erste Schaltfläche eines Registerkartenmenüs fokussiert.

    \n' + + '\n' + + '

    Navigieren Sie zwischen den interaktiven Komponenten auf dieser Registerkarte des Dialogfelds, indem Sie TAB oder\n' + + ' UMSCHALT+TAB drücken.

    \n' + + '\n' + + '

    Wechseln Sie zu einer anderen Registerkarte des Dialogfelds, indem Sie den Fokus auf das Registerkartenmenü legen und dann die entsprechende Pfeiltaste\n' + + ' drücken, um durch die verfügbaren Registerkarten zu rotieren.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/el.js b/public/js/tinymce/plugins/help/js/i18n/keynav/el.js new file mode 100644 index 000000000..df75ec271 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/el.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.el', +'

    Έναρξη πλοήγησης μέσω πληκτρολογίου

    \n' + + '\n' + + '
    \n' + + '
    Εστίαση στη γραμμή μενού
    \n' + + '
    Windows ή Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Εστίαση στη γραμμή εργαλείων
    \n' + + '
    Windows ή Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Εστίαση στο υποσέλιδο
    \n' + + '
    Windows ή Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Εστίαση σε γραμμή εργαλείων βάσει περιεχομένου
    \n' + + '
    Windows, Linux ή macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Η πλοήγηση θα ξεκινήσει από το πρώτο στοιχείο περιβάλλοντος χρήστη, που θα επισημαίνεται ή θα είναι υπογραμμισμένο,\n' + + ' όπως στην περίπτωση της διαδρομής του στοιχείου Υποσέλιδου.

    \n' + + '\n' + + '

    Πλοήγηση μεταξύ ενοτήτων του περιβάλλοντος χρήστη

    \n' + + '\n' + + '

    Για να μετακινηθείτε από μια ενότητα περιβάλλοντος χρήστη στην επόμενη, πιέστε το πλήκτρο Tab.

    \n' + + '\n' + + '

    Για να μετακινηθείτε από μια ενότητα περιβάλλοντος χρήστη στην προηγούμενη, πιέστε τα πλήκτρα Shift+Tab.

    \n' + + '\n' + + '

    Η σειρά Tab αυτών των ενοτήτων περιβάλλοντος χρήστη είναι η εξής:\n' + + '\n' + + '

      \n' + + '
    1. Γραμμή μενού
    2. \n' + + '
    3. Κάθε ομάδα γραμμής εργαλείων
    4. \n' + + '
    5. Πλαϊνή γραμμή
    6. \n' + + '
    7. Διαδρομή στοιχείου στο υποσέλιδο
    8. \n' + + '
    9. Κουμπί εναλλαγής μέτρησης λέξεων στο υποσέλιδο
    10. \n' + + '
    11. Σύνδεσμος επωνυμίας στο υποσέλιδο
    12. \n' + + '
    13. Λαβή αλλαγής μεγέθους προγράμματος επεξεργασίας στο υποσέλιδο
    14. \n' + + '
    \n' + + '\n' + + '

    Εάν δεν εμφανίζεται ενότητα περιβάλλοντος χρήστη, παραλείπεται.

    \n' + + '\n' + + '

    Εάν η εστίαση πλοήγησης βρίσκεται στο πληκτρολόγιο και δεν υπάρχει εμφανής πλαϊνή γραμμή, εάν πιέσετε Shift+Tab\n' + + ' η εστίαση μετακινείται στην πρώτη ομάδα γραμμής εργαλείων, όχι στην τελευταία.\n' + + '\n' + + '

    Πλοήγηση εντός των ενοτήτων του περιβάλλοντος χρήστη

    \n' + + '\n' + + '

    Για να μετακινηθείτε από ένα στοιχείο περιβάλλοντος χρήστη στο επόμενο, πιέστε το αντίστοιχο πλήκτρο βέλους.

    \n' + + '\n' + + '

    Με τα πλήκτρα αριστερού και δεξιού βέλους

    \n' + + '\n' + + '
      \n' + + '
    • γίνεται μετακίνηση μεταξύ των μενού στη γραμμή μενού.
    • \n' + + '
    • ανοίγει ένα υπομενού σε ένα μενού.
    • \n' + + '
    • γίνεται μετακίνηση μεταξύ κουμπιών σε μια ομάδα γραμμής εργαλείων.
    • \n' + + '
    • γίνεται μετακίνηση μεταξύ στοιχείων στη διαδρομή στοιχείου στο υποσέλιδο.
    • \n' + + '
    \n' + + '\n' + + '

    Με τα πλήκτρα επάνω και κάτω βέλους\n' + + '\n' + + '

      \n' + + '
    • γίνεται μετακίνηση μεταξύ των στοιχείων μενού σε ένα μενού.
    • \n' + + '
    • γίνεται μετακίνηση μεταξύ των στοιχείων μενού σε ένα αναδυόμενο μενού γραμμής εργαλείων.
    • \n' + + '
    \n' + + '\n' + + '

    Με τα πλήκτρα βέλους γίνεται κυκλική μετακίνηση εντός της εστιασμένης ενότητας περιβάλλοντος χρήστη.

    \n' + + '\n' + + '

    Για να κλείσετε ένα ανοιχτό μενού, ένα ανοιχτό υπομενού ή ένα ανοιχτό αναδυόμενο μενού, πιέστε το πλήκτρο Esc.\n' + + '\n' + + '

    Εάν η τρέχουσα εστίαση βρίσκεται στην κορυφή μιας ενότητας περιβάλλοντος χρήστη, πιέζοντας το πλήκτρο Esc,\n' + + ' γίνεται επίσης πλήρης έξοδος από την πλοήγηση μέσω πληκτρολογίου.

    \n' + + '\n' + + '

    Εκτέλεση ενός στοιχείου μενού ή κουμπιού γραμμής εργαλείων

    \n' + + '\n' + + '

    Όταν το επιθυμητό στοιχείο μενού ή κουμπί γραμμής εργαλείων είναι επισημασμένο, πιέστε τα πλήκτρα Return, Enter,\n' + + ' ή το πλήκτρο διαστήματος για να εκτελέσετε το στοιχείο.\n' + + '\n' + + '

    Πλοήγηση σε παράθυρα διαλόγου χωρίς καρτέλες

    \n' + + '\n' + + '

    Σε παράθυρα διαλόγου χωρίς καρτέλες, το πρώτο αλληλεπιδραστικό στοιχείο λαμβάνει την εστίαση όταν ανοίγει το παράθυρο διαλόγου.

    \n' + + '\n' + + '

    Μπορείτε να πλοηγηθείτε μεταξύ των αλληλεπιδραστικών στοιχείων παραθύρων διαλόγων πιέζοντας τα πλήκτρα Tab ή Shift+Tab.

    \n' + + '\n' + + '

    Πλοήγηση σε παράθυρα διαλόγου με καρτέλες

    \n' + + '\n' + + '

    Σε παράθυρα διαλόγου με καρτέλες, το πρώτο κουμπί στο μενού καρτέλας λαμβάνει την εστίαση όταν ανοίγει το παράθυρο διαλόγου.

    \n' + + '\n' + + '

    Μπορείτε να πλοηγηθείτε μεταξύ των αλληλεπιδραστικών στοιχείων αυτής της καρτέλα διαλόγου πιέζοντας τα πλήκτρα Tab ή\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Μπορείτε να κάνετε εναλλαγή σε άλλη καρτέλα του παραθύρου διαλόγου, μεταφέροντας την εστίαση στο μενού καρτέλας και πιέζοντας το κατάλληλο πλήκτρο βέλους\n' + + ' για να μετακινηθείτε κυκλικά στις διαθέσιμες καρτέλες.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/en.js b/public/js/tinymce/plugins/help/js/i18n/keynav/en.js new file mode 100644 index 000000000..7f0fca7c3 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/en.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.en', +'

    Begin keyboard navigation

    \n' + + '\n' + + '
    \n' + + '
    Focus the Menu bar
    \n' + + '
    Windows or Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Focus the Toolbar
    \n' + + '
    Windows or Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Focus the footer
    \n' + + '
    Windows or Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Focus a contextual toolbar
    \n' + + '
    Windows, Linux or macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Navigation will start at the first UI item, which will be highlighted, or underlined in the case of the first item in\n' + + ' the Footer element path.

    \n' + + '\n' + + '

    Navigate between UI sections

    \n' + + '\n' + + '

    To move from one UI section to the next, press Tab.

    \n' + + '\n' + + '

    To move from one UI section to the previous, press Shift+Tab.

    \n' + + '\n' + + '

    The Tab order of these UI sections is:\n' + + '\n' + + '

      \n' + + '
    1. Menu bar
    2. \n' + + '
    3. Each toolbar group
    4. \n' + + '
    5. Sidebar
    6. \n' + + '
    7. Element path in the footer
    8. \n' + + '
    9. Word count toggle button in the footer
    10. \n' + + '
    11. Branding link in the footer
    12. \n' + + '
    13. Editor resize handle in the footer
    14. \n' + + '
    \n' + + '\n' + + '

    If a UI section is not present, it is skipped.

    \n' + + '\n' + + '

    If the footer has keyboard navigation focus, and there is no visible sidebar, pressing Shift+Tab\n' + + ' moves focus to the first toolbar group, not the last.\n' + + '\n' + + '

    Navigate within UI sections

    \n' + + '\n' + + '

    To move from one UI element to the next, press the appropriate Arrow key.

    \n' + + '\n' + + '

    The Left and Right arrow keys

    \n' + + '\n' + + '
      \n' + + '
    • move between menus in the menu bar.
    • \n' + + '
    • open a sub-menu in a menu.
    • \n' + + '
    • move between buttons in a toolbar group.
    • \n' + + '
    • move between items in the footer’s element path.
    • \n' + + '
    \n' + + '\n' + + '

    The Down and Up arrow keys\n' + + '\n' + + '

      \n' + + '
    • move between menu items in a menu.
    • \n' + + '
    • move between items in a toolbar pop-up menu.
    • \n' + + '
    \n' + + '\n' + + '

    Arrow keys cycle within the focused UI section.

    \n' + + '\n' + + '

    To close an open menu, an open sub-menu, or an open pop-up menu, press the Esc key.\n' + + '\n' + + '

    If the current focus is at the ‘top’ of a particular UI section, pressing the Esc key also exits\n' + + ' keyboard navigation entirely.

    \n' + + '\n' + + '

    Execute a menu item or toolbar button

    \n' + + '\n' + + '

    When the desired menu item or toolbar button is highlighted, press Return, Enter,\n' + + ' or the Space bar to execute the item.\n' + + '\n' + + '

    Navigate non-tabbed dialogs

    \n' + + '\n' + + '

    In non-tabbed dialogs, the first interactive component takes focus when the dialog opens.

    \n' + + '\n' + + '

    Navigate between interactive dialog components by pressing Tab or Shift+Tab.

    \n' + + '\n' + + '

    Navigate tabbed dialogs

    \n' + + '\n' + + '

    In tabbed dialogs, the first button in the tab menu takes focus when the dialog opens.

    \n' + + '\n' + + '

    Navigate between interactive components of this dialog tab by pressing Tab or\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Switch to another dialog tab by giving the tab menu focus and then pressing the appropriate Arrow\n' + + ' key to cycle through the available tabs.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/es.js b/public/js/tinymce/plugins/help/js/i18n/keynav/es.js new file mode 100644 index 000000000..008382c5c --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/es.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.es', +'

    Iniciar la navegación con el teclado

    \n' + + '\n' + + '
    \n' + + '
    Enfocar la barra de menús
    \n' + + '
    Windows o Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Enfocar la barra de herramientas
    \n' + + '
    Windows o Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Enfocar el pie de página
    \n' + + '
    Windows o Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Enfocar una barra de herramientas contextual
    \n' + + '
    Windows, Linux o macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    La navegación comenzará por el primer elemento de la interfaz de usuario (IU), de tal manera que se resaltará, o bien se subrayará si se trata del primer elemento de\n' + + ' la ruta de elemento del pie de página.

    \n' + + '\n' + + '

    Navegar entre las secciones de la IU

    \n' + + '\n' + + '

    Para pasar de una sección de la IU a la siguiente, pulse la tecla Tab.

    \n' + + '\n' + + '

    Para pasar de una sección de la IU a la anterior, pulse Mayús+Tab.

    \n' + + '\n' + + '

    El orden de tabulación de estas secciones de la IU es:\n' + + '\n' + + '

      \n' + + '
    1. Barra de menús
    2. \n' + + '
    3. Cada grupo de barra de herramientas
    4. \n' + + '
    5. Barra lateral
    6. \n' + + '
    7. Ruta del elemento en el pie de página
    8. \n' + + '
    9. Botón de alternancia de recuento de palabras en el pie de página
    10. \n' + + '
    11. Enlace de personalización de marca en el pie de página
    12. \n' + + '
    13. Controlador de cambio de tamaño en el pie de página
    14. \n' + + '
    \n' + + '\n' + + '

    Si una sección de la IU no está presente, esta se omite.

    \n' + + '\n' + + '

    Si el pie de página tiene un enfoque de navegación con el teclado y no hay ninguna barra lateral visible, al pulsar Mayús+Tab,\n' + + ' el enfoque se moverá al primer grupo de barra de herramientas, en lugar de al último.\n' + + '\n' + + '

    Navegar dentro de las secciones de la IU

    \n' + + '\n' + + '

    Para pasar de un elemento de la IU al siguiente, pulse la tecla de flecha correspondiente.

    \n' + + '\n' + + '

    Las teclas de flecha izquierda y derecha permiten

    \n' + + '\n' + + '
      \n' + + '
    • desplazarse entre los menús de la barra de menús.
    • \n' + + '
    • abrir el submenú de un menú.
    • \n' + + '
    • desplazarse entre los botones de un grupo de barra de herramientas.
    • \n' + + '
    • desplazarse entre los elementos de la ruta de elemento del pie de página.
    • \n' + + '
    \n' + + '\n' + + '

    Las teclas de flecha abajo y arriba permiten\n' + + '\n' + + '

      \n' + + '
    • desplazarse entre los elementos de menú de un menú.
    • \n' + + '
    • desplazarse entre los elementos de un menú emergente de una barra de herramientas.
    • \n' + + '
    \n' + + '\n' + + '

    Las teclas de flecha van cambiando dentro de la sección de la IU enfocada.

    \n' + + '\n' + + '

    Para cerrar un menú, un submenú o un menú emergente que estén abiertos, pulse la tecla Esc.\n' + + '\n' + + '

    Si el enfoque actual se encuentra en la parte superior de una sección de la IU determinada, al pulsar la tecla Esc saldrá\n' + + ' de la navegación con el teclado por completo.

    \n' + + '\n' + + '

    Ejecutar un elemento de menú o un botón de barra de herramientas

    \n' + + '\n' + + '

    Si el elemento de menú o el botón de barra de herramientas deseado está resaltado, pulse la tecla Retorno o Entrar,\n' + + ' o la barra espaciadora para ejecutar el elemento.\n' + + '\n' + + '

    Navegar por cuadros de diálogo sin pestañas

    \n' + + '\n' + + '

    En los cuadros de diálogo sin pestañas, el primer componente interactivo se enfoca al abrirse el cuadro de diálogo.

    \n' + + '\n' + + '

    Para navegar entre los componentes interactivos del cuadro de diálogo, pulse las teclas Tab o Mayús+Tab.

    \n' + + '\n' + + '

    Navegar por cuadros de diálogo con pestañas

    \n' + + '\n' + + '

    En los cuadros de diálogo con pestañas, el primer botón del menú de pestaña se enfoca al abrirse el cuadro de diálogo.

    \n' + + '\n' + + '

    Para navegar entre componentes interactivos de esta pestaña del cuadro de diálogo, pulse las teclas Tab o\n' + + ' Mayús+Tab.

    \n' + + '\n' + + '

    Si desea cambiar a otra pestaña del cuadro de diálogo, enfoque el menú de pestañas y, a continuación, pulse la tecla de flecha\n' + + ' correspondiente para moverse por las pestañas disponibles.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/eu.js b/public/js/tinymce/plugins/help/js/i18n/keynav/eu.js new file mode 100644 index 000000000..637a3894e --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/eu.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.eu', +'

    Hasi teklatuaren nabigazioa

    \n' + + '\n' + + '
    \n' + + '
    Fokuratu menu-barra
    \n' + + '
    Windows edo Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Fokuratu tresna-barra
    \n' + + '
    Windows edo Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Fokuratu orri-oina
    \n' + + '
    Windows edo Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Fokuratu testuinguruaren tresna-barra
    \n' + + '
    Windows, Linux edo macOS: Ktrl+F9\n' + + '
    \n' + + '\n' + + '

    Nabigazioa EIko lehen elementuan hasiko da: elementu hori nabarmendu egingo da, edo azpimarratu lehen elementua bada\n' + + ' orri-oineko elementuaren bidea.

    \n' + + '\n' + + '

    Nabigatu EIko atalen artean

    \n' + + '\n' + + '

    EIko atal batetik hurrengora mugitzeko, sakatu Tabuladorea.

    \n' + + '\n' + + '

    EIko atal batetik aurrekora mugitzeko, sakatu Maius+Tabuladorea.

    \n' + + '\n' + + '

    EIko atal hauen Tabuladorea da:\n' + + '\n' + + '

      \n' + + '
    1. Menu-barra
    2. \n' + + '
    3. Tresna-barraren talde bakoitza
    4. \n' + + '
    5. Alboko barra
    6. \n' + + '
    7. Orri-oineko elementuaren bidea
    8. \n' + + '
    9. Orri-oneko urrats-kontaketa txandakatzeko botoia
    10. \n' + + '
    11. Orri-oineko marken esteka
    12. \n' + + '
    13. Orri-oineko editorearen tamaina aldatzeko heldulekua
    14. \n' + + '
    \n' + + '\n' + + '

    EIko atal bat ez badago, saltatu egin da.

    \n' + + '\n' + + '

    Orri-oinak teklatuaren nabigazioa fokuratuta badago, eta alboko barra ikusgai ez badago, Maius+Tabuladorea sakatuz gero,\n' + + ' fokua tresna-barrako lehen taldera eramaten da, ez azkenera.\n' + + '\n' + + '

    Nabigatu EIko atalen barruan

    \n' + + '\n' + + '

    EIko elementu batetik hurrengora mugitzeko, sakatu dagokion Gezia tekla.

    \n' + + '\n' + + '

    Ezkerrera eta Eskuinera gezi-teklak

    \n' + + '\n' + + '
      \n' + + '
    • menu-barrako menuen artean mugitzen da.
    • \n' + + '
    • ireki azpimenu bat menuan.
    • \n' + + '
    • mugitu botoi batetik bestera tresna-barren talde batean.
    • \n' + + '
    • mugitu orri-oineko elementuaren bideko elementu batetik bestera.
    • \n' + + '
    \n' + + '\n' + + '

    Gora eta Behera gezi-teklak\n' + + '\n' + + '

      \n' + + '
    • mugitu menu bateko menu-elementuen artean.
    • \n' + + '
    • mugitu tresna-barrako menu gainerakor bateko menu-elementuen artean.
    • \n' + + '
    \n' + + '\n' + + '

    Gezia teklen zikloa nabarmendutako EI atalen barruan.

    \n' + + '\n' + + '

    Irekitako menu bat ixteko, ireki azpimenua, edo ireki menu gainerakorra, sakatu Ihes tekla.\n' + + '\n' + + '

    Une horretan fokuratzea EIko atal jakin baten "goialdean" badago, Ihes tekla sakatuz gero \n' + + ' teklatuaren nabigaziotik irtengo zara.

    \n' + + '\n' + + '

    Exekutatu menuko elementu bat edo tresna-barrako botoi bat

    \n' + + '\n' + + '

    Nahi den menuaren elementua edo tresna-barraren botoia nabarmenduta dagoenean, sakatu Itzuli, Sartu\n' + + ' edo Zuriune-barra elementua exekutatzeko.\n' + + '\n' + + '

    Nabigatu fitxarik gabeko elkarrizketak

    \n' + + '\n' + + '

    Fitxarik gabeko elkarrizketetan, lehen osagai interaktiboa fokuratzen da elkarrizketa irekitzen denean.

    \n' + + '\n' + + '

    Nabigatu elkarrizketa interaktiboko osagai batetik bestera Tabuladorea edo Maius+Tabuladorea sakatuta.

    \n' + + '\n' + + '

    Nabigatu fitxadun elkarrizketak

    \n' + + '\n' + + '

    Fitxadun elkarrizketetan, fitxa-menuko lehen botoia fokuratzen da elkarrizketa irekitzen denean.

    \n' + + '\n' + + '

    Nabigatu elkarrizketa-fitxa honen interaktiboko osagai batetik bestera Tabuladorea edo\n' + + ' Maius+Tabuladorea sakatuta.

    \n' + + '\n' + + '

    Aldatu beste elkarrizketa-fitxa batera fitxa-menua fokuratu eta dagokion Gezia\n' + + ' tekla sakatzeko, erabilgarri dauden fitxa batetik bestera txandakatzeko.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/fa.js b/public/js/tinymce/plugins/help/js/i18n/keynav/fa.js new file mode 100644 index 000000000..8ffcc868b --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/fa.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.fa', +'

    شروع پیمایش صفحه‌کلید

    \n' + + '\n' + + '
    \n' + + '
    تمرکز بر نوار منو
    \n' + + '
    Windows یا Linux:‎‏: Alt+F9
    \n' + + '
    ‎‏macOS: ⌥F9‎‏
    \n' + + '
    تمرکز بر نوار ابزار
    \n' + + '
    Windows یا Linux‎‏: Alt+F10
    \n' + + '
    ‎‏macOS: ⌥F10‎‏
    \n' + + '
    تمرکز بر پانویس
    \n' + + '
    Windows یا Linux‎‏: Alt+F11
    \n' + + '
    ‎‏macOS: ⌥F11‎‏
    \n' + + '
    تمرکز بر نوار ابزار بافتاری
    \n' + + '
    Windows ،Linux یا macOS:‏ Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    پیمایش در اولین مورد رابط کاربری شروع می‌شود و درخصوص اولین مورد در\n' + + ' مسیر عنصر پانویس، برجسته یا زیرخط‌دار می‌شود.

    \n' + + '\n' + + '

    پیمایش بین بخش‌های رابط کاربری

    \n' + + '\n' + + '

    برای جابجایی از یک بخش رابط کاربری به بخش بعدی، Tab را فشار دهید.

    \n' + + '\n' + + '

    برای جابجایی از یک بخش رابط کاربری به بخش قبلی، Shift+Tab را فشار دهید.

    \n' + + '\n' + + '

    ترتیب Tab این بخش‌های رابط کاربری عبارتند از:\n' + + '\n' + + '

      \n' + + '
    1. نوار منو
    2. \n' + + '
    3. هر گروه نوار ابزار
    4. \n' + + '
    5. نوار کناری
    6. \n' + + '
    7. مسیر عنصر در پانویس
    8. \n' + + '
    9. دکمه تغییر وضعیت تعداد کلمات در پانویس
    10. \n' + + '
    11. پیوند نمانام‌سازی در پانویس
    12. \n' + + '
    13. دسته تغییر اندازه ویرایشگر در پانویس
    14. \n' + + '
    \n' + + '\n' + + '

    اگر بخشی از رابط کاربری موجود نباشد، رد می‌شود.

    \n' + + '\n' + + '

    اگر پانویس دارای تمرکز بر پیمایش صفحه‌کلید باشد،‌ و نوار کناری قابل‌مشاهده وجود ندارد، فشردن Shift+Tab\n' + + ' تمرکز را به گروه نوار ابزار اول می‌برد، نه آخر.\n' + + '\n' + + '

    پیمایش در بخش‌های رابط کاربری

    \n' + + '\n' + + '

    برای جابجایی از یک عنصر رابط کاربری به بعدی، کلید جهت‌نمای مناسب را فشار دهید.

    \n' + + '\n' + + '

    کلیدهای جهت‌نمای چپ و راست

    \n' + + '\n' + + '
      \n' + + '
    • جابجایی بین منوها در نوار منو.
    • \n' + + '
    • باز کردن منوی فرعی در یک منو.
    • \n' + + '
    • جابجایی بین دکمه‌ها در یک گروه نوار ابزار.
    • \n' + + '
    • جابجایی بین موارد در مسیر عنصر پانویس.
    • \n' + + '
    \n' + + '\n' + + '

    کلیدهای جهت‌نمای پایین و بالا\n' + + '\n' + + '

      \n' + + '
    • جابجایی بین موارد منو در یک منو.
    • \n' + + '
    • جابجایی بین موارد در یک منوی بازشوی نوار ابزار.
    • \n' + + '
    \n' + + '\n' + + '

    کلیدهایجهت‌نما در بخش رابط کاربری متمرکز می‌چرخند.

    \n' + + '\n' + + '

    برای بستن یک منوی باز، یک منوی فرعی باز، یا یک منوی بازشوی باز، کلید Esc را فشار دهید.\n' + + '\n' + + '

    اگر تمرکز فعلی در «بالای» یک بخش رابط کاربری خاص است، فشردن کلید Esc نیز موجب\n' + + ' خروج کامل از پیمایش صفحه‌کلید می‌شود.

    \n' + + '\n' + + '

    اجرای یک مورد منو یا دکمه نوار ابزار

    \n' + + '\n' + + '

    وقتی مورد منو یا دکمه نوار ابزار مورد نظر هایلایت شد، دکمه بازگشت، Enter،\n' + + ' یا نوار Space را فشار دهید تا مورد را اجرا کنید.\n' + + '\n' + + '

    پیمایش در کادرهای گفتگوی بدون زبانه

    \n' + + '\n' + + '

    در کادرهای گفتگوی بدون زبانه، وقتی کادر گفتگو باز می‌شود، اولین جزء تعاملی متمرکز می‌شود.

    \n' + + '\n' + + '

    با فشردن Tab یا Shift+Tab، بین اجزای کادر گفتگوی تعاملی پیمایش کنید.

    \n' + + '\n' + + '

    پیمایش کادرهای گفتگوی زبانه‌دار

    \n' + + '\n' + + '

    در کادرهای گفتگوی زبانه‌دار، وقتی کادر گفتگو باز می‌شود، اولین دکمه در منوی زبانه متمرکز می‌شود.

    \n' + + '\n' + + '

    با فشردن Tab یا\n' + + ' Shift+Tab، بین اجزای تعاملی این زبانه کادر گفتگو پیمایش کنید.

    \n' + + '\n' + + '

    با دادن تمرکز به منوی زبانه و سپس فشار دادن کلید جهت‌نمای\n' + + ' مناسب برای چرخش میان زبانه‌های موجود، به زبانه کادر گفتگوی دیگری بروید.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/fi.js b/public/js/tinymce/plugins/help/js/i18n/keynav/fi.js new file mode 100644 index 000000000..319074ec6 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/fi.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.fi', +'

    Näppäimistönavigoinnin aloittaminen

    \n' + + '\n' + + '
    \n' + + '
    Siirrä kohdistus valikkopalkkiin
    \n' + + '
    Windows tai Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Siirrä kohdistus työkalupalkkiin
    \n' + + '
    Windows tai Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Siirrä kohdistus alatunnisteeseen
    \n' + + '
    Windows tai Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Siirrä kohdistus kontekstuaaliseen työkalupalkkiin
    \n' + + '
    Windows, Linux tai macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Navigointi aloitetaan ensimmäisestä käyttöliittymän kohteesta, joka joko korostetaan tai alleviivataan, jos\n' + + ' kyseessä on Alatunniste-elementin polun ensimmäinen kohde.

    \n' + + '\n' + + '

    Käyttöliittymän eri osien välillä navigointi

    \n' + + '\n' + + '

    Paina sarkainnäppäintä siirtyäksesi käyttöliittymän osasta seuraavaan.

    \n' + + '\n' + + '

    Jos haluat siirtyä edelliseen käyttöliittymän osaan, paina Shift+sarkainnäppäin.

    \n' + + '\n' + + '

    Sarkainnäppäin siirtää sinua näissä käyttöliittymän osissa tässä järjestyksessä:\n' + + '\n' + + '

      \n' + + '
    1. Valikkopalkki
    2. \n' + + '
    3. Työkalupalkin ryhmät
    4. \n' + + '
    5. Sivupalkki
    6. \n' + + '
    7. Elementin polku alatunnisteessa
    8. \n' + + '
    9. Sanalaskurin vaihtopainike alatunnisteessa
    10. \n' + + '
    11. Brändäyslinkki alatunnisteessa
    12. \n' + + '
    13. Editorin koon muuttamisen kahva alatunnisteessa
    14. \n' + + '
    \n' + + '\n' + + '

    Jos jotakin käyttöliittymän osaa ei ole, se ohitetaan.

    \n' + + '\n' + + '

    Jos kohdistus on siirretty alatunnisteeseen näppäimistönavigoinnilla eikä sivupalkkia ole näkyvissä, Shift+sarkainnäppäin\n' + + ' siirtää kohdistuksen työkalupalkin ensimmäiseen ryhmään, eikä viimeiseen.\n' + + '\n' + + '

    Käyttöliittymän eri osien sisällä navigointi

    \n' + + '\n' + + '

    Paina nuolinäppäimiä siirtyäksesi käyttöliittymäelementistä seuraavaan.

    \n' + + '\n' + + '

    Vasen- ja Oikea-nuolinäppäimet

    \n' + + '\n' + + '
      \n' + + '
    • siirtävät sinua valikkopalkin valikoiden välillä.
    • \n' + + '
    • avaavat valikon alavalikon.
    • \n' + + '
    • siirtävät sinua työkalupalkin ryhmän painikkeiden välillä.
    • \n' + + '
    • siirtävät sinua kohteiden välillä alatunnisteen elementin polussa.
    • \n' + + '
    \n' + + '\n' + + '

    Alas- ja Ylös-nuolinäppäimet\n' + + '\n' + + '

      \n' + + '
    • siirtävät sinua valikon valikkokohteiden välillä.
    • \n' + + '
    • siirtävät sinua työkalupalkin ponnahdusvalikon kohteiden välillä.
    • \n' + + '
    \n' + + '\n' + + '

    Nuolinäppäimet siirtävät sinua käyttöliittymän korostetun osan sisällä syklissä.

    \n' + + '\n' + + '

    Paina Esc-näppäintä sulkeaksesi avoimen valikon, avataksesi alavalikon tai avataksesi ponnahdusvalikon.\n' + + '\n' + + '

    Jos kohdistus on käyttöliittymän tietyn osion ylälaidassa, Esc-näppäimen painaminen\n' + + ' poistuu myös näppäimistönavigoinnista kokonaan.

    \n' + + '\n' + + '

    Suorita valikkokohde tai työkalupalkin painike

    \n' + + '\n' + + '

    Kun haluamasi valikkokohde tai työkalupalkin painike on korostettuna, paina Return-, Enter-\n' + + ' tai välilyöntinäppäintä suorittaaksesi kohteen.\n' + + '\n' + + '

    Välilehdittömissä valintaikkunoissa navigointi

    \n' + + '\n' + + '

    Kun välilehdetön valintaikkuna avautuu, kohdistus siirtyy sen ensimmäiseen interaktiiviseen komponenttiin.

    \n' + + '\n' + + '

    Voit siirtyä valintaikkunan interaktiivisten komponenttien välillä painamalla sarkainnäppäintä tai Shift+sarkainnäppäin.

    \n' + + '\n' + + '

    Välilehdellisissä valintaikkunoissa navigointi

    \n' + + '\n' + + '

    Kun välilehdellinen valintaikkuna avautuu, kohdistus siirtyy välilehtivalikon ensimmäiseen painikkeeseen.

    \n' + + '\n' + + '

    Voit siirtyä valintaikkunan välilehden interaktiivisen komponenttien välillä painamalla sarkainnäppäintä tai\n' + + ' Shift+sarkainnäppäin.

    \n' + + '\n' + + '

    Voit siirtyä valintaikkunan toiseen välilehteen siirtämällä kohdistuksen välilehtivalikkoon ja painamalla sopivaa nuolinäppäintä\n' + + ' siirtyäksesi käytettävissä olevien välilehtien välillä syklissä.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/fr_FR.js b/public/js/tinymce/plugins/help/js/i18n/keynav/fr_FR.js new file mode 100644 index 000000000..f8e208d0f --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/fr_FR.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.fr_FR', +'

    Débuter la navigation au clavier

    \n' + + '\n' + + '
    \n' + + '
    Cibler la barre du menu
    \n' + + '
    Windows ou Linux : Alt+F9
    \n' + + '
    macOS : ⌥F9
    \n' + + "
    Cibler la barre d'outils
    \n" + + '
    Windows ou Linux : Alt+F10
    \n' + + '
    macOS : ⌥F10
    \n' + + '
    Cibler le pied de page
    \n' + + '
    Windows ou Linux : Alt+F11
    \n' + + '
    macOS : ⌥F11
    \n' + + "
    Cibler une barre d'outils contextuelle
    \n" + + '
    Windows, Linux ou macOS : Ctrl+F9\n' + + '
    \n' + + '\n' + + "

    La navigation débutera sur le premier élément de l'interface utilisateur, qui sera mis en surbrillance ou bien souligné dans le cas du premier élément du\n" + + " chemin d'éléments du pied de page.

    \n" + + '\n' + + "

    Naviguer entre les sections de l'interface utilisateur

    \n" + + '\n' + + "

    Pour passer d'une section de l'interface utilisateur à la suivante, appuyez sur Tabulation.

    \n" + + '\n' + + "

    Pour passer d'une section de l'interface utilisateur à la précédente, appuyez sur Maj+Tabulation.

    \n" + + '\n' + + "

    L'ordre de Tabulation de ces sections de l'interface utilisateur est le suivant :\n" + + '\n' + + '

      \n' + + '
    1. Barre du menu
    2. \n' + + "
    3. Chaque groupe de barres d'outils
    4. \n" + + '
    5. Barre latérale
    6. \n' + + "
    7. Chemin d'éléments du pied de page
    8. \n" + + "
    9. Bouton d'activation du compteur de mots dans le pied de page
    10. \n" + + '
    11. Lien de marque dans le pied de page
    12. \n' + + "
    13. Poignée de redimensionnement de l'éditeur dans le pied de page
    14. \n" + + '
    \n' + + '\n' + + "

    Si une section de l'interface utilisateur n'est pas présente, elle sera ignorée.

    \n" + + '\n' + + "

    Si le pied de page comporte un ciblage par navigation au clavier et qu'il n'y a aucune barre latérale visible, appuyer sur Maj+Tabulation\n" + + " déplace le ciblage vers le premier groupe de barres d'outils et non le dernier.\n" + + '\n' + + "

    Naviguer au sein des sections de l'interface utilisateur

    \n" + + '\n' + + "

    Pour passer d'un élément de l'interface utilisateur au suivant, appuyez sur la Flèche appropriée.

    \n" + + '\n' + + '

    Les touches fléchées Gauche et Droite

    \n' + + '\n' + + '
      \n' + + '
    • se déplacent entre les menus de la barre des menus.
    • \n' + + "
    • ouvrent un sous-menu au sein d'un menu.
    • \n" + + "
    • se déplacent entre les boutons d'un groupe de barres d'outils.
    • \n" + + "
    • se déplacent entre les éléments du chemin d'éléments du pied de page.
    • \n" + + '
    \n' + + '\n' + + '

    Les touches fléchées Bas et Haut\n' + + '\n' + + '

      \n' + + "
    • se déplacent entre les éléments de menu au sein d'un menu.
    • \n" + + "
    • se déplacent entre les éléments au sein d'un menu contextuel de barre d'outils.
    • \n" + + '
    \n' + + '\n' + + "

    Les Flèches parcourent la section de l'interface utilisateur ciblée.

    \n" + + '\n' + + '

    Pour fermer un menu ouvert, un sous-menu ouvert ou un menu contextuel ouvert, appuyez sur Echap.\n' + + '\n' + + "

    Si l'actuel ciblage se trouve en « haut » d'une section spécifique de l'interface utilisateur, appuyer sur Echap permet également de quitter\n" + + ' entièrement la navigation au clavier.

    \n' + + '\n' + + "

    Exécuter un élément de menu ou un bouton de barre d'outils

    \n" + + '\n' + + "

    Lorsque l'élément de menu ou le bouton de barre d'outils désiré est mis en surbrillance, appuyez sur la touche Retour arrière, Entrée\n" + + " ou la Barre d'espace pour exécuter l'élément.\n" + + '\n' + + '

    Naviguer au sein de dialogues sans onglets

    \n' + + '\n' + + "

    Dans les dialogues sans onglets, le premier composant interactif est ciblé lorsque le dialogue s'ouvre.

    \n" + + '\n' + + '

    Naviguez entre les composants du dialogue interactif en appuyant sur Tabulation ou Maj+Tabulation.

    \n' + + '\n' + + '

    Naviguer au sein de dialogues avec onglets

    \n' + + '\n' + + "

    Dans les dialogues avec onglets, le premier bouton du menu de l'onglet est ciblé lorsque le dialogue s'ouvre.

    \n" + + '\n' + + '

    Naviguez entre les composants interactifs de cet onglet de dialogue en appuyant sur Tabulation ou\n' + + ' Maj+Tabulation.

    \n' + + '\n' + + "

    Passez à un autre onglet de dialogue en ciblant le menu de l'onglet et en appuyant sur la Flèche\n" + + ' appropriée pour parcourir les onglets disponibles.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/he_IL.js b/public/js/tinymce/plugins/help/js/i18n/keynav/he_IL.js new file mode 100644 index 000000000..37876d5a8 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/he_IL.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.he_IL', +'

    התחל ניווט במקלדת

    \n' + + '\n' + + '
    \n' + + '
    התמקד בשורת התפריטים
    \n' + + '
    Windows או Linux:‏ Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    העבר מיקוד לסרגל הכלים
    \n' + + '
    Windows או Linux:‏ Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    העבר מיקוד לכותרת התחתונה
    \n' + + '
    Windows או Linux:‏ Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    העבר מיקוד לסרגל כלים הקשרי
    \n' + + '
    Windows‏, Linux או macOS:‏ Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    הניווט יתחיל ברכיב הראשון במשך, שיודגש או שיהיה מתחתיו קו תחתון במקרה של הפריט הראשון\n' + + ' הנתיב של רכיב הכותרת התחתונה.

    \n' + + '\n' + + '

    עבור בין מקטעים במסך

    \n' + + '\n' + + '

    כדי לעבור בין המקטעים במסך, הקש Tab.

    \n' + + '\n' + + '

    כדי לעבור למקטע הקודם במסך, הקש Shift+Tab.

    \n' + + '\n' + + '

    הסדר מבחינת מקש Tab של הרכיבים במסך:\n' + + '\n' + + '

      \n' + + '
    1. שורת התפריטים
    2. \n' + + '
    3. כל קבוצה בסרגל הכלים
    4. \n' + + '
    5. הסרגל הצידי
    6. \n' + + '
    7. נתיב של רכיב בכותרת התחתונה
    8. \n' + + '
    9. לחצן לספירת מילים בכותרת התחתונה
    10. \n' + + '
    11. קישור של המותג בכותרת התחתונה
    12. \n' + + '
    13. ידית לשינוי גודל עבור העורך בכותרת התחתונה
    14. \n' + + '
    \n' + + '\n' + + '

    אם רכיב כלשהו במסך לא מופיע, המערכת תדלג עליו.

    \n' + + '\n' + + '

    אם בכותרת התחתונה יש מיקוד של ניווט במקלדת, ולא מופיע סרגל בצד, יש להקיש Shift+Tab\n' + + ' מעביר את המיקוד לקבוצה הראשונה בסרגל הכלים, לא האחרונה.\n' + + '\n' + + '

    עבור בתוך מקטעים במסך

    \n' + + '\n' + + '

    כדי לעבור מרכיב אחד לרכיב אחר במסך, הקש על מקש החץ המתאים.

    \n' + + '\n' + + '

    מקשי החיצים שמאלה וימינה

    \n' + + '\n' + + '
      \n' + + '
    • עבור בין תפריטים בשורת התפריטים.
    • \n' + + '
    • פתח תפריט משני בתפריט.
    • \n' + + '
    • עבור בין לחצנים בקבוצה בסרגל הכלים.
    • \n' + + '
    • עבור בין פריטים ברכיב בכותרת התחתונה.
    • \n' + + '
    \n' + + '\n' + + '

    מקשי החיצים למטה ולמעלה\n' + + '\n' + + '

      \n' + + '
    • עבור בין פריטים בתפריט.
    • \n' + + '
    • עבור בין פריטים בחלון הקובץ של סרגל הכלים.
    • \n' + + '
    \n' + + '\n' + + '

    מקשי החצים משתנים בתוך המקטע במסך שעליו נמצא המיקוד.

    \n' + + '\n' + + '

    כדי לסגור תפריט פתוח, תפריט משני פתוח או חלון קופץ, הקש על Esc.\n' + + '\n' + + "

    אם המיקוד הוא על החלק 'העליון' של מקטע מסוים במסך, הקשה על Esc מביאה גם ליציאה\n" + + ' מהניווט במקלדת לחלוטין.

    \n' + + '\n' + + '

    הפעל פריט בתפריט או לחצן בסרגל הכלים

    \n' + + '\n' + + '

    כאשר הפריט הרצוי בתפריט או הלחצן בסרגל הכלים מודגשים, הקש על Return, Enter,\n' + + ' או על מקש הרווח כדי להפעיל את הפריט.\n' + + '\n' + + '

    ניווט בחלונות דו-שיח בלי כרטיסיות

    \n' + + '\n' + + '

    בחלונות דו-שיח בלי כרטיסיות, הרכיב האינטראקטיבי הראשון מקבל את המיקוד כאשר החלון נפתח.

    \n' + + '\n' + + '

    עבור בין רכיבים אינטראקטיביים בחלון על ידי הקשה על Tab או Shift+Tab.

    \n' + + '\n' + + '

    ניווט בחלונות דו-שיח עם כרטיסיות

    \n' + + '\n' + + '

    בחלונות דו-שיח עם כרטיסיות, הלחצן הראשון בתפריט מקבל את המיקוד כאשר החלון נפתח.

    \n' + + '\n' + + '

    עבור בין רכיבים אינטראקטיביים בחלון על ידי הקשה על Tab או\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    עבור לכרטיסיה אחרת בחלון על ידי העברת המיקוד לתפריט הכרטיסיות והקשה על החץהמתאים\n' + + ' כדי לעבור בין הכרטיסיות הזמינות.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/hi.js b/public/js/tinymce/plugins/help/js/i18n/keynav/hi.js new file mode 100644 index 000000000..584085aaa --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/hi.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.hi', +'

    कीबोर्ड नेविगेशन शुरू करें

    \n' + + '\n' + + '
    \n' + + '
    मेन्यू बार पर फ़ोकस करें
    \n' + + '
    Windows या Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    टूलबार पर फ़ोकस करें
    \n' + + '
    Windows या Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    फ़ुटर पर फ़ोकस करें
    \n' + + '
    Windows या Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    प्रासंगिक टूलबार पर फ़ोकस करें
    \n' + + '
    Windows, Linux या macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    नेविगेशन पहले UI आइटम पर शुरू होगा, जिसे हाइलाइट किया जाएगा या पहले आइटम के मामले में फ़ुटर तत्व पथ में\n' + + ' रेखांकित किया जाएगा।

    \n' + + '\n' + + '

    UI सेक्शन के बीच नेविगेट करें

    \n' + + '\n' + + '

    एक UI सेक्शन से दूसरे सेक्शन में जाने के लिए, Tab दबाएं।

    \n' + + '\n' + + '

    एक UI सेक्शन से पिछले सेक्शन में जाने के लिए, Shift+Tab दबाएं।

    \n' + + '\n' + + '

    इन UI सेक्शन का Tab क्रम नीचे दिया गया है:\n' + + '\n' + + '

      \n' + + '
    1. मेन्यू बार
    2. \n' + + '
    3. प्रत्येक टूलबार समूह
    4. \n' + + '
    5. साइडबार
    6. \n' + + '
    7. फ़ुटर में तत्व पथ
    8. \n' + + '
    9. फ़ुटर में शब्द गणना टॉगल बटन
    10. \n' + + '
    11. फ़ुटर में ब्रांडिंग लिंक
    12. \n' + + '
    13. फ़ुटर में संपादक का आकार बदलने का हैंडल
    14. \n' + + '
    \n' + + '\n' + + '

    अगर कोई UI सेक्शन मौजूद नहीं है, तो उसे छोड़ दिया जाता है।

    \n' + + '\n' + + '

    अगर फ़ुटर में कीबोर्ड नेविगेशन फ़ोकस है, और कोई दिखा देने वाला साइडबार नहीं है, तो Shift+Tab दबाने से\n' + + ' फ़ोकस पहले टूलबार समूह पर चला जाता है, पिछले पर नहीं।\n' + + '\n' + + '

    UI सेक्शन के भीतर नेविगेट करें

    \n' + + '\n' + + '

    एक UI तत्व से दूसरे में जाने के लिए उपयुक्त ऐरो कुंजी दबाएं।

    \n' + + '\n' + + '

    बाएं और दाएं ऐरो कुंजियां

    \n' + + '\n' + + '
      \n' + + '
    • मेन्यू बार में मेन्यू के बीच ले जाती हैं।
    • \n' + + '
    • मेन्यू में एक सब-मेन्यू खोलें।
    • \n' + + '
    • टूलबार समूह में बटनों के बीच ले जाएं।
    • \n' + + '
    • फ़ुटर के तत्व पथ में आइटम के बीच ले जाएं।
    • \n' + + '
    \n' + + '\n' + + '

    नीचे और ऊपर ऐरो कुंजियां\n' + + '\n' + + '

      \n' + + '
    • मेन्यू में मेन्यू आइटम के बीच ले जाती हैं।
    • \n' + + '
    • टूलबार पॉप-अप मेन्यू में आइटम के बीच ले जाएं।
    • \n' + + '
    \n' + + '\n' + + '

    फ़ोकस वाले UI सेक्शन के भीतर ऐरो कुंजियां चलाती रहती हैं।

    \n' + + '\n' + + '

    कोई खुला मेन्यू, कोई खुला सब-मेन्यू या कोई खुला पॉप-अप मेन्यू बंद करने के लिए Esc कुंजी दबाएं।\n' + + '\n' + + "

    अगर मौजूदा फ़ोकस किसी विशेष UI सेक्शन के 'शीर्ष' पर है, तो Esc कुंजी दबाने से भी\n" + + ' कीबोर्ड नेविगेशन पूरी तरह से बाहर हो जाता है।

    \n' + + '\n' + + '

    मेन्यू आइटम या टूलबार बटन निष्पादित करें

    \n' + + '\n' + + '

    जब वांछित मेन्यू आइटम या टूलबार बटन हाइलाइट किया जाता है, तो आइटम को निष्पादित करने के लिए Return, Enter,\n' + + ' या Space bar दबाएं।\n' + + '\n' + + '

    गैर-टैब वाले डायलॉग पर नेविगेट करें

    \n' + + '\n' + + '

    गैर-टैब वाले डायलॉग में, डायलॉग खुलने पर पहला इंटरैक्टिव घटक फ़ोकस लेता है।

    \n' + + '\n' + + '

    Tab or Shift+Tab दबाकर इंटरैक्टिव डायलॉग घटकों के बीच नेविगेट करें।

    \n' + + '\n' + + '

    टैब किए गए डायलॉग पर नेविगेट करें

    \n' + + '\n' + + '

    टैब किए गए डायलॉग में, डायलॉग खुलने पर टैब मेन्यू में पहला बटन फ़ोकस लेता है।

    \n' + + '\n' + + '

    इस डायलॉग टैब के इंटरैक्टिव घटकों के बीच नेविगेट करने के लिए Tab या\n' + + ' Shift+Tab दबाएं।

    \n' + + '\n' + + '

    टैब मेन्यू को फ़ोकस देकर और फिर उपलब्ध टैब में के बीच जाने के लिए उपयुक्त ऐरो\n' + + ' कुंजी दबाकर दूसरे डायलॉग टैब पर स्विच करें।

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/hr.js b/public/js/tinymce/plugins/help/js/i18n/keynav/hr.js new file mode 100644 index 000000000..3c1f833ab --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/hr.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.hr', +'

    Početak navigacije na tipkovnici

    \n' + + '\n' + + '
    \n' + + '
    Fokusiranje trake izbornika
    \n' + + '
    Windows ili Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Fokusiranje alatne trake
    \n' + + '
    Windows ili Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Fokusiranje podnožja
    \n' + + '
    Windows ili Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Fokusiranje kontekstne alatne trake
    \n' + + '
    Windows, Linux ili macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Navigacija će započeti kod prve stavke na korisničkom sučelju, koja će biti istaknuta ili podcrtana ako se radi o prvoj stavci u\n' + + ' putu elementa u podnožju.

    \n' + + '\n' + + '

    Navigacija između dijelova korisničkog sučelja

    \n' + + '\n' + + '

    Za pomicanje s jednog dijela korisničkog sučelja na drugi pritisnite tabulator.

    \n' + + '\n' + + '

    Za pomicanje s jednog dijela korisničkog sučelja na prethodni pritisnite Shift + tabulator.

    \n' + + '\n' + + '

    Ovo je redoslijed pomicanja tabulatora po dijelovima korisničkog sučelja:\n' + + '\n' + + '

      \n' + + '
    1. Traka izbornika
    2. \n' + + '
    3. Pojedinačne grupe na alatnoj traci
    4. \n' + + '
    5. Bočna traka
    6. \n' + + '
    7. Put elemenata u podnožju
    8. \n' + + '
    9. Gumb za pomicanje po broju riječi u podnožju
    10. \n' + + '
    11. Veza na brand u podnožju
    12. \n' + + '
    13. Značajka za promjenu veličine alata za uređivanje u podnožju
    14. \n' + + '
    \n' + + '\n' + + '

    Ako neki dio korisničkog sučelja nije naveden, on se preskače.

    \n' + + '\n' + + '

    Ako u podnožju postoji fokus za navigaciju na tipkovnici, a nema vidljive bočne trake, pritiskom na Shift + tabulator\n' + + ' fokus se prebacuje na prvu skupinu na alatnoj traci, ne na zadnju.\n' + + '\n' + + '

    Navigacija unutar dijelova korisničkog sučelja

    \n' + + '\n' + + '

    Za pomicanje s jednog elementa korisničkog sučelja na drugi pritisnite tipku s odgovarajućom strelicom.

    \n' + + '\n' + + '

    Tipke s lijevom i desnom strelicom

    \n' + + '\n' + + '
      \n' + + '
    • služe za pomicanje između izbornika na alatnoj traci.
    • \n' + + '
    • otvaraju podizbornik unutar izbornika.
    • \n' + + '
    • služe za pomicanje između gumba unutar skupina na alatnoj traci.
    • \n' + + '
    • služe za pomicanje između stavki na elementu puta u podnožju.
    • \n' + + '
    \n' + + '\n' + + '

    Tipke s donjom i gornjom strelicom\n' + + '\n' + + '

      \n' + + '
    • služe za pomicanje između stavki unutar izbornika.
    • \n' + + '
    • služe za pomicanje između stavki na alatnoj traci skočnog izbornika.
    • \n' + + '
    \n' + + '\n' + + '

    Tipkama strelica kružno se pomičete unutar dijela korisničkog sučelja koji je u fokusu.

    \n' + + '\n' + + '

    Za zatvaranje otvorenog izbornika, otvorenog podizbornika ili otvorenog skočnog izbornika pritisnite tipku Esc.\n' + + '\n' + + '

    Ako je fokus trenutačno postavljen na vrh pojedinačnog dijela korisničkog sučelja, pritiskom na tipku Esc također\n' + + ' u potpunosti zatvarate navigaciju na tipkovnici.

    \n' + + '\n' + + '

    Izvršavanje radnji putem stavki izbornika ili gumba na alatnoj traci

    \n' + + '\n' + + '

    Nakon što se istakne stavka izbornika ili gumb na alatnoj traci s radnjom koju želite izvršiti, pritisnite tipku Return, Enter\n' + + ' ili razmak da biste pokrenuli željenu radnju.\n' + + '\n' + + '

    Navigacija dijaloškim okvirima izvan kartica

    \n' + + '\n' + + '

    Prilikom otvaranja dijaloških okvira izvan kartica fokus se nalazi na prvoj interaktivnoj komponenti.

    \n' + + '\n' + + '

    Navigaciju između interaktivnih dijaloških komponenata vršite pritiskom na tabulator ili Shift + tabulator.

    \n' + + '\n' + + '

    Navigacija dijaloškim okvirima u karticama

    \n' + + '\n' + + '

    Prilikom otvaranja dijaloških okvira u karticama fokus se nalazi na prvom gumbu u izborniku unutar kartice.

    \n' + + '\n' + + '

    Navigaciju između interaktivnih komponenata dijaloškog okvira u kartici vršite pritiskom na tabulator ili\n' + + ' Shift + tabulator.

    \n' + + '\n' + + '

    Na karticu s drugim dijaloškim okvirom možete se prebaciti tako da stavite fokus na izbornik kartice pa pritisnete tipku s odgovarajućom strelicom\n' + + ' za kružno pomicanje između dostupnih kartica.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/hu_HU.js b/public/js/tinymce/plugins/help/js/i18n/keynav/hu_HU.js new file mode 100644 index 000000000..2791e151c --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/hu_HU.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.hu_HU', +'

    Billentyűzetes navigáció indítása

    \n' + + '\n' + + '
    \n' + + '
    Fókusz a menüsávra
    \n' + + '
    Windows és Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Fókusz az eszköztárra
    \n' + + '
    Windows és Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Fókusz a láblécre
    \n' + + '
    Windows és Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Fókusz egy környezetfüggő eszköztárra
    \n' + + '
    Windows, Linux és macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    A navigáció az első felhasználói felületi elemnél kezdődik, amelyet a rendszer kiemel, illetve aláhúz, amennyiben az az első elem\n' + + ' a lábléc elemútvonalán.

    \n' + + '\n' + + '

    Navigálás a felhasználói felület szakaszai között

    \n' + + '\n' + + '

    A felhasználói felület következő szakaszára váltáshoz nyomja meg a Tab billentyűt.

    \n' + + '\n' + + '

    A felhasználói felület előző szakaszára váltáshoz nyomja meg a Shift+Tab billentyűt.

    \n' + + '\n' + + '

    A Tab billentyűvel a felhasználói felület szakaszai között a következő sorrendben vált:\n' + + '\n' + + '

      \n' + + '
    1. Menüsáv
    2. \n' + + '
    3. Az egyes eszköztárcsoportok
    4. \n' + + '
    5. Oldalsáv
    6. \n' + + '
    7. Elemútvonal a láblécen
    8. \n' + + '
    9. Szószámátkapcsoló gomb a láblécen
    10. \n' + + '
    11. Márkalink a láblécen
    12. \n' + + '
    13. Szerkesztő átméretezési fogópontja a láblécen
    14. \n' + + '
    \n' + + '\n' + + '

    Ha a felhasználói felület valamelyik eleme nincs jelen, a rendszer kihagyja.

    \n' + + '\n' + + '

    Ha a billentyűzetes navigáció fókusza a láblécen van, és nincs látható oldalsáv, a Shift+Tab\n' + + ' billentyűkombináció lenyomásakor az első eszköztárcsoportra ugrik a fókusz, nem az utolsóra.\n' + + '\n' + + '

    Navigálás a felhasználói felület szakaszain belül

    \n' + + '\n' + + '

    A felhasználói felület következő elemére váltáshoz nyomja meg a megfelelő nyílbillentyűt.

    \n' + + '\n' + + '

    A bal és a jobb nyílgomb

    \n' + + '\n' + + '
      \n' + + '
    • a menüsávban a menük között vált.
    • \n' + + '
    • a menükben megnyit egy almenüt.
    • \n' + + '
    • az eszköztárcsoportban a gombok között vált.
    • \n' + + '
    • a lábléc elemútvonalán az elemek között vált.
    • \n' + + '
    \n' + + '\n' + + '

    A le és a fel nyílgomb\n' + + '\n' + + '

      \n' + + '
    • a menükben a menüpontok között vált.
    • \n' + + '
    • az eszköztár előugró menüjében az elemek között vált.
    • \n' + + '
    \n' + + '\n' + + '

    A nyílbillentyűk lenyomásával körkörösen lépkedhet a fókuszban lévő felhasználói felületi szakasz elemei között.

    \n' + + '\n' + + '

    A megnyitott menüket, almenüket és előugró menüket az Esc billentyűvel zárhatja be.\n' + + '\n' + + '

    Ha a fókusz az aktuális felületi elem „felső” részén van, az Esc billentyűvel az egész\n' + + ' billentyűzetes navigációból kilép.

    \n' + + '\n' + + '

    Menüpont vagy eszköztárgomb aktiválása

    \n' + + '\n' + + '

    Amikor a kívánt menüelem vagy eszköztárgomb van kijelölve, nyomja meg a Return, az Enter\n' + + ' vagy a Szóköz billentyűt az adott elem vagy gomb aktiválásához.\n' + + '\n' + + '

    Navigálás a lapokkal nem rendelkező párbeszédablakokban

    \n' + + '\n' + + '

    A lapokkal nem rendelkező párbeszédablakokban az első interaktív összetevő kapja a fókuszt, amikor a párbeszédpanel megnyílik.

    \n' + + '\n' + + '

    A párbeszédpanelek interaktív összetevői között a Tab vagy a Shift+Tab billentyűvel navigálhat.

    \n' + + '\n' + + '

    Navigálás a lapokkal rendelkező párbeszédablakokban

    \n' + + '\n' + + '

    A lapokkal rendelkező párbeszédablakokban a lapmenü első gombja kapja a fókuszt, amikor a párbeszédpanel megnyílik.

    \n' + + '\n' + + '

    A párbeszédpanel e lapjának interaktív összetevői között a Tab vagy\n' + + ' Shift+Tab billentyűvel navigálhat.

    \n' + + '\n' + + '

    A párbeszédablak másik lapjára úgy léphet, hogy a fókuszt a lapmenüre állítja, majd lenyomja a megfelelő nyílbillentyűt\n' + + ' a rendelkezésre álló lapok közötti lépkedéshez.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/id.js b/public/js/tinymce/plugins/help/js/i18n/keynav/id.js new file mode 100644 index 000000000..03cf417a7 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/id.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.id', +'

    Memulai navigasi keyboard

    \n' + + '\n' + + '
    \n' + + '
    Fokus pada bilah Menu
    \n' + + '
    Windows atau Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Fokus pada Bilah Alat
    \n' + + '
    Windows atau Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Fokus pada footer
    \n' + + '
    Windows atau Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Fokus pada bilah alat kontekstual
    \n' + + '
    Windows, Linux, atau macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Navigasi akan dimulai dari item pertama UI, yang akan disorot atau digarisbawahi di\n' + + ' alur elemen Footer.

    \n' + + '\n' + + '

    Berpindah antar-bagian UI

    \n' + + '\n' + + '

    Untuk berpindah dari satu bagian UI ke bagian berikutnya, tekan Tab.

    \n' + + '\n' + + '

    Untuk berpindah dari satu bagian UI ke bagian sebelumnya, tekan Shift+Tab.

    \n' + + '\n' + + '

    Urutan Tab bagian-bagian UI ini adalah:\n' + + '\n' + + '

      \n' + + '
    1. Bilah menu
    2. \n' + + '
    3. Tiap grup bilah alat
    4. \n' + + '
    5. Bilah sisi
    6. \n' + + '
    7. Alur elemen di footer
    8. \n' + + '
    9. Tombol aktifkan/nonaktifkan jumlah kata di footer
    10. \n' + + '
    11. Tautan merek di footer
    12. \n' + + '
    13. Pengatur pengubahan ukuran editor di footer
    14. \n' + + '
    \n' + + '\n' + + '

    Jika suatu bagian UI tidak ada, bagian tersebut dilewati.

    \n' + + '\n' + + '

    Jika fokus navigasi keyboard ada pada footer, tetapi tidak ada bilah sisi yang terlihat, menekan Shift+Tab\n' + + ' akan memindahkan fokus ke grup bilah alat pertama, bukan yang terakhir.\n' + + '\n' + + '

    Berpindah di dalam bagian-bagian UI

    \n' + + '\n' + + '

    Untuk berpindah dari satu elemen UI ke elemen berikutnya, tekan tombol Panah yang sesuai.

    \n' + + '\n' + + '

    Tombol panah Kiri dan Kanan untuk

    \n' + + '\n' + + '
      \n' + + '
    • berpindah-pindah antar-menu di dalam bilah menu.
    • \n' + + '
    • membuka sub-menu di dalam menu.
    • \n' + + '
    • berpindah-pindah antar-tombol di dalam grup bilah alat.
    • \n' + + '
    • berpindah-pindah antar-item di dalam alur elemen footer.
    • \n' + + '
    \n' + + '\n' + + '

    Tombol panah Bawah dan Atas untuk\n' + + '\n' + + '

      \n' + + '
    • berpindah-pindah antar-item menu di dalam menu.
    • \n' + + '
    • berpindah-pindah antar-item di dalam menu pop-up bilah alat.
    • \n' + + '
    \n' + + '\n' + + '

    Tombol Panah hanya bergerak di dalam bagian UI yang difokuskan.

    \n' + + '\n' + + '

    Untuk menutup menu, sub-menu, atau menu pop-up yang terbuka, tekan tombol Esc.\n' + + '\n' + + '

    Jika fokus sedang berada di ‘atas’ bagian UI tertentu, menekan tombol Esc juga dapat mengeluarkan fokus\n' + + ' dari seluruh navigasi keyboard.

    \n' + + '\n' + + '

    Menjalankan item menu atau tombol bilah alat

    \n' + + '\n' + + '

    Jika item menu atau tombol bilah alat yang diinginkan tersorot, tekan Return, Enter,\n' + + ' atau Spasi untuk menjalankan item.\n' + + '\n' + + '

    Berpindah dalam dialog tanpa tab

    \n' + + '\n' + + '

    Dalam dialog tanpa tab, fokus diarahkan pada komponen interaktif pertama saat dialog terbuka.

    \n' + + '\n' + + '

    Berpindah di antara komponen dalam dialog interaktif dengan menekan Tab atau Shift+Tab.

    \n' + + '\n' + + '

    Berpindah dalam dialog dengan tab

    \n' + + '\n' + + '

    Dalam dialog yang memiliki tab, fokus diarahkan pada tombol pertama di dalam menu saat dialog terbuka.

    \n' + + '\n' + + '

    Berpindah di antara komponen-komponen interaktif pada tab dialog ini dengan menekan Tab atau\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Beralih ke tab dialog lain dengan mengarahkan fokus pada menu tab lalu tekan tombol Panah\n' + + ' yang sesuai untuk berpindah ke berbagai tab yang tersedia.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/it.js b/public/js/tinymce/plugins/help/js/i18n/keynav/it.js new file mode 100644 index 000000000..450a34a61 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/it.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.it', +'

    Iniziare la navigazione tramite tastiera

    \n' + + '\n' + + '
    \n' + + '
    Impostare lo stato attivo per la barra dei menu
    \n' + + '
    Windows o Linux: ALT+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Impostare lo stato attivo per la barra degli strumenti
    \n' + + '
    Windows o Linux: ALT+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Impostare lo stato attivo per il piè di pagina
    \n' + + '
    Windows o Linux: ALT+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Impostare lo stato attivo per la barra degli strumenti contestuale
    \n' + + '
    Windows, Linux o macOS: CTRL+F9\n' + + '
    \n' + + '\n' + + "

    La navigazione inizierà dalla prima voce dell'interfaccia utente, che sarà evidenziata o sottolineata nel caso della prima voce\n" + + " nel percorso dell'elemento del piè di pagina.

    \n" + + '\n' + + "

    Navigare tra le sezioni dell'interfaccia utente

    \n" + + '\n' + + "

    Per passare da una sezione dell'interfaccia utente alla successiva, premere TAB.

    \n" + + '\n' + + "

    Per passare da una sezione dell'interfaccia utente alla precedente, premere MAIUSC+TAB.

    \n" + + '\n' + + "

    L'ordine di tabulazione di queste sezioni dell'interfaccia utente è:\n" + + '\n' + + '

      \n' + + '
    1. Barra dei menu
    2. \n' + + '
    3. Ogni gruppo di barre degli strumenti
    4. \n' + + '
    5. Barra laterale
    6. \n' + + "
    7. Percorso dell'elemento nel piè di pagina
    8. \n" + + '
    9. Pulsante di attivazione/disattivazione del conteggio delle parole nel piè di pagina
    10. \n' + + '
    11. Collegamento al marchio nel piè di pagina
    12. \n' + + "
    13. Quadratino di ridimensionamento dell'editor nel piè di pagina
    14. \n" + + '
    \n' + + '\n' + + "

    Se una sezione dell'interfaccia utente non è presente, viene saltata.

    \n" + + '\n' + + '

    Se il piè di pagina ha lo stato attivo per la navigazione tramite tastiera e non è presente alcuna barra laterale visibile, premendo MAIUSC+TAB\n' + + " si sposta lo stato attivo sul primo gruppo di barre degli strumenti, non sull'ultimo.\n" + + '\n' + + "

    Navigare all'interno delle sezioni dell'interfaccia utente

    \n" + + '\n' + + "

    Per passare da un elemento dell'interfaccia utente al successivo, premere il tasto freccia appropriato.

    \n" + + '\n' + + '

    I tasti freccia Sinistra e Destra

    \n' + + '\n' + + '
      \n' + + '
    • consentono di spostarsi tra i menu della barra dei menu.
    • \n' + + '
    • aprono un sottomenu in un menu.
    • \n' + + '
    • consentono di spostarsi tra i pulsanti di un gruppo di barre degli strumenti.
    • \n' + + "
    • consentono di spostarsi tra le voci nel percorso dell'elemento del piè di pagina.
    • \n" + + '
    \n' + + '\n' + + '

    I tasti freccia Giù e Su\n' + + '\n' + + '

      \n' + + '
    • consentono di spostarsi tra le voci di un menu.
    • \n' + + '
    • consentono di spostarsi tra le voci di un menu a comparsa della barra degli strumenti.
    • \n' + + '
    \n' + + '\n' + + "

    I tasti freccia consentono di spostarsi all'interno della sezione dell'interfaccia utente con stato attivo.

    \n" + + '\n' + + '

    Per chiudere un menu aperto, un sottomenu aperto o un menu a comparsa aperto, premere il tasto ESC.\n' + + '\n' + + "

    Se lo stato attivo corrente si trova nella parte superiore di una particolare sezione dell'interfaccia utente, premendo il tasto ESC si esce\n" + + ' completamente dalla navigazione tramite tastiera.

    \n' + + '\n' + + '

    Eseguire una voce di menu o un pulsante della barra degli strumenti

    \n' + + '\n' + + '

    Quando la voce di menu o il pulsante della barra degli strumenti desiderati sono evidenziati, premere il tasto diritorno a capo, il tasto Invio\n' + + ' o la barra spaziatrice per eseguirli.\n' + + '\n' + + '

    Navigare nelle finestre di dialogo non a schede

    \n' + + '\n' + + "

    Nelle finestre di dialogo non a schede, all'apertura della finestra di dialogo diventa attivo il primo componente interattivo.

    \n" + + '\n' + + '

    Per spostarsi tra i componenti interattivi della finestra di dialogo, premere TAB o MAIUSC+TAB.

    \n' + + '\n' + + '

    Navigare nelle finestre di dialogo a schede

    \n' + + '\n' + + "

    Nelle finestre di dialogo a schede, all'apertura della finestra di dialogo diventa attivo il primo pulsante del menu della scheda.

    \n" + + '\n' + + '

    Per spostarsi tra i componenti interattivi di questa scheda della finestra di dialogo, premere TAB o\n' + + ' MAIUSC+TAB.

    \n' + + '\n' + + "

    Per passare a un'altra scheda della finestra di dialogo, attivare il menu della scheda e premere il tasto freccia\n" + + ' appropriato per scorrere le schede disponibili.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/ja.js b/public/js/tinymce/plugins/help/js/i18n/keynav/ja.js new file mode 100644 index 000000000..19febc758 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/ja.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ja', +'

    キーボード ナビゲーションの開始

    \n' + + '\n' + + '
    \n' + + '
    メニュー バーをフォーカス
    \n' + + '
    Windows または Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    ツール バーをフォーカス
    \n' + + '
    Windows または Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    フッターをフォーカス
    \n' + + '
    Windows または Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    コンテキスト ツール バーをフォーカス
    \n' + + '
    Windows、Linux または macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    ナビゲーションは最初の UI 項目から開始され、強調表示されるか、フッターの要素パスにある最初の項目の場合は\n' + + ' 下線が引かれます。

    \n' + + '\n' + + '

    UI セクション間の移動

    \n' + + '\n' + + '

    次の UI セクションに移動するには、Tab を押します。

    \n' + + '\n' + + '

    前の UI セクションに移動するには、Shift+Tab を押します。

    \n' + + '\n' + + '

    これらの UI セクションの Tab の順序:\n' + + '\n' + + '

      \n' + + '
    1. メニュー バー
    2. \n' + + '
    3. 各ツール バー グループ
    4. \n' + + '
    5. サイド バー
    6. \n' + + '
    7. フッターの要素パス
    8. \n' + + '
    9. フッターの単語数切り替えボタン
    10. \n' + + '
    11. フッターのブランド リンク
    12. \n' + + '
    13. フッターのエディター サイズ変更ハンドル
    14. \n' + + '
    \n' + + '\n' + + '

    UI セクションが存在しない場合は、スキップされます。

    \n' + + '\n' + + '

    フッターにキーボード ナビゲーション フォーカスがあり、表示可能なサイド バーがない場合、Shift+Tab を押すと、\n' + + ' フォーカスが最後ではなく最初のツール バー グループに移動します。\n' + + '\n' + + '

    UI セクション内の移動

    \n' + + '\n' + + '

    次の UI 要素に移動するには、適切な矢印キーを押します。

    \n' + + '\n' + + '

    左矢印右矢印のキー

    \n' + + '\n' + + '
      \n' + + '
    • メニュー バーのメニュー間で移動します。
    • \n' + + '
    • メニュー内のサブメニューを開きます。
    • \n' + + '
    • ツール バー グループのボタン間で移動します。
    • \n' + + '
    • フッターの要素パスの項目間で移動します。
    • \n' + + '
    \n' + + '\n' + + '

    下矢印上矢印のキー\n' + + '\n' + + '

      \n' + + '
    • メニュー内のメニュー項目間で移動します。
    • \n' + + '
    • ツール バー ポップアップ メニュー内のメニュー項目間で移動します。
    • \n' + + '
    \n' + + '\n' + + '

    矢印キーで、フォーカスされた UI セクション内で循環します。

    \n' + + '\n' + + '

    開いたメニュー、開いたサブメニュー、開いたポップアップ メニューを閉じるには、Esc キーを押します。\n' + + '\n' + + '

    現在のフォーカスが特定の UI セクションの「一番上」にある場合、Esc キーを押すと\n' + + ' キーボード ナビゲーションも完全に閉じられます。

    \n' + + '\n' + + '

    メニュー項目またはツール バー ボタンの実行

    \n' + + '\n' + + '

    目的のメニュー項目やツール バー ボタンが強調表示されている場合、リターンEnter、\n' + + ' またはスペース キーを押して項目を実行します。\n' + + '\n' + + '

    タブのないダイアログの移動

    \n' + + '\n' + + '

    タブのないダイアログでは、ダイアログが開くと最初の対話型コンポーネントがフォーカスされます。

    \n' + + '\n' + + '

    Tab または Shift+Tab を押して、対話型ダイアログ コンポーネント間で移動します。

    \n' + + '\n' + + '

    タブ付きダイアログの移動

    \n' + + '\n' + + '

    タブ付きダイアログでは、ダイアログが開くとタブ メニューの最初のボタンがフォーカスされます。

    \n' + + '\n' + + '

    Tab または\n' + + ' Shift+Tab を押して、このダイアログ タブの対話型コンポーネント間で移動します。

    \n' + + '\n' + + '

    タブ メニューをフォーカスしてから適切な矢印キーを押して表示可能なタブを循環して、\n' + + ' 別のダイアログに切り替えます。

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/kk.js b/public/js/tinymce/plugins/help/js/i18n/keynav/kk.js new file mode 100644 index 000000000..dd6370f84 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/kk.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.kk', +'

    Пернетақта навигациясын бастау

    \n' + + '\n' + + '
    \n' + + '
    Мәзір жолағын фокустау
    \n' + + '
    Windows немесе Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Құралдар тақтасын фокустау
    \n' + + '
    Windows немесе Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Төменгі деректемені фокустау
    \n' + + '
    Windows немесе Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Мәтінмәндік құралдар тақтасын фокустау
    \n' + + '
    Windows, Linux немесе macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Навигация бөлектелетін немесе Төменгі деректеме элементінің жолындағы бірінші элемент жағдайында асты сызылатын\n' + + ' бірінші ПИ элементінен басталады.

    \n' + + '\n' + + '

    ПИ бөлімдері арасында навигациялау

    \n' + + '\n' + + '

    Бір ПИ бөлімінен келесісіне өту үшін Tab пернесін басыңыз.

    \n' + + '\n' + + '

    Бір ПИ бөлімінен алдыңғысына өту үшін Shift+Tab пернесін басыңыз.

    \n' + + '\n' + + '

    Осы ПИ бөлімдерінің Tab реті:\n' + + '\n' + + '

      \n' + + '
    1. Мәзір жолағы
    2. \n' + + '
    3. Әрбір құралдар тақтасы тобы
    4. \n' + + '
    5. Бүйірлік жолақ
    6. \n' + + '
    7. Төменгі деректемедегі элемент жолы
    8. \n' + + '
    9. Төменгі деректемедегі сөздер санын ауыстыру түймесі
    10. \n' + + '
    11. Төменгі деректемедегі брендингтік сілтеме
    12. \n' + + '
    13. Төменгі деректемедегі редактор өлшемін өзгерту тұтқасы
    14. \n' + + '
    \n' + + '\n' + + '

    ПИ бөлімі көрсетілмесе, ол өткізіп жіберіледі.

    \n' + + '\n' + + '

    Төменгі деректемеде пернетақта навигациясының фокусы болса және бүйірлік жолақ көрінбесе, Shift+Tab тіркесімін басу әрекеті\n' + + ' фокусты соңғысы емес, бірінші құралдар тақтасы тобына жылжытады.\n' + + '\n' + + '

    ПИ бөлімдерінде навигациялау

    \n' + + '\n' + + '

    Бір ПИ элементінен келесісіне өту үшін Arrow (Көрсеткі) пернесін басыңыз.

    \n' + + '\n' + + '

    Left (Сол жақ) және Right (Оң жақ) көрсеткі пернелері

    \n' + + '\n' + + '
      \n' + + '
    • мәзір жолағындағы мәзірлер арасында жылжыту.
    • \n' + + '
    • мәзірде ішкі мәзірді ашу.
    • \n' + + '
    • құралдар тақтасы тобындағы түймелер арасында жылжыту.
    • \n' + + '
    • төменгі деректеме элементінің жолындағы элементтер арасында жылжыту.
    • \n' + + '
    \n' + + '\n' + + '

    Down (Төмен) және Up (Жоғары) көрсеткі пернелері\n' + + '\n' + + '

      \n' + + '
    • мәзірдегі мәзір элементтері арасында жылжыту.
    • \n' + + '
    • құралдар тақтасының ашылмалы мәзіріндегі мәзір элементтері арасында жылжыту.
    • \n' + + '
    \n' + + '\n' + + '

    Фокусталған ПИ бөліміндегі Arrow (Көрсеткі) пернелерінің циклі.

    \n' + + '\n' + + '

    Ашық мәзірді жабу үшін ішкі мәзірді ашып немесе ашылмалы мәзірді ашып, Esc пернесін басыңыз.\n' + + '\n' + + '

    Ағымдағы фокус белгілі бір ПИ бөлімінің «үстінде» болса, Esc пернесін басу әрекеті пернетақта\n' + + ' навигациясын толығымен жабады.

    \n' + + '\n' + + '

    Мәзір элементін немесе құралдар тақтасы түймесін орындау

    \n' + + '\n' + + '

    Қажетті мәзір элементі немесе құралдар тақтасы түймесі бөлектелген кезде, элементті орындау үшін Return (Қайтару), Enter (Енгізу)\n' + + ' немесе Space bar (Бос орын) пернесін басыңыз.\n' + + '\n' + + '

    Белгіленбеген диалог терезелерін навигациялау

    \n' + + '\n' + + '

    Белгіленбеген диалог терезелерінде диалог терезесі ашылған кезде бірінші интерактивті құрамдас фокусталады.

    \n' + + '\n' + + '

    Tab немесе Shift+Tab пернесін басу арқылы интерактивті диалог терезесінің құрамдастары арасында навигациялаңыз.

    \n' + + '\n' + + '

    Белгіленген диалог терезелерін навигациялау

    \n' + + '\n' + + '

    Белгіленген диалог терезелерінде диалог терезесі ашылған кезде қойынды мәзіріндегі бірінші түйме фокусталады.

    \n' + + '\n' + + '

    Tab немесе\n' + + ' Shift+Tab пернесін басу арқылы осы диалог терезесі қойындысының интерактивті құрамдастары арасында навигациялаңыз.

    \n' + + '\n' + + '

    Қойынды мәзірінің фокусын беру арқылы басқа диалог терезесінің қойындысына ауысып, тиісті Arrow (Көрсеткі)\n' + + ' пернесін басу арқылы қолжетімді қойындылар арасында айналдыруға болады.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/ko_KR.js b/public/js/tinymce/plugins/help/js/i18n/keynav/ko_KR.js new file mode 100644 index 000000000..073592cd1 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/ko_KR.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ko_KR', +'

    키보드 탐색 시작

    \n' + + '\n' + + '
    \n' + + '
    메뉴 모음 포커스 표시
    \n' + + '
    Windows 또는 Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    도구 모음 포커스 표시
    \n' + + '
    Windows 또는 Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    푸터 포커스 표시
    \n' + + '
    Windows 또는 Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    컨텍스트 도구 모음에 포커스 표시
    \n' + + '
    Windows, Linux 또는 macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    첫 번째 UI 항목에서 탐색이 시작되며, 이때 첫 번째 항목이 강조 표시되거나 푸터 요소 경로에 있는\n' + + ' 경우 밑줄 표시됩니다.

    \n' + + '\n' + + '

    UI 섹션 간 탐색

    \n' + + '\n' + + '

    한 UI 섹션에서 다음 UI 섹션으로 이동하려면 Tab(탭)을 누릅니다.

    \n' + + '\n' + + '

    한 UI 섹션에서 이전 UI 섹션으로 돌아가려면 Shift+Tab(시프트+탭)을 누릅니다.

    \n' + + '\n' + + '

    이 UI 섹션의 Tab(탭) 순서는 다음과 같습니다.\n' + + '\n' + + '

      \n' + + '
    1. 메뉴 바
    2. \n' + + '
    3. 각 도구 모음 그룹
    4. \n' + + '
    5. 사이드바
    6. \n' + + '
    7. 푸터의 요소 경로
    8. \n' + + '
    9. 푸터의 단어 수 토글 버튼
    10. \n' + + '
    11. 푸터의 브랜딩 링크
    12. \n' + + '
    13. 푸터의 에디터 크기 변경 핸들
    14. \n' + + '
    \n' + + '\n' + + '

    UI 섹션이 없는 경우 건너뛰기합니다.

    \n' + + '\n' + + '

    푸터에 키보드 탐색 포커스가 있고 사이드바는 보이지 않는 경우 Shift+Tab(시프트+탭)을 누르면\n' + + ' 포커스 표시가 마지막이 아닌 첫 번째 도구 모음 그룹으로 이동합니다.\n' + + '\n' + + '

    UI 섹션 내 탐색

    \n' + + '\n' + + '

    한 UI 요소에서 다음 UI 요소로 이동하려면 적절한 화살표 키를 누릅니다.

    \n' + + '\n' + + '

    왼쪽오른쪽 화살표 키의 용도:

    \n' + + '\n' + + '
      \n' + + '
    • 메뉴 모음에서 메뉴 항목 사이를 이동합니다.
    • \n' + + '
    • 메뉴에서 하위 메뉴를 엽니다.
    • \n' + + '
    • 도구 모음 그룹에서 버튼 사이를 이동합니다.
    • \n' + + '
    • 푸터의 요소 경로에서 항목 간에 이동합니다.
    • \n' + + '
    \n' + + '\n' + + '

    아래 화살표 키의 용도:\n' + + '\n' + + '

      \n' + + '
    • 메뉴에서 메뉴 항목 사이를 이동합니다.
    • \n' + + '
    • 도구 모음 팝업 메뉴에서 메뉴 항목 사이를 이동합니다.
    • \n' + + '
    \n' + + '\n' + + '

    화살표 키는 포커스 표시 UI 섹션 내에서 순환됩니다.

    \n' + + '\n' + + '

    열려 있는 메뉴, 열려 있는 하위 메뉴 또는 열려 있는 팝업 메뉴를 닫으려면 Esc 키를 누릅니다.\n' + + '\n' + + "

    현재 포커스 표시가 특정 UI 섹션 '상단'에 있는 경우 이때도 Esc 키를 누르면\n" + + ' 키보드 탐색이 완전히 종료됩니다.

    \n' + + '\n' + + '

    메뉴 항목 또는 도구 모음 버튼 실행

    \n' + + '\n' + + '

    원하는 메뉴 항목 또는 도구 모음 버튼이 강조 표시되어 있을 때 Return(리턴), Enter(엔터),\n' + + ' 또는 Space bar(스페이스바)를 눌러 해당 항목을 실행합니다.\n' + + '\n' + + '

    탭이 없는 대화 탐색

    \n' + + '\n' + + '

    탭이 없는 대화의 경우, 첫 번째 대화형 요소가 포커스 표시된 상태로 대화가 열립니다.

    \n' + + '\n' + + '

    대화형 요소들 사이를 이동할 때는 Tab(탭) 또는 Shift+Tab(시프트+탭)을 누릅니다.

    \n' + + '\n' + + '

    탭이 있는 대화 탐색

    \n' + + '\n' + + '

    탭이 있는 대화의 경우, 탭 메뉴에서 첫 번째 버튼이 포커스 표시된 상태로 대화가 열립니다.

    \n' + + '\n' + + '

    이 대화 탭의 대화형 요소들 사이를 이동할 때는 Tab(탭) 또는\n' + + ' Shift+Tab(시프트+탭)을 누릅니다.

    \n' + + '\n' + + '

    다른 대화 탭으로 이동하려면 탭 메뉴를 포커스 표시한 다음 적절한 화살표\n' + + ' 키를 눌러 사용 가능한 탭들을 지나 원하는 탭으로 이동합니다.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/ms.js b/public/js/tinymce/plugins/help/js/i18n/keynav/ms.js new file mode 100644 index 000000000..579ab4935 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/ms.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ms', +'

    Mulakan navigasi papan kekunci

    \n' + + '\n' + + '
    \n' + + '
    Fokus bar Menu
    \n' + + '
    Windows atau Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Fokus Bar Alat
    \n' + + '
    Windows atau Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Fokus pengaki
    \n' + + '
    Windows atau Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Fokus bar alat kontekstual
    \n' + + '
    Windows, Linux atau macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Navigasi akan bermula pada item UI pertama, yang akan diserlahkan atau digaris bawah dalam saiz item pertama dalam\n' + + ' laluan elemen Pengaki.

    \n' + + '\n' + + '

    Navigasi antara bahagian UI

    \n' + + '\n' + + '

    Untuk bergerak dari satu bahagian UI ke yang seterusnya, tekan Tab.

    \n' + + '\n' + + '

    Untuk bergerak dari satu bahagian UI ke yang sebelumnya, tekan Shift+Tab.

    \n' + + '\n' + + '

    Tertib Tab bahagian UI ini ialah:\n' + + '\n' + + '

      \n' + + '
    1. Bar menu
    2. \n' + + '
    3. Setiap kumpulan bar alat
    4. \n' + + '
    5. Bar sisi
    6. \n' + + '
    7. Laluan elemen dalam pengaki
    8. \n' + + '
    9. Butang togol kiraan perkataan dalam pengaki
    10. \n' + + '
    11. Pautan penjenamaan dalam pengaki
    12. \n' + + '
    13. Pemegang saiz semula editor dalam pengaki
    14. \n' + + '
    \n' + + '\n' + + '

    Jika bahagian UI tidak wujud, ia dilangkau.

    \n' + + '\n' + + '

    Jika pengaki mempunyai fokus navigasi papan kekunci dan tiada bar sisi kelihatan, menekan Shift+Tab\n' + + ' akan mengalihkan fokus ke kumpulan bar alat pertama, bukannya yang terakhir.\n' + + '\n' + + '

    Navigasi dalam bahagian UI

    \n' + + '\n' + + '

    Untuk bergerak dari satu elemen UI ke yang seterusnya, tekan kekunci Anak Panah yang bersesuaian.

    \n' + + '\n' + + '

    Kekunci anak panah Kiri dan Kanan

    \n' + + '\n' + + '
      \n' + + '
    • bergerak antara menu dalam bar menu.
    • \n' + + '
    • membukan submenu dalam menu.
    • \n' + + '
    • bergerak antara butang dalam kumpulan bar alat.
    • \n' + + '
    • Laluan elemen dalam pengaki.
    • \n' + + '
    \n' + + '\n' + + '

    Kekunci anak panah Bawah dan Atas\n' + + '\n' + + '

      \n' + + '
    • bergerak antara item menu dalam menu.
    • \n' + + '
    • bergerak antara item dalam menu timbul bar alat.
    • \n' + + '
    \n' + + '\n' + + '

    Kekunci Anak Panah berkitar dalam bahagian UI difokuskan.

    \n' + + '\n' + + '

    Untuk menutup menu buka, submenu terbuka atau menu timbul terbuka, tekan kekunci Esc.\n' + + '\n' + + "

    Jika fokus semasa berada di bahagian 'atas' bahagian UI tertentu, menekan kekunci Esc juga akan keluar daripada\n" + + ' navigasi papan kekunci sepenuhnya.

    \n' + + '\n' + + '

    Laksanakan item menu atau butang bar alat

    \n' + + '\n' + + '

    Apabila item menu atau butang bar alat yang diinginkan diserlahkan, tekan Return, Enter,\n' + + ' atau bar Space untuk melaksanakan item.\n' + + '\n' + + '

    Navigasi ke dialog tidak bertab

    \n' + + '\n' + + '

    Dalam dialog tidak bertab, komponen interaksi pertama difokuskan apabila dialog dibuka.

    \n' + + '\n' + + '

    Navigasi antara komponen dialog interaktif dengan menekan Tab atau Shift+Tab.

    \n' + + '\n' + + '

    Navigasi ke dialog bertab

    \n' + + '\n' + + '

    Dalam dialog bertab, butang pertama dalam menu tab difokuskan apabila dialog dibuka.

    \n' + + '\n' + + '

    Navigasi antara komponen interaktif tab dialog ini dengan menekan Tab atau\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Tukar kepada tab dialog lain dengan memfokuskan menu tab, kemudian menekan kekunci Anak Panah yang bersesuaian\n' + + ' untuk berkitar menerusi tab yang tersedia.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/nb_NO.js b/public/js/tinymce/plugins/help/js/i18n/keynav/nb_NO.js new file mode 100644 index 000000000..f28db8f4f --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/nb_NO.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.nb_NO', +'

    Starte tastaturnavigering

    \n' + + '\n' + + '
    \n' + + '
    Utheve menylinjen
    \n' + + '
    Windows eller Linux: Alt + F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Utheve verktøylinjen
    \n' + + '
    Windows eller Linux: Alt + F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Utheve bunnteksten
    \n' + + '
    Windows eller Linux: Alt + F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Utheve en kontekstuell verktøylinje
    \n' + + '
    Windows, Linux eller macOS: Ctrl + F9\n' + + '
    \n' + + '\n' + + '

    Navigeringen starter ved det første grensesnittelementet, som utheves, eller understrekes når det gjelder det første elementet i\n' + + ' elementstien i bunnteksten.

    \n' + + '\n' + + '

    Navigere mellom grensesnittdeler

    \n' + + '\n' + + '

    Du kan bevege deg fra én grensesnittdel til den neste ved å trykke på tabulatortasten.

    \n' + + '\n' + + '

    Du kan bevege deg fra én grensesnittdel til den forrige ved å trykke på Shift + tabulatortasten.

    \n' + + '\n' + + '

    Rekkefølgen til tabulatortasten gjennom grensesnittdelene er:\n' + + '\n' + + '

      \n' + + '
    1. Menylinjen
    2. \n' + + '
    3. Hver gruppe på verktøylinjen
    4. \n' + + '
    5. Sidestolpen
    6. \n' + + '
    7. Elementstien i bunnteksten
    8. \n' + + '
    9. Veksleknappen for ordantall i bunnteksten
    10. \n' + + '
    11. Merkelenken i bunnteksten
    12. \n' + + '
    13. Skaleringshåndtaket for redigeringsprogrammet i bunnteksten
    14. \n' + + '
    \n' + + '\n' + + '

    Hvis en grensesnittdel ikke er til stede, blir den hoppet over.

    \n' + + '\n' + + '

    Hvis tastaturnavigeringen har uthevet bunnteksten og det ikke finnes en synlig sidestolpe, kan du trykke på Shift + tabulatortasten\n' + + ' for å flytte fokuset til den første gruppen på verktøylinjen i stedet for den siste.\n' + + '\n' + + '

    Navigere innenfor grensesnittdeler

    \n' + + '\n' + + '

    Du kan bevege deg fra ett grensesnittelement til det neste ved å trykke på den aktuelle piltasten.

    \n' + + '\n' + + '

    De venstre og høyre piltastene

    \n' + + '\n' + + '
      \n' + + '
    • beveger deg mellom menyer på menylinjen.
    • \n' + + '
    • åpner en undermeny i en meny.
    • \n' + + '
    • beveger deg mellom knapper i en gruppe på verktøylinjen.
    • \n' + + '
    • beveger deg mellom elementer i elementstien i bunnteksten.
    • \n' + + '
    \n' + + '\n' + + '

    Ned- og opp-piltastene\n' + + '\n' + + '

      \n' + + '
    • beveger deg mellom menyelementer i en meny.
    • \n' + + '
    • beveger deg mellom elementer i en hurtigmeny på verktøylinjen.
    • \n' + + '
    \n' + + '\n' + + '

    Med piltastene kan du bevege deg innenfor den uthevede grensesnittdelen.

    \n' + + '\n' + + '

    Du kan lukke en åpen meny, en åpen undermeny eller en åpen hurtigmeny ved å klikke på Esc-tasten.\n' + + '\n' + + '

    Hvis det øverste nivået i en grensesnittdel er uthevet, kan du ved å trykke på Esc også avslutte\n' + + ' tastaturnavigeringen helt.

    \n' + + '\n' + + '

    Utføre et menyelement eller en knapp på en verktøylinje

    \n' + + '\n' + + '

    Når det ønskede menyelementet eller verktøylinjeknappen er uthevet, trykker du på Retur, Enter,\n' + + ' eller mellomromstasten for å utføre elementet.\n' + + '\n' + + '

    Navigere i dialogbokser uten faner

    \n' + + '\n' + + '

    I dialogbokser uten faner blir den første interaktive komponenten uthevet når dialogboksen åpnes.

    \n' + + '\n' + + '

    Naviger mellom interaktive komponenter i dialogboksen ved å trykke på tabulatortasten eller Shift + tabulatortasten.

    \n' + + '\n' + + '

    Navigere i fanebaserte dialogbokser

    \n' + + '\n' + + '

    I fanebaserte dialogbokser blir den første knappen i fanemenyen uthevet når dialogboksen åpnes.

    \n' + + '\n' + + '

    Naviger mellom interaktive komponenter i fanen ved å trykke på tabulatortasten eller\n' + + ' Shift + tabulatortasten.

    \n' + + '\n' + + '

    Veksle til en annen fane i dialogboksen ved å utheve fanemenyen, og trykk deretter på den aktuelle piltasten\n' + + ' for å bevege deg mellom de tilgjengelige fanene.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/nl.js b/public/js/tinymce/plugins/help/js/i18n/keynav/nl.js new file mode 100644 index 000000000..99836a6b8 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/nl.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.nl', +'

    Toetsenbordnavigatie starten

    \n' + + '\n' + + '
    \n' + + '
    Focus op de menubalk instellen
    \n' + + '
    Windows of Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Focus op de werkbalk instellen
    \n' + + '
    Windows of Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Focus op de voettekst instellen
    \n' + + '
    Windows of Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Focus op een contextuele werkbalk instellen
    \n' + + '
    Windows, Linux of macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    De navigatie start bij het eerste UI-item, dat wordt gemarkeerd of onderstreept als het eerste item zich in\n' + + ' in het elementenpad van de voettekst bevindt.

    \n' + + '\n' + + '

    Navigeren tussen UI-secties

    \n' + + '\n' + + '

    Druk op Tab om naar de volgende UI-sectie te gaan.

    \n' + + '\n' + + '

    Druk op Shift+Tab om naar de vorige UI-sectie te gaan.

    \n' + + '\n' + + '

    De Tab-volgorde van deze UI-secties is:\n' + + '\n' + + '

      \n' + + '
    1. Menubalk
    2. \n' + + '
    3. Elke werkbalkgroep
    4. \n' + + '
    5. Zijbalk
    6. \n' + + '
    7. Elementenpad in de voettekst
    8. \n' + + '
    9. Wisselknop voor aantal woorden in de voettekst
    10. \n' + + '
    11. Merkkoppeling in de voettekst
    12. \n' + + '
    13. Greep voor het wijzigen van het formaat van de editor in de voettekst
    14. \n' + + '
    \n' + + '\n' + + '

    Als een UI-sectie niet aanwezig is, wordt deze overgeslagen.

    \n' + + '\n' + + '

    Als de focus van de toetsenbordnavigatie is ingesteld op de voettekst en er geen zichtbare zijbalk is, kun je op Shift+Tab drukken\n' + + ' om de focus naar de eerste werkbalkgroep in plaats van de laatste te verplaatsen.\n' + + '\n' + + '

    Navigeren binnen UI-secties

    \n' + + '\n' + + '

    Druk op de pijltjestoets om naar het betreffende UI-element te gaan.

    \n' + + '\n' + + '

    Met de pijltjestoetsen Links en Rechts

    \n' + + '\n' + + '
      \n' + + "
    • wissel je tussen menu's in de menubalk.
    • \n" + + '
    • open je een submenu in een menu.
    • \n' + + '
    • wissel je tussen knoppen in een werkbalkgroep.
    • \n' + + '
    • wissel je tussen items in het elementenpad in de voettekst.
    • \n' + + '
    \n' + + '\n' + + '

    Met de pijltjestoetsen Omlaag en Omhoog\n' + + '\n' + + '

      \n' + + '
    • wissel je tussen menu-items in een menu.
    • \n' + + '
    • wissel je tussen items in een werkbalkpop-upmenu.
    • \n' + + '
    \n' + + '\n' + + '

    Met de pijltjestoetsen wissel je binnen de UI-sectie waarop de focus is ingesteld.

    \n' + + '\n' + + '

    Druk op de toets Esc om een geopend menu, submenu of pop-upmenu te sluiten.\n' + + '\n' + + "

    Als de huidige focus is ingesteld 'bovenaan' een bepaalde UI-sectie, kun je op de toets Esc drukken\n" + + ' om de toetsenbordnavigatie af te sluiten.

    \n' + + '\n' + + '

    Een menu-item of werkbalkknop uitvoeren

    \n' + + '\n' + + '

    Als het gewenste menu-item of de gewenste werkbalkknop is gemarkeerd, kun je op Return, Enter\n' + + ' of de spatiebalk drukken om het item uit te voeren.\n' + + '\n' + + '

    Navigeren in dialoogvensters zonder tabblad

    \n' + + '\n' + + '

    Als een dialoogvenster zonder tabblad wordt geopend, wordt de focus ingesteld op het eerste interactieve onderdeel.

    \n' + + '\n' + + '

    Je kunt navigeren tussen interactieve onderdelen van een dialoogvenster door op Tab of Shift+Tab te drukken.

    \n' + + '\n' + + '

    Navigeren in dialoogvensters met tabblad

    \n' + + '\n' + + '

    Als een dialoogvenster met tabblad wordt geopend, wordt de focus ingesteld op de eerste knop in het tabbladmenu.

    \n' + + '\n' + + '

    Je kunt navigeren tussen interactieve onderdelen van dit tabblad van het dialoogvenster door op Tab of\n' + + ' Shift+Tab te drukken.

    \n' + + '\n' + + '

    Je kunt overschakelen naar een ander tabblad van het dialoogvenster door de focus in te stellen op het tabbladmenu en vervolgens op de juiste pijltjestoets\n' + + ' te drukken om tussen de beschikbare tabbladen te wisselen.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/pl.js b/public/js/tinymce/plugins/help/js/i18n/keynav/pl.js new file mode 100644 index 000000000..16704a00a --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/pl.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.pl', +'

    Początek nawigacji przy użyciu klawiatury

    \n' + + '\n' + + '
    \n' + + '
    Ustaw fokus na pasek menu
    \n' + + '
    Windows lub Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Ustaw fokus na pasek narzędzi
    \n' + + '
    Windows lub Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Ustaw fokus na sekcję Footer
    \n' + + '
    Windows lub Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Ustaw fokus na kontekstowy pasek narzędzi
    \n' + + '
    Windows, Linux lub macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Nawigacja zostanie rozpoczęta od pierwszego elementu interfejsu użytkownika, który jest podświetlony lub — w przypadku pierwszego elementu\n' + + ' w ścieżce elementów w sekcji Footer — podkreślony.

    \n' + + '\n' + + '

    Nawigacja pomiędzy sekcjami interfejsu użytkownika

    \n' + + '\n' + + '

    Aby przenieść się z danej sekcji interfejsu użytkownika do następnej, naciśnij Tab.

    \n' + + '\n' + + '

    Aby przenieść się z danej sekcji interfejsu użytkownika do poprzedniej, naciśnij Shift+Tab.

    \n' + + '\n' + + '

    Kolejność klawisza Tab w takich sekcjach interfejsu użytkownika jest następująca:\n' + + '\n' + + '

      \n' + + '
    1. Pasek menu
    2. \n' + + '
    3. Każda grupa na pasku narzędzi
    4. \n' + + '
    5. Pasek boczny
    6. \n' + + '
    7. Ścieżka elementów w sekcji Footer
    8. \n' + + '
    9. Przycisk przełączania liczby słów w sekcji Footer
    10. \n' + + '
    11. Łącze brandujące w sekcji Footer
    12. \n' + + '
    13. Uchwyt zmiany rozmiaru edytora w sekcji Footer
    14. \n' + + '
    \n' + + '\n' + + '

    Jeżeli nie ma sekcji interfejsu użytkownika, jest to pomijane.

    \n' + + '\n' + + '

    Jeżeli na sekcji Footer jest ustawiony fokus nawigacji przy użyciu klawiatury i nie ma widocznego paska bocznego, naciśnięcie Shift+Tab\n' + + ' przenosi fokus na pierwszą grupę paska narzędzi, a nie na ostatnią.\n' + + '\n' + + '

    Nawigacja wewnątrz sekcji interfejsu użytkownika

    \n' + + '\n' + + '

    Aby przenieść się z danego elementu interfejsu użytkownika do następnego, naciśnij odpowiedni klawisz strzałki.

    \n' + + '\n' + + '

    Klawisze strzałek w prawo i w lewo służą do

    \n' + + '\n' + + '
      \n' + + '
    • przenoszenia się pomiędzy menu na pasku menu,
    • \n' + + '
    • otwarcia podmenu w menu,
    • \n' + + '
    • przenoszenia się pomiędzy przyciskami w grupie paska narzędzi,
    • \n' + + '
    • przenoszenia się pomiędzy elementami w ścieżce elementów w sekcji Footer.
    • \n' + + '
    \n' + + '\n' + + '

    Klawisze strzałek w dół i w górę służą do\n' + + '\n' + + '

      \n' + + '
    • przenoszenia się pomiędzy elementami menu w menu,
    • \n' + + '
    • przenoszenia się pomiędzy elementami w wyskakującym menu paska narzędzi.
    • \n' + + '
    \n' + + '\n' + + '

    Klawisze strzałek służą do przemieszczania się w sekcji interfejsu użytkownika z ustawionym fokusem.

    \n' + + '\n' + + '

    Aby zamknąć otwarte menu, otwarte podmenu lub otwarte menu wyskakujące, naciśnij klawisz Esc.\n' + + '\n' + + '

    Jeżeli fokus jest ustawiony na górze konkretnej sekcji interfejsu użytkownika, naciśnięcie klawisza Esc powoduje wyjście\n' + + ' z nawigacji przy użyciu klawiatury.

    \n' + + '\n' + + '

    Wykonanie elementu menu lub przycisku paska narzędzi

    \n' + + '\n' + + '

    Gdy podświetlony jest żądany element menu lub przycisk paska narzędzi, naciśnij klawisz Return, Enter\n' + + ' lub Spacja, aby go wykonać.\n' + + '\n' + + '

    Nawigacja po oknie dialogowym bez kart

    \n' + + '\n' + + '

    Gdy otwiera się okno dialogowe bez kart, fokus ustawiany jest na pierwszą interaktywną część okna.

    \n' + + '\n' + + '

    Pomiędzy interaktywnymi częściami okna dialogowego nawiguj, naciskając klawisze Tab lub Shift+Tab.

    \n' + + '\n' + + '

    Nawigacja po oknie dialogowym z kartami

    \n' + + '\n' + + '

    W przypadku okna dialogowego z kartami po otwarciu okna dialogowego fokus ustawiany jest na pierwszy przycisk w menu karty.

    \n' + + '\n' + + '

    Nawigację pomiędzy interaktywnymi częściami karty okna dialogowego prowadzi się poprzez naciskanie klawiszy Tab lub\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Przełączenie się na inną kartę okna dialogowego wykonuje się poprzez ustawienie fokusu na menu karty i naciśnięcie odpowiedniego klawisza strzałki\n' + + ' w celu przemieszczenia się pomiędzy dostępnymi kartami.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/pt_BR.js b/public/js/tinymce/plugins/help/js/i18n/keynav/pt_BR.js new file mode 100644 index 000000000..dea9abf96 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/pt_BR.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.pt_BR', +'

    Iniciar navegação pelo teclado

    \n' + + '\n' + + '
    \n' + + '
    Foco na barra de menus
    \n' + + '
    Windows ou Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Foco na barra de ferramentas
    \n' + + '
    Windows ou Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Foco no rodapé
    \n' + + '
    Windows ou Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Foco na barra de ferramentas contextual
    \n' + + '
    Windows, Linux ou macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    A navegação inicia no primeiro item da IU, que será destacado ou sublinhado no caso do primeiro item no\n' + + ' caminho do elemento Rodapé.

    \n' + + '\n' + + '

    Navegar entre seções da IU

    \n' + + '\n' + + '

    Para ir de uma seção da IU para a seguinte, pressione Tab.

    \n' + + '\n' + + '

    Para ir de uma seção da IU para a anterior, pressione Shift+Tab.

    \n' + + '\n' + + '

    A ordem de Tab destas seções da IU é:\n' + + '\n' + + '

      \n' + + '
    1. Barra de menus
    2. \n' + + '
    3. Cada grupo da barra de ferramentas
    4. \n' + + '
    5. Barra lateral
    6. \n' + + '
    7. Caminho do elemento no rodapé
    8. \n' + + '
    9. Botão de alternar contagem de palavras no rodapé
    10. \n' + + '
    11. Link da marca no rodapé
    12. \n' + + '
    13. Alça de redimensionamento do editor no rodapé
    14. \n' + + '
    \n' + + '\n' + + '

    Se não houver uma seção da IU, ela será pulada.

    \n' + + '\n' + + '

    Se o rodapé tiver o foco da navegação pelo teclado e não houver uma barra lateral visível, pressionar Shift+Tab\n' + + ' move o foco para o primeiro grupo da barra de ferramentas, não para o último.\n' + + '\n' + + '

    Navegar dentro das seções da IU

    \n' + + '\n' + + '

    Para ir de um elemento da IU para o seguinte, pressione a Seta correspondente.

    \n' + + '\n' + + '

    As teclas de seta Esquerda e Direita

    \n' + + '\n' + + '
      \n' + + '
    • movem entre menus na barra de menus.
    • \n' + + '
    • abrem um submenu em um menu.
    • \n' + + '
    • movem entre botões em um grupo da barra de ferramentas.
    • \n' + + '
    • movem entre itens no caminho do elemento do rodapé.
    • \n' + + '
    \n' + + '\n' + + '

    As teclas de seta Abaixo e Acima\n' + + '\n' + + '

      \n' + + '
    • movem entre itens de menu em um menu.
    • \n' + + '
    • movem entre itens em um menu suspenso da barra de ferramentas.
    • \n' + + '
    \n' + + '\n' + + '

    As teclas de Seta alternam dentre a seção da IU em foco.

    \n' + + '\n' + + '

    Para fechar um menu aberto, um submenu aberto ou um menu suspenso aberto, pressione Esc.\n' + + '\n' + + '

    Se o foco atual estiver no ‘alto’ de determinada seção da IU, pressionar Esc também sai\n' + + ' totalmente da navegação pelo teclado.

    \n' + + '\n' + + '

    Executar um item de menu ou botão da barra de ferramentas

    \n' + + '\n' + + '

    Com o item de menu ou botão da barra de ferramentas desejado destacado, pressione Return, Enter,\n' + + ' ou a Barra de espaço para executar o item.\n' + + '\n' + + '

    Navegar por caixas de diálogo sem guias

    \n' + + '\n' + + '

    Em caixas de diálogo sem guias, o primeiro componente interativo recebe o foco quando a caixa de diálogo abre.

    \n' + + '\n' + + '

    Navegue entre componentes interativos de caixa de diálogo pressionando Tab ou Shift+Tab.

    \n' + + '\n' + + '

    Navegar por caixas de diálogo com guias

    \n' + + '\n' + + '

    Em caixas de diálogo com guias, o primeiro botão no menu da guia recebe o foco quando a caixa de diálogo abre.

    \n' + + '\n' + + '

    Navegue entre componentes interativos dessa guia da caixa de diálogo pressionando Tab ou\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Alterne para outra guia da caixa de diálogo colocando o foco no menu da guia e pressionando a Seta\n' + + ' adequada para percorrer as guias disponíveis.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/pt_PT.js b/public/js/tinymce/plugins/help/js/i18n/keynav/pt_PT.js new file mode 100644 index 000000000..b41bacdf0 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/pt_PT.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.pt_PT', +'

    Iniciar navegação com teclado

    \n' + + '\n' + + '
    \n' + + '
    Foco na barra de menu
    \n' + + '
    Windows ou Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Foco na barra de ferramentas
    \n' + + '
    Windows ou Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Foco no rodapé
    \n' + + '
    Windows ou Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Foco numa barra de ferramentas contextual
    \n' + + '
    Windows, Linux ou macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    A navegação começará no primeiro item de IU, que estará realçado ou sublinhado, no caso do primeiro item no\n' + + ' caminho do elemento do rodapé.

    \n' + + '\n' + + '

    Navegar entre secções de IU

    \n' + + '\n' + + '

    Para se mover de uma secção de IU para a seguinte, prima Tab.

    \n' + + '\n' + + '

    Para se mover de uma secção de IU para a anterior, prima Shift+Tab.

    \n' + + '\n' + + '

    A ordem de tabulação destas secções de IU é:\n' + + '\n' + + '

      \n' + + '
    1. Barra de menu
    2. \n' + + '
    3. Cada grupo da barra de ferramentas
    4. \n' + + '
    5. Barra lateral
    6. \n' + + '
    7. Caminho do elemento no rodapé
    8. \n' + + '
    9. Botão de alternar da contagem de palavras no rodapé
    10. \n' + + '
    11. Ligação da marca no rodapé
    12. \n' + + '
    13. Alça de redimensionamento do editor no rodapé
    14. \n' + + '
    \n' + + '\n' + + '

    Se uma secção de IU não estiver presente, é ignorada.

    \n' + + '\n' + + '

    Se o rodapé tiver foco de navegação com teclado e não existir uma barra lateral visível, premir Shift+Tab\n' + + ' move o foco para o primeiro grupo da barra de ferramentas e não para o último.\n' + + '\n' + + '

    Navegar nas secções de IU

    \n' + + '\n' + + '

    Para se mover de um elemento de IU para o seguinte, prima a tecla de seta adequada.

    \n' + + '\n' + + '

    As teclas de seta Para a esquerda e Para a direita

    \n' + + '\n' + + '
      \n' + + '
    • movem-se entre menus na barra de menu.
    • \n' + + '
    • abrem um submenu num menu.
    • \n' + + '
    • movem-se entre botões num grupo da barra de ferramentas.
    • \n' + + '
    • movem-se entre itens no caminho do elemento do rodapé.
    • \n' + + '
    \n' + + '\n' + + '

    As teclas de seta Para cima e Para baixo\n' + + '\n' + + '

      \n' + + '
    • movem-se entre itens de menu num menu.
    • \n' + + '
    • movem-se entre itens num menu de pop-up da barra de ferramentas.
    • \n' + + '
    \n' + + '\n' + + '

    As teclas de seta deslocam-se ciclicamente na secção de IU em foco.

    \n' + + '\n' + + '

    Para fechar um menu aberto, um submenu aberto ou um menu de pop-up aberto, prima a tecla Esc.\n' + + '\n' + + '

    Se o foco atual estiver no "topo" de determinada secção de IU, premir a tecla Esc também fecha\n' + + ' completamente a navegação com teclado.

    \n' + + '\n' + + '

    Executar um item de menu ou botão da barra de ferramentas

    \n' + + '\n' + + '

    Quando o item de menu ou o botão da barra de ferramentas pretendido estiver realçado, prima Retrocesso, Enter\n' + + ' ou a Barra de espaço para executar o item.\n' + + '\n' + + '

    Navegar em diálogos sem separadores

    \n' + + '\n' + + '

    Nos diálogos sem separadores, o primeiro componente interativo fica em foco quando o diálogo abre.

    \n' + + '\n' + + '

    Navegue entre componentes interativos do diálogo, premindo Tab ou Shift+Tab.

    \n' + + '\n' + + '

    Navegar em diálogos com separadores

    \n' + + '\n' + + '

    Nos diálogos com separadores, o primeiro botão no menu do separador fica em foco quando o diálogo abre.

    \n' + + '\n' + + '

    Navegue entre os componentes interativos deste separador do diálogo, premindo Tab ou\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Mude para outro separador do diálogo colocando o menu do separador em foco e, em seguida, premindo a tecla de seta\n' + + ' adequada para se deslocar ciclicamente pelos separadores disponíveis.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/ro.js b/public/js/tinymce/plugins/help/js/i18n/keynav/ro.js new file mode 100644 index 000000000..738be9dbe --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/ro.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ro', +'

    Începeți navigarea de la tastatură

    \n' + + '\n' + + '
    \n' + + '
    Focalizare pe bara de meniu
    \n' + + '
    Windows sau Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Focalizare pe bara de instrumente
    \n' + + '
    Windows sau Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Focalizare pe subsol
    \n' + + '
    Windows sau Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Focalizare pe o bară de instrumente contextuală
    \n' + + '
    Windows, Linux sau macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Navigarea va începe de la primul element al interfeței cu utilizatorul, care va fi evidențiat sau subliniat în cazul primului element din\n' + + ' calea elementului Subsol.

    \n' + + '\n' + + '

    Navigați între secțiunile interfeței cu utilizatorul

    \n' + + '\n' + + '

    Pentru a trece de la o secțiune a interfeței cu utilizatorul la alta, apăsați Tab.

    \n' + + '\n' + + '

    Pentru a trece de la o secțiune a interfeței cu utilizatorul la cea anterioară, apăsați Shift+Tab.

    \n' + + '\n' + + '

    Ordinea cu Tab a acestor secțiuni ale interfeței cu utilizatorul este următoarea:\n' + + '\n' + + '

      \n' + + '
    1. Bara de meniu
    2. \n' + + '
    3. Fiecare grup de bare de instrumente
    4. \n' + + '
    5. Bara laterală
    6. \n' + + '
    7. Calea elementului în subsol
    8. \n' + + '
    9. Buton de comutare a numărului de cuvinte în subsol
    10. \n' + + '
    11. Link de branding în subsol
    12. \n' + + '
    13. Mâner de redimensionare a editorului în subsol
    14. \n' + + '
    \n' + + '\n' + + '

    În cazul în care o secțiune a interfeței cu utilizatorul nu este prezentă, aceasta este omisă.

    \n' + + '\n' + + '

    În cazul în care subsolul are focalizarea navigației asupra tastaturii și nu există o bară laterală vizibilă, apăsarea butonului Shift+Tab\n' + + ' mută focalizarea pe primul grup de bare de instrumente, nu pe ultimul.\n' + + '\n' + + '

    Navigați în secțiunile interfeței cu utilizatorul

    \n' + + '\n' + + '

    Pentru a trece de la un element de interfață cu utilizatorul la următorul, apăsați tasta cu săgeata corespunzătoare.

    \n' + + '\n' + + '

    Tastele cu săgeți către stânga și dreapta

    \n' + + '\n' + + '
      \n' + + '
    • navighează între meniurile din bara de meniuri.
    • \n' + + '
    • deschid un sub-meniu dintr-un meniu.
    • \n' + + '
    • navighează între butoanele dintr-un grup de bare de instrumente.
    • \n' + + '
    • navighează între elementele din calea elementelor subsolului.
    • \n' + + '
    \n' + + '\n' + + '

    Tastele cu săgeți în sus și în jos\n' + + '\n' + + '

      \n' + + '
    • navighează între elementele de meniu dintr-un meniu.
    • \n' + + '
    • navighează între elementele unui meniu pop-up din bara de instrumente.
    • \n' + + '
    \n' + + '\n' + + '

    Tastele cu săgeți navighează în cadrul secțiunii interfeței cu utilizatorul asupra căreia se focalizează.

    \n' + + '\n' + + '

    Pentru a închide un meniu deschis, un sub-meniu deschis sau un meniu pop-up deschis, apăsați tasta Esc.\n' + + '\n' + + '

    Dacă focalizarea curentă este asupra „părții superioare” a unei anumite secțiuni a interfeței cu utilizatorul, prin apăsarea tastei Esc se iese, de asemenea,\n' + + ' în întregime din navigarea de la tastatură.

    \n' + + '\n' + + '

    Executarea unui element de meniu sau a unui buton din bara de instrumente

    \n' + + '\n' + + '

    Atunci când elementul de meniu dorit sau butonul dorit din bara de instrumente este evidențiat, apăsați Return, Enter,\n' + + ' sau bara de spațiu pentru a executa elementul.\n' + + '\n' + + '

    Navigarea de dialoguri fără file

    \n' + + '\n' + + '

    În dialogurile fără file, prima componentă interactivă beneficiază de focalizare la deschiderea dialogului.

    \n' + + '\n' + + '

    Navigați între componentele dialogului interactiv apăsând Tab sau Shift+Tab.

    \n' + + '\n' + + '

    Navigarea de dialoguri cu file

    \n' + + '\n' + + '

    În dialogurile cu file, primul buton din meniul cu file beneficiază de focalizare la deschiderea dialogului.

    \n' + + '\n' + + '

    Navigați între componentele interactive ale acestei file de dialog apăsând Tab sau\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Treceți la o altă filă de dialog focalizând asupra meniului cu file și apoi apăsând săgeata corespunzătoare\n' + + ' pentru a parcurge filele disponibile.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/ru.js b/public/js/tinymce/plugins/help/js/i18n/keynav/ru.js new file mode 100644 index 000000000..83ec76ef0 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/ru.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.ru', +'

    Начните управление с помощью клавиатуры

    \n' + + '\n' + + '
    \n' + + '
    Фокус на панели меню
    \n' + + '
    Windows или Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Фокус на панели инструментов
    \n' + + '
    Windows или Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Фокус на нижнем колонтитуле
    \n' + + '
    Windows или Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Фокус на контекстной панели инструментов
    \n' + + '
    Windows, Linux или macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Первый доступный для управления элемент интерфейса будет выделен цветом или подчеркнут (если он находится\n' + + ' в пути элементов нижнего колонтитула).

    \n' + + '\n' + + '

    Переход между разделами пользовательского интерфейса

    \n' + + '\n' + + '

    Чтобы перейти из текущего раздела интерфейса в следующий, нажмите Tab.

    \n' + + '\n' + + '

    Чтобы перейти из текущего раздела интерфейса в предыдущий, нажмите Shift+Tab.

    \n' + + '\n' + + '

    Вкладки разделов интерфейса расположены в следующем порядке:\n' + + '\n' + + '

      \n' + + '
    1. Панель меню
    2. \n' + + '
    3. Группы панели инструментов
    4. \n' + + '
    5. Боковая панель
    6. \n' + + '
    7. Путь элементов нижнего колонтитула
    8. \n' + + '
    9. Подсчет слов/символов в нижнем колонтитуле
    10. \n' + + '
    11. Брендовая ссылка в нижнем колонтитуле
    12. \n' + + '
    13. Угол для изменения размера окна редактора
    14. \n' + + '
    \n' + + '\n' + + '

    Если раздел интерфейса отсутствует, он пропускается.

    \n' + + '\n' + + '

    Если при управлении с клавиатуры фокус находится на нижнем колонтитуле, а видимая боковая панель отсутствует, то при нажатии сочетания клавиш Shift+Tab\n' + + ' фокус переносится на первую группу панели инструментов, а не на последнюю.\n' + + '\n' + + '

    Переход между элементами внутри разделов пользовательского интерфейса

    \n' + + '\n' + + '

    Чтобы перейти от текущего элемента интерфейса к следующему, нажмите соответствующую клавишу со стрелкой.

    \n' + + '\n' + + '

    Клавиши со стрелками влево и вправо позволяют

    \n' + + '\n' + + '
      \n' + + '
    • перемещаться между разными меню в панели меню.
    • \n' + + '
    • открывать разделы меню.
    • \n' + + '
    • перемещаться между кнопками в группе панели инструментов.
    • \n' + + '
    • перемещаться между элементами в пути элементов нижнего колонтитула.
    • \n' + + '
    \n' + + '\n' + + '

    Клавиши со стрелками вниз и вверх позволяют\n' + + '\n' + + '

      \n' + + '
    • перемещаться между элементами одного меню.
    • \n' + + '
    • перемещаться между элементами всплывающего меню в панели инструментов.
    • \n' + + '
    \n' + + '\n' + + '

    При использовании клавиш со стрелками вы будете циклически перемещаться по элементам в пределах выбранного раздела интерфейса.

    \n' + + '\n' + + '

    Чтобы закрыть открытое меню, его раздел или всплывающее меню, нажмите клавишу Esc.\n' + + '\n' + + '

    Если фокус находится наверху какого-либо раздела интерфейса, нажатие клавиши Esc также приведет\n' + + ' к выходу из режима управления с помощью клавиатуры.

    \n' + + '\n' + + '

    Использование элемента меню или кнопки на панели инструментов

    \n' + + '\n' + + '

    Когда элемент меню или кнопка панели инструментов будут выделены, нажмите Return, Enter\n' + + ' или Space, чтобы их активировать.\n' + + '\n' + + '

    Управление в диалоговом окне без вкладок

    \n' + + '\n' + + '

    При открытии диалогового окна без вкладок фокус переносится на первый интерактивный компонент.

    \n' + + '\n' + + '

    Для перехода между интерактивными компонентами диалогового окна нажимайте Tab или Shift+Tab.

    \n' + + '\n' + + '

    Управление в диалоговом окне с вкладками

    \n' + + '\n' + + '

    При открытии диалогового окна с вкладками фокус переносится на первую кнопку в меню вкладок.

    \n' + + '\n' + + '

    Для перехода между интерактивными компонентами этой вкладки диалогового окна нажимайте Tab или\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Для перехода на другую вкладку диалогового окна переместите фокус на меню вкладок, а затем используйте клавиши со стрелками\n' + + ' для циклического переключения между доступными вкладками.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/sk.js b/public/js/tinymce/plugins/help/js/i18n/keynav/sk.js new file mode 100644 index 000000000..6ced78067 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/sk.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.sk', +'

    Začíname s navigáciou pomocou klávesnice

    \n' + + '\n' + + '
    \n' + + '
    Prejsť na panel s ponukami
    \n' + + '
    Windows alebo Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Prejsť na panel nástrojov
    \n' + + '
    Windows alebo Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Prejsť na pätičku
    \n' + + '
    Windows alebo Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Prejsť na kontextový panel nástrojov
    \n' + + '
    Windows, Linux alebo macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Navigácia začne pri prvej položke používateľského rozhrania, ktorá bude zvýraznená alebo v prípade prvej položky\n' + + ' cesty k pätičke podčiarknutá.

    \n' + + '\n' + + '

    Navigácia medzi časťami používateľského rozhrania

    \n' + + '\n' + + '

    Ak sa chcete posunúť z jednej časti používateľského rozhrania do druhej, stlačte tlačidlo Tab.

    \n' + + '\n' + + '

    Ak sa chcete posunúť z jednej časti používateľského rozhrania do predchádzajúcej, stlačte tlačidlá Shift + Tab.

    \n' + + '\n' + + '

    Poradie prepínania medzi týmito časťami používateľského rozhrania pri stláčaní tlačidla Tab:\n' + + '\n' + + '

      \n' + + '
    1. Panel s ponukou
    2. \n' + + '
    3. Každá skupina panela nástrojov
    4. \n' + + '
    5. Bočný panel
    6. \n' + + '
    7. Cesta k prvku v pätičke
    8. \n' + + '
    9. Prepínač počtu slov v pätičke
    10. \n' + + '
    11. Odkaz na informácie o značke v pätičke
    12. \n' + + '
    13. Úchyt na zmenu veľkosti editora v pätičke
    14. \n' + + '
    \n' + + '\n' + + '

    Ak nejaká časť používateľského rozhrania nie je prítomná, preskočí sa.

    \n' + + '\n' + + '

    Ak je pätička vybratá na navigáciu pomocou klávesnice a nie je viditeľný bočný panel, stlačením klávesov Shift+Tab\n' + + ' prejdete na prvú skupinu panela nástrojov, nie na poslednú.\n' + + '\n' + + '

    Navigácia v rámci častí používateľského rozhrania

    \n' + + '\n' + + '

    Ak sa chcete posunúť z jedného prvku používateľského rozhrania na ďalší, stlačte príslušný kláves so šípkou.

    \n' + + '\n' + + '

    Klávesy so šípkami doľava a doprava

    \n' + + '\n' + + '
      \n' + + '
    • umožňujú presun medzi ponukami na paneli ponúk,
    • \n' + + '
    • otvárajú podponuku v rámci ponuky,
    • \n' + + '
    • umožňujú presun medzi tlačidlami v skupine panelov nástrojov,
    • \n' + + '
    • umožňujú presun medzi položkami cesty prvku v pätičke.
    • \n' + + '
    \n' + + '\n' + + '

    Klávesy so šípkami dole a hore\n' + + '\n' + + '

      \n' + + '
    • umožňujú presun medzi položkami ponuky,
    • \n' + + '
    • umožňujú presun medzi položkami v kontextovej ponuke panela nástrojov.
    • \n' + + '
    \n' + + '\n' + + '

    Klávesy so šípkami vykonávajú prepínanie v rámci vybranej časti používateľského rozhrania.

    \n' + + '\n' + + '

    Ak chcete zatvoriť otvorenú ponuku, otvorenú podponuku alebo otvorenú kontextovú ponuku, stlačte kláves Esc.\n' + + '\n' + + '

    Ak je aktuálne vybratá horná časť konkrétneho používateľského rozhrania, stlačením klávesu Esc úplne ukončíte tiež\n' + + ' navigáciu pomocou klávesnice.

    \n' + + '\n' + + '

    Vykonanie príkazu položky ponuky alebo tlačidla panela nástrojov

    \n' + + '\n' + + '

    Keď je zvýraznená požadovaná položka ponuky alebo tlačidlo panela nástrojov, stlačením klávesov Return, Enter\n' + + ' alebo medzerníka vykonáte príslušný príkaz položky.\n' + + '\n' + + '

    Navigácia v dialógových oknách bez záložiek

    \n' + + '\n' + + '

    Pri otvorení dialógových okien bez záložiek prejdete na prvý interaktívny komponent.

    \n' + + '\n' + + '

    Medzi interaktívnymi dialógovými komponentmi môžete prechádzať stlačením klávesov Tab alebo Shift+Tab.

    \n' + + '\n' + + '

    Navigácia v dialógových oknách so záložkami

    \n' + + '\n' + + '

    Pri otvorení dialógových okien so záložkami prejdete na prvé tlačidlo v ponuke záložiek.

    \n' + + '\n' + + '

    Medzi interaktívnymi komponentmi tejto dialógovej záložky môžete prechádzať stlačením klávesov Tab alebo\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Ak chcete prepnúť na ďalšiu záložku dialógového okna, prejdite do ponuky záložiek a potom môžete stlačením príslušného klávesu so šípkou\n' + + ' prepínať medzi dostupnými záložkami.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/sl_SI.js b/public/js/tinymce/plugins/help/js/i18n/keynav/sl_SI.js new file mode 100644 index 000000000..11fddecd9 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/sl_SI.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.sl_SI', +'

    Začetek krmarjenja s tipkovnico

    \n' + + '\n' + + '
    \n' + + '
    Fokus na menijsko vrstico
    \n' + + '
    Windows ali Linux: Alt + F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Fokus na orodno vrstico
    \n' + + '
    Windows ali Linux: Alt + F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Fokus na nogo
    \n' + + '
    Windows ali Linux: Alt + F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Fokus na kontekstualno orodno vrstico
    \n' + + '
    Windows, Linux ali macOS: Ctrl + F9\n' + + '
    \n' + + '\n' + + '

    Krmarjenje se bo začelo s prvim elementom uporabniškega vmesnika, ki bo izpostavljena ali podčrtan, če gre za prvi element na\n' + + ' poti do elementa noge.

    \n' + + '\n' + + '

    Krmarjenje med razdelki uporabniškega vmesnika

    \n' + + '\n' + + '

    Če se želite pomakniti z enega dela uporabniškega vmesnika na naslednjega, pritisnite tabulatorko.

    \n' + + '\n' + + '

    Če se želite pomakniti z enega dela uporabniškega vmesnika na prejšnjega, pritisnite shift + tabulatorko.

    \n' + + '\n' + + '

    Zaporedje teh razdelkov uporabniškega vmesnika, ko pritiskate tabulatorko, je:\n' + + '\n' + + '

      \n' + + '
    1. Menijska vrstica
    2. \n' + + '
    3. Posamezne skupine orodne vrstice
    4. \n' + + '
    5. Stranska vrstica
    6. \n' + + '
    7. Pod do elementa v nogi
    8. \n' + + '
    9. Gumb za preklop štetja besed v nogi
    10. \n' + + '
    11. Povezava do blagovne znamke v nogi
    12. \n' + + '
    13. Ročaj za spreminjanje velikosti urejevalnika v nogi
    14. \n' + + '
    \n' + + '\n' + + '

    Če razdelek uporabniškega vmesnika ni prisoten, je preskočen.

    \n' + + '\n' + + '

    Če ima noga fokus za krmarjenje s tipkovnico in ni vidne stranske vrstice, s pritiskom na shift + tabulatorko\n' + + ' fokus premaknete na prvo skupino orodne vrstice, ne zadnjo.\n' + + '\n' + + '

    Krmarjenje v razdelkih uporabniškega vmesnika

    \n' + + '\n' + + '

    Če se želite premakniti z enega elementa uporabniškega vmesnika na naslednjega, pritisnite ustrezno puščično tipko.

    \n' + + '\n' + + '

    Leva in desna puščična tipka

    \n' + + '\n' + + '
      \n' + + '
    • omogočata premikanje med meniji v menijski vrstici.
    • \n' + + '
    • odpreta podmeni v meniju.
    • \n' + + '
    • omogočata premikanje med gumbi v skupini orodne vrstice.
    • \n' + + '
    • omogočata premikanje med elementi na poti do elementov noge.
    • \n' + + '
    \n' + + '\n' + + '

    Spodnja in zgornja puščična tipka\n' + + '\n' + + '

      \n' + + '
    • omogočata premikanje med elementi menija.
    • \n' + + '
    • omogočata premikanje med elementi v pojavnem meniju orodne vrstice.
    • \n' + + '
    \n' + + '\n' + + '

    Puščične tipke omogočajo kroženje znotraj razdelka uporabniškega vmesnika, na katerem je fokus.

    \n' + + '\n' + + '

    Če želite zapreti odprt meni, podmeni ali pojavni meni, pritisnite tipko Esc.\n' + + '\n' + + '

    Če je trenutni fokus na »vrhu« določenega razdelka uporabniškega vmesnika, s pritiskom tipke Esc zaprete\n' + + ' tudi celotno krmarjenje s tipkovnico.

    \n' + + '\n' + + '

    Izvajanje menijskega elementa ali gumba orodne vrstice

    \n' + + '\n' + + '

    Ko je označen želeni menijski element ali orodja vrstica, pritisnite vračalko, Enter\n' + + ' ali preslednico, da izvedete element.\n' + + '\n' + + '

    Krmarjenje po pogovornih oknih brez zavihkov

    \n' + + '\n' + + '

    Ko odprete pogovorno okno brez zavihkov, ima fokus prva interaktivna komponenta.

    \n' + + '\n' + + '

    Med interaktivnimi komponentami pogovornega okna se premikate s pritiskom tabulatorke ali kombinacije tipke shift + tabulatorke.

    \n' + + '\n' + + '

    Krmarjenje po pogovornih oknih z zavihki

    \n' + + '\n' + + '

    Ko odprete pogovorno okno z zavihki, ima fokus prvi gumb v meniju zavihka.

    \n' + + '\n' + + '

    Med interaktivnimi komponentami tega zavihka pogovornega okna se premikate s pritiskom tabulatorke ali\n' + + ' kombinacije tipke shift + tabulatorke.

    \n' + + '\n' + + '

    Na drug zavihek pogovornega okna preklopite tako, da fokus prestavite na meni zavihka in nato pritisnete ustrezno puščično\n' + + ' tipko, da se pomaknete med razpoložljivimi zavihki.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/sv_SE.js b/public/js/tinymce/plugins/help/js/i18n/keynav/sv_SE.js new file mode 100644 index 000000000..d82bce616 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/sv_SE.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.sv_SE', +'

    Påbörja tangentbordsnavigering

    \n' + + '\n' + + '
    \n' + + '
    Fokusera på menyraden
    \n' + + '
    Windows eller Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Fokusera på verktygsraden
    \n' + + '
    Windows eller Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Fokusera på verktygsraden
    \n' + + '
    Windows eller Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Fokusera på en snabbverktygsrad
    \n' + + '
    Windows, Linux eller macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Navigeringen börjar vid det första gränssnittsobjektet, vilket är markerat eller understruket om det gäller det första objektet i\n' + + ' sidfotens elementsökväg.

    \n' + + '\n' + + '

    Navigera mellan UI-avsnitt

    \n' + + '\n' + + '

    Flytta från ett UI-avsnitt till nästa genom att trycka på Tabb.

    \n' + + '\n' + + '

    Flytta från ett UI-avsnitt till det föregående genom att trycka på Skift+Tabb.

    \n' + + '\n' + + '

    Tabb-ordningen för dessa UI-avsnitt är:\n' + + '\n' + + '

      \n' + + '
    1. Menyrad
    2. \n' + + '
    3. Varje verktygsradsgrupp
    4. \n' + + '
    5. Sidoruta
    6. \n' + + '
    7. Elementsökväg i sidfoten
    8. \n' + + '
    9. Växlingsknapp för ordantal i sidfoten
    10. \n' + + '
    11. Varumärkeslänk i sidfoten
    12. \n' + + '
    13. Storlekshandtag för redigeraren i sidfoten
    14. \n' + + '
    \n' + + '\n' + + '

    Om ett UI-avsnitt inte finns hoppas det över.

    \n' + + '\n' + + '

    Om sidfoten har fokus på tangentbordsnavigering, och det inte finns någon synlig sidoruta, flyttas fokus till den första verktygsradsgruppen\n' + + ' när du trycker på Skift+Tabb, inte till den sista.\n' + + '\n' + + '

    Navigera i UI-avsnitt

    \n' + + '\n' + + '

    Flytta från ett UI-element till nästa genom att trycka på motsvarande piltangent.

    \n' + + '\n' + + '

    Vänsterpil och högerpil

    \n' + + '\n' + + '
      \n' + + '
    • flytta mellan menyer på menyraden.
    • \n' + + '
    • öppna en undermeny på en meny.
    • \n' + + '
    • flytta mellan knappar i en verktygsradgrupp.
    • \n' + + '
    • flytta mellan objekt i sidfotens elementsökväg.
    • \n' + + '
    \n' + + '\n' + + '

    Nedpil och uppil\n' + + '\n' + + '

      \n' + + '
    • flytta mellan menyalternativ på en meny.
    • \n' + + '
    • flytta mellan alternativ på en popup-meny på verktygsraden.
    • \n' + + '
    \n' + + '\n' + + '

    Piltangenterna cirkulerar inom det fokuserade UI-avsnittet.

    \n' + + '\n' + + '

    Tryck på Esc-tangenten om du vill stänga en öppen meny, undermeny eller popup-meny.\n' + + '\n' + + '

    Om det aktuella fokuset är högst upp i ett UI-avsnitt avlutas även tangentbordsnavigeringen helt när\n' + + ' du trycker på Esc-tangenten.

    \n' + + '\n' + + '

    Köra ett menyalternativ eller en verktygfältsknapp

    \n' + + '\n' + + '

    När menyalternativet eller verktygsradsknappen är markerad trycker du på Retur, Enter\n' + + ' eller blanksteg för att köra alternativet.\n' + + '\n' + + '

    Navigera i dialogrutor utan flikar

    \n' + + '\n' + + '

    I dialogrutor utan flikar är den första interaktiva komponenten i fokus när dialogrutan öppnas.

    \n' + + '\n' + + '

    Navigera mellan interaktiva dialogkomponenter genom att trycka på Tabb eller Skift+Tabb.

    \n' + + '\n' + + '

    Navigera i dialogrutor med flikar

    \n' + + '\n' + + '

    I dialogrutor utan flikar är den första knappen på flikmenyn i fokus när dialogrutan öppnas.

    \n' + + '\n' + + '

    Navigera mellan interaktiva komponenter på dialogrutefliken genom att trycka på Tabb eller\n' + + ' Skift+Tabb.

    \n' + + '\n' + + '

    Växla till en annan dialogruta genom att fokusera på flikmenyn och sedan trycka på motsvarande piltangent\n' + + ' för att cirkulera mellan de tillgängliga flikarna.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/th_TH.js b/public/js/tinymce/plugins/help/js/i18n/keynav/th_TH.js new file mode 100644 index 000000000..240f7ddda --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/th_TH.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.th_TH', +'

    เริ่มต้นการนำทางด้วยแป้นพิมพ์

    \n' + + '\n' + + '
    \n' + + '
    โฟกัสที่แถบเมนู
    \n' + + '
    Windows หรือ Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    โฟกัสที่แถบเครื่องมือ
    \n' + + '
    Windows หรือ Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    โฟกัสที่ส่วนท้าย
    \n' + + '
    Windows หรือ Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    โฟกัสที่แถบเครื่องมือตามบริบท
    \n' + + '
    Windows, Linux หรือ macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    การนำทางจะเริ่มที่รายการ UI แรก ซึ่งจะมีการไฮไลต์หรือขีดเส้นใต้ไว้ในกรณีที่รายการแรกอยู่ใน\n' + + ' พาธองค์ประกอบส่วนท้าย

    \n' + + '\n' + + '

    การนำทางระหว่างส่วนต่างๆ ของ UI

    \n' + + '\n' + + '

    ในการย้ายจากส่วน UI หนึ่งไปยังส่วนถัดไป ให้กด Tab

    \n' + + '\n' + + '

    ในการย้ายจากส่วน UI หนึ่งไปยังส่วนก่อนหน้า ให้กด Shift+Tab

    \n' + + '\n' + + '

    ลำดับแท็บของส่วนต่างๆ ของ UI คือ:\n' + + '\n' + + '

      \n' + + '
    1. แถบเมนู
    2. \n' + + '
    3. แต่ละกลุ่มแถบเครื่องมือ
    4. \n' + + '
    5. แถบข้าง
    6. \n' + + '
    7. พาธองค์ประกอบในส่วนท้าย
    8. \n' + + '
    9. ปุ่มสลับเปิด/ปิดจำนวนคำในส่วนท้าย
    10. \n' + + '
    11. ลิงก์ชื่อแบรนด์ในส่วนท้าย
    12. \n' + + '
    13. จุดจับปรับขนาดของตัวแก้ไขในส่วนท้าย
    14. \n' + + '
    \n' + + '\n' + + '

    หากส่วน UI ไม่ปรากฏ แสดงว่าถูกข้ามไป

    \n' + + '\n' + + '

    หากส่วนท้ายมีการโฟกัสการนำทางแป้นพิมพ์และไม่มีแถบข้างปรากฏ การกด Shift+Tab\n' + + ' จะย้ายการโฟกัสไปที่กลุ่มแถบเครื่องมือแรก ไม่ใช่สุดท้าย\n' + + '\n' + + '

    การนำทางภายในส่วนต่างๆ ของ UI

    \n' + + '\n' + + '

    ในการย้ายจากองค์ประกอบ UI หนึ่งไปยังองค์ประกอบส่วนถัดไป ให้กดปุ่มลูกศรที่เหมาะสม

    \n' + + '\n' + + '

    ปุ่มลูกศรซ้ายและขวา

    \n' + + '\n' + + '
      \n' + + '
    • ย้ายไปมาระหว่างเมนูต่างๆ ในแถบเมนู
    • \n' + + '
    • เปิดเมนูย่อยในเมนู
    • \n' + + '
    • ย้ายไปมาระหว่างปุ่มต่างๆ ในกลุ่มแถบเครื่องมือ
    • \n' + + '
    • ย้ายไปมาระหว่างรายการต่างๆ ในพาธองค์ประกอบของส่วนท้าย
    • \n' + + '
    \n' + + '\n' + + '

    ปุ่มลูกศรลงและขึ้น\n' + + '\n' + + '

      \n' + + '
    • ย้ายไปมาระหว่างรายการเมนูต่างๆ ในเมนู
    • \n' + + '
    • ย้ายไปมาระหว่างรายการต่างๆ ในเมนูป๊อบอัพแถบเครื่องมือ
    • \n' + + '
    \n' + + '\n' + + '

    ปุ่มลูกศรจะเลื่อนไปมาภายในส่วน UI ที่โฟกัส

    \n' + + '\n' + + '

    ในการปิดเมนูที่เปิดอยู่ เมนูย่อยที่เปิดอยู่ หรือเมนูป๊อบอัพที่เปิดอยู่ ให้กดปุ่ม Esc\n' + + '\n' + + '

    หากโฟกัสปัจจุบันอยู่ที่ ‘ด้านบนสุด’ ของส่วน UI เฉพาะ การกดปุ่ม Esc จะทำให้ออกจาก\n' + + ' การนำทางด้วยแป้นพิมพ์ทั้งหมดเช่นกัน

    \n' + + '\n' + + '

    การดำเนินการรายการเมนูหรือปุ่มในแถบเครื่องมือ

    \n' + + '\n' + + '

    เมื่อไฮไลต์รายการเมนูหรือปุ่มในแถบเครื่องมือที่ต้องการ ให้กด Return, Enter\n' + + ' หรือ Space bar เพื่อดำเนินการรายการดังกล่าว\n' + + '\n' + + '

    การนำทางสำหรับกล่องโต้ตอบที่ไม่อยู่ในแท็บ

    \n' + + '\n' + + '

    ในกล่องโต้ตอบที่ไม่อยู่ในแท็บ จะโฟกัสที่ส่วนประกอบเชิงโต้ตอบแรกเมื่อกล่องโต้ตอบเปิด

    \n' + + '\n' + + '

    นำทางระหว่างส่วนประกอบเชิงโต้ตอบต่างๆ ของกล่องโต้ตอบ โดยการกด Tab หรือ Shift+Tab

    \n' + + '\n' + + '

    การนำทางสำหรับกล่องโต้ตอบที่อยู่ในแท็บ

    \n' + + '\n' + + '

    ในกล่องโต้ตอบที่อยู่ในแท็บ จะโฟกัสที่ปุ่มแรกในเมนูแท็บเมื่อกล่องโต้ตอบเปิด

    \n' + + '\n' + + '

    นำทางระหว่างส่วนประกอบเชิงโต้ตอบต่างๆ ของแท็บกล่องโต้ตอบนี้โดยการกด Tab หรือ\n' + + ' Shift+Tab

    \n' + + '\n' + + '

    สลับไปยังแท็บกล่องโต้ตอบอื่นโดยการเลือกโฟกัสที่เมนูแท็บ แล้วกดปุ่มลูกศรที่เหมาะสม\n' + + ' เพื่อเลือกแท็บที่ใช้ได้

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/tr.js b/public/js/tinymce/plugins/help/js/i18n/keynav/tr.js new file mode 100644 index 000000000..87e888548 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/tr.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.tr', +'

    Klavyeyle gezintiyi başlatma

    \n' + + '\n' + + '
    \n' + + '
    Menü çubuğuna odaklan
    \n' + + '
    Windows veya Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Araç çubuğuna odaklan
    \n' + + '
    Windows veya Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Alt bilgiye odaklan
    \n' + + '
    Windows veya Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Bağlamsal araç çubuğuna odaklan
    \n' + + '
    Windows, Linux veya macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Gezinti ilk kullanıcı arabirimi öğesinden başlar, bu öğe vurgulanır ya da ilk öğe, Alt bilgi elemanı\n' + + ' yolundaysa altı çizilir.

    \n' + + '\n' + + '

    Kullanıcı arabirimi bölümleri arasında gezinme

    \n' + + '\n' + + '

    Sonraki kullanıcı arabirimi bölümüne gitmek için Sekme tuşuna basın.

    \n' + + '\n' + + '

    Önceki kullanıcı arabirimi bölümüne gitmek için Shift+Sekme tuşlarına basın.

    \n' + + '\n' + + '

    Bu kullanıcı arabirimi bölümlerinin Sekme sırası:\n' + + '\n' + + '

      \n' + + '
    1. Menü çubuğu
    2. \n' + + '
    3. Her araç çubuğu grubu
    4. \n' + + '
    5. Kenar çubuğu
    6. \n' + + '
    7. Alt bilgide öğe yolu
    8. \n' + + '
    9. Alt bilgide sözcük sayısı geçiş düğmesi
    10. \n' + + '
    11. Alt bilgide marka bağlantısı
    12. \n' + + '
    13. Alt bilgide düzenleyiciyi yeniden boyutlandırma tutamacı
    14. \n' + + '
    \n' + + '\n' + + '

    Kullanıcı arabirimi bölümü yoksa atlanır.

    \n' + + '\n' + + '

    Alt bilgide klavyeyle gezinti odağı yoksa ve görünür bir kenar çubuğu mevcut değilse Shift+Sekme tuşlarına basıldığında\n' + + ' odak son araç çubuğu yerine ilk araç çubuğu grubuna taşınır.\n' + + '\n' + + '

    Kullanıcı arabirimi bölümleri içinde gezinme

    \n' + + '\n' + + '

    Sonraki kullanıcı arabirimi elemanına gitmek için uygun Ok tuşuna basın.

    \n' + + '\n' + + '

    Sol ve Sağ ok tuşları

    \n' + + '\n' + + '
      \n' + + '
    • menü çubuğundaki menüler arasında hareket eder.
    • \n' + + '
    • menüde bir alt menü açar.
    • \n' + + '
    • araç çubuğu grubundaki düğmeler arasında hareket eder.
    • \n' + + '
    • alt bilginin öğe yolundaki öğeler arasında hareket eder.
    • \n' + + '
    \n' + + '\n' + + '

    Aşağı ve Yukarı ok tuşları\n' + + '\n' + + '

      \n' + + '
    • menüdeki menü öğeleri arasında hareket eder.
    • \n' + + '
    • araç çubuğu açılır menüsündeki öğeler arasında hareket eder.
    • \n' + + '
    \n' + + '\n' + + '

    Ok tuşları, odaklanılan kullanıcı arabirimi bölümü içinde döngüsel olarak hareket eder.

    \n' + + '\n' + + '

    Açık bir menüyü, açık bir alt menüyü veya açık bir açılır menüyü kapatmak için Esc tuşuna basın.\n' + + '\n' + + '

    Geçerli odak belirli bir kullanıcı arabirimi bölümünün "üst" kısmındaysa Esc tuşuna basıldığında\n' + + ' klavyeyle gezintiden de tamamen çıkılır.

    \n' + + '\n' + + '

    Menü öğesini veya araç çubuğu düğmesini yürütme

    \n' + + '\n' + + '

    İstediğiniz menü öğesi veya araç çubuğu düğmesi vurgulandığında Return, Enter\n' + + ' veya Ara çubuğu tuşuna basın.\n' + + '\n' + + '

    Sekme bulunmayan iletişim kutularında gezinme

    \n' + + '\n' + + '

    Sekme bulunmayan iletişim kutularında, iletişim kutusu açıldığında ilk etkileşimli bileşene odaklanılır.

    \n' + + '\n' + + '

    Etkileşimli iletişim kutusu bileşenleri arasında gezinmek için Sekme veya Shift+ Sekme tuşlarına basın.

    \n' + + '\n' + + '

    Sekmeli iletişim kutularında gezinme

    \n' + + '\n' + + '

    Sekmeli iletişim kutularında, iletişim kutusu açıldığında sekme menüsündeki ilk düğmeye odaklanılır.

    \n' + + '\n' + + '

    Bu iletişim kutusu sekmesinin etkileşimli bileşenleri arasında gezinmek için Sekme veya\n' + + ' Shift+Sekme tuşlarına basın.

    \n' + + '\n' + + '

    Mevcut sekmeler arasında geçiş yapmak için sekme menüsüne odaklanıp uygun Ok tuşuna basarak\n' + + ' başka bir iletişim kutusu sekmesine geçiş yapın.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/uk.js b/public/js/tinymce/plugins/help/js/i18n/keynav/uk.js new file mode 100644 index 000000000..5cd07444c --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/uk.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.uk', +'

    Початок роботи з навігацією за допомогою клавіатури

    \n' + + '\n' + + '
    \n' + + '
    Фокус на рядок меню
    \n' + + '
    Windows або Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Фокус на панелі інструментів
    \n' + + '
    Windows або Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Фокус на розділі "Нижній колонтитул"
    \n' + + '
    Windows або Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Фокус на контекстній панелі інструментів
    \n' + + '
    Windows, Linux або macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Навігація почнеться з першого елемента інтерфейсу користувача, який буде виділено або підкреслено в разі, якщо перший елемент знаходиться в\n' + + ' шляху до елемента "Нижній колонтитул".

    \n' + + '\n' + + '

    Навігація між розділами інтерфейсу користувача

    \n' + + '\n' + + '

    Щоб перейти з одного розділу інтерфейсу користувача до наступного розділу, натисніть клавішу Tab.

    \n' + + '\n' + + '

    Щоб перейти з одного розділу інтерфейсу користувача до попереднього розділу, натисніть сполучення клавіш Shift+Tab.

    \n' + + '\n' + + '

    Порядок Вкладок цих розділів інтерфейсу користувача такий:\n' + + '\n' + + '

      \n' + + '
    1. Рядок меню
    2. \n' + + '
    3. Кожна група панелей інструментів
    4. \n' + + '
    5. Бічна панель
    6. \n' + + '
    7. Шлях до елементів у розділі "Нижній колонтитул"
    8. \n' + + '
    9. Кнопка перемикача "Кількість слів" у розділі "Нижній колонтитул"
    10. \n' + + '
    11. Посилання на брендинг у розділі "Нижній колонтитул"
    12. \n' + + '
    13. Маркер змінення розміру в розділі "Нижній колонтитул"
    14. \n' + + '
    \n' + + '\n' + + '

    Якщо розділ інтерфейсу користувача відсутній, він пропускається.

    \n' + + '\n' + + '

    Якщо фокус навігації клавіатури знаходиться на розділі "Нижній колонтитул", але користувач не бачить видиму бічну панель, натисніть Shift+Tab,\n' + + ' щоб перемістити фокус на першу групу панелі інструментів, а не на останню.\n' + + '\n' + + '

    Навігація в межах розділів інтерфейсу користувача

    \n' + + '\n' + + '

    Щоб перейти з одного елементу інтерфейсу користувача до наступного, натисніть відповідну клавішу зі стрілкою.

    \n' + + '\n' + + '

    Клавіші зі стрілками Ліворуч і Праворуч

    \n' + + '\n' + + '
      \n' + + '
    • переміщують між меню в рядку меню.
    • \n' + + '
    • відкривають вкладене меню в меню.
    • \n' + + '
    • переміщують користувача між кнопками в групі панелі інструментів.
    • \n' + + '
    • переміщують між елементами в шляху до елементів у розділі "Нижній колонтитул".
    • \n' + + '
    \n' + + '\n' + + '

    Клавіші зі стрілками Вниз і Вгору\n' + + '\n' + + '

      \n' + + '
    • переміщують між елементами меню в меню.
    • \n' + + '
    • переміщують між елементами в спливаючому меню панелі інструментів.
    • \n' + + '
    \n' + + '\n' + + '

    Клавіші зі стрілками переміщують фокус циклічно в межах розділу інтерфейсу користувача, на якому знаходиться фокус.

    \n' + + '\n' + + '

    Щоб закрити відкрите меню, відкрите вкладене меню або відкрите спливаюче меню, натисніть клавішу Esc.\n' + + '\n' + + '

    Якщо поточний фокус знаходиться на верхньому рівні певного розділу інтерфейсу користувача, натискання клавіші Esc також виконує вихід\n' + + ' з навігації за допомогою клавіатури повністю.

    \n' + + '\n' + + '

    Виконання елементу меню або кнопки панелі інструментів

    \n' + + '\n' + + '

    Коли потрібний елемент меню або кнопку панелі інструментів виділено, натисніть клавіші Return, Enter,\n' + + ' або Пробіл, щоб виконати цей елемент.\n' + + '\n' + + '

    Навігація по діалоговим вікнам без вкладок

    \n' + + '\n' + + '

    У діалогових вікнах без вкладок перший інтерактивний компонент приймає фокус, коли відкривається діалогове вікно.

    \n' + + '\n' + + '

    Переходьте між інтерактивними компонентами діалогового вікна, натискаючи клавіші Tab або Shift+Tab.

    \n' + + '\n' + + '

    Навігація по діалоговим вікнам з вкладками

    \n' + + '\n' + + '

    У діалогових вікнах із вкладками перша кнопка в меню вкладки приймає фокус, коли відкривається діалогове вікно.

    \n' + + '\n' + + '

    Переходьте між інтерактивними компонентами цієї вкладки діалогового вікна, натискаючи клавіші Tab або\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Щоб перейти на іншу вкладку діалогового вікна, перемістіть фокус на меню вкладки, а потім натисніть відповідну клавішу зі стрілкою,\n' + + ' щоб циклічно переходити по доступним вкладкам.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/vi.js b/public/js/tinymce/plugins/help/js/i18n/keynav/vi.js new file mode 100644 index 000000000..83d570d6e --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/vi.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.vi', +'

    Bắt đầu điều hướng bàn phím

    \n' + + '\n' + + '
    \n' + + '
    Tập trung vào thanh menu
    \n' + + '
    Windows hoặc Linux: Alt+F9
    \n' + + '
    macOS: ⌥F9
    \n' + + '
    Tập trung vào thanh công cụ
    \n' + + '
    Windows hoặc Linux: Alt+F10
    \n' + + '
    macOS: ⌥F10
    \n' + + '
    Tập trung vào chân trang
    \n' + + '
    Windows hoặc Linux: Alt+F11
    \n' + + '
    macOS: ⌥F11
    \n' + + '
    Tập trung vào thanh công cụ ngữ cảnh
    \n' + + '
    Windows, Linux hoặc macOS: Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    Điều hướng sẽ bắt đầu từ mục UI đầu tiên. Mục này sẽ được tô sáng hoặc có gạch dưới (nếu là mục đầu tiên trong\n' + + ' đường dẫn phần tử Chân trang).

    \n' + + '\n' + + '

    Di chuyển qua lại giữa các phần UI

    \n' + + '\n' + + '

    Để di chuyển từ một phần UI sang phần tiếp theo, ấn Tab.

    \n' + + '\n' + + '

    Để di chuyển từ một phần UI về phần trước đó, ấn Shift+Tab.

    \n' + + '\n' + + '

    Thứ tự Tab của các phần UI này như sau:\n' + + '\n' + + '

      \n' + + '
    1. Thanh menu
    2. \n' + + '
    3. Từng nhóm thanh công cụ
    4. \n' + + '
    5. Thanh bên
    6. \n' + + '
    7. Đường dẫn phần tử trong chân trang
    8. \n' + + '
    9. Nút chuyển đổi đếm chữ ở chân trang
    10. \n' + + '
    11. Liên kết thương hiệu ở chân trang
    12. \n' + + '
    13. Núm điều tác chỉnh kích cỡ trình soạn thảo ở chân trang
    14. \n' + + '
    \n' + + '\n' + + '

    Nếu người dùng không thấy một phần UI, thì có nghĩa phần đó bị bỏ qua.

    \n' + + '\n' + + '

    Nếu ở chân trang có tính năng tập trung điều hướng bàn phím, mà không có thanh bên nào hiện hữu, thao tác ấn Shift+Tab\n' + + ' sẽ chuyển hướng tập trung vào nhóm thanh công cụ đầu tiên, không phải cuối cùng.\n' + + '\n' + + '

    Di chuyển qua lại trong các phần UI

    \n' + + '\n' + + '

    Để di chuyển từ một phần tử UI sang phần tiếp theo, ấn phím Mũi tên tương ứng cho phù hợp.

    \n' + + '\n' + + '

    Các phím mũi tên TráiPhải

    \n' + + '\n' + + '
      \n' + + '
    • di chuyển giữa các menu trong thanh menu.
    • \n' + + '
    • mở menu phụ trong một menu.
    • \n' + + '
    • di chuyển giữa các nút trong nhóm thanh công cụ.
    • \n' + + '
    • di chuyển giữa các mục trong đường dẫn phần tử của chân trang.
    • \n' + + '
    \n' + + '\n' + + '

    Các phím mũi tên Hướng xuốngHướng lên\n' + + '\n' + + '

      \n' + + '
    • di chuyển giữa các mục menu trong menu.
    • \n' + + '
    • di chuyển giữa các mục trong menu thanh công cụ dạng bật lên.
    • \n' + + '
    \n' + + '\n' + + '

    Các phím mũi tên xoay vòng trong một phần UI tập trung.

    \n' + + '\n' + + '

    Để đóng một menu mở, một menu phụ đang mở, hoặc một menu dạng bật lên đang mở, hãy ấn phím Esc.\n' + + '\n' + + '

    Nếu trọng tâm hiện tại là ở phần “đầu” của một phần UI cụ thể, thao tác ấn phím Esc cũng sẽ thoát\n' + + ' toàn bộ phần điều hướng bàn phím.

    \n' + + '\n' + + '

    Thực hiện chức năng của một mục menu hoặc nút thanh công cụ

    \n' + + '\n' + + '

    Khi mục menu hoặc nút thanh công cụ muốn dùng được tô sáng, hãy ấn Return, Enter,\n' + + ' hoặc Phím cách để thực hiện chức năng mục đó.\n' + + '\n' + + '

    Điều hướng giữa các hộp thoại không có nhiều tab

    \n' + + '\n' + + '

    Trong các hộp thoại không có nhiều tab, khi hộp thoại mở ra, trọng tâm sẽ hướng vào thành phần tương tác đầu tiên.

    \n' + + '\n' + + '

    Di chuyển giữa các thành phần hộp thoại tương tác bằng cách ấn Tab hoặc Shift+Tab.

    \n' + + '\n' + + '

    Điều hướng giữa các hộp thoại có nhiều tab

    \n' + + '\n' + + '

    Trong các hộp thoại có nhiều tab, khi hộp thoại mở ra, trọng tâm sẽ hướng vào nút đầu tiên trong menu tab.

    \n' + + '\n' + + '

    Di chuyển giữa các thành phần tương tác của tab hộp thoại này bằng cách ấn Tab hoặc\n' + + ' Shift+Tab.

    \n' + + '\n' + + '

    Chuyển sang một tab hộp thoại khác bằng cách chuyển trọng tâm vào menu tab, rồi ấn phím Mũi tên phù hợp\n' + + ' để xoay vòng các tab hiện có.

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/zh_CN.js b/public/js/tinymce/plugins/help/js/i18n/keynav/zh_CN.js new file mode 100644 index 000000000..41fe62c35 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/zh_CN.js @@ -0,0 +1,84 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.zh_CN', +'

    开始键盘导航

    \n' + + '\n' + + '
    \n' + + '
    聚焦于菜单栏
    \n' + + '
    Windows 或 Linux:Alt+F9
    \n' + + '
    macOS:⌥F9
    \n' + + '
    聚焦于工具栏
    \n' + + '
    Windows 或 Linux:Alt+F10
    \n' + + '
    macOS:⌥F10
    \n' + + '
    聚焦于页脚
    \n' + + '
    Windows 或 Linux:Alt+F11
    \n' + + '
    macOS:⌥F11
    \n' + + '
    聚焦于上下文工具栏
    \n' + + '
    Windows、Linux 或 macOS:Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    导航将在第一个 UI 项上开始,其中突出显示该项,或者对于页脚元素路径中的第一项,将为其添加下划线。

    \n' + + '\n' + + '

    在 UI 部分之间导航

    \n' + + '\n' + + '

    要从一个 UI 部分移至下一个,请按 Tab

    \n' + + '\n' + + '

    要从一个 UI 部分移至上一个,请按 Shift+Tab

    \n' + + '\n' + + '

    这些 UI 部分的 Tab 顺序为:\n' + + '\n' + + '

      \n' + + '
    1. 菜单栏
    2. \n' + + '
    3. 每个工具栏组
    4. \n' + + '
    5. 边栏
    6. \n' + + '
    7. 页脚中的元素路径
    8. \n' + + '
    9. 页脚中的字数切换按钮
    10. \n' + + '
    11. 页脚中的品牌链接
    12. \n' + + '
    13. 页脚中的编辑器调整大小图柄
    14. \n' + + '
    \n' + + '\n' + + '

    如果不存在某个 UI 部分,则跳过它。

    \n' + + '\n' + + '

    如果键盘导航焦点在页脚,并且没有可见的边栏,则按 Shift+Tab 将焦点移至第一个工具栏组而非最后一个。\n' + + '\n' + + '

    在 UI 部分内导航

    \n' + + '\n' + + '

    要从一个 UI 元素移至下一个,请按相应的箭头键。

    \n' + + '\n' + + '

    箭头键

    \n' + + '\n' + + '
      \n' + + '
    • 在菜单栏中的菜单之间移动。
    • \n' + + '
    • 打开菜单中的子菜单。
    • \n' + + '
    • 在工具栏组中的按钮之间移动。
    • \n' + + '
    • 在页脚的元素路径中的各项之间移动。
    • \n' + + '
    \n' + + '\n' + + '

    箭头键\n' + + '\n' + + '

      \n' + + '
    • 在菜单中的菜单项之间移动。
    • \n' + + '
    • 在工具栏弹出菜单中的各项之间移动。
    • \n' + + '
    \n' + + '\n' + + '

    箭头键在具有焦点的 UI 部分内循环。

    \n' + + '\n' + + '

    要关闭打开的菜单、打开的子菜单或打开的弹出菜单,请按 Esc 键。\n' + + '\n' + + '

    如果当前的焦点在特定 UI 部分的“顶部”,则按 Esc 键还将完全退出键盘导航。

    \n' + + '\n' + + '

    执行菜单项或工具栏按钮

    \n' + + '\n' + + '

    当突出显示所需的菜单项或工具栏按钮时,按 ReturnEnter空格以执行该项。\n' + + '\n' + + '

    在非标签页式对话框中导航

    \n' + + '\n' + + '

    在非标签页式对话框中,当对话框打开时,第一个交互组件获得焦点。

    \n' + + '\n' + + '

    通过按 TabShift+Tab,在交互对话框组件之间导航。

    \n' + + '\n' + + '

    在标签页式对话框中导航

    \n' + + '\n' + + '

    在标签页式对话框中,当对话框打开时,标签页菜单中的第一个按钮获得焦点。

    \n' + + '\n' + + '

    通过按 TabShift+Tab,在此对话框的交互组件之间导航。

    \n' + + '\n' + + '

    通过将焦点移至另一对话框标签页的菜单,然后按相应的箭头键以在可用的标签页间循环,从而切换到该对话框标签页。

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/js/i18n/keynav/zh_TW.js b/public/js/tinymce/plugins/help/js/i18n/keynav/zh_TW.js new file mode 100644 index 000000000..26b3dd268 --- /dev/null +++ b/public/js/tinymce/plugins/help/js/i18n/keynav/zh_TW.js @@ -0,0 +1,90 @@ +tinymce.Resource.add('tinymce.html-i18n.help-keynav.zh_TW', +'

    開始鍵盤瀏覽

    \n' + + '\n' + + '
    \n' + + '
    跳至功能表列
    \n' + + '
    Windows 或 Linux:Alt+F9
    \n' + + '
    macOS:⌥F9
    \n' + + '
    跳至工具列
    \n' + + '
    Windows 或 Linux:Alt+F10
    \n' + + '
    macOS:⌥F10
    \n' + + '
    跳至頁尾
    \n' + + '
    Windows 或 Linux:Alt+F11
    \n' + + '
    macOS:⌥F11
    \n' + + '
    跳至關聯式工具列
    \n' + + '
    Windows、Linux 或 macOS:Ctrl+F9\n' + + '
    \n' + + '\n' + + '

    瀏覽會從第一個 UI 項目開始,該項目會反白顯示,但如果是「頁尾」元素路徑的第一項,\n' + + ' 則加底線。

    \n' + + '\n' + + '

    在 UI 區段之間瀏覽

    \n' + + '\n' + + '

    從 UI 區段移至下一個,請按 Tab

    \n' + + '\n' + + '

    從 UI 區段移回上一個,請按 Shift+Tab

    \n' + + '\n' + + '

    這些 UI 區段的 Tab 順序如下:\n' + + '\n' + + '

      \n' + + '
    1. 功能表列
    2. \n' + + '
    3. 各個工具列群組
    4. \n' + + '
    5. 側邊欄
    6. \n' + + '
    7. 頁尾中的元素路徑
    8. \n' + + '
    9. 頁尾中字數切換按鈕
    10. \n' + + '
    11. 頁尾中的品牌連結
    12. \n' + + '
    13. 頁尾中編輯器調整大小控點
    14. \n' + + '
    \n' + + '\n' + + '

    如果 UI 區段未顯示,表示已略過該區段。

    \n' + + '\n' + + '

    如果鍵盤瀏覽跳至頁尾,但沒有顯示側邊欄,則按下 Shift+Tab\n' + + ' 會跳至第一個工具列群組,而不是最後一個。\n' + + '\n' + + '

    在 UI 區段之內瀏覽

    \n' + + '\n' + + '

    在兩個 UI 元素之間移動,請按適當的方向鍵。

    \n' + + '\n' + + '

    向左向右方向鍵

    \n' + + '\n' + + '
      \n' + + '
    • 在功能表列中的功能表之間移動。
    • \n' + + '
    • 開啟功能表中的子功能表。
    • \n' + + '
    • 在工具列群組中的按鈕之間移動。
    • \n' + + '
    • 在頁尾的元素路徑中項目之間移動。
    • \n' + + '
    \n' + + '\n' + + '

    向下向上方向鍵\n' + + '\n' + + '

      \n' + + '
    • 在功能表中的功能表項目之間移動。
    • \n' + + '
    • 在工具列快顯功能表中的項目之間移動。
    • \n' + + '
    \n' + + '\n' + + '

    方向鍵會在所跳至 UI 區段之內循環。

    \n' + + '\n' + + '

    若要關閉已開啟的功能表、已開啟的子功能表,或已開啟的快顯功能表,請按 Esc 鍵。\n' + + '\n' + + '

    如果目前已跳至特定 UI 區段的「頂端」,則按 Esc 鍵也會結束\n' + + ' 整個鍵盤瀏覽。

    \n' + + '\n' + + '

    執行功能表列項目或工具列按鈕

    \n' + + '\n' + + '

    當想要的功能表項目或工具列按鈕已反白顯示時,按 ReturnEnter、\n' + + ' 或空白鍵即可執行該項目。\n' + + '\n' + + '

    瀏覽非索引標籤式對話方塊

    \n' + + '\n' + + '

    在非索引標籤式對話方塊中,開啟對話方塊時會跳至第一個互動元件。

    \n' + + '\n' + + '

    TabShift+Tab 即可在互動式對話方塊元件之間瀏覽。

    \n' + + '\n' + + '

    瀏覽索引標籤式對話方塊

    \n' + + '\n' + + '

    在索引標籤式對話方塊中,開啟對話方塊時會跳至索引標籤式功能表中的第一個按鈕。

    \n' + + '\n' + + '

    若要在此對話方塊的互動式元件之間瀏覽,請按 Tab 或\n' + + ' Shift+Tab

    \n' + + '\n' + + '

    先跳至索引標籤式功能表,然後按適當的方向鍵,即可切換至另一個對話方塊索引標籤,\n' + + ' 以循環瀏覽可用的索引標籤。

    \n'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/help/plugin.js b/public/js/tinymce/plugins/help/plugin.js index b989a0749..dfcd5185d 100644 --- a/public/js/tinymce/plugins/help/plugin.js +++ b/public/js/tinymce/plugins/help/plugin.js @@ -1,44 +1,59 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; - var Cell = function (initial) { - var value = initial; - var get = function () { + const Cell = initial => { + let value = initial; + const get = () => { return value; }; - var set = function (v) { + const set = v => { value = v; }; return { - get: get, - set: set + get, + set }; }; - var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + var global$4 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + let unique = 0; + const generate = prefix => { + const date = new Date(); + const time = date.getTime(); + const random = Math.floor(Math.random() * 1000000000); + unique++; + return prefix + '_' + random + unique + String(time); + }; - var get$1 = function (customTabs) { - var addTab = function (spec) { - var currentCustomTabs = customTabs.get(); - currentCustomTabs[spec.name] = spec; + const get$1 = customTabs => { + const addTab = spec => { + var _a; + const name = (_a = spec.name) !== null && _a !== void 0 ? _a : generate('tab-name'); + const currentCustomTabs = customTabs.get(); + currentCustomTabs[name] = spec; customTabs.set(currentCustomTabs); }; - return { addTab: addTab }; + return { addTab }; }; - var register$1 = function (editor, dialogOpener) { + const register$2 = (editor, dialogOpener) => { editor.addCommand('mceHelp', dialogOpener); }; - var register = function (editor, dialogOpener) { + const option = name => editor => editor.options.get(name); + const register$1 = editor => { + const registerOption = editor.options.register; + registerOption('help_tabs', { processor: 'array' }); + }; + const getHelpTabs = option('help_tabs'); + const getForcedPlugins = option('forced_plugins'); + + const register = (editor, dialogOpener) => { editor.ui.registry.addButton('help', { icon: 'help', tooltip: 'Help', @@ -52,150 +67,161 @@ }); }; - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } + }; + const typeOf = x => { + const t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && Array.isArray(x)) { + return 'array'; + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { + return 'string'; + } else { return t; - }; - return __assign.apply(this, arguments); + } }; + const isType = type => value => typeOf(value) === type; + const isSimpleType = type => value => typeof value === type; + const eq = t => a => t === a; + const isString = isType('string'); + const isUndefined = eq(undefined); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); + const isFunction = isSimpleType('function'); - var noop = function () { - }; - var constant = function (value) { - return function () { + const constant = value => { + return () => { return value; }; }; - var identity = function (x) { - return x; - }; - var never = constant(false); - var always = constant(true); + const never = constant(false); - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from - }; + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); - var nativeIndexOf = Array.prototype.indexOf; - var rawIndexOf = function (ts, t) { - return nativeIndexOf.call(ts, t); - }; - var contains = function (xs, x) { - return rawIndexOf(xs, x) > -1; - }; - var map = function (xs, f) { - var len = xs.length; - var r = new Array(len); - for (var i = 0; i < len; i++) { - var x = xs[i]; + const nativeSlice = Array.prototype.slice; + const nativeIndexOf = Array.prototype.indexOf; + const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t); + const contains = (xs, x) => rawIndexOf(xs, x) > -1; + const map = (xs, f) => { + const len = xs.length; + const r = new Array(len); + for (let i = 0; i < len; i++) { + const x = xs[i]; r[i] = f(x, i); } return r; }; - var filter = function (xs, pred) { - var r = []; - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const filter = (xs, pred) => { + const r = []; + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; if (pred(x, i)) { r.push(x); } } return r; }; - var findUntil = function (xs, pred, until) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const findUntil = (xs, pred, until) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; if (pred(x, i)) { return Optional.some(x); } else if (until(x, i)) { @@ -204,43 +230,50 @@ } return Optional.none(); }; - var find = function (xs, pred) { + const find = (xs, pred) => { return findUntil(xs, pred, never); }; + const sort = (xs, comparator) => { + const copy = nativeSlice.call(xs, 0); + copy.sort(comparator); + return copy; + }; - var keys = Object.keys; - var hasOwnProperty = Object.hasOwnProperty; - var get = function (obj, key) { + const keys = Object.keys; + const hasOwnProperty = Object.hasOwnProperty; + const get = (obj, key) => { return has(obj, key) ? Optional.from(obj[key]) : Optional.none(); }; - var has = function (obj, key) { - return hasOwnProperty.call(obj, key); - }; + const has = (obj, key) => hasOwnProperty.call(obj, key); - var cat = function (arr) { - var r = []; - var push = function (x) { + const cat = arr => { + const r = []; + const push = x => { r.push(x); }; - for (var i = 0; i < arr.length; i++) { + for (let i = 0; i < arr.length; i++) { arr[i].each(push); } return r; }; - var getHelpTabs = function (editor) { - return Optional.from(editor.getParam('help_tabs')); - }; - var getForcedPlugins = function (editor) { - return editor.getParam('forced_plugins'); + var global$3 = tinymce.util.Tools.resolve('tinymce.Resource'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.I18n'); + + const pLoadHtmlByLangCode = (baseUrl, langCode) => global$3.load(`tinymce.html-i18n.help-keynav.${ langCode }`, `${ baseUrl }/js/i18n/keynav/${ langCode }.js`); + const pLoadI18nHtml = baseUrl => pLoadHtmlByLangCode(baseUrl, global$2.getCode()).catch(() => pLoadHtmlByLangCode(baseUrl, 'en')); + const initI18nLoad = (editor, baseUrl) => { + editor.on('init', () => { + pLoadI18nHtml(baseUrl); + }); }; - var description = '

    Editor UI keyboard navigation

    \n\n

    Activating keyboard navigation

    \n\n

    The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

    \n
      \n
    • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
    • \n
    • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
    • \n
    • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
    • \n
    \n\n

    Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

    \n\n

    Moving between UI sections

    \n\n

    When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

    \n
      \n
    • the menubar
    • \n
    • each group of the toolbar
    • \n
    • the sidebar
    • \n
    • the element path in the footer
    • \n
    • the wordcount toggle button in the footer
    • \n
    • the branding link in the footer
    • \n
    • the editor resize handle in the footer
    • \n
    \n\n

    Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

    \n\n

    Moving within UI sections

    \n\n

    Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

    \n
      \n
    • moving between menus in the menubar
    • \n
    • moving between buttons in a toolbar group
    • \n
    • moving between items in the element path
    • \n
    \n\n

    In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

    \n\n

    Executing buttons

    \n\n

    To execute a button, navigate the selection to the desired button and hit space or enter.

    \n\n

    Opening, navigating and closing menus

    \n\n

    When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

    \n\n

    To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

    \n\n

    Context toolbars and menus

    \n\n

    To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

    \n\n

    Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

    \n\n

    Dialog navigation

    \n\n

    There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

    \n\n

    When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

    \n\n

    When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

    '; - var tab$3 = function () { - var body = { + const pTab = async pluginUrl => { + const body = { type: 'htmlpanel', presets: 'document', - html: description + html: await pLoadI18nHtml(pluginUrl) }; return { name: 'keyboardnav', @@ -249,30 +282,31 @@ }; }; - var global$2 = tinymce.util.Tools.resolve('tinymce.Env'); + var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); - var convertText = function (source) { - var mac = { + const convertText = source => { + const isMac = global$1.os.isMacOS() || global$1.os.isiOS(); + const mac = { alt: '⌥', ctrl: '⌃', shift: '⇧', meta: '⌘', access: '⌃⌥' }; - var other = { + const other = { meta: 'Ctrl ', access: 'Shift + Alt ' }; - var replace = global$2.mac ? mac : other; - var shortcut = source.split('+'); - var updated = map(shortcut, function (segment) { - var search = segment.toLowerCase().trim(); + const replace = isMac ? mac : other; + const shortcut = source.split('+'); + const updated = map(shortcut, segment => { + const search = segment.toLowerCase().trim(); return has(replace, search) ? replace[search] : segment; }); - return global$2.mac ? updated.join('').replace(/\s/, '') : updated.join('+'); + return isMac ? updated.join('').replace(/\s/, '') : updated.join('+'); }; - var shortcuts = [ + const shortcuts = [ { shortcuts: ['Meta + B'], action: 'Bold' @@ -378,15 +412,15 @@ } ]; - var tab$2 = function () { - var shortcutList = map(shortcuts, function (shortcut) { - var shortcutText = map(shortcut.shortcuts, convertText).join(' or '); + const tab$2 = () => { + const shortcutList = map(shortcuts, shortcut => { + const shortcutText = map(shortcut.shortcuts, convertText).join(' or '); return [ shortcut.action, shortcutText ]; }); - var tablePanel = { + const tablePanel = { type: 'table', header: [ 'Action', @@ -401,9 +435,11 @@ }; }; - var global$1 = tinymce.util.Tools.resolve('tinymce.util.I18n'); - - var urls = map([ + const urls = map([ + { + key: 'accordion', + name: 'Accordion' + }, { key: 'advlist', name: 'Advanced List' @@ -424,10 +460,6 @@ key: 'autosave', name: 'Autosave' }, - { - key: 'bbcode', - name: 'BBCode' - }, { key: 'charmap', name: 'Character Map' @@ -452,10 +484,6 @@ key: 'emoticons', name: 'Emoticons' }, - { - key: 'fullpage', - name: 'Full Page' - }, { key: 'fullscreen', name: 'Full Screen' @@ -464,18 +492,10 @@ key: 'help', name: 'Help' }, - { - key: 'hr', - name: 'Horizontal Rule' - }, { key: 'image', name: 'Image' }, - { - key: 'imagetools', - name: 'Image Tools' - }, { key: 'importcss', name: 'Import CSS' @@ -484,10 +504,6 @@ key: 'insertdatetime', name: 'Insert Date/Time' }, - { - key: 'legacyoutput', - name: 'Legacy Output' - }, { key: 'link', name: 'Link' @@ -504,26 +520,14 @@ key: 'nonbreaking', name: 'Nonbreaking' }, - { - key: 'noneditable', - name: 'Noneditable' - }, { key: 'pagebreak', name: 'Page Break' }, - { - key: 'paste', - name: 'Paste' - }, { key: 'preview', name: 'Preview' }, - { - key: 'print', - name: 'Print' - }, { key: 'quickbars', name: 'Quick Toolbars' @@ -536,14 +540,6 @@ key: 'searchreplace', name: 'Search and Replace' }, - { - key: 'spellchecker', - name: 'Spell Checker' - }, - { - key: 'tabfocus', - name: 'Tab Focus' - }, { key: 'table', name: 'Table' @@ -556,14 +552,6 @@ key: 'textcolor', name: 'Text Color' }, - { - key: 'textpattern', - name: 'Text Pattern' - }, - { - key: 'toc', - name: 'Table of Contents' - }, { key: 'visualblocks', name: 'Visual Blocks' @@ -592,9 +580,10 @@ type: 'premium' }, { - key: 'autocorrect', - name: 'Autocorrect', - type: 'premium' + key: 'advtemplate', + name: 'Advanced Templates', + type: 'premium', + slug: 'advanced-templates' }, { key: 'casechange', @@ -607,13 +596,30 @@ type: 'premium' }, { - key: 'export', - name: 'Export', + key: 'editimage', + name: 'Enhanced Image Editing', type: 'premium' }, + { + key: 'footnotes', + name: 'Footnotes', + type: 'premium' + }, + { + key: 'typography', + name: 'Advanced Typography', + type: 'premium', + slug: 'advanced-typography' + }, { key: 'mediaembed', name: 'Enhanced Media Embed', + type: 'premium', + slug: 'introduction-to-mediaembed' + }, + { + key: 'export', + name: 'Export', type: 'premium' }, { @@ -621,6 +627,12 @@ name: 'Format Painter', type: 'premium' }, + { + key: 'inlinecss', + name: 'Inline CSS', + type: 'premium', + slug: 'inline-css' + }, { key: 'linkchecker', name: 'Link Checker', @@ -631,6 +643,11 @@ name: 'Mentions', type: 'premium' }, + { + key: 'mergetags', + name: 'Merge Tags', + type: 'premium' + }, { key: 'pageembed', name: 'Page Embed', @@ -644,91 +661,115 @@ { key: 'powerpaste', name: 'PowerPaste', - type: 'premium' + type: 'premium', + slug: 'introduction-to-powerpaste' }, { key: 'rtc', name: 'Real-Time Collaboration', - type: 'premium' + type: 'premium', + slug: 'rtc-introduction' }, { key: 'tinymcespellchecker', name: 'Spell Checker Pro', + type: 'premium', + slug: 'introduction-to-tiny-spellchecker' + }, + { + key: 'autocorrect', + name: 'Spelling Autocorrect', + type: 'premium' + }, + { + key: 'tableofcontents', + name: 'Table of Contents', type: 'premium' }, { key: 'tinycomments', name: 'Tiny Comments', type: 'premium', - slug: 'comments' + slug: 'introduction-to-tiny-comments' }, { key: 'tinydrive', name: 'Tiny Drive', - type: 'premium' + type: 'premium', + slug: 'tinydrive-introduction' } - ], function (item) { - return __assign(__assign({}, item), { - type: item.type || 'opensource', - slug: item.slug || item.key - }); - }); + ], item => ({ + ...item, + type: item.type || 'opensource', + slug: item.slug || item.key + })); - var tab$1 = function (editor) { - var availablePlugins = function () { - var premiumPlugins = filter(urls, function (_a) { - var key = _a.key, type = _a.type; - return key !== 'autocorrect' && type === 'premium'; - }); - var premiumPluginList = map(premiumPlugins, function (plugin) { - return '
  • ' + global$1.translate(plugin.name) + '
  • '; - }).join(''); - return '
    ' + '

    ' + global$1.translate('Premium plugins:') + '

    ' + '' + '
    '; - }; - var makeLink = function (p) { - return '' + p.name + ''; - }; - var maybeUrlize = function (editor, key) { - return find(urls, function (x) { - return x.key === key; - }).fold(function () { - var getMetadata = editor.plugins[key].getMetadata; - return typeof getMetadata === 'function' ? makeLink(getMetadata()) : key; - }, function (x) { - var name = x.type === 'premium' ? x.name + '*' : x.name; - return makeLink({ - name: name, - url: 'https://www.tiny.cloud/docs/plugins/' + x.type + '/' + x.slug - }); + const tab$1 = editor => { + const availablePlugins = () => { + const premiumPlugins = filter(urls, ({type}) => { + return type === 'premium'; }); + const sortedPremiumPlugins = sort(map(premiumPlugins, p => p.name), (s1, s2) => s1.localeCompare(s2)); + const premiumPluginList = map(sortedPremiumPlugins, pluginName => `
  • ${ pluginName }
  • `).join(''); + return '
    ' + '

    ' + global$2.translate('Premium plugins:') + '

    ' + '' + '
    '; + }; + const makeLink = p => `${ p.name }`; + const identifyUnknownPlugin = (editor, key) => { + const getMetadata = editor.plugins[key].getMetadata; + if (isFunction(getMetadata)) { + const metadata = getMetadata(); + return { + name: metadata.name, + html: makeLink(metadata) + }; + } else { + return { + name: key, + html: key + }; + } }; - var getPluginKeys = function (editor) { - var keys$1 = keys(editor.plugins); - var forced_plugins = getForcedPlugins(editor); - return forced_plugins === undefined ? keys$1 : filter(keys$1, function (k) { - return !contains(forced_plugins, k); + const getPluginData = (editor, key) => find(urls, x => { + return x.key === key; + }).fold(() => { + return identifyUnknownPlugin(editor, key); + }, x => { + const name = x.type === 'premium' ? `${ x.name }*` : x.name; + const html = makeLink({ + name, + url: `https://www.tiny.cloud/docs/tinymce/6/${ x.slug }/` }); - }; - var pluginLister = function (editor) { - var pluginKeys = getPluginKeys(editor); - var pluginLis = map(pluginKeys, function (key) { - return '
  • ' + maybeUrlize(editor, key) + '
  • '; + return { + name, + html + }; + }); + const getPluginKeys = editor => { + const keys$1 = keys(editor.plugins); + const forcedPlugins = getForcedPlugins(editor); + return isUndefined(forcedPlugins) ? keys$1 : filter(keys$1, k => !contains(forcedPlugins, k)); + }; + const pluginLister = editor => { + const pluginKeys = getPluginKeys(editor); + const sortedPluginData = sort(map(pluginKeys, k => getPluginData(editor, k)), (pd1, pd2) => pd1.name.localeCompare(pd2.name)); + const pluginLis = map(sortedPluginData, key => { + return '
  • ' + key.html + '
  • '; }); - var count = pluginLis.length; - var pluginsString = pluginLis.join(''); - var html = '

    ' + global$1.translate([ + const count = pluginLis.length; + const pluginsString = pluginLis.join(''); + const html = '

    ' + global$2.translate([ 'Plugins installed ({0}):', count ]) + '

    ' + '
      ' + pluginsString + '
    '; return html; }; - var installedPlugins = function (editor) { + const installedPlugins = editor => { if (editor == null) { return ''; } return '
    ' + pluginLister(editor) + '
    '; }; - var htmlPanel = { + const htmlPanel = { type: 'htmlpanel', presets: 'document', html: [ @@ -745,15 +786,13 @@ var global = tinymce.util.Tools.resolve('tinymce.EditorManager'); - var tab = function () { - var getVersion = function (major, minor) { - return major.indexOf('@') === 0 ? 'X.X.X' : major + '.' + minor; - }; - var version = getVersion(global.majorVersion, global.minorVersion); - var changeLogLink = 'TinyMCE ' + version + ''; - var htmlPanel = { + const tab = () => { + const getVersion = (major, minor) => major.indexOf('@') === 0 ? 'X.X.X' : major + '.' + minor; + const version = getVersion(global.majorVersion, global.minorVersion); + const changeLogLink = 'TinyMCE ' + version + ''; + const htmlPanel = { type: 'htmlpanel', - html: '

    ' + global$1.translate([ + html: '

    ' + global$2.translate([ 'You are using {0}', changeLogLink ]) + '

    ', @@ -766,64 +805,64 @@ }; }; - var parseHelpTabsSetting = function (tabsFromSettings, tabs) { - var newTabs = {}; - var names = map(tabsFromSettings, function (t) { - if (typeof t === 'string') { + const parseHelpTabsSetting = (tabsFromSettings, tabs) => { + const newTabs = {}; + const names = map(tabsFromSettings, t => { + var _a; + if (isString(t)) { if (has(tabs, t)) { newTabs[t] = tabs[t]; } return t; } else { - newTabs[t.name] = t; - return t.name; + const name = (_a = t.name) !== null && _a !== void 0 ? _a : generate('tab-name'); + newTabs[name] = t; + return name; } }); return { tabs: newTabs, - names: names + names }; }; - var getNamesFromTabs = function (tabs) { - var names = keys(tabs); - var idx = names.indexOf('versions'); + const getNamesFromTabs = tabs => { + const names = keys(tabs); + const idx = names.indexOf('versions'); if (idx !== -1) { names.splice(idx, 1); names.push('versions'); } return { - tabs: tabs, - names: names - }; - }; - var parseCustomTabs = function (editor, customTabs) { - var _a; - var shortcuts = tab$2(); - var nav = tab$3(); - var plugins = tab$1(editor); - var versions = tab(); - var tabs = __assign((_a = {}, _a[shortcuts.name] = shortcuts, _a[nav.name] = nav, _a[plugins.name] = plugins, _a[versions.name] = versions, _a), customTabs.get()); - return getHelpTabs(editor).fold(function () { - return getNamesFromTabs(tabs); - }, function (tabsFromSettings) { - return parseHelpTabsSetting(tabsFromSettings, tabs); - }); - }; - var init = function (editor, customTabs) { - return function () { - var _a = parseCustomTabs(editor, customTabs), tabs = _a.tabs, names = _a.names; - var foundTabs = map(names, function (name) { - return get(tabs, name); - }); - var dialogTabs = cat(foundTabs); - var body = { + tabs, + names + }; + }; + const pParseCustomTabs = async (editor, customTabs, pluginUrl) => { + const shortcuts = tab$2(); + const nav = await pTab(pluginUrl); + const plugins = tab$1(editor); + const versions = tab(); + const tabs = { + [shortcuts.name]: shortcuts, + [nav.name]: nav, + [plugins.name]: plugins, + [versions.name]: versions, + ...customTabs.get() + }; + return Optional.from(getHelpTabs(editor)).fold(() => getNamesFromTabs(tabs), tabsFromSettings => parseHelpTabsSetting(tabsFromSettings, tabs)); + }; + const init = (editor, customTabs, pluginUrl) => () => { + pParseCustomTabs(editor, customTabs, pluginUrl).then(({tabs, names}) => { + const foundTabs = map(names, name => get(tabs, name)); + const dialogTabs = cat(foundTabs); + const body = { type: 'tabpanel', tabs: dialogTabs }; editor.windowManager.open({ title: 'Help', size: 'medium', - body: body, + body, buttons: [{ type: 'cancel', name: 'close', @@ -832,21 +871,23 @@ }], initialData: {} }); - }; + }); }; - function Plugin () { - global$3.add('help', function (editor) { - var customTabs = Cell({}); - var api = get$1(customTabs); - var dialogOpener = init(editor, customTabs); + var Plugin = () => { + global$4.add('help', (editor, pluginUrl) => { + const customTabs = Cell({}); + const api = get$1(customTabs); + register$1(editor); + const dialogOpener = init(editor, customTabs, pluginUrl); register(editor, dialogOpener); - register$1(editor, dialogOpener); + register$2(editor, dialogOpener); editor.shortcuts.add('Alt+0', 'Open help dialog', 'mceHelp'); + initI18nLoad(editor, pluginUrl); return api; }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/help/plugin.min.js b/public/js/tinymce/plugins/help/plugin.min.js index a34c24ca8..1460eab37 100644 --- a/public/js/tinymce/plugins/help/plugin.min.js +++ b/public/js/tinymce/plugins/help/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function i(e){return function(){return e}}function e(e){return e}function t(){return s}var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=function(){return(g=Object.assign||function(e){for(var t,n=1,a=arguments.length;n'+e.name+""}var t,o,n,i,r,s,l,c;return{name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:[null==e?"":'
    '+(s=b((i=w((n=o=e).plugins),void 0===(r=n.getParam("forced_plugins"))?i:m(i,function(e){return!(-1"+(t=o,n=e,function(e,t,n){for(var a=0,o=e.length;a";var t,n}),l=s.length,c=s.join(""),"

    "+T.translate(["Plugins installed ({0}):",l])+"

      "+c+"
    ")+"
    ",(t=b(m(d,function(e){var t=e.key,n=e.type;return"autocorrect"!==t&&"premium"===n}),function(e){return"
  • "+T.translate(e.name)+"
  • "}).join(""),'

    '+T.translate("Premium plugins:")+"

    ")].join("")}]}}function l(d,y){return function(){var e,t,n,a,o,i,r,s,l,c,u,m=(e=d,t=y,r={name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:b(x,function(e){var t=b(e.shortcuts,f).join(" or ");return[e.action,t]})}]},s={name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:"

    Editor UI keyboard navigation

    \n\n

    Activating keyboard navigation

    \n\n

    The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

    \n
      \n
    • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
    • \n
    • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
    • \n
    • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
    • \n
    \n\n

    Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

    \n\n

    Moving between UI sections

    \n\n

    When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

    \n
      \n
    • the menubar
    • \n
    • each group of the toolbar
    • \n
    • the sidebar
    • \n
    • the element path in the footer
    • \n
    • the wordcount toggle button in the footer
    • \n
    • the branding link in the footer
    • \n
    • the editor resize handle in the footer
    • \n
    \n\n

    Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

    \n\n

    Moving within UI sections

    \n\n

    Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

    \n
      \n
    • moving between menus in the menubar
    • \n
    • moving between buttons in a toolbar group
    • \n
    • moving between items in the element path
    • \n
    \n\n

    In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

    \n\n

    Executing buttons

    \n\n

    To execute a button, navigate the selection to the desired button and hit space or enter.

    \n\n

    Opening, navigating and closing menus

    \n\n

    When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

    \n\n

    To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

    \n\n

    Context toolbars and menus

    \n\n

    To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

    \n\n

    Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

    \n\n

    Dialog navigation

    \n\n

    There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

    \n\n

    When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

    \n\n

    When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

    "}]},l=k(e),a=C.majorVersion,o=C.minorVersion,i=0===a.indexOf("@")?"X.X.X":a+"."+o,c={name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

    "+T.translate(["You are using {0}",'TinyMCE '+i+""])+"

    ",presets:"document"}]},u=g(((n={})[r.name]=r,n[s.name]=s,n[l.name]=l,n[c.name]=c,n),t.get()),v.from(e.getParam("help_tabs")).fold(function(){return-1!==(n=(t=w(e=u)).indexOf("versions"))&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t};var e,t,n},function(e){return t=u,n={},a=b(e,function(e){return"string"==typeof e?(A(t,e)&&(n[e]=t[e]),e):(n[e.name]=e).name}),{tabs:n,names:a};var t,n,a})),h=m.tabs,p=function(e){for(var t=[],n=function(e){t.push(e)},a=0;a{const n=(new Date).getTime(),a=Math.floor(1e9*Math.random());return t++,e+"_"+a+t+String(n)},a=e=>t=>t.options.get(e),r=a("help_tabs"),o=a("forced_plugins"),i=("string",e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=a=e,(r=String).prototype.isPrototypeOf(n)||(null===(o=a.constructor)||void 0===o?void 0:o.name)===r.name)?"string":t;var n,a,r,o})(e));const s=(void 0,e=>undefined===e);const c=e=>"function"==typeof e,l=(!1,()=>false);class m{constructor(e,t){this.tag=e,this.value=t}static some(e){return new m(!0,e)}static none(){return m.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?m.some(e(this.value)):m.none()}bind(e){return this.tag?e(this.value):m.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:m.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return null==e?m.none():m.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}m.singletonNone=new m(!1);const u=Array.prototype.slice,p=Array.prototype.indexOf,y=(e,t)=>{const n=e.length,a=new Array(n);for(let r=0;r{const n=[];for(let a=0,r=e.length;a{const n=u.call(e,0);return n.sort(t),n},g=Object.keys,k=Object.hasOwnProperty,v=(e,t)=>k.call(e,t);var b=tinymce.util.Tools.resolve("tinymce.Resource"),f=tinymce.util.Tools.resolve("tinymce.util.I18n");const A=(e,t)=>b.load(`tinymce.html-i18n.help-keynav.${t}`,`${e}/js/i18n/keynav/${t}.js`),C=e=>A(e,f.getCode()).catch((()=>A(e,"en")));var w=tinymce.util.Tools.resolve("tinymce.Env");const S=e=>{const t=w.os.isMacOS()||w.os.isiOS(),n=t?{alt:"⌥",ctrl:"⌃",shift:"⇧",meta:"⌘",access:"⌃⌥"}:{meta:"Ctrl ",access:"Shift + Alt "},a=e.split("+"),r=y(a,(e=>{const t=e.toLowerCase().trim();return v(n,t)?n[t]:e}));return t?r.join("").replace(/\s/,""):r.join("+")},M=[{shortcuts:["Meta + B"],action:"Bold"},{shortcuts:["Meta + I"],action:"Italic"},{shortcuts:["Meta + U"],action:"Underline"},{shortcuts:["Meta + A"],action:"Select all"},{shortcuts:["Meta + Y","Meta + Shift + Z"],action:"Redo"},{shortcuts:["Meta + Z"],action:"Undo"},{shortcuts:["Access + 1"],action:"Heading 1"},{shortcuts:["Access + 2"],action:"Heading 2"},{shortcuts:["Access + 3"],action:"Heading 3"},{shortcuts:["Access + 4"],action:"Heading 4"},{shortcuts:["Access + 5"],action:"Heading 5"},{shortcuts:["Access + 6"],action:"Heading 6"},{shortcuts:["Access + 7"],action:"Paragraph"},{shortcuts:["Access + 8"],action:"Div"},{shortcuts:["Access + 9"],action:"Address"},{shortcuts:["Alt + 0"],action:"Open help dialog"},{shortcuts:["Alt + F9"],action:"Focus to menubar"},{shortcuts:["Alt + F10"],action:"Focus to toolbar"},{shortcuts:["Alt + F11"],action:"Focus to element path"},{shortcuts:["Ctrl + F9"],action:"Focus to contextual toolbar"},{shortcuts:["Shift + Enter"],action:"Open popup menu for split buttons"},{shortcuts:["Meta + K"],action:"Insert link (if link plugin activated)"},{shortcuts:["Meta + S"],action:"Save (if save plugin activated)"},{shortcuts:["Meta + F"],action:"Find (if searchreplace plugin activated)"},{shortcuts:["Meta + Shift + F"],action:"Switch to or from fullscreen mode"}],T=()=>({name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:y(M,(e=>{const t=y(e.shortcuts,S).join(" or ");return[e.action,t]}))}]}),x=y([{key:"accordion",name:"Accordion"},{key:"advlist",name:"Advanced List"},{key:"anchor",name:"Anchor"},{key:"autolink",name:"Autolink"},{key:"autoresize",name:"Autoresize"},{key:"autosave",name:"Autosave"},{key:"charmap",name:"Character Map"},{key:"code",name:"Code"},{key:"codesample",name:"Code Sample"},{key:"colorpicker",name:"Color Picker"},{key:"directionality",name:"Directionality"},{key:"emoticons",name:"Emoticons"},{key:"fullscreen",name:"Full Screen"},{key:"help",name:"Help"},{key:"image",name:"Image"},{key:"importcss",name:"Import CSS"},{key:"insertdatetime",name:"Insert Date/Time"},{key:"link",name:"Link"},{key:"lists",name:"Lists"},{key:"media",name:"Media"},{key:"nonbreaking",name:"Nonbreaking"},{key:"pagebreak",name:"Page Break"},{key:"preview",name:"Preview"},{key:"quickbars",name:"Quick Toolbars"},{key:"save",name:"Save"},{key:"searchreplace",name:"Search and Replace"},{key:"table",name:"Table"},{key:"template",name:"Template"},{key:"textcolor",name:"Text Color"},{key:"visualblocks",name:"Visual Blocks"},{key:"visualchars",name:"Visual Characters"},{key:"wordcount",name:"Word Count"},{key:"a11ychecker",name:"Accessibility Checker",type:"premium"},{key:"advcode",name:"Advanced Code Editor",type:"premium"},{key:"advtable",name:"Advanced Tables",type:"premium"},{key:"advtemplate",name:"Advanced Templates",type:"premium",slug:"advanced-templates"},{key:"casechange",name:"Case Change",type:"premium"},{key:"checklist",name:"Checklist",type:"premium"},{key:"editimage",name:"Enhanced Image Editing",type:"premium"},{key:"footnotes",name:"Footnotes",type:"premium"},{key:"typography",name:"Advanced Typography",type:"premium",slug:"advanced-typography"},{key:"mediaembed",name:"Enhanced Media Embed",type:"premium",slug:"introduction-to-mediaembed"},{key:"export",name:"Export",type:"premium"},{key:"formatpainter",name:"Format Painter",type:"premium"},{key:"inlinecss",name:"Inline CSS",type:"premium",slug:"inline-css"},{key:"linkchecker",name:"Link Checker",type:"premium"},{key:"mentions",name:"Mentions",type:"premium"},{key:"mergetags",name:"Merge Tags",type:"premium"},{key:"pageembed",name:"Page Embed",type:"premium"},{key:"permanentpen",name:"Permanent Pen",type:"premium"},{key:"powerpaste",name:"PowerPaste",type:"premium",slug:"introduction-to-powerpaste"},{key:"rtc",name:"Real-Time Collaboration",type:"premium",slug:"rtc-introduction"},{key:"tinymcespellchecker",name:"Spell Checker Pro",type:"premium",slug:"introduction-to-tiny-spellchecker"},{key:"autocorrect",name:"Spelling Autocorrect",type:"premium"},{key:"tableofcontents",name:"Table of Contents",type:"premium"},{key:"tinycomments",name:"Tiny Comments",type:"premium",slug:"introduction-to-tiny-comments"},{key:"tinydrive",name:"Tiny Drive",type:"premium",slug:"tinydrive-introduction"}],(e=>({...e,type:e.type||"opensource",slug:e.slug||e.key}))),_=e=>{const t=e=>`${e.name}`,n=(e,n)=>{return(a=x,r=e=>e.key===n,((e,t,n)=>{for(let a=0,r=e.length;a((e,n)=>{const a=e.plugins[n].getMetadata;if(c(a)){const e=a();return{name:e.name,html:t(e)}}return{name:n,html:n}})(e,n)),(e=>{const n="premium"===e.type?`${e.name}*`:e.name;return{name:n,html:t({name:n,url:`https://www.tiny.cloud/docs/tinymce/6/${e.slug}/`})}}));var a,r},a=e=>{const t=(e=>{const t=g(e.plugins),n=o(e);return s(n)?t:h(t,(e=>!(((e,t)=>p.call(e,t))(n,e)>-1)))})(e),a=d(y(t,(t=>n(e,t))),((e,t)=>e.name.localeCompare(t.name))),r=y(a,(e=>"
  • "+e.html+"
  • ")),i=r.length,c=r.join("");return"

    "+f.translate(["Plugins installed ({0}):",i])+"

      "+c+"
    "},r={type:"htmlpanel",presets:"document",html:[(e=>null==e?"":'
    '+a(e)+"
    ")(e),(()=>{const e=h(x,(({type:e})=>"premium"===e)),t=d(y(e,(e=>e.name)),((e,t)=>e.localeCompare(t))),n=y(t,(e=>`
  • ${e}
  • `)).join("");return'

    '+f.translate("Premium plugins:")+"

    "})()].join("")};return{name:"plugins",title:"Plugins",items:[r]}};var O=tinymce.util.Tools.resolve("tinymce.EditorManager");const P=(e,t,a)=>()=>{(async(e,t,a)=>{const o=T(),s=await(async e=>({name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:await C(e)}]}))(a),c=_(e),l=(()=>{var e,t;const n='TinyMCE '+(e=O.majorVersion,t=O.minorVersion,(0===e.indexOf("@")?"X.X.X":e+"."+t)+"");return{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

    "+f.translate(["You are using {0}",n])+"

    ",presets:"document"}]}})(),u={[o.name]:o,[s.name]:s,[c.name]:c,[l.name]:l,...t.get()};return m.from(r(e)).fold((()=>(e=>{const t=g(e),n=t.indexOf("versions");return-1!==n&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t}})(u)),(e=>((e,t)=>{const a={},r=y(e,(e=>{var r;if(i(e))return v(t,e)&&(a[e]=t[e]),e;{const t=null!==(r=e.name)&&void 0!==r?r:n("tab-name");return a[t]=e,t}}));return{tabs:a,names:r}})(e,u)))})(e,t,a).then((({tabs:t,names:n})=>{const a={type:"tabpanel",tabs:(e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t{return v(n=t,a=e)?m.from(n[a]):m.none();var n,a})))};e.windowManager.open({title:"Help",size:"medium",body:a,buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{}})}))};e.add("help",((e,t)=>{const a=(e=>{let t={};return{get:()=>t,set:e=>{t=e}}})(),r=(e=>({addTab:t=>{var a;const r=null!==(a=t.name)&&void 0!==a?a:n("tab-name"),o=e.get();o[r]=t,e.set(o)}}))(a);(e=>{(0,e.options.register)("help_tabs",{processor:"array"})})(e);const o=P(e,a,t);return((e,t)=>{e.ui.registry.addButton("help",{icon:"help",tooltip:"Help",onAction:t}),e.ui.registry.addMenuItem("help",{text:"Help",icon:"help",shortcut:"Alt+0",onAction:t})})(e,o),((e,t)=>{e.addCommand("mceHelp",t)})(e,o),e.shortcuts.add("Alt+0","Open help dialog","mceHelp"),((e,t)=>{e.on("init",(()=>{C(t)}))})(e,t),r}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/hr/index.js b/public/js/tinymce/plugins/hr/index.js deleted file mode 100644 index e4c56e5b4..000000000 --- a/public/js/tinymce/plugins/hr/index.js +++ /dev/null @@ -1,7 +0,0 @@ -// Exports the "hr" plugin for usage with module loaders -// Usage: -// CommonJS: -// require('tinymce/plugins/hr') -// ES2015: -// import 'tinymce/plugins/hr' -require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/hr/plugin.js b/public/js/tinymce/plugins/hr/plugin.js deleted file mode 100644 index 440e40ca7..000000000 --- a/public/js/tinymce/plugins/hr/plugin.js +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) - */ -(function () { - 'use strict'; - - var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); - - var register$1 = function (editor) { - editor.addCommand('InsertHorizontalRule', function () { - editor.execCommand('mceInsertContent', false, '
    '); - }); - }; - - var register = function (editor) { - var onAction = function () { - return editor.execCommand('InsertHorizontalRule'); - }; - editor.ui.registry.addButton('hr', { - icon: 'horizontal-rule', - tooltip: 'Horizontal line', - onAction: onAction - }); - editor.ui.registry.addMenuItem('hr', { - icon: 'horizontal-rule', - text: 'Horizontal line', - onAction: onAction - }); - }; - - function Plugin () { - global.add('hr', function (editor) { - register$1(editor); - register(editor); - }); - } - - Plugin(); - -}()); diff --git a/public/js/tinymce/plugins/hr/plugin.min.js b/public/js/tinymce/plugins/hr/plugin.min.js index 70206ab78..69e9bdef0 100644 --- a/public/js/tinymce/plugins/hr/plugin.min.js +++ b/public/js/tinymce/plugins/hr/plugin.min.js @@ -4,6 +4,6 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * - * Version: 5.10.3 (2022-02-09) + * Version: 5.10.5 (2022-05-25) */ !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("hr",function(n){var o,t;function e(){return t.execCommand("InsertHorizontalRule")}(o=n).addCommand("InsertHorizontalRule",function(){o.execCommand("mceInsertContent",!1,"
    ")}),(t=n).ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:e}),t.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:e})})}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/image/plugin.js b/public/js/tinymce/plugins/image/plugin.js index cb25f265d..192025355 100644 --- a/public/js/tinymce/plugins/image/plugin.js +++ b/public/js/tinymce/plugins/image/plugin.js @@ -1,210 +1,185 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; - var global$6 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + var global$4 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); + const getPrototypeOf = Object.getPrototypeOf; + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } }; - - var typeOf = function (x) { - var t = typeof x; + const typeOf = x => { + const t = typeof x; if (x === null) { return 'null'; - } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + } else if (t === 'object' && Array.isArray(x)) { return 'array'; - } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { return 'string'; } else { return t; } }; - var isType = function (type) { - return function (value) { - return typeOf(value) === type; - }; - }; - var isSimpleType = function (type) { - return function (value) { - return typeof value === type; - }; - }; - var eq = function (t) { - return function (a) { - return t === a; - }; - }; - var isString = isType('string'); - var isObject = isType('object'); - var isArray = isType('array'); - var isNull = eq(null); - var isBoolean = isSimpleType('boolean'); - var isNullable = function (a) { - return a === null || a === undefined; - }; - var isNonNullable = function (a) { - return !isNullable(a); + const isType = type => value => typeOf(value) === type; + const isSimpleType = type => value => typeof value === type; + const eq = t => a => t === a; + const is = (value, constructor) => isObject(value) && hasProto(value, constructor, (o, proto) => getPrototypeOf(o) === proto); + const isString = isType('string'); + const isObject = isType('object'); + const isPlainObject = value => is(value, Object); + const isArray = isType('array'); + const isNull = eq(null); + const isBoolean = isSimpleType('boolean'); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); + const isFunction = isSimpleType('function'); + const isNumber = isSimpleType('number'); + const isArrayOf = (value, pred) => { + if (isArray(value)) { + for (let i = 0, len = value.length; i < len; ++i) { + if (!pred(value[i])) { + return false; + } + } + return true; + } + return false; }; - var isFunction = isSimpleType('function'); - var isNumber = isSimpleType('number'); - var noop = function () { - }; - var constant = function (value) { - return function () { - return value; - }; - }; - var identity = function (x) { - return x; + const noop = () => { }; - var never = constant(false); - var always = constant(true); - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from - }; + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); - var keys = Object.keys; - var hasOwnProperty = Object.hasOwnProperty; - var each = function (obj, f) { - var props = keys(obj); - for (var k = 0, len = props.length; k < len; k++) { - var i = props[k]; - var x = obj[i]; + const keys = Object.keys; + const hasOwnProperty = Object.hasOwnProperty; + const each = (obj, f) => { + const props = keys(obj); + for (let k = 0, len = props.length; k < len; k++) { + const i = props[k]; + const x = obj[i]; f(x, i); } }; - var objAcc = function (r) { - return function (x, i) { - r[i] = x; - }; + const objAcc = r => (x, i) => { + r[i] = x; }; - var internalFilter = function (obj, pred, onTrue, onFalse) { - var r = {}; - each(obj, function (x, i) { + const internalFilter = (obj, pred, onTrue, onFalse) => { + each(obj, (x, i) => { (pred(x, i) ? onTrue : onFalse)(x, i); }); - return r; }; - var filter = function (obj, pred) { - var t = {}; + const filter = (obj, pred) => { + const t = {}; internalFilter(obj, pred, objAcc(t), noop); return t; }; - var has = function (obj, key) { - return hasOwnProperty.call(obj, key); - }; - var hasNonNullableKey = function (obj, key) { - return has(obj, key) && obj[key] !== undefined && obj[key] !== null; - }; + const has = (obj, key) => hasOwnProperty.call(obj, key); + const hasNonNullableKey = (obj, key) => has(obj, key) && obj[key] !== undefined && obj[key] !== null; - var nativePush = Array.prototype.push; - var flatten = function (xs) { - var r = []; - for (var i = 0, len = xs.length; i < len; ++i) { + const nativePush = Array.prototype.push; + const flatten = xs => { + const r = []; + for (let i = 0, len = xs.length; i < len; ++i) { if (!isArray(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } @@ -212,15 +187,11 @@ } return r; }; - var get = function (xs, i) { - return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); - }; - var head = function (xs) { - return get(xs, 0); - }; - var findMap = function (arr, f) { - for (var i = 0; i < arr.length; i++) { - var r = f(arr[i], i); + const get = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + const head = xs => get(xs, 0); + const findMap = (arr, f) => { + for (let i = 0; i < arr.length; i++) { + const r = f(arr[i], i); if (r.isSome()) { return r; } @@ -230,7 +201,7 @@ typeof window !== 'undefined' ? window : Function('return this;')(); - var rawSet = function (dom, key, value) { + const rawSet = (dom, key, value) => { if (isString(value) || isBoolean(value) || isNumber(value)) { dom.setAttribute(key, value + ''); } else { @@ -238,147 +209,160 @@ throw new Error('Attribute value was not simple'); } }; - var set = function (element, key, value) { + const set = (element, key, value) => { rawSet(element.dom, key, value); }; - var remove = function (element, key) { + const remove = (element, key) => { element.dom.removeAttribute(key); }; - var fromHtml = function (html, scope) { - var doc = scope || document; - var div = doc.createElement('div'); + const fromHtml = (html, scope) => { + const doc = scope || document; + const div = doc.createElement('div'); div.innerHTML = html; if (!div.hasChildNodes() || div.childNodes.length > 1) { - console.error('HTML does not have a single root node', html); - throw new Error('HTML must have a single root node'); + const message = 'HTML does not have a single root node'; + console.error(message, html); + throw new Error(message); } return fromDom(div.childNodes[0]); }; - var fromTag = function (tag, scope) { - var doc = scope || document; - var node = doc.createElement(tag); + const fromTag = (tag, scope) => { + const doc = scope || document; + const node = doc.createElement(tag); return fromDom(node); }; - var fromText = function (text, scope) { - var doc = scope || document; - var node = doc.createTextNode(text); + const fromText = (text, scope) => { + const doc = scope || document; + const node = doc.createTextNode(text); return fromDom(node); }; - var fromDom = function (node) { + const fromDom = node => { if (node === null || node === undefined) { throw new Error('Node cannot be null or undefined'); } return { dom: node }; }; - var fromPoint = function (docElm, x, y) { - return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); - }; - var SugarElement = { - fromHtml: fromHtml, - fromTag: fromTag, - fromText: fromText, - fromDom: fromDom, - fromPoint: fromPoint + const fromPoint = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + const SugarElement = { + fromHtml, + fromTag, + fromText, + fromDom, + fromPoint }; - var global$5 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); - var global$4 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + var global$2 = tinymce.util.Tools.resolve('tinymce.util.URI'); - var global$3 = tinymce.util.Tools.resolve('tinymce.util.URI'); - - var global$2 = tinymce.util.Tools.resolve('tinymce.util.XHR'); - - var hasDimensions = function (editor) { - return editor.getParam('image_dimensions', true, 'boolean'); - }; - var hasAdvTab = function (editor) { - return editor.getParam('image_advtab', false, 'boolean'); - }; - var hasUploadTab = function (editor) { - return editor.getParam('image_uploadtab', true, 'boolean'); - }; - var getPrependUrl = function (editor) { - return editor.getParam('image_prepend_url', '', 'string'); - }; - var getClassList = function (editor) { - return editor.getParam('image_class_list'); - }; - var hasDescription = function (editor) { - return editor.getParam('image_description', true, 'boolean'); - }; - var hasImageTitle = function (editor) { - return editor.getParam('image_title', false, 'boolean'); - }; - var hasImageCaption = function (editor) { - return editor.getParam('image_caption', false, 'boolean'); - }; - var getImageList = function (editor) { - return editor.getParam('image_list', false); - }; - var hasUploadUrl = function (editor) { - return isNonNullable(editor.getParam('images_upload_url')); - }; - var hasUploadHandler = function (editor) { - return isNonNullable(editor.getParam('images_upload_handler')); - }; - var showAccessibilityOptions = function (editor) { - return editor.getParam('a11y_advanced_options', false, 'boolean'); - }; - var isAutomaticUploadsEnabled = function (editor) { - return editor.getParam('automatic_uploads', true, 'boolean'); - }; + const isNotEmpty = s => s.length > 0; - var parseIntAndGetMax = function (val1, val2) { - return Math.max(parseInt(val1, 10), parseInt(val2, 10)); - }; - var getImageSize = function (url) { - return new global$4(function (callback) { - var img = document.createElement('img'); - var done = function (dimensions) { - img.onload = img.onerror = null; - if (img.parentNode) { - img.parentNode.removeChild(img); - } - callback(dimensions); - }; - img.onload = function () { - var width = parseIntAndGetMax(img.width, img.clientWidth); - var height = parseIntAndGetMax(img.height, img.clientHeight); - var dimensions = { - width: width, - height: height + const option = name => editor => editor.options.get(name); + const register$2 = editor => { + const registerOption = editor.options.register; + registerOption('image_dimensions', { + processor: 'boolean', + default: true + }); + registerOption('image_advtab', { + processor: 'boolean', + default: false + }); + registerOption('image_uploadtab', { + processor: 'boolean', + default: true + }); + registerOption('image_prepend_url', { + processor: 'string', + default: '' + }); + registerOption('image_class_list', { processor: 'object[]' }); + registerOption('image_description', { + processor: 'boolean', + default: true + }); + registerOption('image_title', { + processor: 'boolean', + default: false + }); + registerOption('image_caption', { + processor: 'boolean', + default: false + }); + registerOption('image_list', { + processor: value => { + const valid = value === false || isString(value) || isArrayOf(value, isObject) || isFunction(value); + return valid ? { + value, + valid + } : { + valid: false, + message: 'Must be false, a string, an array or a function.' }; - done(global$4.resolve(dimensions)); - }; - img.onerror = function () { - done(global$4.reject('Failed to get image dimensions for: ' + url)); - }; - var style = img.style; - style.visibility = 'hidden'; - style.position = 'fixed'; - style.bottom = style.left = '0px'; - style.width = style.height = 'auto'; - document.body.appendChild(img); - img.src = url; + }, + default: false }); }; - var removePixelSuffix = function (value) { + const hasDimensions = option('image_dimensions'); + const hasAdvTab = option('image_advtab'); + const hasUploadTab = option('image_uploadtab'); + const getPrependUrl = option('image_prepend_url'); + const getClassList = option('image_class_list'); + const hasDescription = option('image_description'); + const hasImageTitle = option('image_title'); + const hasImageCaption = option('image_caption'); + const getImageList = option('image_list'); + const showAccessibilityOptions = option('a11y_advanced_options'); + const isAutomaticUploadsEnabled = option('automatic_uploads'); + const hasUploadUrl = editor => isNotEmpty(editor.options.get('images_upload_url')); + const hasUploadHandler = editor => isNonNullable(editor.options.get('images_upload_handler')); + + const parseIntAndGetMax = (val1, val2) => Math.max(parseInt(val1, 10), parseInt(val2, 10)); + const getImageSize = url => new Promise(callback => { + const img = document.createElement('img'); + const done = dimensions => { + img.onload = img.onerror = null; + if (img.parentNode) { + img.parentNode.removeChild(img); + } + callback(dimensions); + }; + img.onload = () => { + const width = parseIntAndGetMax(img.width, img.clientWidth); + const height = parseIntAndGetMax(img.height, img.clientHeight); + const dimensions = { + width, + height + }; + done(Promise.resolve(dimensions)); + }; + img.onerror = () => { + done(Promise.reject(`Failed to get image dimensions for: ${ url }`)); + }; + const style = img.style; + style.visibility = 'hidden'; + style.position = 'fixed'; + style.bottom = style.left = '0px'; + style.width = style.height = 'auto'; + document.body.appendChild(img); + img.src = url; + }); + const removePixelSuffix = value => { if (value) { value = value.replace(/px$/, ''); } return value; }; - var addPixelSuffix = function (value) { + const addPixelSuffix = value => { if (value.length > 0 && /^[0-9]+$/.test(value)) { value += 'px'; } return value; }; - var mergeMargins = function (css) { + const mergeMargins = css => { if (css.margin) { - var splitMargin = String(css.margin).split(' '); + const splitMargin = String(css.margin).split(' '); switch (splitMargin.length) { case 1: css['margin-top'] = css['margin-top'] || splitMargin[0]; @@ -408,13 +392,12 @@ } return css; }; - var createImageList = function (editor, callback) { - var imageList = getImageList(editor); + const createImageList = (editor, callback) => { + const imageList = getImageList(editor); if (isString(imageList)) { - global$2.send({ - url: imageList, - success: function (text) { - callback(JSON.parse(text)); + fetch(imageList).then(res => { + if (res.ok) { + res.json().then(callback); } }); } else if (isFunction(imageList)) { @@ -423,15 +406,15 @@ callback(imageList); } }; - var waitLoadImage = function (editor, data, imgElm) { - var selectImage = function () { + const waitLoadImage = (editor, data, imgElm) => { + const selectImage = () => { imgElm.onload = imgElm.onerror = null; if (editor.selection) { editor.selection.select(imgElm); editor.nodeChanged(); } }; - imgElm.onload = function () { + imgElm.onload = () => { if (!data.width && !data.height && hasDimensions(editor)) { editor.dom.setAttribs(imgElm, { width: String(imgElm.clientWidth), @@ -442,89 +425,89 @@ }; imgElm.onerror = selectImage; }; - var blobToDataUri = function (blob) { - return new global$4(function (resolve, reject) { - var reader = new FileReader(); - reader.onload = function () { - resolve(reader.result); - }; - reader.onerror = function () { - reject(reader.error.message); - }; - reader.readAsDataURL(blob); + const blobToDataUri = blob => new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => { + resolve(reader.result); + }; + reader.onerror = () => { + var _a; + reject((_a = reader.error) === null || _a === void 0 ? void 0 : _a.message); + }; + reader.readAsDataURL(blob); + }); + const isPlaceholderImage = imgElm => imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder')); + const isSafeImageUrl = (editor, src) => { + const getOption = editor.options.get; + return global$2.isDomSafe(src, 'img', { + allow_html_data_urls: getOption('allow_html_data_urls'), + allow_script_urls: getOption('allow_script_urls'), + allow_svg_data_urls: getOption('allow_svg_data_urls') }); }; - var isPlaceholderImage = function (imgElm) { - return imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder')); - }; - var isSafeImageUrl = function (editor, src) { - return global$3.isDomSafe(src, 'img', editor.settings); - }; - var DOM = global$5.DOM; - var getHspace = function (image) { + const DOM = global$3.DOM; + const getHspace = image => { if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) { return removePixelSuffix(image.style.marginLeft); } else { return ''; } }; - var getVspace = function (image) { + const getVspace = image => { if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) { return removePixelSuffix(image.style.marginTop); } else { return ''; } }; - var getBorder = function (image) { + const getBorder = image => { if (image.style.borderWidth) { return removePixelSuffix(image.style.borderWidth); } else { return ''; } }; - var getAttrib = function (image, name) { + const getAttrib = (image, name) => { + var _a; if (image.hasAttribute(name)) { - return image.getAttribute(name); + return (_a = image.getAttribute(name)) !== null && _a !== void 0 ? _a : ''; } else { return ''; } }; - var getStyle = function (image, name) { - return image.style[name] ? image.style[name] : ''; - }; - var hasCaption = function (image) { - return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE'; - }; - var updateAttrib = function (image, name, value) { - if (value === '') { + const hasCaption = image => image.parentNode !== null && image.parentNode.nodeName === 'FIGURE'; + const updateAttrib = (image, name, value) => { + if (value === '' || value === null) { image.removeAttribute(name); } else { image.setAttribute(name, value); } }; - var wrapInFigure = function (image) { - var figureElm = DOM.create('figure', { class: 'image' }); + const wrapInFigure = image => { + const figureElm = DOM.create('figure', { class: 'image' }); DOM.insertAfter(figureElm, image); figureElm.appendChild(image); figureElm.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); figureElm.contentEditable = 'false'; }; - var removeFigure = function (image) { - var figureElm = image.parentNode; - DOM.insertAfter(image, figureElm); - DOM.remove(figureElm); + const removeFigure = image => { + const figureElm = image.parentNode; + if (isNonNullable(figureElm)) { + DOM.insertAfter(image, figureElm); + DOM.remove(figureElm); + } }; - var toggleCaption = function (image) { + const toggleCaption = image => { if (hasCaption(image)) { removeFigure(image); } else { wrapInFigure(image); } }; - var normalizeStyle = function (image, normalizeCss) { - var attrValue = image.getAttribute('style'); - var value = normalizeCss(attrValue !== null ? attrValue : ''); + const normalizeStyle = (image, normalizeCss) => { + const attrValue = image.getAttribute('style'); + const value = normalizeCss(attrValue !== null ? attrValue : ''); if (value.length > 0) { image.setAttribute('style', value); image.setAttribute('data-mce-style', value); @@ -532,78 +515,71 @@ image.removeAttribute('style'); } }; - var setSize = function (name, normalizeCss) { - return function (image, name, value) { - if (image.style[name]) { - image.style[name] = addPixelSuffix(value); - normalizeStyle(image, normalizeCss); - } else { - updateAttrib(image, name, value); - } - }; + const setSize = (name, normalizeCss) => (image, name, value) => { + const styles = image.style; + if (styles[name]) { + styles[name] = addPixelSuffix(value); + normalizeStyle(image, normalizeCss); + } else { + updateAttrib(image, name, value); + } }; - var getSize = function (image, name) { + const getSize = (image, name) => { if (image.style[name]) { return removePixelSuffix(image.style[name]); } else { return getAttrib(image, name); } }; - var setHspace = function (image, value) { - var pxValue = addPixelSuffix(value); + const setHspace = (image, value) => { + const pxValue = addPixelSuffix(value); image.style.marginLeft = pxValue; image.style.marginRight = pxValue; }; - var setVspace = function (image, value) { - var pxValue = addPixelSuffix(value); + const setVspace = (image, value) => { + const pxValue = addPixelSuffix(value); image.style.marginTop = pxValue; image.style.marginBottom = pxValue; }; - var setBorder = function (image, value) { - var pxValue = addPixelSuffix(value); + const setBorder = (image, value) => { + const pxValue = addPixelSuffix(value); image.style.borderWidth = pxValue; }; - var setBorderStyle = function (image, value) { + const setBorderStyle = (image, value) => { image.style.borderStyle = value; }; - var getBorderStyle = function (image) { - return getStyle(image, 'borderStyle'); - }; - var isFigure = function (elm) { - return elm.nodeName === 'FIGURE'; - }; - var isImage = function (elm) { - return elm.nodeName === 'IMG'; + const getBorderStyle = image => { + var _a; + return (_a = image.style.borderStyle) !== null && _a !== void 0 ? _a : ''; }; - var getIsDecorative = function (image) { - return DOM.getAttrib(image, 'alt').length === 0 && DOM.getAttrib(image, 'role') === 'presentation'; - }; - var getAlt = function (image) { + const isFigure = elm => isNonNullable(elm) && elm.nodeName === 'FIGURE'; + const isImage = elm => elm.nodeName === 'IMG'; + const getIsDecorative = image => DOM.getAttrib(image, 'alt').length === 0 && DOM.getAttrib(image, 'role') === 'presentation'; + const getAlt = image => { if (getIsDecorative(image)) { return ''; } else { return getAttrib(image, 'alt'); } }; - var defaultData = function () { - return { - src: '', - alt: '', - title: '', - width: '', - height: '', - class: '', - style: '', - caption: false, - hspace: '', - vspace: '', - border: '', - borderStyle: '', - isDecorative: false - }; - }; - var getStyleValue = function (normalizeCss, data) { - var image = document.createElement('img'); + const defaultData = () => ({ + src: '', + alt: '', + title: '', + width: '', + height: '', + class: '', + style: '', + caption: false, + hspace: '', + vspace: '', + border: '', + borderStyle: '', + isDecorative: false + }); + const getStyleValue = (normalizeCss, data) => { + var _a; + const image = document.createElement('img'); updateAttrib(image, 'style', data.style); if (getHspace(image) || data.hspace !== '') { setHspace(image, data.hspace); @@ -617,14 +593,17 @@ if (getBorderStyle(image) || data.borderStyle !== '') { setBorderStyle(image, data.borderStyle); } - return normalizeCss(image.getAttribute('style')); - }; - var create = function (normalizeCss, data) { - var image = document.createElement('img'); - write(normalizeCss, __assign(__assign({}, data), { caption: false }), image); + return normalizeCss((_a = image.getAttribute('style')) !== null && _a !== void 0 ? _a : ''); + }; + const create = (normalizeCss, data) => { + const image = document.createElement('img'); + write(normalizeCss, { + ...data, + caption: false + }, image); setAlt(image, data.alt, data.isDecorative); if (data.caption) { - var figure = DOM.create('figure', { class: 'image' }); + const figure = DOM.create('figure', { class: 'image' }); figure.appendChild(image); figure.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); figure.contentEditable = 'false'; @@ -633,39 +612,37 @@ return image; } }; - var read = function (normalizeCss, image) { - return { - src: getAttrib(image, 'src'), - alt: getAlt(image), - title: getAttrib(image, 'title'), - width: getSize(image, 'width'), - height: getSize(image, 'height'), - class: getAttrib(image, 'class'), - style: normalizeCss(getAttrib(image, 'style')), - caption: hasCaption(image), - hspace: getHspace(image), - vspace: getVspace(image), - border: getBorder(image), - borderStyle: getStyle(image, 'borderStyle'), - isDecorative: getIsDecorative(image) - }; - }; - var updateProp = function (image, oldData, newData, name, set) { + const read = (normalizeCss, image) => ({ + src: getAttrib(image, 'src'), + alt: getAlt(image), + title: getAttrib(image, 'title'), + width: getSize(image, 'width'), + height: getSize(image, 'height'), + class: getAttrib(image, 'class'), + style: normalizeCss(getAttrib(image, 'style')), + caption: hasCaption(image), + hspace: getHspace(image), + vspace: getVspace(image), + border: getBorder(image), + borderStyle: getBorderStyle(image), + isDecorative: getIsDecorative(image) + }); + const updateProp = (image, oldData, newData, name, set) => { if (newData[name] !== oldData[name]) { - set(image, name, newData[name]); + set(image, name, String(newData[name])); } }; - var setAlt = function (image, alt, isDecorative) { + const setAlt = (image, alt, isDecorative) => { if (isDecorative) { DOM.setAttrib(image, 'role', 'presentation'); - var sugarImage = SugarElement.fromDom(image); + const sugarImage = SugarElement.fromDom(image); set(sugarImage, 'alt', ''); } else { if (isNull(alt)) { - var sugarImage = SugarElement.fromDom(image); + const sugarImage = SugarElement.fromDom(image); remove(sugarImage, 'alt'); } else { - var sugarImage = SugarElement.fromDom(image); + const sugarImage = SugarElement.fromDom(image); set(sugarImage, 'alt', alt); } if (DOM.getAttrib(image, 'role') === 'presentation') { @@ -673,30 +650,24 @@ } } }; - var updateAlt = function (image, oldData, newData) { + const updateAlt = (image, oldData, newData) => { if (newData.alt !== oldData.alt || newData.isDecorative !== oldData.isDecorative) { setAlt(image, newData.alt, newData.isDecorative); } }; - var normalized = function (set, normalizeCss) { - return function (image, name, value) { - set(image, value); - normalizeStyle(image, normalizeCss); - }; + const normalized = (set, normalizeCss) => (image, name, value) => { + set(image, value); + normalizeStyle(image, normalizeCss); }; - var write = function (normalizeCss, newData, image) { - var oldData = read(normalizeCss, image); - updateProp(image, oldData, newData, 'caption', function (image, _name, _value) { - return toggleCaption(image); - }); + const write = (normalizeCss, newData, image) => { + const oldData = read(normalizeCss, image); + updateProp(image, oldData, newData, 'caption', (image, _name, _value) => toggleCaption(image)); updateProp(image, oldData, newData, 'src', updateAttrib); updateProp(image, oldData, newData, 'title', updateAttrib); updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss)); updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss)); updateProp(image, oldData, newData, 'class', updateAttrib); - updateProp(image, oldData, newData, 'style', normalized(function (image, value) { - return updateAttrib(image, 'style', value); - }, normalizeCss)); + updateProp(image, oldData, newData, 'style', normalized((image, value) => updateAttrib(image, 'style', value), normalizeCss)); updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss)); updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss)); updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss)); @@ -704,15 +675,15 @@ updateAlt(image, oldData, newData); }; - var normalizeCss$1 = function (editor, cssText) { - var css = editor.dom.styles.parse(cssText); - var mergedCss = mergeMargins(css); - var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss)); + const normalizeCss$1 = (editor, cssText) => { + const css = editor.dom.styles.parse(cssText); + const mergedCss = mergeMargins(css); + const compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss)); return editor.dom.styles.serialize(compressed); }; - var getSelectedImage = function (editor) { - var imgElm = editor.selection.getNode(); - var figureElm = editor.dom.getParent(imgElm, 'figure.image'); + const getSelectedImage = editor => { + const imgElm = editor.selection.getNode(); + const figureElm = editor.dom.getParent(imgElm, 'figure.image'); if (figureElm) { return editor.dom.select('img', figureElm)[0]; } @@ -721,48 +692,41 @@ } return imgElm; }; - var splitTextBlock = function (editor, figure) { - var dom = editor.dom; - var textBlockElements = filter(editor.schema.getTextBlockElements(), function (_, parentElm) { - return !editor.schema.isValidChild(parentElm, 'figure'); - }); - var textBlock = dom.getParent(figure.parentNode, function (node) { - return hasNonNullableKey(textBlockElements, node.nodeName); - }, editor.getBody()); + const splitTextBlock = (editor, figure) => { + var _a; + const dom = editor.dom; + const textBlockElements = filter(editor.schema.getTextBlockElements(), (_, parentElm) => !editor.schema.isValidChild(parentElm, 'figure')); + const textBlock = dom.getParent(figure.parentNode, node => hasNonNullableKey(textBlockElements, node.nodeName), editor.getBody()); if (textBlock) { - return dom.split(textBlock, figure); + return (_a = dom.split(textBlock, figure)) !== null && _a !== void 0 ? _a : figure; } else { return figure; } }; - var readImageDataFromSelection = function (editor) { - var image = getSelectedImage(editor); - return image ? read(function (css) { - return normalizeCss$1(editor, css); - }, image) : defaultData(); + const readImageDataFromSelection = editor => { + const image = getSelectedImage(editor); + return image ? read(css => normalizeCss$1(editor, css), image) : defaultData(); }; - var insertImageAtCaret = function (editor, data) { - var elm = create(function (css) { - return normalizeCss$1(editor, css); - }, data); + const insertImageAtCaret = (editor, data) => { + const elm = create(css => normalizeCss$1(editor, css), data); editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew'); editor.focus(); editor.selection.setContent(elm.outerHTML); - var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0]; + const insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0]; editor.dom.setAttrib(insertedElm, 'data-mce-id', null); if (isFigure(insertedElm)) { - var figure = splitTextBlock(editor, insertedElm); + const figure = splitTextBlock(editor, insertedElm); editor.selection.select(figure); } else { editor.selection.select(insertedElm); } }; - var syncSrcAttr = function (editor, image) { + const syncSrcAttr = (editor, image) => { editor.dom.setAttrib(image, 'src', image.getAttribute('src')); }; - var deleteImage = function (editor, image) { + const deleteImage = (editor, image) => { if (image) { - var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image; + const elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image; editor.dom.remove(elm); editor.focus(); editor.nodeChanged(); @@ -772,60 +736,63 @@ } } }; - var writeImageDataToSelection = function (editor, data) { - var image = getSelectedImage(editor); - write(function (css) { - return normalizeCss$1(editor, css); - }, data, image); - syncSrcAttr(editor, image); - if (isFigure(image.parentNode)) { - var figure = image.parentNode; - splitTextBlock(editor, figure); - editor.selection.select(image.parentNode); - } else { - editor.selection.select(image); - waitLoadImage(editor, data, image); + const writeImageDataToSelection = (editor, data) => { + const image = getSelectedImage(editor); + if (image) { + write(css => normalizeCss$1(editor, css), data, image); + syncSrcAttr(editor, image); + if (isFigure(image.parentNode)) { + const figure = image.parentNode; + splitTextBlock(editor, figure); + editor.selection.select(image.parentNode); + } else { + editor.selection.select(image); + waitLoadImage(editor, data, image); + } } }; - var sanitizeImageData = function (editor, data) { - var src = data.src; - return __assign(__assign({}, data), { src: isSafeImageUrl(editor, src) ? src : '' }); + const sanitizeImageData = (editor, data) => { + const src = data.src; + return { + ...data, + src: isSafeImageUrl(editor, src) ? src : '' + }; }; - var insertOrUpdateImage = function (editor, partialData) { - var image = getSelectedImage(editor); + const insertOrUpdateImage = (editor, partialData) => { + const image = getSelectedImage(editor); if (image) { - var selectedImageData = read(function (css) { - return normalizeCss$1(editor, css); - }, image); - var data = __assign(__assign({}, selectedImageData), partialData); - var sanitizedData = sanitizeImageData(editor, data); + const selectedImageData = read(css => normalizeCss$1(editor, css), image); + const data = { + ...selectedImageData, + ...partialData + }; + const sanitizedData = sanitizeImageData(editor, data); if (data.src) { writeImageDataToSelection(editor, sanitizedData); } else { deleteImage(editor, image); } } else if (partialData.src) { - insertImageAtCaret(editor, __assign(__assign({}, defaultData()), partialData)); + insertImageAtCaret(editor, { + ...defaultData(), + ...partialData + }); } }; - var deep = function (old, nu) { - var bothObjects = isObject(old) && isObject(nu); + const deep = (old, nu) => { + const bothObjects = isPlainObject(old) && isPlainObject(nu); return bothObjects ? deepMerge(old, nu) : nu; }; - var baseMerge = function (merger) { - return function () { - var objects = []; - for (var _i = 0; _i < arguments.length; _i++) { - objects[_i] = arguments[_i]; - } + const baseMerge = merger => { + return (...objects) => { if (objects.length === 0) { - throw new Error('Can\'t merge zero objects'); + throw new Error(`Can't merge zero objects`); } - var ret = {}; - for (var j = 0; j < objects.length; j++) { - var curObject = objects[j]; - for (var key in curObject) { + const ret = {}; + for (let j = 0; j < objects.length; j++) { + const curObject = objects[j]; + for (const key in curObject) { if (has(curObject, key)) { ret[key] = merger(ret[key], curObject[key]); } @@ -834,20 +801,14 @@ return ret; }; }; - var deepMerge = baseMerge(deep); - - var isNotEmpty = function (s) { - return s.length > 0; - }; + const deepMerge = baseMerge(deep); var global$1 = tinymce.util.Tools.resolve('tinymce.util.ImageUploader'); var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); - var getValue = function (item) { - return isString(item.value) ? item.value : ''; - }; - var getText = function (item) { + const getValue = item => isString(item.value) ? item.value : ''; + const getText = item => { if (isString(item.text)) { return item.text; } else if (isString(item.title)) { @@ -856,241 +817,205 @@ return ''; } }; - var sanitizeList = function (list, extractValue) { - var out = []; - global.each(list, function (item) { - var text = getText(item); + const sanitizeList = (list, extractValue) => { + const out = []; + global.each(list, item => { + const text = getText(item); if (item.menu !== undefined) { - var items = sanitizeList(item.menu, extractValue); + const items = sanitizeList(item.menu, extractValue); out.push({ - text: text, - items: items + text, + items }); } else { - var value = extractValue(item); + const value = extractValue(item); out.push({ - text: text, - value: value + text, + value }); } }); return out; }; - var sanitizer = function (extractor) { - if (extractor === void 0) { - extractor = getValue; + const sanitizer = (extractor = getValue) => list => { + if (list) { + return Optional.from(list).map(list => sanitizeList(list, extractor)); + } else { + return Optional.none(); } - return function (list) { - if (list) { - return Optional.from(list).map(function (list) { - return sanitizeList(list, extractor); - }); - } else { - return Optional.none(); - } - }; }; - var sanitize = function (list) { - return sanitizer(getValue)(list); - }; - var isGroup = function (item) { - return has(item, 'items'); - }; - var findEntryDelegate = function (list, value) { - return findMap(list, function (item) { - if (isGroup(item)) { - return findEntryDelegate(item.items, value); - } else if (item.value === value) { - return Optional.some(item); - } else { - return Optional.none(); - } - }); - }; - var findEntry = function (optList, value) { - return optList.bind(function (list) { - return findEntryDelegate(list, value); - }); - }; - var ListUtils = { - sanitizer: sanitizer, - sanitize: sanitize, - findEntry: findEntry - }; - - var makeTab$2 = function (_info) { - return { - title: 'Advanced', - name: 'advanced', - items: [ - { - type: 'input', - label: 'Style', - name: 'style' - }, - { - type: 'grid', - columns: 2, - items: [ - { - type: 'input', - label: 'Vertical space', - name: 'vspace', - inputMode: 'numeric' - }, - { - type: 'input', - label: 'Horizontal space', - name: 'hspace', - inputMode: 'numeric' - }, - { - type: 'input', - label: 'Border width', - name: 'border', - inputMode: 'numeric' - }, - { - type: 'listbox', - name: 'borderstyle', - label: 'Border style', - items: [ - { - text: 'Select...', - value: '' - }, - { - text: 'Solid', - value: 'solid' - }, - { - text: 'Dotted', - value: 'dotted' - }, - { - text: 'Dashed', - value: 'dashed' - }, - { - text: 'Double', - value: 'double' - }, - { - text: 'Groove', - value: 'groove' - }, - { - text: 'Ridge', - value: 'ridge' - }, - { - text: 'Inset', - value: 'inset' - }, - { - text: 'Outset', - value: 'outset' - }, - { - text: 'None', - value: 'none' - }, - { - text: 'Hidden', - value: 'hidden' - } - ] - } - ] - } - ] - }; + const sanitize = list => sanitizer(getValue)(list); + const isGroup = item => has(item, 'items'); + const findEntryDelegate = (list, value) => findMap(list, item => { + if (isGroup(item)) { + return findEntryDelegate(item.items, value); + } else if (item.value === value) { + return Optional.some(item); + } else { + return Optional.none(); + } + }); + const findEntry = (optList, value) => optList.bind(list => findEntryDelegate(list, value)); + const ListUtils = { + sanitizer, + sanitize, + findEntry }; - var AdvTab = { makeTab: makeTab$2 }; - var collect = function (editor) { - var urlListSanitizer = ListUtils.sanitizer(function (item) { - return editor.convertURL(item.value || item.url, 'src'); - }); - var futureImageList = new global$4(function (completer) { - createImageList(editor, function (imageList) { - completer(urlListSanitizer(imageList).map(function (items) { - return flatten([ - [{ - text: 'None', + const makeTab$2 = _info => ({ + title: 'Advanced', + name: 'advanced', + items: [{ + type: 'grid', + columns: 2, + items: [ + { + type: 'input', + label: 'Vertical space', + name: 'vspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Horizontal space', + name: 'hspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Border width', + name: 'border', + inputMode: 'numeric' + }, + { + type: 'listbox', + name: 'borderstyle', + label: 'Border style', + items: [ + { + text: 'Select...', value: '' - }], - items - ]); - })); + }, + { + text: 'Solid', + value: 'solid' + }, + { + text: 'Dotted', + value: 'dotted' + }, + { + text: 'Dashed', + value: 'dashed' + }, + { + text: 'Double', + value: 'double' + }, + { + text: 'Groove', + value: 'groove' + }, + { + text: 'Ridge', + value: 'ridge' + }, + { + text: 'Inset', + value: 'inset' + }, + { + text: 'Outset', + value: 'outset' + }, + { + text: 'None', + value: 'none' + }, + { + text: 'Hidden', + value: 'hidden' + } + ] + } + ] + }] + }); + const AdvTab = { makeTab: makeTab$2 }; + + const collect = editor => { + const urlListSanitizer = ListUtils.sanitizer(item => editor.convertURL(item.value || item.url || '', 'src')); + const futureImageList = new Promise(completer => { + createImageList(editor, imageList => { + completer(urlListSanitizer(imageList).map(items => flatten([ + [{ + text: 'None', + value: '' + }], + items + ]))); }); }); - var classList = ListUtils.sanitize(getClassList(editor)); - var hasAdvTab$1 = hasAdvTab(editor); - var hasUploadTab$1 = hasUploadTab(editor); - var hasUploadUrl$1 = hasUploadUrl(editor); - var hasUploadHandler$1 = hasUploadHandler(editor); - var image = readImageDataFromSelection(editor); - var hasDescription$1 = hasDescription(editor); - var hasImageTitle$1 = hasImageTitle(editor); - var hasDimensions$1 = hasDimensions(editor); - var hasImageCaption$1 = hasImageCaption(editor); - var hasAccessibilityOptions = showAccessibilityOptions(editor); - var automaticUploads = isAutomaticUploadsEnabled(editor); - var prependURL = Optional.some(getPrependUrl(editor)).filter(function (preUrl) { - return isString(preUrl) && preUrl.length > 0; - }); - return futureImageList.then(function (imageList) { - return { - image: image, - imageList: imageList, - classList: classList, - hasAdvTab: hasAdvTab$1, - hasUploadTab: hasUploadTab$1, - hasUploadUrl: hasUploadUrl$1, - hasUploadHandler: hasUploadHandler$1, - hasDescription: hasDescription$1, - hasImageTitle: hasImageTitle$1, - hasDimensions: hasDimensions$1, - hasImageCaption: hasImageCaption$1, - prependURL: prependURL, - hasAccessibilityOptions: hasAccessibilityOptions, - automaticUploads: automaticUploads - }; - }); + const classList = ListUtils.sanitize(getClassList(editor)); + const hasAdvTab$1 = hasAdvTab(editor); + const hasUploadTab$1 = hasUploadTab(editor); + const hasUploadUrl$1 = hasUploadUrl(editor); + const hasUploadHandler$1 = hasUploadHandler(editor); + const image = readImageDataFromSelection(editor); + const hasDescription$1 = hasDescription(editor); + const hasImageTitle$1 = hasImageTitle(editor); + const hasDimensions$1 = hasDimensions(editor); + const hasImageCaption$1 = hasImageCaption(editor); + const hasAccessibilityOptions = showAccessibilityOptions(editor); + const automaticUploads = isAutomaticUploadsEnabled(editor); + const prependURL = Optional.some(getPrependUrl(editor)).filter(preUrl => isString(preUrl) && preUrl.length > 0); + return futureImageList.then(imageList => ({ + image, + imageList, + classList, + hasAdvTab: hasAdvTab$1, + hasUploadTab: hasUploadTab$1, + hasUploadUrl: hasUploadUrl$1, + hasUploadHandler: hasUploadHandler$1, + hasDescription: hasDescription$1, + hasImageTitle: hasImageTitle$1, + hasDimensions: hasDimensions$1, + hasImageCaption: hasImageCaption$1, + prependURL, + hasAccessibilityOptions, + automaticUploads + })); }; - var makeItems = function (info) { - var imageUrl = { + const makeItems = info => { + const imageUrl = { name: 'src', type: 'urlinput', filetype: 'image', label: 'Source' }; - var imageList = info.imageList.map(function (items) { - return { - name: 'images', - type: 'listbox', - label: 'Image list', - items: items - }; - }); - var imageDescription = { + const imageList = info.imageList.map(items => ({ + name: 'images', + type: 'listbox', + label: 'Image list', + items + })); + const imageDescription = { name: 'alt', type: 'input', label: 'Alternative description', - disabled: info.hasAccessibilityOptions && info.image.isDecorative + enabled: !(info.hasAccessibilityOptions && info.image.isDecorative) }; - var imageTitle = { + const imageTitle = { name: 'title', type: 'input', label: 'Image title' }; - var imageDimensions = { + const imageDimensions = { name: 'dimensions', type: 'sizeinput' }; - var isDecorative = { + const isDecorative = { type: 'label', label: 'Accessibility', items: [{ @@ -1099,15 +1024,13 @@ label: 'Image is decorative' }] }; - var classList = info.classList.map(function (items) { - return { - name: 'classes', - type: 'listbox', - label: 'Class', - items: items - }; - }); - var caption = { + const classList = info.classList.map(items => ({ + name: 'classes', + type: 'listbox', + label: 'Class', + items + })); + const caption = { type: 'label', label: 'Caption', items: [{ @@ -1116,12 +1039,10 @@ label: 'Show caption' }] }; - var getDialogContainerType = function (useColumns) { - return useColumns ? { - type: 'grid', - columns: 2 - } : { type: 'panel' }; - }; + const getDialogContainerType = useColumns => useColumns ? { + type: 'grid', + columns: 2 + } : { type: 'panel' }; return flatten([ [imageUrl], imageList.toArray(), @@ -1129,90 +1050,83 @@ info.hasDescription ? [imageDescription] : [], info.hasImageTitle ? [imageTitle] : [], info.hasDimensions ? [imageDimensions] : [], - [__assign(__assign({}, getDialogContainerType(info.classList.isSome() && info.hasImageCaption)), { + [{ + ...getDialogContainerType(info.classList.isSome() && info.hasImageCaption), items: flatten([ classList.toArray(), info.hasImageCaption ? [caption] : [] ]) - })] + }] ]); }; - var makeTab$1 = function (info) { - return { - title: 'General', - name: 'general', - items: makeItems(info) - }; - }; - var MainTab = { + const makeTab$1 = info => ({ + title: 'General', + name: 'general', + items: makeItems(info) + }); + const MainTab = { makeTab: makeTab$1, - makeItems: makeItems + makeItems }; - var makeTab = function (_info) { - var items = [{ + const makeTab = _info => { + const items = [{ type: 'dropzone', name: 'fileinput' }]; return { title: 'Upload', name: 'upload', - items: items + items }; }; - var UploadTab = { makeTab: makeTab }; + const UploadTab = { makeTab }; - var createState = function (info) { - return { - prevImage: ListUtils.findEntry(info.imageList, info.image.src), - prevAlt: info.image.alt, - open: true - }; - }; - var fromImageData = function (image) { - return { - src: { - value: image.src, - meta: {} - }, - images: image.src, - alt: image.alt, - title: image.title, - dimensions: { - width: image.width, - height: image.height - }, - classes: image.class, - caption: image.caption, - style: image.style, - vspace: image.vspace, - border: image.border, - hspace: image.hspace, - borderstyle: image.borderStyle, - fileinput: [], - isDecorative: image.isDecorative - }; - }; - var toImageData = function (data, removeEmptyAlt) { - return { - src: data.src.value, - alt: data.alt.length === 0 && removeEmptyAlt ? null : data.alt, - title: data.title, - width: data.dimensions.width, - height: data.dimensions.height, - class: data.classes, - style: data.style, - caption: data.caption, - hspace: data.hspace, - vspace: data.vspace, - border: data.border, - borderStyle: data.borderstyle, - isDecorative: data.isDecorative - }; - }; - var addPrependUrl2 = function (info, srcURL) { + const createState = info => ({ + prevImage: ListUtils.findEntry(info.imageList, info.image.src), + prevAlt: info.image.alt, + open: true + }); + const fromImageData = image => ({ + src: { + value: image.src, + meta: {} + }, + images: image.src, + alt: image.alt, + title: image.title, + dimensions: { + width: image.width, + height: image.height + }, + classes: image.class, + caption: image.caption, + style: image.style, + vspace: image.vspace, + border: image.border, + hspace: image.hspace, + borderstyle: image.borderStyle, + fileinput: [], + isDecorative: image.isDecorative + }); + const toImageData = (data, removeEmptyAlt) => ({ + src: data.src.value, + alt: (data.alt === null || data.alt.length === 0) && removeEmptyAlt ? null : data.alt, + title: data.title, + width: data.dimensions.width, + height: data.dimensions.height, + class: data.classes, + style: data.style, + caption: data.caption, + hspace: data.hspace, + vspace: data.vspace, + border: data.border, + borderStyle: data.borderstyle, + isDecorative: data.isDecorative + }); + const addPrependUrl2 = (info, srcURL) => { if (!/^(?:[a-zA-Z]+:)?\/\//.test(srcURL)) { - return info.prependURL.bind(function (prependUrl) { + return info.prependURL.bind(prependUrl => { if (srcURL.substring(0, prependUrl.length) !== prependUrl) { return Optional.some(prependUrl + srcURL); } @@ -1221,9 +1135,9 @@ } return Optional.none(); }; - var addPrependUrl = function (info, api) { - var data = api.getData(); - addPrependUrl2(info, data.src.value).each(function (srcURL) { + const addPrependUrl = (info, api) => { + const data = api.getData(); + addPrependUrl2(info, data.src.value).each(srcURL => { api.setData({ src: { value: srcURL, @@ -1232,7 +1146,7 @@ }); }); }; - var formFillFromMeta2 = function (info, data, meta) { + const formFillFromMeta2 = (info, data, meta) => { if (info.hasDescription && isString(meta.alt)) { data.alt = meta.alt; } @@ -1251,7 +1165,7 @@ } } if (isString(meta.class)) { - ListUtils.findEntry(info.classList, meta.class).each(function (entry) { + ListUtils.findEntry(info.classList, meta.class).each(entry => { data.classes = entry.value; }); } @@ -1278,28 +1192,26 @@ } } }; - var formFillFromMeta = function (info, api) { - var data = api.getData(); - var meta = data.src.meta; + const formFillFromMeta = (info, api) => { + const data = api.getData(); + const meta = data.src.meta; if (meta !== undefined) { - var newData = deepMerge({}, data); + const newData = deepMerge({}, data); formFillFromMeta2(info, newData, meta); api.setData(newData); } }; - var calculateImageSize = function (helpers, info, state, api) { - var data = api.getData(); - var url = data.src.value; - var meta = data.src.meta || {}; + const calculateImageSize = (helpers, info, state, api) => { + const data = api.getData(); + const url = data.src.value; + const meta = data.src.meta || {}; if (!meta.width && !meta.height && info.hasDimensions) { if (isNotEmpty(url)) { - helpers.imageSize(url).then(function (size) { + helpers.imageSize(url).then(size => { if (state.open) { api.setData({ dimensions: size }); } - }).catch(function (e) { - return console.error(e); - }); + }).catch(e => console.error(e)); } else { api.setData({ dimensions: { @@ -1310,29 +1222,23 @@ } } }; - var updateImagesDropdown = function (info, state, api) { - var data = api.getData(); - var image = ListUtils.findEntry(info.imageList, data.src.value); + const updateImagesDropdown = (info, state, api) => { + const data = api.getData(); + const image = ListUtils.findEntry(info.imageList, data.src.value); state.prevImage = image; - api.setData({ - images: image.map(function (entry) { - return entry.value; - }).getOr('') - }); + api.setData({ images: image.map(entry => entry.value).getOr('') }); }; - var changeSrc = function (helpers, info, state, api) { + const changeSrc = (helpers, info, state, api) => { addPrependUrl(info, api); formFillFromMeta(info, api); calculateImageSize(helpers, info, state, api); updateImagesDropdown(info, state, api); }; - var changeImages = function (helpers, info, state, api) { - var data = api.getData(); - var image = ListUtils.findEntry(info.imageList, data.images); - image.each(function (img) { - var updateAlt = data.alt === '' || state.prevImage.map(function (image) { - return image.text === data.alt; - }).getOr(false); + const changeImages = (helpers, info, state, api) => { + const data = api.getData(); + const image = ListUtils.findEntry(info.imageList, data.images); + image.each(img => { + const updateAlt = data.alt === '' || state.prevImage.map(image => image.text === data.alt).getOr(false); if (updateAlt) { if (img.value === '') { api.setData({ @@ -1352,55 +1258,18 @@ state.prevImage = image; changeSrc(helpers, info, state, api); }; - var calcVSpace = function (css) { - var matchingTopBottom = css['margin-top'] && css['margin-bottom'] && css['margin-top'] === css['margin-bottom']; - return matchingTopBottom ? removePixelSuffix(String(css['margin-top'])) : ''; - }; - var calcHSpace = function (css) { - var matchingLeftRight = css['margin-right'] && css['margin-left'] && css['margin-right'] === css['margin-left']; - return matchingLeftRight ? removePixelSuffix(String(css['margin-right'])) : ''; - }; - var calcBorderWidth = function (css) { - return css['border-width'] ? removePixelSuffix(String(css['border-width'])) : ''; - }; - var calcBorderStyle = function (css) { - return css['border-style'] ? String(css['border-style']) : ''; - }; - var calcStyle = function (parseStyle, serializeStyle, css) { - return serializeStyle(parseStyle(serializeStyle(css))); - }; - var changeStyle2 = function (parseStyle, serializeStyle, data) { - var css = mergeMargins(parseStyle(data.style)); - var dataCopy = deepMerge({}, data); - dataCopy.vspace = calcVSpace(css); - dataCopy.hspace = calcHSpace(css); - dataCopy.border = calcBorderWidth(css); - dataCopy.borderstyle = calcBorderStyle(css); - dataCopy.style = calcStyle(parseStyle, serializeStyle, css); - return dataCopy; - }; - var changeStyle = function (helpers, api) { - var data = api.getData(); - var newData = changeStyle2(helpers.parseStyle, helpers.serializeStyle, data); - api.setData(newData); - }; - var changeAStyle = function (helpers, info, api) { - var data = deepMerge(fromImageData(info.image), api.getData()); - var style = getStyleValue(helpers.normalizeCss, toImageData(data, false)); - api.setData({ style: style }); - }; - var changeFileInput = function (helpers, info, state, api) { - var data = api.getData(); + const changeFileInput = (helpers, info, state, api) => { + const data = api.getData(); api.block('Uploading image'); - head(data.fileinput).fold(function () { + head(data.fileinput).fold(() => { api.unblock(); - }, function (file) { - var blobUri = URL.createObjectURL(file); - var finalize = function () { + }, file => { + const blobUri = URL.createObjectURL(file); + const finalize = () => { api.unblock(); URL.revokeObjectURL(blobUri); }; - var updateSrcAndSwitchTab = function (url) { + const updateSrcAndSwitchTab = url => { api.setData({ src: { value: url, @@ -1410,13 +1279,13 @@ api.showTab('general'); changeSrc(helpers, info, state, api); }; - blobToDataUri(file).then(function (dataUrl) { - var blobInfo = helpers.createBlobCache(file, blobUri, dataUrl); + blobToDataUri(file).then(dataUrl => { + const blobInfo = helpers.createBlobCache(file, blobUri, dataUrl); if (info.automaticUploads) { - helpers.uploadImage(blobInfo).then(function (result) { + helpers.uploadImage(blobInfo).then(result => { updateSrcAndSwitchTab(result.url); finalize(); - }).catch(function (err) { + }).catch(err => { finalize(); helpers.alertErr(err); }); @@ -1428,37 +1297,25 @@ }); }); }; - var changeHandler = function (helpers, info, state) { - return function (api, evt) { - if (evt.name === 'src') { - changeSrc(helpers, info, state, api); - } else if (evt.name === 'images') { - changeImages(helpers, info, state, api); - } else if (evt.name === 'alt') { - state.prevAlt = api.getData().alt; - } else if (evt.name === 'style') { - changeStyle(helpers, api); - } else if (evt.name === 'vspace' || evt.name === 'hspace' || evt.name === 'border' || evt.name === 'borderstyle') { - changeAStyle(helpers, info, api); - } else if (evt.name === 'fileinput') { - changeFileInput(helpers, info, state, api); - } else if (evt.name === 'isDecorative') { - if (api.getData().isDecorative) { - api.disable('alt'); - } else { - api.enable('alt'); - } - } - }; + const changeHandler = (helpers, info, state) => (api, evt) => { + if (evt.name === 'src') { + changeSrc(helpers, info, state, api); + } else if (evt.name === 'images') { + changeImages(helpers, info, state, api); + } else if (evt.name === 'alt') { + state.prevAlt = api.getData().alt; + } else if (evt.name === 'fileinput') { + changeFileInput(helpers, info, state, api); + } else if (evt.name === 'isDecorative') { + api.setEnabled('alt', !api.getData().isDecorative); + } }; - var closeHandler = function (state) { - return function () { - state.open = false; - }; + const closeHandler = state => () => { + state.open = false; }; - var makeDialogBody = function (info) { + const makeDialogBody = info => { if (info.hasAdvTab || info.hasUploadUrl || info.hasUploadHandler) { - var tabPanel = { + const tabPanel = { type: 'tabpanel', tabs: flatten([ [MainTab.makeTab(info)], @@ -1468,119 +1325,67 @@ }; return tabPanel; } else { - var panel = { + const panel = { type: 'panel', items: MainTab.makeItems(info) }; return panel; } }; - var makeDialog = function (helpers) { - return function (info) { - var state = createState(info); - return { - title: 'Insert/Edit Image', - size: 'normal', - body: makeDialogBody(info), - buttons: [ - { - type: 'cancel', - name: 'cancel', - text: 'Cancel' - }, - { - type: 'submit', - name: 'save', - text: 'Save', - primary: true - } - ], - initialData: fromImageData(info.image), - onSubmit: helpers.onSubmit(info), - onChange: changeHandler(helpers, info, state), - onClose: closeHandler(state) - }; - }; - }; - var submitHandler = function (editor) { - return function (info) { - return function (api) { - var data = deepMerge(fromImageData(info.image), api.getData()); - editor.execCommand('mceUpdateImage', false, toImageData(data, info.hasAccessibilityOptions)); - editor.editorUpload.uploadImagesAuto(); - api.close(); - }; - }; - }; - var imageSize = function (editor) { - return function (url) { - if (!isSafeImageUrl(editor, url)) { - return global$4.resolve({ - width: '', - height: '' - }); - } else { - return getImageSize(editor.documentBaseURI.toAbsolute(url)).then(function (dimensions) { - return { - width: String(dimensions.width), - height: String(dimensions.height) - }; - }); - } + const submitHandler = (editor, info, helpers) => api => { + const data = deepMerge(fromImageData(info.image), api.getData()); + const finalData = { + ...data, + style: getStyleValue(helpers.normalizeCss, toImageData(data, false)) }; - }; - var createBlobCache = function (editor) { - return function (file, blobUri, dataUrl) { - return editor.editorUpload.blobCache.create({ - blob: file, - blobUri: blobUri, - name: file.name ? file.name.replace(/\.[^\.]+$/, '') : null, - filename: file.name, - base64: dataUrl.split(',')[1] + editor.execCommand('mceUpdateImage', false, toImageData(finalData, info.hasAccessibilityOptions)); + editor.editorUpload.uploadImagesAuto(); + api.close(); + }; + const imageSize = editor => url => { + if (!isSafeImageUrl(editor, url)) { + return Promise.resolve({ + width: '', + height: '' }); - }; - }; - var addToBlobCache = function (editor) { - return function (blobInfo) { - editor.editorUpload.blobCache.add(blobInfo); - }; - }; - var alertErr = function (editor) { - return function (message) { - editor.windowManager.alert(message); - }; - }; - var normalizeCss = function (editor) { - return function (cssText) { - return normalizeCss$1(editor, cssText); - }; - }; - var parseStyle = function (editor) { - return function (cssText) { - return editor.dom.parseStyle(cssText); - }; - }; - var serializeStyle = function (editor) { - return function (stylesArg, name) { - return editor.dom.serializeStyle(stylesArg, name); - }; + } else { + return getImageSize(editor.documentBaseURI.toAbsolute(url)).then(dimensions => ({ + width: String(dimensions.width), + height: String(dimensions.height) + })); + } }; - var uploadImage = function (editor) { - return function (blobInfo) { - return global$1(editor).upload([blobInfo], false).then(function (results) { - if (results.length === 0) { - return global$4.reject('Failed to upload image'); - } else if (results[0].status === false) { - return global$4.reject(results[0].error.message); - } else { - return results[0]; - } - }); - }; + const createBlobCache = editor => (file, blobUri, dataUrl) => { + var _a; + return editor.editorUpload.blobCache.create({ + blob: file, + blobUri, + name: (_a = file.name) === null || _a === void 0 ? void 0 : _a.replace(/\.[^\.]+$/, ''), + filename: file.name, + base64: dataUrl.split(',')[1] + }); }; - var Dialog = function (editor) { - var helpers = { - onSubmit: submitHandler(editor), + const addToBlobCache = editor => blobInfo => { + editor.editorUpload.blobCache.add(blobInfo); + }; + const alertErr = editor => message => { + editor.windowManager.alert(message); + }; + const normalizeCss = editor => cssText => normalizeCss$1(editor, cssText); + const parseStyle = editor => cssText => editor.dom.parseStyle(cssText); + const serializeStyle = editor => (stylesArg, name) => editor.dom.serializeStyle(stylesArg, name); + const uploadImage = editor => blobInfo => global$1(editor).upload([blobInfo], false).then(results => { + var _a; + if (results.length === 0) { + return Promise.reject('Failed to upload image'); + } else if (results[0].status === false) { + return Promise.reject((_a = results[0].error) === null || _a === void 0 ? void 0 : _a.message); + } else { + return results[0]; + } + }); + const Dialog = editor => { + const helpers = { imageSize: imageSize(editor), addToBlobCache: addToBlobCache(editor), createBlobCache: createBlobCache(editor), @@ -1590,77 +1395,110 @@ serializeStyle: serializeStyle(editor), uploadImage: uploadImage(editor) }; - var open = function () { - collect(editor).then(makeDialog(helpers)).then(editor.windowManager.open); + const open = () => { + collect(editor).then(info => { + const state = createState(info); + return { + title: 'Insert/Edit Image', + size: 'normal', + body: makeDialogBody(info), + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: fromImageData(info.image), + onSubmit: submitHandler(editor, info, helpers), + onChange: changeHandler(helpers, info, state), + onClose: closeHandler(state) + }; + }).then(editor.windowManager.open); }; - return { open: open }; + return { open }; }; - var register$1 = function (editor) { + const register$1 = editor => { editor.addCommand('mceImage', Dialog(editor).open); - editor.addCommand('mceUpdateImage', function (_ui, data) { - editor.undoManager.transact(function () { - return insertOrUpdateImage(editor, data); - }); + editor.addCommand('mceUpdateImage', (_ui, data) => { + editor.undoManager.transact(() => insertOrUpdateImage(editor, data)); }); }; - var hasImageClass = function (node) { - var className = node.attr('class'); - return className && /\bimage\b/.test(className); - }; - var toggleContentEditableState = function (state) { - return function (nodes) { - var i = nodes.length; - var toggleContentEditable = function (node) { - node.attr('contenteditable', state ? 'true' : null); - }; - while (i--) { - var node = nodes[i]; - if (hasImageClass(node)) { - node.attr('contenteditable', state ? 'false' : null); - global.each(node.getAll('figcaption'), toggleContentEditable); - } - } + const hasImageClass = node => { + const className = node.attr('class'); + return isNonNullable(className) && /\bimage\b/.test(className); + }; + const toggleContentEditableState = state => nodes => { + let i = nodes.length; + const toggleContentEditable = node => { + node.attr('contenteditable', state ? 'true' : null); }; + while (i--) { + const node = nodes[i]; + if (hasImageClass(node)) { + node.attr('contenteditable', state ? 'false' : null); + global.each(node.getAll('figcaption'), toggleContentEditable); + } + } }; - var setup = function (editor) { - editor.on('PreInit', function () { + const setup = editor => { + editor.on('PreInit', () => { editor.parser.addNodeFilter('figure', toggleContentEditableState(true)); editor.serializer.addNodeFilter('figure', toggleContentEditableState(false)); }); }; - var register = function (editor) { + const onSetupEditable = editor => api => { + const nodeChanged = () => { + api.setEnabled(editor.selection.isEditable()); + }; + editor.on('NodeChange', nodeChanged); + nodeChanged(); + return () => { + editor.off('NodeChange', nodeChanged); + }; + }; + const register = editor => { editor.ui.registry.addToggleButton('image', { icon: 'image', tooltip: 'Insert/edit image', onAction: Dialog(editor).open, - onSetup: function (buttonApi) { + onSetup: buttonApi => { buttonApi.setActive(isNonNullable(getSelectedImage(editor))); - return editor.selection.selectorChangedWithUnbind('img:not([data-mce-object],[data-mce-placeholder]),figure.image', buttonApi.setActive).unbind; + const unbindSelectorChanged = editor.selection.selectorChangedWithUnbind('img:not([data-mce-object]):not([data-mce-placeholder]),figure.image', buttonApi.setActive).unbind; + const unbindEditable = onSetupEditable(editor)(buttonApi); + return () => { + unbindSelectorChanged(); + unbindEditable(); + }; } }); editor.ui.registry.addMenuItem('image', { icon: 'image', text: 'Image...', - onAction: Dialog(editor).open - }); - editor.ui.registry.addContextMenu('image', { - update: function (element) { - return isFigure(element) || isImage(element) && !isPlaceholderImage(element) ? ['image'] : []; - } + onAction: Dialog(editor).open, + onSetup: onSetupEditable(editor) }); + editor.ui.registry.addContextMenu('image', { update: element => isFigure(element) || isImage(element) && !isPlaceholderImage(element) ? ['image'] : [] }); }; - function Plugin () { - global$6.add('image', function (editor) { + var Plugin = () => { + global$4.add('image', editor => { + register$2(editor); setup(editor); register(editor); register$1(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/image/plugin.min.js b/public/js/tinymce/plugins/image/plugin.min.js index 46ed64b9b..aa8947304 100644 --- a/public/js/tinymce/plugins/image/plugin.min.js +++ b/public/js/tinymce/plugins/image/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function e(r){return function(e){return n=typeof(t=e),(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n)===r;var t,n}}function t(t){return function(e){return typeof e===t}}function D(e){return!(null==e)}function l(){}function a(e){return function(){return e}}function n(e){return e}function r(){return g}var i,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),v=function(){return(v=Object.assign||function(e){for(var t,n=1,r=arguments.length;n{var i;return!!a(e,t.prototype)||(null===(i=e.constructor)||void 0===i?void 0:i.name)===t.name},i=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&a(e,String,((e,t)=>t.isPrototypeOf(e)))?"string":t})(t)===e,s=e=>t=>typeof t===e,r=i("string"),o=i("object"),n=e=>((e,i)=>o(e)&&a(e,i,((e,a)=>t(e)===a)))(e,Object),l=i("array"),c=(null,e=>null===e);const m=s("boolean"),d=e=>!(e=>null==e)(e),g=s("function"),u=s("number"),p=()=>{};class h{constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return d(e)?h.some(e):h.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}h.singletonNone=new h(!1);const b=Object.keys,v=Object.hasOwnProperty,y=(e,t)=>v.call(e,t),f=Array.prototype.push,w=e=>{const t=[];for(let a=0,i=e.length;a{((e,t,a)=>{if(!(r(a)||m(a)||u(a)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",a,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,a+"")})(e.dom,t,a)},D=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},_=D;var C=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),I=tinymce.util.Tools.resolve("tinymce.util.URI");const U=e=>e.length>0,S=e=>t=>t.options.get(e),x=S("image_dimensions"),N=S("image_advtab"),T=S("image_uploadtab"),O=S("image_prepend_url"),E=S("image_class_list"),L=S("image_description"),j=S("image_title"),M=S("image_caption"),R=S("image_list"),k=S("a11y_advanced_options"),z=S("automatic_uploads"),P=(e,t)=>Math.max(parseInt(e,10),parseInt(t,10)),B=e=>(e&&(e=e.replace(/px$/,"")),e),F=e=>(e.length>0&&/^[0-9]+$/.test(e)&&(e+="px"),e),H=e=>"IMG"===e.nodeName&&(e.hasAttribute("data-mce-object")||e.hasAttribute("data-mce-placeholder")),G=(e,t)=>{const a=e.options.get;return I.isDomSafe(t,"img",{allow_html_data_urls:a("allow_html_data_urls"),allow_script_urls:a("allow_script_urls"),allow_svg_data_urls:a("allow_svg_data_urls")})},W=C.DOM,$=e=>e.style.marginLeft&&e.style.marginRight&&e.style.marginLeft===e.style.marginRight?B(e.style.marginLeft):"",V=e=>e.style.marginTop&&e.style.marginBottom&&e.style.marginTop===e.style.marginBottom?B(e.style.marginTop):"",K=e=>e.style.borderWidth?B(e.style.borderWidth):"",Z=(e,t)=>{var a;return e.hasAttribute(t)&&null!==(a=e.getAttribute(t))&&void 0!==a?a:""},q=e=>null!==e.parentNode&&"FIGURE"===e.parentNode.nodeName,J=(e,t,a)=>{""===a||null===a?e.removeAttribute(t):e.setAttribute(t,a)},Q=(e,t)=>{const a=e.getAttribute("style"),i=t(null!==a?a:"");i.length>0?(e.setAttribute("style",i),e.setAttribute("data-mce-style",i)):e.removeAttribute("style")},X=(e,t)=>(e,a,i)=>{const s=e.style;s[a]?(s[a]=F(i),Q(e,t)):J(e,a,i)},Y=(e,t)=>e.style[t]?B(e.style[t]):Z(e,t),ee=(e,t)=>{const a=F(t);e.style.marginLeft=a,e.style.marginRight=a},te=(e,t)=>{const a=F(t);e.style.marginTop=a,e.style.marginBottom=a},ae=(e,t)=>{const a=F(t);e.style.borderWidth=a},ie=(e,t)=>{e.style.borderStyle=t},se=e=>{var t;return null!==(t=e.style.borderStyle)&&void 0!==t?t:""},re=e=>d(e)&&"FIGURE"===e.nodeName,oe=e=>0===W.getAttrib(e,"alt").length&&"presentation"===W.getAttrib(e,"role"),ne=e=>oe(e)?"":Z(e,"alt"),le=(e,t)=>{var a;const i=document.createElement("img");return J(i,"style",t.style),($(i)||""!==t.hspace)&&ee(i,t.hspace),(V(i)||""!==t.vspace)&&te(i,t.vspace),(K(i)||""!==t.border)&&ae(i,t.border),(se(i)||""!==t.borderStyle)&&ie(i,t.borderStyle),e(null!==(a=i.getAttribute("style"))&&void 0!==a?a:"")},ce=(e,t)=>({src:Z(t,"src"),alt:ne(t),title:Z(t,"title"),width:Y(t,"width"),height:Y(t,"height"),class:Z(t,"class"),style:e(Z(t,"style")),caption:q(t),hspace:$(t),vspace:V(t),border:K(t),borderStyle:se(t),isDecorative:oe(t)}),me=(e,t,a,i,s)=>{a[i]!==t[i]&&s(e,i,String(a[i]))},de=(e,t,a)=>{if(a){W.setAttrib(e,"role","presentation");const t=_(e);A(t,"alt","")}else{if(c(t)){"alt",_(e).dom.removeAttribute("alt")}else{const a=_(e);A(a,"alt",t)}"presentation"===W.getAttrib(e,"role")&&W.setAttrib(e,"role","")}},ge=(e,t)=>(a,i,s)=>{e(a,s),Q(a,t)},ue=(e,t,a)=>{const i=ce(e,a);me(a,i,t,"caption",((e,t,a)=>(e=>{q(e)?(e=>{const t=e.parentNode;d(t)&&(W.insertAfter(e,t),W.remove(t))})(e):(e=>{const t=W.create("figure",{class:"image"});W.insertAfter(t,e),t.appendChild(e),t.appendChild(W.create("figcaption",{contentEditable:"true"},"Caption")),t.contentEditable="false"})(e)})(e))),me(a,i,t,"src",J),me(a,i,t,"title",J),me(a,i,t,"width",X(0,e)),me(a,i,t,"height",X(0,e)),me(a,i,t,"class",J),me(a,i,t,"style",ge(((e,t)=>J(e,"style",t)),e)),me(a,i,t,"hspace",ge(ee,e)),me(a,i,t,"vspace",ge(te,e)),me(a,i,t,"border",ge(ae,e)),me(a,i,t,"borderStyle",ge(ie,e)),((e,t,a)=>{a.alt===t.alt&&a.isDecorative===t.isDecorative||de(e,a.alt,a.isDecorative)})(a,i,t)},pe=(e,t)=>{const a=(e=>{if(e.margin){const t=String(e.margin).split(" ");switch(t.length){case 1:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[0],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[0];break;case 2:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[1];break;case 3:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[1];break;case 4:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[3]}delete e.margin}return e})(e.dom.styles.parse(t)),i=e.dom.styles.parse(e.dom.styles.serialize(a));return e.dom.styles.serialize(i)},he=e=>{const t=e.selection.getNode(),a=e.dom.getParent(t,"figure.image");return a?e.dom.select("img",a)[0]:t&&("IMG"!==t.nodeName||H(t))?null:t},be=(e,t)=>{var a;const i=e.dom,s=((t,a)=>{const i={};var s;return((e,t,a,i)=>{((e,t)=>{const a=b(e);for(let i=0,s=a.length;i{(t(e,s)?a:i)(e,s)}))})(t,((t,a)=>!e.schema.isValidChild(a,"figure")),(s=i,(e,t)=>{s[t]=e}),p),i})(e.schema.getTextBlockElements()),r=i.getParent(t.parentNode,(e=>{return t=s,a=e.nodeName,y(t,a)&&void 0!==t[a]&&null!==t[a];var t,a}),e.getBody());return r&&null!==(a=i.split(r,t))&&void 0!==a?a:t},ve=(e,t)=>{const a=((t,a)=>{const i=document.createElement("img");if(ue((t=>pe(e,t)),{...a,caption:!1},i),de(i,a.alt,a.isDecorative),a.caption){const e=W.create("figure",{class:"image"});return e.appendChild(i),e.appendChild(W.create("figcaption",{contentEditable:"true"},"Caption")),e.contentEditable="false",e}return i})(0,t);e.dom.setAttrib(a,"data-mce-id","__mcenew"),e.focus(),e.selection.setContent(a.outerHTML);const i=e.dom.select('*[data-mce-id="__mcenew"]')[0];if(e.dom.setAttrib(i,"data-mce-id",null),re(i)){const t=be(e,i);e.selection.select(t)}else e.selection.select(i)},ye=(e,t)=>{const a=he(e);if(a){const i={...ce((t=>pe(e,t)),a),...t},s=((e,t)=>{const a=t.src;return{...t,src:G(e,a)?a:""}})(e,i);i.src?((e,t)=>{const a=he(e);if(a)if(ue((t=>pe(e,t)),t,a),((e,t)=>{e.dom.setAttrib(t,"src",t.getAttribute("src"))})(e,a),re(a.parentNode)){const t=a.parentNode;be(e,t),e.selection.select(a.parentNode)}else e.selection.select(a),((e,t,a)=>{const i=()=>{a.onload=a.onerror=null,e.selection&&(e.selection.select(a),e.nodeChanged())};a.onload=()=>{t.width||t.height||!x(e)||e.dom.setAttribs(a,{width:String(a.clientWidth),height:String(a.clientHeight)}),i()},a.onerror=i})(e,t,a)})(e,s):((e,t)=>{if(t){const a=e.dom.is(t.parentNode,"figure.image")?t.parentNode:t;e.dom.remove(a),e.focus(),e.nodeChanged(),e.dom.isEmpty(e.getBody())&&(e.setContent(""),e.selection.setCursorLocation())}})(e,a)}else t.src&&ve(e,{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1,...t})},fe=(we=(e,t)=>n(e)&&n(t)?fe(e,t):t,(...e)=>{if(0===e.length)throw new Error("Can't merge zero objects");const t={};for(let a=0;ar(e.value)?e.value:"",Ce=(e,t)=>{const a=[];return De.each(e,(e=>{const i=(e=>r(e.text)?e.text:r(e.title)?e.title:"")(e);if(void 0!==e.menu){const s=Ce(e.menu,t);a.push({text:i,items:s})}else{const s=t(e);a.push({text:i,value:s})}})),a},Ie=(e=_e)=>t=>t?h.from(t).map((t=>Ce(t,e))):h.none(),Ue=(e,t)=>((e,a)=>{for(let a=0;ay(e,"items"))(i=e[a])?Ue(i.items,t):i.value===t?h.some(i):h.none();if(s.isSome())return s}var i;return h.none()})(e),Se=Ie,xe=(e,t)=>e.bind((e=>Ue(e,t))),Ne=e=>{const t=Se((t=>e.convertURL(t.value||t.url||"","src"))),a=new Promise((a=>{((e,t)=>{const a=R(e);r(a)?fetch(a).then((e=>{e.ok&&e.json().then(t)})):g(a)?a(t):t(a)})(e,(e=>{a(t(e).map((e=>w([[{text:"None",value:""}],e]))))}))})),i=(A=E(e),Ie(_e)(A)),s=N(e),o=T(e),n=(e=>U(e.options.get("images_upload_url")))(e),l=(e=>d(e.options.get("images_upload_handler")))(e),c=(e=>{const t=he(e);return t?ce((t=>pe(e,t)),t):{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1}})(e),m=L(e),u=j(e),p=x(e),b=M(e),v=k(e),y=z(e),f=h.some(O(e)).filter((e=>r(e)&&e.length>0));var A;return a.then((e=>({image:c,imageList:e,classList:i,hasAdvTab:s,hasUploadTab:o,hasUploadUrl:n,hasUploadHandler:l,hasDescription:m,hasImageTitle:u,hasDimensions:p,hasImageCaption:b,prependURL:f,hasAccessibilityOptions:v,automaticUploads:y})))},Te=e=>{const t=e.imageList.map((e=>({name:"images",type:"listbox",label:"Image list",items:e}))),a={name:"alt",type:"input",label:"Alternative description",enabled:!(e.hasAccessibilityOptions&&e.image.isDecorative)},i=e.classList.map((e=>({name:"classes",type:"listbox",label:"Class",items:e})));return w([[{name:"src",type:"urlinput",filetype:"image",label:"Source"}],t.toArray(),e.hasAccessibilityOptions&&e.hasDescription?[{type:"label",label:"Accessibility",items:[{name:"isDecorative",type:"checkbox",label:"Image is decorative"}]}]:[],e.hasDescription?[a]:[],e.hasImageTitle?[{name:"title",type:"input",label:"Image title"}]:[],e.hasDimensions?[{name:"dimensions",type:"sizeinput"}]:[],[{...(s=e.classList.isSome()&&e.hasImageCaption,s?{type:"grid",columns:2}:{type:"panel"}),items:w([i.toArray(),e.hasImageCaption?[{type:"label",label:"Caption",items:[{type:"checkbox",name:"caption",label:"Show caption"}]}]:[]])}]]);var s},Oe=e=>({title:"General",name:"general",items:Te(e)}),Ee=Te,Le=e=>({src:{value:e.src,meta:{}},images:e.src,alt:e.alt,title:e.title,dimensions:{width:e.width,height:e.height},classes:e.class,caption:e.caption,style:e.style,vspace:e.vspace,border:e.border,hspace:e.hspace,borderstyle:e.borderStyle,fileinput:[],isDecorative:e.isDecorative}),je=(e,t)=>({src:e.src.value,alt:null!==e.alt&&0!==e.alt.length||!t?e.alt:null,title:e.title,width:e.dimensions.width,height:e.dimensions.height,class:e.classes,style:e.style,caption:e.caption,hspace:e.hspace,vspace:e.vspace,border:e.border,borderStyle:e.borderstyle,isDecorative:e.isDecorative}),Me=(e,t,a,i)=>{((e,t)=>{const a=t.getData();((e,t)=>/^(?:[a-zA-Z]+:)?\/\//.test(t)?h.none():e.prependURL.bind((e=>t.substring(0,e.length)!==e?h.some(e+t):h.none())))(e,a.src.value).each((e=>{t.setData({src:{value:e,meta:a.src.meta}})}))})(t,i),((e,t)=>{const a=t.getData(),i=a.src.meta;if(void 0!==i){const s=fe({},a);((e,t,a)=>{e.hasDescription&&r(a.alt)&&(t.alt=a.alt),e.hasAccessibilityOptions&&(t.isDecorative=a.isDecorative||t.isDecorative||!1),e.hasImageTitle&&r(a.title)&&(t.title=a.title),e.hasDimensions&&(r(a.width)&&(t.dimensions.width=a.width),r(a.height)&&(t.dimensions.height=a.height)),r(a.class)&&xe(e.classList,a.class).each((e=>{t.classes=e.value})),e.hasImageCaption&&m(a.caption)&&(t.caption=a.caption),e.hasAdvTab&&(r(a.style)&&(t.style=a.style),r(a.vspace)&&(t.vspace=a.vspace),r(a.border)&&(t.border=a.border),r(a.hspace)&&(t.hspace=a.hspace),r(a.borderstyle)&&(t.borderstyle=a.borderstyle))})(e,s,i),t.setData(s)}})(t,i),((e,t,a,i)=>{const s=i.getData(),r=s.src.value,o=s.src.meta||{};o.width||o.height||!t.hasDimensions||(U(r)?e.imageSize(r).then((e=>{a.open&&i.setData({dimensions:e})})).catch((e=>console.error(e))):i.setData({dimensions:{width:"",height:""}}))})(e,t,a,i),((e,t,a)=>{const i=a.getData(),s=xe(e.imageList,i.src.value);t.prevImage=s,a.setData({images:s.map((e=>e.value)).getOr("")})})(t,a,i)},Re=(e,t,a,i)=>{const s=i.getData();var r;i.block("Uploading image"),(r=s.fileinput,((e,t)=>0{i.unblock()}),(s=>{const r=URL.createObjectURL(s),o=()=>{i.unblock(),URL.revokeObjectURL(r)},n=s=>{i.setData({src:{value:s,meta:{}}}),i.showTab("general"),Me(e,t,a,i)};var l;(l=s,new Promise(((e,t)=>{const a=new FileReader;a.onload=()=>{e(a.result)},a.onerror=()=>{var e;t(null===(e=a.error)||void 0===e?void 0:e.message)},a.readAsDataURL(l)}))).then((a=>{const l=e.createBlobCache(s,r,a);t.automaticUploads?e.uploadImage(l).then((e=>{n(e.url),o()})).catch((t=>{o(),e.alertErr(t)})):(e.addToBlobCache(l),n(l.blobUri()),i.unblock())}))}))},ke=(e,t,a)=>(i,s)=>{"src"===s.name?Me(e,t,a,i):"images"===s.name?((e,t,a,i)=>{const s=i.getData(),r=xe(t.imageList,s.images);r.each((e=>{const t=""===s.alt||a.prevImage.map((e=>e.text===s.alt)).getOr(!1);t?""===e.value?i.setData({src:e,alt:a.prevAlt}):i.setData({src:e,alt:e.text}):i.setData({src:e})})),a.prevImage=r,Me(e,t,a,i)})(e,t,a,i):"alt"===s.name?a.prevAlt=i.getData().alt:"fileinput"===s.name?Re(e,t,a,i):"isDecorative"===s.name&&i.setEnabled("alt",!i.getData().isDecorative)},ze=e=>()=>{e.open=!1},Pe=e=>e.hasAdvTab||e.hasUploadUrl||e.hasUploadHandler?{type:"tabpanel",tabs:w([[Oe(e)],e.hasAdvTab?[{title:"Advanced",name:"advanced",items:[{type:"grid",columns:2,items:[{type:"input",label:"Vertical space",name:"vspace",inputMode:"numeric"},{type:"input",label:"Horizontal space",name:"hspace",inputMode:"numeric"},{type:"input",label:"Border width",name:"border",inputMode:"numeric"},{type:"listbox",name:"borderstyle",label:"Border style",items:[{text:"Select...",value:""},{text:"Solid",value:"solid"},{text:"Dotted",value:"dotted"},{text:"Dashed",value:"dashed"},{text:"Double",value:"double"},{text:"Groove",value:"groove"},{text:"Ridge",value:"ridge"},{text:"Inset",value:"inset"},{text:"Outset",value:"outset"},{text:"None",value:"none"},{text:"Hidden",value:"hidden"}]}]}]}]:[],e.hasUploadTab&&(e.hasUploadUrl||e.hasUploadHandler)?[{title:"Upload",name:"upload",items:[{type:"dropzone",name:"fileinput"}]}]:[]])}:{type:"panel",items:Ee(e)},Be=(e,t,a)=>i=>{const s=fe(Le(t.image),i.getData()),r={...s,style:le(a.normalizeCss,je(s,!1))};e.execCommand("mceUpdateImage",!1,je(r,t.hasAccessibilityOptions)),e.editorUpload.uploadImagesAuto(),i.close()},Fe=e=>t=>G(e,t)?(e=>new Promise((t=>{const a=document.createElement("img"),i=e=>{a.onload=a.onerror=null,a.parentNode&&a.parentNode.removeChild(a),t(e)};a.onload=()=>{const e={width:P(a.width,a.clientWidth),height:P(a.height,a.clientHeight)};i(Promise.resolve(e))},a.onerror=()=>{i(Promise.reject(`Failed to get image dimensions for: ${e}`))};const s=a.style;s.visibility="hidden",s.position="fixed",s.bottom=s.left="0px",s.width=s.height="auto",document.body.appendChild(a),a.src=e})))(e.documentBaseURI.toAbsolute(t)).then((e=>({width:String(e.width),height:String(e.height)}))):Promise.resolve({width:"",height:""}),He=e=>(t,a,i)=>{var s;return e.editorUpload.blobCache.create({blob:t,blobUri:a,name:null===(s=t.name)||void 0===s?void 0:s.replace(/\.[^\.]+$/,""),filename:t.name,base64:i.split(",")[1]})},Ge=e=>t=>{e.editorUpload.blobCache.add(t)},We=e=>t=>{e.windowManager.alert(t)},$e=e=>t=>pe(e,t),Ve=e=>t=>e.dom.parseStyle(t),Ke=e=>(t,a)=>e.dom.serializeStyle(t,a),Ze=e=>t=>Ae(e).upload([t],!1).then((e=>{var t;return 0===e.length?Promise.reject("Failed to upload image"):!1===e[0].status?Promise.reject(null===(t=e[0].error)||void 0===t?void 0:t.message):e[0]})),qe=e=>{const t={imageSize:Fe(e),addToBlobCache:Ge(e),createBlobCache:He(e),alertErr:We(e),normalizeCss:$e(e),parseStyle:Ve(e),serializeStyle:Ke(e),uploadImage:Ze(e)};return{open:()=>{Ne(e).then((a=>{const i=(e=>({prevImage:xe(e.imageList,e.image.src),prevAlt:e.image.alt,open:!0}))(a);return{title:"Insert/Edit Image",size:"normal",body:Pe(a),buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:Le(a.image),onSubmit:Be(e,a,t),onChange:ke(t,a,i),onClose:ze(i)}})).then(e.windowManager.open)}}},Je=e=>{const t=e.attr("class");return d(t)&&/\bimage\b/.test(t)},Qe=e=>t=>{let a=t.length;const i=t=>{t.attr("contenteditable",e?"true":null)};for(;a--;){const s=t[a];Je(s)&&(s.attr("contenteditable",e?"false":null),De.each(s.getAll("figcaption"),i))}},Xe=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("image",(e=>{(e=>{const t=e.options.register;t("image_dimensions",{processor:"boolean",default:!0}),t("image_advtab",{processor:"boolean",default:!1}),t("image_uploadtab",{processor:"boolean",default:!0}),t("image_prepend_url",{processor:"string",default:""}),t("image_class_list",{processor:"object[]"}),t("image_description",{processor:"boolean",default:!0}),t("image_title",{processor:"boolean",default:!1}),t("image_caption",{processor:"boolean",default:!1}),t("image_list",{processor:e=>{const t=!1===e||r(e)||((e,t)=>{if(l(e)){for(let a=0,i=e.length;a{e.on("PreInit",(()=>{e.parser.addNodeFilter("figure",Qe(!0)),e.serializer.addNodeFilter("figure",Qe(!1))}))})(e),(e=>{e.ui.registry.addToggleButton("image",{icon:"image",tooltip:"Insert/edit image",onAction:qe(e).open,onSetup:t=>{t.setActive(d(he(e)));const a=e.selection.selectorChangedWithUnbind("img:not([data-mce-object]):not([data-mce-placeholder]),figure.image",t.setActive).unbind,i=Xe(e)(t);return()=>{a(),i()}}}),e.ui.registry.addMenuItem("image",{icon:"image",text:"Image...",onAction:qe(e).open,onSetup:Xe(e)}),e.ui.registry.addContextMenu("image",{update:e=>re(e)||"IMG"===e.nodeName&&!H(e)?["image"]:[]})})(e),(e=>{e.addCommand("mceImage",qe(e).open),e.addCommand("mceUpdateImage",((t,a)=>{e.undoManager.transact((()=>ye(e,a)))}))})(e)}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/imagetools/index.js b/public/js/tinymce/plugins/imagetools/index.js deleted file mode 100644 index c8b4f966a..000000000 --- a/public/js/tinymce/plugins/imagetools/index.js +++ /dev/null @@ -1,7 +0,0 @@ -// Exports the "imagetools" plugin for usage with module loaders -// Usage: -// CommonJS: -// require('tinymce/plugins/imagetools') -// ES2015: -// import 'tinymce/plugins/imagetools' -require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/imagetools/plugin.js b/public/js/tinymce/plugins/imagetools/plugin.js deleted file mode 100644 index 08db0fc2d..000000000 --- a/public/js/tinymce/plugins/imagetools/plugin.js +++ /dev/null @@ -1,1531 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) - */ -(function () { - 'use strict'; - - var Cell = function (initial) { - var value = initial; - var get = function () { - return value; - }; - var set = function (v) { - value = v; - }; - return { - get: get, - set: set - }; - }; - - var global$5 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - - var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools'); - - var typeOf = function (x) { - var t = typeof x; - if (x === null) { - return 'null'; - } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { - return 'array'; - } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { - return 'string'; - } else { - return t; - } - }; - var isType = function (type) { - return function (value) { - return typeOf(value) === type; - }; - }; - var isSimpleType = function (type) { - return function (value) { - return typeof value === type; - }; - }; - var isArray = isType('array'); - var isNullable = function (a) { - return a === null || a === undefined; - }; - var isNonNullable = function (a) { - return !isNullable(a); - }; - var isFunction = isSimpleType('function'); - - var noop = function () { - }; - var constant = function (value) { - return function () { - return value; - }; - }; - var identity = function (x) { - return x; - }; - var never = constant(false); - var always = constant(true); - - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; - } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from - }; - - var exports$1 = {}, module = { exports: exports$1 }; - (function (define, exports, module, require) { - (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EphoxContactWrapper = factory()); - }(this, function () { - var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - var promise = { exports: {} }; - (function (module) { - (function (root) { - var setTimeoutFunc = setTimeout; - function noop() { - } - function bind(fn, thisArg) { - return function () { - fn.apply(thisArg, arguments); - }; - } - function Promise(fn) { - if (typeof this !== 'object') - throw new TypeError('Promises must be constructed via new'); - if (typeof fn !== 'function') - throw new TypeError('not a function'); - this._state = 0; - this._handled = false; - this._value = undefined; - this._deferreds = []; - doResolve(fn, this); - } - function handle(self, deferred) { - while (self._state === 3) { - self = self._value; - } - if (self._state === 0) { - self._deferreds.push(deferred); - return; - } - self._handled = true; - Promise._immediateFn(function () { - var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; - if (cb === null) { - (self._state === 1 ? resolve : reject)(deferred.promise, self._value); - return; - } - var ret; - try { - ret = cb(self._value); - } catch (e) { - reject(deferred.promise, e); - return; - } - resolve(deferred.promise, ret); - }); - } - function resolve(self, newValue) { - try { - if (newValue === self) - throw new TypeError('A promise cannot be resolved with itself.'); - if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { - var then = newValue.then; - if (newValue instanceof Promise) { - self._state = 3; - self._value = newValue; - finale(self); - return; - } else if (typeof then === 'function') { - doResolve(bind(then, newValue), self); - return; - } - } - self._state = 1; - self._value = newValue; - finale(self); - } catch (e) { - reject(self, e); - } - } - function reject(self, newValue) { - self._state = 2; - self._value = newValue; - finale(self); - } - function finale(self) { - if (self._state === 2 && self._deferreds.length === 0) { - Promise._immediateFn(function () { - if (!self._handled) { - Promise._unhandledRejectionFn(self._value); - } - }); - } - for (var i = 0, len = self._deferreds.length; i < len; i++) { - handle(self, self._deferreds[i]); - } - self._deferreds = null; - } - function Handler(onFulfilled, onRejected, promise) { - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.promise = promise; - } - function doResolve(fn, self) { - var done = false; - try { - fn(function (value) { - if (done) - return; - done = true; - resolve(self, value); - }, function (reason) { - if (done) - return; - done = true; - reject(self, reason); - }); - } catch (ex) { - if (done) - return; - done = true; - reject(self, ex); - } - } - Promise.prototype['catch'] = function (onRejected) { - return this.then(null, onRejected); - }; - Promise.prototype.then = function (onFulfilled, onRejected) { - var prom = new this.constructor(noop); - handle(this, new Handler(onFulfilled, onRejected, prom)); - return prom; - }; - Promise.all = function (arr) { - var args = Array.prototype.slice.call(arr); - return new Promise(function (resolve, reject) { - if (args.length === 0) - return resolve([]); - var remaining = args.length; - function res(i, val) { - try { - if (val && (typeof val === 'object' || typeof val === 'function')) { - var then = val.then; - if (typeof then === 'function') { - then.call(val, function (val) { - res(i, val); - }, reject); - return; - } - } - args[i] = val; - if (--remaining === 0) { - resolve(args); - } - } catch (ex) { - reject(ex); - } - } - for (var i = 0; i < args.length; i++) { - res(i, args[i]); - } - }); - }; - Promise.resolve = function (value) { - if (value && typeof value === 'object' && value.constructor === Promise) { - return value; - } - return new Promise(function (resolve) { - resolve(value); - }); - }; - Promise.reject = function (value) { - return new Promise(function (resolve, reject) { - reject(value); - }); - }; - Promise.race = function (values) { - return new Promise(function (resolve, reject) { - for (var i = 0, len = values.length; i < len; i++) { - values[i].then(resolve, reject); - } - }); - }; - Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) { - setImmediate(fn); - } : function (fn) { - setTimeoutFunc(fn, 0); - }; - Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { - if (typeof console !== 'undefined' && console) { - console.warn('Possible Unhandled Promise Rejection:', err); - } - }; - Promise._setImmediateFn = function _setImmediateFn(fn) { - Promise._immediateFn = fn; - }; - Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { - Promise._unhandledRejectionFn = fn; - }; - if (module.exports) { - module.exports = Promise; - } else if (!root.Promise) { - root.Promise = Promise; - } - }(commonjsGlobal)); - }(promise)); - var promisePolyfill = promise.exports; - var Global = function () { - if (typeof window !== 'undefined') { - return window; - } else { - return Function('return this;')(); - } - }(); - var promisePolyfill_1 = { boltExport: Global.Promise || promisePolyfill }; - return promisePolyfill_1; - })); - }(undefined, exports$1, module)); - var Promise$1 = module.exports.boltExport; - - var create$1 = function (width, height) { - return resize(document.createElement('canvas'), width, height); - }; - var clone = function (canvas) { - var tCanvas = create$1(canvas.width, canvas.height); - var ctx = get2dContext(tCanvas); - ctx.drawImage(canvas, 0, 0); - return tCanvas; - }; - var get2dContext = function (canvas) { - return canvas.getContext('2d'); - }; - var resize = function (canvas, width, height) { - canvas.width = width; - canvas.height = height; - return canvas; - }; - - var getWidth = function (image) { - return image.naturalWidth || image.width; - }; - var getHeight = function (image) { - return image.naturalHeight || image.height; - }; - - var imageToBlob$2 = function (image) { - var src = image.src; - if (src.indexOf('data:') === 0) { - return dataUriToBlob(src); - } - return anyUriToBlob(src); - }; - var blobToImage$1 = function (blob) { - return new Promise$1(function (resolve, reject) { - var blobUrl = URL.createObjectURL(blob); - var image = new Image(); - var removeListeners = function () { - image.removeEventListener('load', loaded); - image.removeEventListener('error', error); - }; - var loaded = function () { - removeListeners(); - resolve(image); - }; - var error = function () { - removeListeners(); - reject('Unable to load data of type ' + blob.type + ': ' + blobUrl); - }; - image.addEventListener('load', loaded); - image.addEventListener('error', error); - image.src = blobUrl; - if (image.complete) { - setTimeout(loaded, 0); - } - }); - }; - var anyUriToBlob = function (url) { - return new Promise$1(function (resolve, reject) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'blob'; - xhr.onload = function () { - if (this.status === 200) { - resolve(this.response); - } - }; - xhr.onerror = function () { - var _this = this; - var corsError = function () { - var obj = new Error('No access to download image'); - obj.code = 18; - obj.name = 'SecurityError'; - return obj; - }; - var genericError = function () { - return new Error('Error ' + _this.status + ' downloading image'); - }; - reject(this.status === 0 ? corsError() : genericError()); - }; - xhr.send(); - }); - }; - var dataUriToBlobSync = function (uri) { - var data = uri.split(','); - var matches = /data:([^;]+)/.exec(data[0]); - if (!matches) { - return Optional.none(); - } - var mimetype = matches[1]; - var base64 = data[1]; - var sliceSize = 1024; - var byteCharacters = atob(base64); - var bytesLength = byteCharacters.length; - var slicesCount = Math.ceil(bytesLength / sliceSize); - var byteArrays = new Array(slicesCount); - for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) { - var begin = sliceIndex * sliceSize; - var end = Math.min(begin + sliceSize, bytesLength); - var bytes = new Array(end - begin); - for (var offset = begin, i = 0; offset < end; ++i, ++offset) { - bytes[i] = byteCharacters[offset].charCodeAt(0); - } - byteArrays[sliceIndex] = new Uint8Array(bytes); - } - return Optional.some(new Blob(byteArrays, { type: mimetype })); - }; - var dataUriToBlob = function (uri) { - return new Promise$1(function (resolve, reject) { - dataUriToBlobSync(uri).fold(function () { - reject('uri is not base64: ' + uri); - }, resolve); - }); - }; - var canvasToBlob = function (canvas, type, quality) { - type = type || 'image/png'; - if (isFunction(HTMLCanvasElement.prototype.toBlob)) { - return new Promise$1(function (resolve, reject) { - canvas.toBlob(function (blob) { - if (blob) { - resolve(blob); - } else { - reject(); - } - }, type, quality); - }); - } else { - return dataUriToBlob(canvas.toDataURL(type, quality)); - } - }; - var canvasToDataURL = function (canvas, type, quality) { - type = type || 'image/png'; - return canvas.toDataURL(type, quality); - }; - var blobToCanvas = function (blob) { - return blobToImage$1(blob).then(function (image) { - revokeImageUrl(image); - var canvas = create$1(getWidth(image), getHeight(image)); - var context = get2dContext(canvas); - context.drawImage(image, 0, 0); - return canvas; - }); - }; - var blobToDataUri = function (blob) { - return new Promise$1(function (resolve) { - var reader = new FileReader(); - reader.onloadend = function () { - resolve(reader.result); - }; - reader.readAsDataURL(blob); - }); - }; - var revokeImageUrl = function (image) { - URL.revokeObjectURL(image.src); - }; - - var blobToImage = function (blob) { - return blobToImage$1(blob); - }; - var imageToBlob$1 = function (image) { - return imageToBlob$2(image); - }; - - var nativeIndexOf = Array.prototype.indexOf; - var rawIndexOf = function (ts, t) { - return nativeIndexOf.call(ts, t); - }; - var contains = function (xs, x) { - return rawIndexOf(xs, x) > -1; - }; - var each$1 = function (xs, f) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; - f(x, i); - } - }; - var filter = function (xs, pred) { - var r = []; - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; - if (pred(x, i)) { - r.push(x); - } - } - return r; - }; - var foldl = function (xs, f, acc) { - each$1(xs, function (x, i) { - acc = f(acc, x, i); - }); - return acc; - }; - var findUntil = function (xs, pred, until) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; - if (pred(x, i)) { - return Optional.some(x); - } else if (until(x, i)) { - break; - } - } - return Optional.none(); - }; - var find = function (xs, pred) { - return findUntil(xs, pred, never); - }; - var forall = function (xs, pred) { - for (var i = 0, len = xs.length; i < len; ++i) { - var x = xs[i]; - if (pred(x, i) !== true) { - return false; - } - } - return true; - }; - - var keys = Object.keys; - var each = function (obj, f) { - var props = keys(obj); - for (var k = 0, len = props.length; k < len; k++) { - var i = props[k]; - var x = obj[i]; - f(x, i); - } - }; - - var generate = function (cases) { - if (!isArray(cases)) { - throw new Error('cases must be an array'); - } - if (cases.length === 0) { - throw new Error('there must be at least one case'); - } - var constructors = []; - var adt = {}; - each$1(cases, function (acase, count) { - var keys$1 = keys(acase); - if (keys$1.length !== 1) { - throw new Error('one and only one name per case'); - } - var key = keys$1[0]; - var value = acase[key]; - if (adt[key] !== undefined) { - throw new Error('duplicate key detected:' + key); - } else if (key === 'cata') { - throw new Error('cannot have a case named cata (sorry)'); - } else if (!isArray(value)) { - throw new Error('case arguments must be an array'); - } - constructors.push(key); - adt[key] = function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - var argLength = args.length; - if (argLength !== value.length) { - throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength); - } - var match = function (branches) { - var branchKeys = keys(branches); - if (constructors.length !== branchKeys.length) { - throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(',')); - } - var allReqd = forall(constructors, function (reqKey) { - return contains(branchKeys, reqKey); - }); - if (!allReqd) { - throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', ')); - } - return branches[key].apply(null, args); - }; - return { - fold: function () { - var foldArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - foldArgs[_i] = arguments[_i]; - } - if (foldArgs.length !== cases.length) { - throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length); - } - var target = foldArgs[count]; - return target.apply(null, args); - }, - match: match, - log: function (label) { - console.log(label, { - constructors: constructors, - constructor: key, - params: args - }); - } - }; - }; - }); - return adt; - }; - var Adt = { generate: generate }; - - Adt.generate([ - { - bothErrors: [ - 'error1', - 'error2' - ] - }, - { - firstError: [ - 'error1', - 'value2' - ] - }, - { - secondError: [ - 'value1', - 'error2' - ] - }, - { - bothValues: [ - 'value1', - 'value2' - ] - } - ]); - - var create = function (getCanvas, blob, uri) { - var initialType = blob.type; - var getType = constant(initialType); - var toBlob = function () { - return Promise$1.resolve(blob); - }; - var toDataURL = constant(uri); - var toBase64 = function () { - return uri.split(',')[1]; - }; - var toAdjustedBlob = function (type, quality) { - return getCanvas.then(function (canvas) { - return canvasToBlob(canvas, type, quality); - }); - }; - var toAdjustedDataURL = function (type, quality) { - return getCanvas.then(function (canvas) { - return canvasToDataURL(canvas, type, quality); - }); - }; - var toAdjustedBase64 = function (type, quality) { - return toAdjustedDataURL(type, quality).then(function (dataurl) { - return dataurl.split(',')[1]; - }); - }; - var toCanvas = function () { - return getCanvas.then(clone); - }; - return { - getType: getType, - toBlob: toBlob, - toDataURL: toDataURL, - toBase64: toBase64, - toAdjustedBlob: toAdjustedBlob, - toAdjustedDataURL: toAdjustedDataURL, - toAdjustedBase64: toAdjustedBase64, - toCanvas: toCanvas - }; - }; - var fromBlob = function (blob) { - return blobToDataUri(blob).then(function (uri) { - return create(blobToCanvas(blob), blob, uri); - }); - }; - var fromCanvas = function (canvas, type) { - return canvasToBlob(canvas, type).then(function (blob) { - return create(Promise$1.resolve(canvas), blob, canvas.toDataURL()); - }); - }; - - var ceilWithPrecision = function (num, precision) { - if (precision === void 0) { - precision = 2; - } - var mul = Math.pow(10, precision); - var upper = Math.round(num * mul); - return Math.ceil(upper / mul); - }; - var rotate$2 = function (ir, angle) { - return ir.toCanvas().then(function (canvas) { - return applyRotate(canvas, ir.getType(), angle); - }); - }; - var applyRotate = function (image, type, angle) { - var degrees = angle < 0 ? 360 + angle : angle; - var rad = degrees * Math.PI / 180; - var width = image.width; - var height = image.height; - var sin = Math.sin(rad); - var cos = Math.cos(rad); - var newWidth = ceilWithPrecision(Math.abs(width * cos) + Math.abs(height * sin)); - var newHeight = ceilWithPrecision(Math.abs(width * sin) + Math.abs(height * cos)); - var canvas = create$1(newWidth, newHeight); - var context = get2dContext(canvas); - context.translate(newWidth / 2, newHeight / 2); - context.rotate(rad); - context.drawImage(image, -width / 2, -height / 2); - return fromCanvas(canvas, type); - }; - var flip$2 = function (ir, axis) { - return ir.toCanvas().then(function (canvas) { - return applyFlip(canvas, ir.getType(), axis); - }); - }; - var applyFlip = function (image, type, axis) { - var canvas = create$1(image.width, image.height); - var context = get2dContext(canvas); - if (axis === 'v') { - context.scale(1, -1); - context.drawImage(image, 0, -canvas.height); - } else { - context.scale(-1, 1); - context.drawImage(image, -canvas.width, 0); - } - return fromCanvas(canvas, type); - }; - - var flip$1 = function (ir, axis) { - return flip$2(ir, axis); - }; - var rotate$1 = function (ir, angle) { - return rotate$2(ir, angle); - }; - - var sendRequest = function (url, headers, withCredentials) { - if (withCredentials === void 0) { - withCredentials = false; - } - return new Promise$1(function (resolve) { - var xhr = new XMLHttpRequest(); - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - resolve({ - status: xhr.status, - blob: xhr.response - }); - } - }; - xhr.open('GET', url, true); - xhr.withCredentials = withCredentials; - each(headers, function (value, key) { - xhr.setRequestHeader(key, value); - }); - xhr.responseType = 'blob'; - xhr.send(); - }); - }; - var readBlobText = function (blob) { - return new Promise$1(function (resolve, reject) { - var reader = new FileReader(); - reader.onload = function () { - resolve(reader.result); - }; - reader.onerror = function (e) { - reject(e); - }; - reader.readAsText(blob); - }); - }; - var parseJson = function (text) { - try { - return Optional.some(JSON.parse(text)); - } catch (ex) { - return Optional.none(); - } - }; - - var friendlyHttpErrors = [ - { - code: 404, - message: 'Could not find Image Proxy' - }, - { - code: 403, - message: 'Rejected request' - }, - { - code: 0, - message: 'Incorrect Image Proxy URL' - } - ]; - var friendlyServiceErrors = [ - { - type: 'not_found', - message: 'Failed to load image.' - }, - { - type: 'key_missing', - message: 'The request did not include an api key.' - }, - { - type: 'key_not_found', - message: 'The provided api key could not be found.' - }, - { - type: 'domain_not_trusted', - message: 'The api key is not valid for the request origins.' - } - ]; - var traverseJson = function (json, path) { - var value = foldl(path, function (result, key) { - return isNonNullable(result) ? result[key] : undefined; - }, json); - return Optional.from(value); - }; - var isServiceErrorCode = function (code, blob) { - return (blob === null || blob === void 0 ? void 0 : blob.type) === 'application/json' && (code === 400 || code === 403 || code === 404 || code === 500); - }; - var getHttpErrorMsg = function (status) { - var message = find(friendlyHttpErrors, function (error) { - return status === error.code; - }).fold(constant('Unknown ImageProxy error'), function (error) { - return error.message; - }); - return 'ImageProxy HTTP error: ' + message; - }; - var handleHttpError = function (status) { - var message = getHttpErrorMsg(status); - return Promise$1.reject(message); - }; - var getServiceErrorMsg = function (type) { - return find(friendlyServiceErrors, function (error) { - return error.type === type; - }).fold(constant('Unknown service error'), function (error) { - return error.message; - }); - }; - var getServiceError = function (text) { - var serviceError = parseJson(text); - var errorMsg = serviceError.bind(function (err) { - return traverseJson(err, [ - 'error', - 'type' - ]).map(getServiceErrorMsg); - }).getOr('Invalid JSON in service error message'); - return 'ImageProxy Service error: ' + errorMsg; - }; - var handleServiceError = function (blob) { - return readBlobText(blob).then(function (text) { - var serviceError = getServiceError(text); - return Promise$1.reject(serviceError); - }); - }; - var handleServiceErrorResponse = function (status, blob) { - return isServiceErrorCode(status, blob) ? handleServiceError(blob) : handleHttpError(status); - }; - - var appendApiKey = function (url, apiKey) { - var separator = url.indexOf('?') === -1 ? '?' : '&'; - if (/[?&]apiKey=/.test(url)) { - return url; - } else { - return url + separator + 'apiKey=' + encodeURIComponent(apiKey); - } - }; - var isError = function (status) { - return status < 200 || status >= 300; - }; - var requestServiceBlob = function (url, apiKey) { - var headers = { - 'Content-Type': 'application/json;charset=UTF-8', - 'tiny-api-key': apiKey - }; - return sendRequest(appendApiKey(url, apiKey), headers).then(function (result) { - return isError(result.status) ? handleServiceErrorResponse(result.status, result.blob) : Promise$1.resolve(result.blob); - }); - }; - var requestBlob = function (url, withCredentials) { - return sendRequest(url, {}, withCredentials).then(function (result) { - return isError(result.status) ? handleHttpError(result.status) : Promise$1.resolve(result.blob); - }); - }; - var getUrl = function (url, apiKey, withCredentials) { - if (withCredentials === void 0) { - withCredentials = false; - } - return apiKey ? requestServiceBlob(url, apiKey) : requestBlob(url, withCredentials); - }; - - var blobToImageResult = function (blob) { - return fromBlob(blob); - }; - - var ELEMENT = 1; - - var fromHtml = function (html, scope) { - var doc = scope || document; - var div = doc.createElement('div'); - div.innerHTML = html; - if (!div.hasChildNodes() || div.childNodes.length > 1) { - console.error('HTML does not have a single root node', html); - throw new Error('HTML must have a single root node'); - } - return fromDom(div.childNodes[0]); - }; - var fromTag = function (tag, scope) { - var doc = scope || document; - var node = doc.createElement(tag); - return fromDom(node); - }; - var fromText = function (text, scope) { - var doc = scope || document; - var node = doc.createTextNode(text); - return fromDom(node); - }; - var fromDom = function (node) { - if (node === null || node === undefined) { - throw new Error('Node cannot be null or undefined'); - } - return { dom: node }; - }; - var fromPoint = function (docElm, x, y) { - return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); - }; - var SugarElement = { - fromHtml: fromHtml, - fromTag: fromTag, - fromText: fromText, - fromDom: fromDom, - fromPoint: fromPoint - }; - - var is = function (element, selector) { - var dom = element.dom; - if (dom.nodeType !== ELEMENT) { - return false; - } else { - var elem = dom; - if (elem.matches !== undefined) { - return elem.matches(selector); - } else if (elem.msMatchesSelector !== undefined) { - return elem.msMatchesSelector(selector); - } else if (elem.webkitMatchesSelector !== undefined) { - return elem.webkitMatchesSelector(selector); - } else if (elem.mozMatchesSelector !== undefined) { - return elem.mozMatchesSelector(selector); - } else { - throw new Error('Browser lacks native selectors'); - } - } - }; - - typeof window !== 'undefined' ? window : Function('return this;')(); - - var child$1 = function (scope, predicate) { - var pred = function (node) { - return predicate(SugarElement.fromDom(node)); - }; - var result = find(scope.dom.childNodes, pred); - return result.map(SugarElement.fromDom); - }; - - var child = function (scope, selector) { - return child$1(scope, function (e) { - return is(e, selector); - }); - }; - - var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); - - var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); - - var global$1 = tinymce.util.Tools.resolve('tinymce.util.URI'); - - var getToolbarItems = function (editor) { - return editor.getParam('imagetools_toolbar', 'rotateleft rotateright flipv fliph editimage imageoptions'); - }; - var getProxyUrl = function (editor) { - return editor.getParam('imagetools_proxy'); - }; - var getCorsHosts = function (editor) { - return editor.getParam('imagetools_cors_hosts', [], 'string[]'); - }; - var getCredentialsHosts = function (editor) { - return editor.getParam('imagetools_credentials_hosts', [], 'string[]'); - }; - var getFetchImage = function (editor) { - return Optional.from(editor.getParam('imagetools_fetch_image', null, 'function')); - }; - var getApiKey = function (editor) { - return editor.getParam('api_key', editor.getParam('imagetools_api_key', '', 'string'), 'string'); - }; - var getUploadTimeout = function (editor) { - return editor.getParam('images_upload_timeout', 30000, 'number'); - }; - var shouldReuseFilename = function (editor) { - return editor.getParam('images_reuse_filename', false, 'boolean'); - }; - - var getImageSize = function (img) { - var width, height; - var isPxValue = function (value) { - return /^[0-9\.]+px$/.test(value); - }; - width = img.style.width; - height = img.style.height; - if (width || height) { - if (isPxValue(width) && isPxValue(height)) { - return { - w: parseInt(width, 10), - h: parseInt(height, 10) - }; - } - return null; - } - width = img.width; - height = img.height; - if (width && height) { - return { - w: parseInt(width, 10), - h: parseInt(height, 10) - }; - } - return null; - }; - var setImageSize = function (img, size) { - var width, height; - if (size) { - width = img.style.width; - height = img.style.height; - if (width || height) { - img.style.width = size.w + 'px'; - img.style.height = size.h + 'px'; - img.removeAttribute('data-mce-style'); - } - width = img.width; - height = img.height; - if (width || height) { - img.setAttribute('width', String(size.w)); - img.setAttribute('height', String(size.h)); - } - } - }; - var getNaturalImageSize = function (img) { - return { - w: img.naturalWidth, - h: img.naturalHeight - }; - }; - - var count = 0; - var getFigureImg = function (elem) { - return child(SugarElement.fromDom(elem), 'img'); - }; - var isFigure = function (editor, elem) { - return editor.dom.is(elem, 'figure'); - }; - var isImage = function (editor, imgNode) { - return editor.dom.is(imgNode, 'img:not([data-mce-object],[data-mce-placeholder])'); - }; - var getEditableImage = function (editor, node) { - var isEditable = function (imgNode) { - return isImage(editor, imgNode) && (isLocalImage(editor, imgNode) || isCorsImage(editor, imgNode) || isNonNullable(getProxyUrl(editor))); - }; - if (isFigure(editor, node)) { - return getFigureImg(node).bind(function (img) { - return isEditable(img.dom) ? Optional.some(img.dom) : Optional.none(); - }); - } else { - return isEditable(node) ? Optional.some(node) : Optional.none(); - } - }; - var displayError = function (editor, error) { - editor.notificationManager.open({ - text: error, - type: 'error' - }); - }; - var getSelectedImage = function (editor) { - var elem = editor.selection.getNode(); - var figureElm = editor.dom.getParent(elem, 'figure.image'); - if (figureElm !== null && isFigure(editor, figureElm)) { - return getFigureImg(figureElm); - } else if (isImage(editor, elem)) { - return Optional.some(SugarElement.fromDom(elem)); - } else { - return Optional.none(); - } - }; - var extractFilename = function (editor, url, group) { - var m = url.match(/(?:\/|^)(([^\/\?]+)\.(?:[a-z0-9.]+))(?:\?|$)/i); - return isNonNullable(m) ? editor.dom.encode(m[group]) : null; - }; - var createId = function () { - return 'imagetools' + count++; - }; - var isLocalImage = function (editor, img) { - var url = img.src; - return url.indexOf('data:') === 0 || url.indexOf('blob:') === 0 || new global$1(url).host === editor.documentBaseURI.host; - }; - var isCorsImage = function (editor, img) { - return global$4.inArray(getCorsHosts(editor), new global$1(img.src).host) !== -1; - }; - var isCorsWithCredentialsImage = function (editor, img) { - return global$4.inArray(getCredentialsHosts(editor), new global$1(img.src).host) !== -1; - }; - var defaultFetchImage = function (editor, img) { - if (isCorsImage(editor, img)) { - return getUrl(img.src, null, isCorsWithCredentialsImage(editor, img)); - } - if (!isLocalImage(editor, img)) { - var proxyUrl = getProxyUrl(editor); - var src = proxyUrl + (proxyUrl.indexOf('?') === -1 ? '?' : '&') + 'url=' + encodeURIComponent(img.src); - var apiKey = getApiKey(editor); - return getUrl(src, apiKey, false); - } - return imageToBlob$1(img); - }; - var imageToBlob = function (editor, img) { - return getFetchImage(editor).fold(function () { - return defaultFetchImage(editor, img); - }, function (customFetchImage) { - return customFetchImage(img); - }); - }; - var findBlob = function (editor, img) { - var blobInfo = editor.editorUpload.blobCache.getByUri(img.src); - if (blobInfo) { - return global$2.resolve(blobInfo.blob()); - } - return imageToBlob(editor, img); - }; - var startTimedUpload = function (editor, imageUploadTimerState) { - var imageUploadTimer = global$3.setEditorTimeout(editor, function () { - editor.editorUpload.uploadImagesAuto(); - }, getUploadTimeout(editor)); - imageUploadTimerState.set(imageUploadTimer); - }; - var cancelTimedUpload = function (imageUploadTimerState) { - global$3.clearTimeout(imageUploadTimerState.get()); - }; - var updateSelectedImage = function (editor, origBlob, ir, uploadImmediately, imageUploadTimerState, selectedImage, size) { - return ir.toBlob().then(function (blob) { - var uri, name, filename, blobInfo; - var blobCache = editor.editorUpload.blobCache; - uri = selectedImage.src; - var useFilename = origBlob.type === blob.type; - if (shouldReuseFilename(editor)) { - blobInfo = blobCache.getByUri(uri); - if (isNonNullable(blobInfo)) { - uri = blobInfo.uri(); - name = blobInfo.name(); - filename = blobInfo.filename(); - } else { - name = extractFilename(editor, uri, 2); - filename = extractFilename(editor, uri, 1); - } - } - blobInfo = blobCache.create({ - id: createId(), - blob: blob, - base64: ir.toBase64(), - uri: uri, - name: name, - filename: useFilename ? filename : undefined - }); - blobCache.add(blobInfo); - editor.undoManager.transact(function () { - var imageLoadedHandler = function () { - editor.$(selectedImage).off('load', imageLoadedHandler); - editor.nodeChanged(); - if (uploadImmediately) { - editor.editorUpload.uploadImagesAuto(); - } else { - cancelTimedUpload(imageUploadTimerState); - startTimedUpload(editor, imageUploadTimerState); - } - }; - editor.$(selectedImage).on('load', imageLoadedHandler); - if (size) { - editor.$(selectedImage).attr({ - width: size.w, - height: size.h - }); - } - editor.$(selectedImage).attr({ src: blobInfo.blobUri() }).removeAttr('data-mce-src'); - }); - return blobInfo; - }); - }; - var selectedImageOperation = function (editor, imageUploadTimerState, fn, size) { - return function () { - var imgOpt = getSelectedImage(editor); - return imgOpt.fold(function () { - displayError(editor, 'Could not find selected image'); - }, function (img) { - return editor._scanForImages().then(function () { - return findBlob(editor, img.dom); - }).then(function (blob) { - return blobToImageResult(blob).then(fn).then(function (imageResult) { - return updateSelectedImage(editor, blob, imageResult, false, imageUploadTimerState, img.dom, size); - }); - }).catch(function (error) { - displayError(editor, error); - }); - }); - }; - }; - var rotate = function (editor, imageUploadTimerState, angle) { - return function () { - var imgOpt = getSelectedImage(editor); - var flippedSize = imgOpt.map(function (img) { - var size = getImageSize(img.dom); - return size ? { - w: size.h, - h: size.w - } : null; - }).getOrNull(); - return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { - return rotate$1(imageResult, angle); - }, flippedSize)(); - }; - }; - var flip = function (editor, imageUploadTimerState, axis) { - return function () { - return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { - return flip$1(imageResult, axis); - })(); - }; - }; - var handleDialogBlob = function (editor, imageUploadTimerState, img, originalSize, blob) { - return blobToImage(blob).then(function (newImage) { - var newSize = getNaturalImageSize(newImage); - if (originalSize.w !== newSize.w || originalSize.h !== newSize.h) { - if (getImageSize(img)) { - setImageSize(img, newSize); - } - } - URL.revokeObjectURL(newImage.src); - return blob; - }).then(blobToImageResult).then(function (imageResult) { - return updateSelectedImage(editor, blob, imageResult, true, imageUploadTimerState, img); - }); - }; - - var saveState = 'save-state'; - var disable = 'disable'; - var enable = 'enable'; - - var createState = function (blob) { - return { - blob: blob, - url: URL.createObjectURL(blob) - }; - }; - var makeOpen = function (editor, imageUploadTimerState) { - return function () { - var getLoadedSpec = function (currentState) { - return { - title: 'Edit Image', - size: 'large', - body: { - type: 'panel', - items: [{ - type: 'imagetools', - name: 'imagetools', - label: 'Edit Image', - currentState: currentState - }] - }, - buttons: [ - { - type: 'cancel', - name: 'cancel', - text: 'Cancel' - }, - { - type: 'submit', - name: 'save', - text: 'Save', - primary: true, - disabled: true - } - ], - onSubmit: function (api) { - var blob = api.getData().imagetools.blob; - originalImgOpt.each(function (originalImg) { - originalSizeOpt.each(function (originalSize) { - handleDialogBlob(editor, imageUploadTimerState, originalImg.dom, originalSize, blob); - }); - }); - api.close(); - }, - onCancel: noop, - onAction: function (api, details) { - switch (details.name) { - case saveState: - if (details.value) { - api.enable('save'); - } else { - api.disable('save'); - } - break; - case disable: - api.disable('save'); - api.disable('cancel'); - break; - case enable: - api.enable('cancel'); - break; - } - } - }; - }; - var originalImgOpt = getSelectedImage(editor); - var originalSizeOpt = originalImgOpt.map(function (origImg) { - return getNaturalImageSize(origImg.dom); - }); - originalImgOpt.each(function (img) { - getEditableImage(editor, img.dom).each(function (_) { - findBlob(editor, img.dom).then(function (blob) { - var state = createState(blob); - editor.windowManager.open(getLoadedSpec(state)); - }); - }); - }); - }; - }; - - var register$2 = function (editor, imageUploadTimerState) { - global$4.each({ - mceImageRotateLeft: rotate(editor, imageUploadTimerState, -90), - mceImageRotateRight: rotate(editor, imageUploadTimerState, 90), - mceImageFlipVertical: flip(editor, imageUploadTimerState, 'v'), - mceImageFlipHorizontal: flip(editor, imageUploadTimerState, 'h'), - mceEditImage: makeOpen(editor, imageUploadTimerState) - }, function (fn, cmd) { - editor.addCommand(cmd, fn); - }); - }; - - var setup = function (editor, imageUploadTimerState, lastSelectedImageState) { - editor.on('NodeChange', function (e) { - var lastSelectedImage = lastSelectedImageState.get(); - var selectedImage = getEditableImage(editor, e.element); - if (lastSelectedImage && !selectedImage.exists(function (img) { - return lastSelectedImage.src === img.src; - })) { - cancelTimedUpload(imageUploadTimerState); - editor.editorUpload.uploadImagesAuto(); - lastSelectedImageState.set(null); - } - selectedImage.each(lastSelectedImageState.set); - }); - }; - - var register$1 = function (editor) { - var changeHandlers = []; - var cmd = function (command) { - return function () { - return editor.execCommand(command); - }; - }; - var isEditableImage = function () { - return getSelectedImage(editor).exists(function (element) { - return getEditableImage(editor, element.dom).isSome(); - }); - }; - var onSetup = function (api) { - var handler = function (isEditableImage) { - return api.setDisabled(!isEditableImage); - }; - handler(isEditableImage()); - changeHandlers = changeHandlers.concat([handler]); - return function () { - changeHandlers = filter(changeHandlers, function (h) { - return h !== handler; - }); - }; - }; - editor.on('NodeChange', function () { - var isEditable = isEditableImage(); - each$1(changeHandlers, function (handler) { - return handler(isEditable); - }); - }); - editor.ui.registry.addButton('rotateleft', { - tooltip: 'Rotate counterclockwise', - icon: 'rotate-left', - onAction: cmd('mceImageRotateLeft'), - onSetup: onSetup - }); - editor.ui.registry.addButton('rotateright', { - tooltip: 'Rotate clockwise', - icon: 'rotate-right', - onAction: cmd('mceImageRotateRight'), - onSetup: onSetup - }); - editor.ui.registry.addButton('flipv', { - tooltip: 'Flip vertically', - icon: 'flip-vertically', - onAction: cmd('mceImageFlipVertical'), - onSetup: onSetup - }); - editor.ui.registry.addButton('fliph', { - tooltip: 'Flip horizontally', - icon: 'flip-horizontally', - onAction: cmd('mceImageFlipHorizontal'), - onSetup: onSetup - }); - editor.ui.registry.addButton('editimage', { - tooltip: 'Edit image', - icon: 'edit-image', - onAction: cmd('mceEditImage'), - onSetup: onSetup - }); - editor.ui.registry.addButton('imageoptions', { - tooltip: 'Image options', - icon: 'image', - onAction: cmd('mceImage') - }); - editor.ui.registry.addContextMenu('imagetools', { - update: function (element) { - return getEditableImage(editor, element).map(function (_) { - return { - text: 'Edit image', - icon: 'edit-image', - onAction: cmd('mceEditImage') - }; - }).toArray(); - } - }); - }; - - var register = function (editor) { - editor.ui.registry.addContextToolbar('imagetools', { - items: getToolbarItems(editor), - predicate: function (elem) { - return getEditableImage(editor, elem).isSome(); - }, - position: 'node', - scope: 'node' - }); - }; - - function Plugin () { - global$5.add('imagetools', function (editor) { - var imageUploadTimerState = Cell(0); - var lastSelectedImageState = Cell(null); - register$2(editor, imageUploadTimerState); - register$1(editor); - register(editor); - setup(editor, imageUploadTimerState, lastSelectedImageState); - }); - } - - Plugin(); - -}()); diff --git a/public/js/tinymce/plugins/imagetools/plugin.min.js b/public/js/tinymce/plugins/imagetools/plugin.min.js index 3c0d2fbc5..366ccb103 100644 --- a/public/js/tinymce/plugins/imagetools/plugin.min.js +++ b/public/js/tinymce/plugins/imagetools/plugin.min.js @@ -4,6 +4,6 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * - * Version: 5.10.3 (2022-02-09) + * Version: 5.10.5 (2022-05-25) */ !function(){"use strict";function c(e){var t=e;return{get:function(){return t},set:function(e){t=e}}}function h(e){return null!=e}function r(){}function i(e){return function(){return e}}function e(e){return e}function t(){return d}function s(e){return n=typeof(t=e),"array"==(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n);var t,n}var n,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=tinymce.util.Tools.resolve("tinymce.util.Tools"),a=function(e){return typeof e===n},u=i(!(n="function")),l=i(!0),d={fold:function(e,t){return e()},isSome:u,isNone:l,getOr:e,getOrThunk:m,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:m,map:t,each:r,bind:t,exists:u,forall:l,filter:function(){return d},toArray:function(){return[]},toString:i("none()")};function m(e){return e()}var g=function(n){function e(){return o}function t(e){return e(n)}var r=i(n),o={fold:function(e,t){return t(n)},isSome:l,isNone:u,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return g(e(n))},each:function(e){e(n)},bind:t,exists:t,forall:t,filter:function(e){return e(n)?o:d},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},p={some:g,none:t,from:function(e){return null==e?d:g(e)}},v={},y={exports:v};function w(e,t){return U(document.createElement("canvas"),e,t)}function b(e){var t=w(e.width,e.height);return R(t).drawImage(e,0,0),t}function _(u){return new I(function(e,t){function n(){o.removeEventListener("load",i),o.removeEventListener("error",a)}var r=URL.createObjectURL(u),o=new Image,i=function(){n(),e(o)},a=function(){n(),t("Unable to load data of type "+u.type+": "+r)};o.addEventListener("load",i),o.addEventListener("error",a),o.src=r,o.complete&&setTimeout(i,0)})}function E(e,r,o){return r=r||"image/png",a(HTMLCanvasElement.prototype.toBlob)?new I(function(t,n){e.toBlob(function(e){e?t(e):n()},r,o)}):j(e.toDataURL(r,o))}function T(e,t){for(var n=0,r=e.length;n { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } + }; + const typeOf = x => { + const t = typeof x; if (x === null) { return 'null'; - } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + } else if (t === 'object' && Array.isArray(x)) { return 'array'; - } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { return 'string'; } else { return t; } }; - var isType = function (type) { - return function (value) { - return typeOf(value) === type; - }; - }; - var isString = isType('string'); - var isArray = isType('array'); + const isType = type => value => typeOf(value) === type; + const isSimpleType = type => value => typeof value === type; + const isString = isType('string'); + const isObject = isType('object'); + const isArray = isType('array'); + const isFunction = isSimpleType('function'); var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); @@ -39,48 +42,50 @@ var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); - var shouldMergeClasses = function (editor) { - return editor.getParam('importcss_merge_classes'); - }; - var shouldImportExclusive = function (editor) { - return editor.getParam('importcss_exclusive'); - }; - var getSelectorConverter = function (editor) { - return editor.getParam('importcss_selector_converter'); - }; - var getSelectorFilter = function (editor) { - return editor.getParam('importcss_selector_filter'); - }; - var getCssGroups = function (editor) { - return editor.getParam('importcss_groups'); - }; - var shouldAppend = function (editor) { - return editor.getParam('importcss_append'); - }; - var getFileFilter = function (editor) { - return editor.getParam('importcss_file_filter'); - }; - var getSkin = function (editor) { - var skin = editor.getParam('skin'); - return skin !== false ? skin || 'oxide' : false; - }; - var getSkinUrl = function (editor) { - return editor.getParam('skin_url'); + const option = name => editor => editor.options.get(name); + const register = editor => { + const registerOption = editor.options.register; + const filterProcessor = value => isString(value) || isFunction(value) || isObject(value); + registerOption('importcss_merge_classes', { + processor: 'boolean', + default: true + }); + registerOption('importcss_exclusive', { + processor: 'boolean', + default: true + }); + registerOption('importcss_selector_converter', { processor: 'function' }); + registerOption('importcss_selector_filter', { processor: filterProcessor }); + registerOption('importcss_file_filter', { processor: filterProcessor }); + registerOption('importcss_groups', { processor: 'object[]' }); + registerOption('importcss_append', { + processor: 'boolean', + default: false + }); }; + const shouldMergeClasses = option('importcss_merge_classes'); + const shouldImportExclusive = option('importcss_exclusive'); + const getSelectorConverter = option('importcss_selector_converter'); + const getSelectorFilter = option('importcss_selector_filter'); + const getCssGroups = option('importcss_groups'); + const shouldAppend = option('importcss_append'); + const getFileFilter = option('importcss_file_filter'); + const getSkin = option('skin'); + const getSkinUrl = option('skin_url'); - var nativePush = Array.prototype.push; - var map = function (xs, f) { - var len = xs.length; - var r = new Array(len); - for (var i = 0; i < len; i++) { - var x = xs[i]; + const nativePush = Array.prototype.push; + const map = (xs, f) => { + const len = xs.length; + const r = new Array(len); + for (let i = 0; i < len; i++) { + const x = xs[i]; r[i] = f(x, i); } return r; }; - var flatten = function (xs) { - var r = []; - for (var i = 0, len = xs.length; i < len; ++i) { + const flatten = xs => { + const r = []; + for (let i = 0, len = xs.length; i < len; ++i) { if (!isArray(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } @@ -88,15 +93,13 @@ } return r; }; - var bind = function (xs, f) { - return flatten(map(xs, f)); - }; + const bind = (xs, f) => flatten(map(xs, f)); - var generate = function () { - var ungroupedOrder = []; - var groupOrder = []; - var groups = {}; - var addItemToGroup = function (groupTitle, itemInfo) { + const generate = () => { + const ungroupedOrder = []; + const groupOrder = []; + const groups = {}; + const addItemToGroup = (groupTitle, itemInfo) => { if (groups[groupTitle]) { groups[groupTitle].push(itemInfo); } else { @@ -104,113 +107,110 @@ groups[groupTitle] = [itemInfo]; } }; - var addItem = function (itemInfo) { + const addItem = itemInfo => { ungroupedOrder.push(itemInfo); }; - var toFormats = function () { - var groupItems = bind(groupOrder, function (g) { - var items = groups[g]; + const toFormats = () => { + const groupItems = bind(groupOrder, g => { + const items = groups[g]; return items.length === 0 ? [] : [{ title: g, - items: items + items }]; }); return groupItems.concat(ungroupedOrder); }; return { - addItemToGroup: addItemToGroup, - addItem: addItem, - toFormats: toFormats + addItemToGroup, + addItem, + toFormats }; }; - var internalEditorStyle = /^\.(?:ephox|tiny-pageembed|mce)(?:[.-]+\w+)+$/; - var removeCacheSuffix = function (url) { - var cacheSuffix = global$1.cacheSuffix; + const internalEditorStyle = /^\.(?:ephox|tiny-pageembed|mce)(?:[.-]+\w+)+$/; + const removeCacheSuffix = url => { + const cacheSuffix = global$1.cacheSuffix; if (isString(url)) { url = url.replace('?' + cacheSuffix, '').replace('&' + cacheSuffix, ''); } return url; }; - var isSkinContentCss = function (editor, href) { - var skin = getSkin(editor); + const isSkinContentCss = (editor, href) => { + const skin = getSkin(editor); if (skin) { - var skinUrlBase = getSkinUrl(editor); - var skinUrl = skinUrlBase ? editor.documentBaseURI.toAbsolute(skinUrlBase) : global$2.baseURL + '/skins/ui/' + skin; - var contentSkinUrlPart = global$2.baseURL + '/skins/content/'; + const skinUrlBase = getSkinUrl(editor); + const skinUrl = skinUrlBase ? editor.documentBaseURI.toAbsolute(skinUrlBase) : global$2.baseURL + '/skins/ui/' + skin; + const contentSkinUrlPart = global$2.baseURL + '/skins/content/'; return href === skinUrl + '/content' + (editor.inline ? '.inline' : '') + '.min.css' || href.indexOf(contentSkinUrlPart) !== -1; } return false; }; - var compileFilter = function (filter) { + const compileFilter = filter => { if (isString(filter)) { - return function (value) { + return value => { return value.indexOf(filter) !== -1; }; } else if (filter instanceof RegExp) { - return function (value) { + return value => { return filter.test(value); }; } return filter; }; - var isCssImportRule = function (rule) { - return rule.styleSheet; - }; - var isCssPageRule = function (rule) { - return rule.selectorText; - }; - var getSelectors = function (editor, doc, fileFilter) { - var selectors = []; - var contentCSSUrls = {}; - var append = function (styleSheet, imported) { - var href = styleSheet.href, rules; + const isCssImportRule = rule => rule.styleSheet; + const isCssPageRule = rule => rule.selectorText; + const getSelectors = (editor, doc, fileFilter) => { + const selectors = []; + const contentCSSUrls = {}; + const append = (styleSheet, imported) => { + let href = styleSheet.href; + let rules; href = removeCacheSuffix(href); - if (!href || !fileFilter(href, imported) || isSkinContentCss(editor, href)) { + if (!href || fileFilter && !fileFilter(href, imported) || isSkinContentCss(editor, href)) { return; } - global.each(styleSheet.imports, function (styleSheet) { + global.each(styleSheet.imports, styleSheet => { append(styleSheet, true); }); try { rules = styleSheet.cssRules || styleSheet.rules; } catch (e) { } - global.each(rules, function (cssRule) { + global.each(rules, cssRule => { if (isCssImportRule(cssRule)) { append(cssRule.styleSheet, true); } else if (isCssPageRule(cssRule)) { - global.each(cssRule.selectorText.split(','), function (selector) { + global.each(cssRule.selectorText.split(','), selector => { selectors.push(global.trim(selector)); }); } }); }; - global.each(editor.contentCSS, function (url) { + global.each(editor.contentCSS, url => { contentCSSUrls[url] = true; }); if (!fileFilter) { - fileFilter = function (href, imported) { + fileFilter = (href, imported) => { return imported || contentCSSUrls[href]; }; } try { - global.each(doc.styleSheets, function (styleSheet) { + global.each(doc.styleSheets, styleSheet => { append(styleSheet); }); } catch (e) { } return selectors; }; - var defaultConvertSelectorToFormat = function (editor, selectorText) { - var format; - var selector = /^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(selectorText); + const defaultConvertSelectorToFormat = (editor, selectorText) => { + let format = {}; + const selector = /^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(selectorText); if (!selector) { return; } - var elementName = selector[1]; - var classes = selector[2].substr(1).split('.').join(' '); - var inlineSelectorElements = global.makeMap('a,img'); + const elementName = selector[1]; + const classes = selector[2].substr(1).split('.').join(' '); + const inlineSelectorElements = global.makeMap('a,img'); if (selector[1]) { format = { title: selectorText }; if (editor.schema.getTextBlockElements()[elementName]) { @@ -224,23 +224,23 @@ format = { inline: 'span', title: selectorText.substr(1), - classes: classes + classes }; } - if (shouldMergeClasses(editor) !== false) { + if (shouldMergeClasses(editor)) { format.classes = classes; } else { format.attributes = { class: classes }; } return format; }; - var getGroupsBySelector = function (groups, selector) { - return global.grep(groups, function (group) { + const getGroupsBySelector = (groups, selector) => { + return global.grep(groups, group => { return !group.filter || group.filter(selector); }); }; - var compileUserDefinedGroups = function (groups) { - return global.map(groups, function (group) { + const compileUserDefinedGroups = groups => { + return global.map(groups, group => { return global.extend({}, group, { original: group, selectors: {}, @@ -248,44 +248,45 @@ }); }); }; - var isExclusiveMode = function (editor, group) { - return group === null || shouldImportExclusive(editor) !== false; + const isExclusiveMode = (editor, group) => { + return group === null || shouldImportExclusive(editor); }; - var isUniqueSelector = function (editor, selector, group, globallyUniqueSelectors) { + const isUniqueSelector = (editor, selector, group, globallyUniqueSelectors) => { return !(isExclusiveMode(editor, group) ? selector in globallyUniqueSelectors : selector in group.selectors); }; - var markUniqueSelector = function (editor, selector, group, globallyUniqueSelectors) { + const markUniqueSelector = (editor, selector, group, globallyUniqueSelectors) => { if (isExclusiveMode(editor, group)) { globallyUniqueSelectors[selector] = true; } else { group.selectors[selector] = true; } }; - var convertSelectorToFormat = function (editor, plugin, selector, group) { - var selectorConverter; + const convertSelectorToFormat = (editor, plugin, selector, group) => { + let selectorConverter; + const converter = getSelectorConverter(editor); if (group && group.selector_converter) { selectorConverter = group.selector_converter; - } else if (getSelectorConverter(editor)) { - selectorConverter = getSelectorConverter(editor); + } else if (converter) { + selectorConverter = converter; } else { - selectorConverter = function () { + selectorConverter = () => { return defaultConvertSelectorToFormat(editor, selector); }; } return selectorConverter.call(plugin, selector, group); }; - var setup = function (editor) { - editor.on('init', function () { - var model = generate(); - var globallyUniqueSelectors = {}; - var selectorFilter = compileFilter(getSelectorFilter(editor)); - var groups = compileUserDefinedGroups(getCssGroups(editor)); - var processSelector = function (selector, group) { + const setup = editor => { + editor.on('init', () => { + const model = generate(); + const globallyUniqueSelectors = {}; + const selectorFilter = compileFilter(getSelectorFilter(editor)); + const groups = compileUserDefinedGroups(getCssGroups(editor)); + const processSelector = (selector, group) => { if (isUniqueSelector(editor, selector, group, globallyUniqueSelectors)) { markUniqueSelector(editor, selector, group, globallyUniqueSelectors); - var format = convertSelectorToFormat(editor, editor.plugins.importcss, selector, group); + const format = convertSelectorToFormat(editor, editor.plugins.importcss, selector, group); if (format) { - var formatName = format.name || global$3.DOM.uniqueId(); + const formatName = format.name || global$3.DOM.uniqueId(); editor.formatter.register(formatName, format); return { title: format.title, @@ -295,19 +296,19 @@ } return null; }; - global.each(getSelectors(editor, editor.getDoc(), compileFilter(getFileFilter(editor))), function (selector) { + global.each(getSelectors(editor, editor.getDoc(), compileFilter(getFileFilter(editor))), selector => { if (!internalEditorStyle.test(selector)) { if (!selectorFilter || selectorFilter(selector)) { - var selectorGroups = getGroupsBySelector(groups, selector); + const selectorGroups = getGroupsBySelector(groups, selector); if (selectorGroups.length > 0) { - global.each(selectorGroups, function (group) { - var menuItem = processSelector(selector, group); + global.each(selectorGroups, group => { + const menuItem = processSelector(selector, group); if (menuItem) { model.addItemToGroup(group.title, menuItem); } }); } else { - var menuItem = processSelector(selector, null); + const menuItem = processSelector(selector, null); if (menuItem) { model.addItem(menuItem); } @@ -315,28 +316,29 @@ } } }); - var items = model.toFormats(); - editor.fire('addStyleModifications', { - items: items, + const items = model.toFormats(); + editor.dispatch('addStyleModifications', { + items, replace: !shouldAppend(editor) }); }); }; - var get = function (editor) { - var convertSelectorToFormat = function (selectorText) { + const get = editor => { + const convertSelectorToFormat = selectorText => { return defaultConvertSelectorToFormat(editor, selectorText); }; - return { convertSelectorToFormat: convertSelectorToFormat }; + return { convertSelectorToFormat }; }; - function Plugin () { - global$4.add('importcss', function (editor) { + var Plugin = () => { + global$4.add('importcss', editor => { + register(editor); setup(editor); return get(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/importcss/plugin.min.js b/public/js/tinymce/plugins/importcss/plugin.min.js index 3f7f54792..bfb8a1d90 100644 --- a/public/js/tinymce/plugins/importcss/plugin.min.js +++ b/public/js/tinymce/plugins/importcss/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function t(n){return function(t){return r=typeof(e=t),(null===e?"null":"object"==r&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":r)===n;var e,r}}function y(t){return t.getParam("importcss_selector_converter")}function u(e){return l(e)?function(t){return-1!==t.indexOf(e)}:e instanceof RegExp?function(t){return e.test(t)}:e}function h(t,e){var r,n=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(e);if(n){var o=n[1],i=n[2].substr(1).split(".").join(" "),c=x.makeMap("a,img");return n[1]?(r={title:e},t.schema.getTextBlockElements()[o]?r.block=o:t.schema.getBlockElements()[o]||c[o.toLowerCase()]?r.selector=o:r.inline=o):n[2]&&(r={inline:"span",title:e.substr(1),classes:i}),!1!==t.getParam("importcss_merge_classes")?r.classes=i:r.attributes={class:i},r}}function d(t,e){return null===e||!1!==t.getParam("importcss_exclusive")}function r(v){v.on("init",function(){function o(t,e){if(f=t,p=g,!(d(v,m=e)?f in p:f in m.selectors)){a=t,l=g,d(v,u=e)?l[a]=!0:u.selectors[a]=!0;var r=(i=(o=v).plugins.importcss,c=t,((s=e)&&s.selector_converter?s.selector_converter:y(o)?y(o):function(){return h(o,c)}).call(i,c,s));if(r){var n=r.name||_.DOM.uniqueId();return v.formatter.register(n,r),{title:r.title,format:n}}}var o,i,c,s,a,u,l,f,m,p;return null}var e,r,n,t,i=(e=[],r=[],n={},{addItemToGroup:function(t,e){n[t]?n[t].push(e):(r.push(t),n[t]=[e])},addItem:function(t){e.push(t)},toFormats:function(){return function(t){for(var e=[],r=0,n=t.length;rt=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(s=r=e,(o=String).prototype.isPrototypeOf(s)||(null===(n=r.constructor)||void 0===n?void 0:n.name)===o.name)?"string":t;var s,r,o,n})(t)===e,s=t("string"),r=t("object"),o=t("array"),n=("function",e=>"function"==typeof e);var c=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),i=tinymce.util.Tools.resolve("tinymce.EditorManager"),l=tinymce.util.Tools.resolve("tinymce.Env"),a=tinymce.util.Tools.resolve("tinymce.util.Tools");const p=e=>t=>t.options.get(e),u=p("importcss_merge_classes"),m=p("importcss_exclusive"),f=p("importcss_selector_converter"),y=p("importcss_selector_filter"),d=p("importcss_groups"),h=p("importcss_append"),_=p("importcss_file_filter"),g=p("skin"),v=p("skin_url"),b=Array.prototype.push,x=/^\.(?:ephox|tiny-pageembed|mce)(?:[.-]+\w+)+$/,T=e=>s(e)?t=>-1!==t.indexOf(e):e instanceof RegExp?t=>e.test(t):e,S=(e,t)=>{let s={};const r=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(t);if(!r)return;const o=r[1],n=r[2].substr(1).split(".").join(" "),c=a.makeMap("a,img");return r[1]?(s={title:t},e.schema.getTextBlockElements()[o]?s.block=o:e.schema.getBlockElements()[o]||c[o.toLowerCase()]?s.selector=o:s.inline=o):r[2]&&(s={inline:"span",title:t.substr(1),classes:n}),u(e)?s.classes=n:s.attributes={class:n},s},k=(e,t)=>null===t||m(e),w=e=>{e.on("init",(()=>{const t=(()=>{const e=[],t=[],s={};return{addItemToGroup:(e,r)=>{s[e]?s[e].push(r):(t.push(e),s[e]=[r])},addItem:t=>{e.push(t)},toFormats:()=>{return(r=t,n=e=>{const t=s[e];return 0===t.length?[]:[{title:e,items:t}]},(e=>{const t=[];for(let s=0,r=e.length;s{const s=e.length,r=new Array(s);for(let o=0;oa.map(e,(e=>a.extend({},e,{original:e,selectors:{},filter:T(e.filter)}))))(d(e)),u=(t,s)=>{if(((e,t,s,r)=>!(k(e,s)?t in r:t in s.selectors))(e,t,s,r)){((e,t,s,r)=>{k(e,s)?r[t]=!0:s.selectors[t]=!0})(e,t,s,r);const o=((e,t,s,r)=>{let o;const n=f(e);return o=r&&r.selector_converter?r.selector_converter:n||(()=>S(e,s)),o.call(t,s,r)})(e,e.plugins.importcss,t,s);if(o){const t=o.name||c.DOM.uniqueId();return e.formatter.register(t,o),{title:o.title,format:t}}}return null};a.each(((e,t,r)=>{const o=[],n={},c=(t,n)=>{let p,u=t.href;if(u=(e=>{const t=l.cacheSuffix;return s(e)&&(e=e.replace("?"+t,"").replace("&"+t,"")),e})(u),u&&(!r||r(u,n))&&!((e,t)=>{const s=g(e);if(s){const r=v(e),o=r?e.documentBaseURI.toAbsolute(r):i.baseURL+"/skins/ui/"+s,n=i.baseURL+"/skins/content/";return t===o+"/content"+(e.inline?".inline":"")+".min.css"||-1!==t.indexOf(n)}return!1})(e,u)){a.each(t.imports,(e=>{c(e,!0)}));try{p=t.cssRules||t.rules}catch(e){}a.each(p,(e=>{e.styleSheet?c(e.styleSheet,!0):e.selectorText&&a.each(e.selectorText.split(","),(e=>{o.push(a.trim(e))}))}))}};a.each(e.contentCSS,(e=>{n[e]=!0})),r||(r=(e,t)=>t||n[e]);try{a.each(t.styleSheets,(e=>{c(e)}))}catch(e){}return o})(e,e.getDoc(),T(_(e))),(e=>{if(!x.test(e)&&(!n||n(e))){const s=((e,t)=>a.grep(e,(e=>!e.filter||e.filter(t))))(p,e);if(s.length>0)a.each(s,(s=>{const r=u(e,s);r&&t.addItemToGroup(s.title,r)}));else{const s=u(e,null);s&&t.addItem(s)}}}));const m=t.toFormats();e.dispatch("addStyleModifications",{items:m,replace:!h(e)})}))};e.add("importcss",(e=>((e=>{const t=e.options.register,o=e=>s(e)||n(e)||r(e);t("importcss_merge_classes",{processor:"boolean",default:!0}),t("importcss_exclusive",{processor:"boolean",default:!0}),t("importcss_selector_converter",{processor:"function"}),t("importcss_selector_filter",{processor:o}),t("importcss_file_filter",{processor:o}),t("importcss_groups",{processor:"object[]"}),t("importcss_append",{processor:"boolean",default:!1})})(e),w(e),(e=>({convertSelectorToFormat:t=>S(e,t)}))(e))))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/insertdatetime/plugin.js b/public/js/tinymce/plugins/insertdatetime/plugin.js index 1bcfeeb36..2690b8e70 100644 --- a/public/js/tinymce/plugins/insertdatetime/plugin.js +++ b/public/js/tinymce/plugins/insertdatetime/plugin.js @@ -1,55 +1,60 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var getDateFormat = function (editor) { - return editor.getParam('insertdatetime_dateformat', editor.translate('%Y-%m-%d')); - }; - var getTimeFormat = function (editor) { - return editor.getParam('insertdatetime_timeformat', editor.translate('%H:%M:%S')); - }; - var getFormats = function (editor) { - return editor.getParam('insertdatetime_formats', [ - '%H:%M:%S', - '%Y-%m-%d', - '%I:%M:%S %p', - '%D' - ]); + const option = name => editor => editor.options.get(name); + const register$2 = editor => { + const registerOption = editor.options.register; + registerOption('insertdatetime_dateformat', { + processor: 'string', + default: editor.translate('%Y-%m-%d') + }); + registerOption('insertdatetime_timeformat', { + processor: 'string', + default: editor.translate('%H:%M:%S') + }); + registerOption('insertdatetime_formats', { + processor: 'string[]', + default: [ + '%H:%M:%S', + '%Y-%m-%d', + '%I:%M:%S %p', + '%D' + ] + }); + registerOption('insertdatetime_element', { + processor: 'boolean', + default: false + }); }; - var getDefaultDateTime = function (editor) { - var formats = getFormats(editor); + const getDateFormat = option('insertdatetime_dateformat'); + const getTimeFormat = option('insertdatetime_timeformat'); + const getFormats = option('insertdatetime_formats'); + const shouldInsertTimeElement = option('insertdatetime_element'); + const getDefaultDateTime = editor => { + const formats = getFormats(editor); return formats.length > 0 ? formats[0] : getTimeFormat(editor); }; - var shouldInsertTimeElement = function (editor) { - return editor.getParam('insertdatetime_element', false); - }; - var daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' '); - var daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '); - var monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '); - var monthsLong = 'January February March April May June July August September October November December'.split(' '); - var addZeros = function (value, len) { + const daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' '); + const daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '); + const monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '); + const monthsLong = 'January February March April May June July August September October November December'.split(' '); + const addZeros = (value, len) => { value = '' + value; if (value.length < len) { - for (var i = 0; i < len - value.length; i++) { + for (let i = 0; i < len - value.length; i++) { value = '0' + value; } } return value; }; - var getDateTime = function (editor, fmt, date) { - if (date === void 0) { - date = new Date(); - } + const getDateTime = (editor, fmt, date = new Date()) => { fmt = fmt.replace('%D', '%m/%d/%Y'); fmt = fmt.replace('%r', '%I:%M:%S %p'); fmt = fmt.replace('%Y', '' + date.getFullYear()); @@ -68,23 +73,22 @@ fmt = fmt.replace('%%', '%'); return fmt; }; - var updateElement = function (editor, timeElm, computerTime, userTime) { - var newTimeElm = editor.dom.create('time', { datetime: computerTime }, userTime); - timeElm.parentNode.insertBefore(newTimeElm, timeElm); - editor.dom.remove(timeElm); + const updateElement = (editor, timeElm, computerTime, userTime) => { + const newTimeElm = editor.dom.create('time', { datetime: computerTime }, userTime); + editor.dom.replace(newTimeElm, timeElm); editor.selection.select(newTimeElm, true); editor.selection.collapse(false); }; - var insertDateTime = function (editor, format) { + const insertDateTime = (editor, format) => { if (shouldInsertTimeElement(editor)) { - var userTime = getDateTime(editor, format); - var computerTime = void 0; + const userTime = getDateTime(editor, format); + let computerTime; if (/%[HMSIp]/.test(format)) { computerTime = getDateTime(editor, '%Y-%m-%dT%H:%M'); } else { computerTime = getDateTime(editor, '%Y-%m-%d'); } - var timeElm = editor.dom.getParent(editor.selection.getStart(), 'time'); + const timeElm = editor.dom.getParent(editor.selection.getStart(), 'time'); if (timeElm) { updateElement(editor, timeElm, computerTime, userTime); } else { @@ -95,88 +99,89 @@ } }; - var register$1 = function (editor) { - editor.addCommand('mceInsertDate', function (_ui, value) { + const register$1 = editor => { + editor.addCommand('mceInsertDate', (_ui, value) => { insertDateTime(editor, value !== null && value !== void 0 ? value : getDateFormat(editor)); }); - editor.addCommand('mceInsertTime', function (_ui, value) { + editor.addCommand('mceInsertTime', (_ui, value) => { insertDateTime(editor, value !== null && value !== void 0 ? value : getTimeFormat(editor)); }); }; - var Cell = function (initial) { - var value = initial; - var get = function () { + const Cell = initial => { + let value = initial; + const get = () => { return value; }; - var set = function (v) { + const set = v => { value = v; }; return { - get: get, - set: set + get, + set }; }; var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); - var register = function (editor) { - var formats = getFormats(editor); - var defaultFormat = Cell(getDefaultDateTime(editor)); - var insertDateTime = function (format) { - return editor.execCommand('mceInsertDate', false, format); + const onSetupEditable = editor => api => { + const nodeChanged = () => { + api.setEnabled(editor.selection.isEditable()); + }; + editor.on('NodeChange', nodeChanged); + nodeChanged(); + return () => { + editor.off('NodeChange', nodeChanged); }; + }; + const register = editor => { + const formats = getFormats(editor); + const defaultFormat = Cell(getDefaultDateTime(editor)); + const insertDateTime = format => editor.execCommand('mceInsertDate', false, format); editor.ui.registry.addSplitButton('insertdatetime', { icon: 'insert-time', tooltip: 'Insert date/time', - select: function (value) { - return value === defaultFormat.get(); - }, - fetch: function (done) { - done(global.map(formats, function (format) { - return { - type: 'choiceitem', - text: getDateTime(editor, format), - value: format - }; - })); + select: value => value === defaultFormat.get(), + fetch: done => { + done(global.map(formats, format => ({ + type: 'choiceitem', + text: getDateTime(editor, format), + value: format + }))); }, - onAction: function (_api) { + onAction: _api => { insertDateTime(defaultFormat.get()); }, - onItemAction: function (_api, value) { + onItemAction: (_api, value) => { defaultFormat.set(value); insertDateTime(value); - } + }, + onSetup: onSetupEditable(editor) }); - var makeMenuItemHandler = function (format) { - return function () { - defaultFormat.set(format); - insertDateTime(format); - }; + const makeMenuItemHandler = format => () => { + defaultFormat.set(format); + insertDateTime(format); }; editor.ui.registry.addNestedMenuItem('insertdatetime', { icon: 'insert-time', text: 'Date/time', - getSubmenuItems: function () { - return global.map(formats, function (format) { - return { - type: 'menuitem', - text: getDateTime(editor, format), - onAction: makeMenuItemHandler(format) - }; - }); - } + getSubmenuItems: () => global.map(formats, format => ({ + type: 'menuitem', + text: getDateTime(editor, format), + onAction: makeMenuItemHandler(format) + })), + onSetup: onSetupEditable(editor) }); }; - function Plugin () { - global$1.add('insertdatetime', function (editor) { + var Plugin = () => { + global$1.add('insertdatetime', editor => { + register$2(editor); register$1(editor); register(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/insertdatetime/plugin.min.js b/public/js/tinymce/plugins/insertdatetime/plugin.min.js index f790e7fab..73348f8e1 100644 --- a/public/js/tinymce/plugins/insertdatetime/plugin.min.js +++ b/public/js/tinymce/plugins/insertdatetime/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function l(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))}function s(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])}function r(e,t){if((e=""+e).length'+n+"")):e.insertContent(d(e,t))}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),i="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),o="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),u="January February March April May June July August September October November December".split(" "),g=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("insertdatetime",function(e){var n,r,t,a,i,o,u,c;function m(e){return r.execCommand("mceInsertDate",!1,e)}(n=e).addCommand("mceInsertDate",function(e,t){p(n,null!=t?t:n.getParam("insertdatetime_dateformat",n.translate("%Y-%m-%d")))}),n.addCommand("mceInsertTime",function(e,t){p(n,null!=t?t:l(n))}),u=s(r=e),t=0<(o=s(i=r)).length?o[0]:l(i),a=t,c={get:function(){return a},set:function(e){a=e}},r.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:function(e){return e===c.get()},fetch:function(e){e(g.map(u,function(e){return{type:"choiceitem",text:d(r,e),value:e}}))},onAction:function(e){m(c.get())},onItemAction:function(e,t){c.set(t),m(t)}}),r.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:function(){return g.map(u,function(e){return{type:"menuitem",text:d(r,e),onAction:(t=e,function(){c.set(t),m(t)})};var t})}})})}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>t=>t.options.get(e),a=t("insertdatetime_dateformat"),n=t("insertdatetime_timeformat"),r=t("insertdatetime_formats"),s=t("insertdatetime_element"),i="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),o="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),l="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),m="January February March April May June July August September October November December".split(" "),c=(e,t)=>{if((e=""+e).length(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=t.replace("%D","%m/%d/%Y")).replace("%r","%I:%M:%S %p")).replace("%Y",""+a.getFullYear())).replace("%y",""+a.getYear())).replace("%m",c(a.getMonth()+1,2))).replace("%d",c(a.getDate(),2))).replace("%H",""+c(a.getHours(),2))).replace("%M",""+c(a.getMinutes(),2))).replace("%S",""+c(a.getSeconds(),2))).replace("%I",""+((a.getHours()+11)%12+1))).replace("%p",a.getHours()<12?"AM":"PM")).replace("%B",""+e.translate(m[a.getMonth()]))).replace("%b",""+e.translate(l[a.getMonth()]))).replace("%A",""+e.translate(o[a.getDay()]))).replace("%a",""+e.translate(i[a.getDay()]))).replace("%%","%"),u=(e,t)=>{if(s(e)){const a=d(e,t);let n;n=/%[HMSIp]/.test(t)?d(e,"%Y-%m-%dT%H:%M"):d(e,"%Y-%m-%d");const r=e.dom.getParent(e.selection.getStart(),"time");r?((e,t,a,n)=>{const r=e.dom.create("time",{datetime:a},n);e.dom.replace(r,t),e.selection.select(r,!0),e.selection.collapse(!1)})(e,r,n,a):e.insertContent('")}else e.insertContent(d(e,t))};var p=tinymce.util.Tools.resolve("tinymce.util.Tools");const g=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("insertdatetime",(e=>{(e=>{const t=e.options.register;t("insertdatetime_dateformat",{processor:"string",default:e.translate("%Y-%m-%d")}),t("insertdatetime_timeformat",{processor:"string",default:e.translate("%H:%M:%S")}),t("insertdatetime_formats",{processor:"string[]",default:["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"]}),t("insertdatetime_element",{processor:"boolean",default:!1})})(e),(e=>{e.addCommand("mceInsertDate",((t,n)=>{u(e,null!=n?n:a(e))})),e.addCommand("mceInsertTime",((t,a)=>{u(e,null!=a?a:n(e))}))})(e),(e=>{const t=r(e),a=(e=>{let t=e;return{get:()=>t,set:e=>{t=e}}})((e=>{const t=r(e);return t.length>0?t[0]:n(e)})(e)),s=t=>e.execCommand("mceInsertDate",!1,t);e.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:e=>e===a.get(),fetch:a=>{a(p.map(t,(t=>({type:"choiceitem",text:d(e,t),value:t}))))},onAction:e=>{s(a.get())},onItemAction:(e,t)=>{a.set(t),s(t)},onSetup:g(e)});const i=e=>()=>{a.set(e),s(e)};e.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:()=>p.map(t,(t=>({type:"menuitem",text:d(e,t),onAction:i(t)}))),onSetup:g(e)})})(e)}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/kodeisian/plugin.min.js b/public/js/tinymce/plugins/kodeisian/plugin.min.js new file mode 100644 index 000000000..197b3b03e --- /dev/null +++ b/public/js/tinymce/plugins/kodeisian/plugin.min.js @@ -0,0 +1,92 @@ +tinymce.PluginManager.add("kodeisian", function (editor, url) { + editor.ui.registry.addMenuButton("kodeisian", { + text: "Kode Isian", + fetch: function (callback) { + var items = []; + + $.ajax({ + type: "GET", + url: SITE_URL + "surat_master/kode_isian/" + editor.getElement().getAttribute('data-salintemplate') + "/" + $("#id_surat").val(), + dataType: "json", + processData: true, + success: function (response) { + $.each(response, function (key, value) { + var menuItem = { + type: "nestedmenuitem", + text: key, + getSubmenuItems: function () { + return kode_isian(editor, value); + }, + }; + items.push(menuItem); + }); + + callback(items); + }, + + error: function (xhr, status, error) { + notifEditor("Error! " + xhr.status + "\n" + error, "error"); + }, + }); + }, + }); +}); + +function kode_isian(editor, isian) { + var kode_isian = []; + + $.each(isian, function (key, value) { + var combine = { + type: "nestedmenuitem", + text: value.judul, + getSubmenuItems: function () { + let isian = value.isian; + return [ + { + // Normal + type: "menuitem", + text: "Normal", + onAction: function () { + editor.insertContent(isian.normal); + }, + }, + { + // Kecil Semua + type: "menuitem", + text: "Lowercase", + onAction: function () { + editor.insertContent(isian.lower); + }, + }, + { + // Huruf Besar Awal + type: "menuitem", + text: "Ucfirst", + onAction: function () { + editor.insertContent(isian.ucfirst); + }, + }, + { + // Huruf Besar Tiap Kata + type: "menuitem", + text: "Ucwords", + onAction: function () { + editor.insertContent(isian.ucwords); + }, + }, + { + // Besar Semua + type: "menuitem", + text: "Uppercase", + onAction: function () { + editor.insertContent(isian.upper); + }, + }, + ]; + }, + }; + kode_isian.push(combine); + }); + + return kode_isian; +} diff --git a/public/js/tinymce/plugins/laporan_keuangan/plugin.min.js b/public/js/tinymce/plugins/laporan_keuangan/plugin.min.js new file mode 100644 index 000000000..b27e9debd --- /dev/null +++ b/public/js/tinymce/plugins/laporan_keuangan/plugin.min.js @@ -0,0 +1,342 @@ +function lap_kelompok(editor, semester) +{ + var lap = + { + type: 'menuitem', + text: 'Laporan Keuangan (Belanja per Kelompok)-Impor-Semester ' + semester, + icon: 'table', + onAction: function() { + var url = BASE_URL + "index.php/keuangan/cek_tahun"; + + $.ajax({ + type: "GET", + url: url, + dataType: "json", + processData: true, + success: function (data) { + + editor.windowManager.open( { + + title: 'Tahun Anggaran', + body: { + type: 'panel', + items: [ + { + type: 'selectbox', + name: 'tahun', + label: 'Pilih Tahun Anggaran', + items: data + }, + ] + }, + buttons: [ + { + type: 'cancel', + text: 'Tutup' + }, + { + type: 'submit', + text: 'Pilih', + primary: true + } + ], + + onSubmit: function (api) { + var data = api.getData(); + editor.insertContent('[[lap-RP-APBD-sm' + semester + ',' + data.tahun + ']]'); + api.close(); + }, + + width: 400, + height: 140 + } ) + }, + + error: function (xhr, status, error) { + alert("Error! " + xhr.status + "\n" + error); + console.log(xhr); + } + }); + } + }; + return lap; +}; + +function lap_bidang(editor, semester) +{ + var lap = + { + type: 'menuitem', + text: 'Laporan Keuangan (Belanja per Bidang)-Impor-Semester ' + semester, + icon: 'table', + onAction: function() { + var url = BASE_URL + "index.php/keuangan/cek_tahun"; + + $.ajax({ + type: "GET", + url: url, + dataType: "json", + processData: true, + success: function (data) { + + editor.windowManager.open( { + + title: 'Tahun Anggaran', + body: { + type: 'panel', + items: [ + { + type: 'selectbox', + name: 'tahun', + label: 'Pilih Tahun Anggaran', + items: data + }, + ] + }, + buttons: [ + { + type: 'cancel', + text: 'Tutup' + }, + { + type: 'submit', + text: 'Pilih', + primary: true + } + ], + + onSubmit: function (api) { + var data = api.getData(); + editor.insertContent('[[lap-RP-APBD-Bidang-sm' + semester + ',' + data.tahun +']]'); + api.close(); + }, + + width: 400, + height: 140 + } ) + }, + + error: function (xhr, status, error) { + alert("Error! " + xhr.status + "\n" + error); + console.log(xhr); + } + }); + } + }; + return lap; +}; + +tinymce.PluginManager.add('laporan_keuangan', function( editor, url ) { + + editor.ui.registry.addMenuButton('laporan_keuangan', { + text: 'Laporan Keuangan', + fetch: function(callback) { + var items = []; + + var menuItem = { + type: 'nestedmenuitem', + icon: 'link', + text: 'Laporan Keuangan (Impor)', + getSubmenuItems: function() { + return [ + { + type: 'menuitem', + text: 'Grafik Laporan Keuangan - Impor', + icon: 'align-left', + onAction: function() { + var url = BASE_URL + "index.php/keuangan/cek_tahun"; + + $.ajax({ + type: "GET", + url: url, + dataType: "json", + processData: true, + success: function (data) { + + editor.windowManager.open( { + + title: 'Tahun Anggaran', + body: { + type: 'panel', + items: [ + { + type: 'selectbox', + name: 'tahun', + label: 'Pilih Tahun Anggaran', + items: data + }, + ] + }, + buttons: [ + { + type: 'cancel', + text: 'Tutup' + }, + { + type: 'submit', + text: 'Pilih', + primary: true + } + ], + + onSubmit: function (api) { + var data = api.getData(); + editor.insertContent('[[grafik-RP-APBD,' + data.tahun +']]'); + api.close(); + }, + + width: 400, + height: 140 + } ) + }, + + error: function (xhr, status, error) { + alert("Error! " + xhr.status + "\n" + error); + console.log(xhr); + } + }); + } + }, + lap_kelompok(editor, '1'), + lap_kelompok(editor, '2'), + lap_bidang(editor, '1'), + lap_bidang(editor, '2') + ]; + } + }; + items.push(menuItem); + + var menuItem = { + type: 'nestedmenuitem', + icon: 'line', + text: 'Laporan Keuangan (Manual)', + getSubmenuItems: function() { + return [ + + { + type: 'menuitem', + text: 'Grafik Laporan Keuangan - Manual', + icon: 'align-left', + onAction: function() { + var url = BASE_URL + "index.php/keuangan_manual/cek_tahun_manual"; + + $.ajax({ + type: "GET", + url: url, + dataType: "json", + processData: true, + success: function (data) { + + editor.windowManager.open( { + + title: 'Tahun Anggaran', + body: { + type: 'panel', + items: [ + { + type: 'selectbox', + name: 'tahun', + label: 'Pilih Tahun Anggaran', + items: data + }, + ] + }, + buttons: [ + { + type: 'cancel', + text: 'Tutup' + }, + { + type: 'submit', + text: 'Pilih', + primary: true + } + ], + + onSubmit: function (api) { + var data = api.getData(); + editor.insertContent('[[grafik-RP-APBD-manual,' + data.tahun +']]'); + api.close(); + }, + + width: 400, + height: 140 + } ) + }, + + error: function (xhr, status, error) { + alert("Error! " + xhr.status + "\n" + error); + console.log(xhr); + } + }); + } + }, + { + type: 'menuitem', + text: 'Laporan Keuangan (Belanja per Bidang) - Manual', + icon: 'table', + onAction: function() { + var url = BASE_URL + "index.php/keuangan_manual/cek_tahun_manual"; + + $.ajax({ + type: "GET", + url: url, + dataType: "json", + processData: true, + success: function (data) { + + editor.windowManager.open( { + + title: 'Tahun Anggaran', + body: { + type: 'panel', + items: [ + { + type: 'selectbox', + name: 'tahun', + label: 'Pilih Tahun Anggaran', + items: data + }, + ] + }, + buttons: [ + { + type: 'cancel', + text: 'Tutup' + }, + { + type: 'submit', + text: 'Pilih', + primary: true + } + ], + + onSubmit: function (api) { + var data = api.getData(); + editor.insertContent('[[lap-RP-APBD-Bidang-manual,' + data.tahun +']]'); + api.close(); + }, + + width: 400, + height: 140 + } ) + }, + + error: function (xhr, status, error) { + alert("Error! " + xhr.status + "\n" + error); + console.log(xhr); + } + }); + } + }, + + ]; + } + }; + items.push(menuItem); + + callback(items); + }, + }); + +}); diff --git a/public/js/tinymce/plugins/legacyoutput/index.js b/public/js/tinymce/plugins/legacyoutput/index.js deleted file mode 100644 index f51fba702..000000000 --- a/public/js/tinymce/plugins/legacyoutput/index.js +++ /dev/null @@ -1,7 +0,0 @@ -// Exports the "legacyoutput" plugin for usage with module loaders -// Usage: -// CommonJS: -// require('tinymce/plugins/legacyoutput') -// ES2015: -// import 'tinymce/plugins/legacyoutput' -require('./plugin.js'); \ No newline at end of file diff --git a/public/js/tinymce/plugins/legacyoutput/plugin.js b/public/js/tinymce/plugins/legacyoutput/plugin.js deleted file mode 100644 index dd4b7f5c6..000000000 --- a/public/js/tinymce/plugins/legacyoutput/plugin.js +++ /dev/null @@ -1,199 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) - */ -(function () { - 'use strict'; - - var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - - var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); - - var getFontSizeFormats = function (editor) { - return editor.getParam('fontsize_formats'); - }; - var setFontSizeFormats = function (editor, fontsize_formats) { - editor.settings.fontsize_formats = fontsize_formats; - }; - var getFontFormats = function (editor) { - return editor.getParam('font_formats'); - }; - var setFontFormats = function (editor, font_formats) { - editor.settings.font_formats = font_formats; - }; - var getFontSizeStyleValues = function (editor) { - return editor.getParam('font_size_style_values', 'xx-small,x-small,small,medium,large,x-large,xx-large'); - }; - var setInlineStyles = function (editor, inline_styles) { - editor.settings.inline_styles = inline_styles; - }; - - var overrideFormats = function (editor) { - var alignElements = 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table', fontSizes = global.explode(getFontSizeStyleValues(editor)), schema = editor.schema; - editor.formatter.register({ - alignleft: { - selector: alignElements, - attributes: { align: 'left' } - }, - aligncenter: { - selector: alignElements, - attributes: { align: 'center' } - }, - alignright: { - selector: alignElements, - attributes: { align: 'right' } - }, - alignjustify: { - selector: alignElements, - attributes: { align: 'justify' } - }, - bold: [ - { - inline: 'b', - remove: 'all', - preserve_attributes: [ - 'class', - 'style' - ] - }, - { - inline: 'strong', - remove: 'all', - preserve_attributes: [ - 'class', - 'style' - ] - }, - { - inline: 'span', - styles: { fontWeight: 'bold' } - } - ], - italic: [ - { - inline: 'i', - remove: 'all', - preserve_attributes: [ - 'class', - 'style' - ] - }, - { - inline: 'em', - remove: 'all', - preserve_attributes: [ - 'class', - 'style' - ] - }, - { - inline: 'span', - styles: { fontStyle: 'italic' } - } - ], - underline: [ - { - inline: 'u', - remove: 'all', - preserve_attributes: [ - 'class', - 'style' - ] - }, - { - inline: 'span', - styles: { textDecoration: 'underline' }, - exact: true - } - ], - strikethrough: [ - { - inline: 'strike', - remove: 'all', - preserve_attributes: [ - 'class', - 'style' - ] - }, - { - inline: 'span', - styles: { textDecoration: 'line-through' }, - exact: true - } - ], - fontname: { - inline: 'font', - toggle: false, - attributes: { face: '%value' } - }, - fontsize: { - inline: 'font', - toggle: false, - attributes: { - size: function (vars) { - return String(global.inArray(fontSizes, vars.value) + 1); - } - } - }, - forecolor: { - inline: 'font', - attributes: { color: '%value' }, - links: true, - remove_similar: true, - clear_child_styles: true - }, - hilitecolor: { - inline: 'font', - styles: { backgroundColor: '%value' }, - links: true, - remove_similar: true, - clear_child_styles: true - } - }); - global.each('b,i,u,strike'.split(','), function (name) { - schema.addValidElements(name + '[*]'); - }); - if (!schema.getElementRule('font')) { - schema.addValidElements('font[face|size|color|style]'); - } - global.each(alignElements.split(','), function (name) { - var rule = schema.getElementRule(name); - if (rule) { - if (!rule.attributes.align) { - rule.attributes.align = {}; - rule.attributesOrder.push('align'); - } - } - }); - }; - var overrideSettings = function (editor) { - var defaultFontsizeFormats = '8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7'; - var defaultFontsFormats = 'Andale Mono=andale mono,monospace;' + 'Arial=arial,helvetica,sans-serif;' + 'Arial Black=arial black,sans-serif;' + 'Book Antiqua=book antiqua,palatino,serif;' + 'Comic Sans MS=comic sans ms,sans-serif;' + 'Courier New=courier new,courier,monospace;' + 'Georgia=georgia,palatino,serif;' + 'Helvetica=helvetica,arial,sans-serif;' + 'Impact=impact,sans-serif;' + 'Symbol=symbol;' + 'Tahoma=tahoma,arial,helvetica,sans-serif;' + 'Terminal=terminal,monaco,monospace;' + 'Times New Roman=times new roman,times,serif;' + 'Trebuchet MS=trebuchet ms,geneva,sans-serif;' + 'Verdana=verdana,geneva,sans-serif;' + 'Webdings=webdings;' + 'Wingdings=wingdings,zapf dingbats'; - setInlineStyles(editor, false); - if (!getFontSizeFormats(editor)) { - setFontSizeFormats(editor, defaultFontsizeFormats); - } - if (!getFontFormats(editor)) { - setFontFormats(editor, defaultFontsFormats); - } - }; - var setup = function (editor) { - overrideSettings(editor); - editor.on('PreInit', function () { - return overrideFormats(editor); - }); - }; - - function Plugin () { - global$1.add('legacyoutput', function (editor) { - setup(editor); - }); - } - - Plugin(); - -}()); diff --git a/public/js/tinymce/plugins/legacyoutput/plugin.min.js b/public/js/tinymce/plugins/legacyoutput/plugin.min.js index ba81c3d50..e44a48c47 100644 --- a/public/js/tinymce/plugins/legacyoutput/plugin.min.js +++ b/public/js/tinymce/plugins/legacyoutput/plugin.min.js @@ -4,6 +4,6 @@ * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * - * Version: 5.10.3 (2022-02-09) + * Version: 5.10.5 (2022-05-25) */ !function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("legacyoutput",function(e){var s,t;(t=s=e).settings.inline_styles=!1,t.getParam("fontsize_formats")||(t.settings.fontsize_formats="8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7"),t.getParam("font_formats")||(t.settings.font_formats="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats"),s.on("PreInit",function(){var e=s,t="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table",i=l.explode(e.getParam("font_size_style_values","xx-small,x-small,small,medium,large,x-large,xx-large")),a=e.schema;e.formatter.register({alignleft:{selector:t,attributes:{align:"left"}},aligncenter:{selector:t,attributes:{align:"center"}},alignright:{selector:t,attributes:{align:"right"}},alignjustify:{selector:t,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all",preserve_attributes:["class","style"]},{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all",preserve_attributes:["class","style"]},{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"underline"},exact:!0}],strikethrough:[{inline:"strike",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"line-through"},exact:!0}],fontname:{inline:"font",toggle:!1,attributes:{face:"%value"}},fontsize:{inline:"font",toggle:!1,attributes:{size:function(e){return String(l.inArray(i,e.value)+1)}}},forecolor:{inline:"font",attributes:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0}}),l.each("b,i,u,strike".split(","),function(e){a.addValidElements(e+"[*]")}),a.getElementRule("font")||a.addValidElements("font[face|size|color|style]"),l.each(t.split(","),function(e){var t=a.getElementRule(e);t&&(t.attributes.align||(t.attributes.align={},t.attributesOrder.push("align")))})})})}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/link/plugin.js b/public/js/tinymce/plugins/link/plugin.js index f339c7d16..2b3b04b10 100644 --- a/public/js/tinymce/plugins/link/plugin.js +++ b/public/js/tinymce/plugins/link/plugin.js @@ -1,188 +1,187 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; - var global$7 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - - var global$6 = tinymce.util.Tools.resolve('tinymce.util.VK'); + var global$5 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var typeOf = function (x) { - var t = typeof x; + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } + }; + const typeOf = x => { + const t = typeof x; if (x === null) { return 'null'; - } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + } else if (t === 'object' && Array.isArray(x)) { return 'array'; - } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { return 'string'; } else { return t; } }; - var isType = function (type) { - return function (value) { - return typeOf(value) === type; - }; - }; - var isSimpleType = function (type) { - return function (value) { - return typeof value === type; - }; - }; - var eq = function (t) { - return function (a) { - return t === a; - }; + const isType = type => value => typeOf(value) === type; + const isSimpleType = type => value => typeof value === type; + const eq = t => a => t === a; + const isString = isType('string'); + const isObject = isType('object'); + const isArray = isType('array'); + const isNull = eq(null); + const isBoolean = isSimpleType('boolean'); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); + const isFunction = isSimpleType('function'); + const isArrayOf = (value, pred) => { + if (isArray(value)) { + for (let i = 0, len = value.length; i < len; ++i) { + if (!pred(value[i])) { + return false; + } + } + return true; + } + return false; }; - var isString = isType('string'); - var isArray = isType('array'); - var isNull = eq(null); - var isBoolean = isSimpleType('boolean'); - var isFunction = isSimpleType('function'); - var noop = function () { + const noop = () => { }; - var constant = function (value) { - return function () { + const constant = value => { + return () => { return value; }; }; - var identity = function (x) { - return x; - }; - var tripleEquals = function (a, b) { + const tripleEquals = (a, b) => { return a === b; }; - var never = constant(false); - var always = constant(true); - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from - }; + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); - var nativeIndexOf = Array.prototype.indexOf; - var nativePush = Array.prototype.push; - var rawIndexOf = function (ts, t) { - return nativeIndexOf.call(ts, t); - }; - var contains = function (xs, x) { - return rawIndexOf(xs, x) > -1; - }; - var map = function (xs, f) { - var len = xs.length; - var r = new Array(len); - for (var i = 0; i < len; i++) { - var x = xs[i]; + const nativeIndexOf = Array.prototype.indexOf; + const nativePush = Array.prototype.push; + const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t); + const contains = (xs, x) => rawIndexOf(xs, x) > -1; + const map = (xs, f) => { + const len = xs.length; + const r = new Array(len); + for (let i = 0; i < len; i++) { + const x = xs[i]; r[i] = f(x, i); } return r; }; - var each$1 = function (xs, f) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const each$1 = (xs, f) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; f(x, i); } }; - var foldl = function (xs, f, acc) { - each$1(xs, function (x, i) { + const foldl = (xs, f, acc) => { + each$1(xs, (x, i) => { acc = f(acc, x, i); }); return acc; }; - var flatten = function (xs) { - var r = []; - for (var i = 0, len = xs.length; i < len; ++i) { + const flatten = xs => { + const r = []; + for (let i = 0, len = xs.length; i < len; ++i) { if (!isArray(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } @@ -190,12 +189,10 @@ } return r; }; - var bind = function (xs, f) { - return flatten(map(xs, f)); - }; - var findMap = function (arr, f) { - for (var i = 0; i < arr.length; i++) { - var r = f(arr[i], i); + const bind = (xs, f) => flatten(map(xs, f)); + const findMap = (arr, f) => { + for (let i = 0; i < arr.length; i++) { + const r = f(arr[i], i); if (r.isSome()) { return r; } @@ -203,74 +200,102 @@ return Optional.none(); }; - var is = function (lhs, rhs, comparator) { - if (comparator === void 0) { - comparator = tripleEquals; - } - return lhs.exists(function (left) { - return comparator(left, rhs); - }); - }; - var cat = function (arr) { - var r = []; - var push = function (x) { + const is = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs)); + const cat = arr => { + const r = []; + const push = x => { r.push(x); }; - for (var i = 0; i < arr.length; i++) { + for (let i = 0; i < arr.length; i++) { arr[i].each(push); } return r; }; - var someIf = function (b, a) { - return b ? Optional.some(a) : Optional.none(); - }; + const someIf = (b, a) => b ? Optional.some(a) : Optional.none(); - var assumeExternalTargets = function (editor) { - var externalTargets = editor.getParam('link_assume_external_targets', false); - if (isBoolean(externalTargets) && externalTargets) { - return 1; - } else if (isString(externalTargets) && (externalTargets === 'http' || externalTargets === 'https')) { - return externalTargets; - } - return 0; - }; - var hasContextToolbar = function (editor) { - return editor.getParam('link_context_toolbar', false, 'boolean'); - }; - var getLinkList = function (editor) { - return editor.getParam('link_list'); - }; - var getDefaultLinkTarget = function (editor) { - return editor.getParam('default_link_target'); - }; - var getTargetList = function (editor) { - return editor.getParam('target_list', true); - }; - var getRelList = function (editor) { - return editor.getParam('rel_list', [], 'array'); - }; - var getLinkClassList = function (editor) { - return editor.getParam('link_class_list', [], 'array'); - }; - var shouldShowLinkTitle = function (editor) { - return editor.getParam('link_title', true, 'boolean'); - }; - var allowUnsafeLinkTarget = function (editor) { - return editor.getParam('allow_unsafe_link_target', false, 'boolean'); - }; - var useQuickLink = function (editor) { - return editor.getParam('link_quicklink', false, 'boolean'); - }; - var getDefaultLinkProtocol = function (editor) { - return editor.getParam('link_default_protocol', 'http', 'string'); + const option = name => editor => editor.options.get(name); + const register$1 = editor => { + const registerOption = editor.options.register; + registerOption('link_assume_external_targets', { + processor: value => { + const valid = isString(value) || isBoolean(value); + if (valid) { + if (value === true) { + return { + value: 1, + valid + }; + } else if (value === 'http' || value === 'https') { + return { + value, + valid + }; + } else { + return { + value: 0, + valid + }; + } + } else { + return { + valid: false, + message: 'Must be a string or a boolean.' + }; + } + }, + default: false + }); + registerOption('link_context_toolbar', { + processor: 'boolean', + default: false + }); + registerOption('link_list', { processor: value => isString(value) || isFunction(value) || isArrayOf(value, isObject) }); + registerOption('link_default_target', { processor: 'string' }); + registerOption('link_default_protocol', { + processor: 'string', + default: 'https' + }); + registerOption('link_target_list', { + processor: value => isBoolean(value) || isArrayOf(value, isObject), + default: true + }); + registerOption('link_rel_list', { + processor: 'object[]', + default: [] + }); + registerOption('link_class_list', { + processor: 'object[]', + default: [] + }); + registerOption('link_title', { + processor: 'boolean', + default: true + }); + registerOption('allow_unsafe_link_target', { + processor: 'boolean', + default: false + }); + registerOption('link_quicklink', { + processor: 'boolean', + default: false + }); }; + const assumeExternalTargets = option('link_assume_external_targets'); + const hasContextToolbar = option('link_context_toolbar'); + const getLinkList = option('link_list'); + const getDefaultLinkTarget = option('link_default_target'); + const getDefaultLinkProtocol = option('link_default_protocol'); + const getTargetList = option('link_target_list'); + const getRelList = option('link_rel_list'); + const getLinkClassList = option('link_class_list'); + const shouldShowLinkTitle = option('link_title'); + const allowUnsafeLinkTarget = option('allow_unsafe_link_target'); + const useQuickLink = option('link_quicklink'); - var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools'); - var getValue = function (item) { - return isString(item.value) ? item.value : ''; - }; - var getText = function (item) { + const getValue = item => isString(item.value) ? item.value : ''; + const getText = item => { if (isString(item.text)) { return item.text; } else if (isString(item.title)) { @@ -279,121 +304,82 @@ return ''; } }; - var sanitizeList = function (list, extractValue) { - var out = []; - global$5.each(list, function (item) { - var text = getText(item); + const sanitizeList = (list, extractValue) => { + const out = []; + global$4.each(list, item => { + const text = getText(item); if (item.menu !== undefined) { - var items = sanitizeList(item.menu, extractValue); + const items = sanitizeList(item.menu, extractValue); out.push({ - text: text, - items: items + text, + items }); } else { - var value = extractValue(item); + const value = extractValue(item); out.push({ - text: text, - value: value + text, + value }); } }); return out; }; - var sanitizeWith = function (extracter) { - if (extracter === void 0) { - extracter = getValue; - } - return function (list) { - return Optional.from(list).map(function (list) { - return sanitizeList(list, extracter); - }); - }; - }; - var sanitize = function (list) { - return sanitizeWith(getValue)(list); - }; - var createUi = function (name, label) { - return function (items) { - return { - name: name, - type: 'listbox', - label: label, - items: items - }; - }; - }; - var ListOptions = { - sanitize: sanitize, - sanitizeWith: sanitizeWith, - createUi: createUi, - getValue: getValue + const sanitizeWith = (extracter = getValue) => list => Optional.from(list).map(list => sanitizeList(list, extracter)); + const sanitize = list => sanitizeWith(getValue)(list); + const createUi = (name, label) => items => ({ + name, + type: 'listbox', + label, + items + }); + const ListOptions = { + sanitize, + sanitizeWith, + createUi, + getValue }; - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - - var keys = Object.keys; - var hasOwnProperty = Object.hasOwnProperty; - var each = function (obj, f) { - var props = keys(obj); - for (var k = 0, len = props.length; k < len; k++) { - var i = props[k]; - var x = obj[i]; + const keys = Object.keys; + const hasOwnProperty = Object.hasOwnProperty; + const each = (obj, f) => { + const props = keys(obj); + for (let k = 0, len = props.length; k < len; k++) { + const i = props[k]; + const x = obj[i]; f(x, i); } }; - var objAcc = function (r) { - return function (x, i) { - r[i] = x; - }; + const objAcc = r => (x, i) => { + r[i] = x; }; - var internalFilter = function (obj, pred, onTrue, onFalse) { - var r = {}; - each(obj, function (x, i) { + const internalFilter = (obj, pred, onTrue, onFalse) => { + each(obj, (x, i) => { (pred(x, i) ? onTrue : onFalse)(x, i); }); - return r; }; - var filter = function (obj, pred) { - var t = {}; + const filter = (obj, pred) => { + const t = {}; internalFilter(obj, pred, objAcc(t), noop); return t; }; - var has = function (obj, key) { - return hasOwnProperty.call(obj, key); - }; - var hasNonNullableKey = function (obj, key) { - return has(obj, key) && obj[key] !== undefined && obj[key] !== null; - }; + const has = (obj, key) => hasOwnProperty.call(obj, key); + const hasNonNullableKey = (obj, key) => has(obj, key) && obj[key] !== undefined && obj[key] !== null; - var global$4 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); + var global$3 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); - var global$3 = tinymce.util.Tools.resolve('tinymce.util.URI'); + var global$2 = tinymce.util.Tools.resolve('tinymce.util.URI'); - var isAnchor = function (elm) { - return elm && elm.nodeName.toLowerCase() === 'a'; - }; - var isLink = function (elm) { - return isAnchor(elm) && !!getHref(elm); - }; - var collectNodesInRange = function (rng, predicate) { + const isAnchor = elm => isNonNullable(elm) && elm.nodeName.toLowerCase() === 'a'; + const isLink = elm => isAnchor(elm) && !!getHref(elm); + const collectNodesInRange = (rng, predicate) => { if (rng.collapsed) { return []; } else { - var contents = rng.cloneContents(); - var walker = new global$4(contents.firstChild, contents); - var elements = []; - var current = contents.firstChild; + const contents = rng.cloneContents(); + const firstChild = contents.firstChild; + const walker = new global$3(firstChild, contents); + const elements = []; + let current = firstChild; do { if (predicate(current)) { elements.push(current); @@ -402,87 +388,81 @@ return elements; } }; - var hasProtocol = function (url) { - return /^\w+:/i.test(url); - }; - var getHref = function (elm) { - var href = elm.getAttribute('data-mce-href'); - return href ? href : elm.getAttribute('href'); + const hasProtocol = url => /^\w+:/i.test(url); + const getHref = elm => { + var _a, _b; + return (_b = (_a = elm.getAttribute('data-mce-href')) !== null && _a !== void 0 ? _a : elm.getAttribute('href')) !== null && _b !== void 0 ? _b : ''; }; - var applyRelTargetRules = function (rel, isUnsafe) { - var rules = ['noopener']; - var rels = rel ? rel.split(/\s+/) : []; - var toString = function (rels) { - return global$5.trim(rels.sort().join(' ')); - }; - var addTargetRules = function (rels) { + const applyRelTargetRules = (rel, isUnsafe) => { + const rules = ['noopener']; + const rels = rel ? rel.split(/\s+/) : []; + const toString = rels => global$4.trim(rels.sort().join(' ')); + const addTargetRules = rels => { rels = removeTargetRules(rels); return rels.length > 0 ? rels.concat(rules) : rules; }; - var removeTargetRules = function (rels) { - return rels.filter(function (val) { - return global$5.inArray(rules, val) === -1; - }); - }; - var newRels = isUnsafe ? addTargetRules(rels) : removeTargetRules(rels); + const removeTargetRules = rels => rels.filter(val => global$4.inArray(rules, val) === -1); + const newRels = isUnsafe ? addTargetRules(rels) : removeTargetRules(rels); return newRels.length > 0 ? toString(newRels) : ''; }; - var trimCaretContainers = function (text) { - return text.replace(/\uFEFF/g, ''); - }; - var getAnchorElement = function (editor, selectedElm) { - selectedElm = selectedElm || editor.selection.getNode(); + const trimCaretContainers = text => text.replace(/\uFEFF/g, ''); + const getAnchorElement = (editor, selectedElm) => { + selectedElm = selectedElm || getLinksInSelection(editor.selection.getRng())[0] || editor.selection.getNode(); if (isImageFigure(selectedElm)) { - return editor.dom.select('a[href]', selectedElm)[0]; + return Optional.from(editor.dom.select('a[href]', selectedElm)[0]); } else { - return editor.dom.getParent(selectedElm, 'a[href]'); + return Optional.from(editor.dom.getParent(selectedElm, 'a[href]')); } }; - var getAnchorText = function (selection, anchorElm) { - var text = anchorElm ? anchorElm.innerText || anchorElm.textContent : selection.getContent({ format: 'text' }); + const isInAnchor = (editor, selectedElm) => getAnchorElement(editor, selectedElm).isSome(); + const getAnchorText = (selection, anchorElm) => { + const text = anchorElm.fold(() => selection.getContent({ format: 'text' }), anchorElm => anchorElm.innerText || anchorElm.textContent || ''); return trimCaretContainers(text); }; - var hasLinks = function (elements) { - return global$5.grep(elements, isLink).length > 0; - }; - var hasLinksInSelection = function (rng) { - return collectNodesInRange(rng, isLink).length > 0; - }; - var isOnlyTextSelected = function (editor) { - var inlineTextElements = editor.schema.getTextInlineElements(); - var isElement = function (elm) { - return elm.nodeType === 1 && !isAnchor(elm) && !has(inlineTextElements, elm.nodeName.toLowerCase()); - }; - var elements = collectNodesInRange(editor.selection.getRng(), isElement); - return elements.length === 0; - }; - var isImageFigure = function (elm) { - return elm && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className); + const getLinksInSelection = rng => collectNodesInRange(rng, isLink); + const getLinks$1 = elements => global$4.grep(elements, isLink); + const hasLinks = elements => getLinks$1(elements).length > 0; + const hasLinksInSelection = rng => getLinksInSelection(rng).length > 0; + const isOnlyTextSelected = editor => { + const inlineTextElements = editor.schema.getTextInlineElements(); + const isElement = elm => elm.nodeType === 1 && !isAnchor(elm) && !has(inlineTextElements, elm.nodeName.toLowerCase()); + const isInBlockAnchor = getAnchorElement(editor).exists(anchor => anchor.hasAttribute('data-mce-block')); + if (isInBlockAnchor) { + return false; + } + const rng = editor.selection.getRng(); + if (!rng.collapsed) { + const elements = collectNodesInRange(rng, isElement); + return elements.length === 0; + } else { + return true; + } }; - var getLinkAttrs = function (data) { - var attrs = [ + const isImageFigure = elm => isNonNullable(elm) && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className); + const getLinkAttrs = data => { + const attrs = [ 'title', 'rel', 'class', 'target' ]; - return foldl(attrs, function (acc, key) { - data[key].each(function (value) { + return foldl(attrs, (acc, key) => { + data[key].each(value => { acc[key] = value.length > 0 ? value : null; }); return acc; }, { href: data.href }); }; - var handleExternalTargets = function (href, assumeExternalTargets) { + const handleExternalTargets = (href, assumeExternalTargets) => { if ((assumeExternalTargets === 'http' || assumeExternalTargets === 'https') && !hasProtocol(href)) { return assumeExternalTargets + '://' + href; } return href; }; - var applyLinkOverrides = function (editor, linkAttrs) { - var newLinkAttrs = __assign({}, linkAttrs); - if (!(getRelList(editor).length > 0) && allowUnsafeLinkTarget(editor) === false) { - var newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank'); + const applyLinkOverrides = (editor, linkAttrs) => { + const newLinkAttrs = { ...linkAttrs }; + if (getRelList(editor).length === 0 && !allowUnsafeLinkTarget(editor)) { + const newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank'); newLinkAttrs.rel = newRel ? newRel : null; } if (Optional.from(newLinkAttrs.target).isNone() && getTargetList(editor) === false) { @@ -491,8 +471,8 @@ newLinkAttrs.href = handleExternalTargets(newLinkAttrs.href, assumeExternalTargets(editor)); return newLinkAttrs; }; - var updateLink = function (editor, anchorElm, text, linkAttrs) { - text.each(function (text) { + const updateLink = (editor, anchorElm, text, linkAttrs) => { + text.each(text => { if (has(anchorElm, 'innerText')) { anchorElm.innerText = text; } else { @@ -502,39 +482,40 @@ editor.dom.setAttribs(anchorElm, linkAttrs); editor.selection.select(anchorElm); }; - var createLink = function (editor, selectedElm, text, linkAttrs) { + const createLink = (editor, selectedElm, text, linkAttrs) => { + const dom = editor.dom; if (isImageFigure(selectedElm)) { - linkImageFigure(editor, selectedElm, linkAttrs); + linkImageFigure(dom, selectedElm, linkAttrs); } else { - text.fold(function () { + text.fold(() => { editor.execCommand('mceInsertLink', false, linkAttrs); - }, function (text) { - editor.insertContent(editor.dom.createHTML('a', linkAttrs, editor.dom.encode(text))); + }, text => { + editor.insertContent(dom.createHTML('a', linkAttrs, dom.encode(text))); }); } }; - var linkDomMutation = function (editor, attachState, data) { - var selectedElm = editor.selection.getNode(); - var anchorElm = getAnchorElement(editor, selectedElm); - var linkAttrs = applyLinkOverrides(editor, getLinkAttrs(data)); - editor.undoManager.transact(function () { + const linkDomMutation = (editor, attachState, data) => { + const selectedElm = editor.selection.getNode(); + const anchorElm = getAnchorElement(editor, selectedElm); + const linkAttrs = applyLinkOverrides(editor, getLinkAttrs(data)); + editor.undoManager.transact(() => { if (data.href === attachState.href) { attachState.attach(); } - if (anchorElm) { - editor.focus(); - updateLink(editor, anchorElm, data.text, linkAttrs); - } else { + anchorElm.fold(() => { createLink(editor, selectedElm, data.text, linkAttrs); - } + }, elm => { + editor.focus(); + updateLink(editor, elm, data.text, linkAttrs); + }); }); }; - var unlinkSelection = function (editor) { - var dom = editor.dom, selection = editor.selection; - var bookmark = selection.getBookmark(); - var rng = selection.getRng().cloneRange(); - var startAnchorElm = dom.getParent(rng.startContainer, 'a[href]', editor.getBody()); - var endAnchorElm = dom.getParent(rng.endContainer, 'a[href]', editor.getBody()); + const unlinkSelection = editor => { + const dom = editor.dom, selection = editor.selection; + const bookmark = selection.getBookmark(); + const rng = selection.getRng().cloneRange(); + const startAnchorElm = dom.getParent(rng.startContainer, 'a[href]', editor.getBody()); + const endAnchorElm = dom.getParent(rng.endContainer, 'a[href]', editor.getBody()); if (startAnchorElm) { rng.setStartBefore(startAnchorElm); } @@ -545,9 +526,9 @@ editor.execCommand('unlink'); selection.moveToBookmark(bookmark); }; - var unlinkDomMutation = function (editor) { - editor.undoManager.transact(function () { - var node = editor.selection.getNode(); + const unlinkDomMutation = editor => { + editor.undoManager.transact(() => { + const node = editor.selection.getNode(); if (isImageFigure(node)) { unlinkImageFigure(editor, node); } else { @@ -556,78 +537,88 @@ editor.focus(); }); }; - var unwrapOptions = function (data) { - var cls = data.class, href = data.href, rel = data.rel, target = data.target, text = data.text, title = data.title; + const unwrapOptions = data => { + const { + class: cls, + href, + rel, + target, + text, + title + } = data; return filter({ class: cls.getOrNull(), - href: href, + href, rel: rel.getOrNull(), target: target.getOrNull(), text: text.getOrNull(), title: title.getOrNull() - }, function (v, _k) { - return isNull(v) === false; - }); - }; - var sanitizeData = function (editor, data) { - var href = data.href; - return __assign(__assign({}, data), { href: global$3.isDomSafe(href, 'a', editor.settings) ? href : '' }); + }, (v, _k) => isNull(v) === false); + }; + const sanitizeData = (editor, data) => { + const getOption = editor.options.get; + const uriOptions = { + allow_html_data_urls: getOption('allow_html_data_urls'), + allow_script_urls: getOption('allow_script_urls'), + allow_svg_data_urls: getOption('allow_svg_data_urls') + }; + const href = data.href; + return { + ...data, + href: global$2.isDomSafe(href, 'a', uriOptions) ? href : '' + }; }; - var link = function (editor, attachState, data) { - var sanitizedData = sanitizeData(editor, data); + const link = (editor, attachState, data) => { + const sanitizedData = sanitizeData(editor, data); editor.hasPlugin('rtc', true) ? editor.execCommand('createlink', false, unwrapOptions(sanitizedData)) : linkDomMutation(editor, attachState, sanitizedData); }; - var unlink = function (editor) { + const unlink = editor => { editor.hasPlugin('rtc', true) ? editor.execCommand('unlink') : unlinkDomMutation(editor); }; - var unlinkImageFigure = function (editor, fig) { - var img = editor.dom.select('img', fig)[0]; + const unlinkImageFigure = (editor, fig) => { + var _a; + const img = editor.dom.select('img', fig)[0]; if (img) { - var a = editor.dom.getParents(img, 'a[href]', fig)[0]; + const a = editor.dom.getParents(img, 'a[href]', fig)[0]; if (a) { - a.parentNode.insertBefore(img, a); + (_a = a.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(img, a); editor.dom.remove(a); } } }; - var linkImageFigure = function (editor, fig, attrs) { - var img = editor.dom.select('img', fig)[0]; + const linkImageFigure = (dom, fig, attrs) => { + var _a; + const img = dom.select('img', fig)[0]; if (img) { - var a = editor.dom.create('a', attrs); - img.parentNode.insertBefore(a, img); + const a = dom.create('a', attrs); + (_a = img.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(a, img); a.appendChild(img); } }; - var isListGroup = function (item) { - return hasNonNullableKey(item, 'items'); - }; - var findTextByValue = function (value, catalog) { - return findMap(catalog, function (item) { - if (isListGroup(item)) { - return findTextByValue(value, item.items); - } else { - return someIf(item.value === value, item); - } - }); - }; - var getDelta = function (persistentText, fieldName, catalog, data) { - var value = data[fieldName]; - var hasPersistentText = persistentText.length > 0; - return value !== undefined ? findTextByValue(value, catalog).map(function (i) { - return { - url: { - value: i.value, - meta: { - text: hasPersistentText ? persistentText : i.text, - attach: noop - } - }, - text: hasPersistentText ? persistentText : i.text - }; - }) : Optional.none(); + const isListGroup = item => hasNonNullableKey(item, 'items'); + const findTextByValue = (value, catalog) => findMap(catalog, item => { + if (isListGroup(item)) { + return findTextByValue(value, item.items); + } else { + return someIf(item.value === value, item); + } + }); + const getDelta = (persistentText, fieldName, catalog, data) => { + const value = data[fieldName]; + const hasPersistentText = persistentText.length > 0; + return value !== undefined ? findTextByValue(value, catalog).map(i => ({ + url: { + value: i.value, + meta: { + text: hasPersistentText ? persistentText : i.text, + attach: noop + } + }, + text: hasPersistentText ? persistentText : i.text + })) : Optional.none(); }; - var findCatalog = function (catalogs, fieldName) { + const findCatalog = (catalogs, fieldName) => { if (fieldName === 'link') { return catalogs.link; } else if (fieldName === 'anchor') { @@ -636,43 +627,44 @@ return Optional.none(); } }; - var init = function (initialData, linkCatalog) { - var persistentData = { + const init = (initialData, linkCatalog) => { + const persistentData = { text: initialData.text, title: initialData.title }; - var getTitleFromUrlChange = function (url) { - return someIf(persistentData.title.length <= 0, Optional.from(url.meta.title).getOr('')); + const getTitleFromUrlChange = url => { + var _a; + return someIf(persistentData.title.length <= 0, Optional.from((_a = url.meta) === null || _a === void 0 ? void 0 : _a.title).getOr('')); }; - var getTextFromUrlChange = function (url) { - return someIf(persistentData.text.length <= 0, Optional.from(url.meta.text).getOr(url.value)); + const getTextFromUrlChange = url => { + var _a; + return someIf(persistentData.text.length <= 0, Optional.from((_a = url.meta) === null || _a === void 0 ? void 0 : _a.text).getOr(url.value)); }; - var onUrlChange = function (data) { - var text = getTextFromUrlChange(data.url); - var title = getTitleFromUrlChange(data.url); + const onUrlChange = data => { + const text = getTextFromUrlChange(data.url); + const title = getTitleFromUrlChange(data.url); if (text.isSome() || title.isSome()) { - return Optional.some(__assign(__assign({}, text.map(function (text) { - return { text: text }; - }).getOr({})), title.map(function (title) { - return { title: title }; - }).getOr({}))); + return Optional.some({ + ...text.map(text => ({ text })).getOr({}), + ...title.map(title => ({ title })).getOr({}) + }); } else { return Optional.none(); } }; - var onCatalogChange = function (data, change) { - var catalog = findCatalog(linkCatalog, change.name).getOr([]); - return getDelta(persistentData.text, change.name, catalog, data); + const onCatalogChange = (data, change) => { + const catalog = findCatalog(linkCatalog, change).getOr([]); + return getDelta(persistentData.text, change, catalog, data); }; - var onChange = function (getData, change) { - var name = change.name; + const onChange = (getData, change) => { + const name = change.name; if (name === 'url') { return onUrlChange(getData()); } else if (contains([ 'anchor', 'link' ], name)) { - return onCatalogChange(getData(), change); + return onCatalogChange(getData(), name); } else if (name === 'text' || name === 'title') { persistentData[name] = getData()[name]; return Optional.none(); @@ -680,70 +672,60 @@ return Optional.none(); } }; - return { onChange: onChange }; + return { onChange }; }; - var DialogChanges = { - init: init, - getDelta: getDelta + const DialogChanges = { + init, + getDelta }; - var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); - - var global$1 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Delay'); - var delayedConfirm = function (editor, message, callback) { - var rng = editor.selection.getRng(); - global$2.setEditorTimeout(editor, function () { - editor.windowManager.confirm(message, function (state) { + const delayedConfirm = (editor, message, callback) => { + const rng = editor.selection.getRng(); + global$1.setEditorTimeout(editor, () => { + editor.windowManager.confirm(message, state => { editor.selection.setRng(rng); callback(state); }); }); }; - var tryEmailTransform = function (data) { - var url = data.href; - var suggestMailTo = url.indexOf('@') > 0 && url.indexOf('/') === -1 && url.indexOf('mailto:') === -1; + const tryEmailTransform = data => { + const url = data.href; + const suggestMailTo = url.indexOf('@') > 0 && url.indexOf('/') === -1 && url.indexOf('mailto:') === -1; return suggestMailTo ? Optional.some({ message: 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?', - preprocess: function (oldData) { - return __assign(__assign({}, oldData), { href: 'mailto:' + url }); - } + preprocess: oldData => ({ + ...oldData, + href: 'mailto:' + url + }) }) : Optional.none(); }; - var tryProtocolTransform = function (assumeExternalTargets, defaultLinkProtocol) { - return function (data) { - var url = data.href; - var suggestProtocol = assumeExternalTargets === 1 && !hasProtocol(url) || assumeExternalTargets === 0 && /^\s*www(\.|\d\.)/i.test(url); - return suggestProtocol ? Optional.some({ - message: 'The URL you entered seems to be an external link. Do you want to add the required ' + defaultLinkProtocol + ':// prefix?', - preprocess: function (oldData) { - return __assign(__assign({}, oldData), { href: defaultLinkProtocol + '://' + url }); - } - }) : Optional.none(); - }; + const tryProtocolTransform = (assumeExternalTargets, defaultLinkProtocol) => data => { + const url = data.href; + const suggestProtocol = assumeExternalTargets === 1 && !hasProtocol(url) || assumeExternalTargets === 0 && /^\s*www(\.|\d\.)/i.test(url); + return suggestProtocol ? Optional.some({ + message: `The URL you entered seems to be an external link. Do you want to add the required ${ defaultLinkProtocol }:// prefix?`, + preprocess: oldData => ({ + ...oldData, + href: defaultLinkProtocol + '://' + url + }) + }) : Optional.none(); }; - var preprocess = function (editor, data) { - return findMap([ - tryEmailTransform, - tryProtocolTransform(assumeExternalTargets(editor), getDefaultLinkProtocol(editor)) - ], function (f) { - return f(data); - }).fold(function () { - return global$1.resolve(data); - }, function (transform) { - return new global$1(function (callback) { - delayedConfirm(editor, transform.message, function (state) { - callback(state ? transform.preprocess(data) : data); - }); - }); + const preprocess = (editor, data) => findMap([ + tryEmailTransform, + tryProtocolTransform(assumeExternalTargets(editor), getDefaultLinkProtocol(editor)) + ], f => f(data)).fold(() => Promise.resolve(data), transform => new Promise(callback => { + delayedConfirm(editor, transform.message, state => { + callback(state ? transform.preprocess(data) : data); }); - }; - var DialogConfirms = { preprocess: preprocess }; + })); + const DialogConfirms = { preprocess }; - var getAnchors = function (editor) { - var anchorNodes = editor.dom.select('a:not([href])'); - var anchors = bind(anchorNodes, function (anchor) { - var id = anchor.name || anchor.id; + const getAnchors = editor => { + const anchorNodes = editor.dom.select('a:not([href])'); + const anchors = bind(anchorNodes, anchor => { + const id = anchor.name || anchor.id; return id ? [{ text: id, value: '#' + id @@ -754,81 +736,63 @@ value: '' }].concat(anchors)) : Optional.none(); }; - var AnchorListOptions = { getAnchors: getAnchors }; + const AnchorListOptions = { getAnchors }; - var getClasses = function (editor) { - var list = getLinkClassList(editor); + const getClasses = editor => { + const list = getLinkClassList(editor); if (list.length > 0) { return ListOptions.sanitize(list); } return Optional.none(); }; - var ClassListOptions = { getClasses: getClasses }; + const ClassListOptions = { getClasses }; - var global = tinymce.util.Tools.resolve('tinymce.util.XHR'); - - var parseJson = function (text) { + const parseJson = text => { try { return Optional.some(JSON.parse(text)); } catch (err) { return Optional.none(); } }; - var getLinks = function (editor) { - var extractor = function (item) { - return editor.convertURL(item.value || item.url, 'href'); - }; - var linkList = getLinkList(editor); - return new global$1(function (callback) { + const getLinks = editor => { + const extractor = item => editor.convertURL(item.value || item.url || '', 'href'); + const linkList = getLinkList(editor); + return new Promise(resolve => { if (isString(linkList)) { - global.send({ - url: linkList, - success: function (text) { - return callback(parseJson(text)); - }, - error: function (_) { - return callback(Optional.none()); - } - }); + fetch(linkList).then(res => res.ok ? res.text().then(parseJson) : Promise.reject()).then(resolve, () => resolve(Optional.none())); } else if (isFunction(linkList)) { - linkList(function (output) { - return callback(Optional.some(output)); - }); + linkList(output => resolve(Optional.some(output))); } else { - callback(Optional.from(linkList)); + resolve(Optional.from(linkList)); } - }).then(function (optItems) { - return optItems.bind(ListOptions.sanitizeWith(extractor)).map(function (items) { - if (items.length > 0) { - var noneItem = [{ - text: 'None', - value: '' - }]; - return noneItem.concat(items); - } else { - return items; - } - }); - }); + }).then(optItems => optItems.bind(ListOptions.sanitizeWith(extractor)).map(items => { + if (items.length > 0) { + const noneItem = [{ + text: 'None', + value: '' + }]; + return noneItem.concat(items); + } else { + return items; + } + })); }; - var LinkListOptions = { getLinks: getLinks }; + const LinkListOptions = { getLinks }; - var getRels = function (editor, initialTarget) { - var list = getRelList(editor); + const getRels = (editor, initialTarget) => { + const list = getRelList(editor); if (list.length > 0) { - var isTargetBlank_1 = is(initialTarget, '_blank'); - var enforceSafe = allowUnsafeLinkTarget(editor) === false; - var safeRelExtractor = function (item) { - return applyRelTargetRules(ListOptions.getValue(item), isTargetBlank_1); - }; - var sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize; + const isTargetBlank = is(initialTarget, '_blank'); + const enforceSafe = allowUnsafeLinkTarget(editor) === false; + const safeRelExtractor = item => applyRelTargetRules(ListOptions.getValue(item), isTargetBlank); + const sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize; return sanitizer(list); } return Optional.none(); }; - var RelOptions = { getRels: getRels }; + const RelOptions = { getRels }; - var fallbacks = [ + const fallbacks = [ { text: 'Current window', value: '' @@ -838,98 +802,88 @@ value: '_blank' } ]; - var getTargets = function (editor) { - var list = getTargetList(editor); + const getTargets = editor => { + const list = getTargetList(editor); if (isArray(list)) { - return ListOptions.sanitize(list).orThunk(function () { - return Optional.some(fallbacks); - }); + return ListOptions.sanitize(list).orThunk(() => Optional.some(fallbacks)); } else if (list === false) { return Optional.none(); } return Optional.some(fallbacks); }; - var TargetOptions = { getTargets: getTargets }; + const TargetOptions = { getTargets }; - var nonEmptyAttr = function (dom, elem, name) { - var val = dom.getAttrib(elem, name); + const nonEmptyAttr = (dom, elem, name) => { + const val = dom.getAttrib(elem, name); return val !== null && val.length > 0 ? Optional.some(val) : Optional.none(); }; - var extractFromAnchor = function (editor, anchor) { - var dom = editor.dom; - var onlyText = isOnlyTextSelected(editor); - var text = onlyText ? Optional.some(getAnchorText(editor.selection, anchor)) : Optional.none(); - var url = anchor ? Optional.some(dom.getAttrib(anchor, 'href')) : Optional.none(); - var target = anchor ? Optional.from(dom.getAttrib(anchor, 'target')) : Optional.none(); - var rel = nonEmptyAttr(dom, anchor, 'rel'); - var linkClass = nonEmptyAttr(dom, anchor, 'class'); - var title = nonEmptyAttr(dom, anchor, 'title'); + const extractFromAnchor = (editor, anchor) => { + const dom = editor.dom; + const onlyText = isOnlyTextSelected(editor); + const text = onlyText ? Optional.some(getAnchorText(editor.selection, anchor)) : Optional.none(); + const url = anchor.bind(anchorElm => Optional.from(dom.getAttrib(anchorElm, 'href'))); + const target = anchor.bind(anchorElm => Optional.from(dom.getAttrib(anchorElm, 'target'))); + const rel = anchor.bind(anchorElm => nonEmptyAttr(dom, anchorElm, 'rel')); + const linkClass = anchor.bind(anchorElm => nonEmptyAttr(dom, anchorElm, 'class')); + const title = anchor.bind(anchorElm => nonEmptyAttr(dom, anchorElm, 'title')); return { - url: url, - text: text, - title: title, - target: target, - rel: rel, - linkClass: linkClass + url, + text, + title, + target, + rel, + linkClass }; }; - var collect = function (editor, linkNode) { - return LinkListOptions.getLinks(editor).then(function (links) { - var anchor = extractFromAnchor(editor, linkNode); - return { - anchor: anchor, - catalogs: { - targets: TargetOptions.getTargets(editor), - rels: RelOptions.getRels(editor, anchor.target), - classes: ClassListOptions.getClasses(editor), - anchor: AnchorListOptions.getAnchors(editor), - link: links - }, - optNode: Optional.from(linkNode), - flags: { titleEnabled: shouldShowLinkTitle(editor) } - }; - }); - }; - var DialogInfo = { collect: collect }; + const collect = (editor, linkNode) => LinkListOptions.getLinks(editor).then(links => { + const anchor = extractFromAnchor(editor, linkNode); + return { + anchor, + catalogs: { + targets: TargetOptions.getTargets(editor), + rels: RelOptions.getRels(editor, anchor.target), + classes: ClassListOptions.getClasses(editor), + anchor: AnchorListOptions.getAnchors(editor), + link: links + }, + optNode: linkNode, + flags: { titleEnabled: shouldShowLinkTitle(editor) } + }; + }); + const DialogInfo = { collect }; - var handleSubmit = function (editor, info) { - return function (api) { - var data = api.getData(); - if (!data.url.value) { - unlink(editor); - api.close(); - return; - } - var getChangedValue = function (key) { - return Optional.from(data[key]).filter(function (value) { - return !is(info.anchor[key], value); - }); - }; - var changedData = { - href: data.url.value, - text: getChangedValue('text'), - target: getChangedValue('target'), - rel: getChangedValue('rel'), - class: getChangedValue('linkClass'), - title: getChangedValue('title') - }; - var attachState = { - href: data.url.value, - attach: data.url.meta !== undefined && data.url.meta.attach ? data.url.meta.attach : noop - }; - DialogConfirms.preprocess(editor, changedData).then(function (pData) { - link(editor, attachState, pData); - }); + const handleSubmit = (editor, info) => api => { + const data = api.getData(); + if (!data.url.value) { + unlink(editor); api.close(); + return; + } + const getChangedValue = key => Optional.from(data[key]).filter(value => !is(info.anchor[key], value)); + const changedData = { + href: data.url.value, + text: getChangedValue('text'), + target: getChangedValue('target'), + rel: getChangedValue('rel'), + class: getChangedValue('linkClass'), + title: getChangedValue('title') + }; + const attachState = { + href: data.url.value, + attach: data.url.meta !== undefined && data.url.meta.attach ? data.url.meta.attach : noop }; + DialogConfirms.preprocess(editor, changedData).then(pData => { + link(editor, attachState, pData); + }); + api.close(); }; - var collectData = function (editor) { - var anchorNode = getAnchorElement(editor); + const collectData = editor => { + const anchorNode = getAnchorElement(editor); return DialogInfo.collect(editor, anchorNode); }; - var getInitialData = function (info, defaultTarget) { - var anchor = info.anchor; - var url = anchor.url.getOr(''); + const getInitialData = (info, defaultTarget) => { + const anchor = info.anchor; + const url = anchor.url.getOr(''); return { url: { value: url, @@ -944,30 +898,28 @@ linkClass: anchor.linkClass.getOr('') }; }; - var makeDialog = function (settings, onSubmit, editor) { - var urlInput = [{ + const makeDialog = (settings, onSubmit, editor) => { + const urlInput = [{ name: 'url', type: 'urlinput', filetype: 'file', label: 'URL' }]; - var displayText = settings.anchor.text.map(function () { - return { - name: 'text', - type: 'input', - label: 'Text to display' - }; - }).toArray(); - var titleText = settings.flags.titleEnabled ? [{ + const displayText = settings.anchor.text.map(() => ({ + name: 'text', + type: 'input', + label: 'Text to display' + })).toArray(); + const titleText = settings.flags.titleEnabled ? [{ name: 'title', type: 'input', label: 'Title' }] : []; - var defaultTarget = Optional.from(getDefaultLinkTarget(editor)); - var initialData = getInitialData(settings, defaultTarget); - var catalogs = settings.catalogs; - var dialogDelta = DialogChanges.init(initialData, catalogs); - var body = { + const defaultTarget = Optional.from(getDefaultLinkTarget(editor)); + const initialData = getInitialData(settings, defaultTarget); + const catalogs = settings.catalogs; + const dialogDelta = DialogChanges.init(initialData, catalogs); + const body = { type: 'panel', items: flatten([ urlInput, @@ -985,7 +937,7 @@ return { title: 'Insert/Edit Link', size: 'normal', - body: body, + body, buttons: [ { type: 'cancel', @@ -999,55 +951,62 @@ primary: true } ], - initialData: initialData, - onChange: function (api, _a) { - var name = _a.name; - dialogDelta.onChange(api.getData, { name: name }).each(function (newData) { + initialData, + onChange: (api, {name}) => { + dialogDelta.onChange(api.getData, { name }).each(newData => { api.setData(newData); }); }, - onSubmit: onSubmit + onSubmit }; }; - var open$1 = function (editor) { - var data = collectData(editor); - data.then(function (info) { - var onSubmit = handleSubmit(editor, info); + const open$1 = editor => { + const data = collectData(editor); + data.then(info => { + const onSubmit = handleSubmit(editor, info); return makeDialog(info, onSubmit, editor); - }).then(function (spec) { + }).then(spec => { editor.windowManager.open(spec); }); }; - var appendClickRemove = function (link, evt) { + const register = editor => { + editor.addCommand('mceLink', (_ui, value) => { + if ((value === null || value === void 0 ? void 0 : value.dialog) === true || !useQuickLink(editor)) { + open$1(editor); + } else { + editor.dispatch('contexttoolbar-show', { toolbarKey: 'quicklink' }); + } + }); + }; + + var global = tinymce.util.Tools.resolve('tinymce.util.VK'); + + const appendClickRemove = (link, evt) => { document.body.appendChild(link); link.dispatchEvent(evt); document.body.removeChild(link); }; - var open = function (url) { - var link = document.createElement('a'); + const open = url => { + const link = document.createElement('a'); link.target = '_blank'; link.href = url; link.rel = 'noreferrer noopener'; - var evt = document.createEvent('MouseEvents'); + const evt = document.createEvent('MouseEvents'); evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); appendClickRemove(link, evt); }; - var getLink = function (editor, elm) { - return editor.dom.getParent(elm, 'a[href]'); - }; - var getSelectedLink = function (editor) { - return getLink(editor, editor.selection.getStart()); - }; - var hasOnlyAltModifier = function (e) { + const getLink = (editor, elm) => editor.dom.getParent(elm, 'a[href]'); + const getSelectedLink = editor => getLink(editor, editor.selection.getStart()); + const hasOnlyAltModifier = e => { return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false; }; - var gotoLink = function (editor, a) { + const gotoLink = (editor, a) => { if (a) { - var href = getHref(a); + const href = getHref(a); if (/^#/.test(href)) { - var targetEl = editor.$(href); + const targetEl = editor.dom.select(href); if (targetEl.length) { editor.selection.scrollIntoView(targetEl[0], true); } @@ -1056,153 +1015,143 @@ } } }; - var openDialog = function (editor) { - return function () { - open$1(editor); - }; + const openDialog = editor => () => { + editor.execCommand('mceLink', false, { dialog: true }); }; - var gotoSelectedLink = function (editor) { - return function () { - gotoLink(editor, getSelectedLink(editor)); - }; + const gotoSelectedLink = editor => () => { + gotoLink(editor, getSelectedLink(editor)); }; - var setupGotoLinks = function (editor) { - editor.on('click', function (e) { - var link = getLink(editor, e.target); - if (link && global$6.metaKeyPressed(e)) { + const setupGotoLinks = editor => { + editor.on('click', e => { + const link = getLink(editor, e.target); + if (link && global.metaKeyPressed(e)) { e.preventDefault(); gotoLink(editor, link); } }); - editor.on('keydown', function (e) { - var link = getSelectedLink(editor); - if (link && e.keyCode === 13 && hasOnlyAltModifier(e)) { - e.preventDefault(); - gotoLink(editor, link); + editor.on('keydown', e => { + if (!e.isDefaultPrevented() && e.keyCode === 13 && hasOnlyAltModifier(e)) { + const link = getSelectedLink(editor); + if (link) { + e.preventDefault(); + gotoLink(editor, link); + } } }); }; - var toggleState = function (editor, toggler) { + const toggleState = (editor, toggler) => { editor.on('NodeChange', toggler); - return function () { - return editor.off('NodeChange', toggler); - }; + return () => editor.off('NodeChange', toggler); }; - var toggleActiveState = function (editor) { - return function (api) { - var updateState = function () { - return api.setActive(!editor.mode.isReadOnly() && getAnchorElement(editor, editor.selection.getNode()) !== null); - }; - updateState(); - return toggleState(editor, updateState); + const toggleLinkState = editor => api => { + const updateState = () => { + api.setActive(!editor.mode.isReadOnly() && isInAnchor(editor, editor.selection.getNode())); + api.setEnabled(editor.selection.isEditable()); }; + updateState(); + return toggleState(editor, updateState); }; - var toggleEnabledState = function (editor) { - return function (api) { - var updateState = function () { - return api.setDisabled(getAnchorElement(editor, editor.selection.getNode()) === null); - }; - updateState(); - return toggleState(editor, updateState); + const toggleLinkMenuState = editor => api => { + const updateState = () => { + api.setEnabled(editor.selection.isEditable()); }; - }; - var toggleUnlinkState = function (editor) { - return function (api) { - var hasLinks$1 = function (parents) { - return hasLinks(parents) || hasLinksInSelection(editor.selection.getRng()); - }; - var parents = editor.dom.getParents(editor.selection.getStart()); - api.setDisabled(!hasLinks$1(parents)); - return toggleState(editor, function (e) { - return api.setDisabled(!hasLinks$1(e.parents)); - }); + updateState(); + return toggleState(editor, updateState); + }; + const hasExactlyOneLinkInSelection = editor => { + const links = editor.selection.isCollapsed() ? getLinks$1(editor.dom.getParents(editor.selection.getStart())) : getLinksInSelection(editor.selection.getRng()); + return links.length === 1; + }; + const toggleGotoLinkState = editor => api => { + const updateState = () => api.setEnabled(hasExactlyOneLinkInSelection(editor)); + updateState(); + return toggleState(editor, updateState); + }; + const toggleUnlinkState = editor => api => { + const hasLinks$1 = parents => hasLinks(parents) || hasLinksInSelection(editor.selection.getRng()); + const parents = editor.dom.getParents(editor.selection.getStart()); + const updateEnabled = parents => { + api.setEnabled(hasLinks$1(parents) && editor.selection.isEditable()); }; + updateEnabled(parents); + return toggleState(editor, e => updateEnabled(e.parents)); }; - var register = function (editor) { - editor.addCommand('mceLink', function () { - if (useQuickLink(editor)) { - editor.fire('contexttoolbar-show', { toolbarKey: 'quicklink' }); - } else { - openDialog(editor)(); - } - }); - }; - - var setup = function (editor) { - editor.addShortcut('Meta+K', '', function () { + const setup = editor => { + editor.addShortcut('Meta+K', '', () => { editor.execCommand('mceLink'); }); }; - var setupButtons = function (editor) { + const setupButtons = editor => { editor.ui.registry.addToggleButton('link', { icon: 'link', tooltip: 'Insert/edit link', onAction: openDialog(editor), - onSetup: toggleActiveState(editor) + onSetup: toggleLinkState(editor) }); editor.ui.registry.addButton('openlink', { icon: 'new-tab', tooltip: 'Open link', onAction: gotoSelectedLink(editor), - onSetup: toggleEnabledState(editor) + onSetup: toggleGotoLinkState(editor) }); editor.ui.registry.addButton('unlink', { icon: 'unlink', tooltip: 'Remove link', - onAction: function () { - return unlink(editor); - }, + onAction: () => unlink(editor), onSetup: toggleUnlinkState(editor) }); }; - var setupMenuItems = function (editor) { + const setupMenuItems = editor => { editor.ui.registry.addMenuItem('openlink', { text: 'Open link', icon: 'new-tab', onAction: gotoSelectedLink(editor), - onSetup: toggleEnabledState(editor) + onSetup: toggleGotoLinkState(editor) }); editor.ui.registry.addMenuItem('link', { icon: 'link', text: 'Link...', shortcut: 'Meta+K', + onSetup: toggleLinkMenuState(editor), onAction: openDialog(editor) }); editor.ui.registry.addMenuItem('unlink', { icon: 'unlink', text: 'Remove link', - onAction: function () { - return unlink(editor); - }, + onAction: () => unlink(editor), onSetup: toggleUnlinkState(editor) }); }; - var setupContextMenu = function (editor) { - var inLink = 'link unlink openlink'; - var noLink = 'link'; + const setupContextMenu = editor => { + const inLink = 'link unlink openlink'; + const noLink = 'link'; editor.ui.registry.addContextMenu('link', { - update: function (element) { + update: element => { + const isEditable = editor.dom.isEditable(element); + if (!isEditable) { + return ''; + } return hasLinks(editor.dom.getParents(element, 'a')) ? inLink : noLink; } }); }; - var setupContextToolbars = function (editor) { - var collapseSelectionToEnd = function (editor) { + const setupContextToolbars = editor => { + const collapseSelectionToEnd = editor => { editor.selection.collapse(false); }; - var onSetupLink = function (buttonApi) { - var node = editor.selection.getNode(); - buttonApi.setDisabled(!getAnchorElement(editor, node)); + const onSetupLink = buttonApi => { + const node = editor.selection.getNode(); + buttonApi.setEnabled(isInAnchor(editor, node)); return noop; }; - var getLinkText = function (value) { - var anchor = getAnchorElement(editor); - var onlyText = isOnlyTextSelected(editor); - if (!anchor && onlyText) { - var text = getAnchorText(editor.selection, anchor); - return Optional.some(text.length > 0 ? text : value); + const getLinkText = value => { + const anchor = getAnchorElement(editor); + const onlyText = isOnlyTextSelected(editor); + if (anchor.isNone() && onlyText) { + const text = getAnchorText(editor.selection, anchor); + return someIf(text.length === 0, value); } else { return Optional.none(); } @@ -1212,15 +1161,13 @@ type: 'contextformtogglebutton', icon: 'link', tooltip: 'Link', - onSetup: toggleActiveState(editor) + onSetup: toggleLinkState(editor) }, label: 'Link', - predicate: function (node) { - return !!getAnchorElement(editor, node) && hasContextToolbar(editor); - }, - initValue: function () { - var elm = getAnchorElement(editor); - return !!elm ? getHref(elm) : ''; + predicate: node => hasContextToolbar(editor) && isInAnchor(editor, node), + initValue: () => { + const elm = getAnchorElement(editor); + return elm.fold(constant(''), getHref); }, commands: [ { @@ -1228,21 +1175,21 @@ icon: 'link', tooltip: 'Link', primary: true, - onSetup: function (buttonApi) { - var node = editor.selection.getNode(); - buttonApi.setActive(!!getAnchorElement(editor, node)); - return toggleActiveState(editor)(buttonApi); + onSetup: buttonApi => { + const node = editor.selection.getNode(); + buttonApi.setActive(isInAnchor(editor, node)); + return toggleLinkState(editor)(buttonApi); }, - onAction: function (formApi) { - var value = formApi.getValue(); - var text = getLinkText(value); - var attachState = { + onAction: formApi => { + const value = formApi.getValue(); + const text = getLinkText(value); + const attachState = { href: value, attach: noop }; link(editor, attachState, { href: value, - text: text, + text, title: Optional.none(), rel: Optional.none(), target: Optional.none(), @@ -1257,7 +1204,7 @@ icon: 'unlink', tooltip: 'Remove link', onSetup: onSetupLink, - onAction: function (formApi) { + onAction: formApi => { unlink(editor); formApi.hide(); } @@ -1267,7 +1214,7 @@ icon: 'new-tab', tooltip: 'Open link', onSetup: onSetupLink, - onAction: function (formApi) { + onAction: formApi => { gotoSelectedLink(editor)(); formApi.hide(); } @@ -1276,8 +1223,9 @@ }); }; - function Plugin () { - global$7.add('link', function (editor) { + var Plugin = () => { + global$5.add('link', editor => { + register$1(editor); setupButtons(editor); setupMenuItems(editor); setupContextMenu(editor); @@ -1286,8 +1234,8 @@ register(editor); setup(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/link/plugin.min.js b/public/js/tinymce/plugins/link/plugin.min.js index fc3096224..57e8a8342 100644 --- a/public/js/tinymce/plugins/link/plugin.min.js +++ b/public/js/tinymce/plugins/link/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function t(r){return function(t){return e=typeof(n=t),(null===n?"null":"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e)===r;var n,e}}function n(n){return function(t){return typeof t===n}}function h(){}function i(t){return function(){return t}}function e(t){return t}function r(t,n){return t===n}function o(){return v}var u,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.VK"),l=t("string"),d=t("array"),p=function(t){return u===t},f=n("boolean"),s=n("function"),m=i(!1),g=i(!(u=null)),v={fold:function(t,n){return t()},isSome:m,isNone:g,getOr:e,getOrThunk:y,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:y,map:o,each:h,bind:o,exists:m,forall:g,filter:function(){return v},toArray:function(){return[]},toString:i("none()")};function y(t){return t()}function k(t,o,i){return function(t){for(var n,e=0,r=t.length;et=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||(null===(l=o.constructor)||void 0===l?void 0:l.name)===r.name)?"string":t;var n,o,r,l})(t)===e,n=e=>t=>typeof t===e,o=t("string"),r=t("object"),l=t("array"),a=(null,e=>null===e);const i=n("boolean"),s=e=>!(e=>null==e)(e),c=n("function"),u=(e,t)=>{if(l(e)){for(let n=0,o=e.length;n{},d=(e,t)=>e===t;class m{constructor(e,t){this.tag=e,this.value=t}static some(e){return new m(!0,e)}static none(){return m.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?m.some(e(this.value)):m.none()}bind(e){return this.tag?e(this.value):m.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:m.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return s(e)?m.some(e):m.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}m.singletonNone=new m(!1);const h=Array.prototype.indexOf,f=Array.prototype.push,p=e=>{const t=[];for(let n=0,o=e.length;n{for(let n=0;ne.exists((e=>n(e,t))),y=e=>{const t=[],n=e=>{t.push(e)};for(let t=0;te?m.some(t):m.none(),b=e=>t=>t.options.get(e),_=b("link_assume_external_targets"),w=b("link_context_toolbar"),C=b("link_list"),O=b("link_default_target"),N=b("link_default_protocol"),A=b("link_target_list"),S=b("link_rel_list"),E=b("link_class_list"),T=b("link_title"),R=b("allow_unsafe_link_target"),P=b("link_quicklink");var L=tinymce.util.Tools.resolve("tinymce.util.Tools");const M=e=>o(e.value)?e.value:"",D=(e,t)=>{const n=[];return L.each(e,(e=>{const r=(e=>o(e.text)?e.text:o(e.title)?e.title:"")(e);if(void 0!==e.menu){const o=D(e.menu,t);n.push({text:r,items:o})}else{const o=t(e);n.push({text:r,value:o})}})),n},B=(e=M)=>t=>m.from(t).map((t=>D(t,e))),I=e=>B(M)(e),j=B,K=(e,t)=>n=>({name:e,type:"listbox",label:t,items:n}),U=M,q=Object.keys,F=Object.hasOwnProperty,V=(e,t)=>F.call(e,t);var $=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),z=tinymce.util.Tools.resolve("tinymce.util.URI");const G=e=>s(e)&&"a"===e.nodeName.toLowerCase(),H=e=>G(e)&&!!Q(e),J=(e,t)=>{if(e.collapsed)return[];{const n=e.cloneContents(),o=n.firstChild,r=new $(o,n),l=[];let a=o;do{t(a)&&l.push(a)}while(a=r.next());return l}},W=e=>/^\w+:/i.test(e),Q=e=>{var t,n;return null!==(n=null!==(t=e.getAttribute("data-mce-href"))&&void 0!==t?t:e.getAttribute("href"))&&void 0!==n?n:""},X=(e,t)=>{const n=["noopener"],o=e?e.split(/\s+/):[],r=e=>e.filter((e=>-1===L.inArray(n,e))),l=t?(e=>(e=r(e)).length>0?e.concat(n):n)(o):r(o);return l.length>0?(e=>L.trim(e.sort().join(" ")))(l):""},Y=(e,t)=>(t=t||te(e.selection.getRng())[0]||e.selection.getNode(),le(t)?m.from(e.dom.select("a[href]",t)[0]):m.from(e.dom.getParent(t,"a[href]"))),Z=(e,t)=>Y(e,t).isSome(),ee=(e,t)=>t.fold((()=>e.getContent({format:"text"})),(e=>e.innerText||e.textContent||"")).replace(/\uFEFF/g,""),te=e=>J(e,H),ne=e=>L.grep(e,H),oe=e=>ne(e).length>0,re=e=>{const t=e.schema.getTextInlineElements();if(Y(e).exists((e=>e.hasAttribute("data-mce-block"))))return!1;const n=e.selection.getRng();return!!n.collapsed||0===J(n,(e=>1===e.nodeType&&!G(e)&&!V(t,e.nodeName.toLowerCase()))).length},le=e=>s(e)&&"FIGURE"===e.nodeName&&/\bimage\b/i.test(e.className),ae=(e,t,n)=>{const o=e.selection.getNode(),r=Y(e,o),l=((e,t)=>{const n={...t};if(0===S(e).length&&!R(e)){const e=X(n.rel,"_blank"===n.target);n.rel=e||null}return m.from(n.target).isNone()&&!1===A(e)&&(n.target=O(e)),n.href=((e,t)=>"http"!==t&&"https"!==t||W(e)?e:t+"://"+e)(n.href,_(e)),n})(e,(e=>{return t=["title","rel","class","target"],n=(t,n)=>(e[n].each((e=>{t[n]=e.length>0?e:null})),t),o={href:e.href},((e,t)=>{for(let n=0,o=e.length;n{o=n(o,e)})),o;var t,n,o})(n));e.undoManager.transact((()=>{n.href===t.href&&t.attach(),r.fold((()=>{((e,t,n,o)=>{const r=e.dom;le(t)?ge(r,t,o):n.fold((()=>{e.execCommand("mceInsertLink",!1,o)}),(t=>{e.insertContent(r.createHTML("a",o,r.encode(t)))}))})(e,o,n.text,l)}),(t=>{e.focus(),((e,t,n,o)=>{n.each((e=>{V(t,"innerText")?t.innerText=e:t.textContent=e})),e.dom.setAttribs(t,o),e.selection.select(t)})(e,t,n.text,l)}))}))},ie=e=>{const{class:t,href:n,rel:o,target:r,text:l,title:i}=e;return((e,t)=>{const n={};var o;return((e,t,n,o)=>{((e,t)=>{const n=q(e);for(let o=0,r=n.length;o{(t(e,r)?n:o)(e,r)}))})(e,((e,t)=>!1===a(e)),(o=n,(e,t)=>{o[t]=e}),g),n})({class:t.getOrNull(),href:n,rel:o.getOrNull(),target:r.getOrNull(),text:l.getOrNull(),title:i.getOrNull()})},se=(e,t,n)=>{const o=((e,t)=>{const n=e.options.get,o={allow_html_data_urls:n("allow_html_data_urls"),allow_script_urls:n("allow_script_urls"),allow_svg_data_urls:n("allow_svg_data_urls")},r=t.href;return{...t,href:z.isDomSafe(r,"a",o)?r:""}})(e,n);e.hasPlugin("rtc",!0)?e.execCommand("createlink",!1,ie(o)):ae(e,t,o)},ce=e=>{e.hasPlugin("rtc",!0)?e.execCommand("unlink"):(e=>{e.undoManager.transact((()=>{const t=e.selection.getNode();le(t)?ue(e,t):(e=>{const t=e.dom,n=e.selection,o=n.getBookmark(),r=n.getRng().cloneRange(),l=t.getParent(r.startContainer,"a[href]",e.getBody()),a=t.getParent(r.endContainer,"a[href]",e.getBody());l&&r.setStartBefore(l),a&&r.setEndAfter(a),n.setRng(r),e.execCommand("unlink"),n.moveToBookmark(o)})(e),e.focus()}))})(e)},ue=(e,t)=>{var n;const o=e.dom.select("img",t)[0];if(o){const r=e.dom.getParents(o,"a[href]",t)[0];r&&(null===(n=r.parentNode)||void 0===n||n.insertBefore(o,r),e.dom.remove(r))}},ge=(e,t,n)=>{var o;const r=e.select("img",t)[0];if(r){const t=e.create("a",n);null===(o=r.parentNode)||void 0===o||o.insertBefore(t,r),t.appendChild(r)}},de=(e,t)=>k(t,(t=>(e=>{return V(t=e,n="items")&&void 0!==t[n]&&null!==t[n];var t,n})(t)?de(e,t.items):x(t.value===e,t))),me=(e,t)=>{const n={text:e.text,title:e.title},o=(e,o)=>{const r=(l=t,a=o,"link"===a?l.link:"anchor"===a?l.anchor:m.none()).getOr([]);var l,a;return((e,t,n,o)=>{const r=o[t],l=e.length>0;return void 0!==r?de(r,n).map((t=>({url:{value:t.value,meta:{text:l?e:t.text,attach:g}},text:l?e:t.text}))):m.none()})(n.text,o,r,e)};return{onChange:(e,t)=>{const r=t.name;return"url"===r?(e=>{const t=(o=e.url,x(n.text.length<=0,m.from(null===(r=o.meta)||void 0===r?void 0:r.text).getOr(o.value)));var o,r;const l=(e=>{var t;return x(n.title.length<=0,m.from(null===(t=e.meta)||void 0===t?void 0:t.title).getOr(""))})(e.url);return t.isSome()||l.isSome()?m.some({...t.map((e=>({text:e}))).getOr({}),...l.map((e=>({title:e}))).getOr({})}):m.none()})(e()):((e,t)=>h.call(e,t))(["anchor","link"],r)>-1?o(e(),r):"text"===r||"title"===r?(n[r]=e()[r],m.none()):m.none()}}};var he=tinymce.util.Tools.resolve("tinymce.util.Delay");const fe=e=>{const t=e.href;return t.indexOf("@")>0&&-1===t.indexOf("/")&&-1===t.indexOf("mailto:")?m.some({message:"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",preprocess:e=>({...e,href:"mailto:"+t})}):m.none()},pe=(e,t)=>n=>{const o=n.href;return 1===e&&!W(o)||0===e&&/^\s*www(\.|\d\.)/i.test(o)?m.some({message:`The URL you entered seems to be an external link. Do you want to add the required ${t}:// prefix?`,preprocess:e=>({...e,href:t+"://"+o})}):m.none()},ke=e=>{const t=e.dom.select("a:not([href])"),n=p(((e,t)=>{const n=e.length,o=new Array(n);for(let r=0;r{const t=e.name||e.id;return t?[{text:t,value:"#"+t}]:[]})));return n.length>0?m.some([{text:"None",value:""}].concat(n)):m.none()},ve=e=>{const t=E(e);return t.length>0?I(t):m.none()},ye=e=>{try{return m.some(JSON.parse(e))}catch(e){return m.none()}},xe=(e,t)=>{const n=S(e);if(n.length>0){const o=v(t,"_blank"),r=e=>X(U(e),o);return(!1===R(e)?j(r):I)(n)}return m.none()},be=[{text:"Current window",value:""},{text:"New window",value:"_blank"}],_e=e=>{const t=A(e);return l(t)?I(t).orThunk((()=>m.some(be))):!1===t?m.none():m.some(be)},we=(e,t,n)=>{const o=e.getAttrib(t,n);return null!==o&&o.length>0?m.some(o):m.none()},Ce=(e,t)=>(e=>{const t=t=>e.convertURL(t.value||t.url||"","href"),n=C(e);return new Promise((e=>{o(n)?fetch(n).then((e=>e.ok?e.text().then(ye):Promise.reject())).then(e,(()=>e(m.none()))):c(n)?n((t=>e(m.some(t)))):e(m.from(n))})).then((e=>e.bind(j(t)).map((e=>e.length>0?[{text:"None",value:""}].concat(e):e))))})(e).then((n=>{const o=((e,t)=>{const n=e.dom,o=re(e)?m.some(ee(e.selection,t)):m.none(),r=t.bind((e=>m.from(n.getAttrib(e,"href")))),l=t.bind((e=>m.from(n.getAttrib(e,"target")))),a=t.bind((e=>we(n,e,"rel"))),i=t.bind((e=>we(n,e,"class")));return{url:r,text:o,title:t.bind((e=>we(n,e,"title"))),target:l,rel:a,linkClass:i}})(e,t);return{anchor:o,catalogs:{targets:_e(e),rels:xe(e,o.target),classes:ve(e),anchor:ke(e),link:n},optNode:t,flags:{titleEnabled:T(e)}}})),Oe=e=>{const t=(e=>{const t=Y(e);return Ce(e,t)})(e);t.then((t=>{const n=((e,t)=>n=>{const o=n.getData();if(!o.url.value)return ce(e),void n.close();const r=e=>m.from(o[e]).filter((n=>!v(t.anchor[e],n))),l={href:o.url.value,text:r("text"),target:r("target"),rel:r("rel"),class:r("linkClass"),title:r("title")},a={href:o.url.value,attach:void 0!==o.url.meta&&o.url.meta.attach?o.url.meta.attach:g};((e,t)=>k([fe,pe(_(e),N(e))],(e=>e(t))).fold((()=>Promise.resolve(t)),(n=>new Promise((o=>{((e,t,n)=>{const o=e.selection.getRng();he.setEditorTimeout(e,(()=>{e.windowManager.confirm(t,(t=>{e.selection.setRng(o),n(t)}))}))})(e,n.message,(e=>{o(e?n.preprocess(t):t)}))})))))(e,l).then((t=>{se(e,a,t)})),n.close()})(e,t);return((e,t,n)=>{const o=e.anchor.text.map((()=>({name:"text",type:"input",label:"Text to display"}))).toArray(),r=e.flags.titleEnabled?[{name:"title",type:"input",label:"Title"}]:[],l=((e,t)=>{const n=e.anchor,o=n.url.getOr("");return{url:{value:o,meta:{original:{value:o}}},text:n.text.getOr(""),title:n.title.getOr(""),anchor:o,link:o,rel:n.rel.getOr(""),target:n.target.or(t).getOr(""),linkClass:n.linkClass.getOr("")}})(e,m.from(O(n))),a=e.catalogs,i=me(l,a);return{title:"Insert/Edit Link",size:"normal",body:{type:"panel",items:p([[{name:"url",type:"urlinput",filetype:"file",label:"URL"}],o,r,y([a.anchor.map(K("anchor","Anchors")),a.rels.map(K("rel","Rel")),a.targets.map(K("target","Open link in...")),a.link.map(K("link","Link list")),a.classes.map(K("linkClass","Class"))])])},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:l,onChange:(e,{name:t})=>{i.onChange(e.getData,{name:t}).each((t=>{e.setData(t)}))},onSubmit:t}})(t,n,e)})).then((t=>{e.windowManager.open(t)}))};var Ne=tinymce.util.Tools.resolve("tinymce.util.VK");const Ae=(e,t)=>e.dom.getParent(t,"a[href]"),Se=e=>Ae(e,e.selection.getStart()),Ee=(e,t)=>{if(t){const n=Q(t);if(/^#/.test(n)){const t=e.dom.select(n);t.length&&e.selection.scrollIntoView(t[0],!0)}else(e=>{const t=document.createElement("a");t.target="_blank",t.href=e,t.rel="noreferrer noopener";const n=document.createEvent("MouseEvents");n.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),((e,t)=>{document.body.appendChild(e),e.dispatchEvent(t),document.body.removeChild(e)})(t,n)})(t.href)}},Te=e=>()=>{e.execCommand("mceLink",!1,{dialog:!0})},Re=e=>()=>{Ee(e,Se(e))},Pe=(e,t)=>(e.on("NodeChange",t),()=>e.off("NodeChange",t)),Le=e=>t=>{const n=()=>{t.setActive(!e.mode.isReadOnly()&&Z(e,e.selection.getNode())),t.setEnabled(e.selection.isEditable())};return n(),Pe(e,n)},Me=e=>t=>{const n=()=>{t.setEnabled(e.selection.isEditable())};return n(),Pe(e,n)},De=e=>t=>{const n=()=>t.setEnabled((e=>1===(e.selection.isCollapsed()?ne(e.dom.getParents(e.selection.getStart())):te(e.selection.getRng())).length)(e));return n(),Pe(e,n)},Be=e=>t=>{const n=e.dom.getParents(e.selection.getStart()),o=n=>{t.setEnabled((t=>{return oe(t)||(n=e.selection.getRng(),te(n).length>0);var n})(n)&&e.selection.isEditable())};return o(n),Pe(e,(e=>o(e.parents)))};e.add("link",(e=>{(e=>{const t=e.options.register;t("link_assume_external_targets",{processor:e=>{const t=o(e)||i(e);return t?!0===e?{value:1,valid:t}:"http"===e||"https"===e?{value:e,valid:t}:{value:0,valid:t}:{valid:!1,message:"Must be a string or a boolean."}},default:!1}),t("link_context_toolbar",{processor:"boolean",default:!1}),t("link_list",{processor:e=>o(e)||c(e)||u(e,r)}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"}),t("link_target_list",{processor:e=>i(e)||u(e,r),default:!0}),t("link_rel_list",{processor:"object[]",default:[]}),t("link_class_list",{processor:"object[]",default:[]}),t("link_title",{processor:"boolean",default:!0}),t("allow_unsafe_link_target",{processor:"boolean",default:!1}),t("link_quicklink",{processor:"boolean",default:!1})})(e),(e=>{e.ui.registry.addToggleButton("link",{icon:"link",tooltip:"Insert/edit link",onAction:Te(e),onSetup:Le(e)}),e.ui.registry.addButton("openlink",{icon:"new-tab",tooltip:"Open link",onAction:Re(e),onSetup:De(e)}),e.ui.registry.addButton("unlink",{icon:"unlink",tooltip:"Remove link",onAction:()=>ce(e),onSetup:Be(e)})})(e),(e=>{e.ui.registry.addMenuItem("openlink",{text:"Open link",icon:"new-tab",onAction:Re(e),onSetup:De(e)}),e.ui.registry.addMenuItem("link",{icon:"link",text:"Link...",shortcut:"Meta+K",onSetup:Me(e),onAction:Te(e)}),e.ui.registry.addMenuItem("unlink",{icon:"unlink",text:"Remove link",onAction:()=>ce(e),onSetup:Be(e)})})(e),(e=>{e.ui.registry.addContextMenu("link",{update:t=>e.dom.isEditable(t)?oe(e.dom.getParents(t,"a"))?"link unlink openlink":"link":""})})(e),(e=>{const t=t=>{const n=e.selection.getNode();return t.setEnabled(Z(e,n)),g};e.ui.registry.addContextForm("quicklink",{launch:{type:"contextformtogglebutton",icon:"link",tooltip:"Link",onSetup:Le(e)},label:"Link",predicate:t=>w(e)&&Z(e,t),initValue:()=>Y(e).fold((()=>""),Q),commands:[{type:"contextformtogglebutton",icon:"link",tooltip:"Link",primary:!0,onSetup:t=>{const n=e.selection.getNode();return t.setActive(Z(e,n)),Le(e)(t)},onAction:t=>{const n=t.getValue(),o=(t=>{const n=Y(e),o=re(e);if(n.isNone()&&o){const o=ee(e.selection,n);return x(0===o.length,t)}return m.none()})(n);se(e,{href:n,attach:g},{href:n,text:o,title:m.none(),rel:m.none(),target:m.none(),class:m.none()}),(e=>{e.selection.collapse(!1)})(e),t.hide()}},{type:"contextformbutton",icon:"unlink",tooltip:"Remove link",onSetup:t,onAction:t=>{ce(e),t.hide()}},{type:"contextformbutton",icon:"new-tab",tooltip:"Open link",onSetup:t,onAction:t=>{Re(e)(),t.hide()}}]})})(e),(e=>{e.on("click",(t=>{const n=Ae(e,t.target);n&&Ne.metaKeyPressed(t)&&(t.preventDefault(),Ee(e,n))})),e.on("keydown",(t=>{if(!t.isDefaultPrevented()&&13===t.keyCode&&(e=>!0===e.altKey&&!1===e.shiftKey&&!1===e.ctrlKey&&!1===e.metaKey)(t)){const n=Se(e);n&&(t.preventDefault(),Ee(e,n))}}))})(e),(e=>{e.addCommand("mceLink",((t,n)=>{!0!==(null==n?void 0:n.dialog)&&P(e)?e.dispatch("contexttoolbar-show",{toolbarKey:"quicklink"}):Oe(e)}))})(e),(e=>{e.addShortcut("Meta+K","",(()=>{e.execCommand("mceLink")}))})(e)}))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/lists/plugin.js b/public/js/tinymce/plugins/lists/plugin.js index 398070ba6..262ace84a 100644 --- a/public/js/tinymce/plugins/lists/plugin.js +++ b/public/js/tinymce/plugins/lists/plugin.js @@ -1,192 +1,198 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; var global$7 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var typeOf = function (x) { - var t = typeof x; + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } + }; + const typeOf = x => { + const t = typeof x; if (x === null) { return 'null'; - } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + } else if (t === 'object' && Array.isArray(x)) { return 'array'; - } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { return 'string'; } else { return t; } }; - var isType$1 = function (type) { - return function (value) { - return typeOf(value) === type; - }; - }; - var isSimpleType = function (type) { - return function (value) { - return typeof value === type; - }; - }; - var isString = isType$1('string'); - var isObject = isType$1('object'); - var isArray = isType$1('array'); - var isBoolean = isSimpleType('boolean'); - var isFunction = isSimpleType('function'); - var isNumber = isSimpleType('number'); + const isType$1 = type => value => typeOf(value) === type; + const isSimpleType = type => value => typeof value === type; + const isString = isType$1('string'); + const isObject = isType$1('object'); + const isArray = isType$1('array'); + const isBoolean = isSimpleType('boolean'); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); + const isFunction = isSimpleType('function'); + const isNumber = isSimpleType('number'); - var noop = function () { + const noop = () => { }; - var constant = function (value) { - return function () { + const constant = value => { + return () => { return value; }; }; - var identity = function (x) { - return x; - }; - var tripleEquals = function (a, b) { + const tripleEquals = (a, b) => { return a === b; }; - var not = function (f) { - return function (t) { - return !f(t); - }; - }; - var never = constant(false); - var always = constant(true); + const not = f => t => !f(t); + const never = constant(false); - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); + + const nativeSlice = Array.prototype.slice; + const nativeIndexOf = Array.prototype.indexOf; + const nativePush = Array.prototype.push; + const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t); + const contains$1 = (xs, x) => rawIndexOf(xs, x) > -1; + const exists = (xs, pred) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + if (pred(x, i)) { + return true; + } + } + return false; }; - - var nativeSlice = Array.prototype.slice; - var nativePush = Array.prototype.push; - var map = function (xs, f) { - var len = xs.length; - var r = new Array(len); - for (var i = 0; i < len; i++) { - var x = xs[i]; + const map = (xs, f) => { + const len = xs.length; + const r = new Array(len); + for (let i = 0; i < len; i++) { + const x = xs[i]; r[i] = f(x, i); } return r; }; - var each$1 = function (xs, f) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const each$1 = (xs, f) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; f(x, i); } }; - var filter$1 = function (xs, pred) { - var r = []; - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const filter$1 = (xs, pred) => { + const r = []; + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; if (pred(x, i)) { r.push(x); } } return r; }; - var groupBy = function (xs, f) { + const groupBy = (xs, f) => { if (xs.length === 0) { return []; } else { - var wasType = f(xs[0]); - var r = []; - var group = []; - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; - var type = f(x); + let wasType = f(xs[0]); + const r = []; + let group = []; + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + const type = f(x); if (type !== wasType) { r.push(group); group = []; @@ -200,15 +206,15 @@ return r; } }; - var foldl = function (xs, f, acc) { - each$1(xs, function (x, i) { + const foldl = (xs, f, acc) => { + each$1(xs, (x, i) => { acc = f(acc, x, i); }); return acc; }; - var findUntil = function (xs, pred, until) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const findUntil = (xs, pred, until) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; if (pred(x, i)) { return Optional.some(x); } else if (until(x, i)) { @@ -217,12 +223,12 @@ } return Optional.none(); }; - var find$1 = function (xs, pred) { + const find = (xs, pred) => { return findUntil(xs, pred, never); }; - var flatten = function (xs) { - var r = []; - for (var i = 0, len = xs.length; i < len; ++i) { + const flatten = xs => { + const r = []; + for (let i = 0, len = xs.length; i < len; ++i) { if (!isArray(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } @@ -230,477 +236,75 @@ } return r; }; - var bind = function (xs, f) { - return flatten(map(xs, f)); - }; - var reverse = function (xs) { - var r = nativeSlice.call(xs, 0); + const bind = (xs, f) => flatten(map(xs, f)); + const reverse = xs => { + const r = nativeSlice.call(xs, 0); r.reverse(); return r; }; - var get$1 = function (xs, i) { - return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); - }; - var head = function (xs) { - return get$1(xs, 0); - }; - var last = function (xs) { - return get$1(xs, xs.length - 1); - }; - var findMap = function (arr, f) { - for (var i = 0; i < arr.length; i++) { - var r = f(arr[i], i); - if (r.isSome()) { - return r; - } - } - return Optional.none(); - }; - - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) - for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) - ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } - } - return to.concat(ar || Array.prototype.slice.call(from)); - } - - var cached = function (f) { - var called = false; - var r; - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - if (!called) { - called = true; - r = f.apply(null, args); - } - return r; - }; - }; - - var DeviceType = function (os, browser, userAgent, mediaMatch) { - var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; - var isiPhone = os.isiOS() && !isiPad; - var isMobile = os.isiOS() || os.isAndroid(); - var isTouch = isMobile || mediaMatch('(pointer:coarse)'); - var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); - var isPhone = isiPhone || isMobile && !isTablet; - var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; - var isDesktop = !isPhone && !isTablet && !iOSwebview; - return { - isiPad: constant(isiPad), - isiPhone: constant(isiPhone), - isTablet: constant(isTablet), - isPhone: constant(isPhone), - isTouch: constant(isTouch), - isAndroid: os.isAndroid, - isiOS: os.isiOS, - isWebView: constant(iOSwebview), - isDesktop: constant(isDesktop) - }; - }; - - var firstMatch = function (regexes, s) { - for (var i = 0; i < regexes.length; i++) { - var x = regexes[i]; - if (x.test(s)) { - return x; - } - } - return undefined; - }; - var find = function (regexes, agent) { - var r = firstMatch(regexes, agent); - if (!r) { - return { - major: 0, - minor: 0 - }; - } - var group = function (i) { - return Number(agent.replace(r, '$' + i)); - }; - return nu$2(group(1), group(2)); - }; - var detect$3 = function (versionRegexes, agent) { - var cleanedAgent = String(agent).toLowerCase(); - if (versionRegexes.length === 0) { - return unknown$2(); - } - return find(versionRegexes, cleanedAgent); - }; - var unknown$2 = function () { - return nu$2(0, 0); - }; - var nu$2 = function (major, minor) { - return { - major: major, - minor: minor - }; - }; - var Version = { - nu: nu$2, - detect: detect$3, - unknown: unknown$2 - }; - - var detectBrowser$1 = function (browsers, userAgentData) { - return findMap(userAgentData.brands, function (uaBrand) { - var lcBrand = uaBrand.brand.toLowerCase(); - return find$1(browsers, function (browser) { - var _a; - return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase()); - }).map(function (info) { - return { - current: info.name, - version: Version.nu(parseInt(uaBrand.version, 10), 0) - }; - }); - }); - }; - - var detect$2 = function (candidates, userAgent) { - var agent = String(userAgent).toLowerCase(); - return find$1(candidates, function (candidate) { - return candidate.search(agent); - }); - }; - var detectBrowser = function (browsers, userAgent) { - return detect$2(browsers, userAgent).map(function (browser) { - var version = Version.detect(browser.versionRegexes, userAgent); - return { - current: browser.name, - version: version - }; - }); - }; - var detectOs = function (oses, userAgent) { - return detect$2(oses, userAgent).map(function (os) { - var version = Version.detect(os.versionRegexes, userAgent); - return { - current: os.name, - version: version - }; - }); - }; - - var contains$1 = function (str, substr) { - return str.indexOf(substr) !== -1; - }; - var blank = function (r) { - return function (s) { - return s.replace(r, ''); - }; - }; - var trim = blank(/^\s+|\s+$/g); - var isNotEmpty = function (s) { - return s.length > 0; - }; - var isEmpty$1 = function (s) { - return !isNotEmpty(s); - }; - - var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; - var checkContains = function (target) { - return function (uastring) { - return contains$1(uastring, target); - }; - }; - var browsers = [ - { - name: 'Edge', - versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], - search: function (uastring) { - return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit'); - } - }, - { - name: 'Chrome', - brand: 'Chromium', - versionRegexes: [ - /.*?chrome\/([0-9]+)\.([0-9]+).*/, - normalVersionRegex - ], - search: function (uastring) { - return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe'); - } - }, - { - name: 'IE', - versionRegexes: [ - /.*?msie\ ?([0-9]+)\.([0-9]+).*/, - /.*?rv:([0-9]+)\.([0-9]+).*/ - ], - search: function (uastring) { - return contains$1(uastring, 'msie') || contains$1(uastring, 'trident'); - } - }, - { - name: 'Opera', - versionRegexes: [ - normalVersionRegex, - /.*?opera\/([0-9]+)\.([0-9]+).*/ - ], - search: checkContains('opera') - }, - { - name: 'Firefox', - versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], - search: checkContains('firefox') - }, - { - name: 'Safari', - versionRegexes: [ - normalVersionRegex, - /.*?cpu os ([0-9]+)_([0-9]+).*/ - ], - search: function (uastring) { - return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit'); + const get$1 = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + const head = xs => get$1(xs, 0); + const last = xs => get$1(xs, xs.length - 1); + const unique = (xs, comparator) => { + const r = []; + const isDuplicated = isFunction(comparator) ? x => exists(r, i => comparator(i, x)) : x => contains$1(r, x); + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; + if (!isDuplicated(x)) { + r.push(x); } } - ]; - var oses = [ - { - name: 'Windows', - search: checkContains('win'), - versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] - }, - { - name: 'iOS', - search: function (uastring) { - return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad'); - }, - versionRegexes: [ - /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, - /.*cpu os ([0-9]+)_([0-9]+).*/, - /.*cpu iphone os ([0-9]+)_([0-9]+).*/ - ] - }, - { - name: 'Android', - search: checkContains('android'), - versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] - }, - { - name: 'OSX', - search: checkContains('mac os x'), - versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] - }, - { - name: 'Linux', - search: checkContains('linux'), - versionRegexes: [] - }, - { - name: 'Solaris', - search: checkContains('sunos'), - versionRegexes: [] - }, - { - name: 'FreeBSD', - search: checkContains('freebsd'), - versionRegexes: [] - }, - { - name: 'ChromeOS', - search: checkContains('cros'), - versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] - } - ]; - var PlatformInfo = { - browsers: constant(browsers), - oses: constant(oses) - }; - - var edge = 'Edge'; - var chrome = 'Chrome'; - var ie = 'IE'; - var opera = 'Opera'; - var firefox = 'Firefox'; - var safari = 'Safari'; - var unknown$1 = function () { - return nu$1({ - current: undefined, - version: Version.unknown() - }); - }; - var nu$1 = function (info) { - var current = info.current; - var version = info.version; - var isBrowser = function (name) { - return function () { - return current === name; - }; - }; - return { - current: current, - version: version, - isEdge: isBrowser(edge), - isChrome: isBrowser(chrome), - isIE: isBrowser(ie), - isOpera: isBrowser(opera), - isFirefox: isBrowser(firefox), - isSafari: isBrowser(safari) - }; - }; - var Browser = { - unknown: unknown$1, - nu: nu$1, - edge: constant(edge), - chrome: constant(chrome), - ie: constant(ie), - opera: constant(opera), - firefox: constant(firefox), - safari: constant(safari) - }; - - var windows = 'Windows'; - var ios = 'iOS'; - var android = 'Android'; - var linux = 'Linux'; - var osx = 'OSX'; - var solaris = 'Solaris'; - var freebsd = 'FreeBSD'; - var chromeos = 'ChromeOS'; - var unknown = function () { - return nu({ - current: undefined, - version: Version.unknown() - }); - }; - var nu = function (info) { - var current = info.current; - var version = info.version; - var isOS = function (name) { - return function () { - return current === name; - }; - }; - return { - current: current, - version: version, - isWindows: isOS(windows), - isiOS: isOS(ios), - isAndroid: isOS(android), - isOSX: isOS(osx), - isLinux: isOS(linux), - isSolaris: isOS(solaris), - isFreeBSD: isOS(freebsd), - isChromeOS: isOS(chromeos) - }; - }; - var OperatingSystem = { - unknown: unknown, - nu: nu, - windows: constant(windows), - ios: constant(ios), - android: constant(android), - linux: constant(linux), - osx: constant(osx), - solaris: constant(solaris), - freebsd: constant(freebsd), - chromeos: constant(chromeos) - }; - - var detect$1 = function (userAgent, userAgentDataOpt, mediaMatch) { - var browsers = PlatformInfo.browsers(); - var oses = PlatformInfo.oses(); - var browser = userAgentDataOpt.bind(function (userAgentData) { - return detectBrowser$1(browsers, userAgentData); - }).orThunk(function () { - return detectBrowser(browsers, userAgent); - }).fold(Browser.unknown, Browser.nu); - var os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); - var deviceType = DeviceType(os, browser, userAgent, mediaMatch); - return { - browser: browser, - os: os, - deviceType: deviceType - }; - }; - var PlatformDetection = { detect: detect$1 }; - - var mediaMatch = function (query) { - return window.matchMedia(query).matches; - }; - var platform = cached(function () { - return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch); - }); - var detect = function () { - return platform(); + return r; }; - var compareDocumentPosition = function (a, b, match) { - return (a.compareDocumentPosition(b) & match) !== 0; - }; - var documentPositionContainedBy = function (a, b) { - return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY); - }; + const is$2 = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs)); + const equals = (lhs, rhs, comparator = tripleEquals) => lift2(lhs, rhs, comparator).getOr(lhs.isNone() && rhs.isNone()); + const lift2 = (oa, ob, f) => oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none(); - var ELEMENT = 1; + const ELEMENT = 1; - var fromHtml = function (html, scope) { - var doc = scope || document; - var div = doc.createElement('div'); + const fromHtml = (html, scope) => { + const doc = scope || document; + const div = doc.createElement('div'); div.innerHTML = html; if (!div.hasChildNodes() || div.childNodes.length > 1) { - console.error('HTML does not have a single root node', html); - throw new Error('HTML must have a single root node'); + const message = 'HTML does not have a single root node'; + console.error(message, html); + throw new Error(message); } - return fromDom(div.childNodes[0]); + return fromDom$1(div.childNodes[0]); }; - var fromTag = function (tag, scope) { - var doc = scope || document; - var node = doc.createElement(tag); - return fromDom(node); + const fromTag = (tag, scope) => { + const doc = scope || document; + const node = doc.createElement(tag); + return fromDom$1(node); }; - var fromText = function (text, scope) { - var doc = scope || document; - var node = doc.createTextNode(text); - return fromDom(node); + const fromText = (text, scope) => { + const doc = scope || document; + const node = doc.createTextNode(text); + return fromDom$1(node); }; - var fromDom = function (node) { + const fromDom$1 = node => { if (node === null || node === undefined) { throw new Error('Node cannot be null or undefined'); } return { dom: node }; }; - var fromPoint = function (docElm, x, y) { - return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); - }; - var SugarElement = { - fromHtml: fromHtml, - fromTag: fromTag, - fromText: fromText, - fromDom: fromDom, - fromPoint: fromPoint + const fromPoint = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$1); + const SugarElement = { + fromHtml, + fromTag, + fromText, + fromDom: fromDom$1, + fromPoint }; - var is$2 = function (element, selector) { - var dom = element.dom; + const is$1 = (element, selector) => { + const dom = element.dom; if (dom.nodeType !== ELEMENT) { return false; } else { - var elem = dom; + const elem = dom; if (elem.matches !== undefined) { return elem.matches(selector); } else if (elem.msMatchesSelector !== undefined) { @@ -715,158 +319,172 @@ } }; - var eq = function (e1, e2) { - return e1.dom === e2.dom; - }; - var regularContains = function (e1, e2) { - var d1 = e1.dom; - var d2 = e2.dom; + const eq = (e1, e2) => e1.dom === e2.dom; + const contains = (e1, e2) => { + const d1 = e1.dom; + const d2 = e2.dom; return d1 === d2 ? false : d1.contains(d2); }; - var ieContains = function (e1, e2) { - return documentPositionContainedBy(e1.dom, e2.dom); - }; - var contains = function (e1, e2) { - return detect().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2); - }; - var is$1 = is$2; - - var global$6 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); - - var global$5 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); - - var global$4 = tinymce.util.Tools.resolve('tinymce.util.VK'); + const is = is$1; - var keys = Object.keys; - var each = function (obj, f) { - var props = keys(obj); - for (var k = 0, len = props.length; k < len; k++) { - var i = props[k]; - var x = obj[i]; - f(x, i); + var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => { + if (is(scope, a)) { + return Optional.some(scope); + } else if (isFunction(isRoot) && isRoot(scope)) { + return Optional.none(); + } else { + return ancestor(scope, a, isRoot); } }; - var objAcc = function (r) { - return function (x, i) { - r[i] = x; - }; - }; - var internalFilter = function (obj, pred, onTrue, onFalse) { - var r = {}; - each(obj, function (x, i) { - (pred(x, i) ? onTrue : onFalse)(x, i); - }); - return r; - }; - var filter = function (obj, pred) { - var t = {}; - internalFilter(obj, pred, objAcc(t), noop); - return t; - }; typeof window !== 'undefined' ? window : Function('return this;')(); - var name = function (element) { - var r = element.dom.nodeName; + const name = element => { + const r = element.dom.nodeName; return r.toLowerCase(); }; - var type = function (element) { - return element.dom.nodeType; - }; - var isType = function (t) { - return function (element) { - return type(element) === t; - }; - }; - var isElement = isType(ELEMENT); - var isTag = function (tag) { - return function (e) { - return isElement(e) && name(e) === tag; - }; - }; - - var rawSet = function (dom, key, value) { - if (isString(value) || isBoolean(value) || isNumber(value)) { - dom.setAttribute(key, value + ''); - } else { - console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); - throw new Error('Attribute value was not simple'); - } - }; - var setAll = function (element, attrs) { - var dom = element.dom; - each(attrs, function (v, k) { - rawSet(dom, k, v); - }); - }; - var clone$1 = function (element) { - return foldl(element.dom.attributes, function (acc, attr) { - acc[attr.name] = attr.value; - return acc; - }, {}); - }; - - var parent = function (element) { - return Optional.from(element.dom.parentNode).map(SugarElement.fromDom); - }; - var children = function (element) { - return map(element.dom.childNodes, SugarElement.fromDom); - }; - var child = function (element, index) { - var cs = element.dom.childNodes; + const type = element => element.dom.nodeType; + const isType = t => element => type(element) === t; + const isElement$1 = isType(ELEMENT); + const isTag = tag => e => isElement$1(e) && name(e) === tag; + + const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom); + const parentElement = element => Optional.from(element.dom.parentElement).map(SugarElement.fromDom); + const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom); + const children = element => map(element.dom.childNodes, SugarElement.fromDom); + const child = (element, index) => { + const cs = element.dom.childNodes; return Optional.from(cs[index]).map(SugarElement.fromDom); }; - var firstChild = function (element) { - return child(element, 0); + const firstChild = element => child(element, 0); + const lastChild = element => child(element, element.dom.childNodes.length - 1); + + const ancestor = (scope, predicate, isRoot) => { + let element = scope.dom; + const stop = isFunction(isRoot) ? isRoot : never; + while (element.parentNode) { + element = element.parentNode; + const el = SugarElement.fromDom(element); + if (predicate(el)) { + return Optional.some(el); + } else if (stop(el)) { + break; + } + } + return Optional.none(); }; - var lastChild = function (element) { - return child(element, element.dom.childNodes.length - 1); + const closest = (scope, predicate, isRoot) => { + const is = (s, test) => test(s); + return ClosestOrAncestor(is, ancestor, scope, predicate, isRoot); }; - var before$1 = function (marker, element) { - var parent$1 = parent(marker); - parent$1.each(function (v) { + const before$1 = (marker, element) => { + const parent$1 = parent(marker); + parent$1.each(v => { v.dom.insertBefore(element.dom, marker.dom); }); }; - var append$1 = function (parent, element) { + const after = (marker, element) => { + const sibling = nextSibling(marker); + sibling.fold(() => { + const parent$1 = parent(marker); + parent$1.each(v => { + append$1(v, element); + }); + }, v => { + before$1(v, element); + }); + }; + const append$1 = (parent, element) => { parent.dom.appendChild(element.dom); }; - var before = function (marker, elements) { - each$1(elements, function (x) { + const before = (marker, elements) => { + each$1(elements, x => { before$1(marker, x); }); }; - var append = function (parent, elements) { - each$1(elements, function (x) { + const append = (parent, elements) => { + each$1(elements, x => { append$1(parent, x); }); }; - var remove = function (element) { - var dom = element.dom; + const empty = element => { + element.dom.textContent = ''; + each$1(children(element), rogue => { + remove(rogue); + }); + }; + const remove = element => { + const dom = element.dom; if (dom.parentNode !== null) { dom.parentNode.removeChild(dom); } }; - var clone = function (original, isDeep) { - return SugarElement.fromDom(original.dom.cloneNode(isDeep)); + var global$6 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); + + var global$5 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.VK'); + + const fromDom = nodes => map(nodes, SugarElement.fromDom); + + const keys = Object.keys; + const each = (obj, f) => { + const props = keys(obj); + for (let k = 0, len = props.length; k < len; k++) { + const i = props[k]; + const x = obj[i]; + f(x, i); + } }; - var deep = function (original) { - return clone(original, true); + const objAcc = r => (x, i) => { + r[i] = x; }; - var shallowAs = function (original, tag) { - var nu = SugarElement.fromTag(tag); - var attributes = clone$1(original); + const internalFilter = (obj, pred, onTrue, onFalse) => { + each(obj, (x, i) => { + (pred(x, i) ? onTrue : onFalse)(x, i); + }); + }; + const filter = (obj, pred) => { + const t = {}; + internalFilter(obj, pred, objAcc(t), noop); + return t; + }; + + const rawSet = (dom, key, value) => { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + const setAll = (element, attrs) => { + const dom = element.dom; + each(attrs, (v, k) => { + rawSet(dom, k, v); + }); + }; + const clone$1 = element => foldl(element.dom.attributes, (acc, attr) => { + acc[attr.name] = attr.value; + return acc; + }, {}); + + const clone = (original, isDeep) => SugarElement.fromDom(original.dom.cloneNode(isDeep)); + const deep = original => clone(original, true); + const shallowAs = (original, tag) => { + const nu = SugarElement.fromTag(tag); + const attributes = clone$1(original); setAll(nu, attributes); return nu; }; - var mutate = function (original, tag) { - var nu = shallowAs(original, tag); - before$1(original, nu); - var children$1 = children(original); + const mutate = (original, tag) => { + const nu = shallowAs(original, tag); + after(original, nu); + const children$1 = children(original); append(nu, children$1); remove(original); return nu; @@ -876,131 +494,104 @@ var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools'); - var matchNodeName = function (name) { - return function (node) { - return node && node.nodeName.toLowerCase() === name; - }; - }; - var matchNodeNames = function (regex) { - return function (node) { - return node && regex.test(node.nodeName); - }; - }; - var isTextNode = function (node) { - return node && node.nodeType === 3; - }; - var isListNode = matchNodeNames(/^(OL|UL|DL)$/); - var isOlUlNode = matchNodeNames(/^(OL|UL)$/); - var isOlNode = matchNodeName('ol'); - var isListItemNode = matchNodeNames(/^(LI|DT|DD)$/); - var isDlItemNode = matchNodeNames(/^(DT|DD)$/); - var isTableCellNode = matchNodeNames(/^(TH|TD)$/); - var isBr = matchNodeName('br'); - var isFirstChild = function (node) { - return node.parentNode.firstChild === node; - }; - var isTextBlock = function (editor, node) { - return node && !!editor.schema.getTextBlockElements()[node.nodeName]; - }; - var isBlock = function (node, blockElements) { - return node && node.nodeName in blockElements; - }; - var isBogusBr = function (dom, node) { + const matchNodeName = name => node => isNonNullable(node) && node.nodeName.toLowerCase() === name; + const matchNodeNames = regex => node => isNonNullable(node) && regex.test(node.nodeName); + const isTextNode$1 = node => isNonNullable(node) && node.nodeType === 3; + const isElement = node => isNonNullable(node) && node.nodeType === 1; + const isListNode = matchNodeNames(/^(OL|UL|DL)$/); + const isOlUlNode = matchNodeNames(/^(OL|UL)$/); + const isOlNode = matchNodeName('ol'); + const isListItemNode = matchNodeNames(/^(LI|DT|DD)$/); + const isDlItemNode = matchNodeNames(/^(DT|DD)$/); + const isTableCellNode = matchNodeNames(/^(TH|TD)$/); + const isBr = matchNodeName('br'); + const isFirstChild = node => { + var _a; + return ((_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.firstChild) === node; + }; + const isTextBlock = (editor, node) => isNonNullable(node) && node.nodeName in editor.schema.getTextBlockElements(); + const isBlock = (node, blockElements) => isNonNullable(node) && node.nodeName in blockElements; + const isVoid = (editor, node) => isNonNullable(node) && node.nodeName in editor.schema.getVoidElements(); + const isBogusBr = (dom, node) => { if (!isBr(node)) { return false; } return dom.isBlock(node.nextSibling) && !isBr(node.previousSibling); }; - var isEmpty = function (dom, elm, keepBookmarks) { - var empty = dom.isEmpty(elm); + const isEmpty$2 = (dom, elm, keepBookmarks) => { + const empty = dom.isEmpty(elm); if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) { return false; } return empty; }; - var isChildOfBody = function (dom, elm) { - return dom.isChildOf(elm, dom.getRoot()); - }; + const isChildOfBody = (dom, elm) => dom.isChildOf(elm, dom.getRoot()); - var shouldIndentOnTab = function (editor) { - return editor.getParam('lists_indent_on_tab', true); - }; - var getForcedRootBlock = function (editor) { - var block = editor.getParam('forced_root_block', 'p'); - if (block === false) { - return ''; - } else if (block === true) { - return 'p'; - } else { - return block; - } - }; - var getForcedRootBlockAttrs = function (editor) { - return editor.getParam('forced_root_block_attrs', {}); + const option = name => editor => editor.options.get(name); + const register$3 = editor => { + const registerOption = editor.options.register; + registerOption('lists_indent_on_tab', { + processor: 'boolean', + default: true + }); }; - - var createTextBlock = function (editor, contentNode) { - var dom = editor.dom; - var blockElements = editor.schema.getBlockElements(); - var fragment = dom.createFragment(); - var blockName = getForcedRootBlock(editor); - var node, textBlock, hasContentNode; - if (blockName) { - textBlock = dom.create(blockName); - if (textBlock.tagName === blockName.toUpperCase()) { - dom.setAttribs(textBlock, getForcedRootBlockAttrs(editor)); - } - if (!isBlock(contentNode.firstChild, blockElements)) { - fragment.appendChild(textBlock); + const shouldIndentOnTab = option('lists_indent_on_tab'); + const getForcedRootBlock = option('forced_root_block'); + const getForcedRootBlockAttrs = option('forced_root_block_attrs'); + + const createTextBlock = (editor, contentNode) => { + const dom = editor.dom; + const blockElements = editor.schema.getBlockElements(); + const fragment = dom.createFragment(); + const blockName = getForcedRootBlock(editor); + const blockAttrs = getForcedRootBlockAttrs(editor); + let node; + let textBlock; + let hasContentNode = false; + textBlock = dom.create(blockName, blockAttrs); + if (!isBlock(contentNode.firstChild, blockElements)) { + fragment.appendChild(textBlock); + } + while (node = contentNode.firstChild) { + const nodeName = node.nodeName; + if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) { + hasContentNode = true; } - } - if (contentNode) { - while (node = contentNode.firstChild) { - var nodeName = node.nodeName; - if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) { - hasContentNode = true; - } - if (isBlock(node, blockElements)) { - fragment.appendChild(node); - textBlock = null; - } else { - if (blockName) { - if (!textBlock) { - textBlock = dom.create(blockName); - fragment.appendChild(textBlock); - } - textBlock.appendChild(node); - } else { - fragment.appendChild(node); - } + if (isBlock(node, blockElements)) { + fragment.appendChild(node); + textBlock = null; + } else { + if (!textBlock) { + textBlock = dom.create(blockName, blockAttrs); + fragment.appendChild(textBlock); } + textBlock.appendChild(node); } } - if (!blockName) { - fragment.appendChild(dom.create('br')); - } else { - if (!hasContentNode) { - textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' })); - } + if (!hasContentNode && textBlock) { + textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' })); } return fragment; }; - var DOM$2 = global$3.DOM; - var splitList = function (editor, list, li) { - var removeAndKeepBookmarks = function (targetNode) { - global$2.each(bookmarks, function (node) { - targetNode.parentNode.insertBefore(node, li.parentNode); - }); + const DOM$2 = global$3.DOM; + const splitList = (editor, list, li) => { + const removeAndKeepBookmarks = targetNode => { + const parent = targetNode.parentNode; + if (parent) { + global$2.each(bookmarks, node => { + parent.insertBefore(node, li.parentNode); + }); + } DOM$2.remove(targetNode); }; - var bookmarks = DOM$2.select('span[data-mce-type="bookmark"]', list); - var newBlock = createTextBlock(editor, li); - var tmpRng = DOM$2.createRng(); + const bookmarks = DOM$2.select('span[data-mce-type="bookmark"]', list); + const newBlock = createTextBlock(editor, li); + const tmpRng = DOM$2.createRng(); tmpRng.setStartAfter(li); tmpRng.setEndAfter(list); - var fragment = tmpRng.extractContents(); - for (var node = fragment.firstChild; node; node = node.firstChild) { + const fragment = tmpRng.extractContents(); + for (let node = fragment.firstChild; node; node = node.firstChild) { if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) { DOM$2.remove(node); break; @@ -1010,173 +601,182 @@ DOM$2.insertAfter(fragment, list); } DOM$2.insertAfter(newBlock, list); - if (isEmpty(editor.dom, li.parentNode)) { - removeAndKeepBookmarks(li.parentNode); + const parent = li.parentElement; + if (parent && isEmpty$2(editor.dom, parent)) { + removeAndKeepBookmarks(parent); } DOM$2.remove(li); - if (isEmpty(editor.dom, list)) { + if (isEmpty$2(editor.dom, list)) { DOM$2.remove(list); } }; - var isDescriptionDetail = isTag('dd'); - var isDescriptionTerm = isTag('dt'); - var outdentDlItem = function (editor, item) { + const isDescriptionDetail = isTag('dd'); + const isDescriptionTerm = isTag('dt'); + const outdentDlItem = (editor, item) => { if (isDescriptionDetail(item)) { mutate(item, 'dt'); } else if (isDescriptionTerm(item)) { - parent(item).each(function (dl) { - return splitList(editor, dl.dom, item.dom); - }); + parentElement(item).each(dl => splitList(editor, dl.dom, item.dom)); } }; - var indentDlItem = function (item) { + const indentDlItem = item => { if (isDescriptionTerm(item)) { mutate(item, 'dd'); } }; - var dlIndentation = function (editor, indentation, dlItems) { + const dlIndentation = (editor, indentation, dlItems) => { if (indentation === 'Indent') { each$1(dlItems, indentDlItem); } else { - each$1(dlItems, function (item) { - return outdentDlItem(editor, item); - }); + each$1(dlItems, item => outdentDlItem(editor, item)); } }; - var getNormalizedPoint = function (container, offset) { - if (isTextNode(container)) { + const getNormalizedPoint = (container, offset) => { + if (isTextNode$1(container)) { return { - container: container, - offset: offset + container, + offset }; } - var node = global$6.getNode(container, offset); - if (isTextNode(node)) { + const node = global$6.getNode(container, offset); + if (isTextNode$1(node)) { return { container: node, offset: offset >= container.childNodes.length ? node.data.length : 0 }; - } else if (node.previousSibling && isTextNode(node.previousSibling)) { + } else if (node.previousSibling && isTextNode$1(node.previousSibling)) { return { container: node.previousSibling, offset: node.previousSibling.data.length }; - } else if (node.nextSibling && isTextNode(node.nextSibling)) { + } else if (node.nextSibling && isTextNode$1(node.nextSibling)) { return { container: node.nextSibling, offset: 0 }; } return { - container: container, - offset: offset + container, + offset }; }; - var normalizeRange = function (rng) { - var outRng = rng.cloneRange(); - var rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset); + const normalizeRange = rng => { + const outRng = rng.cloneRange(); + const rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset); outRng.setStart(rangeStart.container, rangeStart.offset); - var rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset); + const rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset); outRng.setEnd(rangeEnd.container, rangeEnd.offset); return outRng; }; - var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery'); - - var getParentList = function (editor, node) { - var selectionStart = node || editor.selection.getStart(true); - return editor.dom.getParent(selectionStart, 'OL,UL,DL', getClosestListRootElm(editor, selectionStart)); - }; - var isParentListSelected = function (parentList, selectedBlocks) { - return parentList && selectedBlocks.length === 1 && selectedBlocks[0] === parentList; - }; - var findSubLists = function (parentList) { - return filter$1(parentList.querySelectorAll('ol,ul,dl'), isListNode); - }; - var getSelectedSubLists = function (editor) { - var parentList = getParentList(editor); - var selectedBlocks = editor.selection.getSelectedBlocks(); + const listNames = [ + 'OL', + 'UL', + 'DL' + ]; + const listSelector = listNames.join(','); + const getParentList = (editor, node) => { + const selectionStart = node || editor.selection.getStart(true); + return editor.dom.getParent(selectionStart, listSelector, getClosestListHost(editor, selectionStart)); + }; + const isParentListSelected = (parentList, selectedBlocks) => isNonNullable(parentList) && selectedBlocks.length === 1 && selectedBlocks[0] === parentList; + const findSubLists = parentList => filter$1(parentList.querySelectorAll(listSelector), isListNode); + const getSelectedSubLists = editor => { + const parentList = getParentList(editor); + const selectedBlocks = editor.selection.getSelectedBlocks(); if (isParentListSelected(parentList, selectedBlocks)) { return findSubLists(parentList); } else { - return filter$1(selectedBlocks, function (elm) { + return filter$1(selectedBlocks, elm => { return isListNode(elm) && parentList !== elm; }); } }; - var findParentListItemsNodes = function (editor, elms) { - var listItemsElms = global$2.map(elms, function (elm) { - var parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListRootElm(editor, elm)); + const findParentListItemsNodes = (editor, elms) => { + const listItemsElms = global$2.map(elms, elm => { + const parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListHost(editor, elm)); return parentLi ? parentLi : elm; }); - return global$1.unique(listItemsElms); + return unique(listItemsElms); }; - var getSelectedListItems = function (editor) { - var selectedBlocks = editor.selection.getSelectedBlocks(); + const getSelectedListItems = editor => { + const selectedBlocks = editor.selection.getSelectedBlocks(); return filter$1(findParentListItemsNodes(editor, selectedBlocks), isListItemNode); }; - var getSelectedDlItems = function (editor) { - return filter$1(getSelectedListItems(editor), isDlItemNode); - }; - var getClosestListRootElm = function (editor, elm) { - var parentTableCell = editor.dom.getParents(elm, 'TD,TH'); + const getSelectedDlItems = editor => filter$1(getSelectedListItems(editor), isDlItemNode); + const getClosestEditingHost = (editor, elm) => { + const parentTableCell = editor.dom.getParents(elm, 'TD,TH'); return parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody(); }; - var findLastParentListNode = function (editor, elm) { - var parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListRootElm(editor, elm)); + const isListHost = (schema, node) => !isListNode(node) && !isListItemNode(node) && exists(listNames, listName => schema.isValidChild(node.nodeName, listName)); + const getClosestListHost = (editor, elm) => { + const parentBlocks = editor.dom.getParents(elm, editor.dom.isBlock); + const parentBlock = find(parentBlocks, elm => isListHost(editor.schema, elm)); + return parentBlock.getOr(editor.getBody()); + }; + const findLastParentListNode = (editor, elm) => { + const parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListHost(editor, elm)); return last(parentLists); }; - var getSelectedLists = function (editor) { - var firstList = findLastParentListNode(editor, editor.selection.getStart()); - var subsequentLists = filter$1(editor.selection.getSelectedBlocks(), isOlUlNode); + const getSelectedLists = editor => { + const firstList = findLastParentListNode(editor, editor.selection.getStart()); + const subsequentLists = filter$1(editor.selection.getSelectedBlocks(), isOlUlNode); return firstList.toArray().concat(subsequentLists); }; - var getSelectedListRoots = function (editor) { - var selectedLists = getSelectedLists(editor); + const getSelectedListRoots = editor => { + const selectedLists = getSelectedLists(editor); return getUniqueListRoots(editor, selectedLists); }; - var getUniqueListRoots = function (editor, lists) { - var listRoots = map(lists, function (list) { - return findLastParentListNode(editor, list).getOr(list); - }); - return global$1.unique(listRoots); + const getUniqueListRoots = (editor, lists) => { + const listRoots = map(lists, list => findLastParentListNode(editor, list).getOr(list)); + return unique(listRoots); }; - var is = function (lhs, rhs, comparator) { - if (comparator === void 0) { - comparator = tripleEquals; - } - return lhs.exists(function (left) { - return comparator(left, rhs); - }); + const isCustomList = list => /\btox\-/.test(list.className); + const inList = (parents, listName) => findUntil(parents, isListNode, isTableCellNode).exists(list => list.nodeName === listName && !isCustomList(list)); + const isWithinNonEditable = (editor, element) => element !== null && !editor.dom.isEditable(element); + const selectionIsWithinNonEditableList = editor => { + const parentList = getParentList(editor); + return isWithinNonEditable(editor, parentList); + }; + const isWithinNonEditableList = (editor, element) => { + const parentList = editor.dom.getParent(element, 'ol,ul,dl'); + return isWithinNonEditable(editor, parentList); }; - var lift2 = function (oa, ob, f) { - return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none(); + const setNodeChangeHandler = (editor, nodeChangeHandler) => { + const initialNode = editor.selection.getNode(); + nodeChangeHandler({ + parents: editor.dom.getParents(initialNode), + element: initialNode + }); + editor.on('NodeChange', nodeChangeHandler); + return () => editor.off('NodeChange', nodeChangeHandler); }; - var fromElements = function (elements, scope) { - var doc = scope || document; - var fragment = doc.createDocumentFragment(); - each$1(elements, function (element) { + const fromElements = (elements, scope) => { + const doc = scope || document; + const fragment = doc.createDocumentFragment(); + each$1(elements, element => { fragment.appendChild(element.dom); }); return SugarElement.fromDom(fragment); }; - var fireListEvent = function (editor, action, element) { - return editor.fire('ListMutation', { - action: action, - element: element - }); - }; + const fireListEvent = (editor, action, element) => editor.dispatch('ListMutation', { + action, + element + }); - var isSupported = function (dom) { - return dom.style !== undefined && isFunction(dom.style.getPropertyValue); - }; + const blank = r => s => s.replace(r, ''); + const trim = blank(/^\s+|\s+$/g); + const isNotEmpty = s => s.length > 0; + const isEmpty$1 = s => !isNotEmpty(s); + + const isSupported = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue); - var internalSet = function (dom, property, value) { + const internalSet = (dom, property, value) => { if (!isString(value)) { console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); throw new Error('CSS value must be a string: ' + value); @@ -1185,124 +785,108 @@ dom.style.setProperty(property, value); } }; - var set = function (element, property, value) { - var dom = element.dom; + const set = (element, property, value) => { + const dom = element.dom; internalSet(dom, property, value); }; - var joinSegment = function (parent, child) { + const joinSegment = (parent, child) => { append$1(parent.item, child.list); }; - var joinSegments = function (segments) { - for (var i = 1; i < segments.length; i++) { + const joinSegments = segments => { + for (let i = 1; i < segments.length; i++) { joinSegment(segments[i - 1], segments[i]); } }; - var appendSegments = function (head$1, tail) { + const appendSegments = (head$1, tail) => { lift2(last(head$1), head(tail), joinSegment); }; - var createSegment = function (scope, listType) { - var segment = { + const createSegment = (scope, listType) => { + const segment = { list: SugarElement.fromTag(listType, scope), item: SugarElement.fromTag('li', scope) }; append$1(segment.list, segment.item); return segment; }; - var createSegments = function (scope, entry, size) { - var segments = []; - for (var i = 0; i < size; i++) { + const createSegments = (scope, entry, size) => { + const segments = []; + for (let i = 0; i < size; i++) { segments.push(createSegment(scope, entry.listType)); } return segments; }; - var populateSegments = function (segments, entry) { - for (var i = 0; i < segments.length - 1; i++) { + const populateSegments = (segments, entry) => { + for (let i = 0; i < segments.length - 1; i++) { set(segments[i].item, 'list-style-type', 'none'); } - last(segments).each(function (segment) { + last(segments).each(segment => { setAll(segment.list, entry.listAttributes); setAll(segment.item, entry.itemAttributes); append(segment.item, entry.content); }); }; - var normalizeSegment = function (segment, entry) { + const normalizeSegment = (segment, entry) => { if (name(segment.list) !== entry.listType) { segment.list = mutate(segment.list, entry.listType); } setAll(segment.list, entry.listAttributes); }; - var createItem = function (scope, attr, content) { - var item = SugarElement.fromTag('li', scope); + const createItem = (scope, attr, content) => { + const item = SugarElement.fromTag('li', scope); setAll(item, attr); append(item, content); return item; }; - var appendItem = function (segment, item) { + const appendItem = (segment, item) => { append$1(segment.list, item); segment.item = item; }; - var writeShallow = function (scope, cast, entry) { - var newCast = cast.slice(0, entry.depth); - last(newCast).each(function (segment) { - var item = createItem(scope, entry.itemAttributes, entry.content); + const writeShallow = (scope, cast, entry) => { + const newCast = cast.slice(0, entry.depth); + last(newCast).each(segment => { + const item = createItem(scope, entry.itemAttributes, entry.content); appendItem(segment, item); normalizeSegment(segment, entry); }); return newCast; }; - var writeDeep = function (scope, cast, entry) { - var segments = createSegments(scope, entry, entry.depth - cast.length); + const writeDeep = (scope, cast, entry) => { + const segments = createSegments(scope, entry, entry.depth - cast.length); joinSegments(segments); populateSegments(segments, entry); appendSegments(cast, segments); return cast.concat(segments); }; - var composeList = function (scope, entries) { - var cast = foldl(entries, function (cast, entry) { + const composeList = (scope, entries) => { + const cast = foldl(entries, (cast, entry) => { return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry); }, []); - return head(cast).map(function (segment) { - return segment.list; - }); + return head(cast).map(segment => segment.list); }; - var isList = function (el) { - return is$1(el, 'OL,UL'); - }; - var hasFirstChildList = function (el) { - return firstChild(el).exists(isList); - }; - var hasLastChildList = function (el) { - return lastChild(el).exists(isList); - }; + const isList = el => is(el, 'OL,UL'); + const hasFirstChildList = el => firstChild(el).exists(isList); + const hasLastChildList = el => lastChild(el).exists(isList); - var isIndented = function (entry) { - return entry.depth > 0; - }; - var isSelected = function (entry) { - return entry.isSelected; - }; - var cloneItemContent = function (li) { - var children$1 = children(li); - var content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1; + const isIndented = entry => entry.depth > 0; + const isSelected = entry => entry.isSelected; + const cloneItemContent = li => { + const children$1 = children(li); + const content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1; return map(content, deep); }; - var createEntry = function (li, depth, isSelected) { - return parent(li).filter(isElement).map(function (list) { - return { - depth: depth, - dirty: false, - isSelected: isSelected, - content: cloneItemContent(li), - itemAttributes: clone$1(li), - listAttributes: clone$1(list), - listType: name(list) - }; - }); - }; - - var indentEntry = function (indentation, entry) { + const createEntry = (li, depth, isSelected) => parent(li).filter(isElement$1).map(list => ({ + depth, + dirty: false, + isSelected, + content: cloneItemContent(li), + itemAttributes: clone$1(li), + listAttributes: clone$1(list), + listType: name(list) + })); + + const indentEntry = (indentation, entry) => { switch (indentation) { case 'Indent': entry.depth++; @@ -1316,130 +900,104 @@ entry.dirty = true; }; - var cloneListProperties = function (target, source) { + const cloneListProperties = (target, source) => { target.listType = source.listType; - target.listAttributes = __assign({}, source.listAttributes); + target.listAttributes = { ...source.listAttributes }; }; - var cleanListProperties = function (entry) { - entry.listAttributes = filter(entry.listAttributes, function (_value, key) { - return key !== 'start'; - }); + const cleanListProperties = entry => { + entry.listAttributes = filter(entry.listAttributes, (_value, key) => key !== 'start'); }; - var closestSiblingEntry = function (entries, start) { - var depth = entries[start].depth; - var matches = function (entry) { - return entry.depth === depth && !entry.dirty; - }; - var until = function (entry) { - return entry.depth < depth; - }; - return findUntil(reverse(entries.slice(0, start)), matches, until).orThunk(function () { - return findUntil(entries.slice(start + 1), matches, until); - }); + const closestSiblingEntry = (entries, start) => { + const depth = entries[start].depth; + const matches = entry => entry.depth === depth && !entry.dirty; + const until = entry => entry.depth < depth; + return findUntil(reverse(entries.slice(0, start)), matches, until).orThunk(() => findUntil(entries.slice(start + 1), matches, until)); }; - var normalizeEntries = function (entries) { - each$1(entries, function (entry, i) { - closestSiblingEntry(entries, i).fold(function () { + const normalizeEntries = entries => { + each$1(entries, (entry, i) => { + closestSiblingEntry(entries, i).fold(() => { if (entry.dirty) { cleanListProperties(entry); } - }, function (matchingEntry) { - return cloneListProperties(entry, matchingEntry); - }); + }, matchingEntry => cloneListProperties(entry, matchingEntry)); }); return entries; }; - var Cell = function (initial) { - var value = initial; - var get = function () { + const Cell = initial => { + let value = initial; + const get = () => { return value; }; - var set = function (v) { + const set = v => { value = v; }; return { - get: get, - set: set + get, + set }; }; - var parseItem = function (depth, itemSelection, selectionState, item) { - return firstChild(item).filter(isList).fold(function () { - itemSelection.each(function (selection) { - if (eq(selection.start, item)) { - selectionState.set(true); - } - }); - var currentItemEntry = createEntry(item, depth, selectionState.get()); - itemSelection.each(function (selection) { - if (eq(selection.end, item)) { - selectionState.set(false); - } - }); - var childListEntries = lastChild(item).filter(isList).map(function (list) { - return parseList(depth, itemSelection, selectionState, list); - }).getOr([]); - return currentItemEntry.toArray().concat(childListEntries); - }, function (list) { - return parseList(depth, itemSelection, selectionState, list); - }); - }; - var parseList = function (depth, itemSelection, selectionState, list) { - return bind(children(list), function (element) { - var parser = isList(element) ? parseList : parseItem; - var newDepth = depth + 1; - return parser(newDepth, itemSelection, selectionState, element); + const parseItem = (depth, itemSelection, selectionState, item) => firstChild(item).filter(isList).fold(() => { + itemSelection.each(selection => { + if (eq(selection.start, item)) { + selectionState.set(true); + } }); - }; - var parseLists = function (lists, itemSelection) { - var selectionState = Cell(false); - var initialDepth = 0; - return map(lists, function (list) { - return { - sourceList: list, - entries: parseList(initialDepth, itemSelection, selectionState, list) - }; + const currentItemEntry = createEntry(item, depth, selectionState.get()); + itemSelection.each(selection => { + if (eq(selection.end, item)) { + selectionState.set(false); + } }); - }; - - var outdentedComposer = function (editor, entries) { - var normalizedEntries = normalizeEntries(entries); - return map(normalizedEntries, function (entry) { - var content = fromElements(entry.content); + const childListEntries = lastChild(item).filter(isList).map(list => parseList(depth, itemSelection, selectionState, list)).getOr([]); + return currentItemEntry.toArray().concat(childListEntries); + }, list => parseList(depth, itemSelection, selectionState, list)); + const parseList = (depth, itemSelection, selectionState, list) => bind(children(list), element => { + const parser = isList(element) ? parseList : parseItem; + const newDepth = depth + 1; + return parser(newDepth, itemSelection, selectionState, element); + }); + const parseLists = (lists, itemSelection) => { + const selectionState = Cell(false); + const initialDepth = 0; + return map(lists, list => ({ + sourceList: list, + entries: parseList(initialDepth, itemSelection, selectionState, list) + })); + }; + + const outdentedComposer = (editor, entries) => { + const normalizedEntries = normalizeEntries(entries); + return map(normalizedEntries, entry => { + const content = fromElements(entry.content); return SugarElement.fromDom(createTextBlock(editor, content.dom)); }); }; - var indentedComposer = function (editor, entries) { - var normalizedEntries = normalizeEntries(entries); + const indentedComposer = (editor, entries) => { + const normalizedEntries = normalizeEntries(entries); return composeList(editor.contentDocument, normalizedEntries).toArray(); }; - var composeEntries = function (editor, entries) { - return bind(groupBy(entries, isIndented), function (entries) { - var groupIsIndented = head(entries).exists(isIndented); - return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries); - }); - }; - var indentSelectedEntries = function (entries, indentation) { - each$1(filter$1(entries, isSelected), function (entry) { - return indentEntry(indentation, entry); - }); - }; - var getItemSelection = function (editor) { - var selectedListItems = map(getSelectedListItems(editor), SugarElement.fromDom); - return lift2(find$1(selectedListItems, not(hasFirstChildList)), find$1(reverse(selectedListItems), not(hasFirstChildList)), function (start, end) { - return { - start: start, - end: end - }; - }); - }; - var listIndentation = function (editor, lists, indentation) { - var entrySets = parseLists(lists, getItemSelection(editor)); - each$1(entrySets, function (entrySet) { + const composeEntries = (editor, entries) => bind(groupBy(entries, isIndented), entries => { + const groupIsIndented = head(entries).exists(isIndented); + return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries); + }); + const indentSelectedEntries = (entries, indentation) => { + each$1(filter$1(entries, isSelected), entry => indentEntry(indentation, entry)); + }; + const getItemSelection = editor => { + const selectedListItems = map(getSelectedListItems(editor), SugarElement.fromDom); + return lift2(find(selectedListItems, not(hasFirstChildList)), find(reverse(selectedListItems), not(hasFirstChildList)), (start, end) => ({ + start, + end + })); + }; + const listIndentation = (editor, lists, indentation) => { + const entrySets = parseLists(lists, getItemSelection(editor)); + each$1(entrySets, entrySet => { indentSelectedEntries(entrySet.entries, indentation); - var composedLists = composeEntries(editor, entrySet.entries); - each$1(composedLists, function (composedList) { + const composedLists = composeEntries(editor, entrySet.entries); + each$1(composedLists, composedList => { fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom); }); before(entrySet.sourceList, composedLists); @@ -1447,12 +1005,12 @@ }); }; - var selectionIndentation = function (editor, indentation) { - var lists = map(getSelectedListRoots(editor), SugarElement.fromDom); - var dlItems = map(getSelectedDlItems(editor), SugarElement.fromDom); - var isHandled = false; + const selectionIndentation = (editor, indentation) => { + const lists = fromDom(getSelectedListRoots(editor)); + const dlItems = fromDom(getSelectedDlItems(editor)); + let isHandled = false; if (lists.length || dlItems.length) { - var bookmark = editor.selection.getBookmark(); + const bookmark = editor.selection.getBookmark(); listIndentation(editor, lists, indentation); dlIndentation(editor, indentation, dlItems); editor.selection.moveToBookmark(bookmark); @@ -1462,26 +1020,24 @@ } return isHandled; }; - var indentListSelection = function (editor) { - return selectionIndentation(editor, 'Indent'); - }; - var outdentListSelection = function (editor) { - return selectionIndentation(editor, 'Outdent'); - }; - var flattenListSelection = function (editor) { - return selectionIndentation(editor, 'Flatten'); - }; + const handleIndentation = (editor, indentation) => !selectionIsWithinNonEditableList(editor) && selectionIndentation(editor, indentation); + const indentListSelection = editor => handleIndentation(editor, 'Indent'); + const outdentListSelection = editor => handleIndentation(editor, 'Outdent'); + const flattenListSelection = editor => handleIndentation(editor, 'Flatten'); - var global = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager'); + const zeroWidth = '\uFEFF'; + const isZwsp = char => char === zeroWidth; - var DOM$1 = global$3.DOM; - var createBookmark = function (rng) { - var bookmark = {}; - var setupEndPoint = function (start) { - var container = rng[start ? 'startContainer' : 'endContainer']; - var offset = rng[start ? 'startOffset' : 'endOffset']; - if (container.nodeType === 1) { - var offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' }); + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager'); + + const DOM$1 = global$3.DOM; + const createBookmark = rng => { + const bookmark = {}; + const setupEndPoint = start => { + let container = rng[start ? 'startContainer' : 'endContainer']; + let offset = rng[start ? 'startOffset' : 'endOffset']; + if (isElement(container)) { + const offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' }); if (container.hasChildNodes()) { offset = Math.min(offset, container.childNodes.length - 1); if (start) { @@ -1504,28 +1060,30 @@ } return bookmark; }; - var resolveBookmark = function (bookmark) { - var restoreEndPoint = function (start) { - var node; - var nodeIndex = function (container) { - var node = container.parentNode.firstChild, idx = 0; + const resolveBookmark = bookmark => { + const restoreEndPoint = start => { + const nodeIndex = container => { + var _a; + let node = (_a = container.parentNode) === null || _a === void 0 ? void 0 : _a.firstChild; + let idx = 0; while (node) { if (node === container) { return idx; } - if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') { + if (!isElement(node) || node.getAttribute('data-mce-type') !== 'bookmark') { idx++; } node = node.nextSibling; } return -1; }; - var container = node = bookmark[start ? 'startContainer' : 'endContainer']; - var offset = bookmark[start ? 'startOffset' : 'endOffset']; + let container = bookmark[start ? 'startContainer' : 'endContainer']; + let offset = bookmark[start ? 'startOffset' : 'endOffset']; if (!container) { return; } - if (container.nodeType === 1) { + if (isElement(container) && container.parentNode) { + const node = container; offset = nodeIndex(container); container = container.parentNode; DOM$1.remove(node); @@ -1538,7 +1096,7 @@ }; restoreEndPoint(true); restoreEndPoint(); - var rng = DOM$1.createRng(); + const rng = DOM$1.createRng(); rng.setStart(bookmark.startContainer, bookmark.startOffset); if (bookmark.endContainer) { rng.setEnd(bookmark.endContainer, bookmark.endOffset); @@ -1546,7 +1104,7 @@ return normalizeRange(rng); }; - var listToggleActionFromListName = function (listName) { + const listToggleActionFromListName = listName => { switch (listName) { case 'UL': return 'ToggleUlList'; @@ -1557,83 +1115,101 @@ } }; - var isCustomList = function (list) { - return /\btox\-/.test(list.className); - }; - var listState = function (editor, listName, activate) { - var nodeChangeHandler = function (e) { - var inList = findUntil(e.parents, isListNode, isTableCellNode).filter(function (list) { - return list.nodeName === listName && !isCustomList(list); - }).isSome(); - activate(inList); - }; - var parents = editor.dom.getParents(editor.selection.getNode()); - nodeChangeHandler({ parents: parents }); - editor.on('NodeChange', nodeChangeHandler); - return function () { - return editor.off('NodeChange', nodeChangeHandler); - }; - }; - - var updateListStyle = function (dom, el, detail) { - var type = detail['list-style-type'] ? detail['list-style-type'] : null; + const updateListStyle = (dom, el, detail) => { + const type = detail['list-style-type'] ? detail['list-style-type'] : null; dom.setStyle(el, 'list-style-type', type); }; - var setAttribs = function (elm, attrs) { - global$2.each(attrs, function (value, key) { + const setAttribs = (elm, attrs) => { + global$2.each(attrs, (value, key) => { elm.setAttribute(key, value); }); }; - var updateListAttrs = function (dom, el, detail) { + const updateListAttrs = (dom, el, detail) => { setAttribs(el, detail['list-attributes']); - global$2.each(dom.select('li', el), function (li) { + global$2.each(dom.select('li', el), li => { setAttribs(li, detail['list-item-attributes']); }); }; - var updateListWithDetails = function (dom, el, detail) { + const updateListWithDetails = (dom, el, detail) => { updateListStyle(dom, el, detail); updateListAttrs(dom, el, detail); }; - var removeStyles = function (dom, element, styles) { - global$2.each(styles, function (style) { - var _a; - return dom.setStyle(element, (_a = {}, _a[style] = '', _a)); - }); + const removeStyles = (dom, element, styles) => { + global$2.each(styles, style => dom.setStyle(element, style, '')); }; - var getEndPointNode = function (editor, rng, start, root) { - var container = rng[start ? 'startContainer' : 'endContainer']; - var offset = rng[start ? 'startOffset' : 'endOffset']; - if (container.nodeType === 1) { + const isInline = (editor, node) => isNonNullable(node) && !isBlock(node, editor.schema.getBlockElements()); + const getEndPointNode = (editor, rng, start, root) => { + let container = rng[start ? 'startContainer' : 'endContainer']; + const offset = rng[start ? 'startOffset' : 'endOffset']; + if (isElement(container)) { container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container; } if (!start && isBr(container.nextSibling)) { container = container.nextSibling; } + const findBetterContainer = (container, forward) => { + var _a; + const walker = new global$5(container, root); + const dir = forward ? 'next' : 'prev'; + let node; + while (node = walker[dir]()) { + if (!(isVoid(editor, node) || isZwsp(node.textContent) || ((_a = node.textContent) === null || _a === void 0 ? void 0 : _a.length) === 0)) { + return Optional.some(node); + } + } + return Optional.none(); + }; + if (start && isTextNode$1(container)) { + if (isZwsp(container.textContent)) { + container = findBetterContainer(container, false).getOr(container); + } else { + if (container.parentNode !== null && isInline(editor, container.parentNode)) { + container = container.parentNode; + } + while (container.previousSibling !== null && (isInline(editor, container.previousSibling) || isTextNode$1(container.previousSibling))) { + container = container.previousSibling; + } + } + } + if (!start && isTextNode$1(container)) { + if (isZwsp(container.textContent)) { + container = findBetterContainer(container, true).getOr(container); + } else { + if (container.parentNode !== null && isInline(editor, container.parentNode)) { + container = container.parentNode; + } + while (container.nextSibling !== null && (isInline(editor, container.nextSibling) || isTextNode$1(container.nextSibling))) { + container = container.nextSibling; + } + } + } while (container.parentNode !== root) { + const parent = container.parentNode; if (isTextBlock(editor, container)) { return container; } - if (/^(TD|TH)$/.test(container.parentNode.nodeName)) { + if (/^(TD|TH)$/.test(parent.nodeName)) { return container; } - container = container.parentNode; + container = parent; } return container; }; - var getSelectedTextBlocks = function (editor, rng, root) { - var textBlocks = []; - var dom = editor.dom; - var startNode = getEndPointNode(editor, rng, true, root); - var endNode = getEndPointNode(editor, rng, false, root); - var block; - var siblings = []; - for (var node = startNode; node; node = node.nextSibling) { + const getSelectedTextBlocks = (editor, rng, root) => { + const textBlocks = []; + const dom = editor.dom; + const startNode = getEndPointNode(editor, rng, true, root); + const endNode = getEndPointNode(editor, rng, false, root); + let block; + const siblings = []; + for (let node = startNode; node; node = node.nextSibling) { siblings.push(node); if (node === endNode) { break; } } - global$2.each(siblings, function (node) { + global$2.each(siblings, node => { + var _a; if (isTextBlock(editor, node)) { textBlocks.push(node); block = null; @@ -1646,8 +1222,8 @@ block = null; return; } - var nextSibling = node.nextSibling; - if (global.isBookmarkNode(node)) { + const nextSibling = node.nextSibling; + if (global$1.isBookmarkNode(node)) { if (isListNode(nextSibling) || isTextBlock(editor, nextSibling) || !nextSibling && node.parentNode === root) { block = null; return; @@ -1655,24 +1231,24 @@ } if (!block) { block = dom.create('p'); - node.parentNode.insertBefore(block, node); + (_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(block, node); textBlocks.push(block); } block.appendChild(node); }); return textBlocks; }; - var hasCompatibleStyle = function (dom, sib, detail) { - var sibStyle = dom.getStyle(sib, 'list-style-type'); - var detailStyle = detail ? detail['list-style-type'] : ''; + const hasCompatibleStyle = (dom, sib, detail) => { + const sibStyle = dom.getStyle(sib, 'list-style-type'); + let detailStyle = detail ? detail['list-style-type'] : ''; detailStyle = detailStyle === null ? '' : detailStyle; return sibStyle === detailStyle; }; - var applyList = function (editor, listName, detail) { - var rng = editor.selection.getRng(); - var listItemName = 'LI'; - var root = getClosestListRootElm(editor, editor.selection.getStart(true)); - var dom = editor.dom; + const applyList = (editor, listName, detail) => { + const rng = editor.selection.getRng(); + let listItemName = 'LI'; + const root = getClosestListHost(editor, editor.selection.getStart(true)); + const dom = editor.dom; if (dom.getContentEditable(editor.selection.getNode()) === 'false') { return; } @@ -1680,12 +1256,12 @@ if (listName === 'DL') { listItemName = 'DT'; } - var bookmark = createBookmark(rng); - var selectedTextBlocks = getSelectedTextBlocks(editor, rng, root); - global$2.each(selectedTextBlocks, function (block) { - var listBlock; - var sibling = block.previousSibling; - var parent = block.parentNode; + const bookmark = createBookmark(rng); + const selectedTextBlocks = filter$1(getSelectedTextBlocks(editor, rng, root), editor.dom.isEditable); + global$2.each(selectedTextBlocks, block => { + let listBlock; + const sibling = block.previousSibling; + const parent = block.parentNode; if (!isListItemNode(parent)) { if (sibling && isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) { listBlock = sibling; @@ -1693,7 +1269,7 @@ sibling.appendChild(block); } else { listBlock = dom.create(listName); - block.parentNode.insertBefore(listBlock, block); + parent.insertBefore(listBlock, block); listBlock.appendChild(block); block = dom.rename(block, listItemName); } @@ -1715,40 +1291,42 @@ }); editor.selection.setRng(resolveBookmark(bookmark)); }; - var isValidLists = function (list1, list2) { - return list1 && list2 && isListNode(list1) && list1.nodeName === list2.nodeName; + const isValidLists = (list1, list2) => { + return isListNode(list1) && list1.nodeName === (list2 === null || list2 === void 0 ? void 0 : list2.nodeName); }; - var hasSameListStyle = function (dom, list1, list2) { - var targetStyle = dom.getStyle(list1, 'list-style-type', true); - var style = dom.getStyle(list2, 'list-style-type', true); + const hasSameListStyle = (dom, list1, list2) => { + const targetStyle = dom.getStyle(list1, 'list-style-type', true); + const style = dom.getStyle(list2, 'list-style-type', true); return targetStyle === style; }; - var hasSameClasses = function (elm1, elm2) { + const hasSameClasses = (elm1, elm2) => { return elm1.className === elm2.className; }; - var shouldMerge = function (dom, list1, list2) { + const shouldMerge = (dom, list1, list2) => { return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2); }; - var mergeWithAdjacentLists = function (dom, listBlock) { - var sibling, node; - sibling = listBlock.nextSibling; + const mergeWithAdjacentLists = (dom, listBlock) => { + let node; + let sibling = listBlock.nextSibling; if (shouldMerge(dom, listBlock, sibling)) { - while (node = sibling.firstChild) { + const liSibling = sibling; + while (node = liSibling.firstChild) { listBlock.appendChild(node); } - dom.remove(sibling); + dom.remove(liSibling); } sibling = listBlock.previousSibling; if (shouldMerge(dom, listBlock, sibling)) { - while (node = sibling.lastChild) { + const liSibling = sibling; + while (node = liSibling.lastChild) { listBlock.insertBefore(node, listBlock.firstChild); } - dom.remove(sibling); + dom.remove(liSibling); } }; - var updateList$1 = function (editor, list, listName, detail) { + const updateList$1 = (editor, list, listName, detail) => { if (list.nodeName !== listName) { - var newList = editor.dom.rename(list, listName); + const newList = editor.dom.rename(list, listName); updateListWithDetails(editor.dom, newList, detail); fireListEvent(editor, listToggleActionFromListName(listName), newList); } else { @@ -1756,24 +1334,27 @@ fireListEvent(editor, listToggleActionFromListName(listName), list); } }; - var toggleMultipleLists = function (editor, parentList, lists, listName, detail) { - var parentIsList = isListNode(parentList); + const toggleMultipleLists = (editor, parentList, lists, listName, detail) => { + const parentIsList = isListNode(parentList); if (parentIsList && parentList.nodeName === listName && !hasListStyleDetail(detail)) { flattenListSelection(editor); } else { applyList(editor, listName, detail); - var bookmark = createBookmark(editor.selection.getRng()); - var allLists = parentIsList ? __spreadArray([parentList], lists, true) : lists; - global$2.each(allLists, function (elm) { + const bookmark = createBookmark(editor.selection.getRng()); + const allLists = parentIsList ? [ + parentList, + ...lists + ] : lists; + global$2.each(allLists, elm => { updateList$1(editor, elm, listName, detail); }); editor.selection.setRng(resolveBookmark(bookmark)); } }; - var hasListStyleDetail = function (detail) { + const hasListStyleDetail = detail => { return 'list-style-type' in detail; }; - var toggleSingleList = function (editor, parentList, listName, detail) { + const toggleSingleList = (editor, parentList, listName, detail) => { if (parentList === editor.getBody()) { return; } @@ -1781,9 +1362,9 @@ if (parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) { flattenListSelection(editor); } else { - var bookmark = createBookmark(editor.selection.getRng()); + const bookmark = createBookmark(editor.selection.getRng()); updateListWithDetails(editor.dom, parentList, detail); - var newList = editor.dom.rename(parentList, listName); + const newList = editor.dom.rename(parentList, listName); mergeWithAdjacentLists(editor.dom, newList); editor.selection.setRng(resolveBookmark(bookmark)); applyList(editor, listName, detail); @@ -1794,10 +1375,13 @@ fireListEvent(editor, listToggleActionFromListName(listName), parentList); } }; - var toggleList = function (editor, listName, _detail) { - var parentList = getParentList(editor); - var selectedSubLists = getSelectedSubLists(editor); - var detail = isObject(_detail) ? _detail : {}; + const toggleList = (editor, listName, _detail) => { + const parentList = getParentList(editor); + if (isWithinNonEditableList(editor, parentList) || !editor.hasEditableRoot()) { + return; + } + const selectedSubLists = getSelectedSubLists(editor); + const detail = isObject(_detail) ? _detail : {}; if (selectedSubLists.length > 0) { toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail); } else { @@ -1805,14 +1389,14 @@ } }; - var DOM = global$3.DOM; - var normalizeList = function (dom, list) { - var parentNode = list.parentNode; - if (parentNode.nodeName === 'LI' && parentNode.firstChild === list) { - var sibling = parentNode.previousSibling; + const DOM = global$3.DOM; + const normalizeList = (dom, list) => { + const parentNode = list.parentElement; + if (parentNode && parentNode.nodeName === 'LI' && parentNode.firstChild === list) { + const sibling = parentNode.previousSibling; if (sibling && sibling.nodeName === 'LI') { sibling.appendChild(list); - if (isEmpty(dom, parentNode)) { + if (isEmpty$2(dom, parentNode)) { DOM.remove(parentNode); } } else { @@ -1820,69 +1404,71 @@ } } if (isListNode(parentNode)) { - var sibling = parentNode.previousSibling; + const sibling = parentNode.previousSibling; if (sibling && sibling.nodeName === 'LI') { sibling.appendChild(list); } } }; - var normalizeLists = function (dom, element) { - var lists = global$2.grep(dom.select('ol,ul', element)); - global$2.each(lists, function (list) { + const normalizeLists = (dom, element) => { + const lists = global$2.grep(dom.select('ol,ul', element)); + global$2.each(lists, list => { normalizeList(dom, list); }); }; - var findNextCaretContainer = function (editor, rng, isForward, root) { - var node = rng.startContainer; - var offset = rng.startOffset; - if (isTextNode(node) && (isForward ? offset < node.data.length : offset > 0)) { + const findNextCaretContainer = (editor, rng, isForward, root) => { + let node = rng.startContainer; + const offset = rng.startOffset; + if (isTextNode$1(node) && (isForward ? offset < node.data.length : offset > 0)) { return node; } - var nonEmptyBlocks = editor.schema.getNonEmptyElements(); - if (node.nodeType === 1) { + const nonEmptyBlocks = editor.schema.getNonEmptyElements(); + if (isElement(node)) { node = global$6.getNode(node, offset); } - var walker = new global$5(node, root); + const walker = new global$5(node, root); if (isForward) { if (isBogusBr(editor.dom, node)) { walker.next(); } } - while (node = walker[isForward ? 'next' : 'prev2']()) { + const walkFn = isForward ? walker.next.bind(walker) : walker.prev2.bind(walker); + while (node = walkFn()) { if (node.nodeName === 'LI' && !node.hasChildNodes()) { return node; } if (nonEmptyBlocks[node.nodeName]) { return node; } - if (isTextNode(node) && node.data.length > 0) { + if (isTextNode$1(node) && node.data.length > 0) { return node; } } + return null; }; - var hasOnlyOneBlockChild = function (dom, elm) { - var childNodes = elm.childNodes; + const hasOnlyOneBlockChild = (dom, elm) => { + const childNodes = elm.childNodes; return childNodes.length === 1 && !isListNode(childNodes[0]) && dom.isBlock(childNodes[0]); }; - var unwrapSingleBlockChild = function (dom, elm) { + const unwrapSingleBlockChild = (dom, elm) => { if (hasOnlyOneBlockChild(dom, elm)) { dom.remove(elm.firstChild, true); } }; - var moveChildren = function (dom, fromElm, toElm) { - var node; - var targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm; + const moveChildren = (dom, fromElm, toElm) => { + let node; + const targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm; unwrapSingleBlockChild(dom, fromElm); - if (!isEmpty(dom, fromElm, true)) { + if (!isEmpty$2(dom, fromElm, true)) { while (node = fromElm.firstChild) { targetElm.appendChild(node); } } }; - var mergeLiElements = function (dom, fromElm, toElm) { - var listNode; - var ul = fromElm.parentNode; + const mergeLiElements = (dom, fromElm, toElm) => { + let listNode; + const ul = fromElm.parentNode; if (!isChildOfBody(dom, fromElm) || !isChildOfBody(dom, toElm)) { return; } @@ -1894,75 +1480,75 @@ dom.remove(ul.previousSibling); } } - var node = toElm.lastChild; + const node = toElm.lastChild; if (node && isBr(node) && fromElm.hasChildNodes()) { dom.remove(node); } - if (isEmpty(dom, toElm, true)) { - dom.$(toElm).empty(); + if (isEmpty$2(dom, toElm, true)) { + empty(SugarElement.fromDom(toElm)); } moveChildren(dom, fromElm, toElm); if (listNode) { toElm.appendChild(listNode); } - var contains$1 = contains(SugarElement.fromDom(toElm), SugarElement.fromDom(fromElm)); - var nestedLists = contains$1 ? dom.getParents(fromElm, isListNode, toElm) : []; + const contains$1 = contains(SugarElement.fromDom(toElm), SugarElement.fromDom(fromElm)); + const nestedLists = contains$1 ? dom.getParents(fromElm, isListNode, toElm) : []; dom.remove(fromElm); - each$1(nestedLists, function (list) { - if (isEmpty(dom, list) && list !== dom.getRoot()) { + each$1(nestedLists, list => { + if (isEmpty$2(dom, list) && list !== dom.getRoot()) { dom.remove(list); } }); }; - var mergeIntoEmptyLi = function (editor, fromLi, toLi) { - editor.dom.$(toLi).empty(); + const mergeIntoEmptyLi = (editor, fromLi, toLi) => { + empty(SugarElement.fromDom(toLi)); mergeLiElements(editor.dom, fromLi, toLi); editor.selection.setCursorLocation(toLi, 0); }; - var mergeForward = function (editor, rng, fromLi, toLi) { - var dom = editor.dom; + const mergeForward = (editor, rng, fromLi, toLi) => { + const dom = editor.dom; if (dom.isEmpty(toLi)) { mergeIntoEmptyLi(editor, fromLi, toLi); } else { - var bookmark = createBookmark(rng); + const bookmark = createBookmark(rng); mergeLiElements(dom, fromLi, toLi); editor.selection.setRng(resolveBookmark(bookmark)); } }; - var mergeBackward = function (editor, rng, fromLi, toLi) { - var bookmark = createBookmark(rng); + const mergeBackward = (editor, rng, fromLi, toLi) => { + const bookmark = createBookmark(rng); mergeLiElements(editor.dom, fromLi, toLi); - var resolvedBookmark = resolveBookmark(bookmark); + const resolvedBookmark = resolveBookmark(bookmark); editor.selection.setRng(resolvedBookmark); }; - var backspaceDeleteFromListToListCaret = function (editor, isForward) { - var dom = editor.dom, selection = editor.selection; - var selectionStartElm = selection.getStart(); - var root = getClosestListRootElm(editor, selectionStartElm); - var li = dom.getParent(selection.getStart(), 'LI', root); + const backspaceDeleteFromListToListCaret = (editor, isForward) => { + const dom = editor.dom, selection = editor.selection; + const selectionStartElm = selection.getStart(); + const root = getClosestEditingHost(editor, selectionStartElm); + const li = dom.getParent(selection.getStart(), 'LI', root); if (li) { - var ul = li.parentNode; - if (ul === editor.getBody() && isEmpty(dom, ul)) { + const ul = li.parentElement; + if (ul === editor.getBody() && isEmpty$2(dom, ul)) { return true; } - var rng_1 = normalizeRange(selection.getRng()); - var otherLi_1 = dom.getParent(findNextCaretContainer(editor, rng_1, isForward, root), 'LI', root); - if (otherLi_1 && otherLi_1 !== li) { - editor.undoManager.transact(function () { + const rng = normalizeRange(selection.getRng()); + const otherLi = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root); + if (otherLi && otherLi !== li) { + editor.undoManager.transact(() => { if (isForward) { - mergeForward(editor, rng_1, otherLi_1, li); + mergeForward(editor, rng, otherLi, li); } else { if (isFirstChild(li)) { outdentListSelection(editor); } else { - mergeBackward(editor, rng_1, li, otherLi_1); + mergeBackward(editor, rng, li, otherLi); } } }); return true; - } else if (!otherLi_1) { - if (!isForward && rng_1.startOffset === 0 && rng_1.endOffset === 0) { - editor.undoManager.transact(function () { + } else if (!otherLi) { + if (!isForward && rng.startOffset === 0 && rng.endOffset === 0) { + editor.undoManager.transact(() => { flattenListSelection(editor); }); return true; @@ -1971,26 +1557,37 @@ } return false; }; - var removeBlock = function (dom, block, root) { - var parentBlock = dom.getParent(block.parentNode, dom.isBlock, root); + const removeBlock = (dom, block, root) => { + const parentBlock = dom.getParent(block.parentNode, dom.isBlock, root); dom.remove(block); if (parentBlock && dom.isEmpty(parentBlock)) { dom.remove(parentBlock); } }; - var backspaceDeleteIntoListCaret = function (editor, isForward) { - var dom = editor.dom; - var selectionStartElm = editor.selection.getStart(); - var root = getClosestListRootElm(editor, selectionStartElm); - var block = dom.getParent(selectionStartElm, dom.isBlock, root); + const backspaceDeleteIntoListCaret = (editor, isForward) => { + const dom = editor.dom; + const selectionStartElm = editor.selection.getStart(); + const root = getClosestEditingHost(editor, selectionStartElm); + const block = dom.getParent(selectionStartElm, dom.isBlock, root); if (block && dom.isEmpty(block)) { - var rng = normalizeRange(editor.selection.getRng()); - var otherLi_2 = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root); - if (otherLi_2) { - editor.undoManager.transact(function () { + const rng = normalizeRange(editor.selection.getRng()); + const otherLi = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root); + if (otherLi) { + const findValidElement = element => contains$1([ + 'td', + 'th', + 'caption' + ], name(element)); + const findRoot = node => node.dom === root; + const otherLiCell = closest(SugarElement.fromDom(otherLi), findValidElement, findRoot); + const caretCell = closest(SugarElement.fromDom(rng.startContainer), findValidElement, findRoot); + if (!equals(otherLiCell, caretCell, eq)) { + return false; + } + editor.undoManager.transact(() => { removeBlock(dom, block, root); - mergeWithAdjacentLists(dom, otherLi_2.parentNode); - editor.selection.select(otherLi_2, true); + mergeWithAdjacentLists(dom, otherLi.parentNode); + editor.selection.select(otherLi, true); editor.selection.collapse(isForward); }); return true; @@ -1998,15 +1595,18 @@ } return false; }; - var backspaceDeleteCaret = function (editor, isForward) { + const backspaceDeleteCaret = (editor, isForward) => { return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward); }; - var backspaceDeleteRange = function (editor) { - var selectionStartElm = editor.selection.getStart(); - var root = getClosestListRootElm(editor, selectionStartElm); - var startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root); - if (startListParent || getSelectedListItems(editor).length > 0) { - editor.undoManager.transact(function () { + const hasListSelection = editor => { + const selectionStartElm = editor.selection.getStart(); + const root = getClosestEditingHost(editor, selectionStartElm); + const startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root); + return startListParent || getSelectedListItems(editor).length > 0; + }; + const backspaceDeleteRange = editor => { + if (hasListSelection(editor)) { + editor.undoManager.transact(() => { editor.execCommand('Delete'); normalizeLists(editor.dom, editor.getBody()); }); @@ -2014,11 +1614,18 @@ } return false; }; - var backspaceDelete = function (editor, isForward) { - return editor.selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor); + const backspaceDelete = (editor, isForward) => { + const selection = editor.selection; + return !isWithinNonEditableList(editor, selection.getNode()) && (selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor)); }; - var setup$1 = function (editor) { - editor.on('keydown', function (e) { + const setup$2 = editor => { + editor.on('ExecCommand', e => { + const cmd = e.command.toLowerCase(); + if ((cmd === 'delete' || cmd === 'forwarddelete') && hasListSelection(editor)) { + normalizeLists(editor.dom, editor.getBody()); + } + }); + editor.on('keydown', e => { if (e.keyCode === global$4.BACKSPACE) { if (backspaceDelete(editor, false)) { e.preventDefault(); @@ -2031,60 +1638,51 @@ }); }; - var get = function (editor) { - return { - backspaceDelete: function (isForward) { - backspaceDelete(editor, isForward); - } - }; - }; + const get = editor => ({ + backspaceDelete: isForward => { + backspaceDelete(editor, isForward); + } + }); - var updateList = function (editor, update) { - var parentList = getParentList(editor); - editor.undoManager.transact(function () { + const updateList = (editor, update) => { + const parentList = getParentList(editor); + if (parentList === null || isWithinNonEditableList(editor, parentList)) { + return; + } + editor.undoManager.transact(() => { if (isObject(update.styles)) { editor.dom.setStyles(parentList, update.styles); } if (isObject(update.attrs)) { - each(update.attrs, function (v, k) { - return editor.dom.setAttrib(parentList, k, v); - }); + each(update.attrs, (v, k) => editor.dom.setAttrib(parentList, k, v)); } }); }; - var parseAlphabeticBase26 = function (str) { - var chars = reverse(trim(str).split('')); - var values = map(chars, function (char, i) { - var charValue = char.toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0) + 1; + const parseAlphabeticBase26 = str => { + const chars = reverse(trim(str).split('')); + const values = map(chars, (char, i) => { + const charValue = char.toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0) + 1; return Math.pow(26, i) * charValue; }); - return foldl(values, function (sum, v) { - return sum + v; - }, 0); + return foldl(values, (sum, v) => sum + v, 0); }; - var composeAlphabeticBase26 = function (value) { + const composeAlphabeticBase26 = value => { value--; if (value < 0) { return ''; } else { - var remainder = value % 26; - var quotient = Math.floor(value / 26); - var rest = composeAlphabeticBase26(quotient); - var char = String.fromCharCode('A'.charCodeAt(0) + remainder); + const remainder = value % 26; + const quotient = Math.floor(value / 26); + const rest = composeAlphabeticBase26(quotient); + const char = String.fromCharCode('A'.charCodeAt(0) + remainder); return rest + char; } }; - var isUppercase = function (str) { - return /^[A-Z]+$/.test(str); - }; - var isLowercase = function (str) { - return /^[a-z]+$/.test(str); - }; - var isNumeric = function (str) { - return /^[0-9]+$/.test(str); - }; - var deduceListType = function (start) { + const isUppercase = str => /^[A-Z]+$/.test(str); + const isLowercase = str => /^[a-z]+$/.test(str); + const isNumeric = str => /^[0-9]+$/.test(str); + const deduceListType = start => { if (isNumeric(start)) { return 2; } else if (isUppercase(start)) { @@ -2097,12 +1695,12 @@ return 4; } }; - var parseStartValue = function (start) { + const parseStartValue = start => { switch (deduceListType(start)) { case 2: return Optional.some({ listStyleType: Optional.none(), - start: start + start }); case 0: return Optional.some({ @@ -2123,20 +1721,20 @@ return Optional.none(); } }; - var parseDetail = function (detail) { - var start = parseInt(detail.start, 10); - if (is(detail.listStyleType, 'upper-alpha')) { + const parseDetail = detail => { + const start = parseInt(detail.start, 10); + if (is$2(detail.listStyleType, 'upper-alpha')) { return composeAlphabeticBase26(start); - } else if (is(detail.listStyleType, 'lower-alpha')) { + } else if (is$2(detail.listStyleType, 'lower-alpha')) { return composeAlphabeticBase26(start).toLowerCase(); } else { return detail.start; } }; - var open = function (editor) { - var currentList = getParentList(editor); - if (!isOlNode(currentList)) { + const open = editor => { + const currentList = getParentList(editor); + if (!isOlNode(currentList) || isWithinNonEditableList(editor, currentList)) { return; } editor.windowManager.open({ @@ -2153,7 +1751,7 @@ initialData: { start: parseDetail({ start: editor.dom.getAttrib(currentList, 'start', '1'), - listStyleType: Optional.some(editor.dom.getStyle(currentList, 'list-style-type')) + listStyleType: Optional.from(editor.dom.getStyle(currentList, 'list-style-type')) }) }, buttons: [ @@ -2169,9 +1767,9 @@ primary: true } ], - onSubmit: function (api) { - var data = api.getData(); - parseStartValue(data.start).each(function (detail) { + onSubmit: api => { + const data = api.getData(); + parseStartValue(data.start).each(detail => { editor.execCommand('mceListUpdate', false, { attrs: { start: detail.start === '1' ? '' : detail.start }, styles: { 'list-style-type': detail.listStyleType.getOr('') } @@ -2182,40 +1780,38 @@ }); }; - var queryListCommandState = function (editor, listName) { - return function () { - var parentList = getParentList(editor); - return parentList && parentList.nodeName === listName; - }; + const queryListCommandState = (editor, listName) => () => { + const parentList = getParentList(editor); + return isNonNullable(parentList) && parentList.nodeName === listName; }; - var registerDialog = function (editor) { - editor.addCommand('mceListProps', function () { + const registerDialog = editor => { + editor.addCommand('mceListProps', () => { open(editor); }); }; - var register$2 = function (editor) { - editor.on('BeforeExecCommand', function (e) { - var cmd = e.command.toLowerCase(); + const register$2 = editor => { + editor.on('BeforeExecCommand', e => { + const cmd = e.command.toLowerCase(); if (cmd === 'indent') { indentListSelection(editor); } else if (cmd === 'outdent') { outdentListSelection(editor); } }); - editor.addCommand('InsertUnorderedList', function (ui, detail) { + editor.addCommand('InsertUnorderedList', (ui, detail) => { toggleList(editor, 'UL', detail); }); - editor.addCommand('InsertOrderedList', function (ui, detail) { + editor.addCommand('InsertOrderedList', (ui, detail) => { toggleList(editor, 'OL', detail); }); - editor.addCommand('InsertDefinitionList', function (ui, detail) { + editor.addCommand('InsertDefinitionList', (ui, detail) => { toggleList(editor, 'DL', detail); }); - editor.addCommand('RemoveList', function () { + editor.addCommand('RemoveList', () => { flattenListSelection(editor); }); registerDialog(editor); - editor.addCommand('mceListUpdate', function (ui, detail) { + editor.addCommand('mceListUpdate', (ui, detail) => { if (isObject(detail)) { updateList(editor, detail); } @@ -2225,78 +1821,117 @@ editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL')); }; - var setupTabKey = function (editor) { - editor.on('keydown', function (e) { + var global = tinymce.util.Tools.resolve('tinymce.html.Node'); + + const isTextNode = node => node.type === 3; + const isEmpty = nodeBuffer => nodeBuffer.length === 0; + const wrapInvalidChildren = list => { + const insertListItem = (buffer, refNode) => { + const li = global.create('li'); + each$1(buffer, node => li.append(node)); + if (refNode) { + list.insert(li, refNode, true); + } else { + list.append(li); + } + }; + const reducer = (buffer, node) => { + if (isTextNode(node)) { + return [ + ...buffer, + node + ]; + } else if (!isEmpty(buffer) && !isTextNode(node)) { + insertListItem(buffer, node); + return []; + } else { + return buffer; + } + }; + const restBuffer = foldl(list.children(), reducer, []); + if (!isEmpty(restBuffer)) { + insertListItem(restBuffer); + } + }; + const setup$1 = editor => { + editor.on('PreInit', () => { + const {parser} = editor; + parser.addNodeFilter('ul,ol', nodes => each$1(nodes, wrapInvalidChildren)); + }); + }; + + const setupTabKey = editor => { + editor.on('keydown', e => { if (e.keyCode !== global$4.TAB || global$4.metaKeyPressed(e)) { return; } - editor.undoManager.transact(function () { + editor.undoManager.transact(() => { if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) { e.preventDefault(); } }); }); }; - var setup = function (editor) { + const setup = editor => { if (shouldIndentOnTab(editor)) { setupTabKey(editor); } - setup$1(editor); + setup$2(editor); }; - var register$1 = function (editor) { - var exec = function (command) { - return function () { - return editor.execCommand(command); - }; + const setupToggleButtonHandler = (editor, listName) => api => { + const toggleButtonHandler = e => { + api.setActive(inList(e.parents, listName)); + api.setEnabled(!isWithinNonEditableList(editor, e.element) && editor.selection.isEditable()); }; + api.setEnabled(editor.selection.isEditable()); + return setNodeChangeHandler(editor, toggleButtonHandler); + }; + const register$1 = editor => { + const exec = command => () => editor.execCommand(command); if (!editor.hasPlugin('advlist')) { editor.ui.registry.addToggleButton('numlist', { icon: 'ordered-list', active: false, tooltip: 'Numbered list', onAction: exec('InsertOrderedList'), - onSetup: function (api) { - return listState(editor, 'OL', api.setActive); - } + onSetup: setupToggleButtonHandler(editor, 'OL') }); editor.ui.registry.addToggleButton('bullist', { icon: 'unordered-list', active: false, tooltip: 'Bullet list', onAction: exec('InsertUnorderedList'), - onSetup: function (api) { - return listState(editor, 'UL', api.setActive); - } + onSetup: setupToggleButtonHandler(editor, 'UL') }); } }; - var register = function (editor) { - var listProperties = { + const setupMenuButtonHandler = (editor, listName) => api => { + const menuButtonHandler = e => api.setEnabled(inList(e.parents, listName) && !isWithinNonEditableList(editor, e.element)); + return setNodeChangeHandler(editor, menuButtonHandler); + }; + const register = editor => { + const listProperties = { text: 'List properties...', icon: 'ordered-list', - onAction: function () { - return editor.execCommand('mceListProps'); - }, - onSetup: function (api) { - return listState(editor, 'OL', function (active) { - return api.setDisabled(!active); - }); - } + onAction: () => editor.execCommand('mceListProps'), + onSetup: setupMenuButtonHandler(editor, 'OL') }; editor.ui.registry.addMenuItem('listprops', listProperties); editor.ui.registry.addContextMenu('lists', { - update: function (node) { - var parentList = getParentList(editor, node); + update: node => { + const parentList = getParentList(editor, node); return isOlNode(parentList) ? ['listprops'] : []; } }); }; - function Plugin () { - global$7.add('lists', function (editor) { - if (editor.hasPlugin('rtc', true) === false) { + var Plugin = () => { + global$7.add('lists', editor => { + register$3(editor); + setup$1(editor); + if (!editor.hasPlugin('rtc', true)) { setup(editor); register$2(editor); } else { @@ -2306,8 +1941,8 @@ register(editor); return get(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/lists/plugin.min.js b/public/js/tinymce/plugins/lists/plugin.min.js index 5876090e3..2dc22048d 100644 --- a/public/js/tinymce/plugins/lists/plugin.min.js +++ b/public/js/tinymce/plugins/lists/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function e(r){return function(e){return n=typeof(t=e),(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n)===r;var t,n}}function t(t){return function(e){return typeof e===t}}function u(){}function S(e){return function(){return e}}function n(e){return e}function r(e,t){return e===t}function y(t){return function(e){return!t(e)}}function o(){return p}var i=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=e("string"),O=e("object"),s=e("array"),c=t("boolean"),f=t("function"),d=t("number"),l=S(!1),m=S(!0),p={fold:function(e,t){return e()},isSome:l,isNone:m,getOr:n,getOrThunk:g,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:S(null),getOrUndefined:S(void 0),or:n,orThunk:g,map:o,each:u,bind:o,exists:l,forall:m,filter:function(){return p},toArray:function(){return[]},toString:S("none()")};function g(e){return e()}function C(e,t){for(var n=e.length,r=new Array(n),o=0;o=e.childNodes.length?n.data.length:0}:n.previousSibling&&Me(n.previousSibling)?{container:n.previousSibling,offset:n.previousSibling.data.length}:n.nextSibling&&Me(n.nextSibling)?{container:n.nextSibling,offset:0}:{container:e,offset:t}}function We(e){var t=e.cloneRange(),n=Ve(e.startContainer,e.startOffset);t.setStart(n.container,n.offset);var r=Ve(e.endContainer,e.endOffset);return t.setEnd(r.container,r.offset),t}function Qe(e,t){var n=t||e.selection.getStart(!0);return e.dom.getParent(n,"OL,UL,DL",qt(e,n))}function Xe(e){var t,n,r=e.selection.getSelectedBlocks();return L((t=e,n=Mt.map(r,function(e){return t.dom.getParent(e,"li,dd,dt",qt(t,e))||e}),Xt.unique(n)),Ft)}function qe(e,t){return w(e.dom.getParents(t,"ol,ul",qt(e,t)))}function ze(e,t,n){return void 0===n&&(n=r),e.exists(function(e){return n(e,t)})}function Ye(e,t,n){return e.isSome()&&t.isSome()?E.some(n(e.getOrDie(),t.getOrDie())):E.none()}function Ze(e,t,n){return e.fire("ListMutation",{action:t,element:n})}function Ge(e,t){we(e.item,t.list)}function Je(e,t){for(var n=0;ne.length?tt:et)(r,e,t)},[])).map(function(e){return e.list}).toArray()}function ft(e,t){b(L(e,it),function(e){return function(e){switch(t){case"Indent":e.depth++;break;case"Outdent":e.depth--;break;case"Flatten":e.depth=0}e.dirty=!0}(e),0})}function dt(e,t){var n,r,o,i,a,s,u,c,f,d,l,m,p,g=C((i=qe(o=r=e,o.selection.getStart()),a=L(o.selection.getSelectedBlocks(),_t),s=i.toArray().concat(a),zt(r,s)),me.fromDom),v=C(L(Xe(e),Ht),me.fromDom),h=!1;return(g.length||v.length)&&(n=e.selection.getBookmark(),c=t,b((f=g,p=C(Xe(u=e),me.fromDom),d=Ye(N(p,y(rt)),N(D(p),y(rt)),function(e,t){return{start:e,end:t}}),l=!1,m={get:function(){return l},set:function(e){l=e}},C(f,function(e){return{sourceList:e,entries:Yt(0,d,m,e)}})),function(e){ft(e.entries,c);var t,n,r=(t=u,T(function(e,t){if(0===e.length)return[];for(var n=t(e[0]),r=[],o=[],i=0,a=e.length;it=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=r=e,(o=String).prototype.isPrototypeOf(n)||(null===(s=r.constructor)||void 0===s?void 0:s.name)===o.name)?"string":t;var n,r,o,s})(t)===e,n=e=>t=>typeof t===e,r=t("string"),o=t("object"),s=t("array"),i=n("boolean"),l=e=>!(e=>null==e)(e),a=n("function"),d=n("number"),c=()=>{},u=(e,t)=>e===t,m=e=>t=>!e(t),p=(!1,()=>false);class g{constructor(e,t){this.tag=e,this.value=t}static some(e){return new g(!0,e)}static none(){return g.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?g.some(e(this.value)):g.none()}bind(e){return this.tag?e(this.value):g.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:g.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(null!=e?e:"Called getOrDie on None")}static from(e){return l(e)?g.some(e):g.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}g.singletonNone=new g(!1);const h=Array.prototype.slice,f=Array.prototype.indexOf,y=Array.prototype.push,v=(e,t)=>{return n=e,r=t,f.call(n,r)>-1;var n,r},b=(e,t)=>{for(let n=0,r=e.length;n{const n=e.length,r=new Array(n);for(let o=0;o{for(let n=0,r=e.length;n{const n=[];for(let r=0,o=e.length;r(S(e,((e,r)=>{n=t(n,e,r)})),n),O=(e,t,n)=>{for(let r=0,o=e.length;rO(e,t,p),T=(e,t)=>(e=>{const t=[];for(let n=0,r=e.length;n{const t=h.call(e,0);return t.reverse(),t},x=(e,t)=>t>=0&&tx(e,0),w=e=>x(e,e.length-1),D=(e,t)=>{const n=[],r=a(t)?e=>b(n,(n=>t(n,e))):e=>v(n,e);for(let t=0,o=e.length;te.exists((e=>n(e,t))),I=(e,t,n)=>e.isSome()&&t.isSome()?g.some(n(e.getOrDie(),t.getOrDie())):g.none(),P=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},M=(e,t)=>{const n=(t||document).createElement(e);return P(n)},R=P,U=(e,t)=>e.dom===t.dom;"undefined"!=typeof window?window:Function("return this;")();const $=e=>e.dom.nodeName.toLowerCase(),_=(1,e=>1===(e=>e.dom.nodeType)(e));const F=e=>t=>_(t)&&$(t)===e,H=e=>g.from(e.dom.parentNode).map(R),V=e=>C(e.dom.childNodes,R),j=(e,t)=>{const n=e.dom.childNodes;return g.from(n[t]).map(R)},K=e=>j(e,0),z=e=>j(e,e.dom.childNodes.length-1),Q=(e,t,n)=>{let r=e.dom;const o=a(n)?n:p;for(;r.parentNode;){r=r.parentNode;const e=R(r);if(t(e))return g.some(e);if(o(e))break}return g.none()},q=(e,t,n)=>((e,t,n,r,o)=>r(n)?g.some(n):a(o)&&o(n)?g.none():t(n,r,o))(0,Q,e,t,n),W=(e,t)=>{H(e).each((n=>{n.dom.insertBefore(t.dom,e.dom)}))},Z=(e,t)=>{e.dom.appendChild(t.dom)},G=(e,t)=>{S(t,(t=>{Z(e,t)}))},J=e=>{e.dom.textContent="",S(V(e),(e=>{X(e)}))},X=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)};var Y=tinymce.util.Tools.resolve("tinymce.dom.RangeUtils"),ee=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker"),te=tinymce.util.Tools.resolve("tinymce.util.VK");const ne=e=>C(e,R),re=Object.keys,oe=(e,t)=>{const n=re(e);for(let r=0,o=n.length;r{const n=e.dom;oe(t,((e,t)=>{((e,t,n)=>{if(!(r(n)||i(n)||d(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")})(n,t,e)}))},ie=e=>L(e.dom.attributes,((e,t)=>(e[t.name]=t.value,e)),{}),le=e=>((e,t)=>R(e.dom.cloneNode(!0)))(e),ae=(e,t)=>{const n=((e,t)=>{const n=M(t),r=ie(e);return se(n,r),n})(e,t);var r,o;o=n,(e=>g.from(e.dom.nextSibling).map(R))(r=e).fold((()=>{H(r).each((e=>{Z(e,o)}))}),(e=>{W(e,o)}));const s=V(e);return G(n,s),X(e),n};var de=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),ce=tinymce.util.Tools.resolve("tinymce.util.Tools");const ue=e=>t=>l(t)&&t.nodeName.toLowerCase()===e,me=e=>t=>l(t)&&e.test(t.nodeName),pe=e=>l(e)&&3===e.nodeType,ge=e=>l(e)&&1===e.nodeType,he=me(/^(OL|UL|DL)$/),fe=me(/^(OL|UL)$/),ye=ue("ol"),ve=me(/^(LI|DT|DD)$/),be=me(/^(DT|DD)$/),Ce=me(/^(TH|TD)$/),Se=ue("br"),Ne=(e,t)=>l(t)&&t.nodeName in e.schema.getTextBlockElements(),Le=(e,t)=>l(e)&&e.nodeName in t,Oe=(e,t)=>l(t)&&t.nodeName in e.schema.getVoidElements(),ke=(e,t,n)=>{const r=e.isEmpty(t);return!(n&&e.select("span[data-mce-type=bookmark]",t).length>0)&&r},Te=(e,t)=>e.isChildOf(t,e.getRoot()),Ae=e=>t=>t.options.get(e),xe=Ae("lists_indent_on_tab"),Ee=Ae("forced_root_block"),we=Ae("forced_root_block_attrs"),De=(e,t)=>{const n=e.dom,r=e.schema.getBlockElements(),o=n.createFragment(),s=Ee(e),i=we(e);let l,a,d=!1;for(a=n.create(s,i),Le(t.firstChild,r)||o.appendChild(a);l=t.firstChild;){const e=l.nodeName;d||"SPAN"===e&&"bookmark"===l.getAttribute("data-mce-type")||(d=!0),Le(l,r)?(o.appendChild(l),a=null):(a||(a=n.create(s,i),o.appendChild(a)),a.appendChild(l))}return!d&&a&&a.appendChild(n.create("br",{"data-mce-bogus":"1"})),o},Be=de.DOM,Ie=F("dd"),Pe=F("dt"),Me=(e,t)=>{var n;Ie(t)?ae(t,"dt"):Pe(t)&&(n=t,g.from(n.dom.parentElement).map(R)).each((n=>((e,t,n)=>{const r=Be.select('span[data-mce-type="bookmark"]',t),o=De(e,n),s=Be.createRng();s.setStartAfter(n),s.setEndAfter(t);const i=s.extractContents();for(let t=i.firstChild;t;t=t.firstChild)if("LI"===t.nodeName&&e.dom.isEmpty(t)){Be.remove(t);break}e.dom.isEmpty(i)||Be.insertAfter(i,t),Be.insertAfter(o,t);const l=n.parentElement;l&&ke(e.dom,l)&&(e=>{const t=e.parentNode;t&&ce.each(r,(e=>{t.insertBefore(e,n.parentNode)})),Be.remove(e)})(l),Be.remove(n),ke(e.dom,t)&&Be.remove(t)})(e,n.dom,t.dom)))},Re=e=>{Pe(e)&&ae(e,"dd")},Ue=(e,t)=>{if(pe(e))return{container:e,offset:t};const n=Y.getNode(e,t);return pe(n)?{container:n,offset:t>=e.childNodes.length?n.data.length:0}:n.previousSibling&&pe(n.previousSibling)?{container:n.previousSibling,offset:n.previousSibling.data.length}:n.nextSibling&&pe(n.nextSibling)?{container:n.nextSibling,offset:0}:{container:e,offset:t}},$e=e=>{const t=e.cloneRange(),n=Ue(e.startContainer,e.startOffset);t.setStart(n.container,n.offset);const r=Ue(e.endContainer,e.endOffset);return t.setEnd(r.container,r.offset),t},_e=["OL","UL","DL"],Fe=_e.join(","),He=(e,t)=>{const n=t||e.selection.getStart(!0);return e.dom.getParent(n,Fe,Ke(e,n))},Ve=e=>{const t=e.selection.getSelectedBlocks();return N(((e,t)=>{const n=ce.map(t,(t=>e.dom.getParent(t,"li,dd,dt",Ke(e,t))||t));return D(n)})(e,t),ve)},je=(e,t)=>{const n=e.dom.getParents(t,"TD,TH");return n.length>0?n[0]:e.getBody()},Ke=(e,t)=>{const n=e.dom.getParents(t,e.dom.isBlock),r=k(n,(t=>{return n=e.schema,!he(r=t)&&!ve(r)&&b(_e,(e=>n.isValidChild(r.nodeName,e)));var n,r}));return r.getOr(e.getBody())},ze=(e,t)=>{const n=e.dom.getParents(t,"ol,ul",Ke(e,t));return w(n)},Qe=(e,t)=>{const n=C(t,(t=>ze(e,t).getOr(t)));return D(n)},qe=e=>/\btox\-/.test(e.className),We=(e,t)=>O(e,he,Ce).exists((e=>e.nodeName===t&&!qe(e))),Ze=(e,t)=>null!==t&&!e.dom.isEditable(t),Ge=(e,t)=>{const n=e.dom.getParent(t,"ol,ul,dl");return Ze(e,n)},Je=(e,t)=>{const n=e.selection.getNode();return t({parents:e.dom.getParents(n),element:n}),e.on("NodeChange",t),()=>e.off("NodeChange",t)},Xe=(e,t,n)=>e.dispatch("ListMutation",{action:t,element:n}),Ye=(et=/^\s+|\s+$/g,e=>e.replace(et,""));var et;const tt=(e,t,n)=>{((e,t,n)=>{if(!r(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);(e=>void 0!==e.style&&a(e.style.getPropertyValue))(e)&&e.style.setProperty(t,n)})(e.dom,t,n)},nt=(e,t)=>{Z(e.item,t.list)},rt=(e,t)=>{const n={list:M(t,e),item:M("li",e)};return Z(n.list,n.item),n},ot=e=>((e,t)=>{const n=e.dom;if(1!==n.nodeType)return!1;{const e=n;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}})(e,"OL,UL"),st=e=>K(e).exists(ot),it=e=>e.depth>0,lt=e=>e.isSelected,at=e=>{const t=V(e),n=z(e).exists(ot)?t.slice(0,-1):t;return C(n,le)},dt=e=>(S(e,((t,n)=>{((e,t)=>{const n=e[t].depth,r=e=>e.depth===n&&!e.dirty,o=e=>e.depthO(e.slice(t+1),r,o)))})(e,n).fold((()=>{t.dirty&&(e=>{e.listAttributes=((e,t)=>{const n={};var r;return((e,t,n,r)=>{oe(e,((e,o)=>{(t(e,o)?n:r)(e,o)}))})(e,t,(r=n,(e,t)=>{r[t]=e}),c),n})(e.listAttributes,((e,t)=>"start"!==t))})(t)}),(e=>{return r=e,(n=t).listType=r.listType,void(n.listAttributes={...r.listAttributes});var n,r}))})),e),ct=(e,t,n,r)=>K(r).filter(ot).fold((()=>{t.each((e=>{U(e.start,r)&&n.set(!0)}));const o=((e,t,n)=>H(e).filter(_).map((r=>({depth:t,dirty:!1,isSelected:n,content:at(e),itemAttributes:ie(e),listAttributes:ie(r),listType:$(r)}))))(r,e,n.get());t.each((e=>{U(e.end,r)&&n.set(!1)}));const s=z(r).filter(ot).map((r=>ut(e,t,n,r))).getOr([]);return o.toArray().concat(s)}),(r=>ut(e,t,n,r))),ut=(e,t,n,r)=>T(V(r),(r=>(ot(r)?ut:ct)(e+1,t,n,r))),mt=(e,t)=>{const n=dt(t);return((e,t)=>{const n=L(t,((t,n)=>n.depth>t.length?((e,t,n)=>{const r=((e,t,n)=>{const r=[];for(let o=0;o{for(let t=1;t{for(let t=0;t{se(e.list,t.listAttributes),se(e.item,t.itemAttributes),G(e.item,t.content)}))})(r,n),o=r,I(w(t),E(o),nt),t.concat(r)})(e,t,n):((e,t,n)=>{const r=t.slice(0,n.depth);return w(r).each((t=>{const r=((e,t,n)=>{const r=M("li",e);return se(r,t),G(r,n),r})(e,n.itemAttributes,n.content);((e,t)=>{Z(e.list,t),e.item=t})(t,r),((e,t)=>{$(e.list)!==t.listType&&(e.list=ae(e.list,t.listType)),se(e.list,t.listAttributes)})(t,n)})),r})(e,t,n)),[]);return E(n).map((e=>e.list))})(e.contentDocument,n).toArray()},pt=(e,t,n)=>{const r=((e,t)=>{const n=(e=>{let t=!1;return{get:()=>t,set:e=>{t=e}}})();return C(e,(e=>({sourceList:e,entries:ut(0,t,n,e)})))})(t,(e=>{const t=C(Ve(e),R);return I(k(t,m(st)),k(A(t),m(st)),((e,t)=>({start:e,end:t})))})(e));S(r,(t=>{((e,t)=>{S(N(e,lt),(e=>((e,t)=>{switch(e){case"Indent":t.depth++;break;case"Outdent":t.depth--;break;case"Flatten":t.depth=0}t.dirty=!0})(t,e)))})(t.entries,n);const r=((e,t)=>T(((e,t)=>{if(0===e.length)return[];{let n=t(e[0]);const r=[];let o=[];for(let s=0,i=e.length;sE(t).exists(it)?mt(e,t):((e,t)=>{const n=dt(t);return C(n,(t=>{const n=((e,t)=>{const n=document.createDocumentFragment();return S(e,(e=>{n.appendChild(e.dom)})),R(n)})(t.content);return R(De(e,n.dom))}))})(e,t))))(e,t.entries);var o;S(r,(t=>{Xe(e,"Indent"===n?"IndentList":"OutdentList",t.dom)})),o=t.sourceList,S(r,(e=>{W(o,e)})),X(t.sourceList)}))},gt=(e,t)=>{const n=ne((e=>{const t=(e=>{const t=ze(e,e.selection.getStart()),n=N(e.selection.getSelectedBlocks(),fe);return t.toArray().concat(n)})(e);return Qe(e,t)})(e)),r=ne((e=>N(Ve(e),be))(e));let o=!1;if(n.length||r.length){const s=e.selection.getBookmark();pt(e,n,t),((e,t,n)=>{S(n,"Indent"===t?Re:t=>Me(e,t))})(e,t,r),e.selection.moveToBookmark(s),e.selection.setRng($e(e.selection.getRng())),e.nodeChanged(),o=!0}return o},ht=(e,t)=>!(e=>{const t=He(e);return Ze(e,t)})(e)&>(e,t),ft=e=>ht(e,"Indent"),yt=e=>ht(e,"Outdent"),vt=e=>ht(e,"Flatten"),bt=e=>"\ufeff"===e;var Ct=tinymce.util.Tools.resolve("tinymce.dom.BookmarkManager");const St=de.DOM,Nt=e=>{const t={},n=n=>{let r=e[n?"startContainer":"endContainer"],o=e[n?"startOffset":"endOffset"];if(ge(r)){const e=St.create("span",{"data-mce-type":"bookmark"});r.hasChildNodes()?(o=Math.min(o,r.childNodes.length-1),n?r.insertBefore(e,r.childNodes[o]):St.insertAfter(e,r.childNodes[o])):r.appendChild(e),r=e,o=0}t[n?"startContainer":"endContainer"]=r,t[n?"startOffset":"endOffset"]=o};return n(!0),e.collapsed||n(),t},Lt=e=>{const t=t=>{let n=e[t?"startContainer":"endContainer"],r=e[t?"startOffset":"endOffset"];if(n){if(ge(n)&&n.parentNode){const e=n;r=(e=>{var t;let n=null===(t=e.parentNode)||void 0===t?void 0:t.firstChild,r=0;for(;n;){if(n===e)return r;ge(n)&&"bookmark"===n.getAttribute("data-mce-type")||r++,n=n.nextSibling}return-1})(n),n=n.parentNode,St.remove(e),!n.hasChildNodes()&&St.isBlock(n)&&n.appendChild(St.create("br"))}e[t?"startContainer":"endContainer"]=n,e[t?"startOffset":"endOffset"]=r}};t(!0),t();const n=St.createRng();return n.setStart(e.startContainer,e.startOffset),e.endContainer&&n.setEnd(e.endContainer,e.endOffset),$e(n)},Ot=e=>{switch(e){case"UL":return"ToggleUlList";case"OL":return"ToggleOlList";case"DL":return"ToggleDLList"}},kt=(e,t)=>{ce.each(t,((t,n)=>{e.setAttribute(n,t)}))},Tt=(e,t,n)=>{((e,t,n)=>{const r=n["list-style-type"]?n["list-style-type"]:null;e.setStyle(t,"list-style-type",r)})(e,t,n),((e,t,n)=>{kt(t,n["list-attributes"]),ce.each(e.select("li",t),(e=>{kt(e,n["list-item-attributes"])}))})(e,t,n)},At=(e,t)=>l(t)&&!Le(t,e.schema.getBlockElements()),xt=(e,t,n,r)=>{let o=t[n?"startContainer":"endContainer"];const s=t[n?"startOffset":"endOffset"];ge(o)&&(o=o.childNodes[Math.min(s,o.childNodes.length-1)]||o),!n&&Se(o.nextSibling)&&(o=o.nextSibling);const i=(t,n)=>{var o;const s=new ee(t,r),i=n?"next":"prev";let l;for(;l=s[i]();)if(!Oe(e,l)&&!bt(l.textContent)&&0!==(null===(o=l.textContent)||void 0===o?void 0:o.length))return g.some(l);return g.none()};if(n&&pe(o))if(bt(o.textContent))o=i(o,!1).getOr(o);else for(null!==o.parentNode&&At(e,o.parentNode)&&(o=o.parentNode);null!==o.previousSibling&&(At(e,o.previousSibling)||pe(o.previousSibling));)o=o.previousSibling;if(!n&&pe(o))if(bt(o.textContent))o=i(o,!0).getOr(o);else for(null!==o.parentNode&&At(e,o.parentNode)&&(o=o.parentNode);null!==o.nextSibling&&(At(e,o.nextSibling)||pe(o.nextSibling));)o=o.nextSibling;for(;o.parentNode!==r;){const t=o.parentNode;if(Ne(e,o))return o;if(/^(TD|TH)$/.test(t.nodeName))return o;o=t}return o},Et=(e,t,n)=>{const r=e.selection.getRng();let o="LI";const s=Ke(e,e.selection.getStart(!0)),i=e.dom;if("false"===i.getContentEditable(e.selection.getNode()))return;"DL"===(t=t.toUpperCase())&&(o="DT");const l=Nt(r),a=N(((e,t,n)=>{const r=[],o=e.dom,s=xt(e,t,!0,n),i=xt(e,t,!1,n);let l;const a=[];for(let e=s;e&&(a.push(e),e!==i);e=e.nextSibling);return ce.each(a,(t=>{var s;if(Ne(e,t))return r.push(t),void(l=null);if(o.isBlock(t)||Se(t))return Se(t)&&o.remove(t),void(l=null);const i=t.nextSibling;Ct.isBookmarkNode(t)&&(he(i)||Ne(e,i)||!i&&t.parentNode===n)?l=null:(l||(l=o.create("p"),null===(s=t.parentNode)||void 0===s||s.insertBefore(l,t),r.push(l)),l.appendChild(t))})),r})(e,r,s),e.dom.isEditable);ce.each(a,(r=>{let s;const l=r.previousSibling,a=r.parentNode;ve(a)||(l&&he(l)&&l.nodeName===t&&((e,t,n)=>{const r=e.getStyle(t,"list-style-type");let o=n?n["list-style-type"]:"";return o=null===o?"":o,r===o})(i,l,n)?(s=l,r=i.rename(r,o),l.appendChild(r)):(s=i.create(t),a.insertBefore(s,r),s.appendChild(r),r=i.rename(r,o)),((e,t,n)=>{ce.each(["margin","margin-right","margin-bottom","margin-left","margin-top","padding","padding-right","padding-bottom","padding-left","padding-top"],(n=>e.setStyle(t,n,"")))})(i,r),Tt(i,s,n),Dt(e.dom,s))})),e.selection.setRng(Lt(l))},wt=(e,t,n)=>{return((e,t)=>he(e)&&e.nodeName===(null==t?void 0:t.nodeName))(t,n)&&((e,t,n)=>e.getStyle(t,"list-style-type",!0)===e.getStyle(n,"list-style-type",!0))(e,t,n)&&(r=n,t.className===r.className);var r},Dt=(e,t)=>{let n,r=t.nextSibling;if(wt(e,t,r)){const o=r;for(;n=o.firstChild;)t.appendChild(n);e.remove(o)}if(r=t.previousSibling,wt(e,t,r)){const o=r;for(;n=o.lastChild;)t.insertBefore(n,t.firstChild);e.remove(o)}},Bt=e=>"list-style-type"in e,It=(e,t,n)=>{const r=He(e);if(Ge(e,r)||!e.hasEditableRoot())return;const s=(e=>{const t=He(e),n=e.selection.getSelectedBlocks();return((e,t)=>l(e)&&1===t.length&&t[0]===e)(t,n)?(e=>N(e.querySelectorAll(Fe),he))(t):N(n,(e=>he(e)&&t!==e))})(e),i=o(n)?n:{};s.length>0?((e,t,n,r,o)=>{const s=he(t);if(s&&t.nodeName===r&&!Bt(o))vt(e);else{Et(e,r,o);const i=Nt(e.selection.getRng()),l=s?[t,...n]:n;ce.each(l,(t=>{((e,t,n,r)=>{if(t.nodeName!==n){const o=e.dom.rename(t,n);Tt(e.dom,o,r),Xe(e,Ot(n),o)}else Tt(e.dom,t,r),Xe(e,Ot(n),t)})(e,t,r,o)})),e.selection.setRng(Lt(i))}})(e,r,s,t,i):((e,t,n,r)=>{if(t!==e.getBody())if(t)if(t.nodeName!==n||Bt(r)||qe(t)){const o=Nt(e.selection.getRng());Tt(e.dom,t,r);const s=e.dom.rename(t,n);Dt(e.dom,s),e.selection.setRng(Lt(o)),Et(e,n,r),Xe(e,Ot(n),s)}else vt(e);else Et(e,n,r),Xe(e,Ot(n),t)})(e,r,t,i)},Pt=de.DOM,Mt=(e,t)=>{const n=ce.grep(e.select("ol,ul",t));ce.each(n,(t=>{((e,t)=>{const n=t.parentElement;if(n&&"LI"===n.nodeName&&n.firstChild===t){const r=n.previousSibling;r&&"LI"===r.nodeName?(r.appendChild(t),ke(e,n)&&Pt.remove(n)):Pt.setStyle(n,"listStyleType","none")}if(he(n)){const e=n.previousSibling;e&&"LI"===e.nodeName&&e.appendChild(t)}})(e,t)}))},Rt=(e,t,n,r)=>{let o=t.startContainer;const s=t.startOffset;if(pe(o)&&(n?s0))return o;const i=e.schema.getNonEmptyElements();ge(o)&&(o=Y.getNode(o,s));const l=new ee(o,r);n&&((e,t)=>!!Se(t)&&e.isBlock(t.nextSibling)&&!Se(t.previousSibling))(e.dom,o)&&l.next();const a=n?l.next.bind(l):l.prev2.bind(l);for(;o=a();){if("LI"===o.nodeName&&!o.hasChildNodes())return o;if(i[o.nodeName])return o;if(pe(o)&&o.data.length>0)return o}return null},Ut=(e,t)=>{const n=t.childNodes;return 1===n.length&&!he(n[0])&&e.isBlock(n[0])},$t=(e,t,n)=>{let r;const o=t.parentNode;if(!Te(e,t)||!Te(e,n))return;he(n.lastChild)&&(r=n.lastChild),o===n.lastChild&&Se(o.previousSibling)&&e.remove(o.previousSibling);const s=n.lastChild;s&&Se(s)&&t.hasChildNodes()&&e.remove(s),ke(e,n,!0)&&J(R(n)),((e,t,n)=>{let r;const o=Ut(e,n)?n.firstChild:n;if(((e,t)=>{Ut(e,t)&&e.remove(t.firstChild,!0)})(e,t),!ke(e,t,!0))for(;r=t.firstChild;)o.appendChild(r)})(e,t,n),r&&n.appendChild(r);const i=((e,t)=>{const n=e.dom,r=t.dom;return n!==r&&n.contains(r)})(R(n),R(t))?e.getParents(t,he,n):[];e.remove(t),S(i,(t=>{ke(e,t)&&t!==e.getRoot()&&e.remove(t)}))},_t=(e,t)=>{const n=e.dom,r=e.selection,o=r.getStart(),s=je(e,o),i=n.getParent(r.getStart(),"LI",s);if(i){const o=i.parentElement;if(o===e.getBody()&&ke(n,o))return!0;const l=$e(r.getRng()),a=n.getParent(Rt(e,l,t,s),"LI",s);if(a&&a!==i)return e.undoManager.transact((()=>{var n,r;t?((e,t,n,r)=>{const o=e.dom;if(o.isEmpty(r))((e,t,n)=>{J(R(n)),$t(e.dom,t,n),e.selection.setCursorLocation(n,0)})(e,n,r);else{const s=Nt(t);$t(o,n,r),e.selection.setRng(Lt(s))}})(e,l,a,i):(null===(r=(n=i).parentNode)||void 0===r?void 0:r.firstChild)===n?yt(e):((e,t,n,r)=>{const o=Nt(t);$t(e.dom,n,r);const s=Lt(o);e.selection.setRng(s)})(e,l,i,a)})),!0;if(!a&&!t&&0===l.startOffset&&0===l.endOffset)return e.undoManager.transact((()=>{vt(e)})),!0}return!1},Ft=e=>{const t=e.selection.getStart(),n=je(e,t);return e.dom.getParent(t,"LI,DT,DD",n)||Ve(e).length>0},Ht=(e,t)=>{const n=e.selection;return!Ge(e,n.getNode())&&(n.isCollapsed()?((e,t)=>_t(e,t)||((e,t)=>{const n=e.dom,r=e.selection.getStart(),o=je(e,r),s=n.getParent(r,n.isBlock,o);if(s&&n.isEmpty(s)){const r=$e(e.selection.getRng()),i=n.getParent(Rt(e,r,t,o),"LI",o);if(i){const l=e=>v(["td","th","caption"],$(e)),a=e=>e.dom===o;return!!((e,t,n=u)=>I(e,t,n).getOr(e.isNone()&&t.isNone()))(q(R(i),l,a),q(R(r.startContainer),l,a),U)&&(e.undoManager.transact((()=>{((e,t,n)=>{const r=e.getParent(t.parentNode,e.isBlock,n);e.remove(t),r&&e.isEmpty(r)&&e.remove(r)})(n,s,o),Dt(n,i.parentNode),e.selection.select(i,!0),e.selection.collapse(t)})),!0)}}return!1})(e,t))(e,t):(e=>!!Ft(e)&&(e.undoManager.transact((()=>{e.execCommand("Delete"),Mt(e.dom,e.getBody())})),!0))(e))},Vt=e=>{const t=A(Ye(e).split("")),n=C(t,((e,t)=>{const n=e.toUpperCase().charCodeAt(0)-"A".charCodeAt(0)+1;return Math.pow(26,t)*n}));return L(n,((e,t)=>e+t),0)},jt=e=>{if(--e<0)return"";{const t=e%26,n=Math.floor(e/26);return jt(n)+String.fromCharCode("A".charCodeAt(0)+t)}},Kt=e=>{const t=parseInt(e.start,10);return B(e.listStyleType,"upper-alpha")?jt(t):B(e.listStyleType,"lower-alpha")?jt(t).toLowerCase():e.start},zt=(e,t)=>()=>{const n=He(e);return l(n)&&n.nodeName===t},Qt=e=>{e.addCommand("mceListProps",(()=>{(e=>{const t=He(e);ye(t)&&!Ge(e,t)&&e.windowManager.open({title:"List Properties",body:{type:"panel",items:[{type:"input",name:"start",label:"Start list at number",inputMode:"numeric"}]},initialData:{start:Kt({start:e.dom.getAttrib(t,"start","1"),listStyleType:g.from(e.dom.getStyle(t,"list-style-type"))})},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],onSubmit:t=>{(e=>{switch((e=>/^[0-9]+$/.test(e)?2:/^[A-Z]+$/.test(e)?0:/^[a-z]+$/.test(e)?1:e.length>0?4:3)(e)){case 2:return g.some({listStyleType:g.none(),start:e});case 0:return g.some({listStyleType:g.some("upper-alpha"),start:Vt(e).toString()});case 1:return g.some({listStyleType:g.some("lower-alpha"),start:Vt(e).toString()});case 3:return g.some({listStyleType:g.none(),start:""});case 4:return g.none()}})(t.getData().start).each((t=>{e.execCommand("mceListUpdate",!1,{attrs:{start:"1"===t.start?"":t.start},styles:{"list-style-type":t.listStyleType.getOr("")}})})),t.close()}})})(e)}))};var qt=tinymce.util.Tools.resolve("tinymce.html.Node");const Wt=e=>3===e.type,Zt=e=>0===e.length,Gt=e=>{const t=(t,n)=>{const r=qt.create("li");S(t,(e=>r.append(e))),n?e.insert(r,n,!0):e.append(r)},n=L(e.children(),((e,n)=>Wt(n)?[...e,n]:Zt(e)||Wt(n)?e:(t(e,n),[])),[]);Zt(n)||t(n)},Jt=(e,t)=>n=>(n.setEnabled(e.selection.isEditable()),Je(e,(r=>{n.setActive(We(r.parents,t)),n.setEnabled(!Ge(e,r.element)&&e.selection.isEditable())}))),Xt=(e,t)=>n=>Je(e,(r=>n.setEnabled(We(r.parents,t)&&!Ge(e,r.element))));e.add("lists",(e=>((e=>{(0,e.options.register)("lists_indent_on_tab",{processor:"boolean",default:!0})})(e),(e=>{e.on("PreInit",(()=>{const{parser:t}=e;t.addNodeFilter("ul,ol",(e=>S(e,Gt)))}))})(e),e.hasPlugin("rtc",!0)?Qt(e):((e=>{xe(e)&&(e=>{e.on("keydown",(t=>{t.keyCode!==te.TAB||te.metaKeyPressed(t)||e.undoManager.transact((()=>{(t.shiftKey?yt(e):ft(e))&&t.preventDefault()}))}))})(e),(e=>{e.on("ExecCommand",(t=>{const n=t.command.toLowerCase();"delete"!==n&&"forwarddelete"!==n||!Ft(e)||Mt(e.dom,e.getBody())})),e.on("keydown",(t=>{t.keyCode===te.BACKSPACE?Ht(e,!1)&&t.preventDefault():t.keyCode===te.DELETE&&Ht(e,!0)&&t.preventDefault()}))})(e)})(e),(e=>{e.on("BeforeExecCommand",(t=>{const n=t.command.toLowerCase();"indent"===n?ft(e):"outdent"===n&&yt(e)})),e.addCommand("InsertUnorderedList",((t,n)=>{It(e,"UL",n)})),e.addCommand("InsertOrderedList",((t,n)=>{It(e,"OL",n)})),e.addCommand("InsertDefinitionList",((t,n)=>{It(e,"DL",n)})),e.addCommand("RemoveList",(()=>{vt(e)})),Qt(e),e.addCommand("mceListUpdate",((t,n)=>{o(n)&&((e,t)=>{const n=He(e);null===n||Ge(e,n)||e.undoManager.transact((()=>{o(t.styles)&&e.dom.setStyles(n,t.styles),o(t.attrs)&&oe(t.attrs,((t,r)=>e.dom.setAttrib(n,r,t)))}))})(e,n)})),e.addQueryStateHandler("InsertUnorderedList",zt(e,"UL")),e.addQueryStateHandler("InsertOrderedList",zt(e,"OL")),e.addQueryStateHandler("InsertDefinitionList",zt(e,"DL"))})(e)),(e=>{const t=t=>()=>e.execCommand(t);e.hasPlugin("advlist")||(e.ui.registry.addToggleButton("numlist",{icon:"ordered-list",active:!1,tooltip:"Numbered list",onAction:t("InsertOrderedList"),onSetup:Jt(e,"OL")}),e.ui.registry.addToggleButton("bullist",{icon:"unordered-list",active:!1,tooltip:"Bullet list",onAction:t("InsertUnorderedList"),onSetup:Jt(e,"UL")}))})(e),(e=>{const t={text:"List properties...",icon:"ordered-list",onAction:()=>e.execCommand("mceListProps"),onSetup:Xt(e,"OL")};e.ui.registry.addMenuItem("listprops",t),e.ui.registry.addContextMenu("lists",{update:t=>{const n=He(e,t);return ye(n)?["listprops"]:[]}})})(e),(e=>({backspaceDelete:t=>{Ht(e,t)}}))(e))))}(); \ No newline at end of file diff --git a/public/js/tinymce/plugins/media/plugin.js b/public/js/tinymce/plugins/media/plugin.js index 2dba2c4c5..37aa40714 100644 --- a/public/js/tinymce/plugins/media/plugin.js +++ b/public/js/tinymce/plugins/media/plugin.js @@ -1,168 +1,142 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ + (function () { 'use strict'; - var global$9 = tinymce.util.Tools.resolve('tinymce.PluginManager'); + var global$6 = tinymce.util.Tools.resolve('tinymce.PluginManager'); - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); + const hasProto = (v, constructor, predicate) => { + var _a; + if (predicate(v, constructor.prototype)) { + return true; + } else { + return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; + } }; - - var typeOf = function (x) { - var t = typeof x; + const typeOf = x => { + const t = typeof x; if (x === null) { return 'null'; - } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + } else if (t === 'object' && Array.isArray(x)) { return 'array'; - } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { return 'string'; } else { return t; } }; - var isType = function (type) { - return function (value) { - return typeOf(value) === type; - }; - }; - var isString = isType('string'); - var isObject = isType('object'); - var isArray = isType('array'); - var isNullable = function (a) { - return a === null || a === undefined; - }; - var isNonNullable = function (a) { - return !isNullable(a); - }; + const isType = type => value => typeOf(value) === type; + const isString = isType('string'); + const isObject = isType('object'); + const isArray = isType('array'); + const isNullable = a => a === null || a === undefined; + const isNonNullable = a => !isNullable(a); - var noop = function () { - }; - var constant = function (value) { - return function () { - return value; - }; - }; - var identity = function (x) { - return x; - }; - var never = constant(false); - var always = constant(true); - - var none = function () { - return NONE; - }; - var NONE = function () { - var call = function (thunk) { - return thunk(); - }; - var id = identity; - var me = { - fold: function (n, _s) { - return n(); - }, - isSome: never, - isNone: always, - getOr: id, - getOrThunk: call, - getOrDie: function (msg) { - throw new Error(msg || 'error: getOrDie called on none.'); - }, - getOrNull: constant(null), - getOrUndefined: constant(undefined), - or: id, - orThunk: call, - map: none, - each: noop, - bind: none, - exists: never, - forall: always, - filter: function () { - return none(); - }, - toArray: function () { - return []; - }, - toString: constant('none()') - }; - return me; - }(); - var some = function (a) { - var constant_a = constant(a); - var self = function () { - return me; - }; - var bind = function (f) { - return f(a); - }; - var me = { - fold: function (n, s) { - return s(a); - }, - isSome: always, - isNone: never, - getOr: constant_a, - getOrThunk: constant_a, - getOrDie: constant_a, - getOrNull: constant_a, - getOrUndefined: constant_a, - or: self, - orThunk: self, - map: function (f) { - return some(f(a)); - }, - each: function (f) { - f(a); - }, - bind: bind, - exists: bind, - forall: bind, - filter: function (f) { - return f(a) ? me : NONE; - }, - toArray: function () { - return [a]; - }, - toString: function () { - return 'some(' + a + ')'; + class Optional { + constructor(tag, value) { + this.tag = tag; + this.value = value; + } + static some(value) { + return new Optional(true, value); + } + static none() { + return Optional.singletonNone; + } + fold(onNone, onSome) { + if (this.tag) { + return onSome(this.value); + } else { + return onNone(); } - }; - return me; - }; - var from = function (value) { - return value === null || value === undefined ? NONE : some(value); - }; - var Optional = { - some: some, - none: none, - from: from - }; + } + isSome() { + return this.tag; + } + isNone() { + return !this.tag; + } + map(mapper) { + if (this.tag) { + return Optional.some(mapper(this.value)); + } else { + return Optional.none(); + } + } + bind(binder) { + if (this.tag) { + return binder(this.value); + } else { + return Optional.none(); + } + } + exists(predicate) { + return this.tag && predicate(this.value); + } + forall(predicate) { + return !this.tag || predicate(this.value); + } + filter(predicate) { + if (!this.tag || predicate(this.value)) { + return this; + } else { + return Optional.none(); + } + } + getOr(replacement) { + return this.tag ? this.value : replacement; + } + or(replacement) { + return this.tag ? this : replacement; + } + getOrThunk(thunk) { + return this.tag ? this.value : thunk(); + } + orThunk(thunk) { + return this.tag ? this : thunk(); + } + getOrDie(message) { + if (!this.tag) { + throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); + } else { + return this.value; + } + } + static from(value) { + return isNonNullable(value) ? Optional.some(value) : Optional.none(); + } + getOrNull() { + return this.tag ? this.value : null; + } + getOrUndefined() { + return this.value; + } + each(worker) { + if (this.tag) { + worker(this.value); + } + } + toArray() { + return this.tag ? [this.value] : []; + } + toString() { + return this.tag ? `some(${ this.value })` : 'none()'; + } + } + Optional.singletonNone = new Optional(false); - var nativePush = Array.prototype.push; - var each$1 = function (xs, f) { - for (var i = 0, len = xs.length; i < len; i++) { - var x = xs[i]; + const nativePush = Array.prototype.push; + const each$1 = (xs, f) => { + for (let i = 0, len = xs.length; i < len; i++) { + const x = xs[i]; f(x, i); } }; - var flatten = function (xs) { - var r = []; - for (var i = 0, len = xs.length; i < len; ++i) { + const flatten = xs => { + const r = []; + for (let i = 0, len = xs.length; i < len; ++i) { if (!isArray(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } @@ -171,150 +145,144 @@ return r; }; - var Cell = function (initial) { - var value = initial; - var get = function () { + const Cell = initial => { + let value = initial; + const get = () => { return value; }; - var set = function (v) { + const set = v => { value = v; }; return { - get: get, - set: set + get, + set }; }; - var keys = Object.keys; - var hasOwnProperty = Object.hasOwnProperty; - var each = function (obj, f) { - var props = keys(obj); - for (var k = 0, len = props.length; k < len; k++) { - var i = props[k]; - var x = obj[i]; + const keys = Object.keys; + const hasOwnProperty = Object.hasOwnProperty; + const each = (obj, f) => { + const props = keys(obj); + for (let k = 0, len = props.length; k < len; k++) { + const i = props[k]; + const x = obj[i]; f(x, i); } }; - var get$1 = function (obj, key) { + const get$1 = (obj, key) => { return has(obj, key) ? Optional.from(obj[key]) : Optional.none(); }; - var has = function (obj, key) { - return hasOwnProperty.call(obj, key); - }; + const has = (obj, key) => hasOwnProperty.call(obj, key); - var getScripts = function (editor) { - return editor.getParam('media_scripts'); - }; - var getAudioTemplateCallback = function (editor) { - return editor.getParam('audio_template_callback'); - }; - var getVideoTemplateCallback = function (editor) { - return editor.getParam('video_template_callback'); - }; - var hasLiveEmbeds = function (editor) { - return editor.getParam('media_live_embeds', true); - }; - var shouldFilterHtml = function (editor) { - return editor.getParam('media_filter_html', true); - }; - var getUrlResolver = function (editor) { - return editor.getParam('media_url_resolver'); - }; - var hasAltSource = function (editor) { - return editor.getParam('media_alt_source', true); - }; - var hasPoster = function (editor) { - return editor.getParam('media_poster', true); - }; - var hasDimensions = function (editor) { - return editor.getParam('media_dimensions', true); + const option = name => editor => editor.options.get(name); + const register$2 = editor => { + const registerOption = editor.options.register; + registerOption('audio_template_callback', { processor: 'function' }); + registerOption('video_template_callback', { processor: 'function' }); + registerOption('iframe_template_callback', { processor: 'function' }); + registerOption('media_live_embeds', { + processor: 'boolean', + default: true + }); + registerOption('media_filter_html', { + processor: 'boolean', + default: true + }); + registerOption('media_url_resolver', { processor: 'function' }); + registerOption('media_alt_source', { + processor: 'boolean', + default: true + }); + registerOption('media_poster', { + processor: 'boolean', + default: true + }); + registerOption('media_dimensions', { + processor: 'boolean', + default: true + }); }; + const getAudioTemplateCallback = option('audio_template_callback'); + const getVideoTemplateCallback = option('video_template_callback'); + const getIframeTemplateCallback = option('iframe_template_callback'); + const hasLiveEmbeds = option('media_live_embeds'); + const shouldFilterHtml = option('media_filter_html'); + const getUrlResolver = option('media_url_resolver'); + const hasAltSource = option('media_alt_source'); + const hasPoster = option('media_poster'); + const hasDimensions = option('media_dimensions'); - var global$8 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools'); - var global$7 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); - var global$6 = tinymce.util.Tools.resolve('tinymce.html.SaxParser'); + var global$3 = tinymce.util.Tools.resolve('tinymce.html.DomParser'); - var getVideoScriptMatch = function (prefixes, src) { - if (prefixes) { - for (var i = 0; i < prefixes.length; i++) { - if (src.indexOf(prefixes[i].filter) !== -1) { - return prefixes[i]; - } - } - } - }; - - var DOM$1 = global$7.DOM; - var trimPx = function (value) { - return value.replace(/px$/, ''); - }; - var getEphoxEmbedData = function (attrs) { - var style = attrs.map.style; - var styles = style ? DOM$1.parseStyle(style) : {}; + const DOM$1 = global$4.DOM; + const trimPx = value => value.replace(/px$/, ''); + const getEphoxEmbedData = node => { + const style = node.attr('style'); + const styles = style ? DOM$1.parseStyle(style) : {}; return { type: 'ephox-embed-iri', - source: attrs.map['data-ephox-embed-iri'], + source: node.attr('data-ephox-embed-iri'), altsource: '', poster: '', width: get$1(styles, 'max-width').map(trimPx).getOr(''), height: get$1(styles, 'max-height').map(trimPx).getOr('') }; }; - var htmlToData = function (prefixes, html) { - var isEphoxEmbed = Cell(false); - var data = {}; - global$6({ + const htmlToData = (html, schema) => { + let data = {}; + const parser = global$3({ validate: false, - allow_conditional_comments: true, - start: function (name, attrs) { - if (isEphoxEmbed.get()) ; else if (has(attrs.map, 'data-ephox-embed-iri')) { - isEphoxEmbed.set(true); - data = getEphoxEmbedData(attrs); + forced_root_block: false + }, schema); + const rootNode = parser.parse(html); + for (let node = rootNode; node; node = node.walk()) { + if (node.type === 1) { + const name = node.name; + if (node.attr('data-ephox-embed-iri')) { + data = getEphoxEmbedData(node); + break; } else { if (!data.source && name === 'param') { - data.source = attrs.map.movie; + data.source = node.attr('movie'); } if (name === 'iframe' || name === 'object' || name === 'embed' || name === 'video' || name === 'audio') { if (!data.type) { data.type = name; } - data = global$8.extend(attrs.map, data); + data = global$5.extend(node.attributes.map, data); } if (name === 'script') { - var videoScript = getVideoScriptMatch(prefixes, attrs.map.src); - if (!videoScript) { - return; - } data = { type: 'script', - source: attrs.map.src, - width: String(videoScript.width), - height: String(videoScript.height) + source: node.attr('src') }; } if (name === 'source') { if (!data.source) { - data.source = attrs.map.src; + data.source = node.attr('src'); } else if (!data.altsource) { - data.altsource = attrs.map.src; + data.altsource = node.attr('src'); } } if (name === 'img' && !data.poster) { - data.poster = attrs.map.src; + data.poster = node.attr('src'); } } } - }).parse(html); - data.source = data.source || data.src || data.data; + } + data.source = data.source || data.src || ''; data.altsource = data.altsource || ''; data.poster = data.poster || ''; return data; }; - var guess = function (url) { - var mimes = { + const guess = url => { + var _a; + const mimes = { mp3: 'audio/mpeg', m4a: 'audio/x-m4a', wav: 'audio/wav', @@ -323,77 +291,50 @@ ogg: 'video/ogg', swf: 'application/x-shockwave-flash' }; - var fileEnd = url.toLowerCase().split('.').pop(); - var mime = mimes[fileEnd]; - return mime ? mime : ''; + const fileEnd = (_a = url.toLowerCase().split('.').pop()) !== null && _a !== void 0 ? _a : ''; + return get$1(mimes, fileEnd).getOr(''); }; - var global$5 = tinymce.util.Tools.resolve('tinymce.html.Schema'); + var global$2 = tinymce.util.Tools.resolve('tinymce.html.Node'); - var global$4 = tinymce.util.Tools.resolve('tinymce.html.Writer'); + var global$1 = tinymce.util.Tools.resolve('tinymce.html.Serializer'); - var DOM = global$7.DOM; - var addPx = function (value) { - return /^[0-9.]+$/.test(value) ? value + 'px' : value; - }; - var setAttributes = function (attrs, updatedAttrs) { - each(updatedAttrs, function (val, name) { - var value = '' + val; - if (attrs.map[name]) { - var i = attrs.length; - while (i--) { - var attr = attrs[i]; - if (attr.name === name) { - if (value) { - attrs.map[name] = value; - attr.value = value; - } else { - delete attrs.map[name]; - attrs.splice(i, 1); - } - } - } - } else if (value) { - attrs.push({ - name: name, - value: value - }); - attrs.map[name] = value; - } - }); - }; - var updateEphoxEmbed = function (data, attrs) { - var style = attrs.map.style; - var styleMap = style ? DOM.parseStyle(style) : {}; - styleMap['max-width'] = addPx(data.width); - styleMap['max-height'] = addPx(data.height); - setAttributes(attrs, { style: DOM.serializeStyle(styleMap) }); + const Parser = (schema, settings = {}) => global$3({ + forced_root_block: false, + validate: false, + allow_conditional_comments: true, + ...settings + }, schema); + + const DOM = global$4.DOM; + const addPx = value => /^[0-9.]+$/.test(value) ? value + 'px' : value; + const updateEphoxEmbed = (data, node) => { + const style = node.attr('style'); + const styleMap = style ? DOM.parseStyle(style) : {}; + if (isNonNullable(data.width)) { + styleMap['max-width'] = addPx(data.width); + } + if (isNonNullable(data.height)) { + styleMap['max-height'] = addPx(data.height); + } + node.attr('style', DOM.serializeStyle(styleMap)); }; - var sources = [ + const sources = [ 'source', 'altsource' ]; - var updateHtml = function (html, data, updateAll) { - var writer = global$4(); - var isEphoxEmbed = Cell(false); - var sourceCount = 0; - var hasImage; - global$6({ - validate: false, - allow_conditional_comments: true, - comment: function (text) { - writer.comment(text); - }, - cdata: function (text) { - writer.cdata(text); - }, - text: function (text, raw) { - writer.text(text, raw); - }, - start: function (name, attrs, empty) { - if (isEphoxEmbed.get()) ; else if (has(attrs.map, 'data-ephox-embed-iri')) { - isEphoxEmbed.set(true); - updateEphoxEmbed(data, attrs); + const updateHtml = (html, data, updateAll, schema) => { + let numSources = 0; + let sourceCount = 0; + const parser = Parser(schema); + parser.addNodeFilter('source', nodes => numSources = nodes.length); + const rootNode = parser.parse(html); + for (let node = rootNode; node; node = node.walk()) { + if (node.type === 1) { + const name = node.name; + if (node.attr('data-ephox-embed-iri')) { + updateEphoxEmbed(data, node); + break; } else { switch (name) { case 'video': @@ -402,85 +343,64 @@ case 'img': case 'iframe': if (data.height !== undefined && data.width !== undefined) { - setAttributes(attrs, { - width: data.width, - height: data.height - }); + node.attr('width', data.width); + node.attr('height', data.height); } break; } if (updateAll) { switch (name) { case 'video': - setAttributes(attrs, { - poster: data.poster, - src: '' - }); - if (data.altsource) { - setAttributes(attrs, { src: '' }); + node.attr('poster', data.poster); + node.attr('src', null); + for (let index = numSources; index < 2; index++) { + if (data[sources[index]]) { + const source = new global$2('source', 1); + source.attr('src', data[sources[index]]); + source.attr('type', data[sources[index] + 'mime'] || null); + node.append(source); + } } break; case 'iframe': - setAttributes(attrs, { src: data.source }); + node.attr('src', data.source); + break; + case 'object': + const hasImage = node.getAll('img').length > 0; + if (data.poster && !hasImage) { + node.attr('src', data.poster); + const img = new global$2('img', 1); + img.attr('src', data.poster); + img.attr('width', data.width); + img.attr('height', data.height); + node.append(img); + } break; case 'source': if (sourceCount < 2) { - setAttributes(attrs, { - src: data[sources[sourceCount]], - type: data[sources[sourceCount] + 'mime'] - }); + node.attr('src', data[sources[sourceCount]]); + node.attr('type', data[sources[sourceCount] + 'mime'] || null); if (!data[sources[sourceCount]]) { - return; + node.remove(); + continue; } } sourceCount++; break; case 'img': if (!data.poster) { - return; + node.remove(); } - hasImage = true; break; } } } - writer.start(name, attrs, empty); - }, - end: function (name) { - if (!isEphoxEmbed.get()) { - if (name === 'video' && updateAll) { - for (var index = 0; index < 2; index++) { - if (data[sources[index]]) { - var attrs = []; - attrs.map = {}; - if (sourceCount <= index) { - setAttributes(attrs, { - src: data[sources[index]], - type: data[sources[index] + 'mime'] - }); - writer.start('source', attrs, true); - } - } - } - } - if (data.poster && name === 'object' && updateAll && !hasImage) { - var imgAttrs = []; - imgAttrs.map = {}; - setAttributes(imgAttrs, { - src: data.poster, - width: data.width, - height: data.height - }); - writer.start('img', imgAttrs, true); - } - } - writer.end(name); } - }, global$5({})).parse(html); - return writer.getContent(); + } + return global$1({}, schema).serialize(rootNode); }; - var urlPatterns = [ + const urlPatterns = [ { regex: /youtu\.be\/([\w\-_\?&=.]+)/i, type: 'iframe', @@ -505,6 +425,22 @@ url: 'www.youtube.com/embed/$1', allowFullscreen: true }, + { + regex: /vimeo\.com\/([0-9]+)\?h=(\w+)/, + type: 'iframe', + w: 425, + h: 350, + url: 'player.vimeo.com/video/$1?h=$2&title=0&byline=0&portrait=0&color=8dc7dc', + allowFullscreen: true + }, + { + regex: /vimeo\.com\/(.*)\/([0-9]+)\?h=(\w+)/, + type: 'iframe', + w: 425, + h: 350, + url: 'player.vimeo.com/video/$2?h=$3&title=0&byline=0', + allowFullscreen: true + }, { regex: /vimeo\.com\/([0-9]+)/, type: 'iframe', @@ -546,72 +482,72 @@ allowFullscreen: true } ]; - var getProtocol = function (url) { - var protocolMatches = url.match(/^(https?:\/\/|www\.)(.+)$/i); + const getProtocol = url => { + const protocolMatches = url.match(/^(https?:\/\/|www\.)(.+)$/i); if (protocolMatches && protocolMatches.length > 1) { return protocolMatches[1] === 'www.' ? 'https://' : protocolMatches[1]; } else { return 'https://'; } }; - var getUrl = function (pattern, url) { - var protocol = getProtocol(url); - var match = pattern.regex.exec(url); - var newUrl = protocol + pattern.url; - var _loop_1 = function (i) { - newUrl = newUrl.replace('$' + i, function () { - return match[i] ? match[i] : ''; - }); - }; - for (var i = 0; i < match.length; i++) { - _loop_1(i); + const getUrl = (pattern, url) => { + const protocol = getProtocol(url); + const match = pattern.regex.exec(url); + let newUrl = protocol + pattern.url; + if (isNonNullable(match)) { + for (let i = 0; i < match.length; i++) { + newUrl = newUrl.replace('$' + i, () => match[i] ? match[i] : ''); + } } return newUrl.replace(/\?$/, ''); }; - var matchPattern = function (url) { - var patterns = urlPatterns.filter(function (pattern) { - return pattern.regex.test(url); - }); + const matchPattern = url => { + const patterns = urlPatterns.filter(pattern => pattern.regex.test(url)); if (patterns.length > 0) { - return global$8.extend({}, patterns[0], { url: getUrl(patterns[0], url) }); + return global$5.extend({}, patterns[0], { url: getUrl(patterns[0], url) }); } else { return null; } }; - var getIframeHtml = function (data) { - var allowFullscreen = data.allowfullscreen ? ' allowFullscreen="1"' : ''; - return ''; + const getIframeHtml = (data, iframeTemplateCallback) => { + if (iframeTemplateCallback) { + return iframeTemplateCallback(data); + } else { + const allowFullscreen = data.allowfullscreen ? ' allowFullscreen="1"' : ''; + return ''; + } }; - var getFlashHtml = function (data) { - var html = ''; + const getFlashHtml = data => { + let html = ''; if (data.poster) { html += ''; } html += ''; return html; }; - var getAudioHtml = function (data, audioTemplateCallback) { + const getAudioHtml = (data, audioTemplateCallback) => { if (audioTemplateCallback) { return audioTemplateCallback(data); } else { return ''; } }; - var getVideoHtml = function (data, videoTemplateCallback) { + const getVideoHtml = (data, videoTemplateCallback) => { if (videoTemplateCallback) { return videoTemplateCallback(data); } else { return ''; } }; - var getScriptHtml = function (data) { + const getScriptHtml = data => { return ''; }; - var dataToHtml = function (editor, dataIn) { - var data = global$8.extend({}, dataIn); + const dataToHtml = (editor, dataIn) => { + var _a; + const data = global$5.extend({}, dataIn); if (!data.source) { - global$8.extend(data, htmlToData(getScripts(editor), data.embed)); + global$5.extend(data, htmlToData((_a = data.embed) !== null && _a !== void 0 ? _a : '', editor.schema)); if (!data.source) { return ''; } @@ -627,7 +563,7 @@ data.sourcemime = guess(data.source); data.altsourcemime = guess(data.altsource); data.poster = editor.convertURL(data.poster, 'poster'); - var pattern = matchPattern(data.source); + const pattern = matchPattern(data.source); if (pattern) { data.source = pattern.url; data.type = pattern.type; @@ -636,23 +572,18 @@ data.height = data.height || String(pattern.h); } if (data.embed) { - return updateHtml(data.embed, data, true); + return updateHtml(data.embed, data, true, editor.schema); } else { - var videoScript = getVideoScriptMatch(getScripts(editor), data.source); - if (videoScript) { - data.type = 'script'; - data.width = String(videoScript.width); - data.height = String(videoScript.height); - } - var audioTemplateCallback = getAudioTemplateCallback(editor); - var videoTemplateCallback = getVideoTemplateCallback(editor); + const audioTemplateCallback = getAudioTemplateCallback(editor); + const videoTemplateCallback = getVideoTemplateCallback(editor); + const iframeTemplateCallback = getIframeTemplateCallback(editor); data.width = data.width || '300'; data.height = data.height || '150'; - global$8.each(data, function (value, key) { + global$5.each(data, (value, key) => { data[key] = editor.dom.encode('' + value); }); if (data.type === 'iframe') { - return getIframeHtml(data); + return getIframeHtml(data, iframeTemplateCallback); } else if (data.sourcemime === 'application/x-shockwave-flash') { return getFlashHtml(data); } else if (data.sourcemime.indexOf('audio') !== -1) { @@ -665,45 +596,41 @@ } }; - var isMediaElement = function (element) { - return element.hasAttribute('data-mce-object') || element.hasAttribute('data-ephox-embed-iri'); - }; - var setup$2 = function (editor) { - editor.on('click keyup touchend', function () { - var selectedNode = editor.selection.getNode(); + const isMediaElement = element => element.hasAttribute('data-mce-object') || element.hasAttribute('data-ephox-embed-iri'); + const setup$2 = editor => { + editor.on('click keyup touchend', () => { + const selectedNode = editor.selection.getNode(); if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) { if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) { selectedNode.setAttribute('data-mce-selected', '2'); } } }); - editor.on('ObjectSelected', function (e) { - var objectType = e.target.getAttribute('data-mce-object'); + editor.on('ObjectSelected', e => { + const objectType = e.target.getAttribute('data-mce-object'); if (objectType === 'script') { e.preventDefault(); } }); - editor.on('ObjectResized', function (e) { - var target = e.target; + editor.on('ObjectResized', e => { + const target = e.target; if (target.getAttribute('data-mce-object')) { - var html = target.getAttribute('data-mce-html'); + let html = target.getAttribute('data-mce-html'); if (html) { html = unescape(html); target.setAttribute('data-mce-html', escape(updateHtml(html, { width: String(e.width), height: String(e.height) - }))); + }, false, editor.schema))); } } }); }; - var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); - - var cache = {}; - var embedPromise = function (data, dataToHtml, handler) { - return new global$3(function (res, rej) { - var wrappedResolve = function (response) { + const cache = {}; + const embedPromise = (data, dataToHtml, handler) => { + return new Promise((res, rej) => { + const wrappedResolve = response => { if (response.html) { cache[data.source] = response; } @@ -719,134 +646,113 @@ } }); }; - var defaultPromise = function (data, dataToHtml) { - return global$3.resolve({ - html: dataToHtml(data), - url: data.source - }); - }; - var loadedData = function (editor) { - return function (data) { - return dataToHtml(editor, data); - }; - }; - var getEmbedHtml = function (editor, data) { - var embedHandler = getUrlResolver(editor); + const defaultPromise = (data, dataToHtml) => Promise.resolve({ + html: dataToHtml(data), + url: data.source + }); + const loadedData = editor => data => dataToHtml(editor, data); + const getEmbedHtml = (editor, data) => { + const embedHandler = getUrlResolver(editor); return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor)); }; - var isCached = function (url) { - return has(cache, url); - }; + const isCached = url => has(cache, url); - var extractMeta = function (sourceInput, data) { - return get$1(data, sourceInput).bind(function (mainData) { - return get$1(mainData, 'meta'); - }); - }; - var getValue = function (data, metaData, sourceInput) { - return function (prop) { - var _a; - var getFromData = function () { - return get$1(data, prop); - }; - var getFromMetaData = function () { - return get$1(metaData, prop); - }; - var getNonEmptyValue = function (c) { - return get$1(c, 'value').bind(function (v) { - return v.length > 0 ? Optional.some(v) : Optional.none(); - }); - }; - var getFromValueFirst = function () { - return getFromData().bind(function (child) { - return isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(function () { - return Optional.from(child); - }); - }); - }; - var getFromMetaFirst = function () { - return getFromMetaData().orThunk(function () { - return getFromData().bind(function (child) { - return isObject(child) ? getNonEmptyValue(child) : Optional.from(child); - }); - }); - }; - return _a = {}, _a[prop] = (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr(''), _a; - }; - }; - var getDimensions = function (data, metaData) { - var dimensions = {}; - get$1(data, 'dimensions').each(function (dims) { + const extractMeta = (sourceInput, data) => get$1(data, sourceInput).bind(mainData => get$1(mainData, 'meta')); + const getValue = (data, metaData, sourceInput) => prop => { + const getFromData = () => get$1(data, prop); + const getFromMetaData = () => get$1(metaData, prop); + const getNonEmptyValue = c => get$1(c, 'value').bind(v => v.length > 0 ? Optional.some(v) : Optional.none()); + const getFromValueFirst = () => getFromData().bind(child => isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(() => Optional.from(child))); + const getFromMetaFirst = () => getFromMetaData().orThunk(() => getFromData().bind(child => isObject(child) ? getNonEmptyValue(child) : Optional.from(child))); + return { [prop]: (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr('') }; + }; + const getDimensions = (data, metaData) => { + const dimensions = {}; + get$1(data, 'dimensions').each(dims => { each$1([ 'width', 'height' - ], function (prop) { - get$1(metaData, prop).orThunk(function () { - return get$1(dims, prop); - }).each(function (value) { - return dimensions[prop] = value; - }); + ], prop => { + get$1(metaData, prop).orThunk(() => get$1(dims, prop)).each(value => dimensions[prop] = value); }); }); return dimensions; }; - var unwrap = function (data, sourceInput) { - var metaData = sourceInput ? extractMeta(sourceInput, data).getOr({}) : {}; - var get = getValue(data, metaData, sourceInput); - return __assign(__assign(__assign(__assign(__assign({}, get('source')), get('altsource')), get('poster')), get('embed')), getDimensions(data, metaData)); + const unwrap = (data, sourceInput) => { + const metaData = sourceInput && sourceInput !== 'dimensions' ? extractMeta(sourceInput, data).getOr({}) : {}; + const get = getValue(data, metaData, sourceInput); + return { + ...get('source'), + ...get('altsource'), + ...get('poster'), + ...get('embed'), + ...getDimensions(data, metaData) + }; }; - var wrap = function (data) { - var wrapped = __assign(__assign({}, data), { + const wrap = data => { + const wrapped = { + ...data, source: { value: get$1(data, 'source').getOr('') }, altsource: { value: get$1(data, 'altsource').getOr('') }, poster: { value: get$1(data, 'poster').getOr('') } - }); + }; each$1([ 'width', 'height' - ], function (prop) { - get$1(data, prop).each(function (value) { - var dimensions = wrapped.dimensions || {}; + ], prop => { + get$1(data, prop).each(value => { + const dimensions = wrapped.dimensions || {}; dimensions[prop] = value; wrapped.dimensions = dimensions; }); }); return wrapped; }; - var handleError = function (editor) { - return function (error) { - var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.'; - editor.notificationManager.open({ - type: 'error', - text: errorMessage - }); - }; - }; - var snippetToData = function (editor, embedSnippet) { - return htmlToData(getScripts(editor), embedSnippet); - }; - var getEditorData = function (editor) { - var element = editor.selection.getNode(); - var snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : ''; - return __assign({ embed: snippet }, htmlToData(getScripts(editor), snippet)); + const handleError = editor => error => { + const errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.'; + editor.notificationManager.open({ + type: 'error', + text: errorMessage + }); }; - var addEmbedHtml = function (api, editor) { - return function (response) { - if (isString(response.url) && response.url.trim().length > 0) { - var html = response.html; - var snippetData = snippetToData(editor, html); - var nuData = __assign(__assign({}, snippetData), { - source: response.url, - embed: html - }); - api.setData(wrap(nuData)); + const getEditorData = editor => { + const element = editor.selection.getNode(); + const snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : ''; + const data = htmlToData(snippet, editor.schema); + const getDimensionsOfElement = () => { + if (isEmbedIframe(data.source, data.type)) { + const rect = editor.dom.getRect(element); + return { + width: rect.w.toString().replace(/px$/, ''), + height: rect.h.toString().replace(/px$/, '') + }; + } else { + return {}; } }; + const dimensions = getDimensionsOfElement(); + return { + embed: snippet, + ...data, + ...dimensions + }; }; - var selectPlaceholder = function (editor, beforeObjects) { - var afterObjects = editor.dom.select('*[data-mce-object]'); - for (var i = 0; i < beforeObjects.length; i++) { - for (var y = afterObjects.length - 1; y >= 0; y--) { + const addEmbedHtml = (api, editor) => response => { + if (isString(response.url) && response.url.trim().length > 0) { + const html = response.html; + const snippetData = htmlToData(html, editor.schema); + const nuData = { + ...snippetData, + source: response.url, + embed: html + }; + api.setData(wrap(nuData)); + } + }; + const selectPlaceholder = (editor, beforeObjects) => { + const afterObjects = editor.dom.select('*[data-mce-object]'); + for (let i = 0; i < beforeObjects.length; i++) { + for (let y = afterObjects.length - 1; y >= 0; y--) { if (beforeObjects[i] === afterObjects[y]) { afterObjects.splice(y, 1); } @@ -854,28 +760,37 @@ } editor.selection.select(afterObjects[0]); }; - var handleInsert = function (editor, html) { - var beforeObjects = editor.dom.select('*[data-mce-object]'); + const handleInsert = (editor, html) => { + const beforeObjects = editor.dom.select('*[data-mce-object]'); editor.insertContent(html); selectPlaceholder(editor, beforeObjects); editor.nodeChanged(); }; - var submitForm = function (prevData, newData, editor) { - newData.embed = updateHtml(newData.embed, newData); + const isEmbedIframe = (url, mediaDataType) => isNonNullable(mediaDataType) && mediaDataType === 'ephox-embed-iri' && isNonNullable(matchPattern(url)); + const shouldInsertAsNewIframe = (prevData, newData) => { + const hasDimensionsChanged = (prevData, newData) => prevData.width !== newData.width || prevData.height !== newData.height; + return hasDimensionsChanged(prevData, newData) && isEmbedIframe(newData.source, prevData.type); + }; + const submitForm = (prevData, newData, editor) => { + var _a; + newData.embed = shouldInsertAsNewIframe(prevData, newData) && hasDimensions(editor) ? dataToHtml(editor, { + ...newData, + embed: '' + }) : updateHtml((_a = newData.embed) !== null && _a !== void 0 ? _a : '', newData, false, editor.schema); if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) { handleInsert(editor, newData.embed); } else { - getEmbedHtml(editor, newData).then(function (response) { + getEmbedHtml(editor, newData).then(response => { handleInsert(editor, response.html); }).catch(handleError(editor)); } }; - var showDialog = function (editor) { - var editorData = getEditorData(editor); - var currentData = Cell(editorData); - var initialData = wrap(editorData); - var handleSource = function (prevData, api) { - var serviceData = unwrap(api.getData(), 'source'); + const showDialog = editor => { + const editorData = getEditorData(editor); + const currentData = Cell(editorData); + const initialData = wrap(editorData); + const handleSource = (prevData, api) => { + const serviceData = unwrap(api.getData(), 'source'); if (prevData.source !== serviceData.source) { addEmbedHtml(win, editor)({ url: serviceData.source, @@ -884,29 +799,37 @@ getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor)); } }; - var handleEmbed = function (api) { - var data = unwrap(api.getData()); - var dataFromEmbed = snippetToData(editor, data.embed); + const handleEmbed = api => { + var _a; + const data = unwrap(api.getData()); + const dataFromEmbed = htmlToData((_a = data.embed) !== null && _a !== void 0 ? _a : '', editor.schema); api.setData(wrap(dataFromEmbed)); }; - var handleUpdate = function (api, sourceInput) { - var data = unwrap(api.getData(), sourceInput); - var embed = dataToHtml(editor, data); - api.setData(wrap(__assign(__assign({}, data), { embed: embed }))); + const handleUpdate = (api, sourceInput, prevData) => { + const dialogData = unwrap(api.getData(), sourceInput); + const data = shouldInsertAsNewIframe(prevData, dialogData) && hasDimensions(editor) ? { + ...dialogData, + embed: '' + } : dialogData; + const embed = dataToHtml(editor, data); + api.setData(wrap({ + ...data, + embed + })); }; - var mediaInput = [{ + const mediaInput = [{ name: 'source', type: 'urlinput', filetype: 'media', label: 'Source' }]; - var sizeInput = !hasDimensions(editor) ? [] : [{ + const sizeInput = !hasDimensions(editor) ? [] : [{ type: 'sizeinput', name: 'dimensions', label: 'Constrain proportions', constrain: true }]; - var generalTab = { + const generalTab = { title: 'General', name: 'general', items: flatten([ @@ -914,16 +837,16 @@ sizeInput ]) }; - var embedTextarea = { + const embedTextarea = { type: 'textarea', name: 'embed', label: 'Paste your embed code below:' }; - var embedTab = { + const embedTab = { title: 'Embed', items: [embedTextarea] }; - var advancedFormItems = []; + const advancedFormItems = []; if (hasAltSource(editor)) { advancedFormItems.push({ name: 'altsource', @@ -940,26 +863,26 @@ label: 'Media poster (Image URL)' }); } - var advancedTab = { + const advancedTab = { title: 'Advanced', name: 'advanced', items: advancedFormItems }; - var tabs = [ + const tabs = [ generalTab, embedTab ]; if (advancedFormItems.length > 0) { tabs.push(advancedTab); } - var body = { + const body = { type: 'tabpanel', - tabs: tabs + tabs }; - var win = editor.windowManager.open({ + const win = editor.windowManager.open({ title: 'Insert/Edit Media', size: 'normal', - body: body, + body, buttons: [ { type: 'cancel', @@ -973,12 +896,12 @@ primary: true } ], - onSubmit: function (api) { - var serviceData = unwrap(api.getData()); + onSubmit: api => { + const serviceData = unwrap(api.getData()); submitForm(currentData.get(), serviceData, editor); api.close(); }, - onChange: function (api, detail) { + onChange: (api, detail) => { switch (detail.name) { case 'source': handleSource(currentData.get(), api); @@ -989,96 +912,42 @@ case 'dimensions': case 'altsource': case 'poster': - handleUpdate(api, detail.name); + handleUpdate(api, detail.name, currentData.get()); break; } currentData.set(unwrap(api.getData())); }, - initialData: initialData + initialData }); }; - var get = function (editor) { - var showDialog$1 = function () { + const get = editor => { + const showDialog$1 = () => { showDialog(editor); }; return { showDialog: showDialog$1 }; }; - var register$1 = function (editor) { - var showDialog$1 = function () { + const register$1 = editor => { + const showDialog$1 = () => { showDialog(editor); }; editor.addCommand('mceMedia', showDialog$1); }; - var global$2 = tinymce.util.Tools.resolve('tinymce.html.Node'); - - var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); - - var global = tinymce.util.Tools.resolve('tinymce.html.DomParser'); - - var sanitize = function (editor, html) { - if (shouldFilterHtml(editor) === false) { - return html; - } - var writer = global$4(); - var blocked; - global$6({ - validate: false, - allow_conditional_comments: false, - comment: function (text) { - if (!blocked) { - writer.comment(text); - } - }, - cdata: function (text) { - if (!blocked) { - writer.cdata(text); - } - }, - text: function (text, raw) { - if (!blocked) { - writer.text(text, raw); - } - }, - start: function (name, attrs, empty) { - blocked = true; - if (name === 'script' || name === 'noscript' || name === 'svg') { - return; - } - for (var i = attrs.length - 1; i >= 0; i--) { - var attrName = attrs[i].name; - if (attrName.indexOf('on') === 0) { - delete attrs.map[attrName]; - attrs.splice(i, 1); - } - if (attrName === 'style') { - attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name); - } - } - writer.start(name, attrs, empty); - blocked = false; - }, - end: function (name) { - if (blocked) { - return; - } - writer.end(name); - } - }, global$5({})).parse(html); - return writer.getContent(); + const checkRange = (str, substr, start) => substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; + const startsWith = (str, prefix) => { + return checkRange(str, prefix, 0); }; - var isLiveEmbedNode = function (node) { - var name = node.name; + var global = tinymce.util.Tools.resolve('tinymce.Env'); + + const isLiveEmbedNode = node => { + const name = node.name; return name === 'iframe' || name === 'video' || name === 'audio'; }; - var getDimension = function (node, styles, dimension, defaultValue) { - if (defaultValue === void 0) { - defaultValue = null; - } - var value = node.attr(dimension); + const getDimension = (node, styles, dimension, defaultValue = null) => { + const value = node.attr(dimension); if (isNonNullable(value)) { return value; } else if (!has(styles, dimension)) { @@ -1087,42 +956,39 @@ return null; } }; - var setDimensions = function (node, previewNode, styles) { - var useDefaults = previewNode.name === 'img' || node.name === 'video'; - var defaultWidth = useDefaults ? '300' : null; - var fallbackHeight = node.name === 'audio' ? '30' : '150'; - var defaultHeight = useDefaults ? fallbackHeight : null; + const setDimensions = (node, previewNode, styles) => { + const useDefaults = previewNode.name === 'img' || node.name === 'video'; + const defaultWidth = useDefaults ? '300' : null; + const fallbackHeight = node.name === 'audio' ? '30' : '150'; + const defaultHeight = useDefaults ? fallbackHeight : null; previewNode.attr({ width: getDimension(node, styles, 'width', defaultWidth), height: getDimension(node, styles, 'height', defaultHeight) }); }; - var appendNodeContent = function (editor, nodeName, previewNode, html) { - var newNode = global({ - forced_root_block: false, - validate: false - }, editor.schema).parse(html, { context: nodeName }); + const appendNodeContent = (editor, nodeName, previewNode, html) => { + const newNode = Parser(editor.schema).parse(html, { context: nodeName }); while (newNode.firstChild) { previewNode.append(newNode.firstChild); } }; - var createPlaceholderNode = function (editor, node) { - var name = node.name; - var placeHolder = new global$2('img', 1); - placeHolder.shortEnded = true; + const createPlaceholderNode = (editor, node) => { + const name = node.name; + const placeHolder = new global$2('img', 1); retainAttributesAndInnerHtml(editor, node, placeHolder); setDimensions(node, placeHolder, {}); placeHolder.attr({ 'style': node.attr('style'), - 'src': global$1.transparentSrc, + 'src': global.transparentSrc, 'data-mce-object': name, 'class': 'mce-object mce-object-' + name }); return placeHolder; }; - var createPreviewNode = function (editor, node) { - var name = node.name; - var previewWrapper = new global$2('span', 1); + const createPreviewNode = (editor, node) => { + var _a; + const name = node.name; + const previewWrapper = new global$2('span', 1); previewWrapper.attr({ 'contentEditable': 'false', 'style': node.attr('style'), @@ -1130,8 +996,8 @@ 'class': 'mce-preview-object mce-object-' + name }); retainAttributesAndInnerHtml(editor, node, previewWrapper); - var styles = editor.dom.parseStyle(node.attr('style')); - var previewNode = new global$2(name, 1); + const styles = editor.dom.parseStyle((_a = node.attr('style')) !== null && _a !== void 0 ? _a : ''); + const previewNode = new global$2(name, 1); setDimensions(node, previewNode, styles); previewNode.attr({ src: node.attr('src'), @@ -1144,7 +1010,7 @@ frameborder: '0' }); } else { - var attrs = [ + const attrs = [ 'controls', 'crossorigin', 'currentTime', @@ -1153,122 +1019,119 @@ 'poster', 'preload' ]; - each$1(attrs, function (attrName) { + each$1(attrs, attrName => { previewNode.attr(attrName, node.attr(attrName)); }); - var sanitizedHtml = previewWrapper.attr('data-mce-html'); + const sanitizedHtml = previewWrapper.attr('data-mce-html'); if (isNonNullable(sanitizedHtml)) { appendNodeContent(editor, name, previewNode, unescape(sanitizedHtml)); } } - var shimNode = new global$2('span', 1); + const shimNode = new global$2('span', 1); shimNode.attr('class', 'mce-shim'); previewWrapper.append(previewNode); previewWrapper.append(shimNode); return previewWrapper; }; - var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) { - var attribs = sourceNode.attributes; - var ai = attribs.length; + const retainAttributesAndInnerHtml = (editor, sourceNode, targetNode) => { + var _a; + const attribs = (_a = sourceNode.attributes) !== null && _a !== void 0 ? _a : []; + let ai = attribs.length; while (ai--) { - var attrName = attribs[ai].name; - var attrValue = attribs[ai].value; - if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') { + const attrName = attribs[ai].name; + let attrValue = attribs[ai].value; + if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style' && !startsWith(attrName, 'data-mce-')) { if (attrName === 'data' || attrName === 'src') { attrValue = editor.convertURL(attrValue, attrName); } targetNode.attr('data-mce-p-' + attrName, attrValue); } } - var innerHtml = sourceNode.firstChild && sourceNode.firstChild.value; + const serializer = global$1({ inner: true }, editor.schema); + const tempNode = new global$2('div', 1); + each$1(sourceNode.children(), child => tempNode.append(child)); + const innerHtml = serializer.serialize(tempNode); if (innerHtml) { - targetNode.attr('data-mce-html', escape(sanitize(editor, innerHtml))); - targetNode.firstChild = null; + targetNode.attr('data-mce-html', escape(innerHtml)); + targetNode.empty(); } }; - var isPageEmbedWrapper = function (node) { - var nodeClass = node.attr('class'); - return nodeClass && /\btiny-pageembed\b/.test(nodeClass); + const isPageEmbedWrapper = node => { + const nodeClass = node.attr('class'); + return isString(nodeClass) && /\btiny-pageembed\b/.test(nodeClass); }; - var isWithinEmbedWrapper = function (node) { - while (node = node.parent) { - if (node.attr('data-ephox-embed-iri') || isPageEmbedWrapper(node)) { + const isWithinEmbedWrapper = node => { + let tempNode = node; + while (tempNode = tempNode.parent) { + if (tempNode.attr('data-ephox-embed-iri') || isPageEmbedWrapper(tempNode)) { return true; } } return false; }; - var placeHolderConverter = function (editor) { - return function (nodes) { - var i = nodes.length; - var node; - var videoScript; - while (i--) { - node = nodes[i]; - if (!node.parent) { - continue; - } - if (node.parent.attr('data-mce-object')) { - continue; - } - if (node.name === 'script') { - videoScript = getVideoScriptMatch(getScripts(editor), node.attr('src')); - if (!videoScript) { - continue; - } - } - if (videoScript) { - if (videoScript.width) { - node.attr('width', videoScript.width.toString()); - } - if (videoScript.height) { - node.attr('height', videoScript.height.toString()); - } + const placeHolderConverter = editor => nodes => { + let i = nodes.length; + let node; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + if (node.parent.attr('data-mce-object')) { + continue; + } + if (isLiveEmbedNode(node) && hasLiveEmbeds(editor)) { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPreviewNode(editor, node)); } - if (isLiveEmbedNode(node) && hasLiveEmbeds(editor) && global$1.ceFalse) { - if (!isWithinEmbedWrapper(node)) { - node.replace(createPreviewNode(editor, node)); - } - } else { - if (!isWithinEmbedWrapper(node)) { - node.replace(createPlaceholderNode(editor, node)); - } + } else { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPlaceholderNode(editor, node)); } } - }; + } }; - var setup$1 = function (editor) { - editor.on('preInit', function () { - var specialElements = editor.schema.getSpecialElements(); - global$8.each('video audio iframe object'.split(' '), function (name) { - specialElements[name] = new RegExp(']*>', 'gi'); - }); - var boolAttrs = editor.schema.getBoolAttrs(); - global$8.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) { + const parseAndSanitize = (editor, context, html) => { + const getEditorOption = editor.options.get; + const sanitize = getEditorOption('xss_sanitization'); + const validate = shouldFilterHtml(editor); + return Parser(editor.schema, { + sanitize, + validate + }).parse(html, { context }); + }; + + const setup$1 = editor => { + editor.on('PreInit', () => { + const {schema, serializer, parser} = editor; + const boolAttrs = schema.getBoolAttrs(); + each$1('webkitallowfullscreen mozallowfullscreen'.split(' '), name => { boolAttrs[name] = {}; }); - editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', placeHolderConverter(editor)); - editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) { - var i = nodes.length; - var node; - var realElm; - var ai; - var attribs; - var innerHtml; - var innerNode; - var realElmName; - var className; + each({ embed: ['wmode'] }, (attrs, name) => { + const rule = schema.getElementRule(name); + if (rule) { + each$1(attrs, attr => { + rule.attributes[attr] = {}; + rule.attributesOrder.push(attr); + }); + } + }); + parser.addNodeFilter('iframe,video,audio,object,embed,script', placeHolderConverter(editor)); + serializer.addAttributeFilter('data-mce-object', (nodes, name) => { + var _a; + let i = nodes.length; while (i--) { - node = nodes[i]; + const node = nodes[i]; if (!node.parent) { continue; } - realElmName = node.attr(name); - realElm = new global$2(realElmName, 1); + const realElmName = node.attr(name); + const realElm = new global$2(realElmName, 1); if (realElmName !== 'audio' && realElmName !== 'script') { - className = node.attr('class'); - if (className && className.indexOf('mce-preview-object') !== -1) { + const className = node.attr('class'); + if (className && className.indexOf('mce-preview-object') !== -1 && node.firstChild) { realElm.attr({ width: node.firstChild.attr('width'), height: node.firstChild.attr('height') @@ -1281,10 +1144,10 @@ } } realElm.attr({ style: node.attr('style') }); - attribs = node.attributes; - ai = attribs.length; + const attribs = (_a = node.attributes) !== null && _a !== void 0 ? _a : []; + let ai = attribs.length; while (ai--) { - var attrName = attribs[ai].name; + const attrName = attribs[ai].name; if (attrName.indexOf('data-mce-p-') === 0) { realElm.attr(attrName.substr(11), attribs[ai].value); } @@ -1292,59 +1155,72 @@ if (realElmName === 'script') { realElm.attr('type', 'text/javascript'); } - innerHtml = node.attr('data-mce-html'); + const innerHtml = node.attr('data-mce-html'); if (innerHtml) { - innerNode = new global$2('#text', 3); - innerNode.raw = true; - innerNode.value = sanitize(editor, unescape(innerHtml)); - realElm.append(innerNode); + const fragment = parseAndSanitize(editor, realElmName, unescape(innerHtml)); + each$1(fragment.children(), child => realElm.append(child)); } node.replace(realElm); } }); }); - editor.on('SetContent', function () { - editor.$('span.mce-preview-object').each(function (index, elm) { - var $elm = editor.$(elm); - if ($elm.find('span.mce-shim').length === 0) { - $elm.append(''); + editor.on('SetContent', () => { + const dom = editor.dom; + each$1(dom.select('span.mce-preview-object'), elm => { + if (dom.select('span.mce-shim', elm).length === 0) { + dom.add(elm, 'span', { class: 'mce-shim' }); } }); }); }; - var setup = function (editor) { - editor.on('ResolveName', function (e) { - var name; + const setup = editor => { + editor.on('ResolveName', e => { + let name; if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) { e.name = name; } }); }; - var register = function (editor) { - var onAction = function () { - return editor.execCommand('mceMedia'); + const onSetupEditable = editor => api => { + const nodeChanged = () => { + api.setEnabled(editor.selection.isEditable()); + }; + editor.on('NodeChange', nodeChanged); + nodeChanged(); + return () => { + editor.off('NodeChange', nodeChanged); }; + }; + const register = editor => { + const onAction = () => editor.execCommand('mceMedia'); editor.ui.registry.addToggleButton('media', { tooltip: 'Insert/edit media', icon: 'embed', - onAction: onAction, - onSetup: function (buttonApi) { - var selection = editor.selection; + onAction, + onSetup: buttonApi => { + const selection = editor.selection; buttonApi.setActive(isMediaElement(selection.getNode())); - return selection.selectorChangedWithUnbind('img[data-mce-object],span[data-mce-object],div[data-ephox-embed-iri]', buttonApi.setActive).unbind; + const unbindSelectorChanged = selection.selectorChangedWithUnbind('img[data-mce-object],span[data-mce-object],div[data-ephox-embed-iri]', buttonApi.setActive).unbind; + const unbindEditable = onSetupEditable(editor)(buttonApi); + return () => { + unbindSelectorChanged(); + unbindEditable(); + }; } }); editor.ui.registry.addMenuItem('media', { icon: 'embed', text: 'Media...', - onAction: onAction + onAction, + onSetup: onSetupEditable(editor) }); }; - function Plugin () { - global$9.add('media', function (editor) { + var Plugin = () => { + global$6.add('media', editor => { + register$2(editor); register$1(editor); register(editor); setup(editor); @@ -1352,8 +1228,8 @@ setup$2(editor); return get(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/media/plugin.min.js b/public/js/tinymce/plugins/media/plugin.min.js index f13a761a3..7229267d3 100644 --- a/public/js/tinymce/plugins/media/plugin.min.js +++ b/public/js/tinymce/plugins/media/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function e(n){return function(e){return r=typeof(t=e),(null===t?"null":"object"==r&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":r)===n;var t,r}}function s(e){return null!=e}function o(e){return function(){return e}}function t(e){return e}function r(){return d}var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),p=function(){return(p=Object.assign||function(e){for(var t,r=1,n=arguments.length;r"):"application/x-shockwave-flash"===n.sourcemime?(u='',n.poster&&(u+=''),u+""):-1!==n.sourcemime.indexOf("audio")?(s=n,m?m(s):'"):"script"===n.type?' '; - var directionality = editor.getBody().dir; - var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; - var previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + ''; + const bodyId = getBodyId(editor); + const bodyClass = getBodyClass(editor); + const isMetaKeyPressed = global$1.os.isMacOS() || global$1.os.isiOS() ? 'e.metaKey' : 'e.ctrlKey && !e.altKey'; + const preventClicksOnLinksScript = ' '; + const directionality = editor.getBody().dir; + const dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + const previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + ''; return previewHtml; }; - var open = function (editor) { - var content = getPreviewHtml(editor); - var dataApi = editor.windowManager.open({ + const open = editor => { + const content = getPreviewHtml(editor); + const dataApi = editor.windowManager.open({ title: 'Preview', size: 'large', body: { @@ -78,7 +50,8 @@ items: [{ name: 'preview', type: 'iframe', - sandboxed: true + sandboxed: true, + transparent: false }] }, buttons: [{ @@ -92,35 +65,33 @@ dataApi.focus('close'); }; - var register$1 = function (editor) { - editor.addCommand('mcePreview', function () { + const register$1 = editor => { + editor.addCommand('mcePreview', () => { open(editor); }); }; - var register = function (editor) { - var onAction = function () { - return editor.execCommand('mcePreview'); - }; + const register = editor => { + const onAction = () => editor.execCommand('mcePreview'); editor.ui.registry.addButton('preview', { icon: 'preview', tooltip: 'Preview', - onAction: onAction + onAction }); editor.ui.registry.addMenuItem('preview', { icon: 'preview', text: 'Preview', - onAction: onAction + onAction }); }; - function Plugin () { - global$2.add('preview', function (editor) { + var Plugin = () => { + global$2.add('preview', editor => { register$1(editor); register(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/preview/plugin.min.js b/public/js/tinymce/plugins/preview/plugin.min.js index 529e6768f..da8d60240 100644 --- a/public/js/tinymce/plugins/preview/plugin.min.js +++ b/public/js/tinymce/plugins/preview/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=tinymce.util.Tools.resolve("tinymce.Env"),w=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("preview",function(e){var n,t;function i(){return t.execCommand("mcePreview")}(n=e).addCommand("mcePreview",function(){var e,t;t=function(t){var n="",i=t.dom.encode,e=t.getParam("content_style","","string");n+='';var o=t.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"";w.each(t.contentCSS,function(e){n+='"}),e&&(n+='");var a,r,s,c,d,l,m,y=-1===(c=(a=t).getParam("body_id","tinymce","string")).indexOf("=")?c:(s=(r=a).getParam("body_id","","hash"))[r.id]||s,u=-1===(m=(d=t).getParam("body_class","","string")).indexOf("=")?m:(l=d).getParam("body_class","","hash")[l.id]||"",v=' '; - var directionality = editor.getBody().dir; - var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; - html = '' + '' + '' + '' + contentCssEntries_1 + preventClicksOnLinksScript + '' + '' + html + '' + ''; + const bodyClass = getBodyClass(editor); + const encode = editor.dom.encode; + const isMetaKeyPressed = global.os.isMacOS() || global.os.isiOS() ? 'e.metaKey' : 'e.ctrlKey && !e.altKey'; + const preventClicksOnLinksScript = ' '; + const directionality = editor.getBody().dir; + const dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + previewHtml = '' + '' + '' + '' + contentCssEntries + preventClicksOnLinksScript + '' + '' + previewHtml + '' + ''; } - return replaceTemplateValues(html, getPreviewReplaceValues(editor)); + return replaceTemplateValues(previewHtml, getPreviewReplaceValues(editor)); }; - var open = function (editor, templateList) { - var createTemplates = function () { + const open = (editor, templateList) => { + const createTemplates = () => { if (!templateList || templateList.length === 0) { - var message = editor.translate('No templates defined.'); + const message = editor.translate('No templates defined.'); editor.notificationManager.open({ text: message, type: 'info' }); return Optional.none(); } - return Optional.from(global$3.map(templateList, function (template, index) { - var isUrlTemplate = function (t) { - return t.url !== undefined; - }; + return Optional.from(global$2.map(templateList, (template, index) => { + const isUrlTemplate = t => t.url !== undefined; return { selected: index === 0, text: template.title, @@ -397,121 +395,90 @@ }; })); }; - var createSelectBoxItems = function (templates) { - return map(templates, function (t) { - return { - text: t.text, - value: t.text - }; - }); - }; - var findTemplate = function (templates, templateTitle) { - return find(templates, function (t) { - return t.text === templateTitle; - }); + const createSelectBoxItems = templates => map(templates, t => ({ + text: t.text, + value: t.text + })); + const findTemplate = (templates, templateTitle) => find(templates, t => t.text === templateTitle); + const loadFailedAlert = api => { + editor.windowManager.alert('Could not load the specified template.', () => api.focus('template')); }; - var loadFailedAlert = function (api) { - editor.windowManager.alert('Could not load the specified template.', function () { - return api.focus('template'); - }); - }; - var getTemplateContent = function (t) { - return new global(function (resolve, reject) { - t.value.url.fold(function () { - return resolve(t.value.content.getOr('')); - }, function (url) { - return global$2.send({ - url: url, - success: function (html) { - resolve(html); - }, - error: function (e) { - reject(e); - } + const getTemplateContent = t => t.value.url.fold(() => Promise.resolve(t.value.content.getOr('')), url => fetch(url).then(res => res.ok ? res.text() : Promise.reject())); + const onChange = (templates, updateDialog) => (api, change) => { + if (change.name === 'template') { + const newTemplateTitle = api.getData().template; + findTemplate(templates, newTemplateTitle).each(t => { + api.block('Loading...'); + getTemplateContent(t).then(previewHtml => { + updateDialog(api, t, previewHtml); + }).catch(() => { + updateDialog(api, t, ''); + api.setEnabled('save', false); + loadFailedAlert(api); }); }); - }); - }; - var onChange = function (templates, updateDialog) { - return function (api, change) { - if (change.name === 'template') { - var newTemplateTitle = api.getData().template; - findTemplate(templates, newTemplateTitle).each(function (t) { - api.block('Loading...'); - getTemplateContent(t).then(function (previewHtml) { - updateDialog(api, t, previewHtml); - }).catch(function () { - updateDialog(api, t, ''); - api.disable('save'); - loadFailedAlert(api); - }); - }); - } - }; + } }; - var onSubmit = function (templates) { - return function (api) { - var data = api.getData(); - findTemplate(templates, data.template).each(function (t) { - getTemplateContent(t).then(function (previewHtml) { - editor.execCommand('mceInsertTemplate', false, previewHtml); - api.close(); - }).catch(function () { - api.disable('save'); - loadFailedAlert(api); - }); + const onSubmit = templates => api => { + const data = api.getData(); + findTemplate(templates, data.template).each(t => { + getTemplateContent(t).then(previewHtml => { + editor.execCommand('mceInsertTemplate', false, previewHtml); + api.close(); + }).catch(() => { + api.setEnabled('save', false); + loadFailedAlert(api); }); - }; + }); }; - var openDialog = function (templates) { - var selectBoxItems = createSelectBoxItems(templates); - var buildDialogSpec = function (bodyItems, initialData) { - return { - title: 'Insert Template', - size: 'large', - body: { - type: 'panel', - items: bodyItems + const openDialog = templates => { + const selectBoxItems = createSelectBoxItems(templates); + const buildDialogSpec = (bodyItems, initialData) => ({ + title: 'Insert Template', + size: 'large', + body: { + type: 'panel', + items: bodyItems + }, + initialData, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' }, - initialData: initialData, - buttons: [ - { - type: 'cancel', - name: 'cancel', - text: 'Cancel' - }, - { - type: 'submit', - name: 'save', - text: 'Save', - primary: true - } - ], - onSubmit: onSubmit(templates), - onChange: onChange(templates, updateDialog) - }; - }; - var updateDialog = function (dialogApi, template, previewHtml) { - var content = getPreviewContent(editor, previewHtml); - var bodyItems = [ { - type: 'selectbox', + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: onSubmit(templates), + onChange: onChange(templates, updateDialog) + }); + const updateDialog = (dialogApi, template, previewHtml) => { + const content = getPreviewContent(editor, previewHtml); + const bodyItems = [ + { + type: 'listbox', name: 'template', label: 'Templates', items: selectBoxItems }, { type: 'htmlpanel', - html: '

    ' + htmlEscape(template.value.description) + '

    ' + html: `

    ${ htmlEscape(template.value.description) }

    ` }, { label: 'Preview', type: 'iframe', name: 'preview', - sandboxed: false + sandboxed: false, + transparent: false } ]; - var initialData = { + const initialData = { template: template.text, preview: content }; @@ -519,40 +486,38 @@ dialogApi.redial(buildDialogSpec(bodyItems, initialData)); dialogApi.focus('template'); }; - var dialogApi = editor.windowManager.open(buildDialogSpec([], { + const dialogApi = editor.windowManager.open(buildDialogSpec([], { template: '', preview: '' })); dialogApi.block('Loading...'); - getTemplateContent(templates[0]).then(function (previewHtml) { + getTemplateContent(templates[0]).then(previewHtml => { updateDialog(dialogApi, templates[0], previewHtml); - }).catch(function () { + }).catch(() => { updateDialog(dialogApi, templates[0], ''); - dialogApi.disable('save'); + dialogApi.setEnabled('save', false); loadFailedAlert(dialogApi); }); }; - var optTemplates = createTemplates(); + const optTemplates = createTemplates(); optTemplates.each(openDialog); }; - var showDialog = function (editor) { - return function (templates) { - open(editor, templates); - }; + const showDialog = editor => templates => { + open(editor, templates); }; - var register$1 = function (editor) { + const register$1 = editor => { editor.addCommand('mceInsertTemplate', curry(insertTemplate, editor)); editor.addCommand('mceTemplate', createTemplateList(editor, showDialog(editor))); }; - var setup = function (editor) { - editor.on('PreProcess', function (o) { - var dom = editor.dom, dateFormat = getMdateFormat(editor); - global$3.each(dom.select('div', o.node), function (e) { + const setup = editor => { + editor.on('PreProcess', o => { + const dom = editor.dom, dateFormat = getMdateFormat(editor); + global$2.each(dom.select('div', o.node), e => { if (dom.hasClass(e, 'mceTmpl')) { - global$3.each(dom.select('*', e), function (e) { - if (dom.hasClass(e, getModificationDateClasses(editor).replace(/\s+/g, '|'))) { + global$2.each(dom.select('*', e), e => { + if (hasAnyClasses(dom, e, getModificationDateClasses(editor))) { e.innerHTML = getDateTime(editor, dateFormat); } }); @@ -562,30 +527,41 @@ }); }; - var register = function (editor) { - var onAction = function () { - return editor.execCommand('mceTemplate'); + const onSetupEditable = editor => api => { + const nodeChanged = () => { + api.setEnabled(editor.selection.isEditable()); + }; + editor.on('NodeChange', nodeChanged); + nodeChanged(); + return () => { + editor.off('NodeChange', nodeChanged); }; + }; + const register = editor => { + const onAction = () => editor.execCommand('mceTemplate'); editor.ui.registry.addButton('template', { icon: 'template', tooltip: 'Insert template', - onAction: onAction + onSetup: onSetupEditable(editor), + onAction }); editor.ui.registry.addMenuItem('template', { icon: 'template', text: 'Insert template...', - onAction: onAction + onSetup: onSetupEditable(editor), + onAction }); }; - function Plugin () { - global$4.add('template', function (editor) { + var Plugin = () => { + global$3.add('template', editor => { + register$2(editor); register(editor); register$1(editor); setup(editor); }); - } + }; Plugin(); -}()); +})(); diff --git a/public/js/tinymce/plugins/template/plugin.min.js b/public/js/tinymce/plugins/template/plugin.min.js index fe2d63b97..109fd0cd1 100644 --- a/public/js/tinymce/plugins/template/plugin.min.js +++ b/public/js/tinymce/plugins/template/plugin.min.js @@ -1,9 +1,4 @@ /** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.10.3 (2022-02-09) + * TinyMCE version 6.5.1 (2023-06-19) */ -!function(){"use strict";function o(e){return function(){return e}}function e(e){return e}function i(e){return n=typeof(t=e),"string"==(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n);var t,n}var t,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(e){return typeof e===t};function s(e){return e.getParam("template_mdate_classes","mdate")}function l(e){return e.getParam("template_replace_values")}function m(e){return e.getParam("template_mdate_format",e.translate("%Y-%m-%d"))}function f(e,t){if((e=""+e).length")&&(o="",c=r.getParam("content_style","","string"),l=r.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"",O.each(r.contentCSS,function(e){o+='"}),c&&(o+='"),i=-1===(g=(p=r).getParam("body_class","","string")).indexOf("=")?g:(d=p).getParam("body_class","","hash")[d.id]||"",u=r.dom.encode,s=' - + + @endpush \ No newline at end of file diff --git a/resources/views/pesan/compose_pesan.blade.php b/resources/views/pesan/compose_pesan.blade.php index f44c9cd42..f59a67eb7 100644 --- a/resources/views/pesan/compose_pesan.blade.php +++ b/resources/views/pesan/compose_pesan.blade.php @@ -3,7 +3,7 @@ @section('content')

    - {{ $page_title ?? "Page Title" }} + {{ $page_title ?? 'Page Title' }} {{ $page_description ?? '' }}