diff --git a/.bladeignore b/.bladeignore
index 140fada73f..d9eb7ced6e 100644
--- a/.bladeignore
+++ b/.bladeignore
@@ -1 +1,2 @@
vendor/*
+resources/views/js/_tinymce_wysiwyg.blade.php
diff --git a/.env.example b/.env.example
index d058c34ef2..458905c8ad 100644
--- a/.env.example
+++ b/.env.example
@@ -41,4 +41,4 @@ PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
-MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
\ No newline at end of file
diff --git a/.github/workflows/Lint.yml b/.github/workflows/CI.yml
similarity index 55%
rename from .github/workflows/Lint.yml
rename to .github/workflows/CI.yml
index 7eae3fc3ec..8ef7f773c0 100644
--- a/.github/workflows/Lint.yml
+++ b/.github/workflows/CI.yml
@@ -1,4 +1,4 @@
-name: Lint
+name: Lint & Build Mix Assets
on:
push:
@@ -14,14 +14,14 @@ on:
- reopened
jobs:
- pint:
- uses: itinerare/github-actions/.github/workflows/pint.yml@main
+ lint:
+ uses: itinerare/github-actions/.github/workflows/lint.yml@main
with:
php-version: '8.1'
concurrency:
group: ci-${{ github.head_ref || github.ref_name }}
- blade-formatter:
- uses: itinerare/github-actions/.github/workflows/blade_formatter.yml@main
+ rebuild-mix-assets:
+ uses: itinerare/github-actions/.github/workflows/mix_build.yml@main
concurrency:
- group: ci-${{ github.head_ref || github.ref_name }}
+ group: ci-${{ github.head_ref }}
diff --git a/.gitignore b/.gitignore
index bafc0dea2e..a5eabb696e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,4 @@ yarn-error.log
*.env
/composer.phar
*.cache
+/.vs
diff --git a/app/Console/Commands/AddImageHashes.php b/app/Console/Commands/AddImageHashes.php
index c266e933aa..70b0727254 100644
--- a/app/Console/Commands/AddImageHashes.php
+++ b/app/Console/Commands/AddImageHashes.php
@@ -70,7 +70,7 @@ public function handle() {
(new FeatureService)->handleImage(
null,
public_path($image->imageDirectory),
- $image->hash.$image->id.'-image.png',
+ $image->id.'-'.$image->hash.'-image.png',
$oldName
)
) {
@@ -87,7 +87,7 @@ public function handle() {
(new FeatureService)->handleImage(
null,
public_path($image->imageDirectory),
- $image->hash.$image->id.'-icon.png',
+ $image->id.'-'.$image->hash.'-icon.png',
$oldName
)
) {
diff --git a/app/Console/Commands/AddSiteSettings.php b/app/Console/Commands/AddSiteSettings.php
index c053e44a90..424fa26124 100644
--- a/app/Console/Commands/AddSiteSettings.php
+++ b/app/Console/Commands/AddSiteSettings.php
@@ -83,6 +83,18 @@ public function handle() {
$this->addSiteSetting('comment_dislikes_enabled', 0, '0: Dislikes disabled, 1: Dislikes enabled.');
+ $this->addSiteSetting('shop_type', 0, '0: Default, 1: Collapsible.');
+
+ $this->addSiteSetting('coupon_settings', 0, '0: Percentage is taken from total (e.g 20% from 2 items costing a total of 100 = 80), 1: Percentage is taken from item (e.g 20% from 2 items costing a total of 100 = 90)');
+
+ $this->addSiteSetting('limited_stock_coupon_settings', 0, '0: Does not allow coupons to be used on limited stock items, 1: Allows coupons to be used on limited stock items');
+
+ $this->addSiteSetting('can_transfer_currency_directly', 1, 'Whether or not users can directly transfer currency to other users without trading. 0: Users cannot directly transfer currency. 1: Direct currency transfers are allowed.');
+
+ $this->addSiteSetting('can_transfer_items_directly', 1, 'Whether or not users can directly transfer items to other users without trading. 0: Users cannot directly transfer items. 1: Direct item transfers are allowed.');
+
+ $this->addSiteSetting('allow_users_to_delete_profile_comments', 0, '0: Users cannot delete profile comments, 1: Users can delete profile comments.');
+
$this->line("\nSite settings up to date!");
}
diff --git a/app/Console/Commands/ConvertCharacterSubtype.php b/app/Console/Commands/ConvertCharacterSubtype.php
new file mode 100644
index 0000000000..c612c998b6
--- /dev/null
+++ b/app/Console/Commands/ConvertCharacterSubtype.php
@@ -0,0 +1,159 @@
+whereNotNull('subtype_id')->orWhereNotNull('subtype_id_2')->orWhereNotNull('subtype_id_3');
+ } elseif ($secondSubtype) {
+ $query->whereNotNull('subtype_id')->orWhereNotNull('subtype_id_2');
+ } else {
+ $query->whereNotNull('subtype_id');
+ }
+ })->get();
+
+ $this->info('Converting '.count($updates).' updates\' subtypes...');
+ $updateBar = $this->output->createProgressBar(count($updates));
+
+ foreach ($updates as $update) {
+ $updateSubtypes = [];
+ if ($update->subtype_id) {
+ $updateSubtypes[] = $update->subtype_id;
+ }
+ if ($secondSubtype && $update->subtype_id_2) {
+ $updateSubtypes[] = $update->subtype_id_2;
+ }
+ if ($thirdSubtype && $update->subtype_id_3) {
+ $updateSubtypes[] = $update->subtype_id_3;
+ }
+
+ $update->update([
+ 'subtype_ids' => $updateSubtypes,
+ ]);
+ $updateBar->advance();
+ }
+
+ $updateBar->finish();
+ $this->info("\n".'Dropping subtype ID column'.($secondSubtype ? 's' : '').' from the design updates table...');
+
+ Schema::table('design_updates', function (Blueprint $table) {
+ $table->dropColumn('subtype_id');
+ });
+ if ($secondSubtype) {
+ Schema::table('design_updates', function (Blueprint $table) {
+ $table->dropColumn('subtype_id_2');
+ });
+ }
+ if ($thirdSubtype) {
+ Schema::table('design_updates', function (Blueprint $table) {
+ $table->dropColumn('subtype_id_3');
+ });
+ }
+
+ // CHARACTER IMAGES
+ $characterImages = CharacterImage::where(function ($query) use ($secondSubtype, $thirdSubtype) {
+ if ($thirdSubtype) {
+ $query->whereNotNull('subtype_id')->orWhereNotNull('subtype_id_2')->orWhereNotNull('subtype_id_3');
+ } elseif ($secondSubtype) {
+ $query->whereNotNull('subtype_id')->orWhereNotNull('subtype_id_2');
+ } else {
+ $query->whereNotNull('subtype_id');
+ }
+ })->get();
+
+ $this->info('Converting '.count($characterImages).' character images\' subtypes...');
+ $imageBar = $this->output->createProgressBar(count($characterImages));
+ foreach ($characterImages as $characterImage) {
+ if ($characterImage->subtype_id) {
+ CharacterImageSubtype::create([
+ 'character_image_id' => $characterImage->id,
+ 'subtype_id' => $characterImage->subtype_id,
+ ]);
+ }
+
+ if ($secondSubtype && $characterImage->subtype_id_2) {
+ CharacterImageSubtype::create([
+ 'character_image_id' => $characterImage->id,
+ 'subtype_id' => $characterImage->subtype_id_2,
+ ]);
+ }
+
+ if ($thirdSubtype && $characterImage->subtype_id_3) {
+ CharacterImageSubtype::create([
+ 'character_image_id' => $characterImage->id,
+ 'subtype_id' => $characterImage->subtype_id_3,
+ ]);
+ }
+ $imageBar->advance();
+ }
+
+ $imageBar->finish();
+ $this->info("\n".'Dropping subtype ID column'.($secondSubtype ? 's' : '').' from the character images table...');
+
+ Schema::table('character_images', function (Blueprint $table) {
+ $table->dropColumn('subtype_id');
+ });
+ if ($secondSubtype) {
+ Schema::table('character_images', function (Blueprint $table) {
+ $table->dropColumn('subtype_id_2');
+ });
+ }
+ if ($thirdSubtype) {
+ Schema::table('character_images', function (Blueprint $table) {
+ $table->dropColumn('subtype_id_3');
+ });
+ }
+
+ $this->info('Done!');
+ } else {
+ $this->info('This command will not execute, as it has already been run.');
+ }
+ }
+}
diff --git a/app/Console/Commands/ConvertItemRarities.php b/app/Console/Commands/ConvertItemRarities.php
new file mode 100644
index 0000000000..69c67d0ec8
--- /dev/null
+++ b/app/Console/Commands/ConvertItemRarities.php
@@ -0,0 +1,94 @@
+info('Item Entry Expansion is not enabled. Exiting.');
+
+ return;
+ }
+ $rarityItems = Item::whereNotNull('data->rarity')->get();
+ // pluck the rarity values from the items
+ $rarityValues = $rarityItems->pluck('data.rarity')->unique();
+ foreach ($rarityValues as $rarityValue) {
+ $this->info("\nCreating rarity for value: ".$rarityValue.'...');
+ $nearestRarity = Rarity::where('sort', $rarityValue)->first();
+ if (!$nearestRarity) {
+ $nearestRarity = Rarity::where('sort', $rarityValue - 1)->first();
+ }
+
+ if ($nearestRarity) {
+ $this->info('Closest rarity (based on sort) found: '.$nearestRarity->name);
+ $this->info('If this rarity is not correct, please enter "n" and choose the correct rarity.');
+ $ask = $this->ask('Do you want to use this rarity for the value '.$rarityValue.'? (y/n)', 'y');
+ if ($ask === 'y') {
+ $rarityItems->where('data.rarity', $rarityValue)->each(function ($item) use ($nearestRarity) {
+ $item->data = array_merge($item->data, ['rarity_id' => $nearestRarity->id]);
+ $item->save();
+ });
+ $this->info('Items with rarity value '.$rarityValue.' have been updated to use rarity '.$nearestRarity->name);
+ } else {
+ $rarityName = $this->ask('Enter the name of the rarity you want to use for the value '.$rarityValue);
+ $rarity = Rarity::where('name', 'LIKE', '%'.$rarityName.'%')->first();
+ if ($rarity) {
+ $check = $this->ask('Do you want to use the rarity '.$rarity->name.' for the value '.$rarityValue.'? (y/n)', 'y');
+ if ($check === 'y') {
+ $rarityItems->where('data.rarity', $rarityValue)->each(function ($item) use ($rarity) {
+ $item->data = array_merge($item->data, ['rarity_id' => $rarity->id]);
+ $item->save();
+ });
+ $this->info('Items with rarity value '.$rarityValue.' have been updated to use rarity '.$rarity->name);
+ } else {
+ $this->info('No changes made for rarity value '.$rarityValue.'.');
+ }
+ } else {
+ $this->info('No matching rarity found for name '.$rarityName.'.');
+ }
+ }
+ } else {
+ $this->info('No matching rarity found for value '.$rarityValue.'.');
+ $rarityName = $this->ask('Enter the name of the rarity you want to use for the value '.$rarityValue.':');
+ $rarity = Rarity::whereRaw('LOWER(name) LIKE ?', ['%'.strtolower($rarityName).'%'])->first();
+ if ($rarity) {
+ $check = $this->ask('Do you want to use the rarity '.$rarity->name.' for the value '.$rarityValue.'? (y/n)', 'y');
+ if ($check === 'y') {
+ $rarityItems->where('data.rarity', $rarityValue)->each(function ($item) use ($rarity) {
+ $item->data = array_merge($item->data, ['rarity_id' => $rarity->id]);
+ $item->save();
+ });
+ $this->info('Items with rarity value '.$rarityValue.' have been updated to use rarity '.$rarity->name);
+ } else {
+ $this->info('No changes made for rarity value '.$rarityValue.'.');
+ }
+ } else {
+ $this->info('No matching rarity found for name '.$rarityName.'.');
+ $this->info('Feel free to re-run the command to try again.');
+ }
+ }
+ }
+ }
+}
diff --git a/app/Console/Commands/ConvertShopLimits.php b/app/Console/Commands/ConvertShopLimits.php
new file mode 100644
index 0000000000..2cdde0dd14
--- /dev/null
+++ b/app/Console/Commands/ConvertShopLimits.php
@@ -0,0 +1,58 @@
+info('No shop limits to convert.');
+
+ return;
+ }
+
+ $shopLimits = DB::table('shop_limits')->get();
+ $bar = $this->output->createProgressBar(count($shopLimits));
+ $bar->start();
+ foreach ($shopLimits as $shopLimit) {
+ Limit::create([
+ 'object_model' => 'App\Models\Shop\Shop',
+ 'object_id' => $shopLimit->shop_id,
+ 'limit_type' => 'item',
+ 'limit_id' => $shopLimit->item_id,
+ 'quantity' => 1,
+ ]);
+
+ $bar->advance();
+ }
+ $bar->finish();
+
+ // drop the is_restricted column from the shops table
+ Schema::table('shops', function ($table) {
+ $table->dropColumn('is_restricted');
+ });
+
+ Schema::dropIfExists('shop_limits');
+ }
+}
diff --git a/app/Console/Commands/FixEqualsCriteriaLoots.php b/app/Console/Commands/FixEqualsCriteriaLoots.php
new file mode 100644
index 0000000000..70ecb67288
--- /dev/null
+++ b/app/Console/Commands/FixEqualsCriteriaLoots.php
@@ -0,0 +1,44 @@
+get();
+
+ foreach ($loots as $loot) {
+ $data = $loot->data;
+
+ if (isset($data['criteria']) && $data['criteria'] == '=') {
+ $data['criteria'] = '==';
+
+ Loot::where([
+ ['loot_table_id', '=', $loot->loot_table_id],
+ ['rewardable_type', '=', $loot->rewardable_type],
+ ['rewardable_id', '=', $loot->rewardable_id],
+ ])->update(['data' => $data]);
+ }
+ }
+ }
+}
diff --git a/app/Console/Commands/FixImageHashes.php b/app/Console/Commands/FixImageHashes.php
new file mode 100644
index 0000000000..9cd8a2294e
--- /dev/null
+++ b/app/Console/Commands/FixImageHashes.php
@@ -0,0 +1,105 @@
+whereNotNull('hash')->get();
+ $images = $images->concat(Currency::where('has_image', 1)->whereNotNull('hash')->orWhere('has_icon', 1)->whereNotNull('hash')->get());
+ $images = $images->concat(Feature::where('has_image', 1)->whereNotNull('hash')->get());
+ $images = $images->concat(FeatureCategory::where('has_image', 1)->whereNotNull('hash')->get());
+ $images = $images->concat(Item::where('has_image', 1)->whereNotNull('hash')->get());
+ $images = $images->concat(ItemCategory::where('has_image', 1)->whereNotNull('hash')->get());
+ $images = $images->concat(Prompt::where('has_image', 1)->whereNotNull('hash')->get());
+ $images = $images->concat(PromptCategory::where('has_image', 1)->whereNotNull('hash')->get());
+ $images = $images->concat(Rarity::where('has_image', 1)->whereNotNull('hash')->get());
+ $images = $images->concat(Shop::where('has_image', 1)->whereNotNull('hash')->get());
+ $images = $images->concat(Species::where('has_image', 1)->whereNotNull('hash')->get());
+ $images = $images->concat(Subtype::where('has_image', 1)->whereNotNull('hash')->get());
+
+ if ($images->count()) {
+ $this->line('Updating images...');
+ foreach ($images as $image) {
+ $oldName = $image->hash.$image->id.'-image.png';
+ $oldIconName = $image->hash.$image->id.'-icon.png'; // Moving this here, will not be used unless currency icon
+ $image->hash = randomString(10);
+ // Any service works, I can't use the abstract one
+ if (
+ File::exists(public_path($image->imageDirectory).'/'.$oldName) &&
+ (new FeatureService)->handleImage(
+ null,
+ public_path($image->imageDirectory),
+ $image->id.'-'.$image->hash.'-image.png',
+ $oldName
+ )
+ ) {
+ $image->save();
+ } else {
+ $this->info('Didn\'t add hash to '.get_class($image).', this could be expected or an error, id '.$image->id);
+ }
+
+ // Just for currency icons
+ if ($image instanceof Currency) {
+ if (
+ File::exists(public_path($image->imageDirectory).'/'.$oldIconName) &&
+ (new FeatureService)->handleImage(
+ null,
+ public_path($image->imageDirectory),
+ $image->id.'-'.$image->hash.'-icon.png',
+ $oldIconName
+ )
+ ) {
+ $image->save();
+ } else {
+ $this->info('Didn\'t add hash to currency icon image, this could be expected or an error, id '.$image->id);
+ }
+ }
+ }
+ $this->info('Updated images.');
+ } else {
+ $this->line('No images need updating!');
+ }
+ }
+}
diff --git a/app/Console/Commands/RestockShops.php b/app/Console/Commands/RestockShops.php
new file mode 100644
index 0000000000..cb7b6abacf
--- /dev/null
+++ b/app/Console/Commands/RestockShops.php
@@ -0,0 +1,81 @@
+where('restock', 1)->get();
+ foreach ($stocks as $stock) {
+ if ($stock->restock_interval == 2) {
+ // check if it's start of week
+ $now = Carbon::now();
+ $day = $now->dayOfWeek;
+ if ($day != 1) {
+ continue;
+ }
+ } elseif ($stock->restock_interval == 3) {
+ // check if it's start of month
+ $now = Carbon::now();
+ $day = $now->day;
+ if ($day != 1) {
+ continue;
+ }
+ }
+
+ // if the stock is random, restock from the stock type
+ if ($stock->isRandom) {
+ $type = $stock->stock_type;
+ $model = getAssetModelString(strtolower($type));
+ if (method_exists($model, 'visible')) {
+ $itemId = $stock->categoryId ?
+ $model::visible()->where(strtolower($type).'_category_id', $stock->categoryId)->inRandomOrder()->first()->id :
+ $model::visible()->inRandomOrder()->first()->id;
+ } elseif (method_exists($model, 'released')) {
+ $itemId = $stock->categoryId ?
+ $model::released()->where(strtolower($type).'_category_id', $stock->categoryId)->inRandomOrder()->first()->id :
+ $model::released()->inRandomOrder()->first()->id;
+ } else {
+ $itemId = $stock->categoryId ?
+ $model::where(strtolower($type).'_category_id', $stock->categoryId)->inRandomOrder()->first()->id :
+ $model::inRandomOrder()->first()->id;
+ }
+
+ $stock->item_id = $itemId;
+ $stock->save();
+ }
+
+ $stock->quantity = $stock->range ? mt_rand(1, $stock->restock_quantity) : $stock->restock_quantity;
+ $stock->save();
+ }
+ }
+}
diff --git a/app/Console/Commands/SetIsAdmin.php b/app/Console/Commands/SetIsAdmin.php
new file mode 100644
index 0000000000..9fcc1d369f
--- /dev/null
+++ b/app/Console/Commands/SetIsAdmin.php
@@ -0,0 +1,33 @@
+first();
+
+ $adminRank->update([
+ 'is_admin' => 1,
+ ]);
+ }
+}
diff --git a/app/Console/Commands/SetupAdminUser.php b/app/Console/Commands/SetupAdminUser.php
index c5d3da79dc..484da55dc8 100644
--- a/app/Console/Commands/SetupAdminUser.php
+++ b/app/Console/Commands/SetupAdminUser.php
@@ -49,6 +49,7 @@ public function handle() {
'name' => 'Admin',
'description' => 'The site admin. Has the ability to view/edit any data on the site.',
'sort' => 1,
+ 'is_admin' => 1,
]);
Rank::create([
'name' => 'Member',
diff --git a/app/Console/Commands/UpdateTimedStock.php b/app/Console/Commands/UpdateTimedStock.php
new file mode 100644
index 0000000000..0443446b03
--- /dev/null
+++ b/app/Console/Commands/UpdateTimedStock.php
@@ -0,0 +1,74 @@
+where('is_visible', 1)->get()->filter(function ($stock) {
+ return !$stock->isActive;
+ });
+ $showstock = ShopStock::where('is_timed_stock', 1)->where('is_visible', 0)->get()->filter(function ($stock) {
+ return $stock->isActive;
+ });
+
+ // set stock that should be active to active
+ foreach ($showstock as $showstock) {
+ $showstock->is_visible = 1;
+ $showstock->save();
+ }
+ // hide stock that should be hidden now
+ foreach ($hidestock as $hidestock) {
+ $hidestock->is_visible = 0;
+ $hidestock->save();
+ }
+
+ // also activate or deactivate the shops
+ $hideshop = Shop::where('is_timed_shop', 1)->where('is_active', 1)->get()->filter(function ($shop) {
+ return !$shop->isActive;
+ });
+ $showshop = Shop::where('is_timed_shop', 1)->where('is_active', 0)->get()->filter(function ($shop) {
+ return $shop->isActive;
+ });
+
+ // set shop that should be active to active
+ foreach ($showshop as $showshop) {
+ $showshop->is_active = 1;
+ $showshop->save();
+ }
+ // hide shop that should be hidden now
+ foreach ($hideshop as $hideshop) {
+ $hideshop->is_active = 0;
+ $hideshop->save();
+ }
+ }
+}
diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php
index a8bae72c58..053f4bd595 100644
--- a/app/Console/Kernel.php
+++ b/app/Console/Kernel.php
@@ -29,6 +29,10 @@ protected function schedule(Schedule $schedule) {
->daily();
$schedule->command('update-staff-reward-actions')
->daily();
+ $schedule->command('restock-shops')
+ ->daily();
+ $schedule->command('update-timed-stock')
+ ->everyMinute();
}
/**
diff --git a/app/Helpers/AssetHelpers.php b/app/Helpers/AssetHelpers.php
index c1fde8dc1a..0743861e1a 100644
--- a/app/Helpers/AssetHelpers.php
+++ b/app/Helpers/AssetHelpers.php
@@ -89,7 +89,7 @@ function getAssetKeys($isCharacter = false) {
*/
function getAssetModelString($type, $namespaced = true) {
switch ($type) {
- case 'items':
+ case 'items': case 'item':
if ($namespaced) {
return '\App\Models\Item\Item';
} else {
@@ -97,7 +97,7 @@ function getAssetModelString($type, $namespaced = true) {
}
break;
- case 'currencies':
+ case 'currencies': case 'currency':
if ($namespaced) {
return '\App\Models\Currency\Currency';
} else {
@@ -226,7 +226,6 @@ function removeAsset(&$array, $asset, $quantity = 1) {
/**
* Get a clean version of the asset array to store in the database,
* where each asset is listed in [id => quantity] format.
- * json_encode this and store in the data attribute.
*
* @param array $array
* @param bool $isCharacter
@@ -250,7 +249,6 @@ function getDataReadyAssets($array, $isCharacter = false) {
/**
* Retrieves the data associated with an asset array,
* basically reversing the above function.
- * Use the data attribute after json_decode()ing it.
*
* @param array $array
*
@@ -273,19 +271,56 @@ function parseAssetData($array) {
return $assets;
}
+/**
+ * Returns if two asset arrays are identical.
+ *
+ * @param array $first
+ * @param array $second
+ * @param mixed $isCharacter
+ * @param mixed $absQuantities
+ *
+ * @return bool
+ */
+function compareAssetArrays($first, $second, $isCharacter = false, $absQuantities = false) {
+ $keys = getAssetKeys($isCharacter);
+ foreach ($keys as $key) {
+ if (count($first[$key]) != count($second[$key])) {
+ return false;
+ }
+ foreach ($first[$key] as $id => $asset) {
+ if (!isset($second[$key][$id])) {
+ return false;
+ }
+
+ if ($absQuantities) {
+ if (abs($asset['quantity']) != abs($second[$key][$id]['quantity'])) {
+ return false;
+ }
+ } else {
+ if ($asset['quantity'] != $second[$key][$id]['quantity']) {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
/**
* Distributes the assets in an assets array to the given recipient (user).
* Loot tables will be rolled before distribution.
*
- * @param array $assets
- * @param \App\Models\User\User $sender
- * @param \App\Models\User\User $recipient
- * @param string $logType
- * @param string $data
+ * @param array $assets
+ * @param App\Models\User\User $sender
+ * @param App\Models\User\User $recipient
+ * @param string $logType
+ * @param string $data
+ * @param mixed|null $selected
*
* @return array
*/
-function fillUserAssets($assets, $sender, $recipient, $logType, $data) {
+function fillUserAssets($assets, $sender, $recipient, $logType, $data, $selected = null) {
// Roll on any loot tables
if (isset($assets['loot_tables'])) {
foreach ($assets['loot_tables'] as $table) {
@@ -296,37 +331,85 @@ function fillUserAssets($assets, $sender, $recipient, $logType, $data) {
foreach ($assets as $key => $contents) {
if ($key == 'items' && count($contents)) {
- $service = new \App\Services\InventoryManager;
+ $service = new App\Services\InventoryManager;
foreach ($contents as $asset) {
- if (!$service->creditItem($sender, $recipient, $logType, $data, $asset['asset'], $asset['quantity'])) {
- return false;
+ if ($asset['quantity'] < 0) {
+ if (!$selected) {
+ flash('No selected item found for debiting.')->error();
+
+ return false;
+ }
+
+ foreach ($selected as $stackData) {
+ if (!$service->debitStack($sender, $logType, $data, $stackData['stack'], $stackData['quantity'])) {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+
+ return false;
+ }
+ }
+ } else {
+ if (!$service->creditItem($sender, $recipient, $logType, $data, $asset['asset'], $asset['quantity'])) {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+
+ return false;
+ }
}
}
} elseif ($key == 'currencies' && count($contents)) {
- $service = new \App\Services\CurrencyManager;
+ $service = new App\Services\CurrencyManager;
foreach ($contents as $asset) {
- if (!$service->creditCurrency($sender, $recipient, $logType, $data['data'], $asset['asset'], $asset['quantity'])) {
- return false;
+ if ($asset['quantity'] < 0) {
+ if (!$service->debitCurrency($sender, $recipient, $logType, $data['data'], $asset['asset'], abs($asset['quantity']))) {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+
+ return false;
+ }
+ } else {
+ if (!$service->creditCurrency($sender, $recipient, $logType, $data['data'], $asset['asset'], $asset['quantity'])) {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+
+ return false;
+ }
}
}
} elseif ($key == 'raffle_tickets' && count($contents)) {
- $service = new \App\Services\RaffleManager;
+ $service = new App\Services\RaffleManager;
foreach ($contents as $asset) {
if (!$service->addTicket($recipient, $asset['asset'], $asset['quantity'])) {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+
return false;
}
}
} elseif ($key == 'user_items' && count($contents)) {
- $service = new \App\Services\InventoryManager;
+ $service = new App\Services\InventoryManager;
foreach ($contents as $asset) {
- if (!$service->moveStack($sender, $recipient, $logType, $data, $asset['asset'])) {
+ if (!$service->moveStack($sender, $recipient, $logType, $data, $asset['asset'], $asset['quantity'])) {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+
return false;
}
}
} elseif ($key == 'characters' && count($contents)) {
- $service = new \App\Services\CharacterManager;
+ $service = new App\Services\CharacterManager;
foreach ($contents as $asset) {
if (!$service->moveCharacter($asset['asset'], $recipient, $data, $asset['quantity'], $logType)) {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+
return false;
}
}
@@ -336,16 +419,34 @@ function fillUserAssets($assets, $sender, $recipient, $logType, $data) {
return $assets;
}
+/**
+ * Returns the total count of all assets in an asset array.
+ *
+ * @param array $array
+ *
+ * @return int
+ */
+function countAssets($array) {
+ $count = 0;
+ foreach ($array as $key => $contents) {
+ foreach ($contents as $asset) {
+ $count += $asset['quantity'];
+ }
+ }
+
+ return $count;
+}
+
/**
* Distributes the assets in an assets array to the given recipient (character).
* Loot tables will be rolled before distribution.
*
- * @param array $assets
- * @param \App\Models\User\User $sender
- * @param \App\Models\Character\Character $recipient
- * @param string $logType
- * @param string $data
- * @param mixed|null $submitter
+ * @param array $assets
+ * @param App\Models\User\User $sender
+ * @param App\Models\Character\Character $recipient
+ * @param string $logType
+ * @param string $data
+ * @param mixed|null $submitter
*
* @return array
*/
@@ -366,14 +467,14 @@ function fillCharacterAssets($assets, $sender, $recipient, $logType, $data, $sub
foreach ($assets as $key => $contents) {
if ($key == 'currencies' && count($contents)) {
- $service = new \App\Services\CurrencyManager;
+ $service = new App\Services\CurrencyManager;
foreach ($contents as $asset) {
if (!$service->creditCurrency($sender, ($asset['asset']->is_character_owned ? $recipient : $item_recipient), $logType, $data['data'], $asset['asset'], $asset['quantity'])) {
return false;
}
}
} elseif ($key == 'items' && count($contents)) {
- $service = new \App\Services\InventoryManager;
+ $service = new App\Services\InventoryManager;
foreach ($contents as $asset) {
if (!$service->creditItem($sender, (($asset['asset']->category && $asset['asset']->category->is_character_owned) ? $recipient : $item_recipient), $logType, $data, $asset['asset'], $asset['quantity'])) {
return false;
@@ -389,14 +490,27 @@ function fillCharacterAssets($assets, $sender, $recipient, $logType, $data, $sub
* Creates a rewards string from an asset array.
*
* @param array $array
+ * @param mixed $useDisplayName
+ * @param mixed $absQuantities
*
* @return string
*/
-function createRewardsString($array) {
+function createRewardsString($array, $useDisplayName = true, $absQuantities = false) {
$string = [];
foreach ($array as $key => $contents) {
foreach ($contents as $asset) {
- $string[] = $asset['asset']->displayName.' x'.$asset['quantity'];
+ if ($useDisplayName) {
+ if ($key == 'currencies') {
+ $name = $asset['asset'] ? $asset['asset']->display(($absQuantities ? abs($asset['quantity']) : $asset['quantity'])) : 'Deleted '.ucfirst(str_replace('_', ' ', $key));
+ $string[] = $asset['asset'] ? $name : $name.' x'.($absQuantities ? abs($asset['quantity']) : $asset['quantity']);
+ } else {
+ $name = $asset['asset']->displayName ?? ($asset['asset']->name ?? 'Deleted '.ucfirst(str_replace('_', ' ', $key)));
+ $string[] = $name.' x'.($absQuantities ? abs($asset['quantity']) : $asset['quantity']);
+ }
+ } else {
+ $name = $asset['asset']->name ?? 'Deleted '.ucfirst(str_replace('_', ' ', $key));
+ $string[] = $name.' x'.($absQuantities ? abs($asset['quantity']) : $asset['quantity']);
+ }
}
}
if (!count($string)) {
diff --git a/app/Helpers/Helpers.php b/app/Helpers/Helpers.php
index 3bbdad08f9..f0ac04e6ca 100644
--- a/app/Helpers/Helpers.php
+++ b/app/Helpers/Helpers.php
@@ -72,8 +72,8 @@ function breadcrumbs($links) {
/**
* Formats the timestamp to a standard format.
*
- * @param \Illuminate\Support\Carbon\Carbon $timestamp
- * @param mixed $showTime
+ * @param Illuminate\Support\Carbon\Carbon $timestamp
+ * @param mixed $showTime
*
* @return string
*/
@@ -159,7 +159,7 @@ function parseUsers($text, &$users) {
if ($count) {
$matches = array_unique($matches[1]);
foreach ($matches as $match) {
- $user = \App\Models\User\User::where('name', $match)->first();
+ $user = App\Models\User\User::where('name', $match)->first();
if ($user) {
$users[] = $user;
$text = preg_replace('/\B@'.$match.'/', $user->displayName, $text);
@@ -186,7 +186,7 @@ function parseUsersAndAvatars($text, &$users) {
if ($count) {
$matches = array_unique($matches[1]);
foreach ($matches as $match) {
- $user = \App\Models\User\User::where('name', $match)->first();
+ $user = App\Models\User\User::where('name', $match)->first();
if ($user) {
$users[] = $user;
$text = preg_replace('/\B%'.$match.'/', ' '.$user->displayName, $text);
@@ -213,7 +213,7 @@ function parseUserIDs($text, &$users) {
if ($count) {
$matches = array_unique($matches[1]);
foreach ($matches as $match) {
- $user = \App\Models\User\User::where('id', $match)->first();
+ $user = App\Models\User\User::where('id', $match)->first();
if ($user) {
$users[] = $user;
$text = preg_replace('/\[user='.$match.'\]/', $user->displayName, $text);
@@ -240,7 +240,7 @@ function parseUserIDsForAvatars($text, &$users) {
if ($count) {
$matches = array_unique($matches[1]);
foreach ($matches as $match) {
- $user = \App\Models\User\User::where('id', $match)->first();
+ $user = App\Models\User\User::where('id', $match)->first();
if ($user) {
$users[] = $user;
$text = preg_replace('/\[userav='.$match.'\]/', ' ', $text);
@@ -267,7 +267,7 @@ function parseCharacters($text, &$characters) {
if ($count) {
$matches = array_unique($matches[1]);
foreach ($matches as $match) {
- $character = \App\Models\Character\Character::where('slug', $match)->first();
+ $character = App\Models\Character\Character::where('slug', $match)->first();
if ($character) {
$characters[] = $character;
$text = preg_replace('/\[character='.$match.'\]/', $character->displayName, $text);
@@ -294,7 +294,7 @@ function parseCharacterThumbs($text, &$characters) {
if ($count) {
$matches = array_unique($matches[1]);
foreach ($matches as $match) {
- $character = \App\Models\Character\Character::where('slug', $match)->first();
+ $character = App\Models\Character\Character::where('slug', $match)->first();
if ($character) {
$characters[] = $character;
$text = preg_replace('/\[charthumb='.$match.'\]/', ' ', $text);
@@ -321,7 +321,7 @@ function parseGalleryThumbs($text, &$submissions) {
if ($count) {
$matches = array_unique($matches[1]);
foreach ($matches as $match) {
- $submission = \App\Models\Gallery\GallerySubmission::where('id', $match)->first();
+ $submission = App\Models\Gallery\GallerySubmission::where('id', $match)->first();
if ($submission) {
$submissions[] = $submission;
$text = preg_replace('/\[thumb='.$match.'\]/', ''.view('widgets._gallery_thumb', ['submission' => $submission]).' ', $text);
@@ -356,7 +356,7 @@ function randomString($characters) {
* @param string $url
* @param bool $failOnError
*
- * @return \App\Models\User\User|string
+ * @return App\Models\User\User|string
*/
function checkAlias($url, $failOnError = true) {
if ($url) {
@@ -373,7 +373,7 @@ function checkAlias($url, $failOnError = true) {
}
}
if ((!isset($matches[0]) || $matches[0] == []) && $failOnError) {
- throw new \Exception('This URL is from an invalid site. Please provide a URL for a user profile from a site used for authentication.');
+ throw new Exception('This URL is from an invalid site. Please provide a URL for a user profile from a site used for authentication.');
}
// and 2. if it contains an alias associated with a user on-site.
@@ -410,15 +410,16 @@ function prettyProfileLink($url) {
$site = $siteName;
$name = $matches[1][0];
$link = $matches[0][0];
+ $icon = $siteInfo['icon'] ?? 'fas fa-globe';
break;
}
}
// Return formatted link if possible; failing that, an unformatted link
if (isset($name) && isset($site) && isset($link)) {
- return ''.$name.'@'.(config('lorekeeper.sites.'.$site.'.display_name') != null ? config('lorekeeper.sites.'.$site.'.display_name') : $site).' ';
+ return ' '.$name.'@'.(config('lorekeeper.sites.'.$site.'.display_name') != null ? config('lorekeeper.sites.'.$site.'.display_name') : $site).' ';
} else {
- return ''.$url.' ';
+ return ' '.$url.' ';
}
}
@@ -447,3 +448,38 @@ function prettyProfileName($url) {
return $url;
}
}
+
+/**
+ * Returns the given objects limits, if any.
+ *
+ * @param mixed $object
+ *
+ * @return bool
+ */
+function getLimits($object) {
+ return App\Models\Limit\Limit::where('object_model', get_class($object))->where('object_id', $object->id)->get();
+}
+
+/**
+ * Checks the site setting and returns the appropriate FontAwesome version.
+ *
+ * @return string
+ */
+function faVersion() {
+ $setting = config('lorekeeper.settings.fa_version');
+ $directory = 'css';
+
+ switch ($setting) {
+ case 0:
+ $version = 'allv5';
+ break;
+ case 1:
+ $version = 'allv6';
+ break;
+ case 2:
+ $version = 'allvmix';
+ break;
+ }
+
+ return asset($directory.'/'.$version.'.min.css');
+}
diff --git a/app/Helpers/Notifications.php b/app/Helpers/Notifications.php
index d71e9d9492..7ccd23fe10 100644
--- a/app/Helpers/Notifications.php
+++ b/app/Helpers/Notifications.php
@@ -31,7 +31,7 @@ public function create($type, $user, $data) {
$notification = Notification::create([
'user_id' => $user->id,
'notification_type_id' => Notification::getNotificationId($type),
- 'data' => json_encode($data),
+ 'data' => $data,
'is_unread' => 1,
]);
diff --git a/app/Http/Controllers/Admin/Characters/CharacterController.php b/app/Http/Controllers/Admin/Characters/CharacterController.php
index d3007db829..f173231203 100644
--- a/app/Http/Controllers/Admin/Characters/CharacterController.php
+++ b/app/Http/Controllers/Admin/Characters/CharacterController.php
@@ -6,6 +6,7 @@
use App\Http\Controllers\Controller;
use App\Models\Character\Character;
use App\Models\Character\CharacterCategory;
+use App\Models\Character\CharacterImage;
use App\Models\Character\CharacterTransfer;
use App\Models\Feature\Feature;
use App\Models\Rarity;
@@ -13,7 +14,6 @@
use App\Models\Species\Subtype;
use App\Models\Trade;
use App\Models\User\User;
-use App\Models\User\UserItem;
use App\Services\CharacterManager;
use App\Services\TradeManager;
use Illuminate\Http\Request;
@@ -51,7 +51,7 @@ public function getCreateCharacter() {
'userOptions' => User::query()->orderBy('name')->pluck('name', 'id')->toArray(),
'rarities' => ['0' => 'Select Rarity'] + Rarity::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'specieses' => ['0' => 'Select Species'] + Species::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'subtypes' => ['0' => 'Pick a Species First'],
+ 'subtypes' => [],
'features' => Feature::getDropdownItems(1),
'isMyo' => false,
]);
@@ -67,7 +67,7 @@ public function getCreateMyo() {
'userOptions' => User::query()->orderBy('name')->pluck('name', 'id')->toArray(),
'rarities' => ['0' => 'Select Rarity'] + Rarity::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'specieses' => ['0' => 'Select Species'] + Species::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'subtypes' => ['0' => 'Pick a Species First'],
+ 'subtypes' => [],
'features' => Feature::getDropdownItems(1),
'isMyo' => true,
]);
@@ -82,7 +82,7 @@ public function getCreateCharacterMyoSubtype(Request $request) {
$species = $request->input('species');
return view('admin.masterlist._create_character_subtype', [
- 'subtypes' => ['0' => 'Select Subtype'] + Subtype::where('species_id', '=', $species)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'subtypes' => Subtype::where('species_id', '=', $species)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'isMyo' => $request->input('myo'),
]);
}
@@ -103,8 +103,8 @@ public function postCreateCharacter(Request $request, CharacterManager $service)
'x0', 'x1', 'y0', 'y1',
'designer_id', 'designer_url',
'artist_id', 'artist_url',
- 'species_id', 'subtype_id', 'rarity_id', 'feature_id', 'feature_data',
- 'image', 'thumbnail', 'image_description',
+ 'species_id', 'subtype_ids', 'rarity_id', 'feature_id', 'feature_data',
+ 'image', 'thumbnail', 'image_description', 'content_warnings',
]);
if ($character = $service->createCharacter($data, Auth::user())) {
flash('Character created successfully.')->success();
@@ -135,7 +135,7 @@ public function postCreateMyo(Request $request, CharacterManager $service) {
'x0', 'x1', 'y0', 'y1',
'designer_id', 'designer_url',
'artist_id', 'artist_url',
- 'species_id', 'subtype_id', 'rarity_id', 'feature_id', 'feature_data',
+ 'species_id', 'subtype_ids', 'rarity_id', 'feature_id', 'feature_data',
'image', 'thumbnail',
]);
if ($character = $service->createCharacter($data, Auth::user(), true)) {
@@ -270,7 +270,7 @@ public function getEditCharacterDescription($slug) {
abort(404);
}
- return view('character.admin._edit_description_modal', [
+ return view('character.admin._edit_description', [
'character' => $this->character,
'isMyo' => false,
]);
@@ -289,7 +289,7 @@ public function getEditMyoDescription($id) {
abort(404);
}
- return view('character.admin._edit_description_modal', [
+ return view('character.admin._edit_description', [
'character' => $this->character,
'isMyo' => true,
]);
@@ -670,30 +670,12 @@ public function getTradeQueue($type) {
$openTransfersQueue = Settings::get('open_transfers_queue');
- $stacks = [];
- foreach ($trades->get() as $trade) {
- foreach ($trade->data as $side=> $assets) {
- if (isset($assets['user_items'])) {
- $user_items = UserItem::with('item')->find(array_keys($assets['user_items']));
- $items = [];
- foreach ($assets['user_items'] as $id=> $quantity) {
- $user_item = $user_items->find($id);
- $user_item['quantity'] = $quantity;
- array_push($items, $user_item);
- }
- $items = collect($items)->groupBy('item_id');
- $stacks[$trade->id][$side] = $items;
- }
- }
- }
-
return view('admin.masterlist.character_trades', [
'trades' => $trades->orderBy('id', 'DESC')->paginate(20),
'tradesQueue' => Settings::get('open_transfers_queue'),
'openTransfersQueue' => $openTransfersQueue,
'transferCount' => $openTransfersQueue ? CharacterTransfer::active()->where('is_approved', 0)->count() : 0,
'tradeCount' => $openTransfersQueue ? Trade::where('status', 'Pending')->count() : 0,
- 'stacks' => $stacks,
]);
}
@@ -757,4 +739,21 @@ public function getMyoIndex() {
'slots' => Character::myo(1)->orderBy('id', 'DESC')->paginate(30),
]);
}
+
+ /**
+ * Gets all extant content warnings.
+ *
+ * @return string
+ */
+ public function getContentWarnings() {
+ $contentWarnings = CharacterImage::whereNotNull('content_warnings')->pluck('content_warnings')->flatten()->map(function ($warnings) {
+ return collect($warnings)->map(function ($warning) {
+ $lower = strtolower(trim($warning));
+
+ return ['warning' => ucwords($lower)];
+ });
+ })->sort()->flatten(1)->unique()->values()->toJson();
+
+ return $contentWarnings;
+ }
}
diff --git a/app/Http/Controllers/Admin/Characters/CharacterImageController.php b/app/Http/Controllers/Admin/Characters/CharacterImageController.php
index 780fa305e7..0aefec61b3 100644
--- a/app/Http/Controllers/Admin/Characters/CharacterImageController.php
+++ b/app/Http/Controllers/Admin/Characters/CharacterImageController.php
@@ -41,7 +41,7 @@ public function getNewImage($slug) {
'character' => $this->character,
'rarities' => ['0' => 'Select Rarity'] + Rarity::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'specieses' => ['0' => 'Select Species'] + Species::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'subtypes' => ['0' => 'Select Subtype'] + Subtype::where('species_id', '=', $this->character->image->species_id)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'subtypes' => Subtype::where('species_id', '=', $this->character->image->species_id)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'users' => User::query()->orderBy('name')->pluck('name', 'id')->toArray(),
'features' => Feature::getDropdownItems(1),
'isMyo' => false,
@@ -58,8 +58,8 @@ public function getNewImageSubtype(Request $request) {
$id = $request->input('id');
return view('character.admin._upload_image_subtype', [
- 'subtypes' => ['0' => 'Select Subtype'] + Subtype::where('species_id', '=', $species)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'subtype' => $id,
+ 'subtypes' => Subtype::where('species_id', '=', $species)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'image' => CharacterImage::find($id),
]);
}
@@ -73,7 +73,7 @@ public function getNewImageSubtype(Request $request) {
*/
public function postNewImage(Request $request, CharacterManager $service, $slug) {
$request->validate(CharacterImage::$createRules);
- $data = $request->only(['image', 'thumbnail', 'x0', 'x1', 'y0', 'y1', 'use_cropper', 'artist_url', 'artist_id', 'designer_url', 'designer_id', 'species_id', 'subtype_id', 'rarity_id', 'feature_id', 'feature_data', 'is_valid', 'is_visible']);
+ $data = $request->only(['image', 'thumbnail', 'x0', 'x1', 'y0', 'y1', 'use_cropper', 'artist_url', 'artist_id', 'designer_url', 'designer_id', 'species_id', 'subtype_ids', 'rarity_id', 'feature_id', 'feature_data', 'is_valid', 'is_visible']);
$this->character = Character::where('slug', $slug)->first();
if (!$this->character) {
abort(404);
@@ -105,7 +105,7 @@ public function getEditImageFeatures($id) {
'image' => $image,
'rarities' => ['0' => 'Select Rarity'] + Rarity::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'specieses' => ['0' => 'Select Species'] + Species::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'subtypes' => ['0' => 'Select Subtype'] + Subtype::where('species_id', '=', $image->species_id)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'subtypes' => Subtype::where('species_id', '=', $image->species_id)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'features' => Feature::getDropdownItems(1),
]);
}
@@ -119,7 +119,7 @@ public function getEditImageFeatures($id) {
* @return \Illuminate\Http\RedirectResponse
*/
public function postEditImageFeatures(Request $request, CharacterManager $service, $id) {
- $data = $request->only(['species_id', 'subtype_id', 'rarity_id', 'feature_id', 'feature_data']);
+ $data = $request->only(['species_id', 'subtype_ids', 'rarity_id', 'feature_id', 'feature_data']);
$image = CharacterImage::find($id);
if (!$image) {
abort(404);
@@ -146,7 +146,7 @@ public function getEditImageSubtype(Request $request) {
return view('character.admin._edit_features_subtype', [
'image' => CharacterImage::find($id),
- 'subtypes' => ['0' => 'Select Subtype'] + Subtype::where('species_id', '=', $species)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'subtypes' => Subtype::where('species_id', '=', $species)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
]);
}
@@ -158,7 +158,7 @@ public function getEditImageSubtype(Request $request) {
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getEditImageNotes($id) {
- return view('character.admin._edit_notes_modal', [
+ return view('character.admin._edit_notes', [
'image' => CharacterImage::find($id),
]);
}
@@ -275,7 +275,7 @@ public function postImageReupload(Request $request, CharacterManager $service, $
* @return \Illuminate\Http\RedirectResponse
*/
public function postImageSettings(Request $request, CharacterManager $service, $id) {
- $data = $request->only(['is_valid', 'is_visible']);
+ $data = $request->only(['is_valid', 'is_visible', 'content_warnings']);
$image = CharacterImage::find($id);
if (!$image) {
abort(404);
diff --git a/app/Http/Controllers/Admin/Data/CurrencyController.php b/app/Http/Controllers/Admin/Data/CurrencyController.php
index 518366f50c..a5c5ae5547 100644
--- a/app/Http/Controllers/Admin/Data/CurrencyController.php
+++ b/app/Http/Controllers/Admin/Data/CurrencyController.php
@@ -4,6 +4,7 @@
use App\Http\Controllers\Controller;
use App\Models\Currency\Currency;
+use App\Models\Currency\CurrencyCategory;
use App\Services\CurrencyService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@@ -14,16 +15,150 @@ class CurrencyController extends Controller {
| Admin / Currency Controller
|--------------------------------------------------------------------------
|
- | Handles creation/editing of currencies.
+ | Handles creation/editing of currency categories and currencies.
|
*/
+ /**********************************************************************************************
+
+ CURRENCY CATEGORIES
+
+ **********************************************************************************************/
+
/**
- * Shows the currency index.
+ * Shows the currency category index.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getIndex() {
+ return view('admin.currencies.currency_categories', [
+ 'categories' => CurrencyCategory::orderBy('sort', 'DESC')->get(),
+ ]);
+ }
+
+ /**
+ * Shows the create currency category page.
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getCreateCurrencyCategory() {
+ return view('admin.currencies.create_edit_currency_category', [
+ 'category' => new CurrencyCategory,
+ ]);
+ }
+
+ /**
+ * Shows the edit currency category page.
+ *
+ * @param int $id
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getEditCurrencyCategory($id) {
+ $category = CurrencyCategory::find($id);
+ if (!$category) {
+ abort(404);
+ }
+
+ return view('admin.currencies.create_edit_currency_category', [
+ 'category' => $category,
+ ]);
+ }
+
+ /**
+ * Creates or edits a currency category.
+ *
+ * @param App\Services\CurrencyService $service
+ * @param int|null $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postCreateEditCurrencyCategory(Request $request, CurrencyService $service, $id = null) {
+ $id ? $request->validate(CurrencyCategory::$updateRules) : $request->validate(CurrencyCategory::$createRules);
+ $data = $request->only([
+ 'name', 'description', 'image', 'remove_image', 'is_visible',
+ ]);
+ if ($id && $service->updateCurrencyCategory(CurrencyCategory::find($id), $data, Auth::user())) {
+ flash('Category updated successfully.')->success();
+ } elseif (!$id && $category = $service->createCurrencyCategory($data, Auth::user())) {
+ flash('Category created successfully.')->success();
+
+ return redirect()->to('admin/data/currency-categories/edit/'.$category->id);
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
+
+ /**
+ * Gets the currency category deletion modal.
+ *
+ * @param int $id
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getDeleteCurrencyCategory($id) {
+ $category = CurrencyCategory::find($id);
+
+ return view('admin.currencies._delete_currency_category', [
+ 'category' => $category,
+ ]);
+ }
+
+ /**
+ * Deletes a currency category.
+ *
+ * @param App\Services\CurrencyService $service
+ * @param int $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postDeleteCurrencyCategory(Request $request, CurrencyService $service, $id) {
+ if ($id && $service->deleteCurrencyCategory(CurrencyCategory::find($id), Auth::user())) {
+ flash('Category deleted successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->to('admin/data/currency-categories');
+ }
+
+ /**
+ * Sorts currency categories.
+ *
+ * @param App\Services\CurrencyService $service
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postSortCurrencyCategory(Request $request, CurrencyService $service) {
+ if ($service->sortCurrencyCategory($request->get('sort'))) {
+ flash('Category order updated successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
+
+ /**********************************************************************************************
+
+ CURRENCIES
+
+ **********************************************************************************************/
+
+ /**
+ * Shows the currency index.
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getCurrencyIndex() {
return view('admin.currencies.currencies', [
'currencies' => Currency::paginate(30),
]);
@@ -36,7 +171,8 @@ public function getIndex() {
*/
public function getCreateCurrency() {
return view('admin.currencies.create_edit_currency', [
- 'currency' => new Currency,
+ 'currency' => new Currency,
+ 'categories' => CurrencyCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
]);
}
@@ -54,7 +190,9 @@ public function getEditCurrency($id) {
}
return view('admin.currencies.create_edit_currency', [
- 'currency' => $currency,
+ 'currency' => $currency,
+ 'categories' => CurrencyCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'currencies' => Currency::where('id', '!=', $id)->get()->sortBy('name')->pluck('name', 'id'),
]);
}
@@ -70,9 +208,10 @@ public function postCreateEditCurrency(Request $request, CurrencyService $servic
$id ? $request->validate(Currency::$updateRules) : $request->validate(Currency::$createRules);
$data = $request->only([
'is_user_owned', 'is_character_owned',
- 'name', 'abbreviation', 'description',
+ 'name', 'abbreviation', 'description', 'currency_category_id',
'is_displayed', 'allow_user_to_user', 'allow_user_to_character', 'allow_character_to_user',
'icon', 'image', 'remove_icon', 'remove_image',
+ 'conversion_id', 'rate', 'is_visible',
]);
if ($id && $service->updateCurrency(Currency::find($id), $data, Auth::user())) {
flash('Currency updated successfully.')->success();
diff --git a/app/Http/Controllers/Admin/Data/FeatureController.php b/app/Http/Controllers/Admin/Data/FeatureController.php
index 8c720ff6e6..8d05e5797d 100644
--- a/app/Http/Controllers/Admin/Data/FeatureController.php
+++ b/app/Http/Controllers/Admin/Data/FeatureController.php
@@ -164,29 +164,82 @@ public function postSortFeatureCategory(Request $request, FeatureService $servic
*/
public function getFeatureIndex(Request $request) {
$query = Feature::query();
- $data = $request->only(['rarity_id', 'feature_category_id', 'species_id', 'subtype_id', 'name']);
+ $data = $request->only(['rarity_id', 'feature_category_id', 'species_id', 'subtype_id', 'name', 'sort', 'visibility']);
if (isset($data['rarity_id']) && $data['rarity_id'] != 'none') {
$query->where('rarity_id', $data['rarity_id']);
}
if (isset($data['feature_category_id']) && $data['feature_category_id'] != 'none') {
- $query->where('feature_category_id', $data['feature_category_id']);
+ if ($data['feature_category_id'] == 'withoutOption') {
+ $query->whereNull('feature_category_id');
+ } else {
+ $query->where('feature_category_id', $data['feature_category_id']);
+ }
}
if (isset($data['species_id']) && $data['species_id'] != 'none') {
- $query->where('species_id', $data['species_id']);
+ if ($data['species_id'] == 'withoutOption') {
+ $query->whereNull('species_id');
+ } else {
+ $query->where('species_id', $data['species_id']);
+ }
}
if (isset($data['subtype_id']) && $data['subtype_id'] != 'none') {
- $query->where('subtype_id', $data['subtype_id']);
+ if ($data['subtype_id'] == 'withoutOption') {
+ $query->whereNull('subtype_id');
+ } else {
+ $query->where('subtype_id', $data['subtype_id']);
+ }
}
if (isset($data['name'])) {
$query->where('name', 'LIKE', '%'.$data['name'].'%');
}
+ if (isset($data['visibility']) && $data['visibility'] != 'none') {
+ if ($data['visibility'] == 'visibleOnly') {
+ $query->where('is_visible', '=', 1);
+ } else {
+ $query->where('is_visible', '=', 0);
+ }
+ }
+
+ if (isset($data['sort'])) {
+ switch ($data['sort']) {
+ case 'alpha':
+ $query->sortAlphabetical();
+ break;
+ case 'alpha-reverse':
+ $query->sortAlphabetical(true);
+ break;
+ case 'category':
+ $query->sortCategory();
+ break;
+ case 'rarity':
+ $query->sortRarity();
+ break;
+ case 'rarity-reverse':
+ $query->sortRarity(true);
+ break;
+ case 'species':
+ $query->sortSpecies();
+ break;
+ case 'subtypes':
+ $query->sortSubtype();
+ break;
+ case 'newest':
+ $query->sortNewest();
+ break;
+ case 'oldest':
+ $query->sortOldest();
+ break;
+ }
+ } else {
+ $query->sortOldest();
+ }
return view('admin.features.features', [
'features' => $query->paginate(20)->appends($request->query()),
'rarities' => ['none' => 'Any Rarity'] + Rarity::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'specieses' => ['none' => 'Any Species'] + Species::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'subtypes' => ['none' => 'Any Subtype'] + Subtype::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'categories' => ['none' => 'Any Category'] + FeatureCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'specieses' => ['none' => 'Any Species'] + ['withoutOption' => 'Without Species'] + Species::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'subtypes' => ['none' => 'Any Subtype'] + ['withoutOption' => 'Without Subtype'] + Subtype::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'categories' => ['none' => 'Any Category'] + ['withoutOption' => 'Without Category'] + FeatureCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
]);
}
diff --git a/app/Http/Controllers/Admin/Data/ItemController.php b/app/Http/Controllers/Admin/Data/ItemController.php
index fc7105a14e..867e9a862f 100644
--- a/app/Http/Controllers/Admin/Data/ItemController.php
+++ b/app/Http/Controllers/Admin/Data/ItemController.php
@@ -7,6 +7,7 @@
use App\Models\Item\Item;
use App\Models\Item\ItemCategory;
use App\Models\Prompt\Prompt;
+use App\Models\Rarity;
use App\Models\Shop\Shop;
use App\Models\Shop\ShopStock;
use App\Models\User\User;
@@ -165,17 +166,62 @@ public function postSortItemCategory(Request $request, ItemService $service) {
*/
public function getItemIndex(Request $request) {
$query = Item::query();
- $data = $request->only(['item_category_id', 'name']);
- if (isset($data['item_category_id']) && $data['item_category_id'] != 'none') {
- $query->where('item_category_id', $data['item_category_id']);
+ $data = $request->only(['item_category_id', 'name', 'sort', 'artist', 'visibility', 'rarity_id']);
+ if (isset($data['item_category_id'])) {
+ if ($data['item_category_id'] == 'withoutOption') {
+ $query->whereNull('item_category_id');
+ } else {
+ $query->where('item_category_id', $data['item_category_id']);
+ }
}
if (isset($data['name'])) {
$query->where('name', 'LIKE', '%'.$data['name'].'%');
}
+ if (isset($data['artist'])) {
+ $query->where('artist_id', $data['artist']);
+ }
+ if (isset($data['rarity_id'])) {
+ if ($data['rarity_id'] == 'withoutOption') {
+ $query->whereNull('data->rarity_id');
+ } else {
+ $query->where('data->rarity_id', $data['rarity_id']);
+ }
+ }
+ if (isset($data['visibility'])) {
+ if ($data['visibility'] == 'visibleOnly') {
+ $query->where('is_released', '=', 1);
+ } else {
+ $query->where('is_released', '=', 0);
+ }
+ }
+
+ if (isset($data['sort'])) {
+ switch ($data['sort']) {
+ case 'alpha':
+ $query->sortAlphabetical();
+ break;
+ case 'alpha-reverse':
+ $query->sortAlphabetical(true);
+ break;
+ case 'category':
+ $query->sortCategory();
+ break;
+ case 'newest':
+ $query->sortNewest();
+ break;
+ case 'oldest':
+ $query->sortOldest();
+ break;
+ }
+ } else {
+ $query->sortOldest();
+ }
return view('admin.items.items', [
'items' => $query->paginate(20)->appends($request->query()),
- 'categories' => ['none' => 'Any Category'] + ItemCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'categories' => ['withoutOption' => 'Without Category'] + ItemCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'artists' => User::whereIn('id', Item::whereNotNull('artist_id')->pluck('artist_id')->toArray())->pluck('name', 'id')->toArray(),
+ 'rarities' => ['withoutOption' => 'Without Rarity'] + Rarity::orderBy('rarities.sort', 'DESC')->pluck('name', 'id')->toArray(),
]);
}
@@ -187,6 +233,7 @@ public function getItemIndex(Request $request) {
public function getCreateItem() {
return view('admin.items.create_edit_item', [
'item' => new Item,
+ 'rarities' => Rarity::orderBy('sort', 'DESC')->pluck('name', 'id'),
'categories' => ['none' => 'No category'] + ItemCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'prompts' => Prompt::where('is_active', 1)->orderBy('id')->pluck('name', 'id'),
'userCurrencies' => Currency::where('is_user_owned', 1)->orderBy('sort_user', 'DESC')->pluck('name', 'id'),
@@ -209,6 +256,7 @@ public function getEditItem($id) {
return view('admin.items.create_edit_item', [
'item' => $item,
+ 'rarities' => Rarity::orderBy('sort', 'DESC')->pluck('name', 'id'),
'categories' => ['none' => 'No category'] + ItemCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'shops' => Shop::whereIn('id', ShopStock::where('item_id', $item->id)->pluck('shop_id')->unique()->toArray())->orderBy('sort', 'DESC')->get(),
'prompts' => Prompt::where('is_active', 1)->orderBy('id')->pluck('name', 'id'),
@@ -228,9 +276,9 @@ public function getEditItem($id) {
public function postCreateEditItem(Request $request, ItemService $service, $id = null) {
$id ? $request->validate(Item::$updateRules) : $request->validate(Item::$createRules);
$data = $request->only([
- 'name', 'allow_transfer', 'item_category_id', 'description', 'image', 'remove_image', 'rarity',
+ 'name', 'allow_transfer', 'item_category_id', 'description', 'image', 'remove_image', 'rarity_id',
'reference_url', 'artist_id', 'artist_url', 'uses', 'shops', 'prompts', 'release', 'currency_id', 'currency_quantity',
- 'is_released',
+ 'is_released', 'is_deletable',
]);
if ($id && $service->updateItem(Item::find($id), $data, Auth::user())) {
flash('Item updated successfully.')->success();
@@ -347,7 +395,7 @@ public function getEditItemTag(ItemService $service, $id, $tag) {
return view('admin.items.edit_tag', [
'item' => $item,
'tag' => $tag,
- ] + $tag->getEditData());
+ ] + $tag->getEditData($tag));
}
/**
diff --git a/app/Http/Controllers/Admin/Data/LimitController.php b/app/Http/Controllers/Admin/Data/LimitController.php
new file mode 100644
index 0000000000..b3df37711e
--- /dev/null
+++ b/app/Http/Controllers/Admin/Data/LimitController.php
@@ -0,0 +1,141 @@
+ DynamicLimit::get(),
+ ]);
+ }
+
+ /**
+ * Shows the create limit page.
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getCreateLimit() {
+ return view('admin.limits.create_edit_limit', [
+ 'limit' => new DynamicLimit,
+ ]);
+ }
+
+ /**
+ * Shows the edit limit page.
+ *
+ * @param int $id
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getEditLimit($id) {
+ $limit = DynamicLimit::find($id);
+ if (!$limit) {
+ abort(404);
+ }
+
+ return view('admin.limits.create_edit_limit', [
+ 'limit' => $limit,
+ ]);
+ }
+
+ /**
+ * Creates or edits a limit.
+ *
+ * @param App\Services\LimitService $service
+ * @param int|null $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postCreateEditLimit(Request $request, LimitService $service, $id = null) {
+ $data = $request->only([
+ 'name', 'description', 'evaluation',
+ ]);
+ if ($id && $service->updateLimit(DynamicLimit::find($id), $data, Auth::user())) {
+ flash('Limit updated successfully.')->success();
+ } elseif (!$id && $limit = $service->createLimit($data, Auth::user())) {
+ flash('Limit created successfully.')->success();
+
+ return redirect()->to('admin/data/limits/edit/'.$limit->id);
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
+
+ /**
+ * Gets the limit deletion modal.
+ *
+ * @param int $id
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getDeleteLimit($id) {
+ $limit = DynamicLimit::find($id);
+
+ return view('admin.limits._delete_limit', [
+ 'limit' => $limit,
+ ]);
+ }
+
+ /**
+ * Deletes a limit.
+ *
+ * @param App\Services\LimitService $service
+ * @param int $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postDeleteLimit(Request $request, LimitService $service, $id) {
+ if ($id && $service->deleteLimit(DynamicLimit::find($id))) {
+ flash('Limit deleted successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->to('admin/data/limits');
+ }
+
+ /**
+ * Sorts limits.
+ *
+ * @param App\Services\LimitService $service
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postSortLimit(Request $request, LimitService $service) {
+ if ($service->sortLimit($request->get('sort'))) {
+ flash('Limit order updated successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
+}
diff --git a/app/Http/Controllers/Admin/Data/LootTableController.php b/app/Http/Controllers/Admin/Data/LootTableController.php
index 592d99bd07..beef8e7075 100644
--- a/app/Http/Controllers/Admin/Data/LootTableController.php
+++ b/app/Http/Controllers/Admin/Data/LootTableController.php
@@ -7,6 +7,7 @@
use App\Models\Item\Item;
use App\Models\Item\ItemCategory;
use App\Models\Loot\LootTable;
+use App\Models\Rarity;
use App\Services\LootService;
use Illuminate\Http\Request;
@@ -25,9 +26,15 @@ class LootTableController extends Controller {
*
* @return \Illuminate\Contracts\Support\Renderable
*/
- public function getIndex() {
+ public function getIndex(Request $request) {
+ $query = LootTable::query();
+
+ if ($request->get('name')) {
+ $query->where('name', 'LIKE', '%'.$request->get('name').'%');
+ }
+
return view('admin.loot_tables.loot_tables', [
- 'tables' => LootTable::paginate(20),
+ 'tables' => $query->paginate(20)->appends($request->query()),
]);
}
@@ -37,16 +44,13 @@ public function getIndex() {
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getCreateLootTable() {
- $rarities = Item::whereNotNull('data')->get()->pluck('rarity')->unique()->toArray();
- sort($rarities);
-
return view('admin.loot_tables.create_edit_loot_table', [
'table' => new LootTable,
'items' => Item::orderBy('name')->pluck('name', 'id'),
'categories' => ItemCategory::orderBy('sort', 'DESC')->pluck('name', 'id'),
'currencies' => Currency::orderBy('name')->pluck('name', 'id'),
'tables' => LootTable::orderBy('name')->pluck('name', 'id'),
- 'rarities' => array_filter($rarities),
+ 'rarities' => Rarity::orderBy('sort')->pluck('name', 'id')->toArray(),
]);
}
@@ -63,16 +67,13 @@ public function getEditLootTable($id) {
abort(404);
}
- $rarities = Item::whereNotNull('data')->get()->pluck('rarity')->unique()->toArray();
- sort($rarities);
-
return view('admin.loot_tables.create_edit_loot_table', [
'table' => $table,
'items' => Item::orderBy('name')->pluck('name', 'id'),
'categories' => ItemCategory::orderBy('sort', 'DESC')->pluck('name', 'id'),
'currencies' => Currency::orderBy('name')->pluck('name', 'id'),
'tables' => LootTable::orderBy('name')->pluck('name', 'id'),
- 'rarities' => array_filter($rarities),
+ 'rarities' => Rarity::orderBy('sort')->pluck('name', 'id')->toArray(),
]);
}
diff --git a/app/Http/Controllers/Admin/Data/ShopController.php b/app/Http/Controllers/Admin/Data/ShopController.php
index f15a769f07..c726f4a524 100644
--- a/app/Http/Controllers/Admin/Data/ShopController.php
+++ b/app/Http/Controllers/Admin/Data/ShopController.php
@@ -6,6 +6,7 @@
use App\Models\Currency\Currency;
use App\Models\Item\Item;
use App\Models\Shop\Shop;
+use App\Models\Shop\ShopStock;
use App\Services\ShopService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@@ -37,8 +38,15 @@ public function getIndex() {
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getCreateShop() {
+ // get all items where they have a tag 'coupon'
+ $coupons = Item::whereHas('tags', function ($query) {
+ $query->where('tag', 'coupon')->where('is_active', 1);
+ })->orderBy('name')->pluck('name', 'id');
+
return view('admin.shops.create_edit_shop', [
- 'shop' => new Shop,
+ 'shop' => new Shop,
+ 'items' => Item::orderBy('name')->pluck('name', 'id'),
+ 'coupons' => $coupons,
]);
}
@@ -55,10 +63,16 @@ public function getEditShop($id) {
abort(404);
}
+ // get all items where they have a tag 'coupon'
+ $coupons = Item::released()->whereHas('tags', function ($query) {
+ $query->where('tag', 'coupon');
+ })->orderBy('name')->pluck('name', 'id');
+
return view('admin.shops.create_edit_shop', [
'shop' => $shop,
'items' => Item::orderBy('name')->pluck('name', 'id'),
'currencies' => Currency::orderBy('name')->pluck('name', 'id'),
+ 'coupons' => $coupons,
]);
}
@@ -73,7 +87,8 @@ public function getEditShop($id) {
public function postCreateEditShop(Request $request, ShopService $service, $id = null) {
$id ? $request->validate(Shop::$updateRules) : $request->validate(Shop::$createRules);
$data = $request->only([
- 'name', 'description', 'image', 'remove_image', 'is_active',
+ 'name', 'description', 'image', 'remove_image', 'is_active', 'is_staff', 'use_coupons', 'is_fto', 'allowed_coupons', 'is_timed_shop', 'start_at', 'end_at',
+ 'is_hidden', 'shop_days', 'shop_months',
]);
if ($id && $service->updateShop(Shop::find($id), $data, Auth::user())) {
flash('Shop updated successfully.')->success();
@@ -90,6 +105,107 @@ public function postCreateEditShop(Request $request, ShopService $service, $id =
return redirect()->back();
}
+ /**
+ * loads the create stock modal.
+ *
+ * @param mixed $id
+ */
+ public function getCreateShopStock($id) {
+ $shop = Shop::find($id);
+ if (!$shop) {
+ abort(404);
+ }
+
+ return view('admin.shops._stock_modal', [
+ 'shop' => $shop,
+ 'currencies' => Currency::orderBy('name')->pluck('name', 'id'),
+ 'stock' => new ShopStock,
+ ]);
+ }
+
+ /**
+ * loads the edit stock modal.
+ *
+ * @param mixed $id
+ */
+ public function getEditShopStock($id) {
+ $stock = ShopStock::find($id);
+ if (!$stock) {
+ abort(404);
+ }
+ // get base modal from type using asset helper
+ $type = $stock->stock_type;
+ $model = getAssetModelString(strtolower($type));
+
+ // check if categories exist for this model ($model.'Category')
+ $categoryClass = $model.'Category';
+ if (class_exists($categoryClass)) {
+ // map the categories to be name-id
+ $categories = $categoryClass::orderBy('name')->get()->mapWithKeys(function ($category) {
+ return [$category->id.'-category' => $category->name];
+ });
+ $items = [
+ $type => $model::orderBy('name')->pluck('name', 'id')->toArray() + ['random' => 'Random '.$type],
+ $type.'Category' => $categories->toArray(),
+ ];
+ } else {
+ $items = $model::orderBy('name')->pluck('name', 'id')->toArray();
+ }
+
+ return view('admin.shops._stock_modal', [
+ 'shop' => $stock->shop,
+ 'stock' => $stock,
+ 'items' => $items,
+ ]);
+ }
+
+ /**
+ * gets stock of a certain type.
+ */
+ public function getShopStockType(Request $request) {
+ $type = $request->input('type');
+ if (!$type) {
+ return null;
+ }
+ // get base modal from type using asset helper
+ $model = getAssetModelString(strtolower($type));
+
+ // check if categories exist for this model ($model.'Category')
+ $categoryClass = $model.'Category';
+ if (class_exists($categoryClass)) {
+ // map the categories to be name-id
+ $categories = $categoryClass::orderBy('name')->get()->mapWithKeys(function ($category) {
+ return [$category->id.'-category' => $category->name];
+ });
+ $items = [
+ $type => $model::orderBy('name')->pluck('name', 'id')->toArray() + ['random' => 'Random '.$type],
+ $type.'Category' => $categories->toArray(),
+ ];
+ } else {
+ $items = $model::orderBy('name')->pluck('name', 'id')->toArray();
+ }
+
+ return view('admin.shops._stock_item', [
+ 'items' => $items,
+ ]);
+ }
+
+ /**
+ * gets the type of a cost for a stock.
+ */
+ public function getShopStockCostType(Request $request) {
+ $type = $request->input('type');
+ if (!$type) {
+ return null;
+ }
+ // get base modal from type using asset helper
+ $model = getAssetModelString(strtolower($type));
+
+ return view('admin.shops._stock_cost', [
+ 'costItems' => $model::orderBy('name')->pluck('name', 'id'),
+ ]);
+ }
+
/**
* Edits a shop's stock.
*
@@ -100,9 +216,11 @@ public function postCreateEditShop(Request $request, ShopService $service, $id =
*/
public function postEditShopStock(Request $request, ShopService $service, $id) {
$data = $request->only([
- 'shop_id', 'item_id', 'currency_id', 'cost', 'use_user_bank', 'use_character_bank', 'is_limited_stock', 'quantity', 'purchase_limit',
+ 'shop_id', 'item_id', 'use_user_bank', 'use_character_bank', 'is_limited_stock', 'quantity', 'purchase_limit', 'purchase_limit_timeframe', 'is_fto', 'stock_type', 'is_visible',
+ 'restock', 'restock_quantity', 'restock_interval', 'range', 'disallow_transfer', 'is_timed_stock', 'stock_start_at', 'stock_end_at',
+ 'cost_type', 'cost_quantity', 'cost_id', 'group', 'can_group_use_coupon', 'stock_days', 'stock_months',
]);
- if ($service->updateShopStock(Shop::find($id), $data, Auth::user())) {
+ if ($service->editShopStock(ShopStock::find($id), $data, Auth::user())) {
flash('Shop stock updated successfully.')->success();
return redirect()->back();
@@ -115,6 +233,70 @@ public function postEditShopStock(Request $request, ShopService $service, $id) {
return redirect()->back();
}
+ /**
+ * Edits a shop's stock.
+ *
+ * @param App\Services\ShopService $service
+ * @param int $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postCreateShopStock(Request $request, ShopService $service, $id) {
+ $data = $request->only([
+ 'shop_id', 'item_id', 'currency_id', 'cost', 'use_user_bank', 'use_character_bank', 'is_limited_stock', 'quantity', 'purchase_limit', 'purchase_limit_timeframe', 'is_fto', 'stock_type', 'is_visible',
+ 'restock', 'restock_quantity', 'restock_interval', 'range', 'disallow_transfer', 'is_timed_stock', 'stock_start_at', 'stock_end_at',
+ 'cost_type', 'cost_quantity', 'cost_id', 'group', 'stock_days', 'stock_months',
+ ]);
+ if ($service->createShopStock(Shop::find($id), $data, Auth::user())) {
+ flash('Shop stock updated successfully.')->success();
+
+ return redirect()->back();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
+
+ /**
+ * Gets the stock deletion modal.
+ *
+ * @param int $id
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getDeleteShopStock($id) {
+ $stock = ShopStock::find($id);
+
+ return view('admin.shops._delete_stock', [
+ 'stock' => $stock,
+ ]);
+ }
+
+ /**
+ * Deletes a stock.
+ *
+ * @param App\Services\StockService $service
+ * @param int $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postDeleteShopStock(Request $request, ShopService $service, $id) {
+ $stock = ShopStock::find($id);
+ $shop = $stock->shop;
+ if ($id && $service->deleteStock($stock)) {
+ flash('Stock deleted successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->to('admin/data/shops/edit/'.$shop->id);
+ }
+
/**
* Gets the shop deletion modal.
*
diff --git a/app/Http/Controllers/Admin/LimitController.php b/app/Http/Controllers/Admin/LimitController.php
new file mode 100644
index 0000000000..d698b72af6
--- /dev/null
+++ b/app/Http/Controllers/Admin/LimitController.php
@@ -0,0 +1,54 @@
+only([
+ 'object_model', 'object_id', 'limit_type', 'limit_id', 'quantity', 'debit', 'is_unlocked', 'is_auto_unlocked',
+ ]);
+ if ($service->editLimits($data['object_model'], $data['object_id'], $data, Auth::user())) {
+ flash('Limits updated successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
+
+ /**
+ * Unlocks limits for an object for a user.
+ *
+ * @param App\Services\LimitService $service
+ * @param int $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postUnlockLimits(LimitService $service, $id) {
+ $limit = Limit::find($id);
+ if ($service->unlockLimits($limit->object, Auth::user())) {
+ flash(($limit->object->displayName ?? $limit->object->name).' unlocked successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
+}
diff --git a/app/Http/Controllers/Admin/LogController.php b/app/Http/Controllers/Admin/LogController.php
new file mode 100644
index 0000000000..f0715ce9c8
--- /dev/null
+++ b/app/Http/Controllers/Admin/LogController.php
@@ -0,0 +1,132 @@
+ array_reverse($logList),
+ ]);
+ }
+
+ /**
+ * Shows a specific log.
+ *
+ * @param string $name
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getLog($name) {
+ $logsDirectory = storage_path().'/logs';
+ if (is_file($logsDirectory.'/'.$name)) {
+ $log = file($logsDirectory.'/'.$name, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
+
+ if (str_starts_with($name, 'laravel')) {
+ $logLines = $this->parseLaravelLog($log);
+ } else {
+ $logLines = $this->parseLog($log);
+ }
+
+ return view('admin.logs.log', [
+ 'name' => $name,
+ 'log' => array_reverse($logLines),
+ ]);
+ }
+ abort(404);
+ }
+
+ /**
+ * Deletes a log in the log directory.
+ *
+ * @param App\Services\FileManager $service
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postDeleteLog(Request $request, FileManager $service) {
+ $request->validate(['filename' => 'required']);
+ $name = $request->get('filename');
+
+ if ($service->deleteFile(storage_path().'/logs/'.$name)) {
+ flash('Log deleted successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
+
+ /**
+ * Parse laravel logs to build collapsible stacktraces in the view.
+ * This probably won't work with custom formatted logs.
+ *
+ * @param mixed $log
+ */
+ private function parseLaravelLog($log) {
+ $index = 0;
+ $logLines = [];
+ $stacktrace = [];
+ foreach ($log as $line) {
+ $line = trim($line);
+ if (str_contains($line, '{main}')) {
+ if (count($stacktrace) > 0) {
+ $logLines[$index]['stacktrace'] = $stacktrace;
+ $stacktrace = [];
+ $index += 1;
+ }
+ } elseif (str_ends_with($line, '"}') && strlen($line) > 2) {
+ $logLines[$index]['line'] = $line;
+ $index += 1;
+ } elseif (str_starts_with($line, '#')) {
+ $stacktrace[] = $line;
+ } else {
+ // some log lines are sorta useless we cut them out.
+ if (!str_contains($line, '[stacktrace]') && !str_contains($line, 'Stack trace') && strlen($line) > 2) {
+ $logLines[$index]['line'] = $line;
+ }
+ }
+ }
+
+ return $logLines;
+ }
+
+ /**
+ * Simply parse all lines without creating stacktraces for collapse views.
+ * Should work for any logs.
+ *
+ * @param mixed $log
+ */
+ private function parseLog($log) {
+ $index = 0;
+ $logLines = [];
+ foreach ($log as $line) {
+ $logLines[$index]['line'] = $line;
+ $index += 1;
+ }
+
+ return $logLines;
+ }
+}
diff --git a/app/Http/Controllers/Admin/NewsController.php b/app/Http/Controllers/Admin/NewsController.php
index dc22454cdb..51c0477ee0 100644
--- a/app/Http/Controllers/Admin/NewsController.php
+++ b/app/Http/Controllers/Admin/NewsController.php
@@ -111,4 +111,39 @@ public function postDeleteNews(Request $request, NewsService $service, $id) {
return redirect()->to('admin/news');
}
+
+ /**
+ * Gets the news regeneration modal.
+ *
+ * @param int $id
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getRegenNews($id) {
+ $news = News::find($id);
+
+ return view('admin.news._regen_news', [
+ 'news' => $news,
+ ]);
+ }
+
+ /**
+ * Regenerates a news page.
+ *
+ * @param App\Services\NewsService $service
+ * @param int $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postRegenNews(Request $request, NewsService $service, $id) {
+ if ($id && $service->regenNews(News::find($id))) {
+ flash('News regenerated successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->to('admin/news/edit/'.$id);
+ }
}
diff --git a/app/Http/Controllers/Admin/PageController.php b/app/Http/Controllers/Admin/PageController.php
index 34ce22bfa1..8c8e9a31b3 100644
--- a/app/Http/Controllers/Admin/PageController.php
+++ b/app/Http/Controllers/Admin/PageController.php
@@ -111,4 +111,39 @@ public function postDeletePage(Request $request, PageService $service, $id) {
return redirect()->to('admin/pages');
}
+
+ /**
+ * Gets the page regeneration modal.
+ *
+ * @param int $id
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getRegenPage($id) {
+ $page = SitePage::find($id);
+
+ return view('admin.pages._regen_page', [
+ 'page' => $page,
+ ]);
+ }
+
+ /**
+ * Regenerates a page.
+ *
+ * @param App\Services\PageService $service
+ * @param int $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postRegenPage(Request $request, PageService $service, $id) {
+ if ($id && $service->regenPage(SitePage::find($id))) {
+ flash('Page regenerated successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->to('admin/pages/edit/'.$id);
+ }
}
diff --git a/app/Http/Controllers/Admin/SubmissionController.php b/app/Http/Controllers/Admin/SubmissionController.php
index ed2fe8c0f0..85d02b7749 100644
--- a/app/Http/Controllers/Admin/SubmissionController.php
+++ b/app/Http/Controllers/Admin/SubmissionController.php
@@ -71,7 +71,7 @@ public function getSubmission($id) {
'itemsrow' => Item::all()->keyBy('id'),
'page' => 'submission',
'expanded_rewards' => config('lorekeeper.extensions.character_reward_expansion.expanded'),
- 'characters' => Character::visible(Auth::check() ? Auth::user() : null)->myo(0)->orderBy('slug', 'DESC')->get()->pluck('fullName', 'slug')->toArray(),
+ 'characters' => Character::visible(Auth::user() ?? null)->myo(0)->orderBy('slug', 'DESC')->get()->pluck('fullName', 'slug')->toArray(),
] + ($submission->status == 'Pending' ? [
'characterCurrencies' => Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'),
'items' => Item::orderBy('name')->pluck('name', 'id'),
@@ -130,7 +130,7 @@ public function getClaim($id) {
'inventory' => $inventory,
'itemsrow' => Item::all()->keyBy('id'),
'expanded_rewards' => config('lorekeeper.extensions.character_reward_expansion.expanded'),
- 'characters' => Character::visible(Auth::check() ? Auth::user() : null)->myo(0)->orderBy('slug', 'DESC')->get()->pluck('fullName', 'slug')->toArray(),
+ 'characters' => Character::visible(Auth::user() ?? null)->myo(0)->orderBy('slug', 'DESC')->get()->pluck('fullName', 'slug')->toArray(),
] + ($submission->status == 'Pending' ? [
'characterCurrencies' => Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'),
'items' => Item::orderBy('name')->pluck('name', 'id'),
diff --git a/app/Http/Controllers/Admin/Users/UserController.php b/app/Http/Controllers/Admin/Users/UserController.php
index 6ee7507116..9b9842219b 100644
--- a/app/Http/Controllers/Admin/Users/UserController.php
+++ b/app/Http/Controllers/Admin/Users/UserController.php
@@ -105,7 +105,7 @@ public function postUserBasicInfo(Request $request, $name) {
$logData = ['old_name' => $user->name] + $data;
if ($user->update($data)) {
- UserUpdateLog::create(['staff_id' => Auth::user()->id, 'user_id' => $user->id, 'data' => json_encode($logData), 'type' => 'Name/Rank Change']);
+ UserUpdateLog::create(['staff_id' => Auth::user()->id, 'user_id' => $user->id, 'data' => $logData, 'type' => 'Name/Rank Change']);
flash('Updated user\'s information successfully.')->success();
} else {
flash('Failed to update user\'s information.')->error();
@@ -154,7 +154,7 @@ public function postUserAlias(Request $request, $name, $id) {
return redirect()->back();
}
- UserUpdateLog::create(['staff_id' => Auth::user()->id, 'user_id' => $user->id, 'data' => json_encode($logData), 'type' => 'Clear Alias']);
+ UserUpdateLog::create(['staff_id' => Auth::user()->id, 'user_id' => $user->id, 'data' => $logData, 'type' => 'Clear Alias']);
flash('Cleared user\'s alias successfully.')->success();
} else {
flash('Failed to clear user\'s alias.')->error();
@@ -177,7 +177,7 @@ public function postUserAccount(Request $request, $name) {
return redirect()->back();
}
- UserUpdateLog::create(['staff_id' => Auth::user()->id, 'user_id' => $user->id, 'data' => json_encode(['is_fto' => $request->get('is_fto') ? 'Yes' : 'No']), 'type' => 'FTO Status Change']);
+ UserUpdateLog::create(['staff_id' => Auth::user()->id, 'user_id' => $user->id, 'data' => ['is_fto' => $request->get('is_fto') ? 'Yes' : 'No'], 'type' => 'FTO Status Change']);
flash('Updated user\'s account information successfully.')->success();
} else {
flash('Failed to update user\'s account information.')->error();
@@ -205,7 +205,7 @@ public function postUserBirthday(Request $request, $name) {
}
if ($service->updateBirthday($formatDate, $user)) {
- UserUpdateLog::create(['staff_id' => Auth::user()->id, 'user_id' => $user->id, 'data' => json_encode($logData), 'type' => 'Birth Date Change']);
+ UserUpdateLog::create(['staff_id' => Auth::user()->id, 'user_id' => $user->id, 'data' => $logData, 'type' => 'Birth Date Change']);
flash('Birthday updated successfully!')->success();
} else {
foreach ($service->errors()->getMessages()['error'] as $error) {
diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php
index 13946d23a0..106ab6de47 100644
--- a/app/Http/Controllers/Auth/RegisterController.php
+++ b/app/Http/Controllers/Auth/RegisterController.php
@@ -96,7 +96,7 @@ public function postRegisterWithDriver(LinkService $service, Request $request, $
/**
* Create a new user instance after a valid registration.
*
- * @return \App\Models\User\User
+ * @return User
*/
protected function create(array $data) {
DB::beginTransaction();
diff --git a/app/Http/Controllers/BrowseController.php b/app/Http/Controllers/BrowseController.php
index 3cedebc497..da2c5ffd16 100644
--- a/app/Http/Controllers/BrowseController.php
+++ b/app/Http/Controllers/BrowseController.php
@@ -148,7 +148,7 @@ public function getBlacklist(Request $request) {
*/
public function getCharacters(Request $request) {
$query = Character::with('user.rank', 'image.features', 'rarity', 'image.species', 'image.rarity')->myo(0);
- $imageQuery = CharacterImage::images(Auth::check() ? Auth::user() : null)->with('features', 'rarity', 'species', 'features');
+ $imageQuery = CharacterImage::images(Auth::user() ?? null)->with('features', 'rarity', 'species');
if ($sublists = Sublist::where('show_main', 0)->get()) {
$subCategories = [];
@@ -162,163 +162,27 @@ public function getCharacters(Request $request) {
$query->whereNotIn('character_category_id', $subCategories);
$imageQuery->whereNotIn('species_id', $subSpecies);
- if ($request->get('name')) {
- $query->where(function ($query) use ($request) {
- $query->where('characters.name', 'LIKE', '%'.$request->get('name').'%')->orWhere('characters.slug', 'LIKE', '%'.$request->get('name').'%');
- });
- }
- if ($request->get('rarity_id')) {
- $query->where('rarity_id', $request->get('rarity_id'));
- }
- if ($request->get('character_category_id')) {
- $query->where('character_category_id', $request->get('character_category_id'));
- }
-
- if ($request->get('sale_value_min')) {
- $query->where('sale_value', '>=', $request->get('sale_value_min'));
- }
- if ($request->get('sale_value_max')) {
- $query->where('sale_value', '<=', $request->get('sale_value_max'));
- }
-
- if ($request->get('is_trading')) {
- $query->where('is_trading', 1);
- }
- if ($request->get('is_sellable')) {
- $query->where('is_sellable', 1);
- }
- if ($request->get('is_tradeable')) {
- $query->where('is_tradeable', 1);
- }
- if ($request->get('is_giftable')) {
- $query->where('is_giftable', 1);
- }
-
- if ($request->get('owner')) {
- $owner = User::find($request->get('owner'));
- $query->where(function ($query) use ($owner) {
- $query->where('user_id', $owner->id);
- });
- }
- if ($request->get('owner_url')) {
- $ownerUrl = $request->get('owner_url');
- $query->where(function ($query) use ($ownerUrl) {
- $query->where('owner_url', 'LIKE', '%'.$ownerUrl.'%');
- });
- }
+ $query = $this->handleMasterlistSearch($request, $query, $imageQuery);
- // Search only main images
- if (!$request->get('search_images')) {
- $imageQuery->whereIn('id', $query->pluck('character_image_id')->toArray());
- }
+ $contentWarnings = CharacterImage::whereNotNull('content_warnings')->pluck('content_warnings')->flatten()->map(function ($warnings) {
+ return collect($warnings)->mapWithKeys(function ($warning) {
+ $lower = strtolower(trim($warning));
- // Searching on image properties
- if ($request->get('species_id')) {
- $imageQuery->where('species_id', $request->get('species_id'));
- }
- if ($request->get('subtype_id')) {
- $imageQuery->where('subtype_id', $request->get('subtype_id'));
- }
- if ($request->get('feature_id')) {
- $featureIds = $request->get('feature_id');
- foreach ($featureIds as $featureId) {
- $imageQuery->whereHas('features', function ($query) use ($featureId) {
- $query->where('feature_id', $featureId);
- });
- }
- }
- if ($request->get('artist')) {
- $artist = User::find($request->get('artist'));
- $imageQuery->whereHas('artists', function ($query) use ($artist) {
- $query->where('user_id', $artist->id);
- });
- }
- if ($request->get('designer')) {
- $designer = User::find($request->get('designer'));
- $imageQuery->whereHas('designers', function ($query) use ($designer) {
- $query->where('user_id', $designer->id);
+ return [$lower => ucwords($lower)];
});
- }
- if ($request->get('artist_url')) {
- $artistUrl = $request->get('artist_url');
- $imageQuery->whereHas('artists', function ($query) use ($artistUrl) {
- $query->where('url', 'LIKE', '%'.$artistUrl.'%');
- });
- }
- if ($request->get('designer_url')) {
- $designerUrl = $request->get('designer_url');
- $imageQuery->whereHas('designers', function ($query) use ($designerUrl) {
- $query->where('url', 'LIKE', '%'.$designerUrl.'%');
- });
- }
-
- $query->whereIn('id', $imageQuery->pluck('character_id')->toArray());
-
- if ($request->get('is_gift_art_allowed')) {
- switch ($request->get('is_gift_art_allowed')) {
- case 1:
- $query->where('is_gift_art_allowed', 1);
- break;
- case 2:
- $query->where('is_gift_art_allowed', 2);
- break;
- case 3:
- $query->where('is_gift_art_allowed', '>=', 1);
- break;
- }
- }
- if ($request->get('is_gift_writing_allowed')) {
- switch ($request->get('is_gift_writing_allowed')) {
- case 1:
- $query->where('is_gift_writing_allowed', 1);
- break;
- case 2:
- $query->where('is_gift_writing_allowed', 2);
- break;
- case 3:
- $query->where('is_gift_writing_allowed', '>=', 1);
- break;
- }
- }
-
- switch ($request->get('sort')) {
- default:
- $query->orderBy('characters.number', 'DESC');
- break;
- case 'number_desc':
- $query->orderBy('characters.number', 'DESC');
- break;
- case 'number_asc':
- $query->orderBy('characters.number', 'ASC');
- break;
- case 'id_desc':
- $query->orderBy('characters.id', 'DESC');
- break;
- case 'id_asc':
- $query->orderBy('characters.id', 'ASC');
- break;
- case 'sale_value_desc':
- $query->orderBy('characters.sale_value', 'DESC');
- break;
- case 'sale_value_asc':
- $query->orderBy('characters.sale_value', 'ASC');
- break;
- }
-
- if (!Auth::check() || !Auth::user()->hasPower('manage_characters')) {
- $query->visible();
- }
+ })->collapse()->unique()->sort()->toArray();
return view('browse.masterlist', [
- 'isMyo' => false,
- 'characters' => $query->paginate(24)->appends($request->query()),
- 'categories' => [0 => 'Any Category'] + CharacterCategory::whereNotIn('id', $subCategories)->visible(Auth::check() ? Auth::user() : null)->orderBy('character_categories.sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'specieses' => [0 => 'Any Species'] + Species::whereNotIn('id', $subSpecies)->visible(Auth::check() ? Auth::user() : null)->orderBy('specieses.sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'subtypes' => [0 => 'Any Subtype'] + Subtype::visible(Auth::check() ? Auth::user() : null)->orderBy('subtypes.sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'rarities' => [0 => 'Any Rarity'] + Rarity::orderBy('rarities.sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'features' => Feature::getDropdownItems(),
- 'sublists' => Sublist::orderBy('sort', 'DESC')->get(),
- 'userOptions' => User::query()->orderBy('name')->pluck('name', 'id')->toArray(),
+ 'isMyo' => false,
+ 'characters' => $query->paginate(24)->appends($request->query()),
+ 'categories' => [0 => 'Any Category'] + CharacterCategory::whereNotIn('id', $subCategories)->visible(Auth::user() ?? null)->orderBy('character_categories.sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'specieses' => [0 => 'Any Species'] + Species::whereNotIn('id', $subSpecies)->visible(Auth::user() ?? null)->orderBy('specieses.sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'subtypes' => ['none' => 'No Subtypes', 'any' => 'Any Subtype', 'hybrid' => 'Multiple / Hybrid Subtypes'] + Subtype::visible(Auth::user() ?? null)->orderBy('subtypes.sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'rarities' => [0 => 'Any Rarity'] + Rarity::orderBy('rarities.sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'features' => Feature::getDropdownItems(),
+ 'sublists' => Sublist::orderBy('sort', 'DESC')->get(),
+ 'userOptions' => User::query()->orderBy('name')->pluck('name', 'id')->toArray(),
+ 'contentWarnings' => $contentWarnings,
]);
}
@@ -329,121 +193,14 @@ public function getCharacters(Request $request) {
*/
public function getMyos(Request $request) {
$query = Character::with('user.rank', 'image.features', 'rarity', 'image.species', 'image.rarity')->myo(1);
+ $imageQuery = CharacterImage::images(Auth::user() ?? null)->with('features', 'rarity', 'species');
- $imageQuery = CharacterImage::images(Auth::check() ? Auth::user() : null)->with('features', 'rarity', 'species', 'features');
-
- if ($request->get('name')) {
- $query->where(function ($query) use ($request) {
- $query->where('characters.name', 'LIKE', '%'.$request->get('name').'%')->orWhere('characters.slug', 'LIKE', '%'.$request->get('name').'%');
- });
- }
- if ($request->get('rarity_id')) {
- $query->where('rarity_id', $request->get('rarity_id'));
- }
-
- if ($request->get('sale_value_min')) {
- $query->where('sale_value', '>=', $request->get('sale_value_min'));
- }
- if ($request->get('sale_value_max')) {
- $query->where('sale_value', '<=', $request->get('sale_value_max'));
- }
-
- if ($request->get('is_trading')) {
- $query->where('is_trading', 1);
- }
- if ($request->get('is_sellable')) {
- $query->where('is_sellable', 1);
- }
- if ($request->get('is_tradeable')) {
- $query->where('is_tradeable', 1);
- }
- if ($request->get('is_giftable')) {
- $query->where('is_giftable', 1);
- }
-
- if ($request->get('owner')) {
- $owner = User::find($request->get('owner'));
- $query->where(function ($query) use ($owner) {
- $query->where('user_id', $owner->id);
- });
- }
- if ($request->get('owner_url')) {
- $ownerUrl = $request->get('owner_url');
- $query->where(function ($query) use ($ownerUrl) {
- $query->where('owner_url', 'LIKE', '%'.$ownerUrl.'%');
- });
- }
-
- // Search only main images
- if (!$request->get('search_images')) {
- $imageQuery->whereIn('id', $query->pluck('character_image_id')->toArray());
- }
-
- // Searching on image properties
- if ($request->get('species_id')) {
- $imageQuery->where('species_id', $request->get('species_id'));
- }
- if ($request->get('artist')) {
- $artist = User::find($request->get('artist'));
- $imageQuery->whereHas('artists', function ($query) use ($artist) {
- $query->where('user_id', $artist->id);
- });
- }
- if ($request->get('designer')) {
- $designer = User::find($request->get('designer'));
- $imageQuery->whereHas('designers', function ($query) use ($designer) {
- $query->where('user_id', $designer->id);
- });
- }
- if ($request->get('artist_url')) {
- $artistUrl = $request->get('artist_url');
- $imageQuery->whereHas('artists', function ($query) use ($artistUrl) {
- $query->where('url', 'LIKE', '%'.$artistUrl.'%');
- });
- }
- if ($request->get('designer_url')) {
- $designerUrl = $request->get('designer_url');
- $imageQuery->whereHas('designers', function ($query) use ($designerUrl) {
- $query->where('url', 'LIKE', '%'.$designerUrl.'%');
- });
- }
- if ($request->get('feature_id')) {
- $featureIds = $request->get('feature_id');
- foreach ($featureIds as $featureId) {
- $imageQuery->whereHas('features', function ($query) use ($featureId) {
- $query->where('feature_id', $featureId);
- });
- }
- }
-
- $query->whereIn('id', $imageQuery->pluck('character_id')->toArray());
-
- switch ($request->get('sort')) {
- default:
- $query->orderBy('characters.id', 'DESC');
- break;
- case 'id_desc':
- $query->orderBy('characters.id', 'DESC');
- break;
- case 'id_asc':
- $query->orderBy('characters.id', 'ASC');
- break;
- case 'sale_value_desc':
- $query->orderBy('characters.sale_value', 'DESC');
- break;
- case 'sale_value_asc':
- $query->orderBy('characters.sale_value', 'ASC');
- break;
- }
-
- if (!Auth::check() || !Auth::user()->hasPower('manage_characters')) {
- $query->visible();
- }
+ $query = $this->handleMasterlistSearch($request, $query, $imageQuery, true);
return view('browse.myo_masterlist', [
'isMyo' => true,
'slots' => $query->paginate(30)->appends($request->query()),
- 'specieses' => [0 => 'Any Species'] + Species::visible(Auth::check() ? Auth::user() : null)->orderBy('specieses.sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'specieses' => [0 => 'Any Species'] + Species::visible(Auth::user() ?? null)->orderBy('specieses.sort', 'DESC')->pluck('name', 'id')->toArray(),
'rarities' => [0 => 'Any Rarity'] + Rarity::orderBy('rarities.sort', 'DESC')->pluck('name', 'id')->toArray(),
'features' => Feature::getDropdownItems(),
'sublists' => Sublist::orderBy('sort', 'DESC')->get(),
@@ -460,7 +217,7 @@ public function getMyos(Request $request) {
*/
public function getSublist(Request $request, $key) {
$query = Character::with('user.rank', 'image.features', 'rarity', 'image.species', 'image.rarity')->myo(0);
- $imageQuery = CharacterImage::with('features', 'rarity', 'species', 'features');
+ $imageQuery = CharacterImage::with('features', 'rarity', 'species');
$sublist = Sublist::where('key', $key)->first();
if (!$sublist) {
@@ -476,6 +233,50 @@ public function getSublist(Request $request, $key) {
$imageQuery->whereIn('species_id', $subSpecies);
}
+ $query = $this->handleMasterlistSearch($request, $query, $imageQuery);
+
+ $subCategory = CharacterCategory::where('masterlist_sub_id', $sublist->id)->orderBy('character_categories.sort', 'DESC')->pluck('name', 'id')->toArray();
+ if (!$subCategory) {
+ $subCategory = CharacterCategory::visible(Auth::user() ?? null)->orderBy('character_categories.sort', 'DESC')->pluck('name', 'id')->toArray();
+ }
+ $subSpecies = Species::where('masterlist_sub_id', $sublist->id)->orderBy('specieses.sort', 'DESC')->pluck('name', 'id')->toArray();
+ if (!$subSpecies) {
+ $subSpecies = Species::visible(Auth::user() ?? null)->orderBy('specieses.sort', 'DESC')->pluck('name', 'id')->toArray();
+ }
+
+ $contentWarnings = CharacterImage::whereNotNull('content_warnings')->pluck('content_warnings')->flatten()->map(function ($warnings) {
+ return collect($warnings)->mapWithKeys(function ($warning) {
+ $lower = strtolower(trim($warning));
+
+ return [$lower => ucwords($lower)];
+ });
+ })->collapse()->unique()->sort()->toArray();
+
+ return view('browse.sub_masterlist', [
+ 'isMyo' => false,
+ 'characters' => $query->paginate(24)->appends($request->query()),
+ 'categories' => [0 => 'Any Category'] + $subCategory,
+ 'specieses' => [0 => 'Any Species'] + $subSpecies,
+ 'subtypes' => ['none' => 'No Subtypes', 'any' => 'Any Subtype', 'hybrid' => 'Multiple / Hybrid Subtypes'] + Subtype::visible(Auth::user() ?? null)->orderBy('subtypes.sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'rarities' => [0 => 'Any Rarity'] + Rarity::orderBy('rarities.sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'features' => Feature::getDropdownItems(),
+ 'sublist' => $sublist,
+ 'sublists' => Sublist::orderBy('sort', 'DESC')->get(),
+ 'userOptions' => User::query()->orderBy('name')->pluck('name', 'id')->toArray(),
+ 'contentWarnings' => $contentWarnings,
+ ]);
+ }
+
+ /**
+ * Handles character search/filtering.
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ * @param \Illuminate\Database\Eloquent\Builder $imageQuery
+ * @param bool $isMyo
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ private function handleMasterlistSearch(Request $request, $query, $imageQuery, $isMyo = false) {
if ($request->get('name')) {
$query->where(function ($query) use ($request) {
$query->where('characters.name', 'LIKE', '%'.$request->get('name').'%')->orWhere('characters.slug', 'LIKE', '%'.$request->get('name').'%');
@@ -484,7 +285,7 @@ public function getSublist(Request $request, $key) {
if ($request->get('rarity_id')) {
$query->where('rarity_id', $request->get('rarity_id'));
}
- if ($request->get('character_category_id')) {
+ if (!$isMyo && $request->get('character_category_id')) {
$query->where('character_category_id', $request->get('character_category_id'));
}
@@ -498,32 +299,6 @@ public function getSublist(Request $request, $key) {
if ($request->get('is_trading')) {
$query->where('is_trading', 1);
}
- if ($request->get('is_gift_art_allowed')) {
- switch ($request->get('is_gift_art_allowed')) {
- case 1:
- $query->where('is_gift_art_allowed', 1);
- break;
- case 2:
- $query->where('is_gift_art_allowed', 2);
- break;
- case 3:
- $query->where('is_gift_art_allowed', '>=', 1);
- break;
- }
- }
- if ($request->get('is_gift_writing_allowed')) {
- switch ($request->get('is_gift_writing_allowed')) {
- case 1:
- $query->where('is_gift_writing_allowed', 1);
- break;
- case 2:
- $query->where('is_gift_writing_allowed', 2);
- break;
- case 3:
- $query->where('is_gift_writing_allowed', '>=', 1);
- break;
- }
- }
if ($request->get('is_sellable')) {
$query->where('is_sellable', 1);
}
@@ -556,11 +331,40 @@ public function getSublist(Request $request, $key) {
if ($request->get('species_id')) {
$imageQuery->where('species_id', $request->get('species_id'));
}
- if ($request->get('subtype_id')) {
- $imageQuery->where('subtype_id', $request->get('subtype_id'));
+ if (!$isMyo && $request->get('subtype_ids')) {
+ if (in_array('none', $request->get('subtype_ids'))) {
+ $imageQuery->doesntHave('subtypes');
+ } elseif (in_array('hybrid', $request->get('subtype_ids')) && !in_array('any', $request->get('subtype_ids')) && count($request->get('subtype_ids')) > 1) {
+ // If hybrid + any number of subtype IDs, return characters with the subtype(s) and any additional subtypes
+ // This is functionally somewhat redundant, but allows some specialized searches (e.g. hybrids including a specific subtype)
+ $imageQuery->has('subtypes', '>', 1)->whereHas('subtypes', function ($query) use ($request) {
+ $query->whereIn('character_image_subtypes.subtype_id', $request->get('subtype_ids'));
+ });
+ } elseif (in_array('any', $request->get('subtype_ids')) || in_array('hybrid', $request->get('subtype_ids'))) {
+ // If subtype ids contains "any" search for all subtypes
+ $imageQuery->has('subtypes', '>', in_array('hybrid', $request->get('subtype_ids')) ? 1 : 0);
+ } else {
+ if (config('lorekeeper.extensions.exclusionary_search')) {
+ $imageQuery->whereHas('subtypes', function ($query) use ($request) {
+ $subtypeIds = $request->get('subtype_ids');
+
+ // Filter to ensure the character has all the specified subtypes
+ $query->whereIn('character_image_subtypes.subtype_id', $subtypeIds)
+ ->groupBy('character_image_subtypes.character_image_id')
+ ->havingRaw('COUNT(character_image_subtypes.subtype_id) = ?', [count($subtypeIds)]);
+ })->whereDoesntHave('subtypes', function ($query) use ($request) {
+ // Ensure that no additional subtypes are present
+ $query->whereNotIn('character_image_subtypes.subtype_id', $request->get('subtype_ids'));
+ });
+ } else {
+ $imageQuery->whereHas('subtypes', function ($query) use ($request) {
+ $query->whereIn('character_image_subtypes.subtype_id', $request->get('subtype_ids'));
+ });
+ }
+ }
}
- if ($request->get('feature_id')) {
- $featureIds = $request->get('feature_id');
+ if ($request->get('feature_ids')) {
+ $featureIds = $request->get('feature_ids');
foreach ($featureIds as $featureId) {
$imageQuery->whereHas('features', function ($query) use ($featureId) {
$query->where('feature_id', $featureId);
@@ -591,57 +395,137 @@ public function getSublist(Request $request, $key) {
$query->where('url', 'LIKE', '%'.$designerUrl.'%');
});
}
-
- $query->whereIn('id', $imageQuery->pluck('character_id')->toArray());
-
- switch ($request->get('sort')) {
- default:
- $query->orderBy('characters.number', 'DESC');
- break;
- case 'number_desc':
- $query->orderBy('characters.number', 'DESC');
- break;
- case 'number_asc':
- $query->orderBy('characters.number', 'ASC');
- break;
- case 'id_desc':
- $query->orderBy('characters.id', 'DESC');
- break;
- case 'id_asc':
- $query->orderBy('characters.id', 'ASC');
- break;
- case 'sale_value_desc':
- $query->orderBy('characters.sale_value', 'DESC');
- break;
- case 'sale_value_asc':
- $query->orderBy('characters.sale_value', 'ASC');
- break;
+ if ($request->get('excluded_tags') || $request->get('included_tags')) {
+ $filteredImageIds = collect();
+ $excludedTags = $request->get('excluded_tags', []);
+ $includedTags = $request->get('included_tags', []);
+
+ $imageQuery->chunk(100, function ($images) use (&$filteredImageIds, $excludedTags, $includedTags) {
+ // excluded tags
+ if (!empty($excludedTags)) {
+ $images = $images->reject(function ($image) use ($excludedTags) {
+ if (!$image->content_warnings) {
+ return false;
+ }
+ if (in_array('all', $excludedTags)) {
+ return true;
+ }
+ foreach ($excludedTags as $tag) {
+ foreach ($image->content_warnings as $warning) {
+ if (strtolower($warning) == strtolower($tag)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ });
+ }
+
+ // included tags
+ if (!empty($includedTags)) {
+ $images = $images->filter(function ($image) use ($includedTags) {
+ if (!$image->content_warnings) {
+ return false;
+ }
+ if (in_array('all', $includedTags)) {
+ return true;
+ }
+ foreach ($includedTags as $tag) {
+ foreach ($image->content_warnings as $warning) {
+ if (strtolower($warning) == strtolower($tag)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ });
+ }
+
+ $filteredImageIds = $filteredImageIds->merge($images->pluck('character_id'));
+ });
+ } else {
+ $filteredImageIds = $imageQuery->pluck('character_id');
+ }
+
+ $query->whereIn('id', $filteredImageIds->toArray());
+
+ if (!$isMyo) {
+ if ($request->get('is_gift_art_allowed')) {
+ switch ($request->get('is_gift_art_allowed')) {
+ case 1:
+ $query->where('is_gift_art_allowed', 1);
+ break;
+ case 2:
+ $query->where('is_gift_art_allowed', 2);
+ break;
+ case 3:
+ $query->where('is_gift_art_allowed', '>=', 1);
+ break;
+ }
+ }
+ if ($request->get('is_gift_writing_allowed')) {
+ switch ($request->get('is_gift_writing_allowed')) {
+ case 1:
+ $query->where('is_gift_writing_allowed', 1);
+ break;
+ case 2:
+ $query->where('is_gift_writing_allowed', 2);
+ break;
+ case 3:
+ $query->where('is_gift_writing_allowed', '>=', 1);
+ break;
+ }
+ }
}
- if (!Auth::check() || !Auth::user()->hasPower('manage_characters')) {
- $query->visible();
+ if ($isMyo) {
+ switch ($request->get('sort')) {
+ default:
+ $query->orderBy('characters.id', 'DESC');
+ break;
+ case 'id_desc':
+ $query->orderBy('characters.id', 'DESC');
+ break;
+ case 'id_asc':
+ $query->orderBy('characters.id', 'ASC');
+ break;
+ case 'sale_value_desc':
+ $query->orderBy('characters.sale_value', 'DESC');
+ break;
+ case 'sale_value_asc':
+ $query->orderBy('characters.sale_value', 'ASC');
+ break;
+ }
+ } else {
+ switch ($request->get('sort')) {
+ default:
+ $query->orderBy('characters.number', 'DESC');
+ break;
+ case 'number_desc':
+ $query->orderBy('characters.number', 'DESC');
+ break;
+ case 'number_asc':
+ $query->orderBy('characters.number', 'ASC');
+ break;
+ case 'id_desc':
+ $query->orderBy('characters.id', 'DESC');
+ break;
+ case 'id_asc':
+ $query->orderBy('characters.id', 'ASC');
+ break;
+ case 'sale_value_desc':
+ $query->orderBy('characters.sale_value', 'DESC');
+ break;
+ case 'sale_value_asc':
+ $query->orderBy('characters.sale_value', 'ASC');
+ break;
+ }
}
- $subCategory = CharacterCategory::where('masterlist_sub_id', $sublist->id)->orderBy('character_categories.sort', 'DESC')->pluck('name', 'id')->toArray();
- if (!$subCategory) {
- $subCategory = CharacterCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('character_categories.sort', 'DESC')->pluck('name', 'id')->toArray();
- }
- $subSpecies = Species::where('masterlist_sub_id', $sublist->id)->orderBy('specieses.sort', 'DESC')->pluck('name', 'id')->toArray();
- if (!$subSpecies) {
- $subSpecies = Species::visible(Auth::check() ? Auth::user() : null)->orderBy('specieses.sort', 'DESC')->pluck('name', 'id')->toArray();
- }
+ $query->visible(Auth::user() ?? null);
- return view('browse.sub_masterlist', [
- 'isMyo' => false,
- 'characters' => $query->paginate(24)->appends($request->query()),
- 'categories' => [0 => 'Any Category'] + $subCategory,
- 'specieses' => [0 => 'Any Species'] + $subSpecies,
- 'subtypes' => [0 => 'Any Subtype'] + Subtype::visible(Auth::check() ? Auth::user() : null)->orderBy('subtypes.sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'rarities' => [0 => 'Any Rarity'] + Rarity::orderBy('rarities.sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'features' => Feature::getDropdownItems(),
- 'sublist' => $sublist,
- 'sublists' => Sublist::orderBy('sort', 'DESC')->get(),
- 'userOptions' => User::query()->orderBy('name')->pluck('name', 'id')->toArray(),
- ]);
+ return $query;
}
}
diff --git a/app/Http/Controllers/Characters/CharacterController.php b/app/Http/Controllers/Characters/CharacterController.php
index b831c71fdb..9cd2938833 100644
--- a/app/Http/Controllers/Characters/CharacterController.php
+++ b/app/Http/Controllers/Characters/CharacterController.php
@@ -13,6 +13,7 @@
use App\Models\Gallery\GallerySubmission;
use App\Models\Item\Item;
use App\Models\Item\ItemCategory;
+use App\Models\Rarity;
use App\Models\User\User;
use App\Models\User\UserCurrency;
use App\Models\User\UserItem;
@@ -215,7 +216,7 @@ public function getCharacterGallery(Request $request, $slug) {
*/
public function getCharacterImages($slug) {
return view('character.images', [
- 'user' => Auth::check() ? Auth::user() : null,
+ 'user' => Auth::user() ?? null,
'character' => $this->character,
'extPrevAndNextBtnsUrl' => '/images',
]);
@@ -228,12 +229,32 @@ public function getCharacterImages($slug) {
*
* @return \Illuminate\Contracts\Support\Renderable
*/
- public function getCharacterInventory($slug) {
- $categories = ItemCategory::visible(Auth::check() ? Auth::user() : null)->where('is_character_owned', '1')->orderBy('sort', 'DESC')->get();
+ public function getCharacterInventory(Request $request, $slug) {
+ $categories = ItemCategory::visible(Auth::user() ?? null)->where('is_character_owned', '1')->orderBy('sort', 'DESC')->get();
$itemOptions = Item::whereIn('item_category_id', $categories->pluck('id'));
+ $query = Item::query();
+ $data = $request->only(['item_category_id', 'name', 'artist', 'rarity_id']);
+ if (isset($data['item_category_id'])) {
+ $query->where('item_category_id', $data['item_category_id']);
+ }
+ if (isset($data['name'])) {
+ $query->where('name', 'LIKE', '%'.$data['name'].'%');
+ }
+ if (isset($data['artist'])) {
+ $query->where('artist_id', $data['artist']);
+ }
+ if (isset($data['rarity_id'])) {
+ if ($data['rarity_id'] == 'withoutOption') {
+ $query->whereNull('data->rarity_id');
+ } else {
+ $query->where('data->rarity_id', $data['rarity_id']);
+ }
+ }
+
$items = count($categories) ?
$this->character->items()
+ ->whereIn('items.id', $query->pluck('id')->toArray())
->where('count', '>', 0)
->orderByRaw('FIELD(item_category_id,'.implode(',', $categories->pluck('id')->toArray()).')')
->orderBy('name')
@@ -241,6 +262,7 @@ public function getCharacterInventory($slug) {
->get()
->groupBy(['item_category_id', 'id']) :
$this->character->items()
+ ->whereIn('items.id', $query->pluck('id')->toArray())
->where('count', '>', 0)
->orderBy('name')
->orderBy('updated_at')
@@ -253,6 +275,8 @@ public function getCharacterInventory($slug) {
'categories' => $categories->keyBy('id'),
'items' => $items,
'logs' => $this->character->getItemLogs(),
+ 'artists' => User::whereIn('id', Item::whereNotNull('artist_id')->pluck('artist_id')->toArray())->pluck('name', 'id')->toArray(),
+ 'rarities' => ['withoutOption' => 'Without Rarity'] + Rarity::orderBy('rarities.sort', 'DESC')->pluck('name', 'id')->toArray(),
] + (Auth::check() && (Auth::user()->hasPower('edit_inventories') || Auth::user()->id == $this->character->user_id) ? [
'itemOptions' => $itemOptions->pluck('name', 'id'),
'userInventory' => UserItem::with('item')->whereIn('item_id', $itemOptions->pluck('id'))->whereNull('deleted_at')->where('count', '>', '0')->where('user_id', Auth::user()->id)->get()->filter(function ($userItem) {
diff --git a/app/Http/Controllers/Characters/DesignController.php b/app/Http/Controllers/Characters/DesignController.php
index a082bbd31a..e178537739 100644
--- a/app/Http/Controllers/Characters/DesignController.php
+++ b/app/Http/Controllers/Characters/DesignController.php
@@ -52,7 +52,8 @@ public function getDesignUpdate($id) {
}
return view('character.design.request', [
- 'request' => $r,
+ 'request' => $r,
+ 'canCancel' => config('lorekeeper.extensions.design_return_to_draft') ?? 0,
]);
}
@@ -171,7 +172,7 @@ public function getAddons($id) {
return view('character.design.addons', [
'request' => $r,
- 'categories' => ItemCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->get(),
+ 'categories' => ItemCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->get(),
'inventory' => $inventory,
'items' => Item::all()->keyBy('id'),
'item_filter' => Item::orderBy('name')->get()->keyBy('id'),
@@ -223,7 +224,7 @@ public function getFeatures($id) {
return view('character.design.features', [
'request' => $r,
'specieses' => ['0' => 'Select Species'] + Species::visible()->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'subtypes' => ['0' => 'No Subtype'] + Subtype::visible()->where('species_id', '=', $r->species_id)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'subtypes' => Subtype::visible()->where('species_id', '=', $r->species_id)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'rarities' => ['0' => 'Select Rarity'] + Rarity::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'features' => Feature::getDropdownItems(),
]);
@@ -239,7 +240,7 @@ public function getFeaturesSubtype(Request $request) {
$id = $request->input('id');
return view('character.design._features_subtype', [
- 'subtypes' => ['0' => 'Select Subtype'] + Subtype::visible()->where('species_id', '=', $species)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'subtypes' => Subtype::visible()->where('species_id', '=', $species)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'subtype' => $id,
]);
}
@@ -363,4 +364,50 @@ public function postDelete(DesignUpdateManager $service, $id) {
return redirect()->to('designs');
}
+
+ /**
+ * Shows the design update request cancellation confirmation modal for a user.
+ *
+ * @param int $id
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getCancel($id) {
+ $r = CharacterDesignUpdate::find($id);
+ if (!$r || ($r->user_id != Auth::user()->id && !Auth::user()->hasPower('manage_characters'))) {
+ abort(404);
+ }
+
+ return view('character.design._cancel_modal', [
+ 'request' => $r,
+ ]);
+ }
+
+ /**
+ * Cancels a design update request and returns it to drafts.
+ *
+ * @param App\Services\DesignUpdateManager $service
+ * @param int $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postCancel(DesignUpdateManager $service, $id) {
+ $r = CharacterDesignUpdate::find($id);
+ if (!$r) {
+ abort(404);
+ }
+ if ($r->user_id != Auth::user()->id) {
+ abort(404);
+ }
+
+ if ($service->cancelRequest(null, $r, Auth::user(), true)) {
+ flash('Request canceled successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
}
diff --git a/app/Http/Controllers/Comments/CommentController.php b/app/Http/Controllers/Comments/CommentController.php
index 9ed612ab28..1adb184dd2 100644
--- a/app/Http/Controllers/Comments/CommentController.php
+++ b/app/Http/Controllers/Comments/CommentController.php
@@ -41,14 +41,7 @@ public function __construct() {
public function store(Request $request, $model, $id) {
$model = urldecode(base64_decode($model));
- $accepted_models = config('lorekeeper.allowed_comment_models');
- if (!count($accepted_models)) {
- flash('Invalid Models')->error();
-
- return redirect()->back();
- }
-
- if (!in_array($model, $accepted_models)) {
+ if (!count(config('lorekeeper.allowed_comment_models')) || !in_array($model, config('lorekeeper.allowed_comment_models'))) {
abort(404);
}
@@ -98,7 +91,7 @@ public function store(Request $request, $model, $id) {
$recipient = null;
$post = null;
$model_type = $comment->commentable_type;
- //getting user who commented
+ // getting user who commented
$sender = User::find($comment->commenter_id);
$type = $comment->type;
@@ -178,11 +171,11 @@ public function update(Request $request, Comment $comment) {
$comment->edits()->create([
'user_id' => Auth::user()->id,
'comment_id' => $comment->id,
- 'data' => json_encode([
+ 'data' => [
'action' => 'edit',
'old_comment' => config('lorekeeper.settings.wysiwyg_comments') ? parse($comment->comment) : $comment->comment,
'new_comment' => config('lorekeeper.settings.wysiwyg_comments') ? parse($request->message) : $request->message,
- ]),
+ ],
]);
$comment->update([
@@ -303,4 +296,47 @@ public function getLikedComments(Request $request) {
'user' => Auth::user(),
]);
}
+
+ /**
+ * Sorts comments based on the user's preference.
+ *
+ * @param mixed $model
+ * @param mixed $id
+ */
+ public function getSortedComments(Request $request, $model, $id) {
+ $sort = $request->input('sort');
+ $perPage = $request->input('perPage');
+
+ $approved = $request->input('approved');
+ $type = $request->input('type');
+
+ $model = urldecode(base64_decode($model));
+ if (!count(config('lorekeeper.allowed_comment_models')) || !in_array($model, config('lorekeeper.allowed_comment_models'))) {
+ abort(404);
+ }
+ $model = $model::findOrFail($id);
+
+ if (isset($approved) && $approved) {
+ if (isset($type)) {
+ $comments = $model->approvedComments->where('type', $type);
+ } else {
+ $comments = $model->approvedComments->where('type', 'User-User');
+ }
+ } else {
+ if (isset($type)) {
+ $comments = $model->commentz->where('type', $type);
+ } else {
+ $comments = $model->commentz->where('type', 'User-User');
+ }
+ }
+
+ return view('comments._comments', [
+ 'comments' => $comments,
+ 'sort' => $sort,
+ 'perPage' => $perPage,
+ 'allow_dislikes' => $request->input('allow_dislikes'),
+ 'url' => $request->input('url'),
+ 'page' => $request->input('page'),
+ ]);
+ }
}
diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php
index 86454a9790..efcfa0a272 100644
--- a/app/Http/Controllers/Controller.php
+++ b/app/Http/Controllers/Controller.php
@@ -13,6 +13,5 @@ class Controller extends BaseController {
/**
* Creates a new controller instance.
*/
- public function __construct() {
- }
+ public function __construct() {}
}
diff --git a/app/Http/Controllers/GalleryController.php b/app/Http/Controllers/GalleryController.php
index 85fcd10593..80e4060734 100644
--- a/app/Http/Controllers/GalleryController.php
+++ b/app/Http/Controllers/GalleryController.php
@@ -61,7 +61,7 @@ public function getGallery($id, Request $request) {
abort(404);
}
- $query = GallerySubmission::where('gallery_id', $gallery->id)->visible(Auth::check() ? Auth::user() : null);
+ $query = GallerySubmission::where('gallery_id', $gallery->id)->visible(Auth::user() ?? null);
$sort = $request->only(['sort']);
if ($request->get('title')) {
@@ -118,7 +118,7 @@ public function getAll(Request $request) {
abort(404);
}
- $query = GallerySubmission::visible(Auth::check() ? Auth::user() : null)->accepted();
+ $query = GallerySubmission::visible(Auth::user() ?? null)->accepted();
$sort = $request->only(['sort']);
if ($request->get('title')) {
diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php
index 7a9c34b369..f714f36104 100644
--- a/app/Http/Controllers/HomeController.php
+++ b/app/Http/Controllers/HomeController.php
@@ -28,7 +28,7 @@ class HomeController extends Controller {
*/
public function getIndex() {
if (config('lorekeeper.extensions.show_all_recent_submissions.enable')) {
- $query = GallerySubmission::visible(Auth::check() ? Auth::user() : null)->accepted()->orderBy('created_at', 'DESC');
+ $query = GallerySubmission::visible(Auth::user() ?? null)->accepted()->orderBy('created_at', 'DESC');
$gallerySubmissions = $query->get()->take(8);
} else {
$gallerySubmissions = [];
@@ -46,7 +46,7 @@ public function getIndex() {
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getLink(Request $request) {
- // If the user already has a username associated with their account, redirect them
+ // If the user already has an alias associated with their account, redirect them
if (Auth::check() && Auth::user()->hasAlias) {
redirect()->to('home');
}
@@ -68,7 +68,7 @@ public function getAuthRedirect(LinkService $service, $provider) {
}
// Redirect to the provider's authentication page
- return $service->getAuthRedirect($provider); //Socialite::driver($provider)->redirect();
+ return $service->getAuthRedirect($provider); // Socialite::driver($provider)->redirect();
}
/**
@@ -103,6 +103,41 @@ public function getAuthCallback(LinkService $service, $provider) {
return redirect()->to('/');
}
+ /**
+ * Shows the email page.
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getEmail(Request $request) {
+ // If the user already has an email associated with their account, redirect them
+ if (Auth::check() && Auth::user()->hasEmail) {
+ return redirect()->to('home');
+ }
+
+ // Step 1: display a login email
+ return view('auth.email');
+ }
+
+ /**
+ * Posts the email page.
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function postEmail(UserService $service, Request $request) {
+ $data = $request->input('email');
+ if ($service->updateEmail(['email' => $data], Auth::user())) {
+ flash('Email added successfully!');
+
+ return redirect()->to('home');
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+
+ return redirect()->back();
+ }
+ }
+
/**
* Shows the birthdaying page.
*
@@ -185,10 +220,10 @@ private function checkProvider($provider, $user) {
// I think there's no harm in linking multiple of the same site as people may want their activity separated into an ARPG account.
// Uncomment the following to restrict to one account per site, however.
// Check if the user already has a username associated with their account
- //if(DB::table('user_aliases')->where('site', $provider)->where('user_id', $user->id)->exists()) {
+ // if(DB::table('user_aliases')->where('site', $provider)->where('user_id', $user->id)->exists()) {
// $this->error = 'You already have a username associated with this website linked to your account.';
// return false;
- //}
+ // }
return true;
}
diff --git a/app/Http/Controllers/NewsController.php b/app/Http/Controllers/NewsController.php
index a45040c37d..3880230231 100644
--- a/app/Http/Controllers/NewsController.php
+++ b/app/Http/Controllers/NewsController.php
@@ -45,7 +45,7 @@ public function getIndex() {
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getNews($id, $slug = null) {
- $news = News::where('id', $id)->where('is_visible', 1)->first();
+ $news = News::where('id', $id)->visible(Auth::user() ?? null)->first();
if (!$news) {
abort(404);
}
diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php
index 1cf1294634..1a407d385a 100644
--- a/app/Http/Controllers/PageController.php
+++ b/app/Http/Controllers/PageController.php
@@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use App\Models\SitePage;
+use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class PageController extends Controller {
@@ -23,7 +24,7 @@ class PageController extends Controller {
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getPage($key) {
- $page = SitePage::where('key', $key)->where('is_visible', 1)->first();
+ $page = SitePage::where('key', $key)->visible(Auth::user() ?? null)->first();
if (!$page) {
abort(404);
}
@@ -42,4 +43,13 @@ public function getCreditsPage() {
'extensions' => DB::table('site_extensions')->get(),
]);
}
+
+ /**
+ * Shows the RSS feeds page.
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getFeedsPage() {
+ return view('pages.feeds');
+ }
}
diff --git a/app/Http/Controllers/PermalinkController.php b/app/Http/Controllers/PermalinkController.php
index f27c7bc36a..9a072f7a18 100644
--- a/app/Http/Controllers/PermalinkController.php
+++ b/app/Http/Controllers/PermalinkController.php
@@ -17,7 +17,7 @@ class PermalinkController extends Controller {
*/
public function getComment($id) {
$comments = Comment::withTrashed();
- //$comments = $comments->sortByDesc('created_at');
+ // $comments = $comments->sortByDesc('created_at');
$comment = $comments->find($id);
if (!$comment) {
@@ -86,7 +86,7 @@ public function getComment($id) {
$comment->location = $comment->commentable->url;
}
- return view('comments._perma_layout', [
+ return view('comments.permalink_comment', [
'comment' => $comment,
]);
}
diff --git a/app/Http/Controllers/PromptsController.php b/app/Http/Controllers/PromptsController.php
index 6901122c02..1e8bd1a785 100644
--- a/app/Http/Controllers/PromptsController.php
+++ b/app/Http/Controllers/PromptsController.php
@@ -50,7 +50,7 @@ public function getPromptCategories(Request $request) {
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getPrompts(Request $request) {
- $query = Prompt::active()->staffOnly(Auth::check() ? Auth::user() : null)->with('category');
+ $query = Prompt::active()->staffOnly(Auth::user() ?? null)->with('category');
$data = $request->only(['prompt_category_id', 'name', 'sort', 'open_prompts']);
if (isset($data['prompt_category_id']) && $data['prompt_category_id'] != 'none') {
if ($data['prompt_category_id'] == 'withoutOption') {
diff --git a/app/Http/Controllers/SalesController.php b/app/Http/Controllers/SalesController.php
index 851df41697..4f7a49f892 100644
--- a/app/Http/Controllers/SalesController.php
+++ b/app/Http/Controllers/SalesController.php
@@ -83,7 +83,7 @@ public function getIndex(Request $request) {
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getSales($id, $slug = null) {
- $sales = Sales::where('id', $id)->where('is_visible', 1)->first();
+ $sales = Sales::where('id', $id)->visible(Auth::user() ?? null)->first();
if (!$sales) {
abort(404);
}
diff --git a/app/Http/Controllers/ShopController.php b/app/Http/Controllers/ShopController.php
index 1d32ae0b13..5cf4db5e01 100644
--- a/app/Http/Controllers/ShopController.php
+++ b/app/Http/Controllers/ShopController.php
@@ -2,13 +2,13 @@
namespace App\Http\Controllers;
-use App\Models\Currency\Currency;
use App\Models\Item\Item;
-use App\Models\Item\ItemCategory;
+use App\Models\Item\ItemTag;
use App\Models\Shop\Shop;
use App\Models\Shop\ShopLog;
use App\Models\Shop\ShopStock;
use App\Models\User\UserItem;
+use App\Services\LimitManager;
use App\Services\ShopManager;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@@ -30,7 +30,7 @@ class ShopController extends Controller {
*/
public function getIndex() {
return view('shops.index', [
- 'shops' => Shop::where('is_active', 1)->orderBy('sort', 'DESC')->get(),
+ 'shops' => Shop::where('is_active', 1)->where('is_hidden', 0)->orderBy('sort', 'DESC')->get(),
]);
}
@@ -42,25 +42,81 @@ public function getIndex() {
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getShop($id) {
- $categories = ItemCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->get();
$shop = Shop::where('id', $id)->where('is_active', 1)->first();
+
if (!$shop) {
abort(404);
}
- $query = $shop->displayStock()->where(function ($query) use ($categories) {
- $query->whereIn('item_category_id', $categories->pluck('id')->toArray())
- ->orWhereNull('item_category_id');
- });
+ if ($shop->is_staff) {
+ if (!Auth::check()) {
+ abort(404);
+ }
+ if (!Auth::user()->isStaff) {
+ abort(404);
+ }
+ }
+
+ if (count(getLimits($shop))) {
+ if (!Auth::check()) {
+ flash('You must be logged in to enter this shop.')->error();
+
+ return redirect()->to('shops');
+ }
+
+ $limitService = new LimitManager;
+ if (!$limitService->checkLimits($shop)) {
+ flash($limitService->errors()->getMessages()['error'][0])->error();
- $items = count($categories) ? $query->orderByRaw('FIELD(item_category_id,'.implode(',', $categories->pluck('id')->toArray()).')')->orderBy('name')->get()->groupBy('item_category_id') : $shop->displayStock()->orderBy('name')->get()->groupBy('item_category_id');
+ return redirect()->to('shops');
+ }
+ }
+
+ if ($shop->is_fto) {
+ if (!Auth::check()) {
+ flash('You must be logged in to enter this shop.')->error();
+
+ return redirect()->to('/shops');
+ }
+ if (!Auth::user()->settings->is_fto && !Auth::user()->isStaff) {
+ flash('You must be a FTO to enter this shop.')->error();
+
+ return redirect()->to('/shops');
+ }
+ }
+
+ // get all types of stock in the shop
+ $stock_types = ShopStock::where('shop_id', $shop->id)->pluck('stock_type')->unique();
+ $stocks = [];
+ foreach ($stock_types as $type) {
+ // get the model for the stock type (item, pet, etc)
+ $type = strtolower($type);
+ $model = getAssetModelString($type);
+ // get the category of the stock
+ if (!class_exists($model.'Category')) {
+ $stock = $shop->displayStock($model, $type)->where('stock_type', $type)->orderBy('name')->get()->groupBy($type.'_category_id');
+ $stocks[$type] = $stock;
+ continue; // If the category model doesn't exist, skip it
+ }
+ $stock_category = ($model.'Category')::orderBy('sort', 'DESC')->get();
+ // order the stock
+ $stock = count($stock_category) ? $shop->displayStock($model, $type)->where('stock_type', $type)
+ ->orderByRaw('FIELD('.$type.'_category_id,'.implode(',', $stock_category->pluck('id')->toArray()).')')
+ ->orderBy('name')->get()->groupBy($type.'_category_id')
+ : $shop->displayStock($model, $type)->where('stock_type', $type)->orderBy('name')->get()->groupBy($type.'_category_id');
+
+ // make it so key "" appears last
+ $stock = $stock->sortBy(function ($item, $key) {
+ return $key == '' ? 1 : 0;
+ });
+
+ $stocks[$type] = $stock;
+ }
return view('shops.shop', [
'shop' => $shop,
- 'categories' => $categories->keyBy('id'),
- 'items' => $items,
+ 'stocks' => $stocks,
'shops' => Shop::where('is_active', 1)->orderBy('sort', 'DESC')->get(),
- 'currencies' => Currency::whereIn('id', ShopStock::where('shop_id', $shop->id)->pluck('currency_id')->toArray())->get()->keyBy('id'),
]);
}
@@ -75,7 +131,19 @@ public function getShop($id) {
*/
public function getShopStock(ShopManager $service, $id, $stockId) {
$shop = Shop::where('id', $id)->where('is_active', 1)->first();
- $stock = ShopStock::with('item')->where('id', $stockId)->where('shop_id', $id)->first();
+ $stock = ShopStock::where('id', $stockId)->where('shop_id', $id)->first();
+ if (!$shop) {
+ abort(404);
+ }
+
+ if (count(getLimits($shop))) {
+ $limitService = new LimitManager;
+ if (!$limitService->checkLimits($shop)) {
+ flash($limitService->errors()->getMessages()['error'][0])->error();
+
+ return redirect()->to('shops');
+ }
+ }
$user = Auth::user();
$quantityLimit = 0;
@@ -85,20 +153,32 @@ public function getShopStock(ShopManager $service, $id, $stockId) {
$quantityLimit = $service->getStockPurchaseLimit($stock, Auth::user());
$userPurchaseCount = $service->checkUserPurchases($stock, Auth::user());
$purchaseLimitReached = $service->checkPurchaseLimitReached($stock, Auth::user());
- $userOwned = UserItem::where('user_id', $user->id)->where('item_id', $stock->item->id)->where('count', '>', 0)->get();
+ $userOwned = $service->getUserOwned($stock, Auth::user());
}
- if (!$shop) {
- abort(404);
+ if ($shop->use_coupons) {
+ $couponId = ItemTag::where('tag', 'coupon')->where('is_active', 1); // Removed get()
+ $itemIds = $couponId->pluck('item_id'); // Could be combined with above
+ // get rid of any itemIds that are not in allowed_coupons
+ if ($shop->allowed_coupons && count(json_decode($shop->allowed_coupons, 1))) {
+ $itemIds = $itemIds->filter(function ($itemId) use ($shop) {
+ return in_array($itemId, json_decode($shop->allowed_coupons, 1));
+ });
+ }
+ $check = UserItem::with('item')->whereIn('item_id', $itemIds)->where('user_id', Auth::user()->id)->where('count', '>', 0)->get()->pluck('item.name', 'id');
+ } else {
+ $check = null;
}
return view('shops._stock_modal', [
'shop' => $shop,
'stock' => $stock,
+ 'userCoupons' => $check,
'quantityLimit' => $quantityLimit,
'userPurchaseCount' => $userPurchaseCount,
'purchaseLimitReached' => $purchaseLimitReached,
'userOwned' => $user ? $userOwned : null,
+ 'inventory' => $user ? UserItem::with('item')->whereNull('deleted_at')->where('count', '>', '0')->where('user_id', Auth::user()->id)->get() : null,
]);
}
@@ -111,7 +191,7 @@ public function getShopStock(ShopManager $service, $id, $stockId) {
*/
public function postBuy(Request $request, ShopManager $service) {
$request->validate(ShopLog::$createRules);
- if ($service->buyStock($request->only(['stock_id', 'shop_id', 'slug', 'bank', 'quantity']), Auth::user())) {
+ if ($service->buyStock($request->only(['stock_id', 'shop_id', 'slug', 'bank', 'quantity', 'use_coupon', 'coupon', 'cost_group', 'stack_id', 'stack_quantity']), Auth::user())) {
flash('Successfully purchased item.')->success();
} else {
foreach ($service->errors()->getMessages()['error'] as $error) {
diff --git a/app/Http/Controllers/Users/AccountController.php b/app/Http/Controllers/Users/AccountController.php
index 2d6b1b2d7b..c686acd97d 100644
--- a/app/Http/Controllers/Users/AccountController.php
+++ b/app/Http/Controllers/Users/AccountController.php
@@ -86,7 +86,10 @@ public function postProfile(Request $request) {
* @return \Illuminate\Http\RedirectResponse
*/
public function postAvatar(Request $request, UserService $service) {
- if ($service->updateAvatar($request->file('avatar'), Auth::user())) {
+ $data = $request->only([
+ 'avatar', 'x0', 'x1', 'y0', 'y1',
+ ]);
+ if ($service->updateAvatar($data, Auth::user())) {
flash('Avatar updated successfully.')->success();
} else {
foreach ($service->errors()->getMessages()['error'] as $error) {
@@ -275,6 +278,44 @@ public function postDisableTwoFactor(Request $request, UserService $service) {
return redirect()->back();
}
+ /**
+ * Changes user character warning visibility setting.
+ *
+ * @param App\Services\UserService $service
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postWarningVisibility(Request $request, UserService $service) {
+ if ($service->updateContentWarningVisibility($request->input('content_warning_visibility'), Auth::user())) {
+ flash('Setting updated successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
+
+ /**
+ * Changes user profile comment visibility setting.
+ *
+ * @param App\Services\UserService $service
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postProfileComments(Request $request, UserService $service) {
+ if ($service->updateProfileCommentSetting($request->input('allow_profile_comments'), Auth::user())) {
+ flash('Setting updated successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
+
/**
* Shows the notifications page.
*
@@ -475,4 +516,24 @@ public function postReactivate(Request $request, UserService $service) {
return redirect()->back();
}
+
+ /**
+ * Changes user font settings.
+ *
+ * @param App\Services\UserService $service
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postFont(Request $request, UserService $service) {
+ $data = $request->only(['font_size', 'site_fonts_disabled', 'letter_spacing', 'word_spacing', 'line_height']);
+ if ($service->updateFontSetting($data, Auth::user())) {
+ flash('Setting updated successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
}
diff --git a/app/Http/Controllers/Users/BankController.php b/app/Http/Controllers/Users/BankController.php
index 7efe080ec3..0c76792078 100644
--- a/app/Http/Controllers/Users/BankController.php
+++ b/app/Http/Controllers/Users/BankController.php
@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Users;
+use App\Facades\Settings;
use App\Http\Controllers\Controller;
use App\Models\Currency\Currency;
use App\Models\User\User;
@@ -29,7 +30,9 @@ public function getIndex() {
return view('home.bank', [
'currencyOptions' => Currency::where('allow_user_to_user', 1)->where('is_user_owned', 1)->whereIn('id', UserCurrency::where('user_id', Auth::user()->id)->pluck('currency_id')->toArray())->orderBy('sort_user', 'DESC')->pluck('name', 'id')->toArray(),
'userOptions' => User::visible()->where('id', '!=', Auth::user()->id)->orderBy('name')->pluck('name', 'id')->toArray(),
-
+ // only get currency with currency_conversions relationship
+ 'convertOptions' => Currency::where('is_user_owned', 1)->whereHas('conversions')->orderBy('sort_user', 'DESC')->pluck('name', 'id')->toArray(),
+ 'canTransfer' => Settings::get('can_transfer_currency_directly'),
]);
}
@@ -51,4 +54,54 @@ public function postTransfer(Request $request, CurrencyManager $service) {
return redirect()->back();
}
+
+ /**
+ * Gets the currency conversion form for the user.
+ *
+ * @param mixed $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function getConvertCurrency($id) {
+ $currency = Currency::where('is_user_owned', 1)->where('id', $id)->first();
+ $convertOptions = Currency::whereIn('id', $currency->conversions->pluck('conversion_id')->toArray())->orderBy('sort_user', 'DESC')->pluck('name', 'id')->toArray();
+
+ return view('home._bank_convert', [
+ 'convertOptions' => $convertOptions,
+ ]);
+ }
+
+ /**
+ * Gets the currency conversion rate for the user.
+ *
+ * @param mixed $currency_id
+ * @param mixed $conversion_id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function getConvertCurrencyRate($currency_id, $conversion_id) {
+ $currency = Currency::where('is_user_owned', 1)->where('id', $currency_id)->first();
+
+ return $currency->conversions()->where('conversion_id', $conversion_id)->first()->ratio();
+ }
+
+ /**
+ * Converts currency from one type to another.
+ *
+ * @param App\Services\CurrencyManager $service
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postConvertCurrency(Request $request, CurrencyManager $service) {
+ $data = $request->only(['currency_id', 'conversion_id', 'quantity']);
+ if ($service->convertCurrency(Currency::find($data['currency_id']), Currency::find($data['conversion_id']), $data['quantity'], Auth::user())) {
+ flash('Currency converted successfully.')->success();
+ } else {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ }
+
+ return redirect()->back();
+ }
}
diff --git a/app/Http/Controllers/Users/InventoryController.php b/app/Http/Controllers/Users/InventoryController.php
index 0baf34bdc4..b0f603c769 100644
--- a/app/Http/Controllers/Users/InventoryController.php
+++ b/app/Http/Controllers/Users/InventoryController.php
@@ -2,12 +2,14 @@
namespace App\Http\Controllers\Users;
+use App\Facades\Settings;
use App\Http\Controllers\Controller;
use App\Models\Character\Character;
use App\Models\Character\CharacterDesignUpdate;
use App\Models\Character\CharacterItem;
use App\Models\Item\Item;
use App\Models\Item\ItemCategory;
+use App\Models\Rarity;
use App\Models\Submission\Submission;
use App\Models\Trade;
use App\Models\User\User;
@@ -31,10 +33,30 @@ class InventoryController extends Controller {
*
* @return \Illuminate\Contracts\Support\Renderable
*/
- public function getIndex() {
- $categories = ItemCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->get();
+ public function getIndex(Request $request) {
+ $categories = ItemCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->get();
+ $query = Item::query();
+ $data = $request->only(['item_category_id', 'name', 'artist', 'rarity_id']);
+ if (isset($data['item_category_id'])) {
+ $query->where('item_category_id', $data['item_category_id']);
+ }
+ if (isset($data['name'])) {
+ $query->where('name', 'LIKE', '%'.$data['name'].'%');
+ }
+ if (isset($data['artist'])) {
+ $query->where('artist_id', $data['artist']);
+ }
+ if (isset($data['rarity_id'])) {
+ if ($data['rarity_id'] == 'withoutOption') {
+ $query->whereNull('data->rarity_id');
+ } else {
+ $query->where('data->rarity_id', $data['rarity_id']);
+ }
+ }
+
$items = count($categories) ?
Auth::user()->items()
+ ->whereIn('items.id', $query->pluck('id')->toArray())
->where('count', '>', 0)
->orderByRaw('FIELD(item_category_id,'.implode(',', $categories->pluck('id')->toArray()).')')
->orderBy('name')
@@ -42,6 +64,7 @@ public function getIndex() {
->get()
->groupBy(['item_category_id', 'id']) :
Auth::user()->items()
+ ->whereIn('items.id', $query->pluck('id')->toArray())
->where('count', '>', 0)
->orderBy('name')
->orderBy('updated_at')
@@ -53,6 +76,8 @@ public function getIndex() {
'items' => $items,
'userOptions' => User::visible()->where('id', '!=', Auth::user()->id)->orderBy('name')->pluck('name', 'id')->toArray(),
'user' => Auth::user(),
+ 'artists' => User::whereIn('id', Item::whereNotNull('artist_id')->pluck('artist_id')->toArray())->pluck('name', 'id')->toArray(),
+ 'rarities' => ['withoutOption' => 'Without Rarity'] + Rarity::orderBy('rarities.sort', 'DESC')->pluck('name', 'id')->toArray(),
]);
}
@@ -76,6 +101,7 @@ public function getStack(Request $request, $id) {
'userOptions' => ['' => 'Select User'] + User::visible()->where('id', '!=', $first_instance ? $first_instance->user_id : 0)->orderBy('name')->get()->pluck('verified_name', 'id')->toArray(),
'readOnly' => $readOnly,
'characterOptions' => Character::visible()->myo(0)->where('user_id', optional(Auth::user())->id)->orderBy('sort', 'DESC')->get()->pluck('fullName', 'id')->toArray(),
+ 'canTransfer' => Settings::get('can_transfer_items_directly'),
]);
}
@@ -214,7 +240,7 @@ public function getFullInventory() {
}
// Set up Categories
- $categories = ItemCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->get();
+ $categories = ItemCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->get();
if (count($categories)) {
$items =
diff --git a/app/Http/Controllers/Users/ReportController.php b/app/Http/Controllers/Users/ReportController.php
index 65a8d8bda8..dc2a11ef25 100644
--- a/app/Http/Controllers/Users/ReportController.php
+++ b/app/Http/Controllers/Users/ReportController.php
@@ -63,7 +63,7 @@ public function getBugIndex(Request $request) {
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getReport($id) {
- $report = Report::viewable(Auth::check() ? Auth::user() : null)->where('id', $id)->first();
+ $report = Report::viewable(Auth::user() ?? null)->where('id', $id)->first();
if (!$report) {
abort(404);
}
diff --git a/app/Http/Controllers/Users/SubmissionController.php b/app/Http/Controllers/Users/SubmissionController.php
index 4e19889b83..00e476fedb 100644
--- a/app/Http/Controllers/Users/SubmissionController.php
+++ b/app/Http/Controllers/Users/SubmissionController.php
@@ -6,6 +6,8 @@
use App\Http\Controllers\Controller;
use App\Models\Character\Character;
use App\Models\Currency\Currency;
+use App\Models\Gallery\GalleryCollaborator;
+use App\Models\Gallery\GallerySubmission;
use App\Models\Item\Item;
use App\Models\Item\ItemCategory;
use App\Models\Prompt\Prompt;
@@ -86,21 +88,34 @@ public function getNewSubmission(Request $request) {
$closed = !Settings::get('is_prompts_open');
$inventory = UserItem::with('item')->whereNull('deleted_at')->where('count', '>', '0')->where('user_id', Auth::user()->id)->get();
+ if (config('lorekeeper.settings.allow_gallery_submissions_on_prompts')) {
+ $collaboratorIds = GalleryCollaborator::where('user_id', Auth::user()->id)->where('has_approved', 1)->pluck('gallery_submission_id')->toArray();
+
+ $gallerySubmissions = GallerySubmission::where('is_visible', true)->where('user_id', Auth::user()->id)->orWhereIn('id', $collaboratorIds)->orderBy('id', 'DESC')->get()->pluck('title', 'id');
+
+ $gallerySubmissions = $gallerySubmissions->map(function ($item, $key) {
+ return '"'.$item.'" by '.Auth::user()->name;
+ });
+ } else {
+ $gallerySubmissions = [];
+ }
+
return view('home.create_submission', [
'closed' => $closed,
'isClaim' => false,
] + ($closed ? [] : [
- 'submission' => new Submission,
- 'prompts' => Prompt::active()->sortAlphabetical()->pluck('name', 'id')->toArray(),
- 'characterCurrencies' => Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'),
- 'categories' => ItemCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->get(),
- 'item_filter' => Item::orderBy('name')->released()->get()->keyBy('id'),
- 'items' => Item::orderBy('name')->released()->pluck('name', 'id'),
- 'character_items' => Item::whereIn('item_category_id', ItemCategory::where('is_character_owned', 1)->pluck('id')->toArray())->orderBy('name')->released()->pluck('name', 'id'),
- 'currencies' => Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'),
- 'inventory' => $inventory,
- 'page' => 'submission',
- 'expanded_rewards' => config('lorekeeper.extensions.character_reward_expansion.expanded'),
+ 'submission' => new Submission,
+ 'prompts' => Prompt::active()->sortAlphabetical()->pluck('name', 'id')->toArray(),
+ 'characterCurrencies' => Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'),
+ 'categories' => ItemCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->get(),
+ 'item_filter' => Item::orderBy('name')->released()->get()->keyBy('id'),
+ 'items' => Item::orderBy('name')->released()->pluck('name', 'id'),
+ 'character_items' => Item::whereIn('item_category_id', ItemCategory::where('is_character_owned', 1)->pluck('id')->toArray())->orderBy('name')->released()->pluck('name', 'id'),
+ 'currencies' => Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'),
+ 'inventory' => $inventory,
+ 'page' => 'submission',
+ 'expanded_rewards' => config('lorekeeper.extensions.character_reward_expansion.expanded'),
+ 'userGallerySubmissions' => $gallerySubmissions,
]));
}
@@ -119,23 +134,33 @@ public function getEditSubmission(Request $request, $id) {
abort(404);
}
+ if (config('lorekeeper.settings.allow_gallery_submissions_on_prompts')) {
+ $gallerySubmissions = GallerySubmission::where('user_id', Auth::user()->id)->where('status', 'Accepted')->orderBy('id', 'DESC')->get()->pluck('title', 'id');
+ $gallerySubmissions = $gallerySubmissions->map(function ($item, $key) {
+ return '"'.$item.'" by '.Auth::user()->name;
+ });
+ } else {
+ $gallerySubmissions = [];
+ }
+
return view('home.edit_submission', [
'closed' => $closed,
'isClaim' => false,
] + ($closed ? [] : [
- 'submission' => $submission,
- 'prompts' => Prompt::active()->sortAlphabetical()->pluck('name', 'id')->toArray(),
- 'characterCurrencies' => Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'),
- 'categories' => ItemCategory::orderBy('sort', 'DESC')->get(),
- 'item_filter' => Item::orderBy('name')->released()->get()->keyBy('id'),
- 'items' => Item::orderBy('name')->released()->pluck('name', 'id'),
- 'character_items' => Item::whereIn('item_category_id', ItemCategory::where('is_character_owned', 1)->pluck('id')->toArray())->orderBy('name')->released()->pluck('name', 'id'),
- 'currencies' => Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'),
- 'inventory' => $inventory,
- 'page' => 'submission',
- 'expanded_rewards' => config('lorekeeper.extensions.character_reward_expansion.expanded'),
- 'selectedInventory' => isset($submission->data['user']) ? parseAssetData($submission->data['user']) : null,
- 'count' => Submission::where('prompt_id', $submission->prompt_id)->where('status', 'Approved')->where('user_id', $submission->user_id)->count(),
+ 'submission' => $submission,
+ 'prompts' => Prompt::active()->sortAlphabetical()->pluck('name', 'id')->toArray(),
+ 'characterCurrencies' => Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'),
+ 'categories' => ItemCategory::orderBy('sort', 'DESC')->get(),
+ 'item_filter' => Item::orderBy('name')->released()->get()->keyBy('id'),
+ 'items' => Item::orderBy('name')->released()->pluck('name', 'id'),
+ 'character_items' => Item::whereIn('item_category_id', ItemCategory::where('is_character_owned', 1)->pluck('id')->toArray())->orderBy('name')->released()->pluck('name', 'id'),
+ 'currencies' => Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'),
+ 'inventory' => $inventory,
+ 'page' => 'submission',
+ 'expanded_rewards' => config('lorekeeper.extensions.character_reward_expansion.expanded'),
+ 'selectedInventory' => isset($submission->data['user']) ? parseAssetData($submission->data['user']) : null,
+ 'count' => Submission::where('prompt_id', $submission->prompt_id)->where('status', 'Approved')->where('user_id', $submission->user_id)->count(),
+ 'userGallerySubmissions' => $gallerySubmissions,
]));
}
@@ -173,6 +198,24 @@ public function getPromptInfo($id) {
]);
}
+ /**
+ * Shows prompt requirement information.
+ *
+ * @param int $id
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getPromptRequirementInfo($id) {
+ $prompt = Prompt::active()->where('id', $id)->first();
+ if (!$prompt) {
+ return response(404);
+ }
+
+ return view('home._prompt_requirements', [
+ 'prompt' => $prompt,
+ ]);
+ }
+
/**
* Creates a new submission.
*
@@ -183,7 +226,16 @@ public function getPromptInfo($id) {
*/
public function postNewSubmission(Request $request, SubmissionManager $service, $draft = false) {
$request->validate(Submission::$createRules);
- if ($submission = $service->createSubmission($request->only(['url', 'prompt_id', 'comments', 'slug', 'character_rewardable_type', 'character_rewardable_id', 'character_rewardable_quantity', 'rewardable_type', 'rewardable_id', 'quantity', 'stack_id', 'stack_quantity', 'currency_id', 'currency_quantity']), Auth::user(), false, $draft)) {
+ if ($submission = $service->createSubmission(
+ $request->only([
+ 'url', 'prompt_id', 'comments', 'slug', 'character_rewardable_type', 'character_rewardable_id', 'character_rewardable_quantity',
+ 'rewardable_type', 'rewardable_id', 'quantity', 'stack_id', 'stack_quantity', 'currency_id', 'currency_quantity',
+ 'gallery_submission_id',
+ ]),
+ Auth::user(),
+ false,
+ $draft
+ )) {
if ($submission->status == 'Draft') {
flash('Draft created successfully.')->success();
@@ -220,9 +272,17 @@ public function postEditSubmission(Request $request, SubmissionManager $service,
}
$request->validate(Submission::$updateRules);
- if ($submit && $service->editSubmission($submission, $request->only(['url', 'prompt_id', 'comments', 'slug', 'character_rewardable_type', 'character_rewardable_id', 'character_rewardable_quantity', 'rewardable_type', 'rewardable_id', 'quantity', 'stack_id', 'stack_quantity', 'currency_id', 'currency_quantity']), Auth::user(), false, $submit)) {
+ if ($submit && $service->editSubmission($submission, $request->only([
+ 'url', 'prompt_id', 'comments', 'slug', 'character_rewardable_type', 'character_rewardable_id', 'character_rewardable_quantity',
+ 'rewardable_type', 'rewardable_id', 'quantity', 'stack_id', 'stack_quantity', 'currency_id', 'currency_quantity',
+ 'gallery_submission_id',
+ ]), Auth::user(), false, $submit)) {
flash('Draft submitted successfully.')->success();
- } elseif ($service->editSubmission($submission, $request->only(['url', 'prompt_id', 'comments', 'slug', 'character_rewardable_type', 'character_rewardable_id', 'character_rewardable_quantity', 'rewardable_type', 'rewardable_id', 'quantity', 'stack_id', 'stack_quantity', 'currency_id', 'currency_quantity']), Auth::user())) {
+ } elseif ($service->editSubmission($submission, $request->only([
+ 'url', 'prompt_id', 'comments', 'slug', 'character_rewardable_type', 'character_rewardable_id', 'character_rewardable_quantity',
+ 'rewardable_type', 'rewardable_id', 'quantity', 'stack_id', 'stack_quantity', 'currency_id', 'currency_quantity',
+ 'gallery_submission_id',
+ ]), Auth::user())) {
flash('Draft saved successfully.')->success();
return redirect()->back();
@@ -354,16 +414,17 @@ public function getNewClaim(Request $request) {
'closed' => $closed,
'isClaim' => true,
] + ($closed ? [] : [
- 'submission' => new Submission,
- 'characterCurrencies' => Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'),
- 'categories' => ItemCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->get(),
- 'inventory' => $inventory,
- 'item_filter' => Item::orderBy('name')->released()->get()->keyBy('id'),
- 'items' => Item::orderBy('name')->released()->pluck('name', 'id'),
- 'currencies' => Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'),
- 'raffles' => Raffle::where('rolled_at', null)->where('is_active', 1)->orderBy('name')->pluck('name', 'id'),
- 'page' => 'submission',
- 'expanded_rewards' => config('lorekeeper.extensions.character_reward_expansion.expanded'),
+ 'submission' => new Submission,
+ 'characterCurrencies' => Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'),
+ 'categories' => ItemCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->get(),
+ 'inventory' => $inventory,
+ 'item_filter' => Item::orderBy('name')->released()->get()->keyBy('id'),
+ 'items' => Item::orderBy('name')->released()->pluck('name', 'id'),
+ 'currencies' => Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'),
+ 'raffles' => Raffle::where('rolled_at', null)->where('is_active', 1)->orderBy('name')->pluck('name', 'id'),
+ 'page' => 'submission',
+ 'expanded_rewards' => config('lorekeeper.extensions.character_reward_expansion.expanded'),
+ 'userGallerySubmissions' => [],
]));
}
@@ -386,18 +447,19 @@ public function getEditClaim(Request $request, $id) {
'closed' => $closed,
'isClaim' => true,
] + ($closed ? [] : [
- 'submission' => $submission,
- 'characterCurrencies' => Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'),
- 'character_items' => Item::whereIn('item_category_id', ItemCategory::where('is_character_owned', 1)->pluck('id')->toArray())->orderBy('name')->released()->pluck('name', 'id'),
- 'categories' => ItemCategory::orderBy('sort', 'DESC')->get(),
- 'currencies' => Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'),
- 'item_filter' => Item::orderBy('name')->released()->get()->keyBy('id'),
- 'items' => Item::orderBy('name')->released()->pluck('name', 'id'),
- 'inventory' => $inventory,
- 'raffles' => Raffle::where('rolled_at', null)->where('is_active', 1)->orderBy('name')->pluck('name', 'id'),
- 'page' => 'submission',
- 'expanded_rewards' => config('lorekeeper.extensions.character_reward_expansion.expanded'),
- 'selectedInventory' => isset($submission->data['user']) ? parseAssetData($submission->data['user']) : null,
+ 'submission' => $submission,
+ 'characterCurrencies' => Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'),
+ 'character_items' => Item::whereIn('item_category_id', ItemCategory::where('is_character_owned', 1)->pluck('id')->toArray())->orderBy('name')->released()->pluck('name', 'id'),
+ 'categories' => ItemCategory::orderBy('sort', 'DESC')->get(),
+ 'currencies' => Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'),
+ 'item_filter' => Item::orderBy('name')->released()->get()->keyBy('id'),
+ 'items' => Item::orderBy('name')->released()->pluck('name', 'id'),
+ 'inventory' => $inventory,
+ 'raffles' => Raffle::where('rolled_at', null)->where('is_active', 1)->orderBy('name')->pluck('name', 'id'),
+ 'page' => 'submission',
+ 'expanded_rewards' => config('lorekeeper.extensions.character_reward_expansion.expanded'),
+ 'selectedInventory' => isset($submission->data['user']) ? parseAssetData($submission->data['user']) : null,
+ 'userGallerySubmissions' => [],
]));
}
diff --git a/app/Http/Controllers/Users/TradeController.php b/app/Http/Controllers/Users/TradeController.php
index afc9020993..d7ce4f73e2 100644
--- a/app/Http/Controllers/Users/TradeController.php
+++ b/app/Http/Controllers/Users/TradeController.php
@@ -36,26 +36,8 @@ public function getIndex($status = 'open') {
$query->where('recipient_id', Auth::user()->id)->orWhere('sender_id', Auth::user()->id);
})->where('status', ucfirst($status))->orderBy('id', 'DESC');
- $stacks = [];
- foreach ($trades->get() as $trade) {
- foreach ($trade->data as $side=> $assets) {
- if (isset($assets['user_items'])) {
- $user_items = UserItem::with('item')->find(array_keys($assets['user_items']));
- $items = [];
- foreach ($assets['user_items'] as $id=> $quantity) {
- $user_item = $user_items->find($id);
- $user_item['quantity'] = $quantity;
- array_push($items, $user_item);
- }
- $items = collect($items)->groupBy('item_id');
- $stacks[$trade->id][$side] = $items;
- }
- }
- }
-
return view('home.trades.index', [
'trades' => $trades->paginate(20),
- 'stacks' => $stacks,
]);
}
@@ -100,12 +82,12 @@ public function getCreateTrade() {
->sortBy('item.name');
return view('home.trades.create_trade', [
- 'categories' => ItemCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->get(),
+ 'categories' => ItemCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->get(),
'item_filter' => Item::orderBy('name')->get()->keyBy('id'),
'inventory' => $inventory,
'userOptions' => User::visible()->where('id', '!=', Auth::user()->id)->orderBy('name')->pluck('name', 'id')->toArray(),
'characters' => Auth::user()->allCharacters()->visible()->tradable()->with('designUpdate')->get(),
- 'characterCategories' => CharacterCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->get(),
+ 'characterCategories' => CharacterCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->get(),
'page' => 'trade',
]);
}
@@ -136,12 +118,12 @@ public function getEditTrade($id) {
return view('home.trades.edit_trade', [
'trade' => $trade,
'partner' => (Auth::user()->id == $trade->sender_id) ? $trade->recipient : $trade->sender,
- 'categories' => ItemCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->get(),
+ 'categories' => ItemCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->get(),
'item_filter' => Item::orderBy('name')->get()->keyBy('id'),
'inventory' => $inventory,
'userOptions' => User::visible()->orderBy('name')->pluck('name', 'id')->toArray(),
'characters' => Auth::user()->allCharacters()->visible()->with('designUpdate')->get(),
- 'characterCategories' => CharacterCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->get(),
+ 'characterCategories' => CharacterCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->get(),
'page' => 'trade',
]);
}
diff --git a/app/Http/Controllers/Users/UserController.php b/app/Http/Controllers/Users/UserController.php
index 6aa87bc3ff..5697991fd1 100644
--- a/app/Http/Controllers/Users/UserController.php
+++ b/app/Http/Controllers/Users/UserController.php
@@ -12,6 +12,8 @@
use App\Models\Gallery\GallerySubmission;
use App\Models\Item\Item;
use App\Models\Item\ItemCategory;
+use App\Models\Prompt\Prompt;
+use App\Models\Rarity;
use App\Models\User\User;
use App\Models\User\UserCurrency;
use App\Models\User\UserUpdateLog;
@@ -106,7 +108,7 @@ public function getUserAliases($name) {
*/
public function getUserCharacters($name) {
$query = Character::myo(0)->where('user_id', $this->user->id);
- $imageQuery = CharacterImage::images(Auth::check() ? Auth::user() : null)->with('features')->with('rarity')->with('species')->with('features');
+ $imageQuery = CharacterImage::images(Auth::user() ?? null)->with('features')->with('rarity')->with('species')->with('features');
if ($sublists = Sublist::where('show_main', 0)->get()) {
$subCategories = [];
@@ -142,7 +144,7 @@ public function getUserCharacters($name) {
*/
public function getUserSublist($name, $key) {
$query = Character::myo(0)->where('user_id', $this->user->id);
- $imageQuery = CharacterImage::images(Auth::check() ? Auth::user() : null)->with('features')->with('rarity')->with('species')->with('features');
+ $imageQuery = CharacterImage::images(Auth::user() ?? null)->with('features')->with('rarity')->with('species')->with('features');
$sublist = Sublist::where('key', $key)->first();
if (!$sublist) {
@@ -197,10 +199,30 @@ public function getUserMyoSlots($name) {
*
* @return \Illuminate\Contracts\Support\Renderable
*/
- public function getUserInventory($name) {
- $categories = ItemCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->get();
+ public function getUserInventory(Request $request, $name) {
+ $categories = ItemCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->get();
+ $query = Item::query();
+ $data = $request->only(['item_category_id', 'name', 'artist', 'rarity_id']);
+ if (isset($data['item_category_id'])) {
+ $query->where('item_category_id', $data['item_category_id']);
+ }
+ if (isset($data['name'])) {
+ $query->where('name', 'LIKE', '%'.$data['name'].'%');
+ }
+ if (isset($data['artist'])) {
+ $query->where('artist_id', $data['artist']);
+ }
+ if (isset($data['rarity_id'])) {
+ if ($data['rarity_id'] == 'withoutOption') {
+ $query->whereNull('data->rarity_id');
+ } else {
+ $query->where('data->rarity_id', $data['rarity_id']);
+ }
+ }
+
$items = count($categories) ?
$this->user->items()
+ ->whereIn('items.id', $query->pluck('id')->toArray())
->where('count', '>', 0)
->orderByRaw('FIELD(item_category_id,'.implode(',', $categories->pluck('id')->toArray()).')')
->orderBy('name')
@@ -208,6 +230,7 @@ public function getUserInventory($name) {
->get()
->groupBy(['item_category_id', 'id']) :
$this->user->items()
+ ->whereIn('items.id', $query->pluck('id')->toArray())
->where('count', '>', 0)
->orderBy('name')
->orderBy('updated_at')
@@ -221,6 +244,8 @@ public function getUserInventory($name) {
'userOptions' => User::where('id', '!=', $this->user->id)->orderBy('name')->pluck('name', 'id')->toArray(),
'user' => $this->user,
'logs' => $this->user->getItemLogs(),
+ 'artists' => User::whereIn('id', Item::whereNotNull('artist_id')->pluck('artist_id')->toArray())->pluck('name', 'id')->toArray(),
+ 'rarities' => ['withoutOption' => 'No Rarity'] + Rarity::orderBy('rarities.sort', 'DESC')->pluck('name', 'id')->toArray(),
]);
}
@@ -238,7 +263,7 @@ public function getUserBank($name) {
'user' => $this->user,
'logs' => $this->user->getCurrencyLogs(),
] + (Auth::check() && Auth::user()->id == $this->user->id ? [
- 'currencyOptions' => Currency::where('allow_user_to_user', 1)->where('is_user_owned', 1)->whereIn('id', UserCurrency::where('user_id', $this->user->id)->pluck('currency_id')->toArray())->orderBy('sort_user', 'DESC')->pluck('name', 'id')->toArray(),
+ 'currencyOptions' => Currency::visible(Auth::user() ?? null)->where('allow_user_to_user', 1)->where('is_user_owned', 1)->whereIn('id', UserCurrency::where('user_id', $this->user->id)->pluck('currency_id')->toArray())->orderBy('sort_user', 'DESC')->pluck('name', 'id')->toArray(),
'userOptions' => User::where('id', '!=', Auth::user()->id)->orderBy('name')->pluck('name', 'id')->toArray(),
] : []));
}
@@ -296,10 +321,19 @@ public function getUserOwnershipLogs($name) {
*
* @return \Illuminate\Contracts\Support\Renderable
*/
- public function getUserSubmissions($name) {
+ public function getUserSubmissions(Request $request, $name) {
+ $logs = $this->user->getSubmissions(Auth::user() ?? null);
+ if ($request->get('prompt_ids')) {
+ $logs->whereIn('prompt_id', $request->get('prompt_ids'));
+ }
+ if ($request->get('sort')) {
+ $logs->orderBy('created_at', $request->get('sort') == 'newest' ? 'DESC' : 'ASC');
+ }
+
return view('user.submission_logs', [
- 'user' => $this->user,
- 'logs' => $this->user->getSubmissions(Auth::check() ? Auth::user() : null),
+ 'user' => $this->user,
+ 'logs' => $logs->paginate(30)->appends($request->query()),
+ 'prompts' => Prompt::active()->pluck('name', 'id'),
]);
}
@@ -317,6 +351,56 @@ public function getUserGallery(Request $request, $name) {
]);
}
+ /**
+ * Shows a user's character art.
+ *
+ * @param string $name
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getUserCharacterArt(Request $request, $name) {
+ $characters = Character::whereHas('image', function ($query) {
+ $query->whereHas('artists', function ($query) {
+ $query->where('user_id', $this->user->id);
+ });
+ });
+
+ if (!Auth::check() || !(Auth::check() && Auth::user()->hasPower('manage_characters'))) {
+ $characters->visible();
+ }
+
+ return view('user.character_designs', [
+ 'user' => $this->user,
+ 'characters' => $characters->get(),
+ 'isDesign' => false,
+ ]);
+ }
+
+ /**
+ * Shows a user's character designs.
+ *
+ * @param string $name
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getUserCharacterDesigns(Request $request, $name) {
+ $characters = Character::whereHas('image', function ($query) {
+ $query->whereHas('designers', function ($query) {
+ $query->where('user_id', $this->user->id);
+ });
+ });
+
+ if (!Auth::check() || !(Auth::check() && Auth::user()->hasPower('manage_characters'))) {
+ $characters->visible();
+ }
+
+ return view('user.character_designs', [
+ 'user' => $this->user,
+ 'characters' => $characters->get(),
+ 'isDesign' => true,
+ ]);
+ }
+
/**
* Shows a user's gallery submission favorites.
*
@@ -328,7 +412,7 @@ public function getUserFavorites(Request $request, $name) {
return view('user.favorites', [
'user' => $this->user,
'characters' => false,
- 'favorites' => GallerySubmission::whereIn('id', $this->user->galleryFavorites()->pluck('gallery_submission_id')->toArray())->visible(Auth::check() ? Auth::user() : null)->orderBy('created_at', 'DESC')->paginate(20)->appends($request->query()),
+ 'favorites' => GallerySubmission::whereIn('id', $this->user->galleryFavorites()->pluck('gallery_submission_id')->toArray())->visible(Auth::user() ?? null)->orderBy('created_at', 'DESC')->paginate(20)->appends($request->query()),
]);
}
@@ -347,7 +431,7 @@ public function getUserOwnCharacterFavorites(Request $request, $name) {
return view('user.favorites', [
'user' => $this->user,
'characters' => true,
- 'favorites' => $this->user->characters->count() ? GallerySubmission::whereIn('id', $userFavorites)->whereIn('id', GalleryCharacter::whereIn('character_id', $userCharacters)->pluck('gallery_submission_id')->toArray())->visible(Auth::check() ? Auth::user() : null)->orderBy('created_at', 'DESC')->paginate(20)->appends($request->query()) : null,
+ 'favorites' => $this->user->characters->count() ? GallerySubmission::whereIn('id', $userFavorites)->whereIn('id', GalleryCharacter::whereIn('character_id', $userCharacters)->pluck('gallery_submission_id')->toArray())->visible(Auth::user() ?? null)->orderBy('created_at', 'DESC')->paginate(20)->appends($request->query()) : null,
]);
}
}
diff --git a/app/Http/Controllers/WorldController.php b/app/Http/Controllers/WorldController.php
index 52b47eeee4..351c01632d 100644
--- a/app/Http/Controllers/WorldController.php
+++ b/app/Http/Controllers/WorldController.php
@@ -4,6 +4,7 @@
use App\Models\Character\CharacterCategory;
use App\Models\Currency\Currency;
+use App\Models\Currency\CurrencyCategory;
use App\Models\Feature\Feature;
use App\Models\Feature\FeatureCategory;
use App\Models\Item\Item;
@@ -37,19 +38,73 @@ public function getIndex() {
}
/**
- * Shows the currency page.
+ * Shows the currency categories page.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
- public function getCurrencies(Request $request) {
- $query = Currency::query();
+ public function getCurrencyCategories(Request $request) {
+ $query = CurrencyCategory::query();
$name = $request->get('name');
if ($name) {
- $query->where('name', 'LIKE', '%'.$name.'%')->orWhere('abbreviation', 'LIKE', '%'.$name.'%');
+ $query->where('name', 'LIKE', '%'.$name.'%');
+ }
+
+ return view('world.currency_categories', [
+ 'categories' => $query->visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->orderBy('id')->paginate(20)->appends($request->query()),
+ ]);
+ }
+
+ /**
+ * Shows the currency page.
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getCurrencies(Request $request) {
+ $query = Currency::query()->visible(Auth::user() ?? null)->with('category')->where(function ($query) {
+ $query->whereHas('category', function ($query) {
+ $query->visible(Auth::user() ?? null);
+ })->orWhereNull('currency_category_id');
+ });
+
+ $data = $request->only(['currency_category_id', 'name', 'sort']);
+ if (isset($data['name'])) {
+ $query->where(function ($query) use ($data) {
+ $query->where('name', 'LIKE', '%'.$data['name'].'%')->orWhere('abbreviation', 'LIKE', '%'.$data['name'].'%');
+ });
+ }
+ if (isset($data['currency_category_id'])) {
+ if ($data['currency_category_id'] == 'withoutOption') {
+ $query->whereNull('currency_category_id');
+ } else {
+ $query->where('currency_category_id', $data['currency_category_id']);
+ }
+ }
+
+ if (isset($data['sort'])) {
+ switch ($data['sort']) {
+ case 'alpha':
+ $query->sortAlphabetical();
+ break;
+ case 'alpha-reverse':
+ $query->sortAlphabetical(true);
+ break;
+ case 'category':
+ $query->sortCategory();
+ break;
+ case 'newest':
+ $query->sortNewest();
+ break;
+ case 'oldest':
+ $query->sortOldest();
+ break;
+ }
+ } else {
+ $query->sortCategory();
}
return view('world.currencies', [
- 'currencies' => $query->orderBy('name')->orderBy('id')->paginate(20)->appends($request->query()),
+ 'currencies' => $query->visible(Auth::user() ?? null)->orderBy('name')->orderBy('id')->paginate(20)->appends($request->query()),
+ 'categories' => ['withoutOption' => 'Without Category'] + CurrencyCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
]);
}
@@ -89,8 +144,8 @@ public function getSpecieses(Request $request) {
return view('world.specieses', [
'specieses' => $query->with(['subtypes' => function ($query) {
- $query->visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC');
- }])->visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->orderBy('id')->paginate(20)->appends($request->query()),
+ $query->visible(Auth::user() ?? null)->orderBy('sort', 'DESC');
+ }])->visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->orderBy('id')->paginate(20)->appends($request->query()),
]);
}
@@ -107,7 +162,7 @@ public function getSubtypes(Request $request) {
}
return view('world.subtypes', [
- 'subtypes' => $query->visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->orderBy('id')->paginate(20)->appends($request->query()),
+ 'subtypes' => $query->visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->orderBy('id')->paginate(20)->appends($request->query()),
]);
}
@@ -124,7 +179,7 @@ public function getItemCategories(Request $request) {
}
return view('world.item_categories', [
- 'categories' => $query->visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->orderBy('id')->paginate(20)->appends($request->query()),
+ 'categories' => $query->visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->orderBy('id')->paginate(20)->appends($request->query()),
]);
}
@@ -141,7 +196,7 @@ public function getFeatureCategories(Request $request) {
}
return view('world.feature_categories', [
- 'categories' => $query->visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->orderBy('id')->paginate(20)->appends($request->query()),
+ 'categories' => $query->visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->orderBy('id')->paginate(20)->appends($request->query()),
]);
}
@@ -151,7 +206,7 @@ public function getFeatureCategories(Request $request) {
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getFeatures(Request $request) {
- $query = Feature::visible(Auth::check() ? Auth::user() : null)->with('category', 'rarity', 'species', 'subtype');
+ $query = Feature::visible(Auth::user() ?? null)->with('category', 'rarity', 'species', 'subtype');
$data = $request->only(['rarity_id', 'feature_category_id', 'species_id', 'subtype_id', 'name', 'sort']);
@@ -220,9 +275,9 @@ public function getFeatures(Request $request) {
return view('world.features', [
'features' => $query->orderBy('id')->paginate(20)->appends($request->query()),
'rarities' => ['none' => 'Any Rarity'] + Rarity::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'specieses' => ['none' => 'Any Species'] + ['withoutOption' => 'Without Species'] + Species::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'subtypes' => ['none' => 'Any Subtype'] + ['withoutOption' => 'Without Subtype'] + Subtype::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'categories' => ['none' => 'Any Category'] + ['withoutOption' => 'Without Category'] + FeatureCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'specieses' => ['none' => 'Any Species'] + ['withoutOption' => 'Without Species'] + Species::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'subtypes' => ['none' => 'Any Subtype'] + ['withoutOption' => 'Without Subtype'] + Subtype::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'categories' => ['none' => 'Any Category'] + ['withoutOption' => 'Without Category'] + FeatureCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
]);
}
@@ -237,46 +292,25 @@ public function getSpeciesFeatures($id) {
$categories = FeatureCategory::orderBy('sort', 'DESC')->get();
$rarities = Rarity::orderBy('sort', 'ASC')->get();
- $species = Species::visible(Auth::check() ? Auth::user() : null)->where('id', $id)->first();
+ $species = Species::visible(Auth::user() ?? null)->where('id', $id)->first();
if (!$species) {
abort(404);
}
- if (!config('lorekeeper.extensions.species_trait_index.enable')) {
+ if (!config('lorekeeper.extensions.visual_trait_index.enable_species_index')) {
abort(404);
}
+ $features = $species->features()->visible(Auth::user() ?? null)->with('rarity', 'subtype');
$features = count($categories) ?
- $species->features()
- ->visible(Auth::check() ? Auth::user() : null)
- ->with('rarity', 'subtype')
- ->orderByRaw('FIELD(feature_category_id,'.implode(',', $categories->pluck('id')->toArray()).')')
- ->orderByRaw('FIELD(rarity_id,'.implode(',', $rarities->pluck('id')->toArray()).')')
- ->orderBy('has_image', 'DESC')
- ->orderBy('name')
- ->get()
- ->filter(function ($feature) {
- if ($feature->subtype) {
- return $feature->subtype->is_visible;
- }
-
- return true;
- })
- ->groupBy(['feature_category_id', 'id']) :
- $species->features()
- ->visible(Auth::check() ? Auth::user() : null)
- ->with('rarity', 'subtype')
- ->orderByRaw('FIELD(rarity_id,'.implode(',', $rarities->pluck('id')->toArray()).')')
- ->orderBy('has_image', 'DESC')
- ->orderBy('name')
- ->get()
- ->filter(function ($feature) {
- if ($feature->subtype) {
- return $feature->subtype->is_visible;
- }
-
- return true;
- })
- ->groupBy(['feature_category_id', 'id']);
+ $features->orderByRaw('FIELD(feature_category_id,'.implode(',', $categories->pluck('id')->toArray()).')') :
+ $features;
+ $features = $features->orderByRaw('FIELD(rarity_id,'.implode(',', $rarities->pluck('id')->toArray()).')')
+ ->orderBy('has_image', 'DESC')
+ ->orderBy('name')
+ ->get()->filter(function ($feature) {
+ return $feature->subtype?->is_visible !== 0;
+ })
+ ->groupBy(['feature_category_id', 'id']);
return view('world.species_features', [
'species' => $species,
@@ -287,20 +321,94 @@ public function getSpeciesFeatures($id) {
}
/**
- * Provides a single trait's description html for use in a modal.
+ * Shows a subtype's visual trait list.
*
- * @param mixed $speciesId
* @param mixed $id
*
* @return \Illuminate\Contracts\Support\Renderable
*/
- public function getSpeciesFeatureDetail($speciesId, $id) {
- $feature = Feature::where('id', $id)->with('species', 'subtype', 'rarity')->first();
+ public function getSubtypeFeatures($id, Request $request) {
+ $categories = FeatureCategory::orderBy('sort', 'DESC')->get();
+ $rarities = Rarity::orderBy('sort', 'ASC')->get();
+ $speciesBasics = $request->get('add_basics');
+ $subtype = Subtype::visible(Auth::user() ?? null)->where('id', $id)->first();
+ $species = Species::visible(Auth::user() ?? null)->where('id', $subtype->species->id)->first();
+ if (!$subtype) {
+ abort(404);
+ }
+ if (!config('lorekeeper.extensions.visual_trait_index.enable_subtype_index')) {
+ abort(404);
+ }
- if (!$feature) {
+ $features = $speciesBasics ? $species : $subtype;
+ $features = $features->features()->visible(Auth::user() ?? null);
+ $features = count($categories) ?
+ $features->orderByRaw('FIELD(feature_category_id,'.implode(',', $categories->pluck('id')->toArray()).')') :
+ $features;
+ $features = $features->orderByRaw('FIELD(rarity_id,'.implode(',', $rarities->pluck('id')->toArray()).')')
+ ->orderBy('has_image', 'DESC')
+ ->orderBy('name')
+ ->get();
+
+ if (!$speciesBasics) {
+ $features = $features->groupBy(['feature_category_id', 'id']);
+ } else {
+ $features = $features
+ ->filter(function ($feature) use ($subtype) {
+ return !($feature->subtype && $feature->subtype->id != $subtype->id);
+ })
+ ->groupBy(['feature_category_id', 'id']);
+ }
+
+ return view('world.subtype_features', [
+ 'subtype' => $subtype,
+ 'categories' => $categories->keyBy('id'),
+ 'rarities' => $rarities->keyBy('id'),
+ 'features' => $features,
+ ]);
+ }
+
+ /**
+ * Shows a universal visual trait list.
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getUniversalFeatures(Request $request) {
+ $categories = FeatureCategory::orderBy('sort', 'DESC')->get();
+ $rarities = Rarity::orderBy('sort', 'ASC')->get();
+
+ if (!config('lorekeeper.extensions.visual_trait_index.enable_universal_index')) {
abort(404);
}
- if (!config('lorekeeper.extensions.species_trait_index.trait_modals')) {
+
+ $features = Feature::whereNull('species_id')
+ ->visible(Auth::user() ?? null);
+ $features = count($categories) ?
+ $features->orderByRaw('FIELD(feature_category_id,'.implode(',', $categories->pluck('id')->toArray()).')') :
+ $features;
+ $features = $features->orderByRaw('FIELD(rarity_id,'.implode(',', $rarities->pluck('id')->toArray()).')')
+ ->orderBy('has_image', 'DESC')
+ ->orderBy('name')
+ ->get()->groupBy(['feature_category_id', 'id']);
+
+ return view('world.universal_features', [
+ 'categories' => $categories->keyBy('id'),
+ 'rarities' => $rarities->keyBy('id'),
+ 'features' => $features,
+ ]);
+ }
+
+ /**
+ * Provides a single trait's description html for use in a modal.
+ *
+ * @param mixed $id
+ *
+ * @return \Illuminate\Contracts\Support\Renderable
+ */
+ public function getFeatureDetail($id) {
+ $feature = Feature::visible(Auth::user() ?? null)->where('id', $id)->with('species', 'subtype', 'rarity')->first();
+
+ if (!$feature) {
abort(404);
}
@@ -326,8 +434,8 @@ public function getItems(Request $request) {
$query->where(function ($query) use ($categoryVisibleCheck) {
$query->whereIn('item_category_id', $categoryVisibleCheck)->orWhereNull('item_category_id');
});
- $data = $request->only(['item_category_id', 'name', 'sort', 'artist']);
- if (isset($data['item_category_id']) && $data['item_category_id'] != 'none') {
+ $data = $request->only(['item_category_id', 'name', 'sort', 'artist', 'rarity_id']);
+ if (isset($data['item_category_id'])) {
if ($data['item_category_id'] == 'withoutOption') {
$query->whereNull('item_category_id');
} else {
@@ -337,9 +445,16 @@ public function getItems(Request $request) {
if (isset($data['name'])) {
$query->where('name', 'LIKE', '%'.$data['name'].'%');
}
- if (isset($data['artist']) && $data['artist'] != 'none') {
+ if (isset($data['artist'])) {
$query->where('artist_id', $data['artist']);
}
+ if (isset($data['rarity_id'])) {
+ if ($data['rarity_id'] == 'withoutOption') {
+ $query->whereNull('data->rarity_id');
+ } else {
+ $query->where('data->rarity_id', $data['rarity_id']);
+ }
+ }
if (isset($data['sort'])) {
switch ($data['sort']) {
@@ -364,10 +479,11 @@ public function getItems(Request $request) {
}
return view('world.items', [
- 'items' => $query->orderBy('id')->paginate(20)->appends($request->query()),
- 'categories' => ['none' => 'Any Category'] + ['withoutOption' => 'Without Category'] + ItemCategory::visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'shops' => Shop::orderBy('sort', 'DESC')->get(),
- 'artists' => ['none' => 'Any Artist'] + User::whereIn('id', Item::whereNotNull('artist_id')->pluck('artist_id')->toArray())->pluck('name', 'id')->toArray(),
+ 'items' => $query->orderBy('id')->paginate(20)->appends($request->query()),
+ 'categories' => ['withoutOption' => 'Without Category'] + ItemCategory::visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'shops' => Shop::orderBy('sort', 'DESC')->get(),
+ 'artists' => User::whereIn('id', Item::whereNotNull('artist_id')->pluck('artist_id')->toArray())->pluck('name', 'id')->toArray(),
+ 'rarities' => ['withoutOption' => 'Without Rarity'] + Rarity::orderBy('rarities.sort', 'DESC')->pluck('name', 'id')->toArray(),
]);
}
@@ -418,7 +534,7 @@ public function getCharacterCategories(Request $request) {
}
return view('world.character_categories', [
- 'categories' => $query->visible(Auth::check() ? Auth::user() : null)->orderBy('sort', 'DESC')->orderBy('id')->paginate(20)->appends($request->query()),
+ 'categories' => $query->visible(Auth::user() ?? null)->orderBy('sort', 'DESC')->orderBy('id')->paginate(20)->appends($request->query()),
]);
}
}
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index c1de5fc42b..f8f41cfba4 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -13,12 +13,12 @@ class Kernel extends HttpKernel {
* @var array
*/
protected $middleware = [
- \App\Http\Middleware\CheckForMaintenanceMode::class,
+ Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
- \App\Http\Middleware\TrimStrings::class,
+ Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
- \App\Http\Middleware\TrustProxies::class,
- \App\Http\Middleware\ParsePostRequestFields::class,
+ Middleware\TrustProxies::class,
+ Middleware\ParsePostRequestFields::class,
];
/**
@@ -28,12 +28,12 @@ class Kernel extends HttpKernel {
*/
protected $middlewareGroups = [
'web' => [
- \App\Http\Middleware\EncryptCookies::class,
+ Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
- \App\Http\Middleware\VerifyCsrfToken::class,
+ Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
@@ -51,19 +51,20 @@ class Kernel extends HttpKernel {
* @var array
*/
protected $routeMiddleware = [
- 'auth' => \App\Http\Middleware\Authenticate::class,
+ 'auth' => Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
- 'alias' => \App\Http\Middleware\CheckAlias::class,
- 'power' => \App\Http\Middleware\CheckPower::class,
- 'admin' => \App\Http\Middleware\CheckAdmin::class,
- 'staff' => \App\Http\Middleware\CheckStaff::class,
- 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+ 'alias' => Middleware\CheckAlias::class,
+ 'power' => Middleware\CheckPower::class,
+ 'admin' => Middleware\CheckAdmin::class,
+ 'staff' => Middleware\CheckStaff::class,
+ 'guest' => Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
+ 'post.throttle' => Middleware\PostRequestThrottleMiddleware::class,
];
/**
@@ -76,7 +77,7 @@ class Kernel extends HttpKernel {
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
- \App\Http\Middleware\Authenticate::class,
+ Middleware\Authenticate::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
diff --git a/app/Http/Middleware/CheckAlias.php b/app/Http/Middleware/CheckAlias.php
index 764b1749d0..ef20b00543 100644
--- a/app/Http/Middleware/CheckAlias.php
+++ b/app/Http/Middleware/CheckAlias.php
@@ -21,6 +21,9 @@ public function handle($request, Closure $next) {
if (!$request->user()->hasAlias) {
return redirect('/link');
}
+ if (!$request->user()->hasEmail) {
+ return redirect('/email');
+ }
if (!$request->user()->birthday) {
return redirect('/birthday');
}
diff --git a/app/Http/Middleware/ParsePostRequestFields.php b/app/Http/Middleware/ParsePostRequestFields.php
index 8f64ed8a8d..f108b5c7fe 100644
--- a/app/Http/Middleware/ParsePostRequestFields.php
+++ b/app/Http/Middleware/ParsePostRequestFields.php
@@ -9,13 +9,13 @@ class ParsePostRequestFields {
/**
* Handle an incoming request.
*
- * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\RedirectResponse|\Illuminate\Http\Response) $next
+ * @param Closure(Request): (\Illuminate\Http\RedirectResponse|\Illuminate\Http\Response) $next
*
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response
*/
public function handle(Request $request, Closure $next) {
if ($request->isMethod('post')) {
- $excludedFields = ['_token', 'password', 'email', 'description', 'text', 'criteria'];
+ $excludedFields = ['_token', 'password', 'email', 'description', 'text', 'evaluation', 'criteria'];
$strippedFields = ['name', 'title'];
$parsedFields = [];
diff --git a/app/Http/Middleware/PostRequestThrottleMiddleware.php b/app/Http/Middleware/PostRequestThrottleMiddleware.php
new file mode 100644
index 0000000000..d22a69e4ec
--- /dev/null
+++ b/app/Http/Middleware/PostRequestThrottleMiddleware.php
@@ -0,0 +1,89 @@
+isMethod('get') || $request->is(...$allowedRoutes) || app()->environment('local')) {
+ return $next($request);
+ }
+
+ $key = $request->user()?->id ?: $request->ip();
+ $key .= $request->fullUrl(); // add current url to key to prevent rate limiting on different pages
+ $maxAttempts = 1;
+ $decaySeconds = 10;
+
+ if (RateLimiter::tooManyAttempts($key, $maxAttempts)) {
+ flash('Too many requests - please try again later.')->error()->important();
+ flash('Your initial action has likely been performed successfully. Please check to ensure this is the case before trying again.')->success()->important();
+
+ if ($request->user() && config('lorekeeper.settings.site_logging_webhook')) {
+ $webhookCooldown = 120;
+ $cacheKey = 'webhook_sent_'.$key;
+ if (!Cache::has($cacheKey)) {
+ Cache::put($cacheKey, true, $webhookCooldown);
+ $this->sendThrottleLogWebhook($request);
+ }
+ } else {
+ Log::channel('throttle')->info('Rate limited user', ['url' => $request->fullUrl(), 'user' => $request->user()?->name ?: $request->ip()]);
+ }
+
+ // If the response is from ajax it's not expecting a full redirect with the entire site bundled in as a response
+ return $request->ajax() ?
+ response("
Too many requests - please try again later.
Your initial action has likely been performed successfully. Please check to ensure this is the case before trying again.
")
+ : redirect()->back();
+ }
+
+ RateLimiter::hit($key, $decaySeconds);
+
+ return $next($request);
+ }
+
+ /**
+ * Sends a log to the site administrators that a user has been rate limited.
+ */
+ private function sendThrottleLogWebhook(Request $request): void {
+ $webhook = config('lorekeeper.settings.site_logging_webhook');
+ $data = [];
+
+ $author_data = [
+ 'name' => $request->user()->name,
+ 'url' => $request->user()->url,
+ 'icon_url' => $request->user()->avatarUrl,
+ ];
+ $data['username'] = config('lorekeeper.settings.site_name', 'Lorekeeper');
+ $data['avatar_url'] = url('favicon.ico');
+ $data['content'] = 'A user has been rate limited, url: '.$request->fullUrl();
+ $data['embeds'] = [[
+ 'color' => 6208428,
+ 'author' => $author_data ?? null,
+ 'title' => 'Rate Limited User',
+ 'description' => '',
+ ]];
+
+ $ch = curl_init($webhook);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-type: application/json']);
+ curl_setopt($ch, CURLOPT_POST, 1);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
+ curl_setopt($ch, CURLOPT_HEADER, 0);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ $response = curl_exec($ch);
+ curl_close($ch);
+ }
+}
diff --git a/app/Models/Character/Character.php b/app/Models/Character/Character.php
index 642d095865..b0f3301989 100644
--- a/app/Models/Character/Character.php
+++ b/app/Models/Character/Character.php
@@ -329,6 +329,17 @@ public function getFullNameAttribute() {
}
}
+ /**
+ * Gets the character's warnings, if they exist.
+ */
+ public function getWarningsAttribute() {
+ if (config('lorekeeper.settings.enable_character_content_warnings') && $this->image->content_warnings) {
+ return ' ';
+ }
+
+ return null;
+ }
+
/**
* Gets the character's page's URL.
*
@@ -360,6 +371,26 @@ public function getLogTypeAttribute() {
return 'Character';
}
+ /**
+ * Gets the character's trading, gift art and gift writing status as badges.
+ * If this is a MYO slot, only returns trading status.
+ *
+ * @return string
+ */
+ public function getMiniBadgeAttribute() {
+ $tradingCode = $this->is_trading ? 'badge-success' : 'badge-danger';
+ $tradingSection = " ";
+ $nonMyoSection = '';
+
+ if (!$this->is_myo_slot) {
+ $artCode = $this->is_gift_art_allowed == 1 ? 'badge-success' : ($this->is_gift_art_allowed == 2 ? 'badge-warning text-light' : 'badge-danger');
+ $writingCode = $this->is_gift_writing_allowed == 1 ? 'badge-success' : ($this->is_gift_writing_allowed == 2 ? 'badge-warning text-light' : 'badge-danger');
+ $nonMyoSection = " ";
+ }
+
+ return ' ・ ';
+ }
+
/**********************************************************************************************
OTHER FUNCTIONS
@@ -503,14 +534,14 @@ public function getSubmissions() {
return Submission::with('user.rank')->with('prompt')->where('status', 'Approved')->whereIn('id', SubmissionCharacter::where('character_id', $this->id)->pluck('submission_id')->toArray())->paginate(30);
// Untested
- //$character = $this;
- //return Submission::where('status', 'Approved')->with(['characters' => function($query) use ($character) {
+ // $character = $this;
+ // return Submission::where('status', 'Approved')->with(['characters' => function($query) use ($character) {
// $query->where('submission_characters.character_id', 1);
- //}])
- //->whereHas('characters', function($query) use ($character) {
+ // }])
+ // ->whereHas('characters', function($query) use ($character) {
// $query->where('submission_characters.character_id', 1);
- //});
- //return Submission::where('status', 'Approved')->where('user_id', $this->id)->orderBy('id', 'DESC')->paginate(30);
+ // });
+ // return Submission::where('status', 'Approved')->where('user_id', $this->id)->orderBy('id', 'DESC')->paginate(30);
}
/**
diff --git a/app/Models/Character/CharacterBookmark.php b/app/Models/Character/CharacterBookmark.php
index ab1ea479f0..4b943bf0ff 100644
--- a/app/Models/Character/CharacterBookmark.php
+++ b/app/Models/Character/CharacterBookmark.php
@@ -21,6 +21,7 @@ class CharacterBookmark extends Model {
* @var string
*/
protected $table = 'character_bookmarks';
+
/**
* Validation rules for creation.
*
diff --git a/app/Models/Character/CharacterCategory.php b/app/Models/Character/CharacterCategory.php
index e5c8dbeb7a..d96991fb83 100644
--- a/app/Models/Character/CharacterCategory.php
+++ b/app/Models/Character/CharacterCategory.php
@@ -110,7 +110,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getCategoryImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
diff --git a/app/Models/Character/CharacterDesignUpdate.php b/app/Models/Character/CharacterDesignUpdate.php
index 386703ff79..ef5ef38019 100644
--- a/app/Models/Character/CharacterDesignUpdate.php
+++ b/app/Models/Character/CharacterDesignUpdate.php
@@ -22,10 +22,10 @@ class CharacterDesignUpdate extends Model {
'character_id', 'status', 'user_id', 'staff_id',
'comments', 'staff_comments', 'data', 'extension',
'use_cropper', 'x0', 'x1', 'y0', 'y1',
- 'hash', 'species_id', 'subtype_id', 'rarity_id',
+ 'hash', 'species_id', 'subtype_ids', 'rarity_id',
'has_comments', 'has_image', 'has_addons', 'has_features',
'submitted_at', 'update_type', 'fullsize_hash',
- 'approval_votes', 'rejection_votes',
+ 'vote_data',
];
/**
@@ -42,6 +42,9 @@ class CharacterDesignUpdate extends Model {
*/
protected $casts = [
'submitted_at' => 'datetime',
+ 'subtype_ids' => 'array',
+ 'data' => 'array',
+ 'vote_data' => 'array',
];
/**
@@ -97,13 +100,6 @@ public function species() {
return $this->belongsTo(Species::class, 'species_id');
}
- /**
- * Get the subtype of the design update.
- */
- public function subtype() {
- return $this->belongsTo(Subtype::class, 'subtype_id');
- }
-
/**
* Get the rarity of the design update.
*/
@@ -212,15 +208,6 @@ public function scopeSortNewest($query) {
**********************************************************************************************/
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
-
/**
* Get the items (UserItem IDs) attached to this update request.
*
@@ -338,15 +325,6 @@ public function getUrlAttribute() {
return url('designs/'.$this->id);
}
- /**
- * Gets the voting data of the design update request.
- *
- * @return string
- */
- public function getVoteDataAttribute() {
- return collect(json_decode($this->attributes['vote_data'], true));
- }
-
/**********************************************************************************************
OTHER FUNCTIONS
@@ -377,4 +355,64 @@ public function getBank($type) {
return $result;
}
+
+ /**
+ * Get the subtypes of the design update.
+ */
+ public function subtypes() {
+ return $this->subtype_ids;
+ }
+
+ /**
+ * Get the subtypes of the design update.
+ */
+ public function displaySubtypes() {
+ $subtypes = $this->subtypes();
+ $result = [];
+ foreach ($subtypes as $subtype) {
+ $result[] = Subtype::find($subtype)->displayName;
+ }
+
+ return implode(', ', $result);
+ }
+
+ /**
+ * Gets the voting data of the gallery submission and performs preliminary processing.
+ *
+ * @param bool $withUsers
+ *
+ * @return array
+ */
+ public function getVoteData($withUsers = 0) {
+ $voteData['raw'] = $this->vote_data;
+
+ // Only query users if necessary, and condense to one query per submission
+ if ($withUsers) {
+ $users = User::whereIn('id', array_keys($voteData['raw']))->select('id', 'name', 'rank_id')->get();
+ } else {
+ $users = null;
+ }
+
+ $voteData['raw'] = collect($voteData['raw'])->mapWithKeys(function ($vote, $id) use ($users) {
+ return [$id => [
+ 'vote' => $vote,
+ 'user' => $users ? $users->where('id', $id)->first() : $id,
+ ]];
+ });
+
+ // Tally approve/reject sums for ease
+ $voteData['approve'] = $voteData['reject'] = 0;
+ foreach ($voteData['raw'] as $vote) {
+ switch ($vote['vote']) {
+ case 1:
+ $voteData['reject'] += 1;
+ break;
+ case 2:
+ $voteData['approve'] += 1;
+ break;
+ }
+ }
+
+ return $voteData;
+ }
}
diff --git a/app/Models/Character/CharacterImage.php b/app/Models/Character/CharacterImage.php
index ad39130a78..789f796dfe 100644
--- a/app/Models/Character/CharacterImage.php
+++ b/app/Models/Character/CharacterImage.php
@@ -18,11 +18,11 @@ class CharacterImage extends Model {
* @var array
*/
protected $fillable = [
- 'character_id', 'user_id', 'species_id', 'subtype_id', 'rarity_id', 'url',
+ 'character_id', 'user_id', 'species_id', 'rarity_id', 'url',
'extension', 'use_cropper', 'hash', 'fullsize_hash', 'fullsize_extension', 'sort',
'x0', 'x1', 'y0', 'y1',
'description', 'parsed_description',
- 'is_valid',
+ 'is_valid', 'content_warnings',
];
/**
@@ -32,6 +32,15 @@ class CharacterImage extends Model {
*/
protected $table = 'character_images';
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'content_warnings' => 'array',
+ ];
+
/**
* Whether the model contains timestamps to be saved and updated.
*
@@ -96,8 +105,8 @@ public function species() {
/**
* Get the subtype of the character image.
*/
- public function subtype() {
- return $this->belongsTo(Subtype::class, 'subtype_id');
+ public function subtypes() {
+ return $this->hasMany(CharacterImageSubtype::class, 'character_image_id');
}
/**
@@ -266,4 +275,58 @@ public function getThumbnailPathAttribute() {
public function getThumbnailUrlAttribute() {
return asset($this->imageDirectory.'/'.$this->thumbnailFileName);
}
+
+ /**
+ * Formats existing content warnings for editing.
+ *
+ * @return string
+ */
+ public function getEditWarningsAttribute() {
+ $contentWarnings = collect($this->content_warnings)->unique()->map(function ($warnings) {
+ return collect($warnings)->map(function ($warning) {
+ $lower = strtolower(trim($warning));
+
+ return ['warning' => ucwords($lower)];
+ });
+ })->sort()->flatten(1)->values()->toJson();
+
+ return $contentWarnings;
+ }
+
+ /**********************************************************************************************
+
+ OTHER FUNCTIONS
+
+ **********************************************************************************************/
+
+ /**
+ * Displays the image's subtypes as an imploded string.
+ */
+ public function displaySubtypes() {
+ if (!count($this->subtypes)) {
+ return 'None';
+ }
+ $subtypes = [];
+ foreach ($this->subtypes as $subtype) {
+ $subtypes[] = $subtype->subtype->displayName;
+ }
+
+ return implode(', ', $subtypes);
+ }
+
+ /**
+ * Determines if the character has content warning display.
+ *
+ * @param User
+ * @param mixed|null $user
+ *
+ * @return bool
+ */
+ public function showContentWarnings($user = null) {
+ if ($user) {
+ return $user->settings->content_warning_visibility < 1 && $this->content_warnings;
+ }
+
+ return count($this->content_warnings ?? []) > 0;
+ }
}
diff --git a/app/Models/Character/CharacterImageSubtype.php b/app/Models/Character/CharacterImageSubtype.php
new file mode 100644
index 0000000000..b2f53a0f2e
--- /dev/null
+++ b/app/Models/Character/CharacterImageSubtype.php
@@ -0,0 +1,51 @@
+belongsTo('App\Models\Character\CharacterImage', 'character_image_id');
+ }
+
+ /**
+ * Get the subtype associated with this record.
+ */
+ public function subtype() {
+ return $this->belongsTo(Subtype::class, 'subtype_id');
+ }
+}
diff --git a/app/Models/Character/CharacterItem.php b/app/Models/Character/CharacterItem.php
index dde652a0e2..e79f8f424d 100644
--- a/app/Models/Character/CharacterItem.php
+++ b/app/Models/Character/CharacterItem.php
@@ -25,6 +25,15 @@ class CharacterItem extends Model {
*/
protected $table = 'character_items';
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* Whether the model contains timestamps to be saved and updated.
*
@@ -58,15 +67,6 @@ public function item() {
**********************************************************************************************/
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
-
/**
* Checks if the stack is transferrable.
*
diff --git a/app/Models/Character/CharacterLog.php b/app/Models/Character/CharacterLog.php
index 343306f5fc..51e7ac77ab 100644
--- a/app/Models/Character/CharacterLog.php
+++ b/app/Models/Character/CharacterLog.php
@@ -22,6 +22,17 @@ class CharacterLog extends Model {
* @var string
*/
protected $table = 'character_log';
+
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ 'change_log' => 'array',
+ ];
+
/**
* Whether the model contains timestamps to be saved and updated.
*
@@ -74,13 +85,4 @@ public function getDisplayRecipientAliasAttribute() {
return '---';
}
}
-
- /**
- * Retrieves the changed data as an associative array.
- *
- * @return array
- */
- public function getChangedDataAttribute() {
- return json_decode($this->change_log, true);
- }
}
diff --git a/app/Models/Character/CharacterTransfer.php b/app/Models/Character/CharacterTransfer.php
index 5ecf904fab..de757ea8bb 100644
--- a/app/Models/Character/CharacterTransfer.php
+++ b/app/Models/Character/CharacterTransfer.php
@@ -23,6 +23,16 @@ class CharacterTransfer extends Model {
* @var string
*/
protected $table = 'character_transfers';
+
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* Whether the model contains timestamps to be saved and updated.
*
@@ -140,13 +150,4 @@ public function getIsActiveAttribute() {
return false;
}
-
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
}
diff --git a/app/Models/Comment/Comment.php b/app/Models/Comment/Comment.php
index a275354f9a..cb9681b0f1 100644
--- a/app/Models/Comment/Comment.php
+++ b/app/Models/Comment/Comment.php
@@ -131,4 +131,50 @@ public function getTopCommentAttribute() {
return $this->parent->topComment;
}
}
+
+ /**
+ * Gets the end of a comment's thread.
+ *
+ * @return Comment
+ */
+ public function getEndOfThreadAttribute() {
+ if ($this->children->count() > 0) {
+ return $this->children->sortByDesc('created_at')->first()->endOfThread;
+ } else {
+ return $this;
+ }
+ }
+
+ /**
+ * Returns the comment contents but with links in clickable format.
+ *
+ * @return string
+ */
+ public function getCommentAttribute() {
+ if (config('lorekeeper.settings.wysiwyg_comments')) {
+ return preg_replace_callback(
+ '/(?'.$domain.'';
+ },
+ $this->attributes['comment']
+ );
+ }
+
+ return preg_replace_callback(
+ '/(?attributes['comment']
+ );
+ }
}
diff --git a/app/Models/Comment/CommentEdit.php b/app/Models/Comment/CommentEdit.php
index cb50384018..c235ac5229 100644
--- a/app/Models/Comment/CommentEdit.php
+++ b/app/Models/Comment/CommentEdit.php
@@ -22,6 +22,15 @@ class CommentEdit extends Model {
*/
protected $table = 'comment_edits';
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* Whether the model contains timestamps to be saved and updated.
*
@@ -48,23 +57,4 @@ public function comment() {
public function user() {
return $this->belongsTo(User::class);
}
-
- /**********************************************************************************************
-
- ATTRIBUTES
-
- **********************************************************************************************/
-
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- if (!$this->id) {
- return null;
- }
-
- return json_decode($this->attributes['data'], true);
- }
}
diff --git a/app/Models/Currency/Currency.php b/app/Models/Currency/Currency.php
index 86776a09b0..9d0c251781 100644
--- a/app/Models/Currency/Currency.php
+++ b/app/Models/Currency/Currency.php
@@ -11,10 +11,10 @@ class Currency extends Model {
* @var array
*/
protected $fillable = [
- 'is_user_owned', 'is_character_owned',
+ 'is_user_owned', 'is_character_owned', 'currency_category_id',
'name', 'abbreviation', 'description', 'parsed_description', 'sort_user', 'sort_character',
'is_displayed', 'allow_user_to_user', 'allow_user_to_character', 'allow_character_to_user',
- 'has_icon', 'has_image', 'hash',
+ 'has_icon', 'has_image', 'hash', 'is_visible',
];
/**
@@ -49,6 +49,103 @@ class Currency extends Model {
'image' => 'mimes:png',
];
+ /**********************************************************************************************
+
+ RELATIONSHIPS
+
+ **********************************************************************************************/
+
+ /**
+ * Get the category the currency belongs to.
+ */
+ public function category() {
+ return $this->belongsTo(CurrencyCategory::class, 'currency_category_id');
+ }
+
+ /**********************************************************************************************
+
+ SCOPES
+
+ **********************************************************************************************/
+
+ /**
+ * Scope a query to sort currencies in alphabetical order.
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ * @param bool $reverse
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeSortAlphabetical($query, $reverse = false) {
+ return $query->orderBy('name', $reverse ? 'DESC' : 'ASC');
+ }
+
+ /**
+ * Scope a query to sort currencies in category order.
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeSortCategory($query) {
+ if (CurrencyCategory::all()->count()) {
+ return $query->orderBy(CurrencyCategory::select('sort')->whereColumn('currencies.currency_category_id', 'currency_categories.id'), 'DESC');
+ }
+
+ return $query;
+ }
+
+ /**
+ * Scope a query to sort currencies by newest first.
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeSortNewest($query) {
+ return $query->orderBy('id', 'DESC');
+ }
+
+ /**
+ * Scope a query to sort currencies oldest first.
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeSortOldest($query) {
+ return $query->orderBy('id');
+ }
+
+ /**
+ * Scope a query to show only visible currencies.
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ * @param mixed|null $user
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeVisible($query, $user = null) {
+ if ($user && $user->hasPower('edit_data')) {
+ return $query;
+ }
+
+ return $query->where('is_visible', 1);
+ }
+
+ /**********************************************************************************************
+
+ RELATIONSHIPS
+
+ **********************************************************************************************/
+
+ /**
+ * Get the conversion options for the currency.
+ */
+ public function conversions() {
+ return $this->hasMany(CurrencyConversion::class, 'currency_id');
+ }
+
/**********************************************************************************************
ACCESSORS
@@ -79,7 +176,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getCurrencyImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
@@ -88,7 +185,7 @@ public function getCurrencyImageFileNameAttribute() {
* @return string
*/
public function getCurrencyIconFileNameAttribute() {
- return $this->hash.$this->id.'-icon.png';
+ return $this->id.'-'.$this->hash.'-icon.png';
}
/**
diff --git a/app/Models/Currency/CurrencyCategory.php b/app/Models/Currency/CurrencyCategory.php
new file mode 100644
index 0000000000..91e29ae066
--- /dev/null
+++ b/app/Models/Currency/CurrencyCategory.php
@@ -0,0 +1,158 @@
+ 'required|unique:currency_categories|between:3,100',
+ 'description' => 'nullable',
+ 'image' => 'mimes:png',
+ ];
+
+ /**
+ * Validation rules for updating.
+ *
+ * @var array
+ */
+ public static $updateRules = [
+ 'name' => 'required|between:3,100',
+ 'description' => 'nullable',
+ 'image' => 'mimes:png',
+ ];
+
+ /**********************************************************************************************
+
+ SCOPES
+
+ **********************************************************************************************/
+
+ /**
+ * Scope a query to show only visible categories.
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ * @param mixed|null $user
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeVisible($query, $user = null) {
+ if ($user && $user->hasPower('edit_data')) {
+ return $query;
+ }
+
+ return $query->where('is_visible', 1);
+ }
+
+ /**********************************************************************************************
+
+ ACCESSORS
+
+ **********************************************************************************************/
+
+ /**
+ * Displays the model's name, linked to its encyclopedia page.
+ *
+ * @return string
+ */
+ public function getDisplayNameAttribute() {
+ return ''.$this->name.' ';
+ }
+
+ /**
+ * Gets the file directory containing the model's image.
+ *
+ * @return string
+ */
+ public function getImageDirectoryAttribute() {
+ return 'images/data/currency-categories';
+ }
+
+ /**
+ * Gets the file name of the model's image.
+ *
+ * @return string
+ */
+ public function getCategoryImageFileNameAttribute() {
+ return $this->id.'-'.$this->hash.'-image.png';
+ }
+
+ /**
+ * Gets the path to the file directory containing the model's image.
+ *
+ * @return string
+ */
+ public function getCategoryImagePathAttribute() {
+ return public_path($this->imageDirectory);
+ }
+
+ /**
+ * Gets the URL of the model's image.
+ *
+ * @return string
+ */
+ public function getCategoryImageUrlAttribute() {
+ if (!$this->has_image) {
+ return null;
+ }
+
+ return asset($this->imageDirectory.'/'.$this->categoryImageFileName);
+ }
+
+ /**
+ * Gets the URL of the model's encyclopedia page.
+ *
+ * @return string
+ */
+ public function getUrlAttribute() {
+ return url('world/currency-categories?name='.$this->name);
+ }
+
+ /**
+ * Gets the URL for an encyclopedia search of currencies in this category.
+ *
+ * @return string
+ */
+ public function getSearchUrlAttribute() {
+ return url('world/currencies?currency_category_id='.$this->id);
+ }
+
+ /**
+ * Gets the admin edit URL.
+ *
+ * @return string
+ */
+ public function getAdminUrlAttribute() {
+ return url('admin/data/currency-categories/edit/'.$this->id);
+ }
+
+ /**
+ * Gets the power required to edit this model.
+ *
+ * @return string
+ */
+ public function getAdminPowerAttribute() {
+ return 'edit_data';
+ }
+}
diff --git a/app/Models/Currency/CurrencyConversion.php b/app/Models/Currency/CurrencyConversion.php
new file mode 100644
index 0000000000..7c3cc859bb
--- /dev/null
+++ b/app/Models/Currency/CurrencyConversion.php
@@ -0,0 +1,101 @@
+ 'required|exists:currencies,id',
+ 'conversion_id' => 'required|exists:currencies,id',
+ 'rate' => 'required|numeric',
+ ];
+
+ /**
+ * Validation rules for updating.
+ *
+ * @var array
+ */
+ public static $updateRules = [
+ 'currency_id' => 'required|exists:currencies,id',
+ 'conversion_id' => 'required|exists:currencies,id',
+ 'rate' => 'required|numeric',
+ ];
+
+ /**********************************************************************************************
+
+ RELATIONSHIPS
+
+ **********************************************************************************************/
+
+ /**
+ * Get the currency that the conversion is for.
+ */
+ public function currency() {
+ return $this->belongsTo(Currency::class, 'currency_id');
+ }
+
+ /**
+ * Get the currency that is converted to.
+ */
+ public function convert() {
+ return $this->belongsTo(Currency::class, 'conversion_id');
+ }
+
+ /**********************************************************************************************
+
+ OTHER FUNCTIONS
+
+ **********************************************************************************************/
+
+ /**
+ * Gets the ratio based on the decimal conversion rate.
+ *
+ * @param mixed $return
+ */
+ public function ratio($return = false) {
+ $numerator = $this->rate * 100; // Convert rate to avoid floating point issues
+ $denominator = 100;
+ $divisor = $this->gcd($numerator, $denominator); // Find GCD to simplify ratio
+
+ // Simplify the ratio
+ $numerator /= $divisor;
+ $denominator /= $divisor;
+
+ if ($return) {
+ return [$numerator, $denominator];
+ }
+
+ return $numerator.':'.$denominator;
+ }
+
+ /**
+ * Gets the greatest common divisor of two numbers.
+ *
+ * @param mixed $a
+ * @param mixed $b
+ */
+ private function gcd($a, $b) {
+ return $b ? $this->gcd($b, $a % $b) : $a;
+ }
+}
diff --git a/app/Models/Feature/Feature.php b/app/Models/Feature/Feature.php
index f943491026..a5e64b9276 100644
--- a/app/Models/Feature/Feature.php
+++ b/app/Models/Feature/Feature.php
@@ -229,7 +229,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
@@ -269,7 +269,7 @@ public function getUrlAttribute() {
* @return string
*/
public function getSearchUrlAttribute() {
- return url('masterlist?feature_id[]='.$this->id);
+ return url('masterlist?feature_ids[]='.$this->id);
}
/**
diff --git a/app/Models/Feature/FeatureCategory.php b/app/Models/Feature/FeatureCategory.php
index babda9e390..b691273974 100644
--- a/app/Models/Feature/FeatureCategory.php
+++ b/app/Models/Feature/FeatureCategory.php
@@ -95,7 +95,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getCategoryImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
diff --git a/app/Models/Gallery/GallerySubmission.php b/app/Models/Gallery/GallerySubmission.php
index a9ab154304..dc8248f6e3 100644
--- a/app/Models/Gallery/GallerySubmission.php
+++ b/app/Models/Gallery/GallerySubmission.php
@@ -35,6 +35,16 @@ class GallerySubmission extends Model {
*/
protected $table = 'gallery_submissions';
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ 'vote_data' => 'array',
+ ];
+
/**
* The relationships that should always be loaded.
*
@@ -348,15 +358,6 @@ public function getThumbnailUrlAttribute() {
return asset($this->imageDirectory.'/'.$this->thumbnailFileName);
}
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
-
/**
* Get the title of the submission, with prefix.
*
@@ -542,7 +543,7 @@ public function getExcerptAttribute() {
* @return array
*/
public function getVoteData($withUsers = 0) {
- $voteData['raw'] = json_decode($this->attributes['vote_data'], true);
+ $voteData['raw'] = $this->vote_data;
// Only query users if necessary, and condense to one query per submission
if ($withUsers) {
diff --git a/app/Models/Invitation.php b/app/Models/Invitation.php
index f124fdd051..844b335715 100644
--- a/app/Models/Invitation.php
+++ b/app/Models/Invitation.php
@@ -20,6 +20,7 @@ class Invitation extends Model {
* @var string
*/
protected $table = 'invitations';
+
/**
* Whether the model contains timestamps to be saved and updated.
*
diff --git a/app/Models/Item/Item.php b/app/Models/Item/Item.php
index fab8a78f24..f0975bcbb2 100644
--- a/app/Models/Item/Item.php
+++ b/app/Models/Item/Item.php
@@ -4,6 +4,7 @@
use App\Models\Model;
use App\Models\Prompt\Prompt;
+use App\Models\Rarity;
use App\Models\Shop\Shop;
use App\Models\Shop\ShopStock;
use App\Models\User\User;
@@ -16,7 +17,7 @@ class Item extends Model {
*/
protected $fillable = [
'item_category_id', 'name', 'has_image', 'description', 'parsed_description', 'allow_transfer',
- 'data', 'reference_url', 'artist_alias', 'artist_url', 'artist_id', 'is_released', 'hash',
+ 'data', 'reference_url', 'artist_alias', 'artist_url', 'artist_id', 'is_released', 'hash', 'is_deletable',
];
protected $appends = ['image_url'];
@@ -28,6 +29,15 @@ class Item extends Model {
*/
protected $table = 'items';
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* The relationships that should always be loaded.
*
@@ -43,15 +53,15 @@ class Item extends Model {
* @var array
*/
public static $createRules = [
- 'item_category_id' => 'nullable',
- 'name' => 'required|unique:items|between:3,100',
- 'description' => 'nullable',
- 'image' => 'mimes:png',
- 'rarity' => 'nullable',
- 'reference_url' => 'nullable|between:3,200',
- 'uses' => 'nullable|between:3,250',
- 'release' => 'nullable|between:3,100',
- 'currency_quantity' => 'nullable|integer|min:1',
+ 'item_category_id' => 'nullable',
+ 'name' => 'required|unique:items|between:3,100',
+ 'description' => 'nullable',
+ 'image' => 'mimes:png',
+ 'rarity_id' => 'nullable',
+ 'reference_url' => 'nullable|between:3,200',
+ 'uses' => 'nullable|between:3,250',
+ 'release' => 'nullable|between:3,100',
+ 'currency_quantity' => 'nullable|integer|min:1',
];
/**
@@ -97,11 +107,18 @@ public function artist() {
return $this->belongsTo(User::class, 'artist_id');
}
+ /**
+ * Gets the item's rarity.
+ */
+ public function rarity() {
+ return $this->belongsTo(Rarity::class, $this->attributes['rarity_id'] ?? null, 'id');
+ }
+
/**
* Get shop stock for this item.
*/
public function shopStock() {
- return $this->hasMany(ShopStock::class, 'item_id');
+ return $this->hasMany(ShopStock::class, 'item_id')->where('is_visible', 1);
}
/**********************************************************************************************
@@ -205,7 +222,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
@@ -295,30 +312,17 @@ public function getReferenceAttribute() {
return $this->reference_url;
}
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- if (!$this->id) {
- return null;
- }
-
- return json_decode($this->attributes['data'], true);
- }
-
/**
* Get the rarity attribute.
*
* @return string
*/
- public function getRarityAttribute() {
- if (!isset($this->data) || !isset($this->data['rarity'])) {
+ public function getRarityIdAttribute() {
+ if (!isset($this->data) || !isset($this->data['rarity_id'])) {
return null;
}
- return $this->data['rarity'];
+ return $this->data['rarity_id'];
}
/**
@@ -360,21 +364,6 @@ public function getResellAttribute() {
return collect($this->data['resell']);
}
- /**
- * Get the shops that stock this item.
- *
- * @return \Illuminate\Database\Eloquent\Collection
- */
- public function getShopsAttribute() {
- if (!config('lorekeeper.extensions.item_entry_expansion.extra_fields') || !$this->shop_stock_count) {
- return null;
- }
-
- $shops = Shop::whereIn('id', $this->shopStock->pluck('shop_id')->toArray())->orderBy('sort', 'DESC')->get();
-
- return $shops;
- }
-
/**
* Get the prompts attribute as an associative array.
*
@@ -433,9 +422,32 @@ public function hasTag($tag) {
*
* @param mixed $tag
*
- * @return \App\Models\Item\ItemTag
+ * @return ItemTag
*/
public function tag($tag) {
return $this->tags()->where('tag', $tag)->where('is_active', 1)->first();
}
+
+ /**
+ * Get the shops that stock this item.
+ *
+ * @param mixed|null $user
+ *
+ * @return \Illuminate\Database\Eloquent\Collection
+ */
+ public function shops($user = null) {
+ if (!config('lorekeeper.extensions.item_entry_expansion.extra_fields') || !$this->shop_stock_count) {
+ return null;
+ }
+
+ $shops = Shop::where(function ($query) use ($user) {
+ if ($user && $user->hasPower('edit_data')) {
+ return $query;
+ }
+
+ return $query->where('is_hidden', 0)->where('is_staff', 0);
+ })->whereIn('id', $this->shopStock->pluck('shop_id')->toArray())->get();
+
+ return $shops;
+ }
}
diff --git a/app/Models/Item/ItemCategory.php b/app/Models/Item/ItemCategory.php
index fc48cd19bf..63fd762b42 100644
--- a/app/Models/Item/ItemCategory.php
+++ b/app/Models/Item/ItemCategory.php
@@ -95,7 +95,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getCategoryImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
diff --git a/app/Models/Item/ItemTag.php b/app/Models/Item/ItemTag.php
index 5f5bc5b815..c068b2c5a3 100644
--- a/app/Models/Item/ItemTag.php
+++ b/app/Models/Item/ItemTag.php
@@ -22,6 +22,15 @@ class ItemTag extends Model {
*/
protected $table = 'item_tags';
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**********************************************************************************************
RELATIONS
@@ -102,15 +111,6 @@ public function getAdminUrlAttribute() {
return url('admin/data/items/tag/'.$this->item_id.'/'.$this->tag);
}
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
-
/**
* Get the service associated with this tag.
*
@@ -119,7 +119,7 @@ public function getDataAttribute() {
public function getServiceAttribute() {
$class = 'App\Services\Item\\'.str_replace(' ', '', ucwords(str_replace('_', ' ', $this->tag))).'Service';
- return new $class();
+ return new $class;
}
/**********************************************************************************************
@@ -134,7 +134,7 @@ public function getServiceAttribute() {
* @return mixed
*/
public function getEditData() {
- return $this->service->getEditData();
+ return $this->service->getEditData($this);
}
/**
diff --git a/app/Models/Limit/DynamicLimit.php b/app/Models/Limit/DynamicLimit.php
new file mode 100644
index 0000000000..208871802b
--- /dev/null
+++ b/app/Models/Limit/DynamicLimit.php
@@ -0,0 +1,58 @@
+name.' Check';
+ }
+
+ /**********************************************************************************************
+
+ OTHER FUNCTIONS
+
+ **********************************************************************************************/
+
+ /**
+ * preforms the evaluation of the dynamic limit in a try / except and returns true or false
+ * if the evaluation is fails.
+ */
+ public function evaluate() {
+ try {
+ $eval = preg_replace('/<\?php/', '', $this->evaluation);
+ $eval = preg_replace('/\n/', '', $eval);
+ $eval = preg_replace('/\r/', '', $eval);
+
+ return eval($eval);
+ } catch (\Throwable $th) {
+ return false;
+ }
+ }
+}
diff --git a/app/Models/Limit/Limit.php b/app/Models/Limit/Limit.php
new file mode 100644
index 0000000000..422fb243ef
--- /dev/null
+++ b/app/Models/Limit/Limit.php
@@ -0,0 +1,88 @@
+belongsTo($this->object_model, 'object_id');
+ }
+
+ /**
+ * gets the limit of this ... limit.
+ */
+ public function limit() {
+ switch ($this->limit_type) {
+ case 'prompt':
+ return $this->belongsTo(Prompt::class, 'limit_id');
+ case 'item':
+ return $this->belongsTo(Item::class, 'limit_id');
+ case 'currency':
+ return $this->belongsTo(Currency::class, 'limit_id');
+ case 'dynamic':
+ return $this->belongsTo(DynamicLimit::class, 'limit_id');
+ }
+ }
+
+ /**********************************************************************************************
+
+ OTHER FUNCTIONS
+
+ **********************************************************************************************/
+
+ /**
+ * checks if a certain object has any limits.
+ *
+ * @param mixed $object
+ */
+ public static function hasLimits($object) {
+ return self::where('object_model', get_class($object))->where('object_id', $object->id)->exists();
+ }
+
+ /**
+ * get the limits of a certain object.
+ *
+ * @param mixed $object
+ */
+ public static function getLimits($object) {
+ return self::where('object_model', get_class($object))->where('object_id', $object->id)->get();
+ }
+
+ /**
+ * Checks if a user has unlocked this.
+ *
+ * @param mixed $user
+ */
+ public function isUnlocked($user) {
+ return $this->is_unlocked && $user->unlockedLimits()->where('object_model', $this->object_model)->where('object_id', $this->object_id)->exists();
+ }
+}
diff --git a/app/Models/Limit/UserUnlockedLimit.php b/app/Models/Limit/UserUnlockedLimit.php
new file mode 100644
index 0000000000..ccf18862a1
--- /dev/null
+++ b/app/Models/Limit/UserUnlockedLimit.php
@@ -0,0 +1,37 @@
+belongsTo(User::class);
+ }
+}
diff --git a/app/Models/Loot/Loot.php b/app/Models/Loot/Loot.php
index d69bae2243..673f8c2d12 100644
--- a/app/Models/Loot/Loot.php
+++ b/app/Models/Loot/Loot.php
@@ -24,6 +24,16 @@ class Loot extends Model {
* @var string
*/
protected $table = 'loots';
+
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* Validation rules for creation.
*
@@ -78,23 +88,4 @@ public function reward() {
return null;
}
-
- /**********************************************************************************************
-
- ACCESSORS
-
- **********************************************************************************************/
-
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- if (!$this->attributes['data']) {
- return null;
- }
-
- return json_decode($this->attributes['data'], true);
- }
}
diff --git a/app/Models/Loot/LootTable.php b/app/Models/Loot/LootTable.php
index b66a6a0232..a249e5625d 100644
--- a/app/Models/Loot/LootTable.php
+++ b/app/Models/Loot/LootTable.php
@@ -4,6 +4,7 @@
use App\Models\Item\Item;
use App\Models\Model;
+use App\Models\Rarity;
class LootTable extends Model {
/**
@@ -167,11 +168,20 @@ public function rollCategory($id, $quantity = 1, $criteria = null, $rarity = nul
$rewards = createAssetsArray();
if (isset($criteria) && $criteria && isset($rarity) && $rarity) {
- if (config('lorekeeper.extensions.item_entry_expansion.loot_tables.alternate_filtering')) {
- $loot = Item::where('item_category_id', $id)->released()->whereNotNull('data')->where('data->rarity', $criteria, $rarity)->get();
- } else {
- $loot = Item::where('item_category_id', $id)->released()->whereNotNull('data')->whereRaw('JSON_EXTRACT(`data`, \'$.rarity\')'.$criteria.$rarity)->get();
+ $rarity = Rarity::find($rarity);
+ if (!$rarity) {
+ throw new \Exception('Invalid rarity!');
}
+
+ $loot = Item::where('item_category_id', $id)->released()->whereNotNull('data')->get()->filter(function ($item) use ($criteria, $rarity) {
+ $itemRarity = Rarity::find($item->data['rarity_id'] ?? null);
+ if (!$itemRarity) {
+ return false;
+ }
+
+ // check the sort order of the rarity
+ return eval('return '.$itemRarity->sort.$criteria.$rarity->sort.';');
+ })->values();
} else {
$loot = Item::where('item_category_id', $id)->released()->get();
}
@@ -206,11 +216,20 @@ public function rollCategory($id, $quantity = 1, $criteria = null, $rarity = nul
public function rollRarityItem($quantity, $criteria, $rarity) {
$rewards = createAssetsArray();
- if (config('lorekeeper.extensions.item_entry_expansion.loot_tables.alternate_filtering')) {
- $loot = Item::released()->whereNotNull('data')->where('data->rarity', $criteria, $rarity)->get();
- } else {
- $loot = Item::released()->whereNotNull('data')->whereRaw('JSON_EXTRACT(`data`, \'$.rarity\')'.$criteria.$rarity)->get();
+ $rarity = Rarity::find($rarity);
+ if (!$rarity) {
+ throw new \Exception('Invalid rarity!');
}
+
+ $loot = Item::released()->whereNotNull('data')->get()->filter(function ($item) use ($criteria, $rarity) {
+ $itemRarity = Rarity::find($item->data['rarity_id'] ?? null);
+ if (!$itemRarity) {
+ return false;
+ }
+
+ // check the sort order of the rarity
+ return eval('return '.$itemRarity->sort.$criteria.$rarity->sort.';');
+ })->values();
if (!$loot->count()) {
throw new \Exception('There are no items to select from!');
}
diff --git a/app/Models/Model.php b/app/Models/Model.php
index 7525891258..33938e9b25 100644
--- a/app/Models/Model.php
+++ b/app/Models/Model.php
@@ -2,6 +2,9 @@
namespace App\Models;
+use App\Models\Prompt\Prompt;
+use App\Models\Submission\Submission;
+use App\Services\LimitManager;
use Illuminate\Database\Eloquent\Model as EloquentModel;
class Model extends EloquentModel {
@@ -11,4 +14,48 @@ class Model extends EloquentModel {
* @var string
*/
public $timestamps = false;
+
+ protected static function boot() {
+ parent::boot();
+
+ $service = new LimitManager;
+ $object = null;
+ static::creating(function ($model) use ($service, $object) {
+ switch (get_class($model)) {
+ case Submission::class:
+ if ($model->status == 'Pending') {
+ return true;
+ }
+ $object = Prompt::find($model->prompt_id);
+ break;
+ }
+
+ if (!$object) {
+ return true;
+ }
+
+ if (!$service->checkLimits($object)) {
+ throw new \Exception($service->errors()->getMessages()['error'][0]);
+ }
+ });
+
+ static::updating(function ($model) use ($service, $object) {
+ switch (get_class($model)) {
+ case Submission::class:
+ if ($model->status != 'Pending' || $model->staff_comments || $model->staff_id) {
+ return true;
+ }
+ $object = Prompt::find($model->prompt_id);
+ break;
+ }
+
+ if (!$object) {
+ return true;
+ }
+
+ if (!$service->checkLimits($object)) {
+ throw new \Exception($service->errors()->getMessages()['error'][0]);
+ }
+ });
+ }
}
diff --git a/app/Models/News.php b/app/Models/News.php
index 669a96dab5..8467889b6b 100644
--- a/app/Models/News.php
+++ b/app/Models/News.php
@@ -86,10 +86,15 @@ public function user() {
* Scope a query to only include visible posts.
*
* @param \Illuminate\Database\Eloquent\Builder $query
+ * @param mixed|null $user
*
* @return \Illuminate\Database\Eloquent\Builder
*/
- public function scopeVisible($query) {
+ public function scopeVisible($query, $user = null) {
+ if ($user && $user->hasPower('manage_news')) {
+ return $query;
+ }
+
return $query->where('is_visible', 1);
}
diff --git a/app/Models/Notification.php b/app/Models/Notification.php
index 519d55ff0a..ff439e6ccb 100644
--- a/app/Models/Notification.php
+++ b/app/Models/Notification.php
@@ -21,6 +21,15 @@ class Notification extends Model {
*/
protected $table = 'notifications';
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* Whether the model contains timestamps to be saved and updated.
*
@@ -47,15 +56,6 @@ public function user() {
**********************************************************************************************/
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
-
/**
* Get the notification message using the stored data.
*
diff --git a/app/Models/Prompt/Prompt.php b/app/Models/Prompt/Prompt.php
index 02d44fbc2a..5a79c97d1b 100644
--- a/app/Models/Prompt/Prompt.php
+++ b/app/Models/Prompt/Prompt.php
@@ -255,7 +255,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
diff --git a/app/Models/Prompt/PromptCategory.php b/app/Models/Prompt/PromptCategory.php
index 6f0924eb2d..0b0f98efe6 100644
--- a/app/Models/Prompt/PromptCategory.php
+++ b/app/Models/Prompt/PromptCategory.php
@@ -72,7 +72,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getCategoryImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
diff --git a/app/Models/Rank/Rank.php b/app/Models/Rank/Rank.php
index 83e48eb7d4..31e2d080b2 100644
--- a/app/Models/Rank/Rank.php
+++ b/app/Models/Rank/Rank.php
@@ -13,6 +13,7 @@ class Rank extends Model {
*/
protected $fillable = [
'name', 'description', 'parsed_description', 'sort', 'color', 'icon',
+ 'is_admin',
];
/**
@@ -21,6 +22,7 @@ class Rank extends Model {
* @var string
*/
protected $table = 'ranks';
+
/**
* Validation rules for ranks.
*
@@ -71,11 +73,7 @@ public function getDisplayNameAttribute() {
* @return bool
*/
public function getIsAdminAttribute() {
- if ($this->id == self::orderBy('sort', 'DESC')->first()->id) {
- return true;
- }
-
- return false;
+ return $this->attributes['is_admin'];
}
/**********************************************************************************************
@@ -87,7 +85,7 @@ public function getIsAdminAttribute() {
/**
* Checks if the current rank is high enough to edit a given rank.
*
- * @param \App\Models\Rank\Rank $rank
+ * @param Rank $rank
*
* @return int
*/
@@ -114,7 +112,7 @@ public function canEditRank($rank) {
/**
* Checks if the rank has a given power.
*
- * @param \App\Models\Rank\RankPower $power
+ * @param RankPower $power
*
* @return bool
*/
diff --git a/app/Models/Rarity.php b/app/Models/Rarity.php
index ad4017b076..a19066b6c8 100644
--- a/app/Models/Rarity.php
+++ b/app/Models/Rarity.php
@@ -72,7 +72,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getRarityImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
@@ -107,7 +107,7 @@ public function getUrlAttribute() {
}
/**
- * Gets the URL for an encyclopedia search of features (character traits) in this category.
+ * Gets the URL for an encyclopedia search of features (character traits) of this rarity.
*
* @return string
*/
@@ -115,6 +115,13 @@ public function getSearchFeaturesUrlAttribute() {
return url('world/traits?rarity_id='.$this->id);
}
+ /**
+ * Gets the URL for an encyclopedia search of items of this rarity.
+ */
+ public function getSearchItemsUrlAttribute() {
+ return url('world/items?rarity_id='.$this->id);
+ }
+
/**
* Gets the URL for a masterlist search of characters of this rarity.
*
diff --git a/app/Models/Report/Report.php b/app/Models/Report/Report.php
index 5c9e76733b..6bad46e5e9 100644
--- a/app/Models/Report/Report.php
+++ b/app/Models/Report/Report.php
@@ -27,6 +27,15 @@ class Report extends Model {
*/
protected $table = 'reports';
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* Whether the model contains timestamps to be saved and updated.
*
@@ -150,15 +159,6 @@ public function scopeSortNewest($query) {
**********************************************************************************************/
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
-
/**
* Get the viewing URL of the report/claim.
*
diff --git a/app/Models/Sales/Sales.php b/app/Models/Sales/Sales.php
index 8c8b183bf3..b82be40071 100644
--- a/app/Models/Sales/Sales.php
+++ b/app/Models/Sales/Sales.php
@@ -96,10 +96,15 @@ public function characters() {
* Scope a query to only include visible posts.
*
* @param \Illuminate\Database\Eloquent\Builder $query
+ * @param mixed|null $user
*
* @return \Illuminate\Database\Eloquent\Builder
*/
- public function scopeVisible($query) {
+ public function scopeVisible($query, $user = null) {
+ if ($user && $user->hasPower('manage_sales')) {
+ return $query;
+ }
+
return $query->where('is_visible', 1);
}
diff --git a/app/Models/Sales/SalesCharacter.php b/app/Models/Sales/SalesCharacter.php
index 6cfa1d699d..807e0bd989 100644
--- a/app/Models/Sales/SalesCharacter.php
+++ b/app/Models/Sales/SalesCharacter.php
@@ -22,6 +22,16 @@ class SalesCharacter extends Model {
* @var string
*/
protected $table = 'sales_characters';
+
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* Validation rules.
*
@@ -73,15 +83,6 @@ public function image() {
**********************************************************************************************/
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
-
/**
* Get the data attribute as an associative array.
*
diff --git a/app/Models/Shop/Shop.php b/app/Models/Shop/Shop.php
index 4f1b9457fc..dd48aa264a 100644
--- a/app/Models/Shop/Shop.php
+++ b/app/Models/Shop/Shop.php
@@ -4,6 +4,7 @@
use App\Models\Item\Item;
use App\Models\Model;
+use Carbon\Carbon;
class Shop extends Model {
/**
@@ -12,7 +13,8 @@ class Shop extends Model {
* @var array
*/
protected $fillable = [
- 'name', 'sort', 'has_image', 'description', 'parsed_description', 'is_active', 'hash',
+ 'name', 'sort', 'has_image', 'description', 'parsed_description', 'is_active', 'hash', 'is_staff', 'use_coupons', 'is_fto', 'allowed_coupons', 'is_timed_shop', 'start_at', 'end_at',
+ 'is_hidden', 'data',
];
/**
@@ -21,6 +23,19 @@ class Shop extends Model {
* @var string
*/
protected $table = 'shops';
+
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ 'allowed_coupons' => 'array',
+ 'end_at' => 'datetime',
+ 'start_at' => 'datetime',
+ ];
+
/**
* Validation rules for creation.
*
@@ -58,9 +73,30 @@ public function stock() {
/**
* Get the shop stock as items for display purposes.
+ *
+ * @param mixed|null $model
+ * @param mixed|null $type
*/
- public function displayStock() {
- return $this->belongsToMany(Item::class, 'shop_stock')->withPivot('item_id', 'currency_id', 'cost', 'use_user_bank', 'use_character_bank', 'is_limited_stock', 'quantity', 'purchase_limit', 'id');
+ public function displayStock($model = null, $type = null) {
+ if (!$model || !$type) {
+ return $this->belongsToMany(Item::class, 'shop_stock')->where('stock_type', 'Item')->withPivot('item_id', 'use_user_bank', 'use_character_bank', 'is_limited_stock', 'quantity', 'purchase_limit', 'id', 'is_timed_stock')
+ ->wherePivot('is_visible', 1)->where(function ($query) {
+ $query->whereNull('shop_stock.start_at')
+ ->orWhere('shop_stock.start_at', '<', Carbon::now());
+ })->where(function ($query) {
+ $query->whereNull('shop_stock.end_at')
+ ->orWhere('shop_stock.end_at', '>', Carbon::now());
+ });
+ }
+
+ return $this->belongsToMany($model, 'shop_stock', 'shop_id', 'item_id')->where('stock_type', $type)->withPivot('item_id', 'use_user_bank', 'use_character_bank', 'is_limited_stock', 'quantity', 'purchase_limit', 'id', 'is_timed_stock')
+ ->wherePivot('is_visible', 1)->where(function ($query) {
+ $query->whereNull('shop_stock.start_at')
+ ->orWhere('shop_stock.start_at', '<', Carbon::now());
+ })->where(function ($query) {
+ $query->whereNull('shop_stock.end_at')
+ ->orWhere('shop_stock.end_at', '>', Carbon::now());
+ });
}
/**********************************************************************************************
@@ -75,7 +111,7 @@ public function displayStock() {
* @return string
*/
public function getDisplayNameAttribute() {
- return ''.$this->name.' ';
+ return ''.(!$this->isActive ? ' ' : '').$this->name.' ';
}
/**
@@ -93,7 +129,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getShopImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
@@ -144,4 +180,70 @@ public function getAdminUrlAttribute() {
public function getAdminPowerAttribute() {
return 'edit_data';
}
+
+ /**
+ * Returns the days the shop is available, if set.
+ */
+ public function getDaysAttribute() {
+ return $this->data['shop_days'] ?? null;
+ }
+
+ /**
+ * Returns the months the shop is available, if set.
+ */
+ public function getMonthsAttribute() {
+ return $this->data['shop_months'] ?? null;
+ }
+
+ /**
+ * Returns if this shop should be active or not.
+ * We dont account for is_visible here, as this is used for checking both visible and invisible shop.
+ */
+ public function getIsActiveAttribute() {
+ if ($this->start_at && $this->start_at > Carbon::now()) {
+ return false;
+ }
+
+ if ($this->end_at && $this->end_at < Carbon::now()) {
+ return false;
+ }
+
+ if ($this->days && !in_array(Carbon::now()->format('l'), $this->days)) {
+ return false;
+ }
+
+ if ($this->months && !in_array(Carbon::now()->format('F'), $this->months)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**********************************************************************************************
+
+ OTHER FUNCTIONS
+
+ **********************************************************************************************/
+
+ /**
+ * Gets all the coupons useable in the shop.
+ */
+ public function getAllAllowedCouponsAttribute() {
+ if (!$this->use_coupons || !$this->allowed_coupons) {
+ return;
+ }
+ // Get the coupons from the id in allowed_coupons
+ $coupons = Item::whereIn('id', $this->allowed_coupons)->get();
+
+ return $coupons;
+ }
+
+ /**
+ * Gets the shop's stock costs.
+ *
+ * @param mixed $id
+ */
+ public function displayStockCosts($id) {
+ return $this->stock()->where('id', $id)->first()->displayCosts();
+ }
}
diff --git a/app/Models/Shop/ShopLog.php b/app/Models/Shop/ShopLog.php
index 0e9f41266c..ba965ca7c1 100644
--- a/app/Models/Shop/ShopLog.php
+++ b/app/Models/Shop/ShopLog.php
@@ -15,7 +15,7 @@ class ShopLog extends Model {
* @var array
*/
protected $fillable = [
- 'shop_id', 'character_id', 'user_id', 'currency_id', 'cost', 'item_id', 'quantity',
+ 'shop_id', 'character_id', 'user_id', 'cost', 'item_id', 'quantity', 'stock_type',
];
/**
@@ -24,6 +24,16 @@ class ShopLog extends Model {
* @var string
*/
protected $table = 'shop_log';
+
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'cost' => 'array',
+ ];
+
/**
* Whether the model contains timestamps to be saved and updated.
*
@@ -66,7 +76,9 @@ public function character() {
* Get the purchased item.
*/
public function item() {
- return $this->belongsTo(Item::class);
+ $model = getAssetModelString(strtolower($this->stock_type ?? 'Item'));
+
+ return $this->belongsTo($model);
}
/**
@@ -95,6 +107,85 @@ public function currency() {
* @return string
*/
public function getItemDataAttribute() {
- return 'Purchased from '.$this->shop->name.' by '.($this->character_id ? $this->character->slug.' (owned by '.$this->user->name.')' : $this->user->displayName).' for '.$this->cost.' '.$this->currency->name.'.';
+ $cost = mergeAssetsArrays(parseAssetData($this->cost['user']), parseAssetData($this->cost['character']));
+
+ return 'Purchased from '.$this->shop->name.' by '.
+ ($this->character_id ? $this->character->slug.' (owned by '.$this->user->name.')' : $this->user->displayName).' using '.
+ (createRewardsString($cost, true, true) == 'Nothing. :(' ? 'Free' : createRewardsString($cost, true, true))
+ .($this->coupon ? ' with coupon '.$this->coupon->displayName : '');
+ }
+
+ /**
+ * Get the cost of the item.
+ */
+ public function getTotalCostAttribute() {
+ if (isset($this->cost['user']) && isset($this->cost['character'])) {
+ return mergeAssetsArrays(parseAssetData($this->cost['user']), parseAssetData($this->cost['character']));
+ }
+
+ return parseAssetData($this->cost);
+ }
+
+ /**
+ * Get the base cost of the item.
+ */
+ public function getBaseCostAttribute() {
+ if (isset($this->cost['base'])) {
+ return parseAssetData($this->cost['base']);
+ }
+
+ if (isset($this->cost['user']) && isset($this->cost['character'])) {
+ $assets = mergeAssetsArrays(parseAssetData($this->cost['user']), parseAssetData($this->cost['character']));
+ } else {
+ $assets = parseAssetData($this->cost);
+ }
+
+ foreach ($assets as $key=>$contents) {
+ if (count($contents) == 0) {
+ continue;
+ }
+ foreach ($contents as $asset) {
+ $assets[$key][$asset['asset']->id]['quantity'] = $asset['quantity'] / $this->quantity;
+ }
+ }
+
+ return $assets;
+ }
+
+ /**
+ * Get the cost of the item in a readable format.
+ *
+ * @return string
+ */
+ public function getDisplayCostAttribute() {
+ if (isset($this->cost['user']) && isset($this->cost['character'])) {
+ $assets = mergeAssetsArrays(parseAssetData($this->cost['user']), parseAssetData($this->cost['character']));
+ } else {
+ $assets = parseAssetData($this->cost);
+ }
+
+ return createRewardsString($assets, true, true) == 'Nothing. :(' ? 'Free' : createRewardsString($assets, true, true);
+ }
+
+ /**
+ * Get the cost of the item in a readable format.
+ *
+ * @return string
+ */
+ public function getDisplayBaseCostAttribute() {
+ return createRewardsString($this->baseCost, true, true) == 'Nothing. :(' ? 'Free' : createRewardsString($this->baseCost, true, true);
+ }
+
+ /**
+ * Returns the coupon used (if any).
+ *
+ * @return Item|null
+ */
+ public function getCouponAttribute() {
+ if (!isset($this->cost['coupon'])) {
+ return null;
+ }
+
+ return Item::find($this->cost['coupon']) ?? null;
}
}
diff --git a/app/Models/Shop/ShopStock.php b/app/Models/Shop/ShopStock.php
index 9a096bee6f..a45e98f337 100644
--- a/app/Models/Shop/ShopStock.php
+++ b/app/Models/Shop/ShopStock.php
@@ -2,9 +2,9 @@
namespace App\Models\Shop;
-use App\Models\Currency\Currency;
use App\Models\Item\Item;
use App\Models\Model;
+use Carbon\Carbon;
class ShopStock extends Model {
/**
@@ -13,7 +13,8 @@ class ShopStock extends Model {
* @var array
*/
protected $fillable = [
- 'shop_id', 'item_id', 'currency_id', 'cost', 'use_user_bank', 'use_character_bank', 'is_limited_stock', 'quantity', 'sort', 'purchase_limit',
+ 'shop_id', 'item_id', 'use_user_bank', 'use_character_bank', 'is_limited_stock', 'quantity', 'sort', 'purchase_limit', 'purchase_limit_timeframe', 'is_fto', 'stock_type', 'is_visible',
+ 'restock', 'restock_quantity', 'restock_interval', 'range', 'disallow_transfer', 'is_timed_stock', 'start_at', 'end_at', 'data',
];
/**
@@ -23,6 +24,26 @@ class ShopStock extends Model {
*/
protected $table = 'shop_stock';
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ 'end_at' => 'datetime',
+ 'start_at' => 'datetime',
+ ];
+
+ /**
+ * Validation rules for creation.
+ *
+ * @var array
+ */
+ public static $createRules = [
+ 'purchase_limit_timeframe' => 'in:lifetime,yearly,monthly,weekly,daily',
+ ];
+
/**********************************************************************************************
RELATIONS
@@ -33,7 +54,14 @@ class ShopStock extends Model {
* Get the item being stocked.
*/
public function item() {
- return $this->belongsTo(Item::class);
+ $model = getAssetModelString(strtolower($this->stock_type));
+
+ if (!class_exists($model)) {
+ // Laravel requires a relationship instance to be returned (cannot return null), so returning one that doesn't exist here.
+ return $this->belongsTo(self::class, 'id', 'item_id')->whereNull('item_id');
+ }
+
+ return $this->belongsTo($model);
}
/**
@@ -44,9 +72,210 @@ public function shop() {
}
/**
- * Get the currency the item must be purchased with.
+ * Get the costs associated with this stock.
+ */
+ public function costs() {
+ return $this->hasMany(ShopStockCost::class, 'shop_stock_id');
+ }
+
+ /**********************************************************************************************
+
+ SCOPES
+
+ **********************************************************************************************/
+
+ /**
+ * Scopes active stock.
+ *
+ * @param mixed $query
+ */
+ public function scopeActive($query) {
+ return $query->where('is_visible', 1);
+ }
+
+ /**********************************************************************************************
+
+ ATTRIBUTES
+
+ **********************************************************************************************/
+
+ /**
+ * Returns if this stock should be active or not.
+ * We dont account for is_visible here, as this is used for checking both visible and invisible stock.
+ */
+ public function getIsActiveAttribute() {
+ if ($this->start_at && $this->start_at > Carbon::now()) {
+ return false;
+ }
+
+ if ($this->end_at && $this->end_at < Carbon::now()) {
+ return false;
+ }
+
+ if ($this->days && !in_array(Carbon::now()->format('l'), $this->days)) {
+ return false;
+ }
+
+ if ($this->months && !in_array(Carbon::now()->format('F'), $this->months)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns if the stock is random or not.
+ */
+ public function getIsRandomAttribute() {
+ return isset($this->data['is_random']) && $this->data['is_random'];
+ }
+
+ /**
+ * Returns if the stock is category based or not.
+ */
+ public function getIsCategoryAttribute() {
+ $model = getAssetModelString(strtolower($this->stock_type));
+
+ return isset($this->data['is_category']) && $this->data['is_category'] && class_exists($model.'Category');
+ }
+
+ /**
+ * Returns the stock category id, only if the stock is category based.
*/
- public function currency() {
- return $this->belongsTo(Currency::class);
+ public function getCategoryIdAttribute() {
+ return $this->isCategory ? ($this->data['category_id'] ?? null) : null;
+ }
+
+ /**
+ * Returns the days the stock is available, if set.
+ */
+ public function getDaysAttribute() {
+ return $this->data['stock_days'] ?? null;
+ }
+
+ /**
+ * Returns the months the stock is available, if set.
+ */
+ public function getMonthsAttribute() {
+ return $this->data['stock_months'] ?? null;
+ }
+
+ /**
+ * Returns all of the existing groups based on the costs.
+ */
+ public function getGroupsAttribute() {
+ return $this->costs()->get()->pluck('group')->unique();
+ }
+
+ /**
+ * Makes the costs an array of arrays.
+ */
+ public function getCostGroupsAttribute() {
+ $costs = $this->costs()->get()->groupBy('group');
+ $groupedCosts = [];
+ foreach ($costs as $group => $costGroup) {
+ $assets = createAssetsArray();
+ foreach ($costGroup as $cost) {
+ addAsset($assets, $cost->item, $cost->quantity);
+ }
+ $groupedCosts[$group] = $assets;
+ }
+
+ return $groupedCosts;
+ }
+
+ /*
+ * Gets the current date associated to the current stocks purchase limit timeframe
+ */
+ public function getPurchaseLimitDateAttribute() {
+ switch ($this->purchase_limit_timeframe) {
+ case 'yearly':
+ $date = strtotime('January 1st');
+ break;
+ case 'monthly':
+ $date = Carbon::now()->startOfMonth()->timestamp;
+ break;
+ case 'weekly':
+ $date = strtotime('last sunday');
+ break;
+ case 'daily':
+ $date = strtotime('midnight');
+ break;
+ default:
+ $date = null;
+ }
+
+ return $date;
+ }
+
+ /**********************************************************************************************
+
+ OTHER FUNCTIONS
+
+ **********************************************************************************************/
+
+ /**
+ * Returns formatted lists of costs for display.
+ */
+ public function displayCosts() {
+ $display = [];
+ $costs = $this->costGroups;
+ foreach ($costs as $group => $groupCosts) {
+ $display[] = createRewardsString($groupCosts);
+ }
+
+ return count($display) ? implode(' OR ', $display) : null;
+ }
+
+ /**
+ * Returns the costs in the format group => rewardString for a form select.
+ */
+ public function costForm() {
+ $costs = $this->costGroups;
+ $select = [];
+ foreach ($costs as $group => $groupCosts) {
+ $select[$group] = createRewardsString($groupCosts, false);
+ }
+
+ return $select;
+ }
+
+ /**
+ * Returns if a group can use coupons.
+ *
+ * @param mixed $group
+ */
+ public function canGroupUseCoupons($group) {
+ return in_array($group, $this->data['can_group_use_coupon'] ?? []);
+ }
+
+ /**
+ * Displays when this stock is available in human readable format.
+ */
+ public function displayTime() {
+ // {!! '' . ($stock->start_at ? pretty_date($stock->start_at) : 'Now') . ' - ' . ($stock->end_at ? pretty_date($stock->end_at) : 'Always') . '
' !!}
+ $days = $this->days;
+ $months = $this->months;
+ $string = '';
+ // if start_at and end_at are set, we need to show that its avaialble only during that time and THEN only on the days and months
+ if ($this->start_at && $this->end_at) {
+ $string .= pretty_date($this->start_at).' - '.pretty_date($this->end_at);
+ } elseif ($this->start_at) {
+ $string .= 'From '.pretty_date($this->start_at);
+ } elseif ($this->end_at) {
+ $string .= 'Until '.pretty_date($this->end_at);
+ }
+
+ if ($days) {
+ $string .= ' Available on '.implode(', ', $days);
+ }
+
+ if ($months) {
+ $string .= ' During '.implode(', ', $months);
+ }
+
+ $string .= '
';
+
+ return $string;
}
}
diff --git a/app/Models/Shop/ShopStockCost.php b/app/Models/Shop/ShopStockCost.php
new file mode 100644
index 0000000000..3de6a99824
--- /dev/null
+++ b/app/Models/Shop/ShopStockCost.php
@@ -0,0 +1,68 @@
+belongsTo(ShopStock::class, 'shop_stock_id');
+ }
+
+ /**
+ * Get the item being stocked.
+ */
+ public function item() {
+ $model = getAssetModelString(strtolower($this->cost_type));
+
+ return $this->belongsTo($model, 'cost_id');
+ }
+
+ /**
+ * Gets all of the other costs for this stock in the same group.
+ */
+ public function group() {
+ return $this->hasMany(self::class, 'group');
+ }
+
+ /**********************************************************************************************
+
+ ATTRIBUTES
+
+ **********************************************************************************************/
+
+ /**
+ * Gets all of the other costs for this stock in the same group.
+ */
+ public function getItemsAttribute() {
+ $model = getAssetModelString(strtolower($this->cost_type));
+
+ return $model::all()->pluck('name', 'id');
+ }
+}
diff --git a/app/Models/SitePage.php b/app/Models/SitePage.php
index 252c42cddc..2d0d6be055 100644
--- a/app/Models/SitePage.php
+++ b/app/Models/SitePage.php
@@ -52,6 +52,28 @@ class SitePage extends Model {
'text' => 'nullable',
];
+ /**********************************************************************************************
+ SCOPES
+ **********************************************************************************************/
+ /**
+ * Scope a query to only include visible pages.
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $query
+ * @param mixed|null $user
+ *
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function scopeVisible($query, $user = null) {
+ if ($user && $user->hasPower('edit_pages')) {
+ return $query;
+ }
+
+ return $query->where('is_visible', 1);
+ }
+
+ /**********************************************************************************************
+ ACCESSORS
+ **********************************************************************************************/
/**
* Gets the URL of the public-facing page.
*
diff --git a/app/Models/Species/Species.php b/app/Models/Species/Species.php
index 5656e890eb..4a5fc497ab 100644
--- a/app/Models/Species/Species.php
+++ b/app/Models/Species/Species.php
@@ -123,7 +123,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getSpeciesImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
diff --git a/app/Models/Species/Subtype.php b/app/Models/Species/Subtype.php
index a207153f31..a66c547eb1 100644
--- a/app/Models/Species/Subtype.php
+++ b/app/Models/Species/Subtype.php
@@ -2,6 +2,7 @@
namespace App\Models\Species;
+use App\Models\Feature\Feature;
use App\Models\Model;
class Subtype extends Model {
@@ -67,6 +68,13 @@ public function species() {
return $this->belongsTo(Species::class, 'species_id');
}
+ /**
+ * Get the features associated with this subtype.
+ */
+ public function features() {
+ return $this->hasMany(Feature::class);
+ }
+
/**********************************************************************************************
SCOPES
@@ -128,7 +136,7 @@ public function getImageDirectoryAttribute() {
* @return string
*/
public function getSubtypeImageFileNameAttribute() {
- return $this->hash.$this->id.'-image.png';
+ return $this->id.'-'.$this->hash.'-image.png';
}
/**
@@ -168,7 +176,16 @@ public function getUrlAttribute() {
* @return string
*/
public function getSearchUrlAttribute() {
- return url('masterlist?subtype_id='.$this->id);
+ return url('masterlist?subtype_ids[]='.$this->id);
+ }
+
+ /**
+ * Gets the URL the visual index of this subtype's traits.
+ *
+ * @return string
+ */
+ public function getVisualTraitsUrlAttribute() {
+ return url('/world/subtypes/'.$this->id.'/traits');
}
/**
diff --git a/app/Models/Submission/Submission.php b/app/Models/Submission/Submission.php
index e21ccde578..52c55107e2 100644
--- a/app/Models/Submission/Submission.php
+++ b/app/Models/Submission/Submission.php
@@ -2,6 +2,7 @@
namespace App\Models\Submission;
+use App\Models\Gallery\GallerySubmission;
use App\Models\Model;
use App\Models\Prompt\Prompt;
use App\Models\User\User;
@@ -25,6 +26,16 @@ class Submission extends Model {
* @var string
*/
protected $table = 'submissions';
+
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* Whether the model contains timestamps to be saved and updated.
*
@@ -171,15 +182,6 @@ public function scopeSortNewest($query) {
**********************************************************************************************/
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
-
/**
* Gets the inventory of the user for selection.
*
@@ -194,7 +196,7 @@ public function getInventory($user) {
/**
* Gets the currencies of the given user for selection.
*
- * @param \App\Models\User\User $user
+ * @param User $user
*
* @return array
*/
@@ -245,4 +247,15 @@ public function getRewardsAttribute() {
return $rewards;
}
+
+ /**
+ * Gets the gallery submission (if there is one).
+ */
+ public function getGallerySubmissionAttribute() {
+ if (!config('lorekeeper.settings.allow_gallery_submissions_on_prompts') || !isset($this->data['gallery_submission_id'])) {
+ return null;
+ }
+
+ return GallerySubmission::find($this->data['gallery_submission_id'] ?? null);
+ }
}
diff --git a/app/Models/Submission/SubmissionCharacter.php b/app/Models/Submission/SubmissionCharacter.php
index 006adccdc6..4a006f5a2a 100644
--- a/app/Models/Submission/SubmissionCharacter.php
+++ b/app/Models/Submission/SubmissionCharacter.php
@@ -22,6 +22,15 @@ class SubmissionCharacter extends Model {
*/
protected $table = 'submission_characters';
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**********************************************************************************************
RELATIONS
@@ -48,15 +57,6 @@ public function character() {
**********************************************************************************************/
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
-
/**
* Get the rewards for the character.
*
diff --git a/app/Models/Trade.php b/app/Models/Trade.php
index 58a56c7e88..b83d01ff3a 100644
--- a/app/Models/Trade.php
+++ b/app/Models/Trade.php
@@ -5,6 +5,7 @@
use App\Facades\Settings;
use App\Models\Character\Character;
use App\Models\User\User;
+use App\Models\User\UserItem;
class Trade extends Model {
/**
@@ -24,6 +25,16 @@ class Trade extends Model {
* @var string
*/
protected $table = 'trades';
+
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* Whether the model contains timestamps to be saved and updated.
*
@@ -107,21 +118,34 @@ public function getIsConfirmableAttribute() {
}
/**
- * Get the data attribute as an associative array.
+ * Gets the URL of the trade.
*
- * @return array
+ * @return string
*/
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
+ public function getUrlAttribute() {
+ return url('trades/'.$this->id);
}
/**
- * Gets the URL of the trade.
+ * Gets the stacks of the trade keyed by sender and recipient.
*
- * @return string
+ * @return array
*/
- public function getUrlAttribute() {
- return url('trades/'.$this->id);
+ public function getStacksAttribute() {
+ $stacks = [];
+ foreach ($this->data as $side => $assets) {
+ if (isset($assets['user_items'])) {
+ $user_items = UserItem::with('item')->find(array_keys($assets['user_items']));
+ $items = $user_items->map(function ($user_item) use ($assets) {
+ $user_item['quantity'] = $assets['user_items'][$user_item->id];
+
+ return $user_item;
+ });
+ $stacks[$side] = $items->groupBy('item_id');
+ }
+ }
+
+ return $stacks;
}
/**********************************************************************************************
@@ -142,7 +166,7 @@ public function getCharacterData() {
/**
* Gets the inventory of the given user for selection.
*
- * @param \App\Models\User\User $user
+ * @param User $user
*
* @return array
*/
@@ -156,7 +180,7 @@ public function getInventory($user) {
/**
* Gets the characters of the given user for selection.
*
- * @param \App\Models\User\User $user
+ * @param User $user
*
* @return array
*/
@@ -173,7 +197,7 @@ public function getCharacters($user) {
/**
* Gets the currencies of the given user for selection.
*
- * @param \App\Models\User\User $user
+ * @param User $user
*
* @return array
*/
diff --git a/app/Models/User/User.php b/app/Models/User/User.php
index 01dd6abcf3..e89c18cd67 100644
--- a/app/Models/User/User.php
+++ b/app/Models/User/User.php
@@ -7,12 +7,14 @@
use App\Models\Character\CharacterImageCreator;
use App\Models\Comment\CommentLike;
use App\Models\Currency\Currency;
+use App\Models\Currency\CurrencyCategory;
use App\Models\Currency\CurrencyLog;
use App\Models\Gallery\GalleryCollaborator;
use App\Models\Gallery\GalleryFavorite;
use App\Models\Gallery\GallerySubmission;
use App\Models\Item\Item;
use App\Models\Item\ItemLog;
+use App\Models\Limit\UserUnlockedLimit;
use App\Models\Notification;
use App\Models\Rank\Rank;
use App\Models\Rank\RankPower;
@@ -36,7 +38,7 @@ class User extends Authenticatable implements MustVerifyEmail {
*/
protected $fillable = [
'name', 'alias', 'rank_id', 'email', 'email_verified_at', 'password', 'is_news_unread', 'is_banned', 'has_alias', 'avatar', 'is_sales_unread', 'birthday',
- 'is_deactivated', 'deactivater_id',
+ 'is_deactivated', 'deactivater_id', 'content_warning_visibility',
];
/**
@@ -205,6 +207,13 @@ public function commentLikes() {
return $this->hasMany(CommentLike::class);
}
+ /**
+ * Gets all of the user's unlocked limits.
+ */
+ public function unlockedLimits() {
+ return $this->hasMany(UserUnlockedLimit::class);
+ }
+
/**********************************************************************************************
SCOPES
@@ -274,6 +283,19 @@ public function getHasAliasAttribute() {
return $this->attributes['has_alias'];
}
+ /**
+ * Checks if the user has an email.
+ *
+ * @return bool
+ */
+ public function getHasEmailAttribute() {
+ if (!config('lorekeeper.settings.require_email')) {
+ return true;
+ }
+
+ return $this->attributes['email'] && $this->attributes['email_verified_at'];
+ }
+
/**
* Checks if the user has an admin rank.
*
@@ -457,7 +479,7 @@ public function getBirthdayDisplayAttribute() {
*/
public function getcheckBirthdayAttribute() {
$bday = $this->birthday;
- if (!$bday || $bday->diffInYears(carbon::now()) < 13) {
+ if (!$bday || $bday->diffInYears(Carbon::now()) < 13) {
return false;
} else {
return true;
@@ -483,22 +505,37 @@ public function canEditRank($rank) {
/**
* Get the user's held currencies.
*
- * @param bool $showAll
+ * @param bool $showAll
+ * @param mixed|null $user
+ * @param mixed $showCategories
*
* @return \Illuminate\Support\Collection
*/
- public function getCurrencies($showAll = false) {
+ public function getCurrencies($showAll = false, $showCategories = false, $user = null) {
// Get a list of currencies that need to be displayed
// On profile: only ones marked is_displayed
// In bank: ones marked is_displayed + the ones the user has
$owned = UserCurrency::where('user_id', $this->id)->pluck('quantity', 'currency_id')->toArray();
- $currencies = Currency::where('is_user_owned', 1);
+ $currencies = Currency::where('is_user_owned', 1)
+ ->whereHas('category', function ($query) use ($user) {
+ $query->visible($user);
+ })
+ ->orWhereNull('currency_category_id')
+ ->visible($user);
if ($showAll) {
$currencies->where(function ($query) use ($owned) {
$query->where('is_displayed', 1)->orWhereIn('id', array_keys($owned));
});
+
+ if ($showCategories) {
+ $categories = CurrencyCategory::visible()->orderBy('sort', 'DESC')->get();
+
+ if ($categories->count()) {
+ $currencies->orderByRaw('FIELD(currency_category_id,'.implode(',', $categories->pluck('id')->toArray()).')');
+ }
+ }
} else {
$currencies = $currencies->where('is_displayed', 1);
}
@@ -509,6 +546,16 @@ public function getCurrencies($showAll = false) {
$currency->quantity = $owned[$currency->id] ?? 0;
}
+ if ($showAll && $showCategories) {
+ $currencies = $currencies->groupBy(function ($currency) use ($categories) {
+ if (!$currency->category) {
+ return 'Miscellaneous';
+ }
+
+ return $categories->where('id', $currency->currency_category_id)->first()->name;
+ });
+ }
+
return $currencies;
}
@@ -669,7 +716,7 @@ public function updateArtDesignCredits() {
* @return \Illuminate\Pagination\LengthAwarePaginator
*/
public function getSubmissions($user = null) {
- return Submission::with('user')->with('prompt')->viewable($user ? $user : null)->where('user_id', $this->id)->orderBy('id', 'DESC')->paginate(30);
+ return Submission::with('user')->with('prompt')->viewable($user ? $user : null)->where('user_id', $this->id)->orderBy('id', 'DESC');
}
/**
@@ -678,7 +725,7 @@ public function getSubmissions($user = null) {
*
* @param mixed $character
*
- * @return \App\Models\Character\CharacterBookmark
+ * @return CharacterBookmark
*/
public function hasBookmarked($character) {
return CharacterBookmark::where('user_id', $this->id)->where('character_id', $character->id)->first();
diff --git a/app/Models/User/UserItem.php b/app/Models/User/UserItem.php
index 41bef1ba7c..d66aef945d 100644
--- a/app/Models/User/UserItem.php
+++ b/app/Models/User/UserItem.php
@@ -25,6 +25,15 @@ class UserItem extends Model {
*/
protected $table = 'user_items';
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* Whether the model contains timestamps to be saved and updated.
*
@@ -58,22 +67,13 @@ public function item() {
**********************************************************************************************/
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
-
/**
* Checks if the stack is transferrable.
*
* @return array
*/
public function getIsTransferrableAttribute() {
- if (!isset($this->data['disallow_transfer']) && $this->item->allow_transfer) {
+ if ((!isset($this->data['disallow_transfer']) || !$this->data['disallow_transfer']) && $this->item->allow_transfer) {
return true;
}
diff --git a/app/Models/User/UserSettings.php b/app/Models/User/UserSettings.php
index 3d8edd1804..ef781a017f 100644
--- a/app/Models/User/UserSettings.php
+++ b/app/Models/User/UserSettings.php
@@ -12,7 +12,8 @@ class UserSettings extends Model {
*/
protected $fillable = [
'is_fto', 'submission_count', 'banned_at', 'ban_reason', 'birthday_setting',
- 'deactivate_reason', 'deactivated_at',
+ 'deactivate_reason', 'deactivated_at', 'content_warning_visibility', 'allow_profile_comments',
+ 'css_fonts_disabled', 'font_size', 'letter_spacing', 'word_spacing', 'line_height',
];
/**
diff --git a/app/Models/User/UserUpdateLog.php b/app/Models/User/UserUpdateLog.php
index 79cac5e28a..f1f28e62b8 100644
--- a/app/Models/User/UserUpdateLog.php
+++ b/app/Models/User/UserUpdateLog.php
@@ -20,6 +20,16 @@ class UserUpdateLog extends Model {
* @var string
*/
protected $table = 'user_update_log';
+
+ /**
+ * The attributes that should be cast to native types.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'data' => 'array',
+ ];
+
/**
* The primary key of the model.
*
@@ -53,19 +63,4 @@ public function staff() {
public function user() {
return $this->belongsTo(User::class, 'user_id');
}
-
- /**********************************************************************************************
-
- ACCESSORS
-
- **********************************************************************************************/
-
- /**
- * Get the data attribute as an associative array.
- *
- * @return array
- */
- public function getDataAttribute() {
- return json_decode($this->attributes['data'], true);
- }
}
diff --git a/app/Policies/CommentPolicy.php b/app/Policies/CommentPolicy.php
index 9d8e361ec0..d6c0b785e2 100644
--- a/app/Policies/CommentPolicy.php
+++ b/app/Policies/CommentPolicy.php
@@ -2,6 +2,7 @@
namespace App\Policies;
+use App\Facades\Settings;
use App\Models\Comment\Comment;
use Illuminate\Support\Facades\Auth;
@@ -23,6 +24,8 @@ public function create($user): bool {
public function delete($user, Comment $comment): bool {
if (Auth::user()->isStaff) {
return true;
+ } elseif ($comment->commentable_type == 'App\Models\User\UserProfile' && $comment->commentable_id == $user->id && Settings::get('allow_users_to_delete_profile_comments')) {
+ return true;
} else {
return false;
}
diff --git a/app/Providers/Socialite/ToyhouseProvider.php b/app/Providers/Socialite/ToyhouseProvider.php
index 0ce2bc79cf..2992f2e4d9 100644
--- a/app/Providers/Socialite/ToyhouseProvider.php
+++ b/app/Providers/Socialite/ToyhouseProvider.php
@@ -57,7 +57,7 @@ protected function getUserByToken($token) {
/**
* Map the raw user array to a Socialite User instance.
*
- * @return \Laravel\Socialite\Two\User
+ * @return User
*/
protected function mapUserToObject(array $user) {
return (new User)->setRaw($user)->map([
diff --git a/app/Services/BookmarkManager.php b/app/Services/BookmarkManager.php
index ba03f1293f..07445213a2 100644
--- a/app/Services/BookmarkManager.php
+++ b/app/Services/BookmarkManager.php
@@ -22,7 +22,7 @@ class BookmarkManager extends Service {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Character\CharacterBookmark|bool
+ * @return bool|CharacterBookmark
*/
public function createBookmark($data, $user) {
DB::beginTransaction();
@@ -67,7 +67,7 @@ public function createBookmark($data, $user) {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Character\CharacterBookmark|bool
+ * @return bool|CharacterBookmark
*/
public function updateBookmark($data, $user) {
DB::beginTransaction();
@@ -132,7 +132,7 @@ public function deleteBookmark($data, $user) {
* Deletes bookmarks associated with a character.
* For use when a character is deleted.
*
- * @param \App\Models\Character\Character $character
+ * @param Character $character
*
* @return bool
*/
diff --git a/app/Services/CharacterCategoryService.php b/app/Services/CharacterCategoryService.php
index 8bb6cbc0b3..6407213593 100644
--- a/app/Services/CharacterCategoryService.php
+++ b/app/Services/CharacterCategoryService.php
@@ -22,7 +22,7 @@ class CharacterCategoryService extends Service {
* @param array $data
* @param mixed $user
*
- * @return \App\Models\Character\CharacterCategory|bool
+ * @return bool|CharacterCategory
*/
public function createCharacterCategory($data, $user) {
DB::beginTransaction();
@@ -61,11 +61,11 @@ public function createCharacterCategory($data, $user) {
/**
* Update a category.
*
- * @param \App\Models\Character\CharacterCategory $category
- * @param array $data
- * @param mixed $user
+ * @param CharacterCategory $category
+ * @param array $data
+ * @param mixed $user
*
- * @return \App\Models\Character\CharacterCategory|bool
+ * @return bool|CharacterCategory
*/
public function updateCharacterCategory($category, $data, $user) {
DB::beginTransaction();
@@ -109,8 +109,8 @@ public function updateCharacterCategory($category, $data, $user) {
/**
* Delete a category.
*
- * @param \App\Models\Character\CharacterCategory $category
- * @param mixed $user
+ * @param CharacterCategory $category
+ * @param mixed $user
*
* @return bool
*/
@@ -169,8 +169,8 @@ public function sortCharacterCategory($data) {
/**
* Handle category data.
*
- * @param array $data
- * @param \App\Models\Character\CharacterCategory|null $category
+ * @param array $data
+ * @param CharacterCategory|null $category
*
* @return array
*/
diff --git a/app/Services/CharacterManager.php b/app/Services/CharacterManager.php
index e515935cf2..d5fe3bdab4 100644
--- a/app/Services/CharacterManager.php
+++ b/app/Services/CharacterManager.php
@@ -11,10 +11,13 @@
use App\Models\Character\CharacterDesignUpdate;
use App\Models\Character\CharacterFeature;
use App\Models\Character\CharacterImage;
+use App\Models\Character\CharacterImageSubtype;
+use App\Models\Character\CharacterLog;
use App\Models\Character\CharacterTransfer;
use App\Models\Sales\SalesCharacter;
use App\Models\Species\Subtype;
use App\Models\User\User;
+use App\Models\User\UserCharacterLog;
use Carbon\Carbon;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Config;
@@ -71,11 +74,11 @@ public function pullNumber($categoryId) {
/**
* Creates a new character or MYO slot.
*
- * @param array $data
- * @param \App\Models\User\User $user
- * @param bool $isMyo
+ * @param array $data
+ * @param User $user
+ * @param bool $isMyo
*
- * @return \App\Models\Character\Character|bool
+ * @return bool|Character
*/
public function createCharacter($data, $user, $isMyo = false) {
DB::beginTransaction();
@@ -96,16 +99,23 @@ public function createCharacter($data, $user, $isMyo = false) {
throw new \Exception('Characters require a rarity.');
}
}
- if (isset($data['subtype_id']) && $data['subtype_id']) {
- $subtype = Subtype::find($data['subtype_id']);
+ if (isset($data['subtype_ids']) && $data['subtype_ids']) {
+ if (count($data['subtype_ids']) > config('lorekeeper.extensions.multiple_subtype_limit')) {
+ throw new \Exception('Too many subtypes selected.');
+ }
+
if (!(isset($data['species_id']) && $data['species_id'])) {
throw new \Exception('Species must be selected to select a subtype.');
}
- if (!$subtype || $subtype->species_id != $data['species_id']) {
- throw new \Exception('Selected subtype invalid or does not match species.');
+
+ foreach ($data['subtype_ids'] as $subtypeId) {
+ $subtype = Subtype::find($subtypeId);
+ if (!$subtype || $subtype->species_id != $data['species_id']) {
+ throw new \Exception('Selected subtype invalid or does not match species.');
+ }
}
} else {
- $data['subtype_id'] = null;
+ $data['subtype_ids'] = null;
}
// Get owner info
@@ -183,7 +193,7 @@ public function createCharacter($data, $user, $isMyo = false) {
/**
* Trims and optionally resizes and watermarks an image.
*
- * @param \App\Models\Character\CharacterImage $characterImage
+ * @param CharacterImage $characterImage
*/
public function processImage($characterImage) {
$imageProperties = getimagesize($characterImage->imagePath.'/'.$characterImage->imageFileName);
@@ -294,11 +304,11 @@ public function processImage($characterImage) {
$wmScale = config('lorekeeper.settings.watermark_percent');
- //Assume Landscape by Default
+ // Assume Landscape by Default
$maxSize = $imageWidth * $wmScale;
if ($imageWidth > $imageHeight) {
- //Landscape
+ // Landscape
$maxSize = $imageWidth * $wmScale;
} else {
// Portrait
@@ -306,7 +316,7 @@ public function processImage($characterImage) {
}
if ($wmWidth > $wmHeight) {
- //Landscape
+ // Landscape
$watermark->resize($maxSize, null, function ($constraint) {
$constraint->aspectRatio();
});
@@ -327,9 +337,9 @@ public function processImage($characterImage) {
/**
* Crops a thumbnail for the given image.
*
- * @param array $points
- * @param \App\Models\Character\CharacterImage $characterImage
- * @param mixed $isMyo
+ * @param array $points
+ * @param CharacterImage $characterImage
+ * @param mixed $isMyo
*/
public function cropThumbnail($points, $characterImage, $isMyo = false) {
$imageProperties = getimagesize($characterImage->imagePath.'/'.$characterImage->imageFileName);
@@ -402,11 +412,11 @@ public function cropThumbnail($points, $characterImage, $isMyo = false) {
$wmScale = config('lorekeeper.settings.watermark_percent');
- //Assume Landscape by Default
+ // Assume Landscape by Default
$maxSize = $imageWidth * $wmScale;
if ($imageWidth > $imageHeight) {
- //Landscape
+ // Landscape
$maxSize = $imageWidth * $wmScale;
} else {
// Portrait
@@ -414,7 +424,7 @@ public function cropThumbnail($points, $characterImage, $isMyo = false) {
}
if ($wmWidth > $wmHeight) {
- //Landscape
+ // Landscape
$watermark->resize($maxSize, null, function ($constraint) {
$constraint->aspectRatio();
});
@@ -504,36 +514,43 @@ public function cropThumbnail($points, $characterImage, $isMyo = false) {
* @return bool
*/
public function createLog($senderId, $senderUrl, $recipientId, $recipientUrl, $characterId, $type, $data, $logType, $isUpdate = false, $oldData = null, $newData = null) {
- return DB::table($logType == 'character' ? 'character_log' : 'user_character_log')->insert(
- [
- 'sender_id' => $senderId,
- 'sender_url' => $senderUrl,
- 'recipient_id' => $recipientId,
- 'recipient_url' => $recipientUrl,
- 'character_id' => $characterId,
- 'log' => $type.($data ? ' ('.$data.')' : ''),
- 'log_type' => $type,
- 'data' => $data,
- 'created_at' => Carbon::now(),
- 'updated_at' => Carbon::now(),
- ] + ($logType == 'character' ?
- [
- 'change_log' => $isUpdate ? json_encode([
+ $log = null;
+
+ $shared = [
+ 'sender_id' => $senderId,
+ 'sender_url' => $senderUrl,
+ 'recipient_id' => $recipientId,
+ 'recipient_url' => $recipientUrl,
+ 'character_id' => $characterId,
+ 'log' => $type.($data ? ' ('.$data.')' : ''),
+ 'log_type' => $type,
+ 'data' => $data,
+ ];
+
+ if ($logType == 'character') {
+ $log = CharacterLog::create(
+ $shared + [
+ 'change_log' => $isUpdate ? [
'old' => $oldData,
'new' => $newData,
- ]) : null,
- ] : [])
- );
+ ] : null,
+ ]
+ );
+ } else {
+ $log = UserCharacterLog::create($shared);
+ }
+
+ return $log;
}
/**
* Creates a character image.
*
- * @param array $data
- * @param \App\Models\Character\Character $character
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param Character $character
+ * @param User $user
*
- * @return \App\Models\Character\Character|bool
+ * @return bool|Character
*/
public function createImage($data, $character, $user) {
DB::beginTransaction();
@@ -547,16 +564,21 @@ public function createImage($data, $character, $user) {
throw new \Exception('Characters require a rarity.');
}
}
- if (isset($data['subtype_id']) && $data['subtype_id']) {
- $subtype = Subtype::find($data['subtype_id']);
+ if (isset($data['subtype_ids']) && $data['subtype_ids']) {
+ if (count($data['subtype_ids']) > config('lorekeeper.extensions.multiple_subtype_limit')) {
+ throw new \Exception('Too many subtypes selected.');
+ }
if (!(isset($data['species_id']) && $data['species_id'])) {
throw new \Exception('Species must be selected to select a subtype.');
}
- if (!$subtype || $subtype->species_id != $data['species_id']) {
- throw new \Exception('Selected subtype invalid or does not match species.');
+ foreach ($data['subtype_ids'] as $subtypeId) {
+ $subtype = Subtype::find($subtypeId);
+ if (!$subtype || $subtype->species_id != $data['species_id']) {
+ throw new \Exception('Selected subtype invalid or does not match species.');
+ }
}
} else {
- $data['subtype_id'] = null;
+ $data['subtype_ids'] = null;
}
$data['is_visible'] = 1;
@@ -604,9 +626,9 @@ public function createImage($data, $character, $user) {
/**
* Updates a character image.
*
- * @param array $data
- * @param \App\Models\Character\CharacterImage $image
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param CharacterImage $image
+ * @param User $user
*
* @return bool
*/
@@ -615,13 +637,22 @@ public function updateImageFeatures($data, $image, $user) {
try {
// Check that the subtype matches
- if (isset($data['subtype_id']) && $data['subtype_id']) {
- $subtype = Subtype::find($data['subtype_id']);
+ if (isset($data['subtype_ids']) && $data['subtype_ids']) {
+ if (count($data['subtype_ids']) > config('lorekeeper.extensions.multiple_subtype_limit')) {
+ throw new \Exception('Too many subtypes selected.');
+ }
+
if (!(isset($data['species_id']) && $data['species_id'])) {
throw new \Exception('Species must be selected to select a subtype.');
}
- if (!$subtype || $subtype->species_id != $data['species_id']) {
- throw new \Exception('Selected subtype invalid or does not match species.');
+
+ $species_id = $data['species_id'] != $image->species_id ? $data['species_id'] : $image->species_id;
+
+ foreach ($data['subtype_ids'] as $subtypeId) {
+ $subtype = Subtype::find($subtypeId);
+ if (!$subtype || $subtype->species_id != $species_id) {
+ throw new \Exception('Selected subtype invalid or does not match species.');
+ }
}
}
@@ -633,7 +664,7 @@ public function updateImageFeatures($data, $image, $user) {
$old = [];
$old['features'] = $this->generateFeatureList($image);
$old['species'] = $image->species_id ? $image->species->displayName : null;
- $old['subtype'] = $image->subtype_id ? $image->subtype->displayName : null;
+ $old['subtypes'] = count($image->subtypes) ? $image->displaySubtypes() : null;
$old['rarity'] = $image->rarity_id ? $image->rarity->displayName : null;
// Clear old features
@@ -648,14 +679,26 @@ public function updateImageFeatures($data, $image, $user) {
// Update other stats
$image->species_id = $data['species_id'];
- $image->subtype_id = $data['subtype_id'] ?: null;
+ // SUBTYPES
+ $image->subtypes()->delete();
+ if (isset($data['subtype_ids']) && $data['subtype_ids']) {
+ if (count($data['subtype_ids']) > config('lorekeeper.extensions.multiple_subtype_limit')) {
+ throw new \Exception('Too many subtypes selected.');
+ }
+ foreach ($data['subtype_ids'] as $subtypeId) {
+ CharacterImageSubtype::create([
+ 'character_image_id' => $image->id,
+ 'subtype_id' => $subtypeId,
+ ]);
+ }
+ }
$image->rarity_id = $data['rarity_id'];
$image->save();
$new = [];
$new['features'] = $this->generateFeatureList($image);
$new['species'] = $image->species_id ? $image->species->displayName : null;
- $new['subtype'] = $image->subtype_id ? $image->subtype->displayName : null;
+ $new['subtypes'] = count($image->subtypes) ? $image->displaySubtypes() : null;
$new['rarity'] = $image->rarity_id ? $image->rarity->displayName : null;
// Character also keeps track of these features
@@ -677,9 +720,9 @@ public function updateImageFeatures($data, $image, $user) {
/**
* Updates image data.
*
- * @param array $data
- * @param \App\Models\Character\CharacterImage $image
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param CharacterImage $image
+ * @param User $user
*
* @return bool
*/
@@ -713,9 +756,9 @@ public function updateImageNotes($data, $image, $user) {
/**
* Updates image credits.
*
- * @param array $data
- * @param \App\Models\Character\CharacterImage $image
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param CharacterImage $image
+ * @param User $user
*
* @return bool
*/
@@ -805,9 +848,9 @@ public function updateImageCredits($data, $image, $user) {
/**
* Reuploads an image.
*
- * @param array $data
- * @param \App\Models\Character\CharacterImage $image
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param CharacterImage $image
+ * @param User $user
*
* @return bool
*/
@@ -873,9 +916,9 @@ public function reuploadImage($data, $image, $user) {
/**
* Deletes an image.
*
- * @param \App\Models\Character\CharacterImage $image
- * @param \App\Models\User\User $user
- * @param bool $forceDelete
+ * @param CharacterImage $image
+ * @param User $user
+ * @param bool $forceDelete
*
* @return bool
*/
@@ -923,9 +966,9 @@ public function deleteImage($image, $user, $forceDelete = false) {
/**
* Updates image settings.
*
- * @param array $data
- * @param \App\Models\Character\CharacterImage $image
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param CharacterImage $image
+ * @param User $user
*
* @return bool
*/
@@ -943,6 +986,7 @@ public function updateImageSettings($data, $image, $user) {
$image->is_valid = isset($data['is_valid']);
$image->is_visible = isset($data['is_visible']);
+ $image->content_warnings = isset($data['content_warnings']) ? explode(',', $data['content_warnings']) : null;
$image->save();
// Add a log for the character
@@ -960,8 +1004,8 @@ public function updateImageSettings($data, $image, $user) {
/**
* Updates a character's active image.
*
- * @param \App\Models\Character\CharacterImage $image
- * @param \App\Models\User\User $user
+ * @param CharacterImage $image
+ * @param User $user
*
* @return bool
*/
@@ -998,9 +1042,9 @@ public function updateActiveImage($image, $user) {
/**
* Sorts a character's images.
*
- * @param array $data
- * @param \App\Models\User\User $user
- * @param mixed $character
+ * @param array $data
+ * @param User $user
+ * @param mixed $character
*
* @return bool
*/
@@ -1020,12 +1064,12 @@ public function sortImages($data, $character, $user) {
$count = 0;
foreach ($images as $image) {
- //if($count == 1)
- //{
+ // if($count == 1)
+ // {
// // Set the first one as the active image
// $image->character->image_id = $image->id;
// $image->character->save();
- //}
+ // }
$image->sort = $count;
$image->save();
$count++;
@@ -1046,8 +1090,8 @@ public function sortImages($data, $character, $user) {
/**
* Sorts a user's characters.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
* @return bool
*/
@@ -1080,9 +1124,9 @@ public function sortCharacters($data, $user) {
/**
* Updates a character's stats.
*
- * @param array $data
- * @param \App\Models\User\User $user
- * @param mixed $character
+ * @param array $data
+ * @param User $user
+ * @param mixed $character
*
* @return bool
*/
@@ -1183,9 +1227,9 @@ public function updateCharacterStats($data, $character, $user) {
/**
* Updates a character's description.
*
- * @param array $data
- * @param \App\Models\Character\Character $character
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param Character $character
+ * @param User $user
*
* @return bool
*/
@@ -1219,9 +1263,9 @@ public function updateCharacterDescription($data, $character, $user) {
/**
* Updates a character's settings.
*
- * @param array $data
- * @param \App\Models\User\User $user
- * @param mixed $character
+ * @param array $data
+ * @param User $user
+ * @param mixed $character
*
* @return bool
*/
@@ -1253,10 +1297,10 @@ public function updateCharacterSettings($data, $character, $user) {
/**
* Updates a character's profile.
*
- * @param array $data
- * @param \App\Models\Character\Character $character
- * @param \App\Models\User\User $user
- * @param bool $isAdmin
+ * @param array $data
+ * @param Character $character
+ * @param User $user
+ * @param bool $isAdmin
*
* @return bool
*/
@@ -1340,8 +1384,8 @@ public function updateCharacterProfile($data, $character, $user, $isAdmin = fals
/**
* Deletes a character.
*
- * @param \App\Models\Character\Character $character
- * @param \App\Models\User\User $user
+ * @param Character $character
+ * @param User $user
*
* @return bool
*/
@@ -1392,9 +1436,9 @@ public function deleteCharacter($character, $user) {
/**
* Creates a character transfer.
*
- * @param array $data
- * @param \App\Models\Character\Character $character
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param Character $character
+ * @param User $user
*
* @return bool
*/
@@ -1468,9 +1512,9 @@ public function createTransfer($data, $character, $user) {
/**
* Forces an admin transfer of a character.
*
- * @param array $data
- * @param \App\Models\Character\Character $character
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param Character $character
+ * @param User $user
*
* @return bool
*/
@@ -1550,8 +1594,8 @@ public function adminTransfer($data, $character, $user) {
/**
* Processes a character transfer.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
* @return bool
*/
@@ -1571,16 +1615,16 @@ public function processTransfer($data, $user) {
// Process the character move if the transfer has already been approved
if ($transfer->is_approved) {
- //check the cooldown saved
+ // check the cooldown saved
if (isset($transfer->data['cooldown'])) {
$cooldown = $transfer->data['cooldown'];
}
$this->moveCharacter($transfer->character, $transfer->recipient, 'User Transfer', $cooldown);
if (!Settings::get('open_transfers_queue')) {
- $transfer->data = json_encode([
+ $transfer->data = [
'cooldown' => $cooldown,
'staff_id' => null,
- ]);
+ ];
}
// Notify sender of the successful transfer
@@ -1593,9 +1637,9 @@ public function processTransfer($data, $user) {
}
} else {
$transfer->status = 'Rejected';
- $transfer->data = json_encode([
+ $transfer->data = [
'staff_id' => null,
- ]);
+ ];
// Notify sender that transfer has been rejected
Notifications::create('CHARACTER_TRANSFER_REJECTED', $transfer->sender, [
@@ -1618,8 +1662,8 @@ public function processTransfer($data, $user) {
/**
* Cancels a character transfer.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
* @return bool
*/
@@ -1654,8 +1698,8 @@ public function cancelTransfer($data, $user) {
/**
* Processes a character transfer in the approvals queue.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
* @return bool
*/
@@ -1674,10 +1718,10 @@ public function processTransferQueue($data, $user) {
if ($data['action'] == 'Approve') {
$transfer->is_approved = 1;
- $transfer->data = json_encode([
+ $transfer->data = [
'staff_id' => $user->id,
'cooldown' => $data['cooldown'] ?? Settings::get('transfer_cooldown'),
- ]);
+ ];
// Process the character move if the recipient has already accepted the transfer
if ($transfer->status == 'Accepted') {
@@ -1719,9 +1763,9 @@ public function processTransferQueue($data, $user) {
$transfer->status = 'Rejected';
$transfer->reason = $data['reason'] ?? null;
- $transfer->data = json_encode([
+ $transfer->data = [
'staff_id' => $user->id,
- ]);
+ ];
// Notify both parties that the request was denied
Notifications::create('CHARACTER_TRANSFER_DENIED', $transfer->sender, [
@@ -1750,11 +1794,11 @@ public function processTransferQueue($data, $user) {
/**
* Moves a character from one user to another.
*
- * @param \App\Models\Character\Character $character
- * @param \App\Models\User\User $recipient
- * @param string $data
- * @param int $cooldown
- * @param string $logType
+ * @param Character $character
+ * @param User $recipient
+ * @param string $data
+ * @param int $cooldown
+ * @param string $logType
*/
public function moveCharacter($character, $recipient, $data, $cooldown = -1, $logType = null) {
$sender = $character->user;
@@ -1838,7 +1882,7 @@ public function moveCharacter($character, $recipient, $data, $cooldown = -1, $lo
* @param array $data
* @param bool $isMyo
*
- * @return \App\Models\Character\Character|bool
+ * @return bool|Character
*/
private function handleCharacter($data, $isMyo = false) {
try {
@@ -1847,7 +1891,7 @@ private function handleCharacter($data, $isMyo = false) {
$data['number'] = null;
$data['slug'] = null;
$data['species_id'] = isset($data['species_id']) && $data['species_id'] ? $data['species_id'] : null;
- $data['subtype_id'] = isset($data['subtype_id']) && $data['subtype_id'] ? $data['subtype_id'] : null;
+ $data['subtype_ids'] = isset($data['subtype_ids']) && $data['subtype_ids'] ? $data['subtype_ids'] : null;
$data['rarity_id'] = isset($data['rarity_id']) && $data['rarity_id'] ? $data['rarity_id'] : null;
}
@@ -1892,15 +1936,14 @@ private function handleCharacter($data, $isMyo = false) {
* @param bool $isMyo
* @param mixed $character
*
- * @return \App\Models\Character\Character $character
- * @return \App\Models\Character\CharacterImage|bool
+ * @return Character $character
+ * @return bool|CharacterImage
*/
private function handleCharacterImage($data, $character, $isMyo = false) {
try {
if ($isMyo) {
- $data['species_id'] = (isset($data['species_id']) && $data['species_id']) ? $data['species_id'] : null;
- $data['subtype_id'] = isset($data['subtype_id']) && $data['subtype_id'] ? $data['subtype_id'] : null;
- $data['rarity_id'] = (isset($data['rarity_id']) && $data['rarity_id']) ? $data['rarity_id'] : null;
+ $data['species_id'] = isset($data['species_id']) && $data['species_id'] ? $data['species_id'] : null;
+ $data['rarity_id'] = isset($data['rarity_id']) && $data['rarity_id'] ? $data['rarity_id'] : null;
// Use default images for MYO slots without an image provided
if (!isset($data['image'])) {
@@ -1913,8 +1956,8 @@ private function handleCharacterImage($data, $character, $isMyo = false) {
}
}
$imageData = Arr::only($data, [
- 'species_id', 'subtype_id', 'rarity_id', 'use_cropper',
- 'x0', 'x1', 'y0', 'y1',
+ 'species_id', 'rarity_id', 'use_cropper',
+ 'x0', 'x1', 'y0', 'y1', 'content_warnings',
]);
$imageData['use_cropper'] = isset($data['use_cropper']);
$imageData['description'] = $data['image_description'] ?? null;
@@ -1927,9 +1970,20 @@ private function handleCharacterImage($data, $character, $isMyo = false) {
$imageData['extension'] = (config('lorekeeper.settings.masterlist_image_format') ?? ($data['extension'] ?? $data['image']->getClientOriginalExtension()));
$imageData['fullsize_extension'] = (config('lorekeeper.settings.masterlist_fullsizes_format') ?? ($data['fullsize_extension'] ?? $data['image']->getClientOriginalExtension()));
$imageData['character_id'] = $character->id;
+ $imageData['content_warnings'] = isset($data['content_warnings']) ? explode(',', $data['content_warnings']) : null;
$image = CharacterImage::create($imageData);
+ // create subtype relations
+ if (isset($data['subtype_ids']) && $data['subtype_ids']) {
+ foreach ($data['subtype_ids'] as $subtypeId) {
+ CharacterImageSubtype::create([
+ 'character_image_id' => $image->id,
+ 'subtype_id' => $subtypeId,
+ ]);
+ }
+ }
+
// Check if entered url(s) have aliases associated with any on-site users
$designers = array_filter($data['designer_url']); // filter null values
foreach ($designers as $key=> $url) {
@@ -2020,7 +2074,7 @@ private function handleCharacterImage($data, $character, $isMyo = false) {
/**
* Generates a list of features for displaying.
*
- * @param \App\Models\Character\CharacterImage $image
+ * @param CharacterImage $image
*
* @return string
*/
@@ -2036,7 +2090,7 @@ private function generateFeatureList($image) {
/**
* Generates a list of image credits for displaying.
*
- * @param \App\Models\Character\CharacterImage $image
+ * @param CharacterImage $image
*
* @return string
*/
diff --git a/app/Services/CurrencyManager.php b/app/Services/CurrencyManager.php
index 2ea9c08041..7b3450560a 100644
--- a/app/Services/CurrencyManager.php
+++ b/app/Services/CurrencyManager.php
@@ -5,6 +5,7 @@
use App\Facades\Notifications;
use App\Models\Character\CharacterCurrency;
use App\Models\Currency\Currency;
+use App\Models\Currency\CurrencyConversion;
use App\Models\User\User;
use App\Models\User\UserCurrency;
use Carbon\Carbon;
@@ -23,8 +24,8 @@ class CurrencyManager extends Service {
/**
* Admin function for granting currency to multiple users.
*
- * @param array $data
- * @param \App\Models\User\User $staff
+ * @param array $data
+ * @param User $staff
*
* @return bool
*/
@@ -93,7 +94,7 @@ public function grantUserCurrencies($data, $staff) {
*
* @param array $data
* @param \App\Models\Character\Character $staff
- * @param \App\Models\User\User $staff
+ * @param User $staff
* @param mixed $character
*
* @return bool
@@ -155,10 +156,10 @@ public function grantCharacterCurrencies($data, $character, $staff) {
/**
* Transfers currency between users.
*
- * @param \App\Models\User\User $sender
- * @param \App\Models\User\User $recipient
- * @param \App\Models\Currency\Currency $currency
- * @param int $quantity
+ * @param User $sender
+ * @param User $recipient
+ * @param Currency $currency
+ * @param int $quantity
*
* @return bool
*/
@@ -205,10 +206,10 @@ public function transferCurrency($sender, $recipient, $currency, $quantity) {
/**
* Transfers currency between a user and character.
*
- * @param \App\Models\Character\Character|\App\Models\User\User $sender
- * @param \App\Models\Character\Character|\App\Models\User\User $recipient
- * @param \App\Models\Currency\Currency $currency
- * @param int $quantity
+ * @param \App\Models\Character\Character|User $sender
+ * @param \App\Models\Character\Character|User $recipient
+ * @param Currency $currency
+ * @param int $quantity
*
* @return bool
*/
@@ -251,12 +252,12 @@ public function transferCharacterCurrency($sender, $recipient, $currency, $quant
/**
* Credits currency to a user or character.
*
- * @param \App\Models\Character\Character|\App\Models\User\User $sender
- * @param \App\Models\Character\Character|\App\Models\User\User $recipient
- * @param string $type
- * @param string $data
- * @param \App\Models\Currency\Currency $currency
- * @param int $quantity
+ * @param \App\Models\Character\Character|User $sender
+ * @param \App\Models\Character\Character|User $recipient
+ * @param string $type
+ * @param string $data
+ * @param Currency $currency
+ * @param int $quantity
*
* @return bool
*/
@@ -308,12 +309,12 @@ public function creditCurrency($sender, $recipient, $type, $data, $currency, $qu
/**
* Debits currency from a user or character.
*
- * @param \App\Models\Character\Character|\App\Models\User\User $sender
- * @param \App\Models\Character\Character|\App\Models\User\User $recipient
- * @param string $type
- * @param string $data
- * @param \App\Models\Currency\Currency $currency
- * @param int $quantity
+ * @param \App\Models\Character\Character|User $sender
+ * @param \App\Models\Character\Character|User $recipient
+ * @param string $type
+ * @param string $data
+ * @param Currency $currency
+ * @param int $quantity
*
* @return bool
*/
@@ -360,6 +361,73 @@ public function debitCurrency($sender, $recipient, $type, $data, $currency, $qua
return $this->rollbackReturn(false);
}
+ /**
+ * Converts currency from one type to another.
+ *
+ * @param Currency $currency
+ * @param Currency $conversion
+ * @param int $quantity
+ * @param User $user
+ *
+ * @return bool
+ */
+ public function convertCurrency($currency, $conversion, $quantity, $user) {
+ DB::beginTransaction();
+
+ try {
+ if (!$currency) {
+ throw new \Exception('Invalid currency selected.');
+ }
+ if (!$conversion) {
+ throw new \Exception('Invalid conversion selected.');
+ }
+ if ($quantity <= 0) {
+ throw new \Exception('Invalid quantity entered.');
+ }
+
+ // first make sure that quantity is in the appropriate ratio
+ $conversion_rate = CurrencyConversion::where('currency_id', $currency->id)->where('conversion_id', $conversion->id)->first();
+
+ if (!$conversion_rate) {
+ throw new \Exception('Invalid conversion.');
+ }
+
+ $ratio = $conversion_rate->ratio(true);
+
+ // make sure the quantity is in the appropriate ratio
+ if ($quantity % $ratio[0] != 0) {
+ throw new \Exception('Invalid quantity entered, must be in multiples of '.$ratio[0].'.');
+ }
+
+ // make sure the user has enough of the currency to convert
+ $record = UserCurrency::where('user_id', $user->id)->where('currency_id', $currency->id)->first();
+ if (!$record || $record->quantity < $quantity) {
+ throw new \Exception('Not enough '.$currency->name.' to carry out this action.');
+ }
+
+ // save log since we change quantity later
+ $log = 'Converted '.$quantity.' '.$currency->displayName.' to '.$conversion->displayName;
+
+ // remove the currency
+ if (!$this->debitCurrency($user, null, 'Currency Conversion', $log, $currency, $quantity)) {
+ throw new \Exception('Failed to debit currency.');
+ }
+
+ $quantity = intval($quantity / $ratio[0] * $ratio[1]);
+
+ // add the converted currency
+ if (!$this->creditCurrency(null, $user, 'Currency Conversion', $log, $conversion, $quantity)) {
+ throw new \Exception('Failed to credit currency.');
+ }
+
+ return $this->commitReturn(true);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
/**
* Creates a currency log.
*
diff --git a/app/Services/CurrencyService.php b/app/Services/CurrencyService.php
index 55bd53534b..1c283abdf1 100644
--- a/app/Services/CurrencyService.php
+++ b/app/Services/CurrencyService.php
@@ -4,6 +4,7 @@
use App\Models\Character\CharacterCurrency;
use App\Models\Currency\Currency;
+use App\Models\Currency\CurrencyCategory;
use App\Models\User\UserCurrency;
use Illuminate\Support\Facades\DB;
@@ -13,17 +14,176 @@ class CurrencyService extends Service {
| Currency Service
|--------------------------------------------------------------------------
|
- | Handles the creation and editing of currency.
+ | Handles the creation and editing of currency categories and currencies.
|
*/
+ /**********************************************************************************************
+
+ CURRENCY CATEGORIES
+
+ **********************************************************************************************/
+
+ /**
+ * Create a category.
+ *
+ * @param array $data
+ * @param \App\Models\User\User $user
+ *
+ * @return bool|CurrencyCategory
+ */
+ public function createCurrencyCategory($data, $user) {
+ DB::beginTransaction();
+
+ try {
+ $data = $this->populateCategoryData($data);
+
+ $image = null;
+ if (isset($data['image']) && $data['image']) {
+ $data['has_image'] = 1;
+ $data['hash'] = randomString(10);
+ $image = $data['image'];
+ unset($data['image']);
+ } else {
+ $data['has_image'] = 0;
+ }
+
+ $category = CurrencyCategory::create($data);
+
+ if (!$this->logAdminAction($user, 'Created Currency Category', 'Created '.$category->displayName)) {
+ throw new \Exception('Failed to log admin action.');
+ }
+
+ if ($image) {
+ $this->handleImage($image, $category->categoryImagePath, $category->categoryImageFileName);
+ }
+
+ return $this->commitReturn($category);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
+ /**
+ * Update a category.
+ *
+ * @param CurrencyCategory $category
+ * @param array $data
+ * @param \App\Models\User\User $user
+ *
+ * @return bool|CurrencyCategory
+ */
+ public function updateCurrencyCategory($category, $data, $user) {
+ DB::beginTransaction();
+
+ try {
+ // More specific validation
+ if (CurrencyCategory::where('name', $data['name'])->where('id', '!=', $category->id)->exists()) {
+ throw new \Exception('The name has already been taken.');
+ }
+
+ $data = $this->populateCategoryData($data, $category);
+
+ $image = null;
+ if (isset($data['image']) && $data['image']) {
+ $data['has_image'] = 1;
+ $data['hash'] = randomString(10);
+ $image = $data['image'];
+ unset($data['image']);
+ }
+
+ $category->update($data);
+
+ if (!$this->logAdminAction($user, 'Updated Currency Category', 'Updated '.$category->displayName)) {
+ throw new \Exception('Failed to log admin action.');
+ }
+
+ if ($category) {
+ $this->handleImage($image, $category->categoryImagePath, $category->categoryImageFileName);
+ }
+
+ return $this->commitReturn($category);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
+ /**
+ * Delete a category.
+ *
+ * @param CurrencyCategory $category
+ * @param \App\Models\User\User $user
+ *
+ * @return bool
+ */
+ public function deleteCurrencyCategory($category, $user) {
+ DB::beginTransaction();
+
+ try {
+ // Check first if the category is currently in use
+ if (Currency::where('currency_category_id', $category->id)->exists()) {
+ throw new \Exception('A currency with this category exists. Please change its category first.');
+ }
+ if (!$this->logAdminAction($user, 'Deleted Currency Category', 'Deleted '.$category->name)) {
+ throw new \Exception('Failed to log admin action.');
+ }
+
+ if ($category->has_image) {
+ $this->deleteImage($category->categoryImagePath, $category->categoryImageFileName);
+ }
+ $category->delete();
+
+ return $this->commitReturn(true);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
+ /**
+ * Sorts category order.
+ *
+ * @param string $data
+ *
+ * @return bool
+ */
+ public function sortCurrencyCategory($data) {
+ DB::beginTransaction();
+
+ try {
+ // explode the sort array and reverse it since the order is inverted
+ $sort = array_reverse(explode(',', $data));
+
+ foreach ($sort as $key => $s) {
+ CurrencyCategory::where('id', $s)->update(['sort' => $key]);
+ }
+
+ return $this->commitReturn(true);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
+ /**********************************************************************************************
+
+ CURRENCIES
+
+ **********************************************************************************************/
+
/**
* Creates a new currency.
*
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Currency\Currency|bool
+ * @return bool|Currency
*/
public function createCurrency($data, $user) {
DB::beginTransaction();
@@ -34,6 +194,10 @@ public function createCurrency($data, $user) {
throw new \Exception('Please choose if this currency is attached to users and/or characters.');
}
+ if ((isset($data['currency_category_id']) && $data['currency_category_id']) && !CurrencyCategory::where('id', $data['currency_category_id'])->exists()) {
+ throw new \Exception('The selected currency category is invalid.');
+ }
+
$data = $this->populateData($data);
$icon = $image = null;
@@ -78,11 +242,11 @@ public function createCurrency($data, $user) {
/**
* Updates a currency.
*
- * @param \App\Models\Currency\Currency $currency
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param Currency $currency
+ * @param array $data
+ * @param \App\Models\User\User $user
*
- * @return \App\Models\Currency\Currency|bool
+ * @return bool|Currency
*/
public function updateCurrency($currency, $data, $user) {
DB::beginTransaction();
@@ -98,6 +262,9 @@ public function updateCurrency($currency, $data, $user) {
if (isset($data['abbreviation']) && Currency::where('abbreviation', $data['abbreviation'])->where('id', '!=', $currency->id)->exists()) {
throw new \Exception('The abbreviation has already been taken.');
}
+ if ((isset($data['currency_category_id']) && $data['currency_category_id']) && !CurrencyCategory::where('id', $data['currency_category_id'])->exists()) {
+ throw new \Exception('The selected currency category is invalid.');
+ }
$data = $this->populateData($data, $currency);
@@ -117,6 +284,8 @@ public function updateCurrency($currency, $data, $user) {
$currency->update($data);
+ $this->populateConversions($currency, $data);
+
if (!$this->logAdminAction($user, 'Updated Currency', 'Updated '.$currency->displayName)) {
throw new \Exception('Failed to log admin action.');
}
@@ -139,8 +308,8 @@ public function updateCurrency($currency, $data, $user) {
/**
* Deletes a currency.
*
- * @param \App\Models\Currency\Currency $currency
- * @param mixed $user
+ * @param Currency $currency
+ * @param mixed $user
*
* @return bool
*/
@@ -154,7 +323,7 @@ public function deleteCurrency($currency, $user) {
if (DB::table('prompt_rewards')->where('rewardable_type', 'Currency')->where('rewardable_id', $currency->id)->exists()) {
throw new \Exception('A prompt currently distributes this currency as a reward. Please remove the currency before deleting it.');
}
- if (DB::table('shop_stock')->where('currency_id', $currency->id)->exists()) {
+ if (DB::table('shop_stock_costs')->where('cost_type', 'Currency')->where('cost_id', $currency->id)->exists()) {
throw new \Exception('A shop currently requires this currency to purchase an currency. Please change the currency before deleting it.');
}
// Disabled for now due to issues with JSON lookup with older mysql versions/mariaDB
@@ -190,7 +359,7 @@ public function deleteCurrency($currency, $user) {
/**
* Sorts currency order.
*
- * @param array $data
+ * @param string $data
* @param string $type
*
* @return bool
@@ -214,11 +383,41 @@ public function sortCurrency($data, $type) {
return $this->rollbackReturn(false);
}
+ /**
+ * Handle category data.
+ *
+ * @param array $data
+ * @param CurrencyCategory|null $category
+ *
+ * @return array
+ */
+ private function populateCategoryData($data, $category = null) {
+ if (isset($data['description']) && $data['description']) {
+ $data['parsed_description'] = parse($data['description']);
+ } else {
+ $data['parsed_description'] = null;
+ }
+
+ if (!isset($data['is_visible'])) {
+ $data['is_visible'] = 0;
+ }
+
+ if (isset($data['remove_image'])) {
+ if ($category && $category->has_image && $data['remove_image']) {
+ $data['has_image'] = 0;
+ $this->deleteImage($category->categoryImagePath, $category->categoryImageFileName);
+ }
+ unset($data['remove_image']);
+ }
+
+ return $data;
+ }
+
/**
* Processes user input for creating/updating a currency.
*
- * @param array $data
- * @param \App\Models\Currency\Currency $currency
+ * @param array $data
+ * @param Currency $currency
*
* @return array
*/
@@ -248,6 +447,10 @@ private function populateData($data, $currency = null) {
$data['allow_character_to_user'] = 0;
}
+ if (!isset($data['is_visible'])) {
+ $data['is_visible'] = 0;
+ }
+
$data['sort_user'] = $data['sort_character'] = 0;
// Process the checkbox fields
@@ -275,4 +478,26 @@ private function populateData($data, $currency = null) {
return $data;
}
+
+ /**
+ * Processes user input for creating/updating a currency's conversions.
+ *
+ * @param Currency $currency
+ * @param array $data
+ */
+ private function populateConversions($currency, $data) {
+ $currency->conversions()->delete();
+ if (isset($data['conversion_id']) && $data['conversion_id']) {
+ foreach ($data['conversion_id'] as $key => $conversion_id) {
+ $conversion = Currency::find($conversion_id);
+ if (!$conversion) {
+ continue;
+ }
+ $currency->conversions()->create([
+ 'conversion_id' => $conversion_id,
+ 'rate' => $data['rate'][$key] ?? 1.00,
+ ]);
+ }
+ }
+ }
}
diff --git a/app/Services/DesignUpdateManager.php b/app/Services/DesignUpdateManager.php
index b9e87732a3..6bbb002c50 100644
--- a/app/Services/DesignUpdateManager.php
+++ b/app/Services/DesignUpdateManager.php
@@ -7,6 +7,7 @@
use App\Models\Character\CharacterDesignUpdate;
use App\Models\Character\CharacterFeature;
use App\Models\Character\CharacterImage;
+use App\Models\Character\CharacterImageSubtype;
use App\Models\Currency\Currency;
use App\Models\Feature\Feature;
use App\Models\Rarity;
@@ -33,10 +34,10 @@ class DesignUpdateManager extends Service {
/**
* Creates a character design update request (or a MYO design approval request).
*
- * @param \App\Models\Character\Character $character
- * @param \App\Models\User\User $user
+ * @param Character $character
+ * @param User $user
*
- * @return \App\Models\Character\CharacterDesignUpdate|bool
+ * @return bool|CharacterDesignUpdate
*/
public function createDesignUpdateRequest($character, $user) {
DB::beginTransaction();
@@ -63,7 +64,7 @@ public function createDesignUpdateRequest($character, $user) {
// Set some data based on the character's existing stats
'rarity_id' => $character->image->rarity_id,
'species_id' => $character->image->species_id,
- 'subtype_id' => $character->image->subtype_id,
+ 'subtype_ids' => $character->image->subtypes()->pluck('subtype_id'),
];
$request = CharacterDesignUpdate::create($data);
@@ -94,8 +95,8 @@ public function createDesignUpdateRequest($character, $user) {
/**
* Saves the comment section of a character design update request.
*
- * @param array $data
- * @param \App\Models\Character\CharacterDesignUpdate $request
+ * @param array $data
+ * @param CharacterDesignUpdate $request
*
* @return bool
*/
@@ -119,9 +120,9 @@ public function saveRequestComment($data, $request) {
/**
* Saves the image upload section of a character design update request.
*
- * @param array $data
- * @param \App\Models\Character\CharacterDesignUpdate $request
- * @param bool $isAdmin
+ * @param array $data
+ * @param CharacterDesignUpdate $request
+ * @param bool $isAdmin
*
* @return bool
*/
@@ -243,8 +244,8 @@ public function saveRequestImage($data, $request, $isAdmin = false) {
/**
* Saves the addons section of a character design update request.
*
- * @param array $data
- * @param \App\Models\Character\CharacterDesignUpdate $request
+ * @param array $data
+ * @param CharacterDesignUpdate $request
*
* @return bool
*/
@@ -338,10 +339,10 @@ public function saveRequestAddons($data, $request) {
}
$request->has_addons = 1;
- $request->data = json_encode([
+ $request->data = [
'user' => Arr::only(getDataReadyAssets($userAssets), ['user_items', 'currencies']),
'character' => Arr::only(getDataReadyAssets($characterAssets), ['currencies']),
- ]);
+ ];
$request->save();
return $this->commitReturn(true);
@@ -355,8 +356,8 @@ public function saveRequestAddons($data, $request) {
/**
* Saves the character features (traits) section of a character design update request.
*
- * @param array $data
- * @param \App\Models\Character\CharacterDesignUpdate $request
+ * @param array $data
+ * @param CharacterDesignUpdate $request
*
* @return bool
*/
@@ -373,20 +374,33 @@ public function saveRequestFeatures($data, $request) {
$rarity = ($request->character->is_myo_slot && $request->character->image->rarity_id) ? $request->character->image->rarity : Rarity::find($data['rarity_id']);
$species = ($request->character->is_myo_slot && $request->character->image->species_id) ? $request->character->image->species : Species::find($data['species_id']);
- if (isset($data['subtype_id']) && $data['subtype_id']) {
- $subtype = ($request->character->is_myo_slot && $request->character->image->subtype_id) ? $request->character->image->subtype : Subtype::find($data['subtype_id']);
+
+ if (($request->character->is_myo_slot && count($request->character->image->subtypes))) {
+ $subtypes = $request->character->image->subtypes()->pluck('subtype_id')->toArray();
} else {
- $subtype = null;
+ if (isset($data['subtype_ids']) && $data['subtype_ids']) {
+ if (count($data['subtype_ids']) > config('lorekeeper.extensions.multiple_subtype_limit')) {
+ throw new \Exception('Too many subtypes selected.');
+ }
+ $subtypes = $data['subtype_ids'];
+ foreach ($data['subtype_ids'] as $subtypeId) {
+ $subtype = Subtype::find($subtypeId);
+ if (!$subtype) {
+ throw new \Exception('Invalid subtype selected.');
+ }
+ if ($subtype && $subtype->species_id != $species->id) {
+ throw new \Exception('Subtype does not match the species.');
+ }
+ }
+ }
}
+
if (!$rarity) {
throw new \Exception('Invalid rarity selected.');
}
if (!$species) {
throw new \Exception('Invalid species selected.');
}
- if ($subtype && $subtype->species_id != $species->id) {
- throw new \Exception('Subtype does not match the species.');
- }
// Clear old features
$request->features()->delete();
@@ -403,7 +417,7 @@ public function saveRequestFeatures($data, $request) {
// Skip the feature if the rarity is too high.
// Comment out this check if rarities should have more berth for traits choice.
- //if($features[$featureId]->rarity->sort > $rarity->sort) continue;
+ // if($features[$featureId]->rarity->sort > $rarity->sort) continue;
// Skip the feature if it's not the correct species.
if ($features[$featureId]->species_id && $features[$featureId]->species_id != $species->id) {
@@ -416,7 +430,7 @@ public function saveRequestFeatures($data, $request) {
// Update other stats
$request->species_id = $species->id;
$request->rarity_id = $rarity->id;
- $request->subtype_id = $subtype ? $subtype->id : null;
+ $request->subtype_ids = $subtypes ?? null;
$request->has_features = 1;
$request->save();
@@ -431,7 +445,7 @@ public function saveRequestFeatures($data, $request) {
/**
* Submit a character design update request to the approval queue.
*
- * @param \App\Models\Character\CharacterDesignUpdate $request
+ * @param CharacterDesignUpdate $request
*
* @return bool
*/
@@ -468,9 +482,9 @@ public function submitRequest($request) {
/**
* Approves a character design update request and processes it.
*
- * @param array $data
- * @param \App\Models\Character\CharacterDesignUpdate $request
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param CharacterDesignUpdate $request
+ * @param User $user
*
* @return bool
*/
@@ -574,11 +588,27 @@ public function approveRequest($data, $request, $user) {
'y0' => $request->y0,
'y1' => $request->y1,
'species_id' => $request->species_id,
- 'subtype_id' => ($request->character->is_myo_slot && isset($request->character->image->subtype_id)) ? $request->character->image->subtype_id : $request->subtype_id,
'rarity_id' => $request->rarity_id,
'sort' => 0,
]);
+ // do subtype stuff
+ if ($request->character->is_myo_slot && count($request->character->image->subtypes)) {
+ foreach ($request->character->image->subtypes as $subtype) {
+ CharacterImageSubtype::create([
+ 'character_image_id' => $image->id,
+ 'subtype_id' => $subtype->subtype_id,
+ ]);
+ }
+ } elseif ($request->subtype_ids) {
+ foreach ($request->subtypes() as $subtypeId) {
+ CharacterImageSubtype::create([
+ 'character_image_id' => $image->id,
+ 'subtype_id' => $subtypeId,
+ ]);
+ }
+ }
+
// Shift the image credits over to the new image
$request->designers()->update(['character_type' => 'Character', 'character_image_id' => $image->id]);
$request->artists()->update(['character_type' => 'Character', 'character_image_id' => $image->id]);
@@ -715,11 +745,11 @@ public function approveRequest($data, $request, $user) {
* Rejection can be a soft rejection (reopens the request so the user can edit it and resubmit)
* or a hard rejection (takes the request out of the queue completely).
*
- * @param array $data
- * @param \App\Models\Character\CharacterDesignUpdate $request
- * @param \App\Models\User\User $user
- * @param bool $forceReject
- * @param mixed $notification
+ * @param array $data
+ * @param CharacterDesignUpdate $request
+ * @param User $user
+ * @param bool $forceReject
+ * @param mixed $notification
*
* @return bool
*/
@@ -805,13 +835,14 @@ public function rejectRequest($data, $request, $user, $forceReject = false, $not
/**
* Cancels a character design update request.
*
- * @param array $data
- * @param \App\Models\Character\CharacterDesignUpdate $request
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param CharacterDesignUpdate $request
+ * @param User $user
+ * @param bool $self
*
* @return bool
*/
- public function cancelRequest($data, $request, $user) {
+ public function cancelRequest($data, $request, $user, $self = 0) {
DB::beginTransaction();
try {
@@ -828,21 +859,30 @@ public function cancelRequest($data, $request, $user) {
// to add a comment to it. Status is returned to Draft status.
// Use when rejecting a request that just requires minor modifications to approve.
- // Set staff comment and status
- $request->staff_id = $user->id;
- $request->staff_comments = $data['staff_comments'] ?? null;
- $request->status = 'Draft';
- if (!isset($data['preserve_queue'])) {
+ if (!$self) {
+ // Set staff comment if this is not a self-cancel
+ $request->staff_id = $user->id;
+ $request->staff_comments = $data['staff_comments'] ?? null;
+ if (!isset($data['preserve_queue'])) {
+ $request->submitted_at = null;
+ }
+ } else {
$request->submitted_at = null;
}
+
+ // Set status
+ $request->status = 'Draft';
$request->save();
- // Notify the user
- Notifications::create('DESIGN_CANCELED', $request->user, [
- 'design_url' => $request->url,
- 'character_url' => $request->character->url,
- 'name' => $request->character->fullName,
- ]);
+ if (!$self) {
+ // Notify the user if it is not being canceled by the user themself.
+ // Note that an admin canceling their own will also not result in a notification
+ Notifications::create('DESIGN_CANCELED', $request->user, [
+ 'design_url' => $request->url,
+ 'character_url' => $request->character->url,
+ 'name' => $request->character->fullName,
+ ]);
+ }
return $this->commitReturn(true);
} catch (\Exception $e) {
@@ -855,7 +895,7 @@ public function cancelRequest($data, $request, $user) {
/**
* Deletes a character design update request.
*
- * @param \App\Models\Character\CharacterDesignUpdate $request
+ * @param CharacterDesignUpdate $request
*
* @return bool
*/
@@ -926,9 +966,9 @@ public function deleteRequest($request) {
/**
* Votes on a character design update request.
*
- * @param string $action
- * @param \App\Models\Character\CharacterDesignUpdate $request
- * @param \App\Models\User\User $user
+ * @param string $action
+ * @param CharacterDesignUpdate $request
+ * @param User $user
*
* @return bool
*/
@@ -955,10 +995,10 @@ public function voteRequest($action, $request, $user) {
break;
}
- $voteData = (isset($request->vote_data) ? collect(json_decode($request->vote_data, true)) : collect([]));
+ $voteData = (isset($request->vote_data) ? collect($request->vote_data, true) : collect([]));
$voteData->get($user->id) ? $voteData->pull($user->id) : null;
$voteData->put($user->id, $vote);
- $request->vote_data = $voteData->toJson();
+ $request->vote_data = $voteData;
$request->save();
diff --git a/app/Services/FeatureService.php b/app/Services/FeatureService.php
index 76b7cbc3f8..a7ede66b7c 100644
--- a/app/Services/FeatureService.php
+++ b/app/Services/FeatureService.php
@@ -30,7 +30,7 @@ class FeatureService extends Service {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Feature\FeatureCategory|bool
+ * @return bool|FeatureCategory
*/
public function createFeatureCategory($data, $user) {
DB::beginTransaction();
@@ -69,11 +69,11 @@ public function createFeatureCategory($data, $user) {
/**
* Update a category.
*
- * @param \App\Models\Feature\FeatureCategory $category
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param FeatureCategory $category
+ * @param array $data
+ * @param \App\Models\User\User $user
*
- * @return \App\Models\Feature\FeatureCategory|bool
+ * @return bool|FeatureCategory
*/
public function updateFeatureCategory($category, $data, $user) {
DB::beginTransaction();
@@ -119,8 +119,8 @@ public function updateFeatureCategory($category, $data, $user) {
/**
* Delete a category.
*
- * @param \App\Models\Feature\FeatureCategory $category
- * @param mixed $user
+ * @param FeatureCategory $category
+ * @param mixed $user
*
* @return bool
*/
@@ -188,7 +188,7 @@ public function sortFeatureCategory($data) {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Feature\Feature|bool
+ * @return bool|Feature
*/
public function createFeature($data, $user) {
DB::beginTransaction();
@@ -253,11 +253,11 @@ public function createFeature($data, $user) {
/**
* Updates a feature.
*
- * @param \App\Models\Feature\Feature $feature
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param Feature $feature
+ * @param array $data
+ * @param \App\Models\User\User $user
*
- * @return \App\Models\Feature\Feature|bool
+ * @return bool|Feature
*/
public function updateFeature($feature, $data, $user) {
DB::beginTransaction();
@@ -324,8 +324,8 @@ public function updateFeature($feature, $data, $user) {
/**
* Deletes a feature.
*
- * @param \App\Models\Feature\Feature $feature
- * @param mixed $user
+ * @param Feature $feature
+ * @param mixed $user
*
* @return bool
*/
@@ -358,8 +358,8 @@ public function deleteFeature($feature, $user) {
/**
* Handle category data.
*
- * @param array $data
- * @param \App\Models\Feature\FeatureCategory|null $category
+ * @param array $data
+ * @param FeatureCategory|null $category
*
* @return array
*/
@@ -386,8 +386,8 @@ private function populateCategoryData($data, $category = null) {
/**
* Processes user input for creating/updating a feature.
*
- * @param array $data
- * @param \App\Models\Feature\Feature $feature
+ * @param array $data
+ * @param Feature $feature
*
* @return array
*/
diff --git a/app/Services/GalleryManager.php b/app/Services/GalleryManager.php
index bad8276742..4661f29ff5 100644
--- a/app/Services/GalleryManager.php
+++ b/app/Services/GalleryManager.php
@@ -30,11 +30,11 @@ class GalleryManager extends Service {
/**
* Creates a new gallery submission.
*
- * @param array $data
- * @param array $currencyFormData
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param array $currencyFormData
+ * @param User $user
*
- * @return \App\Models\Gallery\GallerySubmission|bool
+ * @return bool|GallerySubmission
*/
public function createSubmission($data, $currencyFormData, $user) {
DB::beginTransaction();
@@ -174,11 +174,11 @@ public function createSubmission($data, $currencyFormData, $user) {
/**
* Updates a gallery submission.
*
- * @param \App\Models\Gallery\GallerySubmission $submission
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param GallerySubmission $submission
+ * @param array $data
+ * @param User $user
*
- * @return \App\Models\Gallery\GallerySubmission|bool
+ * @return bool|GallerySubmission
*/
public function updateSubmission($submission, $data, $user) {
DB::beginTransaction();
@@ -342,11 +342,11 @@ public function updateSubmission($submission, $data, $user) {
/**
* Processes collaborator edits/approvals on a submission.
*
- * @param \App\Models\Gallery\GallerySubmission $submission
- * @param \App\Models\User\User $user
- * @param mixed $data
+ * @param GallerySubmission $submission
+ * @param User $user
+ * @param mixed $data
*
- * @return \App\Models\Gallery\GalleryFavorite|bool
+ * @return bool|GalleryFavorite
*/
public function editCollaborator($submission, $data, $user) {
DB::beginTransaction();
@@ -397,9 +397,9 @@ public function editCollaborator($submission, $data, $user) {
/**
* Votes on a gallery submission.
*
- * @param string $action
- * @param \App\Models\Gallery\GallerySubmission $submission
- * @param \App\Models\User\User $user
+ * @param string $action
+ * @param GallerySubmission $submission
+ * @param User $user
*
* @return bool
*/
@@ -428,10 +428,10 @@ public function castVote($action, $submission, $user) {
// Get existing vote data if it exists, remove any existing vote data for the user,
// add the new vote data, and json encode it
- $voteData = (isset($submission->attributes['vote_data']) ? collect(json_decode($submission->attributes['vote_data'], true)) : collect([]));
+ $voteData = (isset($submission->vote_data) ? collect($submission->vote_data, true) : collect([]));
$voteData->get($user->id) ? $voteData->pull($user->id) : null;
$voteData->put($user->id, $vote);
- $submission->vote_data = $voteData->toJson();
+ $submission->vote_data = $voteData;
$submission->save();
@@ -458,11 +458,11 @@ public function castVote($action, $submission, $user) {
/**
* Processes staff comments for a submission.
*
- * @param \App\Models\User\User $user
- * @param mixed $id
- * @param mixed $data
+ * @param User $user
+ * @param mixed $id
+ * @param mixed $data
*
- * @return \App\Models\Gallery\GalleryFavorite|bool
+ * @return bool|GalleryFavorite
*/
public function postStaffComments($id, $data, $user) {
DB::beginTransaction();
@@ -508,8 +508,8 @@ public function postStaffComments($id, $data, $user) {
/**
* Archives a submission.
*
- * @param \App\Models\Gallery\GallerySubmission $submission
- * @param mixed $user
+ * @param GallerySubmission $submission
+ * @param mixed $user
*
* @return bool
*/
@@ -547,11 +547,11 @@ public function archiveSubmission($submission, $user) {
/**
* Processes group currency evaluation for a submission.
*
- * @param \App\Models\User\User $user
- * @param mixed $id
- * @param mixed $data
+ * @param User $user
+ * @param mixed $id
+ * @param mixed $data
*
- * @return \App\Models\Gallery\GalleryFavorite|bool
+ * @return bool|GalleryFavorite
*/
public function postValueSubmission($id, $data, $user) {
DB::beginTransaction();
@@ -681,10 +681,10 @@ public function postValueSubmission($id, $data, $user) {
/**
* Toggles favorite status on a submission for a user.
*
- * @param \App\Models\Gallery\GallerySubmission $submission
- * @param \App\Models\User\User $user
+ * @param GallerySubmission $submission
+ * @param User $user
*
- * @return \App\Models\Gallery\GalleryFavorite|bool
+ * @return bool|GalleryFavorite
*/
public function favoriteSubmission($submission, $user) {
DB::beginTransaction();
@@ -729,10 +729,10 @@ public function favoriteSubmission($submission, $user) {
/**
* Processes rejection for a submission.
*
- * @param \App\Models\Gallery\GallerySubmission $submission
- * @param mixed $user
+ * @param GallerySubmission $submission
+ * @param mixed $user
*
- * @return \App\Models\Gallery\GallerySubmission|bool
+ * @return bool|GallerySubmission
*/
public function rejectSubmission($submission, $user) {
DB::beginTransaction();
@@ -787,8 +787,8 @@ private function populateData($data) {
/**
* Processes gallery submission images.
*
- * @param array $data
- * @param \App\Models\Gallery\GallerySubmission $submission
+ * @param array $data
+ * @param GallerySubmission $submission
*
* @return array
*/
@@ -848,9 +848,9 @@ private function processImage($data, $submission) {
/**
* Processes acceptance for a submission.
*
- * @param \App\Models\Gallery\GallerySubmission $submission
+ * @param GallerySubmission $submission
*
- * @return \App\Models\Gallery\GallerySubmission|bool
+ * @return bool|GallerySubmission
*/
private function acceptSubmission($submission) {
DB::beginTransaction();
diff --git a/app/Services/InventoryManager.php b/app/Services/InventoryManager.php
index 652b2bdc8f..043674e62d 100644
--- a/app/Services/InventoryManager.php
+++ b/app/Services/InventoryManager.php
@@ -24,8 +24,8 @@ class InventoryManager extends Service {
/**
* Grants an item to multiple users.
*
- * @param array $data
- * @param \App\Models\User\User $staff
+ * @param array $data
+ * @param User $staff
*
* @return bool
*/
@@ -89,7 +89,7 @@ public function grantItems($data, $staff) {
*
* @param array $data
* @param \App\Models\Character\Character $character
- * @param \App\Models\User\User $staff
+ * @param User $staff
*
* @return bool
*/
@@ -153,11 +153,11 @@ public function grantCharacterItems($data, $character, $staff) {
/**
* Transfers items between a user and character.
*
- * @param \App\Models\Character\Character|\App\Models\User\User $sender
- * @param \App\Models\Character\Character|\App\Models\User\User $recipient
- * @param \App\Models\Character\CharacterItem|\App\Models\User\UserItem $stacks
- * @param int $quantities
- * @param mixed $user
+ * @param \App\Models\Character\Character|User $sender
+ * @param \App\Models\Character\Character|User $recipient
+ * @param CharacterItem|UserItem $stacks
+ * @param int $quantities
+ * @param mixed $user
*
* @return bool
*/
@@ -208,7 +208,7 @@ public function transferCharacterStack($sender, $recipient, $stacks, $quantities
throw new \Exception('Quantity to transfer exceeds item count.');
}
- //Check that hold count isn't being exceeded
+ // Check that hold count isn't being exceeded
if ($stack->item->category->character_limit > 0) {
$limit = $stack->item->category->character_limit;
}
@@ -239,10 +239,10 @@ public function transferCharacterStack($sender, $recipient, $stacks, $quantities
/**
* Transfers items between user stacks.
*
- * @param \App\Models\User\User $sender
- * @param \App\Models\User\User $recipient
- * @param \App\Models\User\UserItem $stacks
- * @param int $quantities
+ * @param User $sender
+ * @param User $recipient
+ * @param UserItem $stacks
+ * @param int $quantities
*
* @return bool
*/
@@ -310,10 +310,10 @@ public function transferStack($sender, $recipient, $stacks, $quantities) {
/**
* Deletes items from stack.
*
- * @param \App\Models\Character\Character|\App\Models\User\User $owner
- * @param \App\Models\Character\CharacterItem|\App\Models\User\UserItem $stacks
- * @param int $quantities
- * @param mixed $user
+ * @param \App\Models\Character\Character|User $owner
+ * @param CharacterItem|UserItem $stacks
+ * @param int $quantities
+ * @param mixed $user
*
* @return bool
*/
@@ -392,9 +392,9 @@ public function deleteStack($owner, $stacks, $quantities, $user) {
/**
* Sells items from stack.
*
- * @param \App\Models\User\User $user
- * @param \App\Models\User\UserItem $stacks
- * @param int $quantities
+ * @param User $user
+ * @param UserItem $stacks
+ * @param int $quantities
*
* @return bool
*/
@@ -458,12 +458,12 @@ public function resellStack($user, $stacks, $quantities) {
/**
* Credits an item to a user or character.
*
- * @param \App\Models\Character\Character|\App\Models\User\User $sender
- * @param \App\Models\Character\Character|\App\Models\User\User $recipient
- * @param string $type
- * @param array $data
- * @param \App\Models\Item\Item $item
- * @param int $quantity
+ * @param \App\Models\Character\Character|User $sender
+ * @param \App\Models\Character\Character|User $recipient
+ * @param string $type
+ * @param array $data
+ * @param Item $item
+ * @param int $quantity
*
* @return bool
*/
@@ -471,17 +471,15 @@ public function creditItem($sender, $recipient, $type, $data, $item, $quantity)
DB::beginTransaction();
try {
- $encoded_data = \json_encode($data);
-
if ($recipient->logType == 'User') {
$recipient_stack = UserItem::where([
['user_id', '=', $recipient->id],
['item_id', '=', $item->id],
- ['data', '=', $encoded_data],
+ ['data', '=', $data],
])->first();
if (!$recipient_stack) {
- $recipient_stack = UserItem::create(['user_id' => $recipient->id, 'item_id' => $item->id, 'data' => $encoded_data]);
+ $recipient_stack = UserItem::create(['user_id' => $recipient->id, 'item_id' => $item->id, 'data' => $data]);
}
$recipient_stack->count += $quantity;
$recipient_stack->save();
@@ -489,11 +487,11 @@ public function creditItem($sender, $recipient, $type, $data, $item, $quantity)
$recipient_stack = CharacterItem::where([
['character_id', '=', $recipient->id],
['item_id', '=', $item->id],
- ['data', '=', $encoded_data],
+ ['data', '=', $data],
])->first();
if (!$recipient_stack) {
- $recipient_stack = CharacterItem::create(['character_id' => $recipient->id, 'item_id' => $item->id, 'data' => $encoded_data]);
+ $recipient_stack = CharacterItem::create(['character_id' => $recipient->id, 'item_id' => $item->id, 'data' => $data]);
}
$recipient_stack->count += $quantity;
$recipient_stack->save();
@@ -520,12 +518,12 @@ public function creditItem($sender, $recipient, $type, $data, $item, $quantity)
/**
* Moves items from one user or character stack to another.
*
- * @param \App\Models\Character\Character|\App\Models\User\User $sender
- * @param \App\Models\Character\Character|\App\Models\User\User $recipient
- * @param string $type
- * @param array $data
- * @param mixed $stack
- * @param mixed $quantity
+ * @param \App\Models\Character\Character|User $sender
+ * @param \App\Models\Character\Character|User $recipient
+ * @param string $type
+ * @param array $data
+ * @param mixed $stack
+ * @param mixed $quantity
*
* @return bool
*/
@@ -536,11 +534,11 @@ public function moveStack($sender, $recipient, $type, $data, $stack, $quantity)
$recipient_stack = UserItem::where([
['user_id', '=', $recipient->id],
['item_id', '=', $stack->item_id],
- ['data', '=', json_encode($stack->data)],
+ ['data', '=', $stack->data],
])->first();
if (!$recipient_stack) {
- $recipient_stack = UserItem::create(['user_id' => $recipient->id, 'item_id' => $stack->item_id, 'data' => json_encode($stack->data)]);
+ $recipient_stack = UserItem::create(['user_id' => $recipient->id, 'item_id' => $stack->item_id, 'data' => $stack->data]);
}
$stack->count -= $quantity;
@@ -563,11 +561,11 @@ public function moveStack($sender, $recipient, $type, $data, $stack, $quantity)
/**
* Debits an item from a user or character.
*
- * @param \App\Models\Character\Character|\App\Models\User\User $owner
- * @param string $type
- * @param array $data
- * @param \App\Models\Item\UserItem $stack
- * @param mixed $quantity
+ * @param \App\Models\Character\Character|User $owner
+ * @param string $type
+ * @param array $data
+ * @param \App\Models\Item\UserItem $stack
+ * @param mixed $quantity
*
* @return bool
*/
@@ -593,10 +591,10 @@ public function debitStack($owner, $type, $data, $stack, $quantity) {
/**
* Names an item stack.
*
- * @param \App\Models\Character\Character|\App\Models\User\User $owner
- * @param \App\Models\Character\CharacterItem|\App\Models\User\UserItem $stacks
- * @param mixed $name
- * @param mixed $user
+ * @param \App\Models\Character\Character|User $owner
+ * @param CharacterItem|UserItem $stacks
+ * @param mixed $name
+ * @param mixed $user
*
* @return bool
*/
@@ -664,7 +662,7 @@ public function createLog($senderId, $senderType, $recipientId, $recipientType,
/**
* Consolidates a user's item stacks.
*
- * @param \App\Models\User\User $user
+ * @param User $user
*
* @return bool
*/
diff --git a/app/Services/InvitationService.php b/app/Services/InvitationService.php
index 544e503b27..754e1e6ad2 100644
--- a/app/Services/InvitationService.php
+++ b/app/Services/InvitationService.php
@@ -20,7 +20,7 @@ class InvitationService extends Service {
*
* @param \App\Models\User\User $user
*
- * @return \App\Models\Invitation|bool
+ * @return bool|Invitation
*/
public function generateInvitation($user) {
DB::beginTransaction();
@@ -45,7 +45,7 @@ public function generateInvitation($user) {
* @param \App\Models\User\User $user
* @param mixed $invitation
*
- * @return \App\Models\Invitation|bool
+ * @return bool|Invitation
*/
public function useInvitation($invitation, $user) {
DB::beginTransaction();
@@ -70,7 +70,7 @@ public function useInvitation($invitation, $user) {
/**
* Deletes an unused invitation code.
*
- * @param \App\Models\Invitation $invitation
+ * @param Invitation $invitation
*
* @return bool
*/
diff --git a/app/Services/Item/BoxService.php b/app/Services/Item/BoxService.php
index 5d7472c75b..0693f97a8e 100644
--- a/app/Services/Item/BoxService.php
+++ b/app/Services/Item/BoxService.php
@@ -69,7 +69,7 @@ public function updateData($tag, $data) {
return true;
}
- // The data will be stored as an asset table, json_encode()d.
+ // The data will be stored as an asset table.
// First build the asset table, then prepare it for storage.
$assets = createAssetsArray();
foreach ($data['rewardable_type'] as $key => $r) {
@@ -92,7 +92,7 @@ public function updateData($tag, $data) {
}
$assets = getDataReadyAssets($assets);
- $tag->update(['data' => json_encode($assets)]);
+ $tag->update(['data' => $assets]);
return $this->commitReturn(true);
} catch (\Exception $e) {
diff --git a/app/Services/Item/CouponService.php b/app/Services/Item/CouponService.php
new file mode 100644
index 0000000000..9c538de007
--- /dev/null
+++ b/app/Services/Item/CouponService.php
@@ -0,0 +1,63 @@
+data['discount'] ?? null;
+ $couponData['infinite'] = $tag->data['infinite'] ?? null;
+
+ return $couponData;
+ }
+
+ /**
+ * Processes the data attribute of the tag and returns it in the preferred format.
+ *
+ * @param string $tag
+ * @param array $data
+ *
+ * @return bool
+ */
+ public function updateData($tag, $data) {
+ DB::beginTransaction();
+
+ try {
+ if (!isset($data['infinite'])) {
+ $data['infinite'] = 0;
+ }
+
+ $coupon['discount'] = $data['discount'];
+ $coupon['infinite'] = $data['infinite'];
+ $tag->update(['data' => json_encode($coupon)]);
+
+ return $this->commitReturn(true);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+}
diff --git a/app/Services/Item/SlotService.php b/app/Services/Item/SlotService.php
index 56dabb7373..af3960af4c 100644
--- a/app/Services/Item/SlotService.php
+++ b/app/Services/Item/SlotService.php
@@ -25,13 +25,15 @@ class SlotService extends Service {
/**
* Retrieves any data that should be used in the item tag editing form.
*
+ * @param mixed $tag
+ *
* @return array
*/
- public function getEditData() {
+ public function getEditData($tag) {
return [
'rarities' => ['0' => 'Select Rarity'] + Rarity::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'specieses' => ['0' => 'Select Species'] + Species::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
- 'subtypes' => ['0' => 'Select Subtype'] + Subtype::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
+ 'subtypes' => Subtype::orderBy('sort', 'DESC')->where('species_id', $this->getTagData($tag)['species_id'])->pluck('name', 'id')->toArray(),
'isMyo' => true,
];
}
@@ -44,15 +46,15 @@ public function getEditData() {
* @return mixed
*/
public function getTagData($tag) {
- //fetch data from DB, if there is no data then set to NULL instead
+ // fetch data from DB, if there is no data then set to NULL instead
$characterData['name'] = $tag->data['name'] ?? null;
$characterData['species_id'] = isset($tag->data['species_id']) && $tag->data['species_id'] ? $tag->data['species_id'] : null;
- $characterData['subtype_id'] = isset($tag->data['subtype_id']) && $tag->data['subtype_id'] ? $tag->data['subtype_id'] : null;
+ $characterData['subtype_ids'] = isset($tag->data['subtype_ids']) && $tag->data['subtype_ids'] ? $tag->data['subtype_ids'] : null;
$characterData['rarity_id'] = isset($tag->data['rarity_id']) && $tag->data['rarity_id'] ? $tag->data['rarity_id'] : null;
$characterData['description'] = isset($tag->data['description']) && $tag->data['description'] ? $tag->data['description'] : null;
$characterData['parsed_description'] = parse($characterData['description']);
$characterData['sale_value'] = $tag->data['sale_value'] ?? 0;
- //the switches hate true/false, need to convert boolean to binary
+ // the switches hate true/false, need to convert boolean to binary
if (isset($tag->data['is_sellable']) && $tag->data['is_sellable'] == 'true') {
$characterData['is_sellable'] = 1;
} else {
@@ -86,15 +88,15 @@ public function getTagData($tag) {
* @return bool
*/
public function updateData($tag, $data) {
- //put inputs into an array to transfer to the DB
+ // put inputs into an array to transfer to the DB
$characterData['name'] = $data['name'] ?? null;
$characterData['species_id'] = isset($data['species_id']) && $data['species_id'] ? $data['species_id'] : null;
- $characterData['subtype_id'] = isset($data['subtype_id']) && $data['subtype_id'] ? $data['subtype_id'] : null;
+ $characterData['subtype_ids'] = isset($data['subtype_ids']) && $data['subtype_ids'] ? $data['subtype_ids'] : null;
$characterData['rarity_id'] = isset($data['rarity_id']) && $data['rarity_id'] ? $data['rarity_id'] : null;
$characterData['description'] = isset($data['description']) && $data['description'] ? $data['description'] : null;
$characterData['parsed_description'] = parse($characterData['description']);
$characterData['sale_value'] = $data['sale_value'] ?? 0;
- //if the switch was toggled, set true, if null, set false
+ // if the switch was toggled, set true, if null, set false
$characterData['is_sellable'] = isset($data['is_sellable']);
$characterData['is_tradeable'] = isset($data['is_tradeable']);
$characterData['is_giftable'] = isset($data['is_giftable']);
@@ -103,8 +105,8 @@ public function updateData($tag, $data) {
DB::beginTransaction();
try {
- //get characterData array and put it into the 'data' column of the DB for this tag
- $tag->update(['data' => json_encode($characterData)]);
+ // get characterData array and put it into the 'data' column of the DB for this tag
+ $tag->update(['data' => $characterData]);
return $this->commitReturn(true);
} catch (\Exception $e) {
@@ -118,7 +120,7 @@ public function updateData($tag, $data) {
* Acts upon the item when used from the inventory.
*
* @param \App\Models\User\UserItem $stacks
- * @param \App\Models\User\User $user
+ * @param User $user
* @param array $data
*
* @return bool
@@ -137,16 +139,16 @@ public function act($stacks, $user, $data) {
// Next, try to delete the tag item. If successful, we can start distributing rewards.
if ((new InventoryManager)->debitStack($stack->user, 'Slot Used', ['data' => ''], $stack, $data['quantities'][$key])) {
for ($q = 0; $q < $data['quantities'][$key]; $q++) {
- //fill an array with the DB contents
+ // fill an array with the DB contents
$characterData = $stack->item->tag('slot')->data;
- //set user who is opening the item
+ // set user who is opening the item
$characterData['user_id'] = $user->id;
- //other vital data that is default
+ // other vital data that is default
$characterData['name'] ??= 'Slot';
$characterData['transferrable_at'] = null;
$characterData['is_myo_slot'] = 1;
- //this uses your default MYO slot image from the CharacterManager
- //see wiki page for documentation on adding a default image switch
+ // this uses your default MYO slot image from the CharacterManager
+ // see wiki page for documentation on adding a default image switch
$characterData['use_cropper'] = 0;
$characterData['x0'] = null;
$characterData['x1'] = null;
@@ -161,7 +163,7 @@ public function act($stacks, $user, $data) {
$characterData['feature_id'][0] = null;
$characterData['feature_data'][0] = null;
- //DB has 'true' and 'false' as strings, so need to set them to true/null
+ // DB has 'true' and 'false' as strings, so need to set them to true/null
if ($stack->item->tag('slot')->data['is_sellable'] == 'true') {
$characterData['is_sellable'] = true;
} else {
@@ -188,6 +190,9 @@ public function act($stacks, $user, $data) {
if ($character = $charService->createCharacter($characterData, $user, true)) {
flash('MYO slot created successfully.')->success();
} else {
+ foreach ($charService->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
throw new \Exception('Failed to use slot.');
}
}
diff --git a/app/Services/ItemService.php b/app/Services/ItemService.php
index 13ceb31e7e..127250cef4 100644
--- a/app/Services/ItemService.php
+++ b/app/Services/ItemService.php
@@ -29,7 +29,7 @@ class ItemService extends Service {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Item\ItemCategory|bool
+ * @return bool|ItemCategory
*/
public function createItemCategory($data, $user) {
DB::beginTransaction();
@@ -68,11 +68,11 @@ public function createItemCategory($data, $user) {
/**
* Update a category.
*
- * @param \App\Models\Item\ItemCategory $category
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param ItemCategory $category
+ * @param array $data
+ * @param \App\Models\User\User $user
*
- * @return \App\Models\Item\ItemCategory|bool
+ * @return bool|ItemCategory
*/
public function updateItemCategory($category, $data, $user) {
DB::beginTransaction();
@@ -114,8 +114,8 @@ public function updateItemCategory($category, $data, $user) {
/**
* Delete a category.
*
- * @param \App\Models\Item\ItemCategory $category
- * @param mixed $user
+ * @param ItemCategory $category
+ * @param mixed $user
*
* @return bool
*/
@@ -182,7 +182,7 @@ public function sortItemCategory($data) {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Item\Item|bool
+ * @return bool|Item
*/
public function createItem($data, $user) {
DB::beginTransaction();
@@ -215,13 +215,13 @@ public function createItem($data, $user) {
}
$item->update([
- 'data' => json_encode([
- 'rarity' => isset($data['rarity']) && $data['rarity'] ? $data['rarity'] : null,
- 'uses' => isset($data['uses']) && $data['uses'] ? $data['uses'] : null,
- 'release' => isset($data['release']) && $data['release'] ? $data['release'] : null,
- 'prompts' => isset($data['prompts']) && $data['prompts'] ? $data['prompts'] : null,
- 'resell' => isset($data['currency_quantity']) ? [$data['currency_id'] => $data['currency_quantity']] : null,
- ]), // rarity, availability info (original source, purchase locations, drop locations)
+ 'data' => [
+ 'uses' => isset($data['uses']) && $data['uses'] ? $data['uses'] : null,
+ 'release' => isset($data['release']) && $data['release'] ? $data['release'] : null,
+ 'prompts' => isset($data['prompts']) && $data['prompts'] ? $data['prompts'] : null,
+ 'resell' => isset($data['currency_quantity']) ? [$data['currency_id'] => $data['currency_quantity']] : null,
+ 'rarity_id' => isset($data['rarity_id']) && $data['rarity_id'] ? $data['rarity_id'] : null,
+ ], // rarity, availability info (original source, purchase locations, drop locations)
]);
if ($image) {
@@ -239,11 +239,11 @@ public function createItem($data, $user) {
/**
* Updates an item.
*
- * @param \App\Models\Item\Item $item
+ * @param Item $item
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Item\Item|bool
+ * @return bool|Item
*/
public function updateItem($item, $data, $user) {
DB::beginTransaction();
@@ -278,13 +278,13 @@ public function updateItem($item, $data, $user) {
}
$item->update([
- 'data' => json_encode([
- 'rarity' => isset($data['rarity']) && $data['rarity'] ? $data['rarity'] : null,
- 'uses' => isset($data['uses']) && $data['uses'] ? $data['uses'] : null,
- 'release' => isset($data['release']) && $data['release'] ? $data['release'] : null,
- 'prompts' => isset($data['prompts']) && $data['prompts'] ? $data['prompts'] : null,
- 'resell' => isset($data['currency_quantity']) ? [$data['currency_id'] => $data['currency_quantity']] : null,
- ]), // rarity, availability info (original source, purchase locations, drop locations)
+ 'data' => [
+ 'uses' => isset($data['uses']) && $data['uses'] ? $data['uses'] : null,
+ 'release' => isset($data['release']) && $data['release'] ? $data['release'] : null,
+ 'prompts' => isset($data['prompts']) && $data['prompts'] ? $data['prompts'] : null,
+ 'resell' => isset($data['currency_quantity']) ? [$data['currency_id'] => $data['currency_quantity']] : null,
+ 'rarity_id' => isset($data['rarity_id']) && $data['rarity_id'] ? $data['rarity_id'] : null,
+ ], // rarity, availability info (original source, purchase locations, drop locations)
]);
if ($item) {
@@ -302,8 +302,8 @@ public function updateItem($item, $data, $user) {
/**
* Deletes an item.
*
- * @param \App\Models\Item\Item $item
- * @param mixed $user
+ * @param Item $item
+ * @param mixed $user
*
* @return bool
*/
@@ -373,9 +373,9 @@ public function getItemTags() {
/**
* Adds an item tag to an item.
*
- * @param \App\Models\Item\Item $item
- * @param string $tag
- * @param mixed $user
+ * @param Item $item
+ * @param string $tag
+ * @param mixed $user
*
* @return bool|string
*/
@@ -413,10 +413,10 @@ public function addItemTag($item, $tag, $user) {
/**
* Edits the data associated with an item tag on an item.
*
- * @param \App\Models\Item\Item $item
- * @param string $tag
- * @param array $data
- * @param mixed $user
+ * @param Item $item
+ * @param string $tag
+ * @param array $data
+ * @param mixed $user
*
* @return bool|string
*/
@@ -458,9 +458,9 @@ public function editItemTag($item, $tag, $data, $user) {
/**
* Removes an item tag from an item.
*
- * @param \App\Models\Item\Item $item
- * @param string $tag
- * @param mixed $user
+ * @param Item $item
+ * @param string $tag
+ * @param mixed $user
*
* @return bool|string
*/
@@ -492,8 +492,8 @@ public function deleteItemTag($item, $tag, $user) {
/**
* Handle category data.
*
- * @param array $data
- * @param \App\Models\Item\ItemCategory|null $category
+ * @param array $data
+ * @param ItemCategory|null $category
*
* @return array
*/
@@ -526,8 +526,8 @@ private function populateCategoryData($data, $category = null) {
/**
* Processes user input for creating/updating an item.
*
- * @param array $data
- * @param \App\Models\Item\Item $item
+ * @param array $data
+ * @param Item $item
*
* @return array
*/
@@ -546,6 +546,9 @@ private function populateData($data, $item = null) {
} else {
$data['is_released'] = 1;
}
+ if (!isset($data['is_deletable'])) {
+ $data['is_deletable'] = 0;
+ }
if (isset($data['remove_image'])) {
if ($item && $item->has_image && $data['remove_image']) {
diff --git a/app/Services/LimitManager.php b/app/Services/LimitManager.php
new file mode 100644
index 0000000000..09b88f0f2b
--- /dev/null
+++ b/app/Services/LimitManager.php
@@ -0,0 +1,145 @@
+first()->is_unlocked) {
+ if ($user->unlockedLimits()->where('object_model', get_class($object))->where('object_id', $object->id)->exists()) {
+ return true;
+ }
+ }
+
+ // if the limit is not unlocked, check if it is auto unlocked
+ if (!$is_unlock && $limits->first()->is_unlocked && !$limits->first()->is_auto_unlocked) {
+ throw new \Exception(($limits->first()->object->displayName ?? $limits->first()->object->name).' requires manual unlocking!');
+ }
+
+ $plucked_stacks = [];
+ foreach ($limits as $limit) {
+ switch ($limit->limit_type) {
+ case 'prompt':
+ // check at least quantity of prompts has been approved
+ if (Submission::where('user_id', $user->id)->where('status', 'Approved')->where('prompt_id', $limit->limit_id)->count() < $limit->quantity) {
+ throw new \Exception('You have not completed the prompt '.$limit->limit->displayName.' enough times to complete this action.');
+ }
+ break;
+ case 'item':
+ if (!$user->items()->where('item_id', $limit->limit_id)->sum('count') >= $limit->quantity) {
+ throw new \Exception('You do not have enough of the item '.$limit->object->name.' to complete this action.');
+ }
+
+ if ($limit->debit) {
+ $stacks = UserItem::where('user_id', $user->id)->where('item_id', $limit->limit_id)->orderBy('count', 'asc')->get(); // asc because pop() removes from the end
+
+ $count = $limit->quantity;
+ while ($count > 0) {
+ $stack = $stacks->pop();
+ $quantity = $stack->count >= $count ? $count : $stack->count;
+ $count -= $quantity;
+ $plucked_stacks[$stack->id] = $quantity;
+ }
+ }
+ break;
+ case 'currency':
+ if (DB::table('user_currencies')->where('user_id', $user->id)->where('currency_id', $limit->limit_id)->value('quantity') < $limit->quantity) {
+ throw new \Exception('You do not have enough '.$limit->limit->displayName.' to complete this action.');
+ }
+
+ if ($limit->debit) {
+ $service = new CurrencyManager;
+ if (!$service->debitCurrency($user, null, 'Limit Requirements', 'Used in '.$limit->object->displayName.' limit requirements.', $limit->limit, $limit->quantity)) {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ throw new \Exception('Currency could not be removed.');
+ }
+ }
+ break;
+ case 'dynamic':
+ if (!$this->checkDynamicLimit($limit, $user)) {
+ throw new \Exception('You do not meet the requirements to complete this action.');
+ }
+ break;
+ }
+ }
+
+ if (count($plucked_stacks)) {
+ $inventoryManager = new InventoryManager;
+ $type = 'Limit Requirements';
+ $data = [
+ 'data' => 'Used in '.($limit->object->displayName ?? $limit->object->name).'\'s limit requirements.',
+ ];
+
+ foreach ($plucked_stacks as $id=>$quantity) {
+ $stack = UserItem::find($id);
+ if (!$inventoryManager->debitStack($user, $type, $data, $stack, $quantity)) {
+ throw new \Exception('Items could not be removed.');
+ }
+ }
+ }
+
+ if ($limits->first()->is_unlocked && $limits->first()->is_auto_unlocked || $is_unlock) {
+ $user->unlockedLimits()->create([
+ 'object_model' => get_class($object),
+ 'object_id' => $object->id,
+ ]);
+ } elseif (!$is_unlock && $limits->first()->is_unlocked && !$limits->first()->is_auto_unlocked) {
+ throw new \Exception(($limits->first()->object->displayName ?? $limits->first()->object->name).' requires manual unlocking!');
+ }
+
+ return true;
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+ }
+
+ /**
+ * checks a dynamic limit.
+ *
+ * @param mixed $limit
+ * @param mixed $user
+ */
+ private function checkDynamicLimit($limit, $user) {
+ try {
+ return $limit->limit->evaluate();
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+ }
+}
diff --git a/app/Services/LimitService.php b/app/Services/LimitService.php
new file mode 100644
index 0000000000..4ccc0e3229
--- /dev/null
+++ b/app/Services/LimitService.php
@@ -0,0 +1,197 @@
+ 0) {
+ $limits->each(function ($limit) {
+ $limit->delete();
+ });
+ }
+ if (count($limits) > 0) {
+ flash('Deleted '.count($limits).' old limits.')->success();
+ }
+
+ if (isset($data['limit_type'])) {
+ foreach ($data['limit_type'] as $key => $type) {
+ $limit = new Limit([
+ 'object_model' => $object_model,
+ 'object_id' => $object_id,
+ 'limit_type' => $data['limit_type'][$key],
+ 'limit_id' => $data['limit_id'][$key],
+ 'quantity' => $data['quantity'][$key],
+ 'debit' => $data['debit'][$key] == 'no' ? 0 : 1,
+ 'is_unlocked' => $data['is_unlocked'] == 'no' ? 0 : 1,
+ 'is_auto_unlocked' => $data['is_auto_unlocked'] == 'no' ? 0 : 1,
+ ]);
+
+ if (!$limit->save()) {
+ throw new \Exception('Failed to save limit.');
+ }
+ }
+ }
+
+ // log the action
+ if ($log && !$this->logAdminAction(Auth::user(), 'Edited Limits', 'Edited '.$object->displayName.' limits')) {
+ throw new \Exception('Failed to log admin action.');
+ }
+
+ return $this->commitReturn(true);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
+ /**
+ * Unlocks the limits for an object.
+ *
+ * @param mixed $object
+ *
+ * @return bool
+ */
+ public function unlockLimits($object) {
+ DB::beginTransaction();
+
+ try {
+ $service = new LimitManager;
+ if (!$service->checkLimits($object, true)) {
+ foreach ($service->errors()->getMessages()['error'] as $error) {
+ flash($error)->error();
+ }
+ throw new \Exception('Failed to unlock limits.');
+ }
+
+ return $this->commitReturn(true);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
+ /**********************************************************************************************
+
+ DYNAMIC LIMITS
+
+ **********************************************************************************************/
+
+ /**
+ * Creates a new limit.
+ *
+ * @param array $data
+ * @param \App\Models\User\User $user
+ *
+ * @return bool|Limit
+ */
+ public function createLimit($data, $user) {
+ DB::beginTransaction();
+
+ try {
+ $data['description'] = isset($data['description']) ? parse($data['description']) : null;
+ $data['evaluation'] = str_replace('\\', '\\\\', $data['evaluation']);
+
+ $limit = DynamicLimit::create($data);
+
+ return $this->commitReturn($limit);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
+ /**
+ * Updates a limit.
+ *
+ * @param Limit $limit
+ * @param array $data
+ * @param \App\Models\User\User $user
+ *
+ * @return bool|Limit
+ */
+ public function updateLimit($limit, $data, $user) {
+ DB::beginTransaction();
+
+ try {
+ if (DynamicLimit::where('name', $data['name'])->where('id', '!=', $limit->id)->exists()) {
+ throw new \Exception('The name has already been taken.');
+ }
+
+ $data['description'] = isset($data['description']) ? parse($data['description']) : null;
+ $data['evaluation'] = str_replace('\\', '\\\\', $data['evaluation']);
+
+ $limit->update($data);
+
+ return $this->commitReturn($limit);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
+ /**
+ * Deletes a limit.
+ *
+ * @param Limit $limit
+ *
+ * @return bool
+ */
+ public function deleteLimit($limit) {
+ DB::beginTransaction();
+
+ try {
+ if (Limit::where('limit_type', 'dynamic')->where('limit_id', $limit->id)->exists()) {
+ throw new \Exception('This limit is currently in use and cannot be deleted.');
+ }
+ $limit->delete();
+
+ return $this->commitReturn(true);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+}
diff --git a/app/Services/LinkService.php b/app/Services/LinkService.php
index f2e19c269e..42a8843c66 100644
--- a/app/Services/LinkService.php
+++ b/app/Services/LinkService.php
@@ -78,7 +78,7 @@ public function saveProvider($provider, $result, $user) {
$user->has_alias = 1;
$user->save();
- UserUpdateLog::create(['user_id' => $user->id, 'data' => json_encode(['alias' => $result->nickname, 'site' => $provider]), 'type' => 'Alias Added']);
+ UserUpdateLog::create(['user_id' => $user->id, 'data' => ['alias' => $result->nickname, 'site' => $provider], 'type' => 'Alias Added']);
return $this->commitReturn(true);
} catch (\Exception $e) {
@@ -115,7 +115,7 @@ public function makePrimary($aliasId, $user) {
$alias->is_primary_alias = 1;
$alias->save();
- UserUpdateLog::create(['user_id' => $user->id, 'data' => json_encode(['alias' => $alias->alias, 'site' => $alias->site]), 'type' => 'Primary Alias Changed']);
+ UserUpdateLog::create(['user_id' => $user->id, 'data' => ['alias' => $alias->alias, 'site' => $alias->site], 'type' => 'Primary Alias Changed']);
return $this->commitReturn(true);
} catch (\Exception $e) {
@@ -150,7 +150,7 @@ public function hideAlias($aliasId, $user) {
$alias->is_visible = !$alias->is_visible;
$alias->save();
- UserUpdateLog::create(['user_id' => $user->id, 'data' => json_encode(['alias' => $alias->alias, 'site' => $alias->site]), 'type' => 'Alias Visibility Changed']);
+ UserUpdateLog::create(['user_id' => $user->id, 'data' => ['alias' => $alias->alias, 'site' => $alias->site], 'type' => 'Alias Visibility Changed']);
return $this->commitReturn(true);
} catch (\Exception $e) {
@@ -181,7 +181,7 @@ public function removeAlias($aliasId, $user) {
throw new \Exception('Invalid alias selected.');
}
- UserUpdateLog::create(['user_id' => $user->id, 'data' => json_encode(['alias' => $alias->alias, 'site' => $alias->site]), 'type' => 'Alias Deleted']);
+ UserUpdateLog::create(['user_id' => $user->id, 'data' => ['alias' => $alias->alias, 'site' => $alias->site], 'type' => 'Alias Deleted']);
// Delete the alias
$alias->delete();
diff --git a/app/Services/LootService.php b/app/Services/LootService.php
index 9b18d7c669..9d7743b7f5 100644
--- a/app/Services/LootService.php
+++ b/app/Services/LootService.php
@@ -23,7 +23,7 @@ class LootService extends Service {
*
* @param array $data
*
- * @return \App\Models\Loot\LootTable|bool
+ * @return bool|LootTable
*/
public function createLootTable($data) {
DB::beginTransaction();
@@ -68,10 +68,10 @@ public function createLootTable($data) {
/**
* Updates a loot table.
*
- * @param \App\Models\Loot\LootTable $table
- * @param array $data
+ * @param LootTable $table
+ * @param array $data
*
- * @return \App\Models\Loot\LootTable|bool
+ * @return bool|LootTable
*/
public function updateLootTable($table, $data) {
DB::beginTransaction();
@@ -82,7 +82,7 @@ public function updateLootTable($table, $data) {
if (!$type) {
throw new \Exception('Loot type is required.');
}
- if ($type != 'ItemRarity' && !$data['rewardable_id'][$key]) {
+ if (($type != 'ItemRarity' && $type != 'ItemCategoryRarity') && !$data['rewardable_id'][$key]) {
throw new \Exception('Reward is required.');
}
if (!$data['quantity'][$key] || $data['quantity'][$key] < 1) {
@@ -116,7 +116,7 @@ public function updateLootTable($table, $data) {
/**
* Deletes a loot table.
*
- * @param \App\Models\Loot\LootTable $table
+ * @param LootTable $table
*
* @return bool
*/
@@ -145,8 +145,8 @@ public function deleteLootTable($table) {
/**
* Handles the creation of loot for a loot table.
*
- * @param \App\Models\Loot\LootTable $table
- * @param array $data
+ * @param LootTable $table
+ * @param array $data
*/
private function populateLootTable($table, $data) {
// Clear the old loot...
@@ -166,7 +166,7 @@ private function populateLootTable($table, $data) {
'rewardable_id' => $data['rewardable_id'][$key] ?? 1,
'quantity' => $data['quantity'][$key],
'weight' => $data['weight'][$key],
- 'data' => isset($lootData) ? json_encode($lootData) : null,
+ 'data' => $lootData ?? null,
]);
}
}
diff --git a/app/Services/NewsService.php b/app/Services/NewsService.php
index 5a40a17426..594610f130 100644
--- a/app/Services/NewsService.php
+++ b/app/Services/NewsService.php
@@ -19,10 +19,10 @@ class NewsService extends Service {
/**
* Creates a news post.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
- * @return \App\Models\News|bool
+ * @return bool|News
*/
public function createNews($data, $user) {
DB::beginTransaction();
@@ -51,11 +51,11 @@ public function createNews($data, $user) {
/**
* Updates a news post.
*
- * @param \App\Models\News $news
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param News $news
+ * @param array $data
+ * @param User $user
*
- * @return \App\Models\News|bool
+ * @return bool|News
*/
public function updateNews($news, $data, $user) {
DB::beginTransaction();
@@ -83,7 +83,7 @@ public function updateNews($news, $data, $user) {
/**
* Deletes a news post.
*
- * @param \App\Models\News $news
+ * @param News $news
*
* @return bool
*/
@@ -101,6 +101,29 @@ public function deleteNews($news) {
return $this->rollbackReturn(false);
}
+ /**
+ * Regenerates a news post.
+ *
+ * @param News $news
+ *
+ * @return bool
+ */
+ public function regenNews($news) {
+ DB::beginTransaction();
+
+ try {
+ $news->parsed_text = parse($news->text);
+
+ $news->save();
+
+ return $this->commitReturn($news);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
/**
* Updates queued news posts to be visible and alert users when
* they should be posted.
diff --git a/app/Services/PageService.php b/app/Services/PageService.php
index b3e8dfba25..dafa2e3741 100644
--- a/app/Services/PageService.php
+++ b/app/Services/PageService.php
@@ -21,7 +21,7 @@ class PageService extends Service {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\SitePage|bool
+ * @return bool|SitePage
*/
public function createPage($data, $user) {
DB::beginTransaction();
@@ -56,7 +56,7 @@ public function createPage($data, $user) {
* @param \App\Models\User\User $user
* @param mixed $page
*
- * @return \App\Models\SitePage|bool
+ * @return bool|SitePage
*/
public function updatePage($page, $data, $user) {
DB::beginTransaction();
@@ -114,4 +114,27 @@ public function deletePage($page) {
return $this->rollbackReturn(false);
}
+
+ /**
+ * Regenerates a site page.
+ *
+ * @param mixed $page
+ *
+ * @return bool
+ */
+ public function regenPage($page) {
+ DB::beginTransaction();
+
+ try {
+ $page->parsed_text = parse($page->text);
+
+ $page->save();
+
+ return $this->commitReturn($page);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
}
diff --git a/app/Services/PromptService.php b/app/Services/PromptService.php
index 2ff79be1f9..44127055c8 100644
--- a/app/Services/PromptService.php
+++ b/app/Services/PromptService.php
@@ -31,7 +31,7 @@ class PromptService extends Service {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Prompt\PromptCategory|bool
+ * @return bool|PromptCategory
*/
public function createPromptCategory($data, $user) {
DB::beginTransaction();
@@ -66,11 +66,11 @@ public function createPromptCategory($data, $user) {
/**
* Update a category.
*
- * @param \App\Models\Prompt\PromptCategory $category
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param PromptCategory $category
+ * @param array $data
+ * @param \App\Models\User\User $user
*
- * @return \App\Models\Prompt\PromptCategory|bool
+ * @return bool|PromptCategory
*/
public function updatePromptCategory($category, $data, $user) {
DB::beginTransaction();
@@ -108,7 +108,7 @@ public function updatePromptCategory($category, $data, $user) {
/**
* Delete a category.
*
- * @param \App\Models\Prompt\PromptCategory $category
+ * @param PromptCategory $category
*
* @return bool
*/
@@ -172,7 +172,7 @@ public function sortPromptCategory($data) {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Prompt\Prompt|bool
+ * @return bool|Prompt
*/
public function createPrompt($data, $user) {
DB::beginTransaction();
@@ -221,11 +221,11 @@ public function createPrompt($data, $user) {
/**
* Updates a prompt.
*
- * @param \App\Models\Prompt\Prompt $prompt
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param Prompt $prompt
+ * @param array $data
+ * @param \App\Models\User\User $user
*
- * @return \App\Models\Prompt\Prompt|bool
+ * @return bool|Prompt
*/
public function updatePrompt($prompt, $data, $user) {
DB::beginTransaction();
@@ -279,7 +279,7 @@ public function updatePrompt($prompt, $data, $user) {
/**
* Deletes a prompt.
*
- * @param \App\Models\Prompt\Prompt $prompt
+ * @param Prompt $prompt
*
* @return bool
*/
@@ -309,8 +309,8 @@ public function deletePrompt($prompt) {
/**
* Handle category data.
*
- * @param array $data
- * @param \App\Models\Prompt\PromptCategory|null $category
+ * @param array $data
+ * @param PromptCategory|null $category
*
* @return array
*/
@@ -335,8 +335,8 @@ private function populateCategoryData($data, $category = null) {
/**
* Processes user input for creating/updating a prompt.
*
- * @param array $data
- * @param \App\Models\Prompt\Prompt $prompt
+ * @param array $data
+ * @param Prompt $prompt
*
* @return array
*/
@@ -372,8 +372,8 @@ private function populateData($data, $prompt = null) {
/**
* Processes user input for creating/updating prompt rewards.
*
- * @param array $data
- * @param \App\Models\Prompt\Prompt $prompt
+ * @param array $data
+ * @param Prompt $prompt
*/
private function populateRewards($data, $prompt) {
// Clear the old rewards...
diff --git a/app/Services/RaffleManager.php b/app/Services/RaffleManager.php
index c23af2971a..587e556644 100644
--- a/app/Services/RaffleManager.php
+++ b/app/Services/RaffleManager.php
@@ -21,8 +21,8 @@ class RaffleManager extends Service {
/**
* Adds tickets to a raffle.
*
- * @param \App\Models\Raffle\Raffle $raffle
- * @param array $data
+ * @param Raffle $raffle
+ * @param array $data
*
* @return int
*/
@@ -46,9 +46,9 @@ public function addTickets($raffle, $data) {
/**
* Adds one or more tickets to a single user for a raffle.
*
- * @param \App\Models\User\User $user
- * @param \App\Models\Raffle\Raffle $raffle
- * @param int $count
+ * @param User $user
+ * @param Raffle $raffle
+ * @param int $count
*
* @return int
*/
@@ -80,7 +80,7 @@ public function addTicket($user, $raffle, $count = 1) {
/**
* Removes a single ticket.
*
- * @param \App\Models\Raffle\RaffleTicket $ticket
+ * @param RaffleTicket $ticket
*
* @return bool
*/
@@ -130,8 +130,8 @@ public function rollRaffleGroup($raffleGroup, $updateGroup = true) {
* If the $updateGroup flag is true, winners will be removed
* from other raffles in the group.
*
- * @param \App\Models\Raffle\Raffle $raffle
- * @param bool $updateGroup
+ * @param Raffle $raffle
+ * @param bool $updateGroup
*
* @return bool
*/
@@ -165,7 +165,7 @@ public function rollRaffle($raffle, $updateGroup = false) {
/**
* Rolls the winners of a raffle.
*
- * @param \App\Models\Raffle\Raffle $raffle
+ * @param Raffle $raffle
*
* @return array
*/
@@ -215,7 +215,7 @@ private function rollWinners($raffle) {
*
* @param array $winners
* @param \App\Models\Raffle\RaffleGroup $raffleGroup
- * @param \App\Models\Raffle\Raffle $raffle
+ * @param Raffle $raffle
*
* @return bool
*/
diff --git a/app/Services/RaffleService.php b/app/Services/RaffleService.php
index 7ef66661ff..db17e8d98b 100644
--- a/app/Services/RaffleService.php
+++ b/app/Services/RaffleService.php
@@ -22,7 +22,7 @@ class RaffleService extends Service {
*
* @param array $data
*
- * @return \App\Models\Raffle\Raffle
+ * @return Raffle
*/
public function createRaffle($data) {
DB::beginTransaction();
@@ -38,10 +38,10 @@ public function createRaffle($data) {
/**
* Updates a raffle.
*
- * @param array $data
- * @param \App\Models\Raffle\Raffle $raffle
+ * @param array $data
+ * @param Raffle $raffle
*
- * @return \App\Models\Raffle\Raffle
+ * @return Raffle
*/
public function updateRaffle($data, $raffle) {
DB::beginTransaction();
@@ -57,7 +57,7 @@ public function updateRaffle($data, $raffle) {
/**
* Deletes a raffle.
*
- * @param \App\Models\Raffle\Raffle $raffle
+ * @param Raffle $raffle
*
* @return bool
*/
@@ -77,7 +77,7 @@ public function deleteRaffle($raffle) {
*
* @param array $data
*
- * @return \App\Models\Raffle\RaffleGroup
+ * @return RaffleGroup
*/
public function createRaffleGroup($data) {
DB::beginTransaction();
@@ -96,7 +96,7 @@ public function createRaffleGroup($data) {
* @param array $data
* @param mixed $group
*
- * @return \App\Models\Raffle\Raffle
+ * @return Raffle
*/
public function updateRaffleGroup($data, $group) {
DB::beginTransaction();
diff --git a/app/Services/RankService.php b/app/Services/RankService.php
index 4cf1cedb51..a6a7617f1b 100644
--- a/app/Services/RankService.php
+++ b/app/Services/RankService.php
@@ -19,8 +19,8 @@ class RankService extends Service {
/**
* Creates a user rank.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
* @return bool
*/
@@ -76,9 +76,9 @@ public function createRank($data, $user) {
/**
* Updates a user rank.
*
- * @param \App\Models\Rank\Rank $rank
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param Rank $rank
+ * @param array $data
+ * @param User $user
*
* @return bool
*/
@@ -129,8 +129,8 @@ public function updateRank($rank, $data, $user) {
/**
* Deletes a user rank.
*
- * @param \App\Models\Rank\Rank $rank
- * @param \App\Models\User\User $user
+ * @param Rank $rank
+ * @param User $user
*
* @return bool
*/
@@ -157,8 +157,8 @@ public function deleteRank($rank, $user) {
/**
* Sorts user ranks.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
* @return bool
*/
@@ -170,14 +170,14 @@ public function sortRanks($data, $user) {
$sort = array_reverse(explode(',', $data));
// Check if the array contains the admin rank, or anything non-numeric
- $adminRank = Rank::orderBy('sort', 'DESC')->first();
+ $adminRank = Rank::where('is_admin', 1)->first();
$count = 0;
foreach ($sort as $key => $s) {
if (!is_numeric($s) || !is_numeric($key)) {
throw new \Exception('Invalid sort order.');
}
if ($s == $adminRank->id) {
- throw new \Exception('Sort order of admin rank cannot be changed.');
+ throw new \Exception('The sort order of the admin rank cannot be changed.');
}
Rank::where('id', $s)->update(['sort' => $key]);
diff --git a/app/Services/RarityService.php b/app/Services/RarityService.php
index 89ae7bfbff..05e256012d 100644
--- a/app/Services/RarityService.php
+++ b/app/Services/RarityService.php
@@ -23,7 +23,7 @@ class RarityService extends Service {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Rarity|bool
+ * @return bool|Rarity
*/
public function createRarity($data, $user) {
DB::beginTransaction();
@@ -58,11 +58,11 @@ public function createRarity($data, $user) {
/**
* Updates a rarity.
*
- * @param \App\Models\Rarity $rarity
+ * @param Rarity $rarity
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Rarity|bool
+ * @return bool|Rarity
*/
public function updateRarity($rarity, $data, $user) {
DB::beginTransaction();
@@ -100,7 +100,7 @@ public function updateRarity($rarity, $data, $user) {
/**
* Deletes a rarity.
*
- * @param \App\Models\Rarity $rarity
+ * @param Rarity $rarity
*
* @return bool
*/
@@ -155,8 +155,8 @@ public function sortRarity($data) {
/**
* Processes user input for creating/updating a rarity.
*
- * @param array $data
- * @param \App\Models\Rarity $rarity
+ * @param array $data
+ * @param Rarity $rarity
*
* @return array
*/
diff --git a/app/Services/ReportManager.php b/app/Services/ReportManager.php
index 6c1e9878f4..45dc0a58c0 100644
--- a/app/Services/ReportManager.php
+++ b/app/Services/ReportManager.php
@@ -40,7 +40,7 @@ public function createReport($data, $user, $isClaim = false) {
if (!isset($data['is_br'])) {
$data['is_br'] = 0;
}
- //dd($data['error']);
+ // dd($data['error']);
$report = Report::create([
'user_id' => $user->id,
diff --git a/app/Services/SalesService.php b/app/Services/SalesService.php
index f5a6f25a87..7b5e554010 100644
--- a/app/Services/SalesService.php
+++ b/app/Services/SalesService.php
@@ -22,10 +22,10 @@ class SalesService extends Service {
/**
* Creates a Sales post.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
- * @return \App\Models\Sales\Sales|bool
+ * @return bool|Sales
*/
public function createSales($data, $user) {
DB::beginTransaction();
@@ -73,11 +73,11 @@ public function createSales($data, $user) {
/**
* Updates a Sales post.
*
- * @param array $data
- * @param \App\Models\User\User $user
- * @param mixed $sales
+ * @param array $data
+ * @param User $user
+ * @param mixed $sales
*
- * @return \App\Models\Sales\Sales|bool
+ * @return bool|Sales
*/
public function updateSales($sales, $data, $user) {
DB::beginTransaction();
@@ -241,7 +241,7 @@ private function processCharacters($sales, $data) {
'image_id' => $data['image_id'][$key] ?? $character->image->id,
'sales_id' => $sales->id,
'type' => $charData[$key]['type'],
- 'data' => json_encode($charData[$key]),
+ 'data' => $charData[$key],
'description' => $data['description'][$key] ?? null,
'link' => $data['link'][$key] ?? null,
'is_open' => $data['character_is_open'][$character->slug] ?? ($data['new_entry'][$key] ? 1 : 0),
diff --git a/app/Services/Service.php b/app/Services/Service.php
index 17d100f668..1a9a159899 100644
--- a/app/Services/Service.php
+++ b/app/Services/Service.php
@@ -91,7 +91,7 @@ public function getError($key) {
* Empty the errors MessageBag.
*/
public function resetErrors() {
- $this->errors = new MessageBag();
+ $this->errors = new MessageBag;
}
public function remember($key = null, $fn = null) {
diff --git a/app/Services/ShopManager.php b/app/Services/ShopManager.php
index db5eb627c2..e72c558f0f 100644
--- a/app/Services/ShopManager.php
+++ b/app/Services/ShopManager.php
@@ -3,10 +3,13 @@
namespace App\Services;
use App\Models\Character\Character;
+use App\Models\Item\Item;
use App\Models\Shop\Shop;
use App\Models\Shop\ShopLog;
use App\Models\Shop\ShopStock;
+use App\Models\User\UserItem;
use Illuminate\Support\Facades\DB;
+use Settings;
class ShopManager extends Service {
/*
@@ -42,7 +45,7 @@ public function buyStock($data, $user) {
}
// Check that the stock exists and belongs to the shop
- $shopStock = ShopStock::where('id', $data['stock_id'])->where('shop_id', $data['shop_id'])->with('currency')->with('item')->first();
+ $shopStock = ShopStock::where('id', $data['stock_id'])->where('shop_id', $data['shop_id'])->first();
if (!$shopStock) {
throw new \Exception('Invalid item selected.');
}
@@ -52,23 +55,61 @@ public function buyStock($data, $user) {
throw new \Exception('There is insufficient stock to fulfill your request.');
}
+ if (isset($data['cost_group'])) {
+ $costs = $shopStock->costs()->where('group', $data['cost_group'])->get();
+ } else {
+ $costs = $shopStock->costs()->get();
+ // make sure that there is not differing groups
+ if (count($costs->pluck('group')->unique()) > 1) {
+ throw new \Exception('There are multiple cost groups for this item, please select one.');
+ }
+ }
+
// Check if the user can only buy a limited number of this item, and if it does, check that the user hasn't hit the limit
if ($shopStock->purchase_limit && $this->checkPurchaseLimitReached($shopStock, $user)) {
throw new \Exception('You have already purchased the maximum amount of this item you can buy.');
}
- if ($shopStock->purchase_limit && $quantity > $shopStock->purchase_limit) {
- throw new \Exception('The quantity specified exceeds the amount of this item you can buy.');
- }
+ $coupon = null;
+ $couponUserItem = null;
+ if (isset($data['use_coupon'])) {
+ // check if the the stock is limited stock
+ if ($shopStock->is_limited_stock && !Settings::get('limited_stock_coupon_settings')) {
+ throw new \Exception('Sorry! You can\'t use coupons on limited stock items');
+ }
+ if (!isset($data['coupon'])) {
+ throw new \Exception('Please select a coupon to use.');
+ }
+ // finding the users tag
+ $couponUserItem = UserItem::find($data['coupon']);
+ // check if the item id is inside allowed_coupons
+ if ($shop->allowed_coupons && count(json_decode($shop->allowed_coupons, 1)) > 0 && !in_array($couponUserItem->item_id, json_decode($shop->allowed_coupons, 1))) {
+ throw new \Exception('Sorry! You can\'t use this coupon.');
+ }
+ // finding bought item
+ $item = Item::find($couponUserItem->item_id);
+ $tag = $item->tags()->where('tag', 'Coupon')->first();
+ $coupon = $tag->data;
+
+ if (!$coupon['discount']) {
+ throw new \Exception('No discount amount set, please contact a site admin before trying to purchase again.');
+ }
- $total_cost = $shopStock->cost * $quantity;
+ // make sure this item isn't free
+ if (!$shopStock->costs()->count()) {
+ throw new \Exception('Cannot use a coupon on an item that is free.');
+ }
+
+ // if the coupon isn't infinite kill it
+ if (!$coupon['infinite']) {
+ if (!(new InventoryManager)->debitStack($user, 'Coupon Used', ['data' => 'Coupon used in purchase of '.$shopStock->item->name.' from '.$shop->name], $couponUserItem, 1)) {
+ throw new \Exception('Failed to remove coupon.');
+ }
+ }
+ }
$character = null;
if ($data['bank'] == 'character') {
- // Check if the user is using a character to pay
- // - stock must be purchaseable with characters
- // - currency must be character-held
- // - character has enough currency
if (!$shopStock->use_character_bank || !$shopStock->currency->is_character_owned) {
throw new \Exception("You cannot use a character's bank to pay for this item.");
}
@@ -82,21 +123,112 @@ public function buyStock($data, $user) {
if ($character->user_id != $user->id) {
throw new \Exception('That character does not belong to you.');
}
- if (!(new CurrencyManager)->debitCurrency($character, null, 'Shop Purchase', 'Purchased '.$shopStock->item->name.' from '.$shop->name, $shopStock->currency, $total_cost)) {
- throw new \Exception('Not enough currency to make this purchase.');
+ }
+
+ $baseStockCost = mergeAssetsArrays(createAssetsArray(true), createAssetsArray());
+ $userCostAssets = createAssetsArray();
+ $characterCostAssets = createAssetsArray(true);
+ $selected = [];
+ foreach ($costs as $cost) {
+ $costQuantity = abs($cost->quantity);
+ if ($coupon) { // coupon applies to ALL costs in the selected group.
+ if (!Settings::get('coupon_settings')) {
+ $minus = ($coupon['discount'] / 100) * ($costQuantity * $quantity);
+ $base = ($costQuantity * $quantity);
+ if ($base <= 0) {
+ throw new \Exception('Cannot use a coupon on an item that is free.');
+ }
+ $new = $base - $minus;
+ $costQuantity = round($new);
+ } else {
+ $minus = ($coupon['discount'] / 100) * ($costQuantity);
+ $base = ($costQuantity * $quantity);
+ if ($base <= 0) {
+ throw new \Exception('Cannot use a coupon on an item that is free.');
+ }
+ $new = $base - $minus;
+ $costQuantity = round($new);
+ }
+ } else {
+ $costQuantity *= $quantity;
}
- } else {
- // If the user is paying by themselves
- // - stock must be purchaseable by users
- // - currency must be user-held
- // - user has enough currency
- if (!$shopStock->use_user_bank || !$shopStock->currency->is_user_owned) {
- throw new \Exception('You cannot use your user bank to pay for this item.');
+
+ if ($cost->item->assetType == 'currencies') {
+ if ($data['bank'] == 'user') {
+ if (!$cost->item->is_user_owned) {
+ throw new \Exception('You cannot use your user bank to pay for this item.');
+ }
+
+ addAsset($userCostAssets, $cost->item, -$costQuantity);
+ } else {
+ if (!$cost->item->is_character_owned) {
+ throw new \Exception("You cannot use a character's bank to pay for this item.");
+ }
+
+ addAsset($characterCostAssets, $cost->item, -$costQuantity);
+ }
+ } elseif ($cost->item->assetType == 'items') {
+ $requiredQuantity = $costQuantity;
+ if (isset($data['stack_id'])) {
+ foreach ($data['stack_id'] as $userItemStackId) {
+ $stack = UserItem::where('id', $userItemStackId)->where('user_id', $user->id)->where('item_id', $cost->item->id)->where('count', '>', '0')->first();
+ if (!$stack) {
+ continue;
+ }
+
+ $stackQuantity = $data['stack_quantity'][$userItemStackId] ?? $stack->count;
+ $requiredQuantity -= $stackQuantity;
+ $selected[] = [
+ 'stack' => $stack,
+ 'quantity' => $stackQuantity,
+ ];
+ }
+ } else {
+ $stacks = UserItem::where('user_id', $user->id)->where('item_id', $cost->item->id)->where('count', '>', '0')->get();
+ foreach ($stacks as $stack) {
+ if ($stack->count >= $requiredQuantity) {
+ $selected[] = [
+ 'stack' => $stack,
+ 'quantity' => $requiredQuantity,
+ ];
+ $requiredQuantity = 0;
+ break;
+ } else {
+ $selected[] = [
+ 'stack' => $stack,
+ 'quantity' => $stack->count,
+ ];
+ $requiredQuantity -= $stack->count;
+ }
+ }
+ }
+
+ if ($requiredQuantity > 0) {
+ throw new \Exception('You do not have enough, or have not selected enough, of the required item to purchase this item.');
+ }
+
+ addAsset($userCostAssets, $cost->item, -$costQuantity);
+ } else {
+ addAsset($userCostAssets, $cost->item, -$costQuantity);
}
- if ($shopStock->cost > 0 && !(new CurrencyManager)->debitCurrency($user, null, 'Shop Purchase', 'Purchased '.$shopStock->item->name.' from '.$shop->name, $shopStock->currency, $total_cost)) {
- throw new \Exception('Not enough currency to make this purchase.');
+
+ addAsset($baseStockCost, $cost->item, $cost->quantity);
+ }
+
+ if ($character) {
+ if (!fillCharacterAssets($characterCostAssets, $character, null, 'Shop Purchase', [
+ 'data' => 'Purchased '.$shopStock->item->name.' x'.$quantity.' from '.$shop->name.
+ ($coupon ? '. Coupon used: '.$couponUserItem->item->name : ''),
+ ])) {
+ throw new \Exception('Failed to purchase item.');
}
}
+ if (!fillUserAssets($userCostAssets, $user, null, 'Shop Purchase', [
+ 'data' => 'Purchased '.$shopStock->item->name.' x'.$quantity.' from '.$shop->name.
+ ($coupon ? '. Coupon used: '.$couponUserItem->item->name : ''),
+ ], $selected)) {
+ throw new \Exception('Failed to purchase item - could not debit costs.');
+ }
// If the item has a limited quantity, decrease the quantity
if ($shopStock->is_limited_stock) {
@@ -109,18 +241,26 @@ public function buyStock($data, $user) {
'shop_id' => $shop->id,
'character_id' => $character ? $character->id : null,
'user_id' => $user->id,
- 'currency_id' => $shopStock->currency->id,
- 'cost' => $total_cost,
+ 'cost' => [
+ 'base' => getDataReadyAssets($baseStockCost),
+ 'user' => getDataReadyAssets($userCostAssets),
+ 'character' => getDataReadyAssets($characterCostAssets),
+ 'coupon' => $couponUserItem ? $couponUserItem->item->id : null,
+ ],
+ 'stock_type' => $shopStock->stock_type,
'item_id' => $shopStock->item_id,
'quantity' => $quantity,
]);
// Give the user the item, noting down 1. whose currency was used (user or character) 2. who purchased it 3. which shop it was purchased from
- if (!(new InventoryManager)->creditItem(null, $user, 'Shop Purchase', [
+ $assets = createAssetsArray();
+ addAsset($assets, $shopStock->item, $quantity);
+
+ if (!fillUserAssets($assets, null, $user, 'Shop Purchase', [
'data' => $shopLog->itemData,
'notes' => 'Purchased '.format_date($shopLog->created_at),
- ], $shopStock->item, $quantity)) {
- throw new \Exception('Failed to purchase item.');
+ ] + ($shopStock->disallow_transfer ? ['disallow_transfer' => true] : []))) {
+ throw new \Exception('Failed to purchase item - could not credit item.');
}
return $this->commitReturn($shop);
@@ -134,8 +274,8 @@ public function buyStock($data, $user) {
/**
* Checks if the purchase limit for an item from a shop has been reached.
*
- * @param \App\Models\Shop\ShopStock $shopStock
- * @param \App\Models\User\User $user
+ * @param ShopStock $shopStock
+ * @param \App\Models\User\User $user
*
* @return bool
*/
@@ -150,15 +290,43 @@ public function checkPurchaseLimitReached($shopStock, $user) {
/**
* Checks how many times a user has purchased a shop item.
*
- * @param \App\Models\Shop\ShopStock $shopStock
- * @param \App\Models\User\User $user
+ * @param ShopStock $shopStock
+ * @param \App\Models\User\User $user
*
* @return int
*/
public function checkUserPurchases($shopStock, $user) {
- return ShopLog::where('shop_id', $shopStock->shop_id)->where('item_id', $shopStock->item_id)->where('user_id', $user->id)->sum('quantity');
+ $date = $shopStock->purchaseLimitDate;
+ $shopQuery = ShopLog::where('shop_id', $shopStock->shop_id)
+ ->where('item_id', $shopStock->item_id)
+ ->where('user_id', $user->id);
+ $shopQuery = isset($date) ? $shopQuery->where('created_at', '>=', date('Y-m-d H:i:s', $date)) : $shopQuery;
+
+ // check the costs vs the user's purchase recorded costs
+ $shopQuery = $shopQuery->get()->filter(function ($log) use ($shopStock) {
+ // if there is no costs, then return true, since free items should also have limits
+ if (!count($shopStock->costGroups) && countAssets($log->baseCost) == 0) {
+ return true;
+ }
+
+ foreach ($shopStock->costGroups as $group => $costs) {
+ if (compareAssetArrays($log->baseCost, $costs, false, true)) {
+ return true;
+ }
+ }
+
+ return false;
+ });
+
+ return $shopQuery->sum('quantity');
}
+ /**
+ * Gets the purchase limit for an item from a shop.
+ *
+ * @param mixed $shopStock
+ * @param mixed $user
+ */
public function getStockPurchaseLimit($shopStock, $user) {
$limit = config('lorekeeper.settings.default_purchase_limit');
if ($shopStock->purchase_limit > 0) {
@@ -175,4 +343,17 @@ public function getStockPurchaseLimit($shopStock, $user) {
return $limit;
}
+
+ /**
+ * Gets how many of a shop item a user owns.
+ *
+ * @param mixed $stock
+ * @param mixed $user
+ */
+ public function getUserOwned($stock, $user) {
+ switch (strtolower($stock->stock_type)) {
+ case 'item':
+ return $user->items()->where('item_id', $stock->item_id)->sum('count');
+ }
+ }
}
diff --git a/app/Services/ShopService.php b/app/Services/ShopService.php
index 5f567282b7..6e3a66358b 100644
--- a/app/Services/ShopService.php
+++ b/app/Services/ShopService.php
@@ -27,7 +27,7 @@ class ShopService extends Service {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Shop\Shop|bool
+ * @return bool|Shop
*/
public function createShop($data, $user) {
DB::beginTransaction();
@@ -45,6 +45,8 @@ public function createShop($data, $user) {
$data['has_image'] = 0;
}
+ $data['is_timed_shop'] = isset($data['is_timed_shop']);
+
$shop = Shop::create($data);
if ($image) {
@@ -62,11 +64,11 @@ public function createShop($data, $user) {
/**
* Updates a shop.
*
- * @param \App\Models\Shop\Shop $shop
+ * @param Shop $shop
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Shop\Shop|bool
+ * @return bool|Shop
*/
public function updateShop($shop, $data, $user) {
DB::beginTransaction();
@@ -87,6 +89,8 @@ public function updateShop($shop, $data, $user) {
unset($data['image']);
}
+ $data['is_timed_shop'] = isset($data['is_timed_shop']);
+
$shop->update($data);
if ($shop) {
@@ -102,47 +106,95 @@ public function updateShop($shop, $data, $user) {
}
/**
- * Updates shop stock.
+ * Creates shop stock.
*
- * @param \App\Models\Shop\Shop $shop
+ * @param Shop $shop
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Shop\Shop|bool
+ * @return bool|Shop
*/
- public function updateShopStock($shop, $data, $user) {
+ public function createShopStock($shop, $data, $user) {
DB::beginTransaction();
try {
- if (isset($data['item_id'])) {
- foreach ($data['item_id'] as $key => $itemId) {
- if ($data['cost'][$key] == null) {
- throw new \Exception('One or more of the items is missing a cost.');
- }
- if ($data['cost'][$key] < 0) {
- throw new \Exception('One or more of the items has a negative cost.');
- }
+ if (!$data['stock_type']) {
+ throw new \Exception('Please select a stock type.');
+ }
+ if (!$data['item_id']) {
+ throw new \Exception('You must select an item.');
+ }
+
+ $is_random = false;
+ $is_category = false;
+ $categoryId = null;
+ // if the id is not numeric, it's a random item
+ if (!is_numeric($data['item_id'])) {
+ $is_random = true;
+
+ $type = $data['stock_type'];
+ $model = getAssetModelString(strtolower($type));
+ if ($data['item_id'] != 'random') {
+ // this means its a category, extract the id from the string
+ $categoryId = explode('-', $data['item_id'])[0];
+ $is_category = true;
}
- // Clear the existing shop stock
- $shop->stock()->delete();
-
- foreach ($data['item_id'] as $key => $itemId) {
- $shop->stock()->create([
- 'shop_id' => $shop->id,
- 'item_id' => $data['item_id'][$key],
- 'currency_id' => $data['currency_id'][$key],
- 'cost' => $data['cost'][$key],
- 'use_user_bank' => isset($data['use_user_bank'][$key]),
- 'use_character_bank' => isset($data['use_character_bank'][$key]),
- 'is_limited_stock' => isset($data['is_limited_stock'][$key]),
- 'quantity' => isset($data['is_limited_stock'][$key]) ? $data['quantity'][$key] : 0,
- 'purchase_limit' => $data['purchase_limit'][$key],
+ // check if "visible" method exists, if it does only get visible items
+ // also check for "released" method, if it exists only get released items
+ if (method_exists($model, 'visible')) {
+ $data['item_id'] = $categoryId ?
+ $model::visible()->where(strtolower($type).'_category_id', $categoryId)->inRandomOrder()->first()->id :
+ $model::visible()->inRandomOrder()->first()->id;
+ } elseif (method_exists($model, 'released')) {
+ $data['item_id'] = $categoryId ?
+ $model::released()->where(strtolower($type).'_category_id', $categoryId)->inRandomOrder()->first()->id :
+ $model::released()->inRandomOrder()->first()->id;
+ } else {
+ $data['item_id'] = $categoryId ?
+ $model::where(strtolower($type).'_category_id', $categoryId)->inRandomOrder()->first()->id :
+ $model::inRandomOrder()->first()->id;
+ }
+ }
+
+ $stock = $shop->stock()->create([
+ 'shop_id' => $shop->id,
+ 'item_id' => $data['item_id'],
+ 'use_user_bank' => isset($data['use_user_bank']),
+ 'use_character_bank' => isset($data['use_character_bank']),
+ 'is_fto' => isset($data['is_fto']),
+ 'is_limited_stock' => isset($data['is_limited_stock']),
+ 'quantity' => isset($data['is_limited_stock']) ? $data['quantity'] : 0,
+ 'purchase_limit' => $data['purchase_limit'] ?? 0,
+ 'purchase_limit_timeframe' => isset($data['purchase_limit']) ? $data['purchase_limit_timeframe'] : null,
+ 'stock_type' => $data['stock_type'],
+ 'is_visible' => $data['is_visible'] ?? 0,
+ 'restock' => $data['restock'] ?? 0,
+ 'restock_quantity' => isset($data['restock']) && isset($data['quantity']) ? $data['quantity'] : 1,
+ 'restock_interval' => $data['restock_interval'] ?? 2,
+ 'range' => $data['range'] ?? 0,
+ 'disallow_transfer' => $data['disallow_transfer'] ?? 0,
+ 'is_timed_stock' => isset($data['is_timed_stock']),
+ 'start_at' => $data['stock_start_at'],
+ 'end_at' => $data['stock_end_at'],
+ 'data' => [
+ 'is_random' => $is_random,
+ 'is_category' => $is_category,
+ 'category_id' => $categoryId,
+ 'stock_days' => $data['stock_days'] ?? null,
+ 'stock_months' => $data['stock_months'] ?? null,
+ ],
+ ]);
+
+ if (isset($data['cost_type']) && isset($data['cost_quantity'])) {
+ foreach ($data['cost_type'] as $key => $costType) {
+ $stock->costs()->create([
+ 'cost_type' => $costType,
+ 'cost_id' => $data['cost_id'][$key],
+ 'quantity' => $data['cost_quantity'][$key],
+ 'group' => $data['group'][$key] ?? 1,
]);
}
- } else {
- // Clear the existing shop stock
- $shop->stock()->delete();
}
return $this->commitReturn($shop);
@@ -153,10 +205,140 @@ public function updateShopStock($shop, $data, $user) {
return $this->rollbackReturn(false);
}
+ /**
+ * Updates shop stock.
+ *
+ * @param array $data
+ * @param \App\Models\User\User $user
+ * @param mixed $stock
+ *
+ * @return bool|Shop
+ */
+ public function editShopStock($stock, $data, $user) {
+ DB::beginTransaction();
+
+ try {
+ if (!$data['stock_type']) {
+ throw new \Exception('Please select a stock type.');
+ }
+ if (!$data['item_id']) {
+ throw new \Exception('You must select an item.');
+ }
+
+ $is_random = false;
+ $is_category = false;
+ $categoryId = null;
+ // if the id is not numeric, it's a random item
+ if (!is_numeric($data['item_id'])) {
+ $is_random = true;
+
+ $type = $data['stock_type'];
+ $model = getAssetModelString(strtolower($type));
+ if ($data['item_id'] != 'random') {
+ // this means its a category, extract the id from the string
+ $categoryId = explode('-', $data['item_id'])[0];
+ $is_category = true;
+ }
+
+ // check if "visible" method exists, if it does only get visible items
+ // also check for "released" method, if it exists only get released items
+ if (method_exists($model, 'visible')) {
+ $data['item_id'] = $categoryId ?
+ $model::visible()->where(strtolower($type).'_category_id', $categoryId)->inRandomOrder()->first()->id :
+ $model::visible()->inRandomOrder()->first()->id;
+ } elseif (method_exists($model, 'released')) {
+ $data['item_id'] = $categoryId ?
+ $model::released()->where(strtolower($type).'_category_id', $categoryId)->inRandomOrder()->first()->id :
+ $model::released()->inRandomOrder()->first()->id;
+ } else {
+ $data['item_id'] = $categoryId ?
+ $model::where(strtolower($type).'_category_id', $categoryId)->inRandomOrder()->first()->id :
+ $model::inRandomOrder()->first()->id;
+ }
+ }
+
+ $stock->update([
+ 'shop_id' => $stock->shop->id,
+ 'item_id' => $data['item_id'],
+ 'use_user_bank' => isset($data['use_user_bank']),
+ 'use_character_bank' => isset($data['use_character_bank']),
+ 'is_fto' => isset($data['is_fto']),
+ 'is_limited_stock' => isset($data['is_limited_stock']),
+ 'quantity' => isset($data['is_limited_stock']) ? $data['quantity'] : 0,
+ 'purchase_limit' => $data['purchase_limit'] ?? 0,
+ 'purchase_limit_timeframe' => $data['purchase_limit_timeframe'] ?? null,
+ 'stock_type' => $data['stock_type'],
+ 'is_visible' => $data['is_visible'] ?? 0,
+ 'restock' => $data['restock'] ?? 0,
+ 'restock_quantity' => isset($data['restock']) && isset($data['quantity']) ? $data['quantity'] : 1,
+ 'restock_interval' => $data['restock_interval'] ?? 2,
+ 'range' => $data['range'] ?? 0,
+ 'disallow_transfer' => $data['disallow_transfer'] ?? 0,
+ 'is_timed_stock' => isset($data['is_timed_stock']),
+ 'start_at' => $data['stock_start_at'],
+ 'end_at' => $data['stock_end_at'],
+ ]);
+
+ $stock->costs()->delete();
+
+ if (isset($data['cost_type']) && isset($data['cost_quantity'])) {
+ foreach ($data['cost_type'] as $key => $costType) {
+ $stock->costs()->create([
+ 'cost_type' => $costType,
+ 'cost_id' => $data['cost_id'][$key],
+ 'quantity' => $data['cost_quantity'][$key],
+ 'group' => $data['group'][$key] ?? 1,
+ ]);
+ }
+ }
+
+ // add coupon usage based on groups
+ $stockData = [
+ 'is_random' => $is_random,
+ 'is_category' => $is_category,
+ 'category_id' => $categoryId,
+ 'stock_days' => $data['stock_days'] ?? null,
+ 'stock_months' => $data['stock_months'] ?? null,
+ 'can_group_use_coupon' => [],
+ ];
+ if (isset($data['can_group_use_coupon'])) {
+ foreach ($data['can_group_use_coupon'] as $group => $canUseCoupon) {
+ // check if the group exists in the costs, since it may have been removed
+ if ($stock->costs()->where('group', $group)->exists() && $canUseCoupon) {
+ $stockData['can_group_use_coupon'][] = $group;
+ }
+ }
+ }
+ $stock->update([
+ 'data' => $stockData,
+ ]);
+
+ return $this->commitReturn($stock);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
+ public function deleteStock($stock) {
+ DB::beginTransaction();
+
+ try {
+ $stock->delete();
+
+ return $this->commitReturn(true);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
/**
* Deletes a shop.
*
- * @param \App\Models\Shop\Shop $shop
+ * @param Shop $shop
*
* @return bool
*/
@@ -209,18 +391,25 @@ public function sortShop($data) {
/**
* Processes user input for creating/updating a shop.
*
- * @param array $data
- * @param \App\Models\Shop\Shop $shop
+ * @param array $data
+ * @param Shop $shop
*
* @return array
*/
private function populateShopData($data, $shop = null) {
if (isset($data['description']) && $data['description']) {
$data['parsed_description'] = parse($data['description']);
- } else {
- $data['parsed_description'] = null;
}
$data['is_active'] = isset($data['is_active']);
+ $data['is_hidden'] = isset($data['is_hidden']);
+ $data['is_staff'] = isset($data['is_staff']);
+ $data['use_coupons'] = isset($data['use_coupons']);
+ $data['allowed_coupons'] ??= null;
+ $data['data'] = [
+ 'shop_days' => $data['shop_days'] ?? null,
+ 'shop_months' => $data['shop_months'] ?? null,
+ ];
+ unset($data['shop_days'], $data['shop_months']);
if (isset($data['remove_image'])) {
if ($shop && $shop->has_image && $data['remove_image']) {
diff --git a/app/Services/SpeciesService.php b/app/Services/SpeciesService.php
index c18351d0e9..8be3f56a8f 100644
--- a/app/Services/SpeciesService.php
+++ b/app/Services/SpeciesService.php
@@ -3,6 +3,7 @@
namespace App\Services;
use App\Models\Character\CharacterImage;
+use App\Models\Character\CharacterImageSubtype;
use App\Models\Species\Species;
use App\Models\Species\Subtype;
use Illuminate\Support\Facades\DB;
@@ -23,7 +24,7 @@ class SpeciesService extends Service {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Species\Species|bool
+ * @return bool|Species
*/
public function createSpecies($data, $user) {
DB::beginTransaction();
@@ -58,11 +59,11 @@ public function createSpecies($data, $user) {
/**
* Updates a species.
*
- * @param \App\Models\Species\Species $species
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param Species $species
+ * @param array $data
+ * @param \App\Models\User\User $user
*
- * @return \App\Models\Species\Species|bool
+ * @return bool|Species
*/
public function updateSpecies($species, $data, $user) {
DB::beginTransaction();
@@ -100,7 +101,7 @@ public function updateSpecies($species, $data, $user) {
/**
* Deletes a species.
*
- * @param \App\Models\Species\Species $species
+ * @param Species $species
*
* @return bool
*/
@@ -158,7 +159,7 @@ public function sortSpecies($data) {
* @param array $data
* @param \App\Models\User\User $user
*
- * @return \App\Models\Species\Subtype|bool
+ * @return bool|Subtype
*/
public function createSubtype($data, $user) {
DB::beginTransaction();
@@ -193,11 +194,11 @@ public function createSubtype($data, $user) {
/**
* Updates a subtype.
*
- * @param \App\Models\Species\Subtype $subtype
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param Subtype $subtype
+ * @param array $data
+ * @param \App\Models\User\User $user
*
- * @return \App\Models\Species\Subtype|bool
+ * @return bool|Subtype
*/
public function updateSubtype($subtype, $data, $user) {
DB::beginTransaction();
@@ -230,7 +231,7 @@ public function updateSubtype($subtype, $data, $user) {
/**
* Deletes a subtype.
*
- * @param \App\Models\Species\Subtype $subtype
+ * @param Subtype $subtype
*
* @return bool
*/
@@ -239,7 +240,7 @@ public function deleteSubtype($subtype) {
try {
// Check first if characters with this subtype exists
- if (CharacterImage::where('subtype_id', $subtype->id)->exists()) {
+ if (CharacterImageSubtype::where('subtype_id', $subtype->id)->exists()) {
throw new \Exception('A character image with this subtype exists. Please change or remove its subtype first.');
}
@@ -285,8 +286,8 @@ public function sortSubtypes($data) {
/**
* Processes user input for creating/updating a species.
*
- * @param array $data
- * @param \App\Models\Species\Species $species
+ * @param array $data
+ * @param Species $species
*
* @return array
*/
@@ -312,8 +313,8 @@ private function populateData($data, $species = null) {
/**
* Processes user input for creating/updating a subtype.
*
- * @param array $data
- * @param \App\Models\Species\Subtype $subtype
+ * @param array $data
+ * @param Subtype $subtype
*
* @return array
*/
diff --git a/app/Services/SublistService.php b/app/Services/SublistService.php
index 25c16f266c..12b74f6263 100644
--- a/app/Services/SublistService.php
+++ b/app/Services/SublistService.php
@@ -29,7 +29,7 @@ class SublistService extends Service {
* @param array $data
* @param array $contents
*
- * @return \App\Models\Character\Sublist|bool
+ * @return bool|Sublist
*/
public function createSublist($data, $contents) {
DB::beginTransaction();
@@ -37,7 +37,7 @@ public function createSublist($data, $contents) {
try {
$sublist = Sublist::create($data);
- //update categories and species
+ // update categories and species
if (isset($contents['categories']) && $contents['categories']) {
CharacterCategory::whereIn('id', $contents['categories'])->update(['masterlist_sub_id' => $sublist->id]);
}
@@ -56,11 +56,11 @@ public function createSublist($data, $contents) {
/**
* Update a sublist.
*
- * @param \App\Models\Character\Sublist $sublist
- * @param array $data
- * @param array $contents
+ * @param Sublist $sublist
+ * @param array $data
+ * @param array $contents
*
- * @return \App\Models\Character\Sublist|bool
+ * @return bool|Sublist
*/
public function updateSublist($sublist, $data, $contents) {
DB::beginTransaction();
@@ -71,10 +71,10 @@ public function updateSublist($sublist, $data, $contents) {
throw new \Exception('The name has already been taken.');
}
- //update sublist
+ // update sublist
$sublist->update($data);
- //update categories and species
+ // update categories and species
CharacterCategory::where('masterlist_sub_id', $sublist->id)->update(['masterlist_sub_id' => 0]);
Species::where('masterlist_sub_id', $sublist->id)->update(['masterlist_sub_id' => 0]);
if (isset($contents['categories'])) {
@@ -95,7 +95,7 @@ public function updateSublist($sublist, $data, $contents) {
/**
* Delete a sublist.
*
- * @param \App\Models\Character\Sublist $sublist
+ * @param Sublist $sublist
*
* @return bool
*/
diff --git a/app/Services/SubmissionManager.php b/app/Services/SubmissionManager.php
index a86be7924d..1ecbb297b7 100644
--- a/app/Services/SubmissionManager.php
+++ b/app/Services/SubmissionManager.php
@@ -31,10 +31,10 @@ class SubmissionManager extends Service {
/**
* Creates a new submission.
*
- * @param array $data
- * @param \App\Models\User\User $user
- * @param bool $isClaim
- * @param mixed $isDraft
+ * @param array $data
+ * @param User $user
+ * @param bool $isClaim
+ * @param mixed $isDraft
*
* @return mixed
*/
@@ -83,10 +83,10 @@ public function createSubmission($data, $user, $isClaim = false, $isDraft = fals
$promptRewards = $assets['promptRewards'];
$submission->update([
- 'data' => json_encode([
+ 'data' => [
'user' => Arr::only(getDataReadyAssets($userAssets), ['user_items', 'currencies']),
'rewards' => getDataReadyAssets($promptRewards),
- ]), // list of rewards and addons
+ ] + (config('lorekeeper.settings.allow_gallery_submissions_on_prompts') ? ['gallery_submission_id' => $data['gallery_submission_id'] ?? null] : []),
]);
// Set characters that have been attached.
@@ -103,11 +103,11 @@ public function createSubmission($data, $user, $isClaim = false, $isDraft = fals
/**
* Edits an existing submission.
*
- * @param array $data
- * @param \App\Models\User\User $user
- * @param bool $isClaim
- * @param mixed $submission
- * @param mixed $isSubmit
+ * @param array $data
+ * @param User $user
+ * @param bool $isClaim
+ * @param mixed $submission
+ * @param mixed $isSubmit
*
* @return mixed
*/
@@ -155,10 +155,10 @@ public function editSubmission($submission, $data, $user, $isClaim = false, $isS
'url' => $data['url'] ?? null,
'updated_at' => Carbon::now(),
'comments' => $data['comments'],
- 'data' => json_encode([
+ 'data' => [
'user' => Arr::only(getDataReadyAssets($userAssets), ['user_items', 'currencies']),
'rewards' => getDataReadyAssets($promptRewards),
- ]), // list of rewards and addons
+ ] + (config('lorekeeper.settings.allow_gallery_submissions_on_prompts') ? ['gallery_submission_id' => $data['gallery_submission_id'] ?? null] : []),
] + ($isClaim ? [] : ['prompt_id' => $prompt->id]));
return $this->commitReturn($submission);
@@ -215,10 +215,11 @@ public function cancelSubmission($data, $user) {
'updated_at' => Carbon::now(),
'staff_id' => $user->id,
'status' => 'Draft',
- 'data' => json_encode([
- 'user' => $userAssets,
- 'rewards' => getDataReadyAssets($promptRewards),
- ]), // list of rewards and addons
+ 'data' => [
+ 'user' => $userAssets,
+ 'rewards' => getDataReadyAssets($promptRewards),
+ 'gallery_submission_id' => $submission->data['gallery_submission_id'] ?? null,
+ ], // list of rewards and addons
]);
Notifications::create($submission->prompt_id ? 'SUBMISSION_CANCELLED' : 'CLAIM_CANCELLED', $submission->user, [
@@ -231,10 +232,11 @@ public function cancelSubmission($data, $user) {
$submission->update([
'status' => 'Draft',
'updated_at' => Carbon::now(),
- 'data' => json_encode([
- 'user' => $userAssets,
- 'rewards' => getDataReadyAssets($promptRewards),
- ]), // list of rewards and addons
+ 'data' => [
+ 'user' => $userAssets,
+ 'rewards' => getDataReadyAssets($promptRewards),
+ 'gallery_submission_id' => $submission->data['gallery_submission_id'] ?? null,
+ ], // list of rewards and addons
]);
}
@@ -249,8 +251,8 @@ public function cancelSubmission($data, $user) {
/**
* Rejects a submission.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
* @return mixed
*/
@@ -312,8 +314,8 @@ public function rejectSubmission($data, $user) {
/**
* Approves a submission.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
* @return mixed
*/
@@ -454,7 +456,7 @@ public function approveSubmission($data, $user) {
SubmissionCharacter::create([
'character_id' => $c->id,
'submission_id' => $submission->id,
- 'data' => json_encode(getDataReadyAssets($assets)),
+ 'data' => getDataReadyAssets($assets),
]);
}
@@ -480,10 +482,11 @@ public function approveSubmission($data, $user) {
'parsed_staff_comments' => $data['parsed_staff_comments'],
'staff_id' => $user->id,
'status' => 'Approved',
- 'data' => json_encode([
- 'user' => $addonData,
- 'rewards' => getDataReadyAssets($rewards),
- ]), // list of rewards
+ 'data' => [
+ 'user' => $addonData,
+ 'rewards' => getDataReadyAssets($rewards),
+ 'gallery_submission_id' => $submission->data['gallery_submission_id'] ?? null,
+ ], // list of rewards
]);
Notifications::create($submission->prompt_id ? 'SUBMISSION_APPROVED' : 'CLAIM_APPROVED', $submission->user, [
@@ -795,7 +798,7 @@ private function createCharacterAttachments($submission, $data) {
SubmissionCharacter::create([
'character_id' => $c->id,
'submission_id' => $submission->id,
- 'data' => json_encode(getDataReadyAssets($assets)),
+ 'data' => getDataReadyAssets($assets),
]);
}
diff --git a/app/Services/TradeManager.php b/app/Services/TradeManager.php
index 6726d56210..312d6c5db8 100644
--- a/app/Services/TradeManager.php
+++ b/app/Services/TradeManager.php
@@ -25,10 +25,10 @@ class TradeManager extends Service {
/**
* Creates a new trade.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
- * @return \App\Models\Trade|bool
+ * @return bool|Trade
*/
public function createTrade($data, $user) {
DB::beginTransaction();
@@ -56,7 +56,9 @@ public function createTrade($data, $user) {
]);
if ($assetData = $this->handleTradeAssets($trade, $data, $user)) {
- $trade->data = json_encode(['sender' => getDataReadyAssets($assetData['sender'])]);
+ $trade->data = [
+ 'sender' => getDataReadyAssets($assetData['sender']),
+ ];
$trade->save();
// send a notification
@@ -78,10 +80,10 @@ public function createTrade($data, $user) {
/**
* Edits a user's side of a trade.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
- * @return \App\Models\Trade|bool
+ * @return bool|Trade
*/
public function editTrade($data, $user) {
DB::beginTransaction();
@@ -103,7 +105,7 @@ public function editTrade($data, $user) {
$tradeData = $trade->data;
$isSender = ($trade->sender_id == $user->id);
$tradeData[$isSender ? 'sender' : 'recipient'] = getDataReadyAssets($assetData[$isSender ? 'sender' : 'recipient']);
- $trade->data = json_encode($tradeData);
+ $trade->data = $tradeData;
$trade->{'is_'.($isSender ? 'sender' : 'recipient').'_confirmed'} = 0;
$trade->{'is_'.($isSender ? 'recipient' : 'sender').'_trade_confirmed'} = 0;
$trade->save();
@@ -120,10 +122,10 @@ public function editTrade($data, $user) {
/**
* Cancels a trade.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
- * @return \App\Models\Trade|bool
+ * @return bool|Trade
*/
public function cancelTrade($data, $user) {
DB::beginTransaction();
@@ -165,10 +167,10 @@ public function cancelTrade($data, $user) {
/**
* Confirms the user's offer.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
- * @return \App\Models\Trade|bool
+ * @return bool|Trade
*/
public function confirmOffer($data, $user) {
DB::beginTransaction();
@@ -231,10 +233,10 @@ public function confirmOffer($data, $user) {
/**
* Confirms the trade for a user.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
- * @return \App\Models\Trade|bool
+ * @return bool|Trade
*/
public function confirmTrade($data, $user) {
DB::beginTransaction();
@@ -309,10 +311,10 @@ public function confirmTrade($data, $user) {
/**
* Approves a trade in the admin panel.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
- * @return \App\Models\Trade|bool
+ * @return bool|Trade
*/
public function approveTrade($data, $user) {
DB::beginTransaction();
@@ -359,10 +361,10 @@ public function approveTrade($data, $user) {
/**
* Rejects a trade in the admin panel.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
- * @return \App\Models\Trade|bool
+ * @return bool|Trade
*/
public function rejectTrade($data, $user) {
DB::beginTransaction();
@@ -408,9 +410,9 @@ public function rejectTrade($data, $user) {
/**
* Handles modification of assets on the user's side of a trade.
*
- * @param \App\Models\Trade $trade
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param Trade $trade
+ * @param array $data
+ * @param User $user
*
* @return array|bool
*/
@@ -487,7 +489,7 @@ private function handleTradeAssets($trade, $data, $user) {
if ($user->id != $trade->sender_id && $user->id != $trade->recipient_id) {
throw new \Exception('Error attaching currencies to this trade.');
}
- //dd([$data['currency_id'], $data['currency_quantity']]);
+ // dd([$data['currency_id'], $data['currency_quantity']]);
$data['currency_id'] = $data['currency_id']['user-'.$user->id];
$data['currency_quantity'] = $data['currency_quantity']['user-'.$user->id];
foreach ($data['currency_id'] as $key=> $currencyId) {
@@ -552,7 +554,7 @@ private function handleTradeAssets($trade, $data, $user) {
/**
* Returns trade attachments to their owners.
*
- * @param \App\Models\Trade $trade
+ * @param Trade $trade
*
* @return bool
*/
@@ -607,8 +609,8 @@ private function returnAttachments($trade) {
/**
* Credits trade attachments to their new owners.
*
- * @param \App\Models\Trade $trade
- * @param array $data
+ * @param Trade $trade
+ * @param array $data
*
* @return bool
*/
diff --git a/app/Services/UserService.php b/app/Services/UserService.php
index ba1c84e5c2..b5b33d1fa7 100644
--- a/app/Services/UserService.php
+++ b/app/Services/UserService.php
@@ -36,7 +36,7 @@ class UserService extends Service {
*
* @param array $data
*
- * @return \App\Models\User\User
+ * @return User
*/
public function createUser($data) {
// If the rank is not given, create a user with the lowest existing rank.
@@ -111,7 +111,7 @@ public function validator(array $data, $socialite = false) {
*
* @param array $data
*
- * @return \App\Models\User\User
+ * @return User
*/
public function updateUser($data) {
$user = User::find($data['id']);
@@ -128,8 +128,8 @@ public function updateUser($data) {
/**
* Updates the user's password.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
* @return bool
*/
@@ -158,8 +158,8 @@ public function updatePassword($data, $user) {
/**
* Updates the user's email and resends a verification email.
*
- * @param array $data
- * @param \App\Models\User\User $user
+ * @param array $data
+ * @param User $user
*
* @return bool
*/
@@ -274,18 +274,65 @@ public function disableTwoFactor($code, $user) {
return $this->rollbackReturn(false);
}
+ /**
+ * Updates user's warning visibility setting.
+ *
+ * @param mixed $data
+ * @param mixed $user
+ *
+ * @return bool
+ */
+ public function updateContentWarningVisibility($data, $user) {
+ DB::beginTransaction();
+
+ try {
+ $user->settings->content_warning_visibility = $data;
+ $user->settings->save();
+
+ return $this->commitReturn(true);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
+ /**
+ * Updates user's profile comment setting.
+ *
+ * @param mixed $data
+ * @param mixed $user
+ *
+ * @return bool
+ */
+ public function updateProfileCommentSetting($data, $user) {
+ DB::beginTransaction();
+
+ try {
+ $user->settings->allow_profile_comments = $data ?? 0;
+ $user->settings->save();
+
+ return $this->commitReturn(true);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
+
/**
* Updates the user's avatar.
*
- * @param \App\Models\User\User $user
- * @param mixed $avatar
+ * @param User $user
+ * @param mixed $data
*
* @return bool
*/
- public function updateAvatar($avatar, $user) {
+ public function updateAvatar($data, $user) {
DB::beginTransaction();
try {
+ $avatar = $data['avatar'];
if (!$avatar) {
throw new \Exception('Please upload a file.');
}
@@ -293,7 +340,7 @@ public function updateAvatar($avatar, $user) {
if ($user->avatar != 'default.jpg') {
$file = 'images/avatars/'.$user->avatar;
- //$destinationPath = 'uploads/' . $id . '/';
+ // $destinationPath = 'uploads/' . $id . '/';
if (File::exists($file)) {
if (!unlink($file)) {
@@ -308,7 +355,13 @@ public function updateAvatar($avatar, $user) {
throw new \Exception('Failed to move file.');
}
} else {
- if (!Image::make($avatar)->resize(150, 150)->save(public_path('images/avatars/'.$filename))) {
+ // crop image first
+ $cropWidth = $data['x1'] - $data['x0'];
+ $cropHeight = $data['y1'] - $data['y0'];
+
+ $image = Image::make($avatar);
+ $image->crop($cropWidth, $cropHeight, $data['x0'], $data['y0']);
+ if (!$image->resize(150, 150)->save(public_path('images/avatars/'.$filename))) {
throw new \Exception('Failed to process avatar.');
}
}
@@ -327,8 +380,8 @@ public function updateAvatar($avatar, $user) {
/**
* Updates a user's username.
*
- * @param string $username
- * @param \App\Models\User\User $user
+ * @param string $username
+ * @param User $user
*
* @return bool
*/
@@ -370,7 +423,7 @@ public function updateUsername($username, $user) {
UserUpdateLog::create([
'staff_id' => null,
'user_id' => $user->id,
- 'data' => json_encode(['old_name' => $user->name, 'new_name' => $username]),
+ 'data' => ['old_name' => $user->name, 'new_name' => $username],
'type' => 'Username Change',
]);
@@ -388,9 +441,9 @@ public function updateUsername($username, $user) {
/**
* Bans a user.
*
- * @param array $data
- * @param \App\Models\User\User $user
- * @param \App\Models\User\User $staff
+ * @param array $data
+ * @param User $user
+ * @param User $staff
*
* @return bool
*/
@@ -451,7 +504,7 @@ public function ban($data, $user, $staff) {
$tradeManager->rejectTrade(['trade' => $trade, 'reason' => 'User has been banned from site activity.'], $staff);
}
- UserUpdateLog::create(['staff_id' => $staff->id, 'user_id' => $user->id, 'data' => json_encode(['is_banned' => 'Yes', 'ban_reason' => $data['ban_reason'] ?? null]), 'type' => 'Ban']);
+ UserUpdateLog::create(['staff_id' => $staff->id, 'user_id' => $user->id, 'data' => ['is_banned' => 'Yes', 'ban_reason' => $data['ban_reason'] ?? null], 'type' => 'Ban']);
$user->settings->banned_at = Carbon::now();
@@ -459,7 +512,7 @@ public function ban($data, $user, $staff) {
$user->rank_id = Rank::orderBy('sort')->first()->id;
$user->save();
} else {
- UserUpdateLog::create(['staff_id' => $staff->id, 'user_id' => $user->id, 'data' => json_encode(['ban_reason' => $data['ban_reason'] ?? null]), 'type' => 'Ban Update']);
+ UserUpdateLog::create(['staff_id' => $staff->id, 'user_id' => $user->id, 'data' => ['ban_reason' => $data['ban_reason'] ?? null], 'type' => 'Ban Update']);
}
$user->settings->ban_reason = isset($data['ban_reason']) && $data['ban_reason'] ? $data['ban_reason'] : null;
@@ -476,8 +529,8 @@ public function ban($data, $user, $staff) {
/**
* Unbans a user.
*
- * @param \App\Models\User\User $user
- * @param \App\Models\User\User $staff
+ * @param User $user
+ * @param User $staff
*
* @return bool
*/
@@ -496,7 +549,7 @@ public function unban($user, $staff) {
$user->settings->ban_reason = null;
$user->settings->banned_at = null;
$user->settings->save();
- UserUpdateLog::create(['staff_id' => $staff->id, 'user_id' => $user->id, 'data' => json_encode(['is_banned' => 'No']), 'type' => 'Unban']);
+ UserUpdateLog::create(['staff_id' => $staff->id, 'user_id' => $user->id, 'data' => ['is_banned' => 'No'], 'type' => 'Unban']);
}
return $this->commitReturn(true);
@@ -510,9 +563,9 @@ public function unban($user, $staff) {
/**
* Deactivates a user.
*
- * @param array $data
- * @param \App\Models\User\User $user
- * @param \App\Models\User\User $staff
+ * @param array $data
+ * @param User $user
+ * @param User $staff
*
* @return bool
*/
@@ -573,7 +626,7 @@ public function deactivate($data, $user, $staff = null) {
$tradeManager->rejectTrade(['trade' => $trade, 'reason' => 'User\'s account was deactivated.'], $staff);
}
- UserUpdateLog::create(['staff_id' => $staff->id, 'user_id' => $user->id, 'data' => json_encode(['is_deactivated' => 'Yes', 'deactivate_reason' => $data['deactivate_reason'] ?? null]), 'type' => 'Deactivation']);
+ UserUpdateLog::create(['staff_id' => $staff->id, 'user_id' => $user->id, 'data' => ['is_deactivated' => 'Yes', 'deactivate_reason' => $data['deactivate_reason'] ?? null], 'type' => 'Deactivation']);
$user->settings->deactivated_at = Carbon::now();
@@ -589,7 +642,7 @@ public function deactivate($data, $user, $staff = null) {
'staff_name' => $staff->name,
]);
} else {
- UserUpdateLog::create(['staff_id' => $staff->id, 'user_id' => $user->id, 'data' => json_encode(['deactivate_reason' => $data['deactivate_reason'] ?? null]), 'type' => 'Deactivation Update']);
+ UserUpdateLog::create(['staff_id' => $staff->id, 'user_id' => $user->id, 'data' => ['deactivate_reason' => $data['deactivate_reason'] ?? null], 'type' => 'Deactivation Update']);
}
$user->settings->deactivate_reason = isset($data['deactivate_reason']) && $data['deactivate_reason'] ? $data['deactivate_reason'] : null;
@@ -606,8 +659,8 @@ public function deactivate($data, $user, $staff = null) {
/**
* Reactivates a user account.
*
- * @param \App\Models\User\User $user
- * @param \App\Models\User\User $staff
+ * @param User $user
+ * @param User $staff
*
* @return bool
*/
@@ -626,7 +679,7 @@ public function reactivate($user, $staff = null) {
$user->settings->deactivate_reason = null;
$user->settings->deactivated_at = null;
$user->settings->save();
- UserUpdateLog::create(['staff_id' => $staff ? $staff->id : $user->id, 'user_id' => $user->id, 'data' => json_encode(['is_deactivated' => 'No']), 'type' => 'Reactivation']);
+ UserUpdateLog::create(['staff_id' => $staff ? $staff->id : $user->id, 'user_id' => $user->id, 'data' => ['is_deactivated' => 'No'], 'type' => 'Reactivation']);
}
Notifications::create('USER_REACTIVATED', User::find(Settings::get('admin_user')), [
@@ -643,4 +696,29 @@ public function reactivate($user, $staff = null) {
return $this->rollbackReturn(false);
}
+
+ /**
+ * Updates user's font settings.
+ *
+ * @param mixed $data
+ * @param mixed $user
+ */
+ public function updateFontSetting($data, $user) {
+ DB::beginTransaction();
+
+ try {
+ $user->settings->font_size = $data['font_size'];
+ $user->settings->site_fonts_disabled = $data['site_fonts_disabled'];
+ $user->settings->letter_spacing = $data['letter_spacing'];
+ $user->settings->word_spacing = $data['word_spacing'];
+ $user->settings->line_height = $data['line_height'];
+ $user->settings->save();
+
+ return $this->commitReturn(true);
+ } catch (\Exception $e) {
+ $this->setError('error', $e->getMessage());
+ }
+
+ return $this->rollbackReturn(false);
+ }
}
diff --git a/composer.json b/composer.json
index f0291b2a45..09654ecc0f 100644
--- a/composer.json
+++ b/composer.json
@@ -29,7 +29,8 @@
"socialiteproviders/tumblr": "^4.1",
"socialiteproviders/twitch": "^5.3",
"spatie/laravel-feed": "^4.1",
- "spatie/laravel-honeypot": "^4.1"
+ "spatie/laravel-honeypot": "^4.1",
+ "spatie/laravel-html": "^3.5"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",
@@ -87,4 +88,4 @@
"./vendor/bin/pint"
]
}
-}
+}
\ No newline at end of file
diff --git a/composer.lock b/composer.lock
index 4790ed406c..dd0befa69e 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "c55171da67e589f3576e01d21cac6c5a",
+ "content-hash": "fbd34815b2d4ecb9a4a910dfdae0f8dc",
"packages": [
{
"name": "bacon/bacon-qr-code",
@@ -62,25 +62,25 @@
},
{
"name": "brick/math",
- "version": "0.11.0",
+ "version": "0.12.1",
"source": {
"type": "git",
"url": "https://github.com/brick/math.git",
- "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478"
+ "reference": "f510c0a40911935b77b86859eb5223d58d660df1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478",
- "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478",
+ "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1",
+ "reference": "f510c0a40911935b77b86859eb5223d58d660df1",
"shasum": ""
},
"require": {
- "php": "^8.0"
+ "php": "^8.1"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.2",
- "phpunit/phpunit": "^9.0",
- "vimeo/psalm": "5.0.0"
+ "phpunit/phpunit": "^10.1",
+ "vimeo/psalm": "5.16.0"
},
"type": "library",
"autoload": {
@@ -100,12 +100,17 @@
"arithmetic",
"bigdecimal",
"bignum",
+ "bignumber",
"brick",
- "math"
+ "decimal",
+ "integer",
+ "math",
+ "mathematics",
+ "rational"
],
"support": {
"issues": "https://github.com/brick/math/issues",
- "source": "https://github.com/brick/math/tree/0.11.0"
+ "source": "https://github.com/brick/math/tree/0.12.1"
},
"funding": [
{
@@ -113,7 +118,7 @@
"type": "github"
}
],
- "time": "2023-01-15T23:15:59+00:00"
+ "time": "2023-11-29T23:19:16+00:00"
},
{
"name": "carbonphp/carbon-doctrine-types",
@@ -186,23 +191,23 @@
},
{
"name": "dasprid/enum",
- "version": "1.0.5",
+ "version": "1.0.6",
"source": {
"type": "git",
"url": "https://github.com/DASPRiD/Enum.git",
- "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016"
+ "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/6faf451159fb8ba4126b925ed2d78acfce0dc016",
- "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016",
+ "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8dfd07c6d2cf31c8da90c53b83c026c7696dda90",
+ "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90",
"shasum": ""
},
"require": {
"php": ">=7.1 <9.0"
},
"require-dev": {
- "phpunit/phpunit": "^7 | ^8 | ^9",
+ "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11",
"squizlabs/php_codesniffer": "*"
},
"type": "library",
@@ -230,22 +235,22 @@
],
"support": {
"issues": "https://github.com/DASPRiD/Enum/issues",
- "source": "https://github.com/DASPRiD/Enum/tree/1.0.5"
+ "source": "https://github.com/DASPRiD/Enum/tree/1.0.6"
},
- "time": "2023-08-25T16:18:39+00:00"
+ "time": "2024-08-09T14:30:48+00:00"
},
{
"name": "dflydev/dot-access-data",
- "version": "v3.0.2",
+ "version": "v3.0.3",
"source": {
"type": "git",
"url": "https://github.com/dflydev/dflydev-dot-access-data.git",
- "reference": "f41715465d65213d644d3141a6a93081be5d3549"
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549",
- "reference": "f41715465d65213d644d3141a6a93081be5d3549",
+ "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f",
"shasum": ""
},
"require": {
@@ -305,9 +310,9 @@
],
"support": {
"issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
- "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2"
+ "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3"
},
- "time": "2022-10-27T11:44:00+00:00"
+ "time": "2024-07-08T12:26:09+00:00"
},
{
"name": "doctrine/cache",
@@ -404,16 +409,16 @@
},
{
"name": "doctrine/dbal",
- "version": "3.7.2",
+ "version": "3.9.4",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
- "reference": "0ac3c270590e54910715e9a1a044cc368df282b2"
+ "reference": "ec16c82f20be1a7224e65ac67144a29199f87959"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/dbal/zipball/0ac3c270590e54910715e9a1a044cc368df282b2",
- "reference": "0ac3c270590e54910715e9a1a044cc368df282b2",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/ec16c82f20be1a7224e65ac67144a29199f87959",
+ "reference": "ec16c82f20be1a7224e65ac67144a29199f87959",
"shasum": ""
},
"require": {
@@ -429,15 +434,13 @@
"doctrine/coding-standard": "12.0.0",
"fig/log-test": "^1",
"jetbrains/phpstorm-stubs": "2023.1",
- "phpstan/phpstan": "1.10.42",
- "phpstan/phpstan-strict-rules": "^1.5",
- "phpunit/phpunit": "9.6.13",
- "psalm/plugin-phpunit": "0.18.4",
+ "phpstan/phpstan": "2.1.1",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "9.6.22",
"slevomat/coding-standard": "8.13.1",
- "squizlabs/php_codesniffer": "3.7.2",
- "symfony/cache": "^5.4|^6.0",
- "symfony/console": "^4.4|^5.4|^6.0",
- "vimeo/psalm": "4.30.0"
+ "squizlabs/php_codesniffer": "3.10.2",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/console": "^4.4|^5.4|^6.0|^7.0"
},
"suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files."
@@ -497,7 +500,7 @@
],
"support": {
"issues": "https://github.com/doctrine/dbal/issues",
- "source": "https://github.com/doctrine/dbal/tree/3.7.2"
+ "source": "https://github.com/doctrine/dbal/tree/3.9.4"
},
"funding": [
{
@@ -513,33 +516,31 @@
"type": "tidelift"
}
],
- "time": "2023-11-19T08:06:58+00:00"
+ "time": "2025-01-16T08:28:55+00:00"
},
{
"name": "doctrine/deprecations",
- "version": "1.1.2",
+ "version": "1.1.4",
"source": {
"type": "git",
"url": "https://github.com/doctrine/deprecations.git",
- "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931"
+ "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931",
- "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931",
+ "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9",
+ "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
- "doctrine/coding-standard": "^9",
- "phpstan/phpstan": "1.4.10 || 1.10.15",
- "phpstan/phpstan-phpunit": "^1.0",
+ "doctrine/coding-standard": "^9 || ^12",
+ "phpstan/phpstan": "1.4.10 || 2.0.3",
+ "phpstan/phpstan-phpunit": "^1.0 || ^2",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "psalm/plugin-phpunit": "0.18.4",
- "psr/log": "^1 || ^2 || ^3",
- "vimeo/psalm": "4.30.0 || 5.12.0"
+ "psr/log": "^1 || ^2 || ^3"
},
"suggest": {
"psr/log": "Allows logging deprecations via PSR-3 logger implementation"
@@ -547,7 +548,7 @@
"type": "library",
"autoload": {
"psr-4": {
- "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
+ "Doctrine\\Deprecations\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -558,22 +559,22 @@
"homepage": "https://www.doctrine-project.org/",
"support": {
"issues": "https://github.com/doctrine/deprecations/issues",
- "source": "https://github.com/doctrine/deprecations/tree/1.1.2"
+ "source": "https://github.com/doctrine/deprecations/tree/1.1.4"
},
- "time": "2023-09-27T20:04:15+00:00"
+ "time": "2024-12-07T21:18:45+00:00"
},
{
"name": "doctrine/event-manager",
- "version": "2.0.0",
+ "version": "2.0.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/event-manager.git",
- "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32"
+ "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32",
- "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32",
+ "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e",
+ "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e",
"shasum": ""
},
"require": {
@@ -583,10 +584,10 @@
"doctrine/common": "<2.9"
},
"require-dev": {
- "doctrine/coding-standard": "^10",
+ "doctrine/coding-standard": "^12",
"phpstan/phpstan": "^1.8.8",
- "phpunit/phpunit": "^9.5",
- "vimeo/psalm": "^4.28"
+ "phpunit/phpunit": "^10.5",
+ "vimeo/psalm": "^5.24"
},
"type": "library",
"autoload": {
@@ -635,7 +636,7 @@
],
"support": {
"issues": "https://github.com/doctrine/event-manager/issues",
- "source": "https://github.com/doctrine/event-manager/tree/2.0.0"
+ "source": "https://github.com/doctrine/event-manager/tree/2.0.1"
},
"funding": [
{
@@ -651,20 +652,20 @@
"type": "tidelift"
}
],
- "time": "2022-10-12T20:59:15+00:00"
+ "time": "2024-05-22T20:47:39+00:00"
},
{
"name": "doctrine/inflector",
- "version": "2.0.8",
+ "version": "2.0.10",
"source": {
"type": "git",
"url": "https://github.com/doctrine/inflector.git",
- "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff"
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff",
- "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc",
"shasum": ""
},
"require": {
@@ -726,7 +727,7 @@
],
"support": {
"issues": "https://github.com/doctrine/inflector/issues",
- "source": "https://github.com/doctrine/inflector/tree/2.0.8"
+ "source": "https://github.com/doctrine/inflector/tree/2.0.10"
},
"funding": [
{
@@ -742,31 +743,31 @@
"type": "tidelift"
}
],
- "time": "2023-06-16T13:40:37+00:00"
+ "time": "2024-02-18T20:23:39+00:00"
},
{
"name": "doctrine/lexer",
- "version": "3.0.0",
+ "version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/lexer.git",
- "reference": "84a527db05647743d50373e0ec53a152f2cde568"
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568",
- "reference": "84a527db05647743d50373e0ec53a152f2cde568",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
"shasum": ""
},
"require": {
"php": "^8.1"
},
"require-dev": {
- "doctrine/coding-standard": "^10",
- "phpstan/phpstan": "^1.9",
- "phpunit/phpunit": "^9.5",
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5",
"psalm/plugin-phpunit": "^0.18.3",
- "vimeo/psalm": "^5.0"
+ "vimeo/psalm": "^5.21"
},
"type": "library",
"autoload": {
@@ -803,7 +804,7 @@
],
"support": {
"issues": "https://github.com/doctrine/lexer/issues",
- "source": "https://github.com/doctrine/lexer/tree/3.0.0"
+ "source": "https://github.com/doctrine/lexer/tree/3.0.1"
},
"funding": [
{
@@ -819,20 +820,20 @@
"type": "tidelift"
}
],
- "time": "2022-12-15T16:57:16+00:00"
+ "time": "2024-02-05T11:56:58+00:00"
},
{
"name": "dragonmantank/cron-expression",
- "version": "v3.3.3",
+ "version": "v3.4.0",
"source": {
"type": "git",
"url": "https://github.com/dragonmantank/cron-expression.git",
- "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a"
+ "reference": "8c784d071debd117328803d86b2097615b457500"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
- "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500",
+ "reference": "8c784d071debd117328803d86b2097615b457500",
"shasum": ""
},
"require": {
@@ -845,10 +846,14 @@
"require-dev": {
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^1.0",
- "phpstan/phpstan-webmozart-assert": "^1.0",
"phpunit/phpunit": "^7.0|^8.0|^9.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
"Cron\\": "src/Cron/"
@@ -872,7 +877,7 @@
],
"support": {
"issues": "https://github.com/dragonmantank/cron-expression/issues",
- "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3"
+ "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0"
},
"funding": [
{
@@ -880,20 +885,20 @@
"type": "github"
}
],
- "time": "2023-08-10T19:36:49+00:00"
+ "time": "2024-10-09T13:47:03+00:00"
},
{
"name": "egulias/email-validator",
- "version": "4.0.2",
+ "version": "4.0.3",
"source": {
"type": "git",
"url": "https://github.com/egulias/EmailValidator.git",
- "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e"
+ "reference": "b115554301161fa21467629f1e1391c1936de517"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e",
- "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517",
+ "reference": "b115554301161fa21467629f1e1391c1936de517",
"shasum": ""
},
"require": {
@@ -939,7 +944,7 @@
],
"support": {
"issues": "https://github.com/egulias/EmailValidator/issues",
- "source": "https://github.com/egulias/EmailValidator/tree/4.0.2"
+ "source": "https://github.com/egulias/EmailValidator/tree/4.0.3"
},
"funding": [
{
@@ -947,7 +952,7 @@
"type": "github"
}
],
- "time": "2023-10-06T06:47:41+00:00"
+ "time": "2024-12-27T00:36:43+00:00"
},
{
"name": "erusev/parsedown",
@@ -1001,20 +1006,20 @@
},
{
"name": "ezyang/htmlpurifier",
- "version": "v4.17.0",
+ "version": "v4.18.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
- "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c"
+ "reference": "cb56001e54359df7ae76dc522d08845dc741621b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/bbc513d79acf6691fa9cf10f192c90dd2957f18c",
- "reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b",
+ "reference": "cb56001e54359df7ae76dc522d08845dc741621b",
"shasum": ""
},
"require": {
- "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0"
+ "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
},
"require-dev": {
"cerdic/css-tidy": "^1.7 || ^2.0",
@@ -1056,9 +1061,72 @@
],
"support": {
"issues": "https://github.com/ezyang/htmlpurifier/issues",
- "source": "https://github.com/ezyang/htmlpurifier/tree/v4.17.0"
+ "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0"
},
- "time": "2023-11-17T15:01:25+00:00"
+ "time": "2024-11-01T03:51:45+00:00"
+ },
+ {
+ "name": "firebase/php-jwt",
+ "version": "v6.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/firebase/php-jwt.git",
+ "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/8f718f4dfc9c5d5f0c994cdfd103921b43592712",
+ "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "guzzlehttp/guzzle": "^7.4",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.5",
+ "psr/cache": "^2.0||^3.0",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0"
+ },
+ "suggest": {
+ "ext-sodium": "Support EdDSA (Ed25519) signatures",
+ "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Firebase\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Neuman Vong",
+ "email": "neuman+pear@twilio.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Anant Narayanan",
+ "email": "anant@php.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+ "homepage": "https://github.com/firebase/php-jwt",
+ "keywords": [
+ "jwt",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/firebase/php-jwt/issues",
+ "source": "https://github.com/firebase/php-jwt/tree/v6.11.0"
+ },
+ "time": "2025-01-23T05:11:06+00:00"
},
{
"name": "fruitcake/php-cors",
@@ -1133,24 +1201,24 @@
},
{
"name": "graham-campbell/result-type",
- "version": "v1.1.2",
+ "version": "v1.1.3",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Result-Type.git",
- "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862"
+ "reference": "3ba905c11371512af9d9bdd27d99b782216b6945"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862",
- "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862",
+ "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945",
+ "reference": "3ba905c11371512af9d9bdd27d99b782216b6945",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
- "phpoption/phpoption": "^1.9.2"
+ "phpoption/phpoption": "^1.9.3"
},
"require-dev": {
- "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28"
},
"type": "library",
"autoload": {
@@ -1179,7 +1247,7 @@
],
"support": {
"issues": "https://github.com/GrahamCampbell/Result-Type/issues",
- "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2"
+ "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3"
},
"funding": [
{
@@ -1191,26 +1259,26 @@
"type": "tidelift"
}
],
- "time": "2023-11-12T22:16:48+00:00"
+ "time": "2024-07-20T21:45:45+00:00"
},
{
"name": "guzzlehttp/guzzle",
- "version": "7.8.1",
+ "version": "7.9.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "41042bc7ab002487b876a0683fc8dce04ddce104"
+ "reference": "d281ed313b989f213357e3be1a179f02196ac99b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104",
- "reference": "41042bc7ab002487b876a0683fc8dce04ddce104",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b",
+ "reference": "d281ed313b989f213357e3be1a179f02196ac99b",
"shasum": ""
},
"require": {
"ext-json": "*",
- "guzzlehttp/promises": "^1.5.3 || ^2.0.1",
- "guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
+ "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
+ "guzzlehttp/psr7": "^2.7.0",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0"
@@ -1221,9 +1289,9 @@
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*",
- "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
+ "guzzle/client-integration-tests": "3.0.2",
"php-http/message-factory": "^1.1",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20",
"psr/log": "^1.1 || ^2.0 || ^3.0"
},
"suggest": {
@@ -1301,7 +1369,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
- "source": "https://github.com/guzzle/guzzle/tree/7.8.1"
+ "source": "https://github.com/guzzle/guzzle/tree/7.9.2"
},
"funding": [
{
@@ -1317,20 +1385,20 @@
"type": "tidelift"
}
],
- "time": "2023-12-03T20:35:24+00:00"
+ "time": "2024-07-24T11:22:20+00:00"
},
{
"name": "guzzlehttp/promises",
- "version": "2.0.2",
+ "version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223"
+ "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223",
- "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
+ "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
"shasum": ""
},
"require": {
@@ -1338,7 +1406,7 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
"type": "library",
"extra": {
@@ -1384,7 +1452,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
- "source": "https://github.com/guzzle/promises/tree/2.0.2"
+ "source": "https://github.com/guzzle/promises/tree/2.0.4"
},
"funding": [
{
@@ -1400,20 +1468,20 @@
"type": "tidelift"
}
],
- "time": "2023-12-03T20:19:20+00:00"
+ "time": "2024-10-17T10:06:22+00:00"
},
{
"name": "guzzlehttp/psr7",
- "version": "2.6.2",
+ "version": "2.7.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221"
+ "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221",
- "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
+ "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
"shasum": ""
},
"require": {
@@ -1428,8 +1496,8 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "http-interop/http-factory-tests": "^0.9",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
@@ -1500,7 +1568,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/2.6.2"
+ "source": "https://github.com/guzzle/psr7/tree/2.7.0"
},
"funding": [
{
@@ -1516,7 +1584,7 @@
"type": "tidelift"
}
],
- "time": "2023-12-03T20:05:35+00:00"
+ "time": "2024-07-18T11:15:46+00:00"
},
{
"name": "guzzlehttp/uri-template",
@@ -1634,16 +1702,16 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "2.4-dev"
- },
"laravel": {
- "providers": [
- "Intervention\\Image\\ImageServiceProvider"
- ],
"aliases": {
"Image": "Intervention\\Image\\Facades\\Image"
- }
+ },
+ "providers": [
+ "Intervention\\Image\\ImageServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "2.4-dev"
}
},
"autoload": {
@@ -1690,39 +1758,39 @@
},
{
"name": "josiasmontag/laravel-recaptchav3",
- "version": "1.0.2",
+ "version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/josiasmontag/laravel-recaptchav3.git",
- "reference": "3ded05660dd9827eef065a44510f5efecc2e68da"
+ "reference": "f17459ff8a38f4a25aa813940d84901084042b64"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/josiasmontag/laravel-recaptchav3/zipball/3ded05660dd9827eef065a44510f5efecc2e68da",
- "reference": "3ded05660dd9827eef065a44510f5efecc2e68da",
+ "url": "https://api.github.com/repos/josiasmontag/laravel-recaptchav3/zipball/f17459ff8a38f4a25aa813940d84901084042b64",
+ "reference": "f17459ff8a38f4a25aa813940d84901084042b64",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^6.2|^7.0",
- "illuminate/container": "~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0",
- "illuminate/http": "~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0",
- "illuminate/support": "~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0",
+ "illuminate/container": "~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
+ "illuminate/http": "~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
+ "illuminate/support": "~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
"php": ">=7.1.0"
},
"require-dev": {
"mockery/mockery": "^1.2",
- "orchestra/testbench": "~3.7.0|~3.8.0|^4.0|^5.0|^6.0|^7.0|^8.0",
- "phpunit/phpunit": "6.2|^7.0|^8.0|^9.5.10"
+ "orchestra/testbench": "~3.7.0|~3.8.0|^4.0|^5.0|^6.0|^7.0|^8.0|^9.0",
+ "phpunit/phpunit": "6.2|^7.0|^8.0|^9.5.10|^10.5"
},
"type": "library",
"extra": {
"laravel": {
- "providers": [
- "Lunaweb\\RecaptchaV3\\Providers\\RecaptchaV3ServiceProvider"
- ],
"aliases": {
"RecaptchaV3": "Lunaweb\\RecaptchaV3\\Facades\\RecaptchaV3"
- }
+ },
+ "providers": [
+ "Lunaweb\\RecaptchaV3\\Providers\\RecaptchaV3ServiceProvider"
+ ]
}
},
"autoload": {
@@ -1750,41 +1818,41 @@
],
"support": {
"issues": "https://github.com/josiasmontag/laravel-recaptchav3/issues",
- "source": "https://github.com/josiasmontag/laravel-recaptchav3/tree/1.0.2"
+ "source": "https://github.com/josiasmontag/laravel-recaptchav3/tree/1.0.3"
},
- "time": "2023-02-02T14:22:25+00:00"
+ "time": "2024-03-04T08:33:25+00:00"
},
{
"name": "laracasts/flash",
- "version": "3.2.2",
+ "version": "3.2.3",
"source": {
"type": "git",
"url": "https://github.com/laracasts/flash.git",
- "reference": "6330bc3c027d3c03188b41c58133016f8226b8fb"
+ "reference": "c2c4be1132f1bec3a689e84417a1c5787e6c71fd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laracasts/flash/zipball/6330bc3c027d3c03188b41c58133016f8226b8fb",
- "reference": "6330bc3c027d3c03188b41c58133016f8226b8fb",
+ "url": "https://api.github.com/repos/laracasts/flash/zipball/c2c4be1132f1bec3a689e84417a1c5787e6c71fd",
+ "reference": "c2c4be1132f1bec3a689e84417a1c5787e6c71fd",
"shasum": ""
},
"require": {
- "illuminate/support": "~5.0|^6.0|^7.0|^8.0|^9.0|^10.0",
+ "illuminate/support": "~5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
"php": ">=5.4.0"
},
"require-dev": {
"mockery/mockery": "dev-master",
- "phpunit/phpunit": "^6.1|^9.5.10"
+ "phpunit/phpunit": "^6.1|^9.5.10|^10.5"
},
"type": "library",
"extra": {
"laravel": {
- "providers": [
- "Laracasts\\Flash\\FlashServiceProvider"
- ],
"aliases": {
"Flash": "Laracasts\\Flash\\Flash"
- }
+ },
+ "providers": [
+ "Laracasts\\Flash\\FlashServiceProvider"
+ ]
}
},
"autoload": {
@@ -1807,9 +1875,9 @@
],
"description": "Easy flash notifications",
"support": {
- "source": "https://github.com/laracasts/flash/tree/3.2.2"
+ "source": "https://github.com/laracasts/flash/tree/3.2.3"
},
- "time": "2023-01-30T20:31:40+00:00"
+ "time": "2024-03-03T16:51:25+00:00"
},
{
"name": "laravel/fortify",
@@ -1878,20 +1946,20 @@
},
{
"name": "laravel/framework",
- "version": "v10.38.2",
+ "version": "v10.48.27",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "43da808391da3540d44a8dfeb4e46da4ad8f5723"
+ "reference": "eb0be33e4b806b92f396357b99ffcb2d3ef67957"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/43da808391da3540d44a8dfeb4e46da4ad8f5723",
- "reference": "43da808391da3540d44a8dfeb4e46da4ad8f5723",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/eb0be33e4b806b92f396357b99ffcb2d3ef67957",
+ "reference": "eb0be33e4b806b92f396357b99ffcb2d3ef67957",
"shasum": ""
},
"require": {
- "brick/math": "^0.9.3|^0.10.2|^0.11",
+ "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12",
"composer-runtime-api": "^2.2",
"doctrine/inflector": "^2.0.5",
"dragonmantank/cron-expression": "^3.3.2",
@@ -1935,6 +2003,8 @@
"conflict": {
"carbonphp/carbon-doctrine-types": ">=3.0",
"doctrine/dbal": ">=4.0",
+ "mockery/mockery": "1.6.8",
+ "phpunit/phpunit": ">=11.0.0",
"tightenco/collect": "<5.5.33"
},
"provide": {
@@ -1990,9 +2060,9 @@
"league/flysystem-sftp-v3": "^3.0",
"mockery/mockery": "^1.5.1",
"nyholm/psr7": "^1.2",
- "orchestra/testbench-core": "^8.15.1",
+ "orchestra/testbench-core": "^8.23.4",
"pda/pheanstalk": "^4.0",
- "phpstan/phpstan": "^1.4.7",
+ "phpstan/phpstan": "~1.11.11",
"phpunit/phpunit": "^10.0.7",
"predis/predis": "^2.0.2",
"symfony/cache": "^6.2",
@@ -2079,20 +2149,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2023-12-22T14:39:10+00:00"
+ "time": "2025-01-24T16:17:36+00:00"
},
{
"name": "laravel/helpers",
- "version": "v1.7.0",
+ "version": "v1.7.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/helpers.git",
- "reference": "6caaa242a23bc39b4e3cf57304b5409260a7a346"
+ "reference": "f28907033d7edf8a0525cfb781ab30ce6d531c35"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/helpers/zipball/6caaa242a23bc39b4e3cf57304b5409260a7a346",
- "reference": "6caaa242a23bc39b4e3cf57304b5409260a7a346",
+ "url": "https://api.github.com/repos/laravel/helpers/zipball/f28907033d7edf8a0525cfb781ab30ce6d531c35",
+ "reference": "f28907033d7edf8a0525cfb781ab30ce6d531c35",
"shasum": ""
},
"require": {
@@ -2134,22 +2204,22 @@
"laravel"
],
"support": {
- "source": "https://github.com/laravel/helpers/tree/v1.7.0"
+ "source": "https://github.com/laravel/helpers/tree/v1.7.1"
},
- "time": "2023-11-30T14:09:05+00:00"
+ "time": "2024-11-26T14:56:25+00:00"
},
{
"name": "laravel/prompts",
- "version": "v0.1.13",
+ "version": "v0.1.25",
"source": {
"type": "git",
"url": "https://github.com/laravel/prompts.git",
- "reference": "e1379d8ead15edd6cc4369c22274345982edc95a"
+ "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/prompts/zipball/e1379d8ead15edd6cc4369c22274345982edc95a",
- "reference": "e1379d8ead15edd6cc4369c22274345982edc95a",
+ "url": "https://api.github.com/repos/laravel/prompts/zipball/7b4029a84c37cb2725fc7f011586e2997040bc95",
+ "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95",
"shasum": ""
},
"require": {
@@ -2165,7 +2235,7 @@
"require-dev": {
"mockery/mockery": "^1.5",
"pestphp/pest": "^2.3",
- "phpstan/phpstan": "^1.10",
+ "phpstan/phpstan": "^1.11",
"phpstan/phpstan-mockery": "^1.1"
},
"suggest": {
@@ -2189,34 +2259,36 @@
"license": [
"MIT"
],
+ "description": "Add beautiful and user-friendly forms to your command-line applications.",
"support": {
"issues": "https://github.com/laravel/prompts/issues",
- "source": "https://github.com/laravel/prompts/tree/v0.1.13"
+ "source": "https://github.com/laravel/prompts/tree/v0.1.25"
},
- "time": "2023-10-27T13:53:59+00:00"
+ "time": "2024-08-12T22:06:33+00:00"
},
{
"name": "laravel/serializable-closure",
- "version": "v1.3.3",
+ "version": "v1.3.7",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
- "reference": "3dbf8a8e914634c48d389c1234552666b3d43754"
+ "reference": "4f48ade902b94323ca3be7646db16209ec76be3d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754",
- "reference": "3dbf8a8e914634c48d389c1234552666b3d43754",
+ "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/4f48ade902b94323ca3be7646db16209ec76be3d",
+ "reference": "4f48ade902b94323ca3be7646db16209ec76be3d",
"shasum": ""
},
"require": {
"php": "^7.3|^8.0"
},
"require-dev": {
- "nesbot/carbon": "^2.61",
+ "illuminate/support": "^8.0|^9.0|^10.0|^11.0",
+ "nesbot/carbon": "^2.61|^3.0",
"pestphp/pest": "^1.21.3",
"phpstan/phpstan": "^1.8.2",
- "symfony/var-dumper": "^5.4.11"
+ "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0"
},
"type": "library",
"extra": {
@@ -2253,30 +2325,32 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
- "time": "2023-11-08T14:08:06+00:00"
+ "time": "2024-11-14T18:34:49+00:00"
},
{
"name": "laravel/socialite",
- "version": "v5.11.0",
+ "version": "v5.17.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/socialite.git",
- "reference": "4f6a8af6f3f7c18da03d19842dd0514315501c10"
+ "reference": "77be8be7ee5099aed8ca7cfddc1bf6f9ab3fc159"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/socialite/zipball/4f6a8af6f3f7c18da03d19842dd0514315501c10",
- "reference": "4f6a8af6f3f7c18da03d19842dd0514315501c10",
+ "url": "https://api.github.com/repos/laravel/socialite/zipball/77be8be7ee5099aed8ca7cfddc1bf6f9ab3fc159",
+ "reference": "77be8be7ee5099aed8ca7cfddc1bf6f9ab3fc159",
"shasum": ""
},
"require": {
"ext-json": "*",
+ "firebase/php-jwt": "^6.4",
"guzzlehttp/guzzle": "^6.0|^7.0",
"illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
"illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
"illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
- "league/oauth1-client": "^1.10.1",
- "php": "^7.2|^8.0"
+ "league/oauth1-client": "^1.11",
+ "php": "^7.2|^8.0",
+ "phpseclib/phpseclib": "^3.0"
},
"require-dev": {
"mockery/mockery": "^1.0",
@@ -2286,16 +2360,16 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "5.x-dev"
- },
"laravel": {
- "providers": [
- "Laravel\\Socialite\\SocialiteServiceProvider"
- ],
"aliases": {
"Socialite": "Laravel\\Socialite\\Facades\\Socialite"
- }
+ },
+ "providers": [
+ "Laravel\\Socialite\\SocialiteServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "5.x-dev"
}
},
"autoload": {
@@ -2323,29 +2397,29 @@
"issues": "https://github.com/laravel/socialite/issues",
"source": "https://github.com/laravel/socialite"
},
- "time": "2023-12-02T18:22:36+00:00"
+ "time": "2025-01-17T15:17:00+00:00"
},
{
"name": "laravel/tinker",
- "version": "v2.8.2",
+ "version": "v2.10.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/tinker.git",
- "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3"
+ "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/tinker/zipball/b936d415b252b499e8c3b1f795cd4fc20f57e1f3",
- "reference": "b936d415b252b499e8c3b1f795cd4fc20f57e1f3",
+ "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5",
+ "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5",
"shasum": ""
},
"require": {
- "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0",
- "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0",
- "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0",
+ "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
+ "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
+ "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
"php": "^7.2.5|^8.0",
- "psy/psysh": "^0.10.4|^0.11.1",
- "symfony/var-dumper": "^4.3.4|^5.0|^6.0"
+ "psy/psysh": "^0.11.1|^0.12.0",
+ "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0"
},
"require-dev": {
"mockery/mockery": "~1.3.3|^1.4.2",
@@ -2353,13 +2427,10 @@
"phpunit/phpunit": "^8.5.8|^9.3.3"
},
"suggest": {
- "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0)."
+ "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)."
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "2.x-dev"
- },
"laravel": {
"providers": [
"Laravel\\Tinker\\TinkerServiceProvider"
@@ -2390,9 +2461,9 @@
],
"support": {
"issues": "https://github.com/laravel/tinker/issues",
- "source": "https://github.com/laravel/tinker/tree/v2.8.2"
+ "source": "https://github.com/laravel/tinker/tree/v2.10.0"
},
- "time": "2023-08-15T14:27:00+00:00"
+ "time": "2024-09-23T13:32:56+00:00"
},
{
"name": "laravelcollective/html",
@@ -2469,16 +2540,16 @@
},
{
"name": "league/commonmark",
- "version": "2.4.1",
+ "version": "2.6.1",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/commonmark.git",
- "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5"
+ "reference": "d990688c91cedfb69753ffc2512727ec646df2ad"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/3669d6d5f7a47a93c08ddff335e6d945481a1dd5",
- "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad",
+ "reference": "d990688c91cedfb69753ffc2512727ec646df2ad",
"shasum": ""
},
"require": {
@@ -2491,8 +2562,8 @@
},
"require-dev": {
"cebe/markdown": "^1.0",
- "commonmark/cmark": "0.30.0",
- "commonmark/commonmark.js": "0.30.0",
+ "commonmark/cmark": "0.31.1",
+ "commonmark/commonmark.js": "0.31.1",
"composer/package-versions-deprecated": "^1.8",
"embed/embed": "^4.4",
"erusev/parsedown": "^1.0",
@@ -2501,10 +2572,11 @@
"michelf/php-markdown": "^1.4 || ^2.0",
"nyholm/psr7": "^1.5",
"phpstan/phpstan": "^1.8.2",
- "phpunit/phpunit": "^9.5.21",
+ "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
"scrutinizer/ocular": "^1.8.1",
- "symfony/finder": "^5.3 | ^6.0",
- "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0",
+ "symfony/finder": "^5.3 | ^6.0 | ^7.0",
+ "symfony/process": "^5.4 | ^6.0 | ^7.0",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0",
"unleashedtech/php-coding-standard": "^3.1.1",
"vimeo/psalm": "^4.24.0 || ^5.0.0"
},
@@ -2514,7 +2586,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.5-dev"
+ "dev-main": "2.7-dev"
}
},
"autoload": {
@@ -2571,7 +2643,7 @@
"type": "tidelift"
}
],
- "time": "2023-08-30T16:55:00+00:00"
+ "time": "2024-12-29T14:10:59+00:00"
},
{
"name": "league/config",
@@ -2657,16 +2729,16 @@
},
{
"name": "league/flysystem",
- "version": "3.23.0",
+ "version": "3.29.1",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
- "reference": "d4ad81e2b67396e33dc9d7e54ec74ccf73151dcc"
+ "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/d4ad81e2b67396e33dc9d7e54ec74ccf73151dcc",
- "reference": "d4ad81e2b67396e33dc9d7e54ec74ccf73151dcc",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319",
+ "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319",
"shasum": ""
},
"require": {
@@ -2686,18 +2758,21 @@
"require-dev": {
"async-aws/s3": "^1.5 || ^2.0",
"async-aws/simple-s3": "^1.1 || ^2.0",
- "aws/aws-sdk-php": "^3.220.0",
+ "aws/aws-sdk-php": "^3.295.10",
"composer/semver": "^3.0",
"ext-fileinfo": "*",
"ext-ftp": "*",
+ "ext-mongodb": "^1.3",
"ext-zip": "*",
"friendsofphp/php-cs-fixer": "^3.5",
"google/cloud-storage": "^1.23",
+ "guzzlehttp/psr7": "^2.6",
"microsoft/azure-storage-blob": "^1.1",
- "phpseclib/phpseclib": "^3.0.34",
+ "mongodb/mongodb": "^1.2",
+ "phpseclib/phpseclib": "^3.0.36",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^9.5.11|^10.0",
- "sabre/dav": "^4.3.1"
+ "sabre/dav": "^4.6.0"
},
"type": "library",
"autoload": {
@@ -2731,32 +2806,22 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
- "source": "https://github.com/thephpleague/flysystem/tree/3.23.0"
+ "source": "https://github.com/thephpleague/flysystem/tree/3.29.1"
},
- "funding": [
- {
- "url": "https://ecologi.com/frankdejonge",
- "type": "custom"
- },
- {
- "url": "https://github.com/frankdejonge",
- "type": "github"
- }
- ],
- "time": "2023-12-04T10:16:17+00:00"
+ "time": "2024-10-08T08:58:34+00:00"
},
{
"name": "league/flysystem-local",
- "version": "3.23.0",
+ "version": "3.29.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-local.git",
- "reference": "5cf046ba5f059460e86a997c504dd781a39a109b"
+ "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/5cf046ba5f059460e86a997c504dd781a39a109b",
- "reference": "5cf046ba5f059460e86a997c504dd781a39a109b",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27",
+ "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27",
"shasum": ""
},
"require": {
@@ -2790,33 +2855,22 @@
"local"
],
"support": {
- "issues": "https://github.com/thephpleague/flysystem-local/issues",
- "source": "https://github.com/thephpleague/flysystem-local/tree/3.23.0"
+ "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0"
},
- "funding": [
- {
- "url": "https://ecologi.com/frankdejonge",
- "type": "custom"
- },
- {
- "url": "https://github.com/frankdejonge",
- "type": "github"
- }
- ],
- "time": "2023-12-04T10:14:46+00:00"
+ "time": "2024-08-09T21:24:39+00:00"
},
{
"name": "league/mime-type-detection",
- "version": "1.14.0",
+ "version": "1.16.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/mime-type-detection.git",
- "reference": "b6a5854368533df0295c5761a0253656a2e52d9e"
+ "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b6a5854368533df0295c5761a0253656a2e52d9e",
- "reference": "b6a5854368533df0295c5761a0253656a2e52d9e",
+ "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9",
+ "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9",
"shasum": ""
},
"require": {
@@ -2847,7 +2901,7 @@
"description": "Mime-type detection for Flysystem",
"support": {
"issues": "https://github.com/thephpleague/mime-type-detection/issues",
- "source": "https://github.com/thephpleague/mime-type-detection/tree/1.14.0"
+ "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0"
},
"funding": [
{
@@ -2859,20 +2913,20 @@
"type": "tidelift"
}
],
- "time": "2023-10-17T14:13:20+00:00"
+ "time": "2024-09-21T08:32:55+00:00"
},
{
"name": "league/oauth1-client",
- "version": "v1.10.1",
+ "version": "v1.11.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/oauth1-client.git",
- "reference": "d6365b901b5c287dd41f143033315e2f777e1167"
+ "reference": "f9c94b088837eb1aae1ad7c4f23eb65cc6993055"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/d6365b901b5c287dd41f143033315e2f777e1167",
- "reference": "d6365b901b5c287dd41f143033315e2f777e1167",
+ "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/f9c94b088837eb1aae1ad7c4f23eb65cc6993055",
+ "reference": "f9c94b088837eb1aae1ad7c4f23eb65cc6993055",
"shasum": ""
},
"require": {
@@ -2933,22 +2987,22 @@
],
"support": {
"issues": "https://github.com/thephpleague/oauth1-client/issues",
- "source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.1"
+ "source": "https://github.com/thephpleague/oauth1-client/tree/v1.11.0"
},
- "time": "2022-04-15T14:02:14+00:00"
+ "time": "2024-12-10T19:59:05+00:00"
},
{
"name": "monolog/monolog",
- "version": "3.5.0",
+ "version": "3.8.1",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448"
+ "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448",
- "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4",
+ "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4",
"shasum": ""
},
"require": {
@@ -2968,12 +3022,14 @@
"guzzlehttp/psr7": "^2.2",
"mongodb/mongodb": "^1.8",
"php-amqplib/php-amqplib": "~2.4 || ^3",
- "phpstan/phpstan": "^1.9",
- "phpstan/phpstan-deprecation-rules": "^1.0",
- "phpstan/phpstan-strict-rules": "^1.4",
- "phpunit/phpunit": "^10.1",
+ "php-console/php-console": "^3.1.8",
+ "phpstan/phpstan": "^2",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "^10.5.17 || ^11.0.7",
"predis/predis": "^1.1 || ^2",
- "ruflin/elastica": "^7",
+ "rollbar/rollbar": "^4.0",
+ "ruflin/elastica": "^7 || ^8",
"symfony/mailer": "^5.4 || ^6",
"symfony/mime": "^5.4 || ^6"
},
@@ -3024,7 +3080,7 @@
],
"support": {
"issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/3.5.0"
+ "source": "https://github.com/Seldaek/monolog/tree/3.8.1"
},
"funding": [
{
@@ -3036,20 +3092,20 @@
"type": "tidelift"
}
],
- "time": "2023-10-27T15:32:31+00:00"
+ "time": "2024-12-05T17:15:07+00:00"
},
{
"name": "nesbot/carbon",
- "version": "2.72.1",
+ "version": "2.72.6",
"source": {
"type": "git",
- "url": "https://github.com/briannesbitt/Carbon.git",
- "reference": "2b3b3db0a2d0556a177392ff1a3bf5608fa09f78"
+ "url": "https://github.com/CarbonPHP/carbon.git",
+ "reference": "1e9d50601e7035a4c61441a208cb5bed73e108c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/2b3b3db0a2d0556a177392ff1a3bf5608fa09f78",
- "reference": "2b3b3db0a2d0556a177392ff1a3bf5608fa09f78",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/1e9d50601e7035a4c61441a208cb5bed73e108c5",
+ "reference": "1e9d50601e7035a4c61441a208cb5bed73e108c5",
"shasum": ""
},
"require": {
@@ -3069,7 +3125,7 @@
"doctrine/orm": "^2.7 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.0",
"kylekatarnls/multi-tester": "^2.0",
- "ondrejmirtes/better-reflection": "*",
+ "ondrejmirtes/better-reflection": "<6",
"phpmd/phpmd": "^2.9",
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^0.12.99 || ^1.7.14",
@@ -3082,10 +3138,6 @@
],
"type": "library",
"extra": {
- "branch-alias": {
- "dev-3.x": "3.x-dev",
- "dev-master": "2.x-dev"
- },
"laravel": {
"providers": [
"Carbon\\Laravel\\ServiceProvider"
@@ -3095,6 +3147,10 @@
"includes": [
"extension.neon"
]
+ },
+ "branch-alias": {
+ "dev-2.x": "2.x-dev",
+ "dev-master": "3.x-dev"
}
},
"autoload": {
@@ -3143,35 +3199,35 @@
"type": "tidelift"
}
],
- "time": "2023-12-08T23:47:49+00:00"
+ "time": "2024-12-27T09:28:11+00:00"
},
{
"name": "nette/schema",
- "version": "v1.2.5",
+ "version": "v1.3.2",
"source": {
"type": "git",
"url": "https://github.com/nette/schema.git",
- "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a"
+ "reference": "da801d52f0354f70a638673c4a0f04e16529431d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a",
- "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a",
+ "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d",
+ "reference": "da801d52f0354f70a638673c4a0f04e16529431d",
"shasum": ""
},
"require": {
- "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0",
- "php": "7.1 - 8.3"
+ "nette/utils": "^4.0",
+ "php": "8.1 - 8.4"
},
"require-dev": {
- "nette/tester": "^2.3 || ^2.4",
+ "nette/tester": "^2.5.2",
"phpstan/phpstan-nette": "^1.0",
- "tracy/tracy": "^2.7"
+ "tracy/tracy": "^2.8"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2-dev"
+ "dev-master": "1.3-dev"
}
},
"autoload": {
@@ -3203,26 +3259,26 @@
],
"support": {
"issues": "https://github.com/nette/schema/issues",
- "source": "https://github.com/nette/schema/tree/v1.2.5"
+ "source": "https://github.com/nette/schema/tree/v1.3.2"
},
- "time": "2023-10-05T20:37:59+00:00"
+ "time": "2024-10-06T23:10:23+00:00"
},
{
"name": "nette/utils",
- "version": "v4.0.3",
+ "version": "v4.0.5",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
- "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015"
+ "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/utils/zipball/a9d127dd6a203ce6d255b2e2db49759f7506e015",
- "reference": "a9d127dd6a203ce6d255b2e2db49759f7506e015",
+ "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96",
+ "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96",
"shasum": ""
},
"require": {
- "php": ">=8.0 <8.4"
+ "php": "8.0 - 8.4"
},
"conflict": {
"nette/finder": "<3",
@@ -3289,31 +3345,33 @@
],
"support": {
"issues": "https://github.com/nette/utils/issues",
- "source": "https://github.com/nette/utils/tree/v4.0.3"
+ "source": "https://github.com/nette/utils/tree/v4.0.5"
},
- "time": "2023-10-29T21:02:13+00:00"
+ "time": "2024-08-07T15:39:19+00:00"
},
{
"name": "nikic/php-parser",
- "version": "v4.18.0",
+ "version": "v5.4.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999"
+ "reference": "447a020a1f875a434d62f2a401f53b82a396e494"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999",
- "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494",
+ "reference": "447a020a1f875a434d62f2a401f53b82a396e494",
"shasum": ""
},
"require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
"ext-tokenizer": "*",
- "php": ">=7.0"
+ "php": ">=7.4"
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
- "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ "phpunit/phpunit": "^9.0"
},
"bin": [
"bin/php-parse"
@@ -3321,7 +3379,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.9-dev"
+ "dev-master": "5.0-dev"
}
},
"autoload": {
@@ -3345,39 +3403,38 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0"
},
- "time": "2023-12-10T21:03:43+00:00"
+ "time": "2024-12-30T11:07:19+00:00"
},
{
"name": "nunomaduro/termwind",
- "version": "v1.15.1",
+ "version": "v1.17.0",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/termwind.git",
- "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc"
+ "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc",
- "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc",
+ "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/5369ef84d8142c1d87e4ec278711d4ece3cbf301",
+ "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
- "php": "^8.0",
- "symfony/console": "^5.3.0|^6.0.0"
+ "php": "^8.1",
+ "symfony/console": "^6.4.15"
},
"require-dev": {
- "ergebnis/phpstan-rules": "^1.0.",
- "illuminate/console": "^8.0|^9.0",
- "illuminate/support": "^8.0|^9.0",
- "laravel/pint": "^1.0.0",
- "pestphp/pest": "^1.21.0",
- "pestphp/pest-plugin-mock": "^1.0",
- "phpstan/phpstan": "^1.4.6",
- "phpstan/phpstan-strict-rules": "^1.1.0",
- "symfony/var-dumper": "^5.2.7|^6.0.0",
+ "illuminate/console": "^10.48.24",
+ "illuminate/support": "^10.48.24",
+ "laravel/pint": "^1.18.2",
+ "pestphp/pest": "^2.36.0",
+ "pestphp/pest-plugin-mock": "2.0.0",
+ "phpstan/phpstan": "^1.12.11",
+ "phpstan/phpstan-strict-rules": "^1.6.1",
+ "symfony/var-dumper": "^6.4.15",
"thecodingmachine/phpstan-strict-rules": "^1.0.0"
},
"type": "library",
@@ -3417,7 +3474,7 @@
],
"support": {
"issues": "https://github.com/nunomaduro/termwind/issues",
- "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1"
+ "source": "https://github.com/nunomaduro/termwind/tree/v1.17.0"
},
"funding": [
{
@@ -3433,28 +3490,28 @@
"type": "github"
}
],
- "time": "2023-02-08T01:06:31+00:00"
+ "time": "2024-11-21T10:36:35+00:00"
},
{
"name": "paragonie/constant_time_encoding",
- "version": "v2.6.3",
+ "version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/paragonie/constant_time_encoding.git",
- "reference": "58c3f47f650c94ec05a151692652a868995d2938"
+ "reference": "df1e7fde177501eee2037dd159cf04f5f301a512"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938",
- "reference": "58c3f47f650c94ec05a151692652a868995d2938",
+ "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512",
+ "reference": "df1e7fde177501eee2037dd159cf04f5f301a512",
"shasum": ""
},
"require": {
- "php": "^7|^8"
+ "php": "^8"
},
"require-dev": {
- "phpunit/phpunit": "^6|^7|^8|^9",
- "vimeo/psalm": "^1|^2|^3|^4"
+ "phpunit/phpunit": "^9",
+ "vimeo/psalm": "^4|^5"
},
"type": "library",
"autoload": {
@@ -3500,20 +3557,70 @@
"issues": "https://github.com/paragonie/constant_time_encoding/issues",
"source": "https://github.com/paragonie/constant_time_encoding"
},
- "time": "2022-06-14T06:56:20+00:00"
+ "time": "2024-05-08T12:36:18+00:00"
+ },
+ {
+ "name": "paragonie/random_compat",
+ "version": "v9.99.100",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/random_compat.git",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">= 7"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*|5.*",
+ "vimeo/psalm": "^1"
+ },
+ "suggest": {
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com"
+ }
+ ],
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+ "keywords": [
+ "csprng",
+ "polyfill",
+ "pseudorandom",
+ "random"
+ ],
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/random_compat/issues",
+ "source": "https://github.com/paragonie/random_compat"
+ },
+ "time": "2020-10-15T08:29:30+00:00"
},
{
"name": "phpoption/phpoption",
- "version": "1.9.2",
+ "version": "1.9.3",
"source": {
"type": "git",
"url": "https://github.com/schmittjoh/php-option.git",
- "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820"
+ "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820",
- "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820",
+ "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54",
+ "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54",
"shasum": ""
},
"require": {
@@ -3521,13 +3628,13 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28"
},
"type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
- "forward-command": true
+ "forward-command": false
},
"branch-alias": {
"dev-master": "1.9-dev"
@@ -3563,7 +3670,7 @@
],
"support": {
"issues": "https://github.com/schmittjoh/php-option/issues",
- "source": "https://github.com/schmittjoh/php-option/tree/1.9.2"
+ "source": "https://github.com/schmittjoh/php-option/tree/1.9.3"
},
"funding": [
{
@@ -3575,28 +3682,138 @@
"type": "tidelift"
}
],
- "time": "2023-11-12T21:59:55+00:00"
+ "time": "2024-07-20T21:41:07+00:00"
+ },
+ {
+ "name": "phpseclib/phpseclib",
+ "version": "3.0.43",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpseclib/phpseclib.git",
+ "reference": "709ec107af3cb2f385b9617be72af8cf62441d02"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/709ec107af3cb2f385b9617be72af8cf62441d02",
+ "reference": "709ec107af3cb2f385b9617be72af8cf62441d02",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/constant_time_encoding": "^1|^2|^3",
+ "paragonie/random_compat": "^1.4|^2.0|^9.99.99",
+ "php": ">=5.6.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*"
+ },
+ "suggest": {
+ "ext-dom": "Install the DOM extension to load XML formatted public keys.",
+ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+ "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
+ "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
+ "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "phpseclib/bootstrap.php"
+ ],
+ "psr-4": {
+ "phpseclib3\\": "phpseclib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jim Wigginton",
+ "email": "terrafrost@php.net",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Patrick Monnerat",
+ "email": "pm@datasphere.ch",
+ "role": "Developer"
+ },
+ {
+ "name": "Andreas Fischer",
+ "email": "bantu@phpbb.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Hans-Jürgen Petrich",
+ "email": "petrich@tronic-media.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+ "homepage": "http://phpseclib.sourceforge.net",
+ "keywords": [
+ "BigInteger",
+ "aes",
+ "asn.1",
+ "asn1",
+ "blowfish",
+ "crypto",
+ "cryptography",
+ "encryption",
+ "rsa",
+ "security",
+ "sftp",
+ "signature",
+ "signing",
+ "ssh",
+ "twofish",
+ "x.509",
+ "x509"
+ ],
+ "support": {
+ "issues": "https://github.com/phpseclib/phpseclib/issues",
+ "source": "https://github.com/phpseclib/phpseclib/tree/3.0.43"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/terrafrost",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/phpseclib",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-14T21:12:59+00:00"
},
{
"name": "pragmarx/google2fa",
- "version": "v8.0.1",
+ "version": "v8.0.3",
"source": {
"type": "git",
"url": "https://github.com/antonioribeiro/google2fa.git",
- "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3"
+ "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/80c3d801b31fe165f8fe99ea085e0a37834e1be3",
- "reference": "80c3d801b31fe165f8fe99ea085e0a37834e1be3",
+ "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad",
+ "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad",
"shasum": ""
},
"require": {
- "paragonie/constant_time_encoding": "^1.0|^2.0",
+ "paragonie/constant_time_encoding": "^1.0|^2.0|^3.0",
"php": "^7.1|^8.0"
},
"require-dev": {
- "phpstan/phpstan": "^0.12.18",
+ "phpstan/phpstan": "^1.9",
"phpunit/phpunit": "^7.5.15|^8.5|^9.0"
},
"type": "library",
@@ -3625,9 +3842,9 @@
],
"support": {
"issues": "https://github.com/antonioribeiro/google2fa/issues",
- "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.1"
+ "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.3"
},
- "time": "2022-06-13T21:57:56+00:00"
+ "time": "2024-09-05T11:56:40+00:00"
},
{
"name": "psr/cache",
@@ -3883,20 +4100,20 @@
},
{
"name": "psr/http-factory",
- "version": "1.0.2",
+ "version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-factory.git",
- "reference": "e616d01114759c4c489f93b099585439f795fe35"
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
- "reference": "e616d01114759c4c489f93b099585439f795fe35",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"shasum": ""
},
"require": {
- "php": ">=7.0.0",
+ "php": ">=7.1",
"psr/http-message": "^1.0 || ^2.0"
},
"type": "library",
@@ -3920,7 +4137,7 @@
"homepage": "https://www.php-fig.org/"
}
],
- "description": "Common interfaces for PSR-7 HTTP message factories",
+ "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
"keywords": [
"factory",
"http",
@@ -3932,9 +4149,9 @@
"response"
],
"support": {
- "source": "https://github.com/php-fig/http-factory/tree/1.0.2"
+ "source": "https://github.com/php-fig/http-factory"
},
- "time": "2023-04-10T20:10:41+00:00"
+ "time": "2024-04-15T12:06:14+00:00"
},
{
"name": "psr/http-message",
@@ -3991,16 +4208,16 @@
},
{
"name": "psr/log",
- "version": "3.0.0",
+ "version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
- "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
"shasum": ""
},
"require": {
@@ -4035,9 +4252,9 @@
"psr-3"
],
"support": {
- "source": "https://github.com/php-fig/log/tree/3.0.0"
+ "source": "https://github.com/php-fig/log/tree/3.0.2"
},
- "time": "2021-07-14T16:46:02+00:00"
+ "time": "2024-09-11T13:17:53+00:00"
},
{
"name": "psr/simple-cache",
@@ -4092,25 +4309,25 @@
},
{
"name": "psy/psysh",
- "version": "v0.11.22",
+ "version": "v0.12.7",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
- "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b"
+ "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/128fa1b608be651999ed9789c95e6e2a31b5802b",
- "reference": "128fa1b608be651999ed9789c95e6e2a31b5802b",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c",
+ "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c",
"shasum": ""
},
"require": {
"ext-json": "*",
"ext-tokenizer": "*",
- "nikic/php-parser": "^4.0 || ^3.1",
- "php": "^8.0 || ^7.0.8",
- "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4",
- "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4"
+ "nikic/php-parser": "^5.0 || ^4.0",
+ "php": "^8.0 || ^7.4",
+ "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4",
+ "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4"
},
"conflict": {
"symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4"
@@ -4121,20 +4338,19 @@
"suggest": {
"ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
"ext-pdo-sqlite": "The doc command requires SQLite to work.",
- "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
- "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history."
+ "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well."
},
"bin": [
"bin/psysh"
],
"type": "library",
"extra": {
- "branch-alias": {
- "dev-0.11": "0.11.x-dev"
- },
"bamarni-bin": {
"bin-links": false,
"forward-command": false
+ },
+ "branch-alias": {
+ "dev-main": "0.12.x-dev"
}
},
"autoload": {
@@ -4166,9 +4382,9 @@
],
"support": {
"issues": "https://github.com/bobthecow/psysh/issues",
- "source": "https://github.com/bobthecow/psysh/tree/v0.11.22"
+ "source": "https://github.com/bobthecow/psysh/tree/v0.12.7"
},
- "time": "2023-10-14T21:56:36+00:00"
+ "time": "2024-12-10T01:58:33+00:00"
},
{
"name": "ralouphie/getallheaders",
@@ -4305,20 +4521,20 @@
},
{
"name": "ramsey/uuid",
- "version": "4.7.5",
+ "version": "4.7.6",
"source": {
"type": "git",
"url": "https://github.com/ramsey/uuid.git",
- "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e"
+ "reference": "91039bc1faa45ba123c4328958e620d382ec7088"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e",
- "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088",
+ "reference": "91039bc1faa45ba123c4328958e620d382ec7088",
"shasum": ""
},
"require": {
- "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11",
+ "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12",
"ext-json": "*",
"php": "^8.0",
"ramsey/collection": "^1.2 || ^2.0"
@@ -4381,7 +4597,7 @@
],
"support": {
"issues": "https://github.com/ramsey/uuid/issues",
- "source": "https://github.com/ramsey/uuid/tree/4.7.5"
+ "source": "https://github.com/ramsey/uuid/tree/4.7.6"
},
"funding": [
{
@@ -4393,7 +4609,7 @@
"type": "tidelift"
}
],
- "time": "2023-11-08T05:53:05+00:00"
+ "time": "2024-04-27T21:32:50+00:00"
},
{
"name": "socialiteproviders/deviantart",
@@ -4579,26 +4795,26 @@
},
{
"name": "socialiteproviders/manager",
- "version": "v4.4.0",
+ "version": "v4.8.0",
"source": {
"type": "git",
"url": "https://github.com/SocialiteProviders/Manager.git",
- "reference": "df5e45b53d918ec3d689f014d98a6c838b98ed96"
+ "reference": "e93acc38f8464cc775a2b8bf09df311d1fdfefcb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/df5e45b53d918ec3d689f014d98a6c838b98ed96",
- "reference": "df5e45b53d918ec3d689f014d98a6c838b98ed96",
+ "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/e93acc38f8464cc775a2b8bf09df311d1fdfefcb",
+ "reference": "e93acc38f8464cc775a2b8bf09df311d1fdfefcb",
"shasum": ""
},
"require": {
- "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0",
- "laravel/socialite": "~5.0",
- "php": "^8.0"
+ "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0",
+ "laravel/socialite": "^5.5",
+ "php": "^8.1"
},
"require-dev": {
"mockery/mockery": "^1.2",
- "phpunit/phpunit": "^6.0 || ^9.0"
+ "phpunit/phpunit": "^9.0"
},
"type": "library",
"extra": {
@@ -4649,7 +4865,7 @@
"issues": "https://github.com/socialiteproviders/manager/issues",
"source": "https://github.com/socialiteproviders/manager"
},
- "time": "2023-08-27T23:46:34+00:00"
+ "time": "2025-01-03T09:40:37+00:00"
},
{
"name": "socialiteproviders/tumblr",
@@ -4694,22 +4910,22 @@
},
{
"name": "socialiteproviders/twitch",
- "version": "5.3.1",
+ "version": "5.4.0",
"source": {
"type": "git",
"url": "https://github.com/SocialiteProviders/Twitch.git",
- "reference": "7accf30ae7a3139b757b4ca8f34989c09a3dbee7"
+ "reference": "c8791b9d208195b5f02bea432de89d0e612b955d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/SocialiteProviders/Twitch/zipball/7accf30ae7a3139b757b4ca8f34989c09a3dbee7",
- "reference": "7accf30ae7a3139b757b4ca8f34989c09a3dbee7",
+ "url": "https://api.github.com/repos/SocialiteProviders/Twitch/zipball/c8791b9d208195b5f02bea432de89d0e612b955d",
+ "reference": "c8791b9d208195b5f02bea432de89d0e612b955d",
"shasum": ""
},
"require": {
"ext-json": "*",
- "php": "^7.2 || ^8.0",
- "socialiteproviders/manager": "~4.0"
+ "php": "^8.0",
+ "socialiteproviders/manager": "^4.4"
},
"type": "library",
"autoload": {
@@ -4728,34 +4944,43 @@
}
],
"description": "Twitch OAuth2 Provider for Laravel Socialite",
+ "keywords": [
+ "laravel",
+ "oauth",
+ "provider",
+ "socialite",
+ "twitch"
+ ],
"support": {
- "source": "https://github.com/SocialiteProviders/Twitch/tree/5.3.1"
+ "docs": "https://socialiteproviders.com/twitch",
+ "issues": "https://github.com/socialiteproviders/providers/issues",
+ "source": "https://github.com/socialiteproviders/providers"
},
- "time": "2020-12-01T23:10:59+00:00"
+ "time": "2024-04-01T01:15:35+00:00"
},
{
"name": "spatie/laravel-feed",
- "version": "4.3.0",
+ "version": "4.4.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-feed.git",
- "reference": "1cf06a43b4ee0fdeb919983a76de68467ccdb844"
+ "reference": "8cd283bbb998beb3ae220e71bae162e52dfbd1d9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-feed/zipball/1cf06a43b4ee0fdeb919983a76de68467ccdb844",
- "reference": "1cf06a43b4ee0fdeb919983a76de68467ccdb844",
+ "url": "https://api.github.com/repos/spatie/laravel-feed/zipball/8cd283bbb998beb3ae220e71bae162e52dfbd1d9",
+ "reference": "8cd283bbb998beb3ae220e71bae162e52dfbd1d9",
"shasum": ""
},
"require": {
- "illuminate/contracts": "^10.0",
- "illuminate/http": "^10.0",
- "illuminate/support": "^10.0",
+ "illuminate/contracts": "^10.0|^11.0",
+ "illuminate/http": "^10.0|^11.0",
+ "illuminate/support": "^10.0|^11.0",
"php": "^8.0",
"spatie/laravel-package-tools": "^1.15"
},
"require-dev": {
- "orchestra/testbench": "^8.0",
+ "orchestra/testbench": "^8.0|^9.0",
"pestphp/pest": "^2.0",
"spatie/pest-plugin-snapshots": "^2.0",
"spatie/test-time": "^1.2"
@@ -4789,87 +5014,159 @@
"email": "freek@spatie.be",
"homepage": "https://spatie.be",
"role": "Developer"
- },
- {
- "name": "Sebastian De Deyne",
- "email": "sebastian@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
- },
- {
- "name": "Patrick Organ",
- "homepage": "https://github.com/patinthehat",
- "role": "Developer"
+ },
+ {
+ "name": "Sebastian De Deyne",
+ "email": "sebastian@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
+ },
+ {
+ "name": "Patrick Organ",
+ "homepage": "https://github.com/patinthehat",
+ "role": "Developer"
+ }
+ ],
+ "description": "Generate rss feeds",
+ "homepage": "https://github.com/spatie/laravel-feed",
+ "keywords": [
+ "laravel",
+ "laravel-feed",
+ "rss",
+ "spatie"
+ ],
+ "support": {
+ "source": "https://github.com/spatie/laravel-feed/tree/4.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://spatie.be/open-source/support-us",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-01T10:20:32+00:00"
+ },
+ {
+ "name": "spatie/laravel-honeypot",
+ "version": "4.5.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/laravel-honeypot.git",
+ "reference": "57727836997ae7351a4f56008bbaf4e2801ce4a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/laravel-honeypot/zipball/57727836997ae7351a4f56008bbaf4e2801ce4a0",
+ "reference": "57727836997ae7351a4f56008bbaf4e2801ce4a0",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0",
+ "illuminate/encryption": "^8.0|^9.0|^10.0|^11.0",
+ "illuminate/http": "^8.0|^9.0|^10.0|^11.0",
+ "illuminate/support": "^8.0|^9.0|^10.0|^11.0",
+ "illuminate/validation": "^8.0|^9.0|^10.0|^11.0",
+ "nesbot/carbon": "^2.0|^3.0",
+ "php": "^8.0",
+ "spatie/laravel-package-tools": "^1.9",
+ "symfony/http-foundation": "^5.1.2|^6.0|^7.0"
+ },
+ "require-dev": {
+ "livewire/livewire": "^2.10|^3.0",
+ "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0",
+ "pestphp/pest-plugin-livewire": "^1.0|^2.1",
+ "phpunit/phpunit": "^9.6|^10.5",
+ "spatie/pest-plugin-snapshots": "^1.1|^2.1",
+ "spatie/phpunit-snapshot-assertions": "^4.2|^5.1",
+ "spatie/test-time": "^1.2.1"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Spatie\\Honeypot\\HoneypotServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Spatie\\Honeypot\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Freek Van der Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
}
],
- "description": "Generate rss feeds",
- "homepage": "https://github.com/spatie/laravel-feed",
+ "description": "Preventing spam submitted through forms",
+ "homepage": "https://github.com/spatie/laravel-honeypot",
"keywords": [
- "laravel",
- "laravel-feed",
- "rss",
+ "laravel-honeypot",
"spatie"
],
"support": {
- "source": "https://github.com/spatie/laravel-feed/tree/4.3.0"
+ "source": "https://github.com/spatie/laravel-honeypot/tree/4.5.3"
},
"funding": [
{
"url": "https://spatie.be/open-source/support-us",
"type": "custom"
- },
- {
- "url": "https://github.com/spatie",
- "type": "github"
}
],
- "time": "2023-08-07T14:46:53+00:00"
+ "time": "2024-09-20T13:45:00+00:00"
},
{
- "name": "spatie/laravel-honeypot",
- "version": "4.4.0",
+ "name": "spatie/laravel-html",
+ "version": "3.11.1",
"source": {
"type": "git",
- "url": "https://github.com/spatie/laravel-honeypot.git",
- "reference": "85728128acb3ff53ffb23c86b9cc2c3d58355050"
+ "url": "https://github.com/spatie/laravel-html.git",
+ "reference": "167e5b8243103072155b562e5cc396c90a3c1055"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-honeypot/zipball/85728128acb3ff53ffb23c86b9cc2c3d58355050",
- "reference": "85728128acb3ff53ffb23c86b9cc2c3d58355050",
+ "url": "https://api.github.com/repos/spatie/laravel-html/zipball/167e5b8243103072155b562e5cc396c90a3c1055",
+ "reference": "167e5b8243103072155b562e5cc396c90a3c1055",
"shasum": ""
},
"require": {
- "illuminate/contracts": "^8.0|^9.0|^10.0",
- "illuminate/encryption": "^8.0|^9.0|^10.0",
- "illuminate/http": "^8.0|^9.0|^10.0",
- "illuminate/support": "^8.0|^9.0|^10.0",
- "illuminate/validation": "^8.0|^9.0|^10.0",
- "nesbot/carbon": "^2.0",
- "php": "^8.0",
- "spatie/laravel-package-tools": "^1.9",
- "symfony/http-foundation": "^5.1.2|^6.0"
+ "illuminate/http": "^10.0|^11.0",
+ "illuminate/support": "^10.0|^11.0",
+ "php": "^8.2"
},
"require-dev": {
- "livewire/livewire": "^2.10",
- "orchestra/testbench": "^6.23|^7.0|^8.0",
- "pestphp/pest-plugin-livewire": "^1.0",
- "phpunit/phpunit": "^9.4",
- "spatie/pest-plugin-snapshots": "^1.1",
- "spatie/phpunit-snapshot-assertions": "^4.2",
- "spatie/test-time": "^1.2.1"
+ "mockery/mockery": "^1.3",
+ "orchestra/testbench": "^8.0|^9.0",
+ "pestphp/pest": "^2.34"
},
"type": "library",
"extra": {
"laravel": {
+ "aliases": {
+ "Html": "Spatie\\Html\\Facades\\Html"
+ },
"providers": [
- "Spatie\\Honeypot\\HoneypotServiceProvider"
+ "Spatie\\Html\\HtmlServiceProvider"
]
}
},
"autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
"psr-4": {
- "Spatie\\Honeypot\\": "src"
+ "Spatie\\Html\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -4877,6 +5174,12 @@
"MIT"
],
"authors": [
+ {
+ "name": "Sebastian De Deyne",
+ "email": "sebastian@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
+ },
{
"name": "Freek Van der Herten",
"email": "freek@spatie.be",
@@ -4884,14 +5187,14 @@
"role": "Developer"
}
],
- "description": "Preventing spam submitted through forms",
- "homepage": "https://github.com/spatie/laravel-honeypot",
+ "description": "A fluent html builder",
+ "homepage": "https://github.com/spatie/laravel-html",
"keywords": [
- "laravel-honeypot",
+ "html",
"spatie"
],
"support": {
- "source": "https://github.com/spatie/laravel-honeypot/tree/4.4.0"
+ "source": "https://github.com/spatie/laravel-html/tree/3.11.1"
},
"funding": [
{
@@ -4899,32 +5202,32 @@
"type": "custom"
}
],
- "time": "2023-12-01T10:30:39+00:00"
+ "time": "2024-10-18T14:37:21+00:00"
},
{
"name": "spatie/laravel-package-tools",
- "version": "1.16.1",
+ "version": "1.18.3",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-package-tools.git",
- "reference": "cc7c991555a37f9fa6b814aa03af73f88026a83d"
+ "reference": "ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/cc7c991555a37f9fa6b814aa03af73f88026a83d",
- "reference": "cc7c991555a37f9fa6b814aa03af73f88026a83d",
+ "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78",
+ "reference": "ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78",
"shasum": ""
},
"require": {
- "illuminate/contracts": "^9.28|^10.0",
+ "illuminate/contracts": "^9.28|^10.0|^11.0",
"php": "^8.0"
},
"require-dev": {
"mockery/mockery": "^1.5",
- "orchestra/testbench": "^7.7|^8.0",
- "pestphp/pest": "^1.22",
- "phpunit/phpunit": "^9.5.24",
- "spatie/pest-plugin-test-time": "^1.1"
+ "orchestra/testbench": "^7.7|^8.0|^9.0",
+ "pestphp/pest": "^1.22|^2",
+ "phpunit/phpunit": "^9.5.24|^10.5",
+ "spatie/pest-plugin-test-time": "^1.1|^2.2"
},
"type": "library",
"autoload": {
@@ -4951,7 +5254,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-package-tools/issues",
- "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.1"
+ "source": "https://github.com/spatie/laravel-package-tools/tree/1.18.3"
},
"funding": [
{
@@ -4959,20 +5262,20 @@
"type": "github"
}
],
- "time": "2023-08-23T09:04:39+00:00"
+ "time": "2025-01-22T08:51:18+00:00"
},
{
"name": "symfony/console",
- "version": "v6.4.1",
+ "version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd"
+ "reference": "799445db3f15768ecc382ac5699e6da0520a0a04"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/a550a7c99daeedef3f9d23fb82e3531525ff11fd",
- "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd",
+ "url": "https://api.github.com/repos/symfony/console/zipball/799445db3f15768ecc382ac5699e6da0520a0a04",
+ "reference": "799445db3f15768ecc382ac5699e6da0520a0a04",
"shasum": ""
},
"require": {
@@ -5037,7 +5340,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v6.4.1"
+ "source": "https://github.com/symfony/console/tree/v6.4.17"
},
"funding": [
{
@@ -5053,24 +5356,24 @@
"type": "tidelift"
}
],
- "time": "2023-11-30T10:54:28+00:00"
+ "time": "2024-12-07T12:07:30+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v6.4.0",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4"
+ "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/d036c6c0d0b09e24a14a35f8292146a658f986e4",
- "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2",
+ "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"type": "library",
"autoload": {
@@ -5102,7 +5405,7 @@
"description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/css-selector/tree/v6.4.0"
+ "source": "https://github.com/symfony/css-selector/tree/v7.2.0"
},
"funding": [
{
@@ -5118,20 +5421,20 @@
"type": "tidelift"
}
],
- "time": "2023-10-31T08:40:20+00:00"
+ "time": "2024-09-25T14:21:43+00:00"
},
{
"name": "symfony/deprecation-contracts",
- "version": "v3.4.0",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
+ "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
- "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
+ "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
"shasum": ""
},
"require": {
@@ -5139,12 +5442,12 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "3.4-dev"
- },
"thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
}
},
"autoload": {
@@ -5169,7 +5472,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1"
},
"funding": [
{
@@ -5185,20 +5488,20 @@
"type": "tidelift"
}
],
- "time": "2023-05-23T14:45:45+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/error-handler",
- "version": "v6.4.0",
+ "version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788"
+ "reference": "37ad2380e8c1a8cf62a1200a5c10080b679b446c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/c873490a1c97b3a0a4838afc36ff36c112d02788",
- "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/37ad2380e8c1a8cf62a1200a5c10080b679b446c",
+ "reference": "37ad2380e8c1a8cf62a1200a5c10080b679b446c",
"shasum": ""
},
"require": {
@@ -5244,7 +5547,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v6.4.0"
+ "source": "https://github.com/symfony/error-handler/tree/v6.4.17"
},
"funding": [
{
@@ -5260,28 +5563,28 @@
"type": "tidelift"
}
],
- "time": "2023-10-18T09:43:34+00:00"
+ "time": "2024-12-06T13:30:51+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v6.4.0",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6"
+ "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d76d2632cfc2206eecb5ad2b26cd5934082941b6",
- "reference": "d76d2632cfc2206eecb5ad2b26cd5934082941b6",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1",
+ "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1",
"shasum": ""
},
"require": {
- "php": ">=8.1",
+ "php": ">=8.2",
"symfony/event-dispatcher-contracts": "^2.5|^3"
},
"conflict": {
- "symfony/dependency-injection": "<5.4",
+ "symfony/dependency-injection": "<6.4",
"symfony/service-contracts": "<2.5"
},
"provide": {
@@ -5290,13 +5593,13 @@
},
"require-dev": {
"psr/log": "^1|^2|^3",
- "symfony/config": "^5.4|^6.0|^7.0",
- "symfony/dependency-injection": "^5.4|^6.0|^7.0",
- "symfony/error-handler": "^5.4|^6.0|^7.0",
- "symfony/expression-language": "^5.4|^6.0|^7.0",
- "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
"symfony/service-contracts": "^2.5|^3",
- "symfony/stopwatch": "^5.4|^6.0|^7.0"
+ "symfony/stopwatch": "^6.4|^7.0"
},
"type": "library",
"autoload": {
@@ -5324,7 +5627,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.0"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0"
},
"funding": [
{
@@ -5340,20 +5643,20 @@
"type": "tidelift"
}
],
- "time": "2023-07-27T06:52:43+00:00"
+ "time": "2024-09-25T14:21:43+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
- "version": "v3.4.0",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "a76aed96a42d2b521153fb382d418e30d18b59df"
+ "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df",
- "reference": "a76aed96a42d2b521153fb382d418e30d18b59df",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f",
+ "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f",
"shasum": ""
},
"require": {
@@ -5362,12 +5665,12 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "3.4-dev"
- },
"thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
}
},
"autoload": {
@@ -5400,7 +5703,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0"
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1"
},
"funding": [
{
@@ -5416,20 +5719,20 @@
"type": "tidelift"
}
],
- "time": "2023-05-23T14:45:45+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/finder",
- "version": "v6.4.0",
+ "version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "11d736e97f116ac375a81f96e662911a34cd50ce"
+ "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce",
- "reference": "11d736e97f116ac375a81f96e662911a34cd50ce",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7",
+ "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7",
"shasum": ""
},
"require": {
@@ -5464,7 +5767,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v6.4.0"
+ "source": "https://github.com/symfony/finder/tree/v6.4.17"
},
"funding": [
{
@@ -5480,20 +5783,20 @@
"type": "tidelift"
}
],
- "time": "2023-10-31T17:30:12+00:00"
+ "time": "2024-12-29T13:51:37+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v6.4.0",
+ "version": "v6.4.16",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "44a6d39a9cc11e154547d882d5aac1e014440771"
+ "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/44a6d39a9cc11e154547d882d5aac1e014440771",
- "reference": "44a6d39a9cc11e154547d882d5aac1e014440771",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/431771b7a6f662f1575b3cfc8fd7617aa9864d57",
+ "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57",
"shasum": ""
},
"require": {
@@ -5503,12 +5806,12 @@
"symfony/polyfill-php83": "^1.27"
},
"conflict": {
- "symfony/cache": "<6.3"
+ "symfony/cache": "<6.4.12|>=7.0,<7.1.5"
},
"require-dev": {
"doctrine/dbal": "^2.13.1|^3|^4",
"predis/predis": "^1.1|^2.0",
- "symfony/cache": "^6.3|^7.0",
+ "symfony/cache": "^6.4.12|^7.1.5",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0",
@@ -5541,7 +5844,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v6.4.0"
+ "source": "https://github.com/symfony/http-foundation/tree/v6.4.16"
},
"funding": [
{
@@ -5557,20 +5860,20 @@
"type": "tidelift"
}
],
- "time": "2023-11-20T16:41:16+00:00"
+ "time": "2024-11-13T18:58:10+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v6.4.1",
+ "version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "2953274c16a229b3933ef73a6898e18388e12e1b"
+ "reference": "c5647393c5ce11833d13e4b70fff4b571d4ac710"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2953274c16a229b3933ef73a6898e18388e12e1b",
- "reference": "2953274c16a229b3933ef73a6898e18388e12e1b",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c5647393c5ce11833d13e4b70fff4b571d4ac710",
+ "reference": "c5647393c5ce11833d13e4b70fff4b571d4ac710",
"shasum": ""
},
"require": {
@@ -5619,12 +5922,13 @@
"symfony/process": "^5.4|^6.0|^7.0",
"symfony/property-access": "^5.4.5|^6.0.5|^7.0",
"symfony/routing": "^5.4|^6.0|^7.0",
- "symfony/serializer": "^6.3|^7.0",
+ "symfony/serializer": "^6.4.4|^7.0.4",
"symfony/stopwatch": "^5.4|^6.0|^7.0",
"symfony/translation": "^5.4|^6.0|^7.0",
"symfony/translation-contracts": "^2.5|^3",
"symfony/uid": "^5.4|^6.0|^7.0",
"symfony/validator": "^6.4|^7.0",
+ "symfony/var-dumper": "^5.4|^6.4|^7.0",
"symfony/var-exporter": "^6.2|^7.0",
"twig/twig": "^2.13|^3.0.4"
},
@@ -5654,7 +5958,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v6.4.1"
+ "source": "https://github.com/symfony/http-kernel/tree/v6.4.17"
},
"funding": [
{
@@ -5670,20 +5974,20 @@
"type": "tidelift"
}
],
- "time": "2023-12-01T17:02:02+00:00"
+ "time": "2024-12-31T14:49:31+00:00"
},
{
"name": "symfony/mailer",
- "version": "v6.4.0",
+ "version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
- "reference": "ca8dcf8892cdc5b4358ecf2528429bb5e706f7ba"
+ "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mailer/zipball/ca8dcf8892cdc5b4358ecf2528429bb5e706f7ba",
- "reference": "ca8dcf8892cdc5b4358ecf2528429bb5e706f7ba",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/c2f7e0d8d7ac8fe25faccf5d8cac462805db2663",
+ "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663",
"shasum": ""
},
"require": {
@@ -5734,7 +6038,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/mailer/tree/v6.4.0"
+ "source": "https://github.com/symfony/mailer/tree/v6.4.13"
},
"funding": [
{
@@ -5750,20 +6054,20 @@
"type": "tidelift"
}
],
- "time": "2023-11-12T18:02:22+00:00"
+ "time": "2024-09-25T14:18:03+00:00"
},
{
"name": "symfony/mime",
- "version": "v6.4.0",
+ "version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
- "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205"
+ "reference": "ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/ca4f58b2ef4baa8f6cecbeca2573f88cd577d205",
- "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232",
+ "reference": "ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232",
"shasum": ""
},
"require": {
@@ -5777,16 +6081,17 @@
"phpdocumentor/reflection-docblock": "<3.2.2",
"phpdocumentor/type-resolver": "<1.4.0",
"symfony/mailer": "<5.4",
- "symfony/serializer": "<6.3.2"
+ "symfony/serializer": "<6.4.3|>7.0,<7.0.3"
},
"require-dev": {
"egulias/email-validator": "^2.1.10|^3.1|^4",
"league/html-to-markdown": "^5.0",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.4|^7.0",
"symfony/property-access": "^5.4|^6.0|^7.0",
"symfony/property-info": "^5.4|^6.0|^7.0",
- "symfony/serializer": "^6.3.2|^7.0"
+ "symfony/serializer": "^6.4.3|^7.0.3"
},
"type": "library",
"autoload": {
@@ -5818,7 +6123,7 @@
"mime-type"
],
"support": {
- "source": "https://github.com/symfony/mime/tree/v6.4.0"
+ "source": "https://github.com/symfony/mime/tree/v6.4.17"
},
"funding": [
{
@@ -5834,24 +6139,24 @@
"type": "tidelift"
}
],
- "time": "2023-10-17T11:49:05+00:00"
+ "time": "2024-12-02T11:09:41+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.28.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
- "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"provide": {
"ext-ctype": "*"
@@ -5861,12 +6166,9 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -5900,7 +6202,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
},
"funding": [
{
@@ -5916,36 +6218,33 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
- "version": "v1.28.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "875e90aeea2777b6f135677f618529449334a612"
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612",
- "reference": "875e90aeea2777b6f135677f618529449334a612",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -5981,7 +6280,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0"
},
"funding": [
{
@@ -5997,38 +6296,34 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
- "version": "v1.28.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
- "reference": "ecaafce9f77234a6a449d29e49267ba10499116d"
+ "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d",
- "reference": "ecaafce9f77234a6a449d29e49267ba10499116d",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
+ "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"shasum": ""
},
"require": {
- "php": ">=7.1",
- "symfony/polyfill-intl-normalizer": "^1.10",
- "symfony/polyfill-php72": "^1.10"
+ "php": ">=7.2",
+ "symfony/polyfill-intl-normalizer": "^1.10"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -6068,7 +6363,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
},
"funding": [
{
@@ -6084,36 +6379,33 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:30:37+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
- "version": "v1.28.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
- "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -6152,7 +6444,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
},
"funding": [
{
@@ -6168,24 +6460,24 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.28.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "42292d99c55abe617799667f454222c54c60e229"
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
- "reference": "42292d99c55abe617799667f454222c54c60e229",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"provide": {
"ext-mbstring": "*"
@@ -6195,12 +6487,9 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -6235,83 +6524,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2023-07-28T09:04:16+00:00"
- },
- {
- "name": "symfony/polyfill-php72",
- "version": "v1.28.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-php72.git",
- "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179",
- "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Php72\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
},
"funding": [
{
@@ -6327,33 +6540,30 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.28.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
- "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -6394,7 +6604,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
},
"funding": [
{
@@ -6410,34 +6620,30 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-php83",
- "version": "v1.28.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php83.git",
- "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11"
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11",
- "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491",
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491",
"shasum": ""
},
"require": {
- "php": ">=7.1",
- "symfony/polyfill-php80": "^1.14"
+ "php": ">=7.2"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -6474,7 +6680,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0"
},
"funding": [
{
@@ -6490,24 +6696,24 @@
"type": "tidelift"
}
],
- "time": "2023-08-16T06:22:46+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-uuid",
- "version": "v1.28.0",
+ "version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-uuid.git",
- "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e"
+ "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9c44518a5aff8da565c8a55dbe85d2769e6f630e",
- "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e",
+ "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2",
+ "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"provide": {
"ext-uuid": "*"
@@ -6517,12 +6723,9 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
@@ -6556,7 +6759,7 @@
"uuid"
],
"support": {
- "source": "https://github.com/symfony/polyfill-uuid/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0"
},
"funding": [
{
@@ -6572,20 +6775,20 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/process",
- "version": "v6.4.0",
+ "version": "v6.4.15",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa"
+ "reference": "3cb242f059c14ae08591c5c4087d1fe443564392"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/191703b1566d97a5425dc969e4350d32b8ef17aa",
- "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa",
+ "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392",
+ "reference": "3cb242f059c14ae08591c5c4087d1fe443564392",
"shasum": ""
},
"require": {
@@ -6617,7 +6820,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v6.4.0"
+ "source": "https://github.com/symfony/process/tree/v6.4.15"
},
"funding": [
{
@@ -6633,20 +6836,20 @@
"type": "tidelift"
}
],
- "time": "2023-11-17T21:06:49+00:00"
+ "time": "2024-11-06T14:19:14+00:00"
},
{
"name": "symfony/routing",
- "version": "v6.4.1",
+ "version": "v6.4.16",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "0c95c164fdba18b12523b75e64199ca3503e6d40"
+ "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/0c95c164fdba18b12523b75e64199ca3503e6d40",
- "reference": "0c95c164fdba18b12523b75e64199ca3503e6d40",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/91e02e606b4b705c2f4fb42f7e7708b7923a3220",
+ "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220",
"shasum": ""
},
"require": {
@@ -6700,7 +6903,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v6.4.1"
+ "source": "https://github.com/symfony/routing/tree/v6.4.16"
},
"funding": [
{
@@ -6716,37 +6919,38 @@
"type": "tidelift"
}
],
- "time": "2023-12-01T14:54:37+00:00"
+ "time": "2024-11-13T15:31:34+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v3.4.0",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838"
+ "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838",
- "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
+ "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
"shasum": ""
},
"require": {
"php": ">=8.1",
- "psr/container": "^2.0"
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
},
"conflict": {
"ext-psr": "<1.1|>=2"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "3.4-dev"
- },
"thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
}
},
"autoload": {
@@ -6782,7 +6986,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v3.4.0"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.5.1"
},
"funding": [
{
@@ -6798,24 +7002,24 @@
"type": "tidelift"
}
],
- "time": "2023-07-30T20:28:31+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/string",
- "version": "v6.4.0",
+ "version": "v7.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809"
+ "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/b45fcf399ea9c3af543a92edf7172ba21174d809",
- "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809",
+ "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82",
+ "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82",
"shasum": ""
},
"require": {
- "php": ">=8.1",
+ "php": ">=8.2",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0",
@@ -6825,11 +7029,12 @@
"symfony/translation-contracts": "<2.5"
},
"require-dev": {
- "symfony/error-handler": "^5.4|^6.0|^7.0",
- "symfony/http-client": "^5.4|^6.0|^7.0",
- "symfony/intl": "^6.2|^7.0",
+ "symfony/emoji": "^7.1",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/intl": "^6.4|^7.0",
"symfony/translation-contracts": "^2.5|^3.0",
- "symfony/var-exporter": "^5.4|^6.0|^7.0"
+ "symfony/var-exporter": "^6.4|^7.0"
},
"type": "library",
"autoload": {
@@ -6868,7 +7073,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v6.4.0"
+ "source": "https://github.com/symfony/string/tree/v7.2.0"
},
"funding": [
{
@@ -6884,20 +7089,20 @@
"type": "tidelift"
}
],
- "time": "2023-11-28T20:41:49+00:00"
+ "time": "2024-11-13T13:31:26+00:00"
},
{
"name": "symfony/translation",
- "version": "v6.4.0",
+ "version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "b1035dbc2a344b21f8fa8ac451c7ecec4ea45f37"
+ "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/b1035dbc2a344b21f8fa8ac451c7ecec4ea45f37",
- "reference": "b1035dbc2a344b21f8fa8ac451c7ecec4ea45f37",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66",
+ "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66",
"shasum": ""
},
"require": {
@@ -6920,7 +7125,7 @@
"symfony/translation-implementation": "2.3|3.0"
},
"require-dev": {
- "nikic/php-parser": "^4.13",
+ "nikic/php-parser": "^4.18|^5.0",
"psr/log": "^1|^2|^3",
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/console": "^5.4|^6.0|^7.0",
@@ -6963,7 +7168,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v6.4.0"
+ "source": "https://github.com/symfony/translation/tree/v6.4.13"
},
"funding": [
{
@@ -6979,20 +7184,20 @@
"type": "tidelift"
}
],
- "time": "2023-11-29T08:14:36+00:00"
+ "time": "2024-09-27T18:14:25+00:00"
},
{
"name": "symfony/translation-contracts",
- "version": "v3.4.0",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
- "reference": "dee0c6e5b4c07ce851b462530088e64b255ac9c5"
+ "reference": "4667ff3bd513750603a09c8dedbea942487fb07c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/dee0c6e5b4c07ce851b462530088e64b255ac9c5",
- "reference": "dee0c6e5b4c07ce851b462530088e64b255ac9c5",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c",
+ "reference": "4667ff3bd513750603a09c8dedbea942487fb07c",
"shasum": ""
},
"require": {
@@ -7000,12 +7205,12 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "3.4-dev"
- },
"thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
}
},
"autoload": {
@@ -7041,7 +7246,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/translation-contracts/tree/v3.4.0"
+ "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1"
},
"funding": [
{
@@ -7057,20 +7262,20 @@
"type": "tidelift"
}
],
- "time": "2023-07-25T15:08:44+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/uid",
- "version": "v6.4.0",
+ "version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/uid.git",
- "reference": "8092dd1b1a41372110d06374f99ee62f7f0b9a92"
+ "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/uid/zipball/8092dd1b1a41372110d06374f99ee62f7f0b9a92",
- "reference": "8092dd1b1a41372110d06374f99ee62f7f0b9a92",
+ "url": "https://api.github.com/repos/symfony/uid/zipball/18eb207f0436a993fffbdd811b5b8fa35fa5e007",
+ "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007",
"shasum": ""
},
"require": {
@@ -7115,7 +7320,7 @@
"uuid"
],
"support": {
- "source": "https://github.com/symfony/uid/tree/v6.4.0"
+ "source": "https://github.com/symfony/uid/tree/v6.4.13"
},
"funding": [
{
@@ -7131,20 +7336,20 @@
"type": "tidelift"
}
],
- "time": "2023-10-31T08:18:17+00:00"
+ "time": "2024-09-25T14:18:03+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v6.4.0",
+ "version": "v6.4.15",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "c40f7d17e91d8b407582ed51a2bbf83c52c367f6"
+ "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c40f7d17e91d8b407582ed51a2bbf83c52c367f6",
- "reference": "c40f7d17e91d8b407582ed51a2bbf83c52c367f6",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80",
+ "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80",
"shasum": ""
},
"require": {
@@ -7200,7 +7405,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v6.4.0"
+ "source": "https://github.com/symfony/var-dumper/tree/v6.4.15"
},
"funding": [
{
@@ -7216,35 +7421,37 @@
"type": "tidelift"
}
],
- "time": "2023-11-09T08:28:32+00:00"
+ "time": "2024-11-08T15:28:48+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
- "version": "v2.2.7",
+ "version": "v2.3.0",
"source": {
"type": "git",
"url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
- "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb"
+ "reference": "0d72ac1c00084279c1816675284073c5a337c20d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb",
- "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb",
+ "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d",
+ "reference": "0d72ac1c00084279c1816675284073c5a337c20d",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
- "php": "^5.5 || ^7.0 || ^8.0",
- "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0"
+ "php": "^7.4 || ^8.0",
+ "symfony/css-selector": "^5.4 || ^6.0 || ^7.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10"
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpunit/phpunit": "^8.5.21 || ^9.5.10"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.2.x-dev"
+ "dev-master": "2.x-dev"
}
},
"autoload": {
@@ -7267,29 +7474,29 @@
"homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
"support": {
"issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues",
- "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7"
+ "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0"
},
- "time": "2023-12-08T13:03:43+00:00"
+ "time": "2024-12-21T16:25:41+00:00"
},
{
"name": "vlucas/phpdotenv",
- "version": "v5.6.0",
+ "version": "v5.6.1",
"source": {
"type": "git",
"url": "https://github.com/vlucas/phpdotenv.git",
- "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4"
+ "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4",
- "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2",
+ "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2",
"shasum": ""
},
"require": {
"ext-pcre": "*",
- "graham-campbell/result-type": "^1.1.2",
+ "graham-campbell/result-type": "^1.1.3",
"php": "^7.2.5 || ^8.0",
- "phpoption/phpoption": "^1.9.2",
+ "phpoption/phpoption": "^1.9.3",
"symfony/polyfill-ctype": "^1.24",
"symfony/polyfill-mbstring": "^1.24",
"symfony/polyfill-php80": "^1.24"
@@ -7306,7 +7513,7 @@
"extra": {
"bamarni-bin": {
"bin-links": true,
- "forward-command": true
+ "forward-command": false
},
"branch-alias": {
"dev-master": "5.6-dev"
@@ -7341,7 +7548,7 @@
],
"support": {
"issues": "https://github.com/vlucas/phpdotenv/issues",
- "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0"
+ "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1"
},
"funding": [
{
@@ -7353,20 +7560,20 @@
"type": "tidelift"
}
],
- "time": "2023-11-12T22:43:29+00:00"
+ "time": "2024-07-20T21:52:34+00:00"
},
{
"name": "voku/portable-ascii",
- "version": "2.0.1",
+ "version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/voku/portable-ascii.git",
- "reference": "b56450eed252f6801410d810c8e1727224ae0743"
+ "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743",
- "reference": "b56450eed252f6801410d810c8e1727224ae0743",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
+ "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
"shasum": ""
},
"require": {
@@ -7391,7 +7598,7 @@
"authors": [
{
"name": "Lars Moelleken",
- "homepage": "http://www.moelleken.org/"
+ "homepage": "https://www.moelleken.org/"
}
],
"description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
@@ -7403,7 +7610,7 @@
],
"support": {
"issues": "https://github.com/voku/portable-ascii/issues",
- "source": "https://github.com/voku/portable-ascii/tree/2.0.1"
+ "source": "https://github.com/voku/portable-ascii/tree/2.0.3"
},
"funding": [
{
@@ -7427,7 +7634,7 @@
"type": "tidelift"
}
],
- "time": "2022-03-08T17:03:00+00:00"
+ "time": "2024-11-21T01:49:47+00:00"
},
{
"name": "webmozart/assert",
@@ -7491,16 +7698,16 @@
"packages-dev": [
{
"name": "fakerphp/faker",
- "version": "v1.23.0",
+ "version": "v1.24.1",
"source": {
"type": "git",
"url": "https://github.com/FakerPHP/Faker.git",
- "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01"
+ "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e3daa170d00fde61ea7719ef47bb09bb8f1d9b01",
- "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01",
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
+ "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
"shasum": ""
},
"require": {
@@ -7526,11 +7733,6 @@
"ext-mbstring": "Required for multibyte Unicode string functionality."
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "v1.21-dev"
- }
- },
"autoload": {
"psr-4": {
"Faker\\": "src/Faker/"
@@ -7553,32 +7755,32 @@
],
"support": {
"issues": "https://github.com/FakerPHP/Faker/issues",
- "source": "https://github.com/FakerPHP/Faker/tree/v1.23.0"
+ "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1"
},
- "time": "2023-06-12T08:44:38+00:00"
+ "time": "2024-11-21T13:46:39+00:00"
},
{
"name": "filp/whoops",
- "version": "2.15.4",
+ "version": "2.17.0",
"source": {
"type": "git",
"url": "https://github.com/filp/whoops.git",
- "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546"
+ "reference": "075bc0c26631110584175de6523ab3f1652eb28e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546",
- "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e",
+ "reference": "075bc0c26631110584175de6523ab3f1652eb28e",
"shasum": ""
},
"require": {
- "php": "^5.5.9 || ^7.0 || ^8.0",
+ "php": "^7.1 || ^8.0",
"psr/log": "^1.0.1 || ^2.0 || ^3.0"
},
"require-dev": {
- "mockery/mockery": "^0.9 || ^1.0",
- "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
- "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^4.0 || ^5.0"
},
"suggest": {
"symfony/var-dumper": "Pretty print complex values better with var-dumper available",
@@ -7618,7 +7820,7 @@
],
"support": {
"issues": "https://github.com/filp/whoops/issues",
- "source": "https://github.com/filp/whoops/tree/2.15.4"
+ "source": "https://github.com/filp/whoops/tree/2.17.0"
},
"funding": [
{
@@ -7626,7 +7828,7 @@
"type": "github"
}
],
- "time": "2023-11-03T12:00:00+00:00"
+ "time": "2025-01-25T12:00:00+00:00"
},
{
"name": "hamcrest/hamcrest-php",
@@ -7681,16 +7883,16 @@
},
{
"name": "laravel/pint",
- "version": "v1.13.7",
+ "version": "v1.20.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/pint.git",
- "reference": "4157768980dbd977f1c4b4cc94997416d8b30ece"
+ "reference": "53072e8ea22213a7ed168a8a15b96fbb8b82d44b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/pint/zipball/4157768980dbd977f1c4b4cc94997416d8b30ece",
- "reference": "4157768980dbd977f1c4b4cc94997416d8b30ece",
+ "url": "https://api.github.com/repos/laravel/pint/zipball/53072e8ea22213a7ed168a8a15b96fbb8b82d44b",
+ "reference": "53072e8ea22213a7ed168a8a15b96fbb8b82d44b",
"shasum": ""
},
"require": {
@@ -7701,13 +7903,13 @@
"php": "^8.1.0"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^3.38.0",
- "illuminate/view": "^10.30.1",
- "laravel-zero/framework": "^10.3.0",
- "mockery/mockery": "^1.6.6",
- "nunomaduro/larastan": "^2.6.4",
- "nunomaduro/termwind": "^1.15.1",
- "pestphp/pest": "^2.24.2"
+ "friendsofphp/php-cs-fixer": "^3.66.0",
+ "illuminate/view": "^10.48.25",
+ "larastan/larastan": "^2.9.12",
+ "laravel-zero/framework": "^10.48.25",
+ "mockery/mockery": "^1.6.12",
+ "nunomaduro/termwind": "^1.17.0",
+ "pestphp/pest": "^2.36.0"
},
"bin": [
"builds/pint"
@@ -7743,20 +7945,20 @@
"issues": "https://github.com/laravel/pint/issues",
"source": "https://github.com/laravel/pint"
},
- "time": "2023-12-05T19:43:12+00:00"
+ "time": "2025-01-14T16:20:53+00:00"
},
{
"name": "mockery/mockery",
- "version": "1.6.7",
+ "version": "1.6.12",
"source": {
"type": "git",
"url": "https://github.com/mockery/mockery.git",
- "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06"
+ "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mockery/mockery/zipball/0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06",
- "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+ "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699",
"shasum": ""
},
"require": {
@@ -7768,8 +7970,8 @@
"phpunit/phpunit": "<8.0"
},
"require-dev": {
- "phpunit/phpunit": "^8.5 || ^9.6.10",
- "symplify/easy-coding-standard": "^12.0.8"
+ "phpunit/phpunit": "^8.5 || ^9.6.17",
+ "symplify/easy-coding-standard": "^12.1.14"
},
"type": "library",
"autoload": {
@@ -7826,20 +8028,20 @@
"security": "https://github.com/mockery/mockery/security/advisories",
"source": "https://github.com/mockery/mockery"
},
- "time": "2023-12-10T02:24:34+00:00"
+ "time": "2024-05-16T03:13:13+00:00"
},
{
"name": "myclabs/deep-copy",
- "version": "1.11.1",
+ "version": "1.12.1",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
+ "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
+ "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
"shasum": ""
},
"require": {
@@ -7847,11 +8049,12 @@
},
"conflict": {
"doctrine/collections": "<1.6.8",
- "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
@@ -7877,7 +8080,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
},
"funding": [
{
@@ -7885,44 +8088,44 @@
"type": "tidelift"
}
],
- "time": "2023-03-08T13:26:56+00:00"
+ "time": "2024-11-08T17:47:46+00:00"
},
{
"name": "nunomaduro/collision",
- "version": "v7.10.0",
+ "version": "v7.11.0",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/collision.git",
- "reference": "49ec67fa7b002712da8526678abd651c09f375b2"
+ "reference": "994ea93df5d4132f69d3f1bd74730509df6e8a05"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/collision/zipball/49ec67fa7b002712da8526678abd651c09f375b2",
- "reference": "49ec67fa7b002712da8526678abd651c09f375b2",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/994ea93df5d4132f69d3f1bd74730509df6e8a05",
+ "reference": "994ea93df5d4132f69d3f1bd74730509df6e8a05",
"shasum": ""
},
"require": {
- "filp/whoops": "^2.15.3",
+ "filp/whoops": "^2.16.0",
"nunomaduro/termwind": "^1.15.1",
"php": "^8.1.0",
- "symfony/console": "^6.3.4"
+ "symfony/console": "^6.4.12"
},
"conflict": {
"laravel/framework": ">=11.0.0"
},
"require-dev": {
- "brianium/paratest": "^7.3.0",
- "laravel/framework": "^10.28.0",
- "laravel/pint": "^1.13.3",
- "laravel/sail": "^1.25.0",
- "laravel/sanctum": "^3.3.1",
- "laravel/tinker": "^2.8.2",
- "nunomaduro/larastan": "^2.6.4",
- "orchestra/testbench-core": "^8.13.0",
- "pestphp/pest": "^2.23.2",
- "phpunit/phpunit": "^10.4.1",
- "sebastian/environment": "^6.0.1",
- "spatie/laravel-ignition": "^2.3.1"
+ "brianium/paratest": "^7.3.1",
+ "laravel/framework": "^10.48.22",
+ "laravel/pint": "^1.18.1",
+ "laravel/sail": "^1.36.0",
+ "laravel/sanctum": "^3.3.3",
+ "laravel/tinker": "^2.10.0",
+ "nunomaduro/larastan": "^2.9.8",
+ "orchestra/testbench-core": "^8.28.3",
+ "pestphp/pest": "^2.35.1",
+ "phpunit/phpunit": "^10.5.36",
+ "sebastian/environment": "^6.1.0",
+ "spatie/laravel-ignition": "^2.8.0"
},
"type": "library",
"extra": {
@@ -7981,24 +8184,25 @@
"type": "patreon"
}
],
- "time": "2023-10-11T15:45:01+00:00"
+ "time": "2024-10-15T15:12:40+00:00"
},
{
"name": "phar-io/manifest",
- "version": "2.0.3",
+ "version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/phar-io/manifest.git",
- "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
- "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
"shasum": ""
},
"require": {
"ext-dom": "*",
+ "ext-libxml": "*",
"ext-phar": "*",
"ext-xmlwriter": "*",
"phar-io/version": "^3.0.1",
@@ -8039,9 +8243,15 @@
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"support": {
"issues": "https://github.com/phar-io/manifest/issues",
- "source": "https://github.com/phar-io/manifest/tree/2.0.3"
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
},
- "time": "2021-07-20T11:28:43+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+00:00"
},
{
"name": "phar-io/version",
@@ -8096,32 +8306,32 @@
},
{
"name": "phpunit/php-code-coverage",
- "version": "10.1.10",
+ "version": "10.1.16",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "599109c8ca6bae97b23482d557d2874c25a65e59"
+ "reference": "7e308268858ed6baedc8704a304727d20bc07c77"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/599109c8ca6bae97b23482d557d2874c25a65e59",
- "reference": "599109c8ca6bae97b23482d557d2874c25a65e59",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77",
+ "reference": "7e308268858ed6baedc8704a304727d20bc07c77",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
- "nikic/php-parser": "^4.15",
+ "nikic/php-parser": "^4.19.1 || ^5.1.0",
"php": ">=8.1",
- "phpunit/php-file-iterator": "^4.0",
- "phpunit/php-text-template": "^3.0",
- "sebastian/code-unit-reverse-lookup": "^3.0",
- "sebastian/complexity": "^3.0",
- "sebastian/environment": "^6.0",
- "sebastian/lines-of-code": "^2.0",
- "sebastian/version": "^4.0",
- "theseer/tokenizer": "^1.2.0"
+ "phpunit/php-file-iterator": "^4.1.0",
+ "phpunit/php-text-template": "^3.0.1",
+ "sebastian/code-unit-reverse-lookup": "^3.0.0",
+ "sebastian/complexity": "^3.2.0",
+ "sebastian/environment": "^6.1.0",
+ "sebastian/lines-of-code": "^2.0.2",
+ "sebastian/version": "^4.0.1",
+ "theseer/tokenizer": "^1.2.3"
},
"require-dev": {
"phpunit/phpunit": "^10.1"
@@ -8133,7 +8343,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "10.1-dev"
+ "dev-main": "10.1.x-dev"
}
},
"autoload": {
@@ -8162,7 +8372,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.10"
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16"
},
"funding": [
{
@@ -8170,7 +8380,7 @@
"type": "github"
}
],
- "time": "2023-12-11T06:28:43+00:00"
+ "time": "2024-08-22T04:31:57+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -8417,16 +8627,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "10.5.3",
+ "version": "10.5.41",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "6fce887c71076a73f32fd3e0774a6833fc5c7f19"
+ "reference": "e76586fa3d49714f230221734b44892e384109d7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6fce887c71076a73f32fd3e0774a6833fc5c7f19",
- "reference": "6fce887c71076a73f32fd3e0774a6833fc5c7f19",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e76586fa3d49714f230221734b44892e384109d7",
+ "reference": "e76586fa3d49714f230221734b44892e384109d7",
"shasum": ""
},
"require": {
@@ -8436,26 +8646,26 @@
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.10.1",
- "phar-io/manifest": "^2.0.3",
- "phar-io/version": "^3.0.2",
+ "myclabs/deep-copy": "^1.12.1",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
"php": ">=8.1",
- "phpunit/php-code-coverage": "^10.1.5",
- "phpunit/php-file-iterator": "^4.0",
- "phpunit/php-invoker": "^4.0",
- "phpunit/php-text-template": "^3.0",
- "phpunit/php-timer": "^6.0",
- "sebastian/cli-parser": "^2.0",
- "sebastian/code-unit": "^2.0",
- "sebastian/comparator": "^5.0",
- "sebastian/diff": "^5.0",
- "sebastian/environment": "^6.0",
- "sebastian/exporter": "^5.1",
- "sebastian/global-state": "^6.0.1",
- "sebastian/object-enumerator": "^5.0",
- "sebastian/recursion-context": "^5.0",
- "sebastian/type": "^4.0",
- "sebastian/version": "^4.0"
+ "phpunit/php-code-coverage": "^10.1.16",
+ "phpunit/php-file-iterator": "^4.1.0",
+ "phpunit/php-invoker": "^4.0.0",
+ "phpunit/php-text-template": "^3.0.1",
+ "phpunit/php-timer": "^6.0.0",
+ "sebastian/cli-parser": "^2.0.1",
+ "sebastian/code-unit": "^2.0.0",
+ "sebastian/comparator": "^5.0.3",
+ "sebastian/diff": "^5.1.1",
+ "sebastian/environment": "^6.1.0",
+ "sebastian/exporter": "^5.1.2",
+ "sebastian/global-state": "^6.0.2",
+ "sebastian/object-enumerator": "^5.0.0",
+ "sebastian/recursion-context": "^5.0.0",
+ "sebastian/type": "^4.0.0",
+ "sebastian/version": "^4.0.1"
},
"suggest": {
"ext-soap": "To be able to generate mocks based on WSDL files"
@@ -8498,7 +8708,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.3"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.41"
},
"funding": [
{
@@ -8514,20 +8724,20 @@
"type": "tidelift"
}
],
- "time": "2023-12-13T07:25:23+00:00"
+ "time": "2025-01-13T09:33:05+00:00"
},
{
"name": "sebastian/cli-parser",
- "version": "2.0.0",
+ "version": "2.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
- "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae"
+ "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae",
- "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084",
+ "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084",
"shasum": ""
},
"require": {
@@ -8562,7 +8772,8 @@
"homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
- "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0"
+ "security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1"
},
"funding": [
{
@@ -8570,7 +8781,7 @@
"type": "github"
}
],
- "time": "2023-02-03T06:58:15+00:00"
+ "time": "2024-03-02T07:12:49+00:00"
},
{
"name": "sebastian/code-unit",
@@ -8685,16 +8896,16 @@
},
{
"name": "sebastian/comparator",
- "version": "5.0.1",
+ "version": "5.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "2db5010a484d53ebf536087a70b4a5423c102372"
+ "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372",
- "reference": "2db5010a484d53ebf536087a70b4a5423c102372",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e",
+ "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e",
"shasum": ""
},
"require": {
@@ -8705,7 +8916,7 @@
"sebastian/exporter": "^5.0"
},
"require-dev": {
- "phpunit/phpunit": "^10.3"
+ "phpunit/phpunit": "^10.5"
},
"type": "library",
"extra": {
@@ -8750,7 +8961,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy",
- "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1"
+ "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3"
},
"funding": [
{
@@ -8758,24 +8969,24 @@
"type": "github"
}
],
- "time": "2023-08-14T13:18:12+00:00"
+ "time": "2024-10-18T14:56:07+00:00"
},
{
"name": "sebastian/complexity",
- "version": "3.1.0",
+ "version": "3.2.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
- "reference": "68cfb347a44871f01e33ab0ef8215966432f6957"
+ "reference": "68ff824baeae169ec9f2137158ee529584553799"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957",
- "reference": "68cfb347a44871f01e33ab0ef8215966432f6957",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799",
+ "reference": "68ff824baeae169ec9f2137158ee529584553799",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.10",
+ "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=8.1"
},
"require-dev": {
@@ -8784,7 +8995,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.1-dev"
+ "dev-main": "3.2-dev"
}
},
"autoload": {
@@ -8808,7 +9019,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
"security": "https://github.com/sebastianbergmann/complexity/security/policy",
- "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0"
+ "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0"
},
"funding": [
{
@@ -8816,20 +9027,20 @@
"type": "github"
}
],
- "time": "2023-09-28T11:50:59+00:00"
+ "time": "2023-12-21T08:37:17+00:00"
},
{
"name": "sebastian/diff",
- "version": "5.0.3",
+ "version": "5.1.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b"
+ "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b",
- "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e",
+ "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e",
"shasum": ""
},
"require": {
@@ -8837,12 +9048,12 @@
},
"require-dev": {
"phpunit/phpunit": "^10.0",
- "symfony/process": "^4.2 || ^5"
+ "symfony/process": "^6.4"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.0-dev"
+ "dev-main": "5.1-dev"
}
},
"autoload": {
@@ -8875,7 +9086,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy",
- "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3"
+ "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1"
},
"funding": [
{
@@ -8883,20 +9094,20 @@
"type": "github"
}
],
- "time": "2023-05-01T07:48:21+00:00"
+ "time": "2024-03-02T07:15:17+00:00"
},
{
"name": "sebastian/environment",
- "version": "6.0.1",
+ "version": "6.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951"
+ "reference": "8074dbcd93529b357029f5cc5058fd3e43666984"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951",
- "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984",
+ "reference": "8074dbcd93529b357029f5cc5058fd3e43666984",
"shasum": ""
},
"require": {
@@ -8911,7 +9122,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "6.0-dev"
+ "dev-main": "6.1-dev"
}
},
"autoload": {
@@ -8939,7 +9150,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
"security": "https://github.com/sebastianbergmann/environment/security/policy",
- "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1"
+ "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0"
},
"funding": [
{
@@ -8947,20 +9158,20 @@
"type": "github"
}
],
- "time": "2023-04-11T05:39:26+00:00"
+ "time": "2024-03-23T08:47:14+00:00"
},
{
"name": "sebastian/exporter",
- "version": "5.1.1",
+ "version": "5.1.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc"
+ "reference": "955288482d97c19a372d3f31006ab3f37da47adf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc",
- "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf",
+ "reference": "955288482d97c19a372d3f31006ab3f37da47adf",
"shasum": ""
},
"require": {
@@ -9017,7 +9228,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"security": "https://github.com/sebastianbergmann/exporter/security/policy",
- "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1"
+ "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2"
},
"funding": [
{
@@ -9025,20 +9236,20 @@
"type": "github"
}
],
- "time": "2023-09-24T13:22:09+00:00"
+ "time": "2024-03-02T07:17:12+00:00"
},
{
"name": "sebastian/global-state",
- "version": "6.0.1",
+ "version": "6.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4"
+ "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4",
- "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
+ "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
"shasum": ""
},
"require": {
@@ -9072,14 +9283,14 @@
}
],
"description": "Snapshotting of global state",
- "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "homepage": "https://www.github.com/sebastianbergmann/global-state",
"keywords": [
"global state"
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
"security": "https://github.com/sebastianbergmann/global-state/security/policy",
- "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1"
+ "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2"
},
"funding": [
{
@@ -9087,24 +9298,24 @@
"type": "github"
}
],
- "time": "2023-07-19T07:19:23+00:00"
+ "time": "2024-03-02T07:19:19+00:00"
},
{
"name": "sebastian/lines-of-code",
- "version": "2.0.1",
+ "version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d"
+ "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d",
- "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0",
+ "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.10",
+ "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=8.1"
},
"require-dev": {
@@ -9137,7 +9348,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
- "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1"
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2"
},
"funding": [
{
@@ -9145,7 +9356,7 @@
"type": "github"
}
],
- "time": "2023-08-31T09:25:50+00:00"
+ "time": "2023-12-21T08:38:20+00:00"
},
{
"name": "sebastian/object-enumerator",
@@ -9433,26 +9644,27 @@
},
{
"name": "spatie/backtrace",
- "version": "1.5.3",
+ "version": "1.7.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/backtrace.git",
- "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab"
+ "reference": "0f2477c520e3729de58e061b8192f161c99f770b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/backtrace/zipball/483f76a82964a0431aa836b6ed0edde0c248e3ab",
- "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab",
+ "url": "https://api.github.com/repos/spatie/backtrace/zipball/0f2477c520e3729de58e061b8192f161c99f770b",
+ "reference": "0f2477c520e3729de58e061b8192f161c99f770b",
"shasum": ""
},
"require": {
- "php": "^7.3|^8.0"
+ "php": "^7.3 || ^8.0"
},
"require-dev": {
"ext-json": "*",
- "phpunit/phpunit": "^9.3",
- "spatie/phpunit-snapshot-assertions": "^4.2",
- "symfony/var-dumper": "^5.1"
+ "laravel/serializable-closure": "^1.3 || ^2.0",
+ "phpunit/phpunit": "^9.3 || ^11.4.3",
+ "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1.6",
+ "symfony/var-dumper": "^5.1 || ^6.0 || ^7.0"
},
"type": "library",
"autoload": {
@@ -9479,7 +9691,7 @@
"spatie"
],
"support": {
- "source": "https://github.com/spatie/backtrace/tree/1.5.3"
+ "source": "https://github.com/spatie/backtrace/tree/1.7.1"
},
"funding": [
{
@@ -9491,27 +9703,100 @@
"type": "other"
}
],
- "time": "2023-06-28T12:59:17+00:00"
+ "time": "2024-12-02T13:28:15+00:00"
+ },
+ {
+ "name": "spatie/error-solutions",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/error-solutions.git",
+ "reference": "d239a65235a1eb128dfa0a4e4c4ef032ea11b541"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/error-solutions/zipball/d239a65235a1eb128dfa0a4e4c4ef032ea11b541",
+ "reference": "d239a65235a1eb128dfa0a4e4c4ef032ea11b541",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "illuminate/broadcasting": "^10.0|^11.0",
+ "illuminate/cache": "^10.0|^11.0",
+ "illuminate/support": "^10.0|^11.0",
+ "livewire/livewire": "^2.11|^3.3.5",
+ "openai-php/client": "^0.10.1",
+ "orchestra/testbench": "^7.0|8.22.3|^9.0",
+ "pestphp/pest": "^2.20",
+ "phpstan/phpstan": "^1.11",
+ "psr/simple-cache": "^3.0",
+ "psr/simple-cache-implementation": "^3.0",
+ "spatie/ray": "^1.28",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "vlucas/phpdotenv": "^5.5"
+ },
+ "suggest": {
+ "openai-php/client": "Require get solutions from OpenAI",
+ "simple-cache-implementation": "To cache solutions from OpenAI"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Spatie\\Ignition\\": "legacy/ignition",
+ "Spatie\\ErrorSolutions\\": "src",
+ "Spatie\\LaravelIgnition\\": "legacy/laravel-ignition"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ruben Van Assche",
+ "email": "ruben@spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "This is my package error-solutions",
+ "homepage": "https://github.com/spatie/error-solutions",
+ "keywords": [
+ "error-solutions",
+ "spatie"
+ ],
+ "support": {
+ "issues": "https://github.com/spatie/error-solutions/issues",
+ "source": "https://github.com/spatie/error-solutions/tree/1.1.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-11T09:51:56+00:00"
},
{
"name": "spatie/flare-client-php",
- "version": "1.4.3",
+ "version": "1.10.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/flare-client-php.git",
- "reference": "5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec"
+ "reference": "140a42b2c5d59ac4ecf8f5b493386a4f2eb28272"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec",
- "reference": "5db2fdd743c3ede33f2a5367d89ec1a7c9c1d1ec",
+ "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/140a42b2c5d59ac4ecf8f5b493386a4f2eb28272",
+ "reference": "140a42b2c5d59ac4ecf8f5b493386a4f2eb28272",
"shasum": ""
},
"require": {
"illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0",
- "nesbot/carbon": "^2.62.1",
"php": "^8.0",
- "spatie/backtrace": "^1.5.2",
+ "spatie/backtrace": "^1.6.1",
"symfony/http-foundation": "^5.2|^6.0|^7.0",
"symfony/mime": "^5.2|^6.0|^7.0",
"symfony/process": "^5.2|^6.0|^7.0",
@@ -9523,7 +9808,7 @@
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan-deprecation-rules": "^1.0",
"phpstan/phpstan-phpunit": "^1.0",
- "spatie/phpunit-snapshot-assertions": "^4.0|^5.0"
+ "spatie/pest-plugin-snapshots": "^1.0|^2.0"
},
"type": "library",
"extra": {
@@ -9553,7 +9838,7 @@
],
"support": {
"issues": "https://github.com/spatie/flare-client-php/issues",
- "source": "https://github.com/spatie/flare-client-php/tree/1.4.3"
+ "source": "https://github.com/spatie/flare-client-php/tree/1.10.0"
},
"funding": [
{
@@ -9561,28 +9846,28 @@
"type": "github"
}
],
- "time": "2023-10-17T15:54:07+00:00"
+ "time": "2024-12-02T14:30:06+00:00"
},
{
"name": "spatie/ignition",
- "version": "1.11.3",
+ "version": "1.15.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/ignition.git",
- "reference": "3d886de644ff7a5b42e4d27c1e1f67c8b5f00044"
+ "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/ignition/zipball/3d886de644ff7a5b42e4d27c1e1f67c8b5f00044",
- "reference": "3d886de644ff7a5b42e4d27c1e1f67c8b5f00044",
+ "url": "https://api.github.com/repos/spatie/ignition/zipball/e3a68e137371e1eb9edc7f78ffa733f3b98991d2",
+ "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2",
"shasum": ""
},
"require": {
"ext-json": "*",
"ext-mbstring": "*",
"php": "^8.0",
- "spatie/backtrace": "^1.5.3",
- "spatie/flare-client-php": "^1.4.0",
+ "spatie/error-solutions": "^1.0",
+ "spatie/flare-client-php": "^1.7",
"symfony/console": "^5.4|^6.0|^7.0",
"symfony/var-dumper": "^5.4|^6.0|^7.0"
},
@@ -9644,42 +9929,41 @@
"type": "github"
}
],
- "time": "2023-10-18T14:09:40+00:00"
+ "time": "2024-06-12T14:55:22+00:00"
},
{
"name": "spatie/laravel-ignition",
- "version": "2.3.3",
+ "version": "2.9.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-ignition.git",
- "reference": "66499cd3c858642ded56dafb8fa0352057ca20dd"
+ "reference": "62042df15314b829d0f26e02108f559018e2aad0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/66499cd3c858642ded56dafb8fa0352057ca20dd",
- "reference": "66499cd3c858642ded56dafb8fa0352057ca20dd",
+ "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/62042df15314b829d0f26e02108f559018e2aad0",
+ "reference": "62042df15314b829d0f26e02108f559018e2aad0",
"shasum": ""
},
"require": {
"ext-curl": "*",
"ext-json": "*",
"ext-mbstring": "*",
- "illuminate/support": "^10.0",
+ "illuminate/support": "^10.0|^11.0",
"php": "^8.1",
- "spatie/flare-client-php": "^1.3.5",
- "spatie/ignition": "^1.9",
- "symfony/console": "^6.2.3",
- "symfony/var-dumper": "^6.2.3"
+ "spatie/ignition": "^1.15",
+ "symfony/console": "^6.2.3|^7.0",
+ "symfony/var-dumper": "^6.2.3|^7.0"
},
"require-dev": {
- "livewire/livewire": "^2.11",
+ "livewire/livewire": "^2.11|^3.3.5",
"mockery/mockery": "^1.5.1",
- "openai-php/client": "^0.3.4",
- "orchestra/testbench": "^8.0",
- "pestphp/pest": "^1.22.3",
- "phpstan/extension-installer": "^1.2",
+ "openai-php/client": "^0.8.1",
+ "orchestra/testbench": "8.22.3|^9.0",
+ "pestphp/pest": "^2.34",
+ "phpstan/extension-installer": "^1.3.1",
"phpstan/phpstan-deprecation-rules": "^1.1.1",
- "phpstan/phpstan-phpunit": "^1.3.3",
+ "phpstan/phpstan-phpunit": "^1.3.16",
"vlucas/phpdotenv": "^5.5"
},
"suggest": {
@@ -9689,12 +9973,12 @@
"type": "library",
"extra": {
"laravel": {
- "providers": [
- "Spatie\\LaravelIgnition\\IgnitionServiceProvider"
- ],
"aliases": {
"Flare": "Spatie\\LaravelIgnition\\Facades\\Flare"
- }
+ },
+ "providers": [
+ "Spatie\\LaravelIgnition\\IgnitionServiceProvider"
+ ]
}
},
"autoload": {
@@ -9736,20 +10020,20 @@
"type": "github"
}
],
- "time": "2023-12-21T09:43:05+00:00"
+ "time": "2024-12-02T08:43:31+00:00"
},
{
"name": "theseer/tokenizer",
- "version": "1.2.2",
+ "version": "1.2.3",
"source": {
"type": "git",
"url": "https://github.com/theseer/tokenizer.git",
- "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96"
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96",
- "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
"shasum": ""
},
"require": {
@@ -9778,7 +10062,7 @@
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": {
"issues": "https://github.com/theseer/tokenizer/issues",
- "source": "https://github.com/theseer/tokenizer/tree/1.2.2"
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
},
"funding": [
{
@@ -9786,7 +10070,7 @@
"type": "github"
}
],
- "time": "2023-11-20T00:12:19+00:00"
+ "time": "2024-03-03T12:36:25+00:00"
}
],
"aliases": [],
diff --git a/config/fortify.php b/config/fortify.php
index 85501c00d3..a1b4d80595 100644
--- a/config/fortify.php
+++ b/config/fortify.php
@@ -89,7 +89,7 @@
|
*/
- 'middleware' => ['web', \Spatie\Honeypot\ProtectAgainstSpam::class],
+ 'middleware' => ['web', Spatie\Honeypot\ProtectAgainstSpam::class],
/*
|--------------------------------------------------------------------------
diff --git a/config/honeypot.php b/config/honeypot.php
index 78f31ea3ee..cfc68dc348 100644
--- a/config/honeypot.php
+++ b/config/honeypot.php
@@ -62,5 +62,5 @@
* rules for a request. In most cases, you shouldn't change
* this value.
*/
- 'spam_protection' => \Spatie\Honeypot\SpamProtection::class,
+ 'spam_protection' => Spatie\Honeypot\SpamProtection::class,
];
diff --git a/config/logging.php b/config/logging.php
index a235a2d29f..634c964287 100644
--- a/config/logging.php
+++ b/config/logging.php
@@ -89,6 +89,13 @@
'driver' => 'errorlog',
'level' => 'debug',
],
+
+ 'throttle' => [
+ 'driver' => 'daily',
+ 'path' => storage_path('logs/throttle.log'),
+ 'level' => 'info',
+ 'days' => 14,
+ ],
],
];
diff --git a/config/lorekeeper/admin_sidebar.php b/config/lorekeeper/admin_sidebar.php
index fa77891a09..409c62f00d 100644
--- a/config/lorekeeper/admin_sidebar.php
+++ b/config/lorekeeper/admin_sidebar.php
@@ -23,7 +23,7 @@
],
[
'name' => 'Admin Logs',
- 'url' => 'admin/logs',
+ 'url' => 'admin/admin-logs',
],
[
'name' => 'Staff Reward Settings',
@@ -194,6 +194,10 @@
'name' => 'Items',
'url' => 'admin/data/items',
],
+ [
+ 'name' => 'Dynamic Limits',
+ 'url' => 'admin/data/limits',
+ ],
],
],
'Raffles' => [
@@ -220,6 +224,10 @@
'name' => 'File Manager',
'url' => 'admin/files',
],
+ [
+ 'name' => 'Log Viewer',
+ 'url' => 'admin/logs',
+ ],
],
],
];
diff --git a/config/lorekeeper/extensions.php b/config/lorekeeper/extensions.php
index 97106f28cb..69b65bde8b 100644
--- a/config/lorekeeper/extensions.php
+++ b/config/lorekeeper/extensions.php
@@ -22,10 +22,18 @@
// Navbar News Notif - Juni
'navbar_news_notif' => 0,
- // Species Trait Index - Mercury
- 'species_trait_index' => [
- 'enable' => 0,
- 'trait_modals' => 0, // Enables modals when you click on a trait for more info instead of linking to the traits page - Moif
+ /* Visual Trait Indexes
+ *
+ * Species Trait Index - Mercury
+ * Subtype Trait Index - Speedy
+ * Universal Trait Index - CHERVB
+ * Trait Modals addition - Moif
+ */
+ 'visual_trait_index' => [
+ 'enable_species_index' => 0, // Enables the Species Trait Index
+ 'enable_subtype_index' => 0, // Enables the Subtype Trait Index
+ 'enable_universal_index' => 0, // Enables the Universal Trait Index
+ 'trait_modals' => 0, // Enables modals when you click on a trait for more info instead of linking to the traits page
],
// Character Status Badges - Juni
@@ -44,7 +52,6 @@
'loot_tables' => [
// Adds the ability to use either rarity criteria for items or item categories with rarity criteria in loot tables. Note that disabling this does not apply retroactively.
'enable' => 0,
- 'alternate_filtering' => 0, // By default this uses more broadly compatible methods to filter by rarity. If you are on Dreamhost/know your DB software can handle searching in JSON, it's recommended to set this to 1 instead.
],
],
@@ -106,4 +113,18 @@
// Use ReCaptcha to check new user registrations - Mercury
// Requires site key and secret be set in your .env file!
'use_recaptcha' => 0,
+
+ // Show Small Badges on the User's Characters/MYO Slots Page
+ // Indicating Trading Status (and Gift Art & Gift Writing Status)
+ 'badges_on_user_character_page' => 0,
+
+ // Allow users to return a pending design update to drafts, for instance if they make a mistake. - Uri
+ 'design_return_to_draft' => 1,
+
+ // Multiple Subtypes - Newt
+ 'exclusionary_search' => 0, // If enabled, searching for multiple subtypes will only return results that have all of the subtypes specified. If disabled, it will return results that have any of the subtypes specified.
+ 'multiple_subtype_limit' => 10, // The maximum number of subtypes a character can have.
+
+ // TinyMCE Code Editor - Moif
+ 'tinymce_code_editor' => 1, // If enabled, uses the more advanced code editor instead of TinyMCE's default.
];
diff --git a/config/lorekeeper/image_files.php b/config/lorekeeper/image_files.php
index 936120afdb..70b1bc562a 100644
--- a/config/lorekeeper/image_files.php
+++ b/config/lorekeeper/image_files.php
@@ -59,7 +59,7 @@
],
'content_warning' => [
'name' => 'Content Warning Thumbnail',
- 'description' => 'Thumbnail used for gallery submissions with a set content warning. PNG format, size of masterlist thumbnails.',
- 'filename' => 'content_warning.png',
+ 'description' => 'Thumbnail used for characters and gallery submissions with a set content warning. PNG format, size of masterlist thumbnails.',
+ 'filename' => 'content-warning.png',
],
];
diff --git a/config/lorekeeper/item_tags.php b/config/lorekeeper/item_tags.php
index 3435be8b6a..9323dbe922 100644
--- a/config/lorekeeper/item_tags.php
+++ b/config/lorekeeper/item_tags.php
@@ -24,4 +24,10 @@
'text_color' => '#ffffff',
'background_color' => '#1fd1a7',
],
+
+ 'coupon' => [
+ 'name' => 'Coupon',
+ 'text_color' => '#ffffff',
+ 'background_color' => '#ff5ca8',
+ ],
];
diff --git a/config/lorekeeper/limits.php b/config/lorekeeper/limits.php
new file mode 100644
index 0000000000..7622261ef2
--- /dev/null
+++ b/config/lorekeeper/limits.php
@@ -0,0 +1,23 @@
+ [
+ 'prompt' => [
+ 'name' => 'Prompts',
+ 'description' => 'Prompt limits require a user to have submitted to the specified prompt a certain number of times.',
+ ],
+ 'item' => [
+ 'name' => 'Items',
+ 'description' => 'Item limits require a user to have a certain number of items in their inventory.',
+ ],
+ 'currency' => [
+ 'name' => 'Currency',
+ 'description' => 'Currency limits require a user to have a certain amount of currency.',
+ ],
+ 'dynamic' => [
+ 'name' => 'Dynamic',
+ 'description' => 'Dynamic limits require a user to meet a certain condition. The condition is evaluated at runtime.',
+ ],
+ ],
+];
diff --git a/config/lorekeeper/settings.php b/config/lorekeeper/settings.php
index 5b8e020b40..74cfe46ca8 100644
--- a/config/lorekeeper/settings.php
+++ b/config/lorekeeper/settings.php
@@ -52,7 +52,7 @@
/*
|--------------------------------------------------------------------------
- | Alias Requirement
+ | Alias | Email Requirement
|--------------------------------------------------------------------------
|
| Whether or not users are required to link an off-site account to access
@@ -62,8 +62,13 @@
| (e.g. ownership checking for characters only associated with an off-site account)
| will still work provided users link the relevant alias(es).
|
+ | The email option functions as a fallback for users who register with an off-site provider.
+ | If they do not have an email associated with their off-site account, they will be prompted to
+ | provide one on registration / login / site interaction (if this setting is enabled).
+ |
*/
'require_alias' => 1,
+ 'require_email' => 1,
/*
|--------------------------------------------------------------------------
@@ -237,7 +242,7 @@
| It will automatically add transparent borders to the images to make them square,
| based on the bigger dimension (between width/height).
| Thumbnails will effectively be small previews of the full masterlist images.
- | This feature will not replace the manual uploading of thumbnails.
+ | This feature does not disable the manual uploading of thumbnail images.
|
| Simply change to "1" to enable, or keep at "0" to disable.
|
@@ -246,23 +251,42 @@
/*
|--------------------------------------------------------------------------
- | Masterlist Image Automation Removing Manual Upload For Users
+ | Masterlist Image Automation Hide Manual Thumbnail
|--------------------------------------------------------------------------
|
- | NOTE: This feature will only function if the above feature, the
- | Masterlist Image Automation Replacing Cropper, is also enabled.
+ | NOTE: If the "Masterlist Image Automation Replacing Cropper"
+ | setting above is disabled, this setting has no effect.
|
- | The following option is for if you DO want to disable the manual uploading
- | of thumbnails, to ensure users do not attempt to upload their
- | own thumbnails regardless of the automation.
- | This will remove it purely for users, not administration.
+ | This disables the option for users to manually upload their own
+ | thumbnail images in design updates, including use of the cropper.
+ | Note that this does not prevent permissioned staff from uploading
+ | custom thumbnail images.
|
- | 0: Keeps the manual thumbnail upload for users.
- | 1: Hides the thumbnail upload for users.
+ | 0: Allows custom thumbnail uploads.
+ | 1: Disallows custom thumbnail uploads.
|
*/
'masterlist_image_automation_hide_manual_thumbnail' => 0,
+ /*
+ |--------------------------------------------------------------------------
+ | Remove Manual Thumbnail Image Upload
+ |--------------------------------------------------------------------------
+ |
+ | NOTE: If the "Masterlist Image Automation Hide Manual Thumbnail"
+ | setting above is enabled, this setting has no effect.
+ |
+ | This disables the option for users to manually upload their own
+ | thumbnail images in design updates, requiring use of the cropper.
+ | Note that this does not prevent permissioned staff from uploading
+ | custom thumbnail images.
+ |
+ | 0: Allows custom thumbnail uploads.
+ | 1: Disallows custom thumbnail uploads.
+ |
+ */
+ 'hide_manual_thumbnail_image_upload' => 0,
+
/*
|--------------------------------------------------------------------------
| Gallery Image Settings
@@ -341,4 +365,68 @@
|
*/
'wysiwyg_comments' => 1,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Allow Gallery Submissions on Prompts
+ |--------------------------------------------------------------------------
+ |
+ | Whether or not to allow gallery submissions on prompts.
+ |
+ */
+ 'allow_gallery_submissions_on_prompts' => 1,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Hideable Textarea on Gallery Submissions
+ |--------------------------------------------------------------------------
+ |
+ | Whether or not to be able to hide the textarea on gallery Submissions.
+ |
+ | enable: Set to 1 to show a button to hide the textarea.
+ |
+ | on_image Set to 1 to auto-hide on image upload- will only work
+ | if 'enable' is set to 1.
+ |
+ */
+ 'hide_textarea_on_gallery_submissions' => [
+ 'enable' => 0,
+ 'on_image' => 0,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Site FontAwesome Icon Version
+ |--------------------------------------------------------------------------
+ |
+ | What version of FontAwesome the site uses.
+ | 0: Version 5. (Default) 1: Version 6.
+ | 2: A mixed version where icons with v5 classes (i.e. fas) show
+ | the v5 icons and icons with v6 classes (i.e. fa-solid) show the v6 icons.
+ |
+ */
+ 'fa_version' => 0,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Site Logging Webhook
+ |--------------------------------------------------------------------------
+ |
+ | This is the webhook URL for site actions logging.
+ | This is used to send a webhook to the site administrators alerting them
+ | of any actions that may be considered suspicious or harmful.
+ | This is intended to be a Discord webhook, but can be used with other services with minor modifications.
+ |
+ */
+ 'site_logging_webhook' => env('SITE_LOGGING_WEBHOOK', null),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Enable Character Content Warnings
+ |--------------------------------------------------------------------------
+ |
+ | Allows characters to have content warnings.
+ |
+ */
+ 'enable_character_content_warnings' => 1,
];
diff --git a/config/lorekeeper/sites.php b/config/lorekeeper/sites.php
index 3b668b05e9..16b358eb71 100644
--- a/config/lorekeeper/sites.php
+++ b/config/lorekeeper/sites.php
@@ -125,6 +125,7 @@
'full_name' => 'Artstation',
'display_name' => 'artstation',
'regex' => '/artstation\.com\/([A-Za-z0-9_-]+)/',
+ 'icon' => 'fab fa-artstation',
'link' => 'artstation.com',
],
@@ -132,6 +133,15 @@
'full_name' => 'Picarto',
'display_name' => 'picarto',
'regex' => '/picarto\.tv\/([A-Za-z0-9_-]+)/',
+ 'icon' => 'fas fa-brush',
'link' => 'picarto.tv',
],
+
+ 'furaffinity' => [
+ 'full_name' => 'Furaffinity',
+ 'display_name' => 'FA',
+ 'regex' => '/furaffinity\.net\/user\/([A-Za-z0-9_-]+)/',
+ 'icon' => 'fas fa-paw',
+ 'link' => 'furaffinity.net',
+ ],
];
diff --git a/database/migrations/2020_06_15_232619_add_sender_recipient_type_to_character_items_log.php b/database/migrations/2020_06_15_232619_add_sender_recipient_type_to_character_items_log.php
index ef31e1263f..0349b65dbe 100644
--- a/database/migrations/2020_06_15_232619_add_sender_recipient_type_to_character_items_log.php
+++ b/database/migrations/2020_06_15_232619_add_sender_recipient_type_to_character_items_log.php
@@ -10,7 +10,7 @@ class AddSenderRecipientTypeToCharacterItemsLog extends Migration {
*/
public function up() {
Schema::table('character_items_log', function (Blueprint $table) {
- //Add sender and recipient type
+ // Add sender and recipient type
$table->enum('sender_type', ['User', 'Character'])->nullable()->default(null);
$table->enum('recipient_type', ['User', 'Character'])->nullable()->default(null);
});
diff --git a/database/migrations/2020_06_16_182516_adjust_item_logs_for_character_items.php b/database/migrations/2020_06_16_182516_adjust_item_logs_for_character_items.php
index ad3253fad5..d4ee212ea9 100644
--- a/database/migrations/2020_06_16_182516_adjust_item_logs_for_character_items.php
+++ b/database/migrations/2020_06_16_182516_adjust_item_logs_for_character_items.php
@@ -9,13 +9,13 @@ class AdjustItemLogsForCharacterItems extends Migration {
* Run the migrations.
*/
public function up() {
- //Drop character item logs table in favor of adjusting existing logs table to suit
+ // Drop character item logs table in favor of adjusting existing logs table to suit
Schema::dropIfExists('character_items_log');
Schema::rename('user_items_log', 'items_log');
Schema::table('items_log', function (Blueprint $table) {
- //Add sender and recipient type. Set default user to account for preexisting rows
+ // Add sender and recipient type. Set default user to account for preexisting rows
$table->enum('sender_type', ['User', 'Character'])->nullable()->default('User');
$table->enum('recipient_type', ['User', 'Character'])->nullable()->default('User');
});
@@ -48,7 +48,7 @@ public function down() {
Schema::rename('items_log', 'user_items_log');
Schema::table('user_items_log', function (Blueprint $table) {
- //There isn't actually undoing the renaming of the keys but we live with that
+ // There isn't actually undoing the renaming of the keys but we live with that
$table->dropColumn('sender_type');
$table->dropColumn('recipient_type');
});
diff --git a/database/migrations/2020_06_16_203821_set_items_log_sender_recipient_default_null.php b/database/migrations/2020_06_16_203821_set_items_log_sender_recipient_default_null.php
index 1779a2eb3e..195e366df2 100644
--- a/database/migrations/2020_06_16_203821_set_items_log_sender_recipient_default_null.php
+++ b/database/migrations/2020_06_16_203821_set_items_log_sender_recipient_default_null.php
@@ -9,12 +9,12 @@ class SetItemsLogSenderRecipientDefaultNull extends Migration {
* Run the migrations.
*/
public function up() {
- //Change default to null going forward
+ // Change default to null going forward
DB::statement("ALTER TABLE items_log CHANGE COLUMN sender_type sender_type ENUM('User', 'Character') DEFAULT NULL");
DB::statement("ALTER TABLE items_log CHANGE COLUMN recipient_type recipient_type ENUM('User', 'Character') DEFAULT NULL");
Schema::table('items_log', function (Blueprint $table) {
- //Actually drop them this time, please. Also drop the item_id column
+ // Actually drop them this time, please. Also drop the item_id column
$table->dropForeign('inventory_log_sender_id_foreign');
$table->dropForeign('inventory_log_recipient_id_foreign');
$table->dropForeign('user_items_log_stack_id_foreign');
diff --git a/database/migrations/2020_10_08_081102_add_sub_masterlist.php b/database/migrations/2020_10_08_081102_add_sub_masterlist.php
index 8b513981f2..8d1da4104c 100644
--- a/database/migrations/2020_10_08_081102_add_sub_masterlist.php
+++ b/database/migrations/2020_10_08_081102_add_sub_masterlist.php
@@ -10,16 +10,16 @@ class AddSubMasterlist extends Migration {
*/
public function up() {
Schema::table('character_categories', function (Blueprint $table) {
- //adds a setting on character categories which moves those characters to a second masterlist
- //this allows for an NPC masterlist, or a PET masterlist, or a MNT (mount) masterlist
- //0 is main masterlist
+ // adds a setting on character categories which moves those characters to a second masterlist
+ // this allows for an NPC masterlist, or a PET masterlist, or a MNT (mount) masterlist
+ // 0 is main masterlist
$table->integer('masterlist_sub_id')->default(0);
});
Schema::table('specieses', function (Blueprint $table) {
- //adds a setting on species which moves those species to a second masterlist
- //this allows for an NPC masterlist, or a PET masterlist, or a MNT (mount) masterlist
- //0 is main masterlist
+ // adds a setting on species which moves those species to a second masterlist
+ // this allows for an NPC masterlist, or a PET masterlist, or a MNT (mount) masterlist
+ // 0 is main masterlist
$table->integer('masterlist_sub_id')->default(0);
});
@@ -29,7 +29,7 @@ public function up() {
$table->increments('id');
$table->string('name');
$table->string('key');
- $table->integer('show_main')->default(0); //whether or not its characters show up on the main masterlist
+ $table->integer('show_main')->default(0); // whether or not its characters show up on the main masterlist
$table->integer('sort')->unsigned()->default(0);
});
}
diff --git a/database/migrations/2020_11_19_201307_add_admin_shops.php b/database/migrations/2020_11_19_201307_add_admin_shops.php
new file mode 100644
index 0000000000..c7f578d259
--- /dev/null
+++ b/database/migrations/2020_11_19_201307_add_admin_shops.php
@@ -0,0 +1,31 @@
+boolean('is_staff')->default(0);
+ $table->boolean('use_coupons')->default(0);
+ $table->boolean('is_restricted')->default(0);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ //
+ Schema::table('shops', function (Blueprint $table) {
+ $table->dropColumn('is_staff');
+ $table->dropColumn('use_coupons');
+ $table->dropColumn('is_restricted');
+ });
+ }
+}
diff --git a/database/migrations/2020_11_19_205400_add_shop_restriction_table.php b/database/migrations/2020_11_19_205400_add_shop_restriction_table.php
new file mode 100644
index 0000000000..6ab65b0237
--- /dev/null
+++ b/database/migrations/2020_11_19_205400_add_shop_restriction_table.php
@@ -0,0 +1,27 @@
+increments('id');
+ $table->integer('shop_id');
+ $table->integer('item_id');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ //
+ Schema::dropIfExists('shop_limits');
+ }
+}
diff --git a/database/migrations/2020_11_26_161652_add_fto_shops.php b/database/migrations/2020_11_26_161652_add_fto_shops.php
new file mode 100644
index 0000000000..db1500d15d
--- /dev/null
+++ b/database/migrations/2020_11_26_161652_add_fto_shops.php
@@ -0,0 +1,35 @@
+boolean('is_fto')->default(0);
+ });
+
+ Schema::table('shop_stock', function (Blueprint $table) {
+ $table->boolean('is_fto')->default(0);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ //
+ Schema::table('shops', function (Blueprint $table) {
+ $table->dropColumn('is_fto');
+ });
+
+ Schema::table('shop_stock', function (Blueprint $table) {
+ $table->dropColumn('is_fto');
+ });
+ }
+}
diff --git a/database/migrations/2021_05_19_123518_change_birthday_column_type.php b/database/migrations/2021_05_19_123518_change_birthday_column_type.php
index 5f79666d22..2baa371ce6 100644
--- a/database/migrations/2021_05_19_123518_change_birthday_column_type.php
+++ b/database/migrations/2021_05_19_123518_change_birthday_column_type.php
@@ -19,7 +19,7 @@ public function up() {
* Reverse the migrations.
*/
public function down() {
- //#
+ // #
Schema::table('users', function (Blueprint $table) {
$table->timestamp('birthday')->default(null)->change();
});
diff --git a/database/migrations/2021_09_02_193957_add_shop_stock_type.php b/database/migrations/2021_09_02_193957_add_shop_stock_type.php
new file mode 100644
index 0000000000..946e8e1233
--- /dev/null
+++ b/database/migrations/2021_09_02_193957_add_shop_stock_type.php
@@ -0,0 +1,27 @@
+string('stock_type')->default('Item');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ //
+ Schema::table('shop_stock', function (Blueprint $table) {
+ $table->dropColumn('stock_type');
+ });
+ }
+}
diff --git a/database/migrations/2021_10_13_185131_make_shop_cost_float.php b/database/migrations/2021_10_13_185131_make_shop_cost_float.php
new file mode 100644
index 0000000000..3c362d4b77
--- /dev/null
+++ b/database/migrations/2021_10_13_185131_make_shop_cost_float.php
@@ -0,0 +1,27 @@
+float('cost')->change();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ //
+ Schema::table('shop_stock', function (Blueprint $table) {
+ $table->integer('cost')->change();
+ });
+ }
+}
diff --git a/database/migrations/2021_10_14_044223_make_shop_log_float.php b/database/migrations/2021_10_14_044223_make_shop_log_float.php
new file mode 100644
index 0000000000..93e6a77cab
--- /dev/null
+++ b/database/migrations/2021_10_14_044223_make_shop_log_float.php
@@ -0,0 +1,27 @@
+float('cost')->change();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ //
+ Schema::table('shop_log', function (Blueprint $table) {
+ $table->integer('cost')->change();
+ });
+ }
+}
diff --git a/database/migrations/2021_12_15_102154_add_visble_to_stock.php b/database/migrations/2021_12_15_102154_add_visble_to_stock.php
new file mode 100644
index 0000000000..2592ff0694
--- /dev/null
+++ b/database/migrations/2021_12_15_102154_add_visble_to_stock.php
@@ -0,0 +1,27 @@
+boolean('is_visible')->default(true);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ Schema::table('shop_stock', function (Blueprint $table) {
+ //
+ $table->dropColumn('is_visible');
+ });
+ }
+}
diff --git a/database/migrations/2022_02_06_131334_add_restock_to_shop_stock.php b/database/migrations/2022_02_06_131334_add_restock_to_shop_stock.php
new file mode 100644
index 0000000000..3f354eb38b
--- /dev/null
+++ b/database/migrations/2022_02_06_131334_add_restock_to_shop_stock.php
@@ -0,0 +1,33 @@
+boolean('restock')->default(false);
+ $table->unsignedInteger('restock_quantity')->default(1);
+ $table->unsignedInteger('restock_interval')->default(2);
+ $table->boolean('range')->default(false);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ Schema::table('shop_stock', function (Blueprint $table) {
+ //
+ $table->dropColumn('restock');
+ $table->dropColumn('restock_quantity');
+ $table->dropColumn('restock_interval');
+ $table->dropColumn('range');
+ });
+ }
+}
diff --git a/database/migrations/2022_03_01_094114_add_disallow_transfer_option_to_shop_stock.php b/database/migrations/2022_03_01_094114_add_disallow_transfer_option_to_shop_stock.php
new file mode 100644
index 0000000000..2150e8d1fd
--- /dev/null
+++ b/database/migrations/2022_03_01_094114_add_disallow_transfer_option_to_shop_stock.php
@@ -0,0 +1,27 @@
+boolean('disallow_transfer')->default(false);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ Schema::table('shop_stock', function (Blueprint $table) {
+ //
+ $table->dropColumn('disallow_transfer');
+ });
+ }
+}
diff --git a/database/migrations/2022_03_17_123003_add_allowed_coupons_to_shops.php b/database/migrations/2022_03_17_123003_add_allowed_coupons_to_shops.php
new file mode 100644
index 0000000000..1903f62663
--- /dev/null
+++ b/database/migrations/2022_03_17_123003_add_allowed_coupons_to_shops.php
@@ -0,0 +1,27 @@
+string('allowed_coupons')->nullable()->default(null);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ Schema::table('shops', function (Blueprint $table) {
+ //
+ $table->dropColumn('allowed_coupons');
+ });
+ }
+}
diff --git a/database/migrations/2022_05_16_211400_add_purchase_limit_timeframe_to_shop_stock.php b/database/migrations/2022_05_16_211400_add_purchase_limit_timeframe_to_shop_stock.php
new file mode 100644
index 0000000000..c12fdbe564
--- /dev/null
+++ b/database/migrations/2022_05_16_211400_add_purchase_limit_timeframe_to_shop_stock.php
@@ -0,0 +1,25 @@
+text('purchase_limit_timeframe')->nullable()->default(null);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ Schema::table('shop_stock', function (Blueprint $table) {
+ $table->dropColumn('purchase_limit_timeframe');
+ });
+ }
+}
diff --git a/database/migrations/2023_03_07_002536_add_timed_stock.php b/database/migrations/2023_03_07_002536_add_timed_stock.php
new file mode 100644
index 0000000000..18e5afaa97
--- /dev/null
+++ b/database/migrations/2023_03_07_002536_add_timed_stock.php
@@ -0,0 +1,30 @@
+boolean('is_timed_stock')->default(false);
+ $table->timestamps();
+ $table->timestamp('start_at')->nullable()->default(null);
+ $table->timestamp('end_at')->nullable()->default(null);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ Schema::table('shop_stock', function (Blueprint $table) {
+ $table->dropColumn('is_timed_stock');
+ $table->dropColumn('start_at');
+ $table->dropColumn('start_at');
+ });
+ }
+}
diff --git a/database/migrations/2023_03_07_144637_add_timed_shop.php b/database/migrations/2023_03_07_144637_add_timed_shop.php
new file mode 100644
index 0000000000..099fc0769f
--- /dev/null
+++ b/database/migrations/2023_03_07_144637_add_timed_shop.php
@@ -0,0 +1,30 @@
+boolean('is_timed_shop')->default(false);
+ $table->timestamps();
+ $table->timestamp('start_at')->nullable()->default(null);
+ $table->timestamp('end_at')->nullable()->default(null);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ Schema::table('shops', function (Blueprint $table) {
+ $table->dropColumn('is_timed_shop');
+ $table->dropColumn('start_at');
+ $table->dropColumn('start_at');
+ });
+ }
+}
diff --git a/database/migrations/2023_10_12_011826_add_character_warning_to_character_images.php b/database/migrations/2023_10_12_011826_add_character_warning_to_character_images.php
new file mode 100644
index 0000000000..37eee26115
--- /dev/null
+++ b/database/migrations/2023_10_12_011826_add_character_warning_to_character_images.php
@@ -0,0 +1,35 @@
+json('content_warnings')->nullable()->default(null);
+ });
+
+ Schema::table('user_settings', function (Blueprint $table) {
+ $table->tinyInteger('content_warning_visibility')->default(0);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ Schema::table('character_images', function (Blueprint $table) {
+ //
+ $table->dropColumn('content_warnings');
+ });
+
+ Schema::table('user_settings', function (Blueprint $table) {
+ $table->dropcolumn('content_warning_visibility');
+ });
+ }
+}
diff --git a/database/migrations/2024_02_09_104441_create_currency_conversion_tables.php b/database/migrations/2024_02_09_104441_create_currency_conversion_tables.php
new file mode 100644
index 0000000000..c59a4049d5
--- /dev/null
+++ b/database/migrations/2024_02_09_104441_create_currency_conversion_tables.php
@@ -0,0 +1,25 @@
+integer('currency_id')->unsigned();
+ $table->integer('conversion_id')->unsigned();
+ $table->decimal('rate', 10, 2);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ Schema::dropIfExists('currency_conversions');
+ }
+}
diff --git a/database/migrations/2024_05_13_020617_add_deletable_to_items.php b/database/migrations/2024_05_13_020617_add_deletable_to_items.php
new file mode 100644
index 0000000000..f7c51041fe
--- /dev/null
+++ b/database/migrations/2024_05_13_020617_add_deletable_to_items.php
@@ -0,0 +1,25 @@
+boolean('is_deletable')->default(1);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ Schema::table('items', function (Blueprint $table) {
+ $table->dropColumn('is_deletable');
+ });
+ }
+}
diff --git a/database/migrations/2024_06_28_213055_add_text_accessibility.php b/database/migrations/2024_06_28_213055_add_text_accessibility.php
new file mode 100644
index 0000000000..1670a4fd59
--- /dev/null
+++ b/database/migrations/2024_06_28_213055_add_text_accessibility.php
@@ -0,0 +1,33 @@
+boolean('site_fonts_disabled')->default(0);
+ $table->decimal('font_size', 3, 2)->nullable()->default(NULL);
+ $table->decimal('letter_spacing', 3, 2)->nullable()->default(NULL);
+ $table->decimal('word_spacing', 3, 2)->nullable()->default(NULL);
+ $table->decimal('line_height', 3, 2)->nullable()->default(NULL);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ Schema::table('user_settings', function (Blueprint $table) {
+ $table->dropColumn('site_fonts_disabled');
+ $table->dropColumn('font_size');
+ $table->dropColumn('letter_spacing');
+ $table->dropColumn('word_spacing');
+ $table->dropColumn('line_height');
+ });
+ }
+};
diff --git a/database/migrations/2024_07_20_185559_create_limit_tables.php b/database/migrations/2024_07_20_185559_create_limit_tables.php
new file mode 100644
index 0000000000..36bc989f9e
--- /dev/null
+++ b/database/migrations/2024_07_20_185559_create_limit_tables.php
@@ -0,0 +1,48 @@
+id();
+ $table->string('name');
+ $table->text('description')->nullable()->default(null);
+ $table->text('evaluation')->nullable()->default(null);
+ });
+
+ Schema::create('limits', function (Blueprint $table) {
+ $table->id();
+ $table->string('object_model');
+ $table->integer('object_id');
+
+ $table->string('limit_type');
+ $table->integer('limit_id');
+ $table->integer('quantity')->nullable()->default(null);
+
+ $table->boolean('debit')->default(0);
+ $table->boolean('is_unlocked')->default(0);
+ });
+
+ Schema::create('user_unlocked_limits', function (Blueprint $table) {
+ $table->id();
+ $table->integer('user_id');
+ $table->string('object_model');
+ $table->integer('object_id');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ Schema::dropIfExists('user_unlocked_limits');
+ Schema::dropIfExists('dynamic_limits');
+ Schema::dropIfExists('limits');
+ }
+};
diff --git a/database/migrations/2024_08_28_103434_convert_character_subtypes.php b/database/migrations/2024_08_28_103434_convert_character_subtypes.php
new file mode 100644
index 0000000000..56ba058052
--- /dev/null
+++ b/database/migrations/2024_08_28_103434_convert_character_subtypes.php
@@ -0,0 +1,42 @@
+integer('character_image_id')->unsigned();
+ $table->integer('subtype_id')->unsigned();
+ });
+
+ Schema::table('design_updates', function (Blueprint $table) {
+ $table->string('subtype_ids')->nullable()->default(null);
+ });
+ }
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ //
+ Schema::dropIfExists('character_image_subtypes');
+
+ Schema::table('design_updates', function (Blueprint $table) {
+ $table->dropColumn('subtype_ids');
+ });
+
+ if (!Schema::hasColumn('design_updates', 'subtype_id')) {
+ Schema::table('design_updates', function (Blueprint $table) {
+ $table->integer('subtype_id')->unsigned()->nullable()->default(null);
+ });
+ }
+ }
+};
diff --git a/database/migrations/2024_09_04_175143_create_shop_stock_cost_table.php b/database/migrations/2024_09_04_175143_create_shop_stock_cost_table.php
new file mode 100644
index 0000000000..7365379ba6
--- /dev/null
+++ b/database/migrations/2024_09_04_175143_create_shop_stock_cost_table.php
@@ -0,0 +1,53 @@
+integer('shop_stock_id')->unsigned();
+ $table->string('cost_type');
+ $table->integer('cost_id')->unsigned();
+ $table->integer('quantity');
+
+ $table->json('group')->nullable()->default(null);
+ });
+
+ // convert all of the existing costs to the new table
+ $stocks = DB::table('shop_stock')->get();
+ foreach ($stocks as $stock) {
+ DB::table('shop_stock_costs')->insert([
+ 'shop_stock_id' => $stock->id,
+ 'cost_type' => 'Currency',
+ 'cost_id' => $stock->currency_id,
+ 'quantity' => $stock->cost,
+ ]);
+ }
+
+ Schema::table('shop_stock', function (Blueprint $table) {
+ $table->dropColumn('cost');
+ $table->dropColumn('currency_id');
+
+ $table->json('data')->nullable()->default(null);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ Schema::table('shop_stock', function (Blueprint $table) {
+ $table->integer('currency_id')->unsigned();
+ $table->integer('cost');
+
+ $table->dropColumn('data');
+ });
+
+ Schema::dropIfExists('shop_stock_costs');
+ }
+};
diff --git a/database/migrations/2024_10_06_150833_add_auto_unlock_option_to_limits.php b/database/migrations/2024_10_06_150833_add_auto_unlock_option_to_limits.php
new file mode 100644
index 0000000000..109be5d67f
--- /dev/null
+++ b/database/migrations/2024_10_06_150833_add_auto_unlock_option_to_limits.php
@@ -0,0 +1,27 @@
+boolean('is_auto_unlocked')->default(true);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ Schema::table('limits', function (Blueprint $table) {
+ //
+ $table->dropColumn('is_auto_unlocked');
+ });
+ }
+};
diff --git a/database/migrations/2024_10_25_113803_add_hidden_shop_option.php b/database/migrations/2024_10_25_113803_add_hidden_shop_option.php
new file mode 100644
index 0000000000..3086349347
--- /dev/null
+++ b/database/migrations/2024_10_25_113803_add_hidden_shop_option.php
@@ -0,0 +1,27 @@
+boolean('is_hidden')->default(false)->after('is_active');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ //
+ Schema::table('shops', function (Blueprint $table) {
+ $table->dropColumn('is_hidden');
+ });
+ }
+};
diff --git a/database/migrations/2024_11_24_191058_fix_shop_logs.php b/database/migrations/2024_11_24_191058_fix_shop_logs.php
new file mode 100644
index 0000000000..adb15ab932
--- /dev/null
+++ b/database/migrations/2024_11_24_191058_fix_shop_logs.php
@@ -0,0 +1,42 @@
+string('stock_type')->default('Item');
+ $table->json('costs')->nullable()->default(null);
+ });
+
+ // convert existing costs and then drop currency_id table
+ $logs = DB::table('shop_log')->get();
+ foreach ($logs as $log) {
+ $assets = createAssetsArray(false);
+ addAsset($assets, Currency::find($log->currency_id), $log->cost);
+ DB::table('shop_log')->where('id', $log->id)->update([
+ 'costs' => $log->character_id ? ['character' => getDataReadyAssets($assets)] : ['user' => getDataReadyAssets($assets)],
+ ]);
+ }
+
+ Schema::table('shop_log', function (Blueprint $table) {
+ $table->dropColumn('currency_id');
+ // drop cost, then change costs to cost
+ $table->dropColumn('cost');
+ $table->renameColumn('costs', 'cost');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ // not reversible
+ }
+};
diff --git a/database/migrations/2024_11_25_214120_add_extra_timed_columns_to_shops.php b/database/migrations/2024_11_25_214120_add_extra_timed_columns_to_shops.php
new file mode 100644
index 0000000000..ad560fb8f5
--- /dev/null
+++ b/database/migrations/2024_11_25_214120_add_extra_timed_columns_to_shops.php
@@ -0,0 +1,27 @@
+json('data')->nullable()->after('end_at');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ Schema::table('shops', function (Blueprint $table) {
+ //
+ $table->dropColumn('data');
+ });
+ }
+};
diff --git a/database/migrations/2025_01_02_210931_add_is_admin_to_ranks.php b/database/migrations/2025_01_02_210931_add_is_admin_to_ranks.php
new file mode 100644
index 0000000000..7c09646e1f
--- /dev/null
+++ b/database/migrations/2025_01_02_210931_add_is_admin_to_ranks.php
@@ -0,0 +1,25 @@
+boolean('is_admin')->default(0);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ Schema::table('ranks', function (Blueprint $table) {
+ $table->dropColumn('is_admin');
+ });
+ }
+};
diff --git a/database/migrations/2025_01_10_121504_create_currency_categories_table.php b/database/migrations/2025_01_10_121504_create_currency_categories_table.php
new file mode 100644
index 0000000000..b5f0e7bacf
--- /dev/null
+++ b/database/migrations/2025_01_10_121504_create_currency_categories_table.php
@@ -0,0 +1,42 @@
+engine = 'InnoDB';
+ $table->increments('id');
+
+ $table->string('name');
+ $table->integer('sort')->default(0);
+ $table->text('description')->nullable()->default(null);
+ $table->text('parsed_description')->nullable()->default(null);
+
+ $table->boolean('has_image')->default(0);
+ $table->boolean('is_visible')->default(0);
+
+ $table->string('hash', 10)->nullable()->default(null);
+ });
+
+ Schema::table('currencies', function (Blueprint $table) {
+ $table->integer('currency_category_id')->nullable()->default(null);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ Schema::dropIfExists('currency_categories');
+
+ Schema::table('currencies', function (Blueprint $table) {
+ $table->dropColumn('currency_category_id');
+ });
+ }
+};
diff --git a/database/migrations/2025_01_10_180751_add_is_visible_to_currencies.php b/database/migrations/2025_01_10_180751_add_is_visible_to_currencies.php
new file mode 100644
index 0000000000..b5e7ac4ac2
--- /dev/null
+++ b/database/migrations/2025_01_10_180751_add_is_visible_to_currencies.php
@@ -0,0 +1,26 @@
+
+boolean('is_visible')->default(1);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down() {
+ Schema::table('currencies', function (Blueprint $table) {
+ $table->dropColumn('is_visible');
+ });
+ }
+}
diff --git a/database/migrations/2025_01_21_005343_add_allow_profile_comments_option_to_user_settings.php b/database/migrations/2025_01_21_005343_add_allow_profile_comments_option_to_user_settings.php
new file mode 100644
index 0000000000..ee03904ea2
--- /dev/null
+++ b/database/migrations/2025_01_21_005343_add_allow_profile_comments_option_to_user_settings.php
@@ -0,0 +1,27 @@
+boolean('allow_profile_comments')->default(true);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void {
+ Schema::table('user_settings', function (Blueprint $table) {
+ //
+ $table->dropColumn('allow_profile_comments');
+ });
+ }
+};
diff --git a/format.sh b/format.sh
new file mode 100644
index 0000000000..8ce9a3a439
--- /dev/null
+++ b/format.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+find resources/views/ -type d | while read -r dir; do
+ blade-formatter --progress --write "$dir"/*.blade.php
+done
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 4100ffe50f..60b9af0815 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,18 +5,17 @@
"packages": {
"": {
"devDependencies": {
- "axios": "^1.6.2",
- "blade-formatter": "^1.38.6",
+ "axios": "^1.7.9",
+ "blade-formatter": "^1.42.2",
"bootstrap": "^4.6",
- "cross-env": "^7.0",
"jquery": "^3.7",
"laravel-mix": "^6.0.49",
"lodash": "^4.17.21",
- "popper.js": "^1.16",
+ "popper.js": "^1.16.1",
+ "postcss": "^8.5.2",
"resolve-url-loader": "^5.0.0",
- "sass": "^1.69.5",
- "sass-loader": "^13.3.2",
- "vue": "^3.3.13"
+ "sass": "^1.85.0",
+ "sass-loader": "^16.0.5"
}
},
"node_modules/@alloc/quick-lru": {
@@ -626,9 +625,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz",
- "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz",
+ "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -1854,6 +1853,109 @@
"node": ">=10.0.0"
}
},
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
@@ -1910,9 +2012,9 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"dev": true
},
"node_modules/@jridgewell/trace-mapping": {
@@ -1972,18 +2074,303 @@
"integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
"dev": true
},
+ "node_modules/@parcel/watcher": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz",
+ "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.4.1",
+ "@parcel/watcher-darwin-arm64": "2.4.1",
+ "@parcel/watcher-darwin-x64": "2.4.1",
+ "@parcel/watcher-freebsd-x64": "2.4.1",
+ "@parcel/watcher-linux-arm-glibc": "2.4.1",
+ "@parcel/watcher-linux-arm64-glibc": "2.4.1",
+ "@parcel/watcher-linux-arm64-musl": "2.4.1",
+ "@parcel/watcher-linux-x64-glibc": "2.4.1",
+ "@parcel/watcher-linux-x64-musl": "2.4.1",
+ "@parcel/watcher-win32-arm64": "2.4.1",
+ "@parcel/watcher-win32-ia32": "2.4.1",
+ "@parcel/watcher-win32-x64": "2.4.1"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz",
+ "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz",
+ "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz",
+ "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz",
+ "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz",
+ "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz",
+ "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz",
+ "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz",
+ "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz",
+ "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz",
+ "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-ia32": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz",
+ "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz",
+ "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@prettier/plugin-php": {
- "version": "0.19.7",
- "resolved": "https://registry.npmjs.org/@prettier/plugin-php/-/plugin-php-0.19.7.tgz",
- "integrity": "sha512-QOzBs05nwuR92uak7xBHf7RCZCFXml+6Sk3cjTp2ahQlilBtupqlNjitlTXsOfPIAYwlFgLP1oSfyapS6DN00w==",
+ "version": "0.22.4",
+ "resolved": "https://registry.npmjs.org/@prettier/plugin-php/-/plugin-php-0.22.4.tgz",
+ "integrity": "sha512-uZWqfyrwsxScIYkmVcfnoQGFmKVMXTHD5pqYT4l8fxzm5P3XY94hTPbf8X6TFCi2QTZBIot7GS8lfIjQjldc2g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "linguist-languages": "^7.21.0",
- "mem": "^8.0.0",
+ "linguist-languages": "^7.27.0",
"php-parser": "^3.1.5"
},
"peerDependencies": {
- "prettier": "^1.15.0 || ^2.0.0"
+ "prettier": "^3.0.0"
}
},
"node_modules/@shufo/tailwindcss-class-sorter": {
@@ -2297,142 +2684,30 @@
"@types/node": "*"
}
},
- "node_modules/@types/sockjs": {
- "version": "0.3.35",
- "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz",
- "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/svgo": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-1.3.6.tgz",
- "integrity": "sha512-AZU7vQcy/4WFEuwnwsNsJnFwupIpbllH1++LXScN6uxT1Z4zPzdrWG97w4/I7eFKFTvfy/bHFStWjdBAg2Vjug==",
- "dev": true
- },
- "node_modules/@types/ws": {
- "version": "8.5.8",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz",
- "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@vue/compiler-core": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.13.tgz",
- "integrity": "sha512-bwi9HShGu7uaZLOErZgsH2+ojsEdsjerbf2cMXPwmvcgZfVPZ2BVZzCVnwZBxTAYd6Mzbmf6izcUNDkWnBBQ6A==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.23.5",
- "@vue/shared": "3.3.13",
- "estree-walker": "^2.0.2",
- "source-map-js": "^1.0.2"
- }
- },
- "node_modules/@vue/compiler-dom": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.13.tgz",
- "integrity": "sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==",
- "dev": true,
- "dependencies": {
- "@vue/compiler-core": "3.3.13",
- "@vue/shared": "3.3.13"
- }
- },
- "node_modules/@vue/compiler-sfc": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.13.tgz",
- "integrity": "sha512-DQVmHEy/EKIgggvnGRLx21hSqnr1smUS9Aq8tfxiiot8UR0/pXKHN9k78/qQ7etyQTFj5em5nruODON7dBeumw==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.23.5",
- "@vue/compiler-core": "3.3.13",
- "@vue/compiler-dom": "3.3.13",
- "@vue/compiler-ssr": "3.3.13",
- "@vue/reactivity-transform": "3.3.13",
- "@vue/shared": "3.3.13",
- "estree-walker": "^2.0.2",
- "magic-string": "^0.30.5",
- "postcss": "^8.4.32",
- "source-map-js": "^1.0.2"
- }
- },
- "node_modules/@vue/compiler-ssr": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.13.tgz",
- "integrity": "sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==",
- "dev": true,
- "dependencies": {
- "@vue/compiler-dom": "3.3.13",
- "@vue/shared": "3.3.13"
- }
- },
- "node_modules/@vue/reactivity": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.13.tgz",
- "integrity": "sha512-fjzCxceMahHhi4AxUBzQqqVhuA21RJ0COaWTbIBl1PruGW1CeY97louZzLi4smpYx+CHfFPPU/CS8NybbGvPKQ==",
- "dev": true,
- "dependencies": {
- "@vue/shared": "3.3.13"
- }
- },
- "node_modules/@vue/reactivity-transform": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.13.tgz",
- "integrity": "sha512-oWnydGH0bBauhXvh5KXUy61xr9gKaMbtsMHk40IK9M4gMuKPJ342tKFarY0eQ6jef8906m35q37wwA8DMZOm5Q==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.23.5",
- "@vue/compiler-core": "3.3.13",
- "@vue/shared": "3.3.13",
- "estree-walker": "^2.0.2",
- "magic-string": "^0.30.5"
- }
- },
- "node_modules/@vue/runtime-core": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.13.tgz",
- "integrity": "sha512-1TzA5TvGuh2zUwMJgdfvrBABWZ7y8kBwBhm7BXk8rvdx2SsgcGfz2ruv2GzuGZNvL1aKnK8CQMV/jFOrxNQUMA==",
- "dev": true,
- "dependencies": {
- "@vue/reactivity": "3.3.13",
- "@vue/shared": "3.3.13"
- }
- },
- "node_modules/@vue/runtime-dom": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.13.tgz",
- "integrity": "sha512-JJkpE8R/hJKXqVTgUoODwS5wqKtOsmJPEqmp90PDVGygtJ4C0PtOkcEYXwhiVEmef6xeXcIlrT3Yo5aQ4qkHhQ==",
+ "node_modules/@types/sockjs": {
+ "version": "0.3.35",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz",
+ "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==",
"dev": true,
"dependencies": {
- "@vue/runtime-core": "3.3.13",
- "@vue/shared": "3.3.13",
- "csstype": "^3.1.3"
+ "@types/node": "*"
}
},
- "node_modules/@vue/server-renderer": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.13.tgz",
- "integrity": "sha512-vSnN+nuf6iSqTL3Qgx/9A+BT+0Zf/VJOgF5uMZrKjYPs38GMYyAU1coDyBNHauehXDaP+zl73VhwWv0vBRBHcg==",
+ "node_modules/@types/svgo": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-1.3.6.tgz",
+ "integrity": "sha512-AZU7vQcy/4WFEuwnwsNsJnFwupIpbllH1++LXScN6uxT1Z4zPzdrWG97w4/I7eFKFTvfy/bHFStWjdBAg2Vjug==",
+ "dev": true
+ },
+ "node_modules/@types/ws": {
+ "version": "8.5.8",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz",
+ "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==",
"dev": true,
"dependencies": {
- "@vue/compiler-ssr": "3.3.13",
- "@vue/shared": "3.3.13"
- },
- "peerDependencies": {
- "vue": "3.3.13"
+ "@types/node": "*"
}
},
- "node_modules/@vue/shared": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.13.tgz",
- "integrity": "sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==",
- "dev": true
- },
"node_modules/@webassemblyjs/ast": {
"version": "1.11.6",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
@@ -2922,12 +3197,12 @@
}
},
"node_modules/axios": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz",
- "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
"dev": true,
"dependencies": {
- "follow-redirects": "^1.15.0",
+ "follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
@@ -3059,12 +3334,13 @@
}
},
"node_modules/blade-formatter": {
- "version": "1.38.6",
- "resolved": "https://registry.npmjs.org/blade-formatter/-/blade-formatter-1.38.6.tgz",
- "integrity": "sha512-XwW1A4G7GPXjCG7oPKkvBp8UVb/YS/zoS8FbuuUbrnwzzmoVEe29oSqh1JpCVj9+SI2ye/qohRuXNkwHjcq/Ww==",
+ "version": "1.42.2",
+ "resolved": "https://registry.npmjs.org/blade-formatter/-/blade-formatter-1.42.2.tgz",
+ "integrity": "sha512-mbjnget+vJ8fcKiEn0Et1IepMdiKoDGxSROt6qFKF3UW+tmRuvr/v/CK8GECJL+RE6jsJo8x3mFXrDZk+RgjDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@prettier/plugin-php": "^0.19.7",
+ "@prettier/plugin-php": "^0.22.4",
"@shufo/tailwindcss-class-sorter": "3.0.1",
"aigle": "^1.14.1",
"ajv": "^8.9.0",
@@ -3072,13 +3348,14 @@
"concat-stream": "^2.0.0",
"detect-indent": "^6.0.0",
"find-config": "^1.0.0",
- "glob": "^8.0.1",
+ "glob": "^10.0.0",
"html-attribute-sorter": "^0.4.3",
- "ignore": "^5.1.8",
+ "ignore": "^6.0.0",
"js-beautify": "^1.14.8",
"lodash": "^4.17.19",
- "php-parser": "3.1.5",
- "prettier": "^2.2.0",
+ "php-parser": "3.2.2",
+ "prettier": "^3.2.5",
+ "string-replace-async": "^2.0.0",
"tailwindcss": "^3.1.8",
"vscode-oniguruma": "1.7.0",
"vscode-textmate": "^7.0.1",
@@ -3113,29 +3390,41 @@
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/blade-formatter/node_modules/glob": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
- "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
},
- "engines": {
- "node": ">=12"
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/blade-formatter/node_modules/ignore": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
+ "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/blade-formatter/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
@@ -3143,15 +3432,19 @@
"dev": true
},
"node_modules/blade-formatter/node_modules/minimatch": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
- "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
- "node": ">=10"
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/bn.js": {
@@ -3509,9 +3802,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001551",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz",
- "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==",
+ "version": "1.0.30001653",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz",
+ "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==",
"dev": true,
"funding": [
{
@@ -3526,7 +3819,8 @@
"type": "github",
"url": "https://github.com/sponsors/ai"
}
- ]
+ ],
+ "license": "CC-BY-4.0"
},
"node_modules/chalk": {
"version": "4.1.2",
@@ -4001,24 +4295,6 @@
"sha.js": "^2.4.8"
}
},
- "node_modules/cross-env": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
- "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.1"
- },
- "bin": {
- "cross-env": "src/bin/cross-env.js",
- "cross-env-shell": "src/bin/cross-env-shell.js"
- },
- "engines": {
- "node": ">=10.14",
- "npm": ">=6",
- "yarn": ">=1"
- }
- },
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -4287,12 +4563,6 @@
"node": ">=8.0.0"
}
},
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "dev": true
- },
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -4394,6 +4664,19 @@
"node": ">=8"
}
},
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/detect-node": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
@@ -4579,6 +4862,13 @@
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
"dev": true
},
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/editorconfig": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz",
@@ -4803,12 +5093,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true
- },
"node_modules/esutils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
@@ -5175,9 +5459,9 @@
}
},
"node_modules/follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
"dev": true,
"funding": [
{
@@ -5194,6 +5478,36 @@
}
}
},
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -5900,9 +6214,9 @@
}
},
"node_modules/immutable": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz",
- "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.2.tgz",
+ "integrity": "sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw==",
"dev": true
},
"node_modules/import-fresh": {
@@ -6139,6 +6453,22 @@
"node": ">=0.10.0"
}
},
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"node_modules/jest-worker": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
@@ -6463,10 +6793,11 @@
"dev": true
},
"node_modules/linguist-languages": {
- "version": "7.26.1",
- "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.26.1.tgz",
- "integrity": "sha512-B9O5pDocOkfswmA0qKrqdfeua1TxeQ5PPWdsuo5QRXFv2N0tB3plY+DVWvSWiGkjdqKNU3KBjJYHs/jRXG0adw==",
- "dev": true
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.27.0.tgz",
+ "integrity": "sha512-Wzx/22c5Jsv2ag+uKy+ITanGA5hzvBZngrNGDXLTC7ZjGM6FLCYGgomauTkxNJeP9of353OM0pWqngYA180xgw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/loader-runner": {
"version": "4.3.0",
@@ -6548,18 +6879,6 @@
"node": ">=10"
}
},
- "node_modules/magic-string": {
- "version": "0.30.5",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
- "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
- "dev": true,
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -6584,18 +6903,6 @@
"semver": "bin/semver.js"
}
},
- "node_modules/map-age-cleaner": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
- "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
- "dev": true,
- "dependencies": {
- "p-defer": "^1.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/md5": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
@@ -6633,22 +6940,6 @@
"node": ">= 0.6"
}
},
- "node_modules/mem": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz",
- "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==",
- "dev": true,
- "dependencies": {
- "map-age-cleaner": "^0.1.3",
- "mimic-fn": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/mem?sponsor=1"
- }
- },
"node_modules/memfs": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
@@ -6756,15 +7047,6 @@
"node": ">= 0.6"
}
},
- "node_modules/mimic-fn": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz",
- "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/mini-css-extract-plugin": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz",
@@ -6837,6 +7119,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -6868,9 +7160,9 @@
}
},
"node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"dev": true,
"funding": [
{
@@ -6910,6 +7202,13 @@
"tslib": "^2.0.3"
}
},
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "dev": true,
+ "optional": true
+ },
"node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@@ -7209,15 +7508,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/p-defer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
- "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -7279,6 +7569,13 @@
"node": ">=6"
}
},
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
"node_modules/pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
@@ -7396,6 +7693,30 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@@ -7428,15 +7749,16 @@
}
},
"node_modules/php-parser": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.1.5.tgz",
- "integrity": "sha512-jEY2DcbgCm5aclzBdfW86GM6VEIWcSlhTBSHN1qhJguVePlYe28GhwS0yoeLYXpM2K8y6wzLwrbq814n2PHSoQ==",
- "dev": true
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.2.2.tgz",
+ "integrity": "sha512-voj3rzCJmEbwHwH3QteON28wA6K+JbcaJEofyUZkUXmcViiXofjbSbcE5PtqtjX6nstnnAEYCFoRq0mkjP5/cg==",
+ "dev": true,
+ "license": "BSD-3-Clause"
},
"node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"dev": true
},
"node_modules/picomatch": {
@@ -7487,15 +7809,16 @@
"integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
"deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
"dev": true,
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/postcss": {
- "version": "8.4.32",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
- "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+ "version": "8.5.2",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
+ "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==",
"dev": true,
"funding": [
{
@@ -7511,10 +7834,11 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
@@ -8110,15 +8434,16 @@
"dev": true
},
"node_modules/prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
+ "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
"dev": true,
+ "license": "MIT",
"bin": {
- "prettier": "bin-prettier.js"
+ "prettier": "bin/prettier.cjs"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
@@ -8619,13 +8944,14 @@
"dev": true
},
"node_modules/sass": {
- "version": "1.69.5",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz",
- "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==",
+ "version": "1.85.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz",
+ "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "chokidar": ">=3.0.0 <4.0.0",
- "immutable": "^4.0.0",
+ "chokidar": "^4.0.0",
+ "immutable": "^5.0.2",
"source-map-js": ">=0.6.2 <2.0.0"
},
"bin": {
@@ -8633,32 +8959,36 @@
},
"engines": {
"node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
}
},
"node_modules/sass-loader": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz",
- "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==",
+ "version": "16.0.5",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz",
+ "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"neo-async": "^2.6.2"
},
"engines": {
- "node": ">= 14.15.0"
+ "node": ">= 18.12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
- "fibers": ">= 3.1.0",
+ "@rspack/core": "0.x || 1.x",
"node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
"sass": "^1.3.0",
"sass-embedded": "*",
"webpack": "^5.0.0"
},
"peerDependenciesMeta": {
- "fibers": {
+ "@rspack/core": {
"optional": true
},
"node-sass": {
@@ -8669,9 +8999,40 @@
},
"sass-embedded": {
"optional": true
+ },
+ "webpack": {
+ "optional": true
}
}
},
+ "node_modules/sass/node_modules/chokidar": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
+ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+ "dev": true,
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/sass/node_modules/readdirp": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.1.tgz",
+ "integrity": "sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/schema-utils": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
@@ -8999,9 +9360,9 @@
}
},
"node_modules/source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
@@ -9149,6 +9510,15 @@
"safe-buffer": "~5.1.0"
}
},
+ "node_modules/string-replace-async": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/string-replace-async/-/string-replace-async-2.0.0.tgz",
+ "integrity": "sha512-AHMupZscUiDh07F1QziX7PLoB1DQ/pzu19vc8Xa8LwZcgnOXaw7yCgBuSYrxVEfaM2d8scc3Gtp+i+QJZV+spw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -9163,6 +9533,22 @@
"node": ">=8"
}
},
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -9175,6 +9561,20 @@
"node": ">=8"
}
},
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-final-newline": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
@@ -9789,27 +10189,6 @@
"integrity": "sha512-zQ5U/nuXAAMsh691FtV0wPz89nSkHbs+IQV8FDk+wew9BlSDhf4UmWGlWJfTR2Ti6xZv87Tj5fENzKf6Qk7aLw==",
"dev": true
},
- "node_modules/vue": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.13.tgz",
- "integrity": "sha512-LDnUpQvDgsfc0u/YgtAgTMXJlJQqjkxW1PVcOnJA5cshPleULDjHi7U45pl2VJYazSSvLH8UKcid/kzH8I0a0Q==",
- "dev": true,
- "dependencies": {
- "@vue/compiler-dom": "3.3.13",
- "@vue/compiler-sfc": "3.3.13",
- "@vue/runtime-dom": "3.3.13",
- "@vue/server-renderer": "3.3.13",
- "@vue/shared": "3.3.13"
- },
- "peerDependencies": {
- "typescript": "*"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
"node_modules/vue-style-loader": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
@@ -10275,17 +10654,36 @@
"node": ">= 8"
}
},
- "node_modules/wildcard": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
- "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
- "dev": true
- },
- "node_modules/wrap-ansi": {
+ "node_modules/wildcard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -10864,9 +11262,9 @@
}
},
"@babel/parser": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz",
- "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==",
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz",
+ "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==",
"dev": true
},
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
@@ -11697,6 +12095,71 @@
"integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
"dev": true
},
+ "@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "requires": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^6.0.1"
+ }
+ },
+ "wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ }
+ }
+ }
+ },
"@jridgewell/gen-mapping": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
@@ -11743,9 +12206,9 @@
}
},
"@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"dev": true
},
"@jridgewell/trace-mapping": {
@@ -11796,14 +12259,129 @@
"integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
"dev": true
},
+ "@parcel/watcher": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz",
+ "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@parcel/watcher-android-arm64": "2.4.1",
+ "@parcel/watcher-darwin-arm64": "2.4.1",
+ "@parcel/watcher-darwin-x64": "2.4.1",
+ "@parcel/watcher-freebsd-x64": "2.4.1",
+ "@parcel/watcher-linux-arm-glibc": "2.4.1",
+ "@parcel/watcher-linux-arm64-glibc": "2.4.1",
+ "@parcel/watcher-linux-arm64-musl": "2.4.1",
+ "@parcel/watcher-linux-x64-glibc": "2.4.1",
+ "@parcel/watcher-linux-x64-musl": "2.4.1",
+ "@parcel/watcher-win32-arm64": "2.4.1",
+ "@parcel/watcher-win32-ia32": "2.4.1",
+ "@parcel/watcher-win32-x64": "2.4.1",
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ }
+ },
+ "@parcel/watcher-android-arm64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz",
+ "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-darwin-arm64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz",
+ "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-darwin-x64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz",
+ "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-freebsd-x64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz",
+ "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-linux-arm-glibc": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz",
+ "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz",
+ "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-linux-arm64-musl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz",
+ "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-linux-x64-glibc": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz",
+ "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-linux-x64-musl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz",
+ "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-win32-arm64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz",
+ "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-win32-ia32": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz",
+ "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==",
+ "dev": true,
+ "optional": true
+ },
+ "@parcel/watcher-win32-x64": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz",
+ "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==",
+ "dev": true,
+ "optional": true
+ },
+ "@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true
+ },
"@prettier/plugin-php": {
- "version": "0.19.7",
- "resolved": "https://registry.npmjs.org/@prettier/plugin-php/-/plugin-php-0.19.7.tgz",
- "integrity": "sha512-QOzBs05nwuR92uak7xBHf7RCZCFXml+6Sk3cjTp2ahQlilBtupqlNjitlTXsOfPIAYwlFgLP1oSfyapS6DN00w==",
+ "version": "0.22.4",
+ "resolved": "https://registry.npmjs.org/@prettier/plugin-php/-/plugin-php-0.22.4.tgz",
+ "integrity": "sha512-uZWqfyrwsxScIYkmVcfnoQGFmKVMXTHD5pqYT4l8fxzm5P3XY94hTPbf8X6TFCi2QTZBIot7GS8lfIjQjldc2g==",
"dev": true,
"requires": {
- "linguist-languages": "^7.21.0",
- "mem": "^8.0.0",
+ "linguist-languages": "^7.27.0",
"php-parser": "^3.1.5"
}
},
@@ -12136,115 +12714,6 @@
"@types/node": "*"
}
},
- "@vue/compiler-core": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.13.tgz",
- "integrity": "sha512-bwi9HShGu7uaZLOErZgsH2+ojsEdsjerbf2cMXPwmvcgZfVPZ2BVZzCVnwZBxTAYd6Mzbmf6izcUNDkWnBBQ6A==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.23.5",
- "@vue/shared": "3.3.13",
- "estree-walker": "^2.0.2",
- "source-map-js": "^1.0.2"
- }
- },
- "@vue/compiler-dom": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.13.tgz",
- "integrity": "sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==",
- "dev": true,
- "requires": {
- "@vue/compiler-core": "3.3.13",
- "@vue/shared": "3.3.13"
- }
- },
- "@vue/compiler-sfc": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.13.tgz",
- "integrity": "sha512-DQVmHEy/EKIgggvnGRLx21hSqnr1smUS9Aq8tfxiiot8UR0/pXKHN9k78/qQ7etyQTFj5em5nruODON7dBeumw==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.23.5",
- "@vue/compiler-core": "3.3.13",
- "@vue/compiler-dom": "3.3.13",
- "@vue/compiler-ssr": "3.3.13",
- "@vue/reactivity-transform": "3.3.13",
- "@vue/shared": "3.3.13",
- "estree-walker": "^2.0.2",
- "magic-string": "^0.30.5",
- "postcss": "^8.4.32",
- "source-map-js": "^1.0.2"
- }
- },
- "@vue/compiler-ssr": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.13.tgz",
- "integrity": "sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==",
- "dev": true,
- "requires": {
- "@vue/compiler-dom": "3.3.13",
- "@vue/shared": "3.3.13"
- }
- },
- "@vue/reactivity": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.13.tgz",
- "integrity": "sha512-fjzCxceMahHhi4AxUBzQqqVhuA21RJ0COaWTbIBl1PruGW1CeY97louZzLi4smpYx+CHfFPPU/CS8NybbGvPKQ==",
- "dev": true,
- "requires": {
- "@vue/shared": "3.3.13"
- }
- },
- "@vue/reactivity-transform": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.13.tgz",
- "integrity": "sha512-oWnydGH0bBauhXvh5KXUy61xr9gKaMbtsMHk40IK9M4gMuKPJ342tKFarY0eQ6jef8906m35q37wwA8DMZOm5Q==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.23.5",
- "@vue/compiler-core": "3.3.13",
- "@vue/shared": "3.3.13",
- "estree-walker": "^2.0.2",
- "magic-string": "^0.30.5"
- }
- },
- "@vue/runtime-core": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.13.tgz",
- "integrity": "sha512-1TzA5TvGuh2zUwMJgdfvrBABWZ7y8kBwBhm7BXk8rvdx2SsgcGfz2ruv2GzuGZNvL1aKnK8CQMV/jFOrxNQUMA==",
- "dev": true,
- "requires": {
- "@vue/reactivity": "3.3.13",
- "@vue/shared": "3.3.13"
- }
- },
- "@vue/runtime-dom": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.13.tgz",
- "integrity": "sha512-JJkpE8R/hJKXqVTgUoODwS5wqKtOsmJPEqmp90PDVGygtJ4C0PtOkcEYXwhiVEmef6xeXcIlrT3Yo5aQ4qkHhQ==",
- "dev": true,
- "requires": {
- "@vue/runtime-core": "3.3.13",
- "@vue/shared": "3.3.13",
- "csstype": "^3.1.3"
- }
- },
- "@vue/server-renderer": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.13.tgz",
- "integrity": "sha512-vSnN+nuf6iSqTL3Qgx/9A+BT+0Zf/VJOgF5uMZrKjYPs38GMYyAU1coDyBNHauehXDaP+zl73VhwWv0vBRBHcg==",
- "dev": true,
- "requires": {
- "@vue/compiler-ssr": "3.3.13",
- "@vue/shared": "3.3.13"
- }
- },
- "@vue/shared": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.13.tgz",
- "integrity": "sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==",
- "dev": true
- },
"@webassemblyjs/ast": {
"version": "1.11.6",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
@@ -12651,12 +13120,12 @@
}
},
"axios": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz",
- "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
"dev": true,
"requires": {
- "follow-redirects": "^1.15.0",
+ "follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
@@ -12751,12 +13220,12 @@
"dev": true
},
"blade-formatter": {
- "version": "1.38.6",
- "resolved": "https://registry.npmjs.org/blade-formatter/-/blade-formatter-1.38.6.tgz",
- "integrity": "sha512-XwW1A4G7GPXjCG7oPKkvBp8UVb/YS/zoS8FbuuUbrnwzzmoVEe29oSqh1JpCVj9+SI2ye/qohRuXNkwHjcq/Ww==",
+ "version": "1.42.2",
+ "resolved": "https://registry.npmjs.org/blade-formatter/-/blade-formatter-1.42.2.tgz",
+ "integrity": "sha512-mbjnget+vJ8fcKiEn0Et1IepMdiKoDGxSROt6qFKF3UW+tmRuvr/v/CK8GECJL+RE6jsJo8x3mFXrDZk+RgjDQ==",
"dev": true,
"requires": {
- "@prettier/plugin-php": "^0.19.7",
+ "@prettier/plugin-php": "^0.22.4",
"@shufo/tailwindcss-class-sorter": "3.0.1",
"aigle": "^1.14.1",
"ajv": "^8.9.0",
@@ -12764,13 +13233,14 @@
"concat-stream": "^2.0.0",
"detect-indent": "^6.0.0",
"find-config": "^1.0.0",
- "glob": "^8.0.1",
+ "glob": "^10.0.0",
"html-attribute-sorter": "^0.4.3",
- "ignore": "^5.1.8",
+ "ignore": "^6.0.0",
"js-beautify": "^1.14.8",
"lodash": "^4.17.19",
- "php-parser": "3.1.5",
- "prettier": "^2.2.0",
+ "php-parser": "3.2.2",
+ "prettier": "^3.2.5",
+ "string-replace-async": "^2.0.0",
"tailwindcss": "^3.1.8",
"vscode-oniguruma": "1.7.0",
"vscode-textmate": "^7.0.1",
@@ -12800,18 +13270,25 @@
}
},
"glob": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
- "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"dev": true,
"requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
}
},
+ "ignore": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
+ "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
+ "dev": true
+ },
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
@@ -12819,9 +13296,9 @@
"dev": true
},
"minimatch": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
- "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
"requires": {
"brace-expansion": "^2.0.1"
@@ -13110,9 +13587,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001551",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz",
- "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==",
+ "version": "1.0.30001653",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz",
+ "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==",
"dev": true
},
"chalk": {
@@ -13499,15 +13976,6 @@
"sha.js": "^2.4.8"
}
},
- "cross-env": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
- "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.1"
- }
- },
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -13700,12 +14168,6 @@
"css-tree": "^1.1.2"
}
},
- "csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "dev": true
- },
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -13774,6 +14236,13 @@
"integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
"dev": true
},
+ "detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "dev": true,
+ "optional": true
+ },
"detect-node": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
@@ -13922,6 +14391,12 @@
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
"dev": true
},
+ "eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
"editorconfig": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz",
@@ -14101,12 +14576,6 @@
"integrity": "sha512-VHvyaGnJy+FuGfcfaM7W7OZw4mQiKW73jPHwQXx2VnMSUBajYmytOT5sKEfsBvNPtGX6YDwcrGDz2eocoHg0JA==",
"dev": true
},
- "estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true
- },
"esutils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
@@ -14391,11 +14860,29 @@
"dev": true
},
"follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
"dev": true
},
+ "foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "dependencies": {
+ "signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true
+ }
+ }
+ },
"form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -14915,9 +15402,9 @@
}
},
"immutable": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz",
- "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.2.tgz",
+ "integrity": "sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw==",
"dev": true
},
"import-fresh": {
@@ -15085,6 +15572,16 @@
"integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
"dev": true
},
+ "jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "requires": {
+ "@isaacs/cliui": "^8.0.2",
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"jest-worker": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
@@ -15321,9 +15818,9 @@
"dev": true
},
"linguist-languages": {
- "version": "7.26.1",
- "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.26.1.tgz",
- "integrity": "sha512-B9O5pDocOkfswmA0qKrqdfeua1TxeQ5PPWdsuo5QRXFv2N0tB3plY+DVWvSWiGkjdqKNU3KBjJYHs/jRXG0adw==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.27.0.tgz",
+ "integrity": "sha512-Wzx/22c5Jsv2ag+uKy+ITanGA5hzvBZngrNGDXLTC7ZjGM6FLCYGgomauTkxNJeP9of353OM0pWqngYA180xgw==",
"dev": true
},
"loader-runner": {
@@ -15394,15 +15891,6 @@
"yallist": "^4.0.0"
}
},
- "magic-string": {
- "version": "0.30.5",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
- "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
- "dev": true,
- "requires": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- }
- },
"make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -15420,15 +15908,6 @@
}
}
},
- "map-age-cleaner": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
- "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
- "dev": true,
- "requires": {
- "p-defer": "^1.0.0"
- }
- },
"md5": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
@@ -15463,16 +15942,6 @@
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"dev": true
},
- "mem": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz",
- "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==",
- "dev": true,
- "requires": {
- "map-age-cleaner": "^0.1.3",
- "mimic-fn": "^3.1.0"
- }
- },
"memfs": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
@@ -15555,12 +16024,6 @@
"mime-db": "1.52.0"
}
},
- "mimic-fn": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz",
- "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==",
- "dev": true
- },
"mini-css-extract-plugin": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz",
@@ -15612,6 +16075,12 @@
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true
},
+ "minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true
+ },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -15640,9 +16109,9 @@
}
},
"nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"dev": true
},
"negotiator": {
@@ -15667,6 +16136,13 @@
"tslib": "^2.0.3"
}
},
+ "node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "dev": true,
+ "optional": true
+ },
"node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@@ -15901,12 +16377,6 @@
"integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
"dev": true
},
- "p-defer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
- "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
- "dev": true
- },
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -15947,6 +16417,12 @@
"integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
"dev": true
},
+ "package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true
+ },
"pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
@@ -16043,6 +16519,24 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
+ "path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true
+ }
+ }
+ },
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@@ -16069,15 +16563,15 @@
}
},
"php-parser": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.1.5.tgz",
- "integrity": "sha512-jEY2DcbgCm5aclzBdfW86GM6VEIWcSlhTBSHN1qhJguVePlYe28GhwS0yoeLYXpM2K8y6wzLwrbq814n2PHSoQ==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.2.2.tgz",
+ "integrity": "sha512-voj3rzCJmEbwHwH3QteON28wA6K+JbcaJEofyUZkUXmcViiXofjbSbcE5PtqtjX6nstnnAEYCFoRq0mkjP5/cg==",
"dev": true
},
"picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"dev": true
},
"picomatch": {
@@ -16114,14 +16608,14 @@
"dev": true
},
"postcss": {
- "version": "8.4.32",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
- "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+ "version": "8.5.2",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
+ "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==",
"dev": true,
"requires": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
}
},
"postcss-calc": {
@@ -16478,9 +16972,9 @@
"dev": true
},
"prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
+ "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
"dev": true
},
"pretty-time": {
@@ -16866,20 +17360,38 @@
"dev": true
},
"sass": {
- "version": "1.69.5",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz",
- "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==",
+ "version": "1.85.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz",
+ "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==",
"dev": true,
"requires": {
- "chokidar": ">=3.0.0 <4.0.0",
- "immutable": "^4.0.0",
+ "@parcel/watcher": "^2.4.1",
+ "chokidar": "^4.0.0",
+ "immutable": "^5.0.2",
"source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "dependencies": {
+ "chokidar": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
+ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+ "dev": true,
+ "requires": {
+ "readdirp": "^4.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.1.tgz",
+ "integrity": "sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==",
+ "dev": true
+ }
}
},
"sass-loader": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz",
- "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==",
+ "version": "16.0.5",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz",
+ "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==",
"dev": true,
"requires": {
"neo-async": "^2.6.2"
@@ -17160,9 +17672,9 @@
"dev": true
},
"source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true
},
"source-map-support": {
@@ -17304,6 +17816,12 @@
"safe-buffer": "~5.1.0"
}
},
+ "string-replace-async": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/string-replace-async/-/string-replace-async-2.0.0.tgz",
+ "integrity": "sha512-AHMupZscUiDh07F1QziX7PLoB1DQ/pzu19vc8Xa8LwZcgnOXaw7yCgBuSYrxVEfaM2d8scc3Gtp+i+QJZV+spw==",
+ "dev": true
+ },
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -17315,6 +17833,17 @@
"strip-ansi": "^6.0.1"
}
},
+ "string-width-cjs": {
+ "version": "npm:string-width@4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -17324,6 +17853,15 @@
"ansi-regex": "^5.0.1"
}
},
+ "strip-ansi-cjs": {
+ "version": "npm:strip-ansi@6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
"strip-final-newline": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
@@ -17774,19 +18312,6 @@
"integrity": "sha512-zQ5U/nuXAAMsh691FtV0wPz89nSkHbs+IQV8FDk+wew9BlSDhf4UmWGlWJfTR2Ti6xZv87Tj5fENzKf6Qk7aLw==",
"dev": true
},
- "vue": {
- "version": "3.3.13",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.13.tgz",
- "integrity": "sha512-LDnUpQvDgsfc0u/YgtAgTMXJlJQqjkxW1PVcOnJA5cshPleULDjHi7U45pl2VJYazSSvLH8UKcid/kzH8I0a0Q==",
- "dev": true,
- "requires": {
- "@vue/compiler-dom": "3.3.13",
- "@vue/compiler-sfc": "3.3.13",
- "@vue/runtime-dom": "3.3.13",
- "@vue/server-renderer": "3.3.13",
- "@vue/shared": "3.3.13"
- }
- },
"vue-style-loader": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
@@ -18128,6 +18653,17 @@
"strip-ansi": "^6.0.0"
}
},
+ "wrap-ansi-cjs": {
+ "version": "npm:wrap-ansi@7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/package.json b/package.json
index 7ef022e02f..acde023c93 100644
--- a/package.json
+++ b/package.json
@@ -11,17 +11,16 @@
"format": "./node_modules/.bin/blade-formatter --progress --write '**/*.blade.php'"
},
"devDependencies": {
- "axios": "^1.6.2",
- "blade-formatter": "^1.38.6",
+ "axios": "^1.7.9",
+ "blade-formatter": "^1.42.2",
"bootstrap": "^4.6",
- "cross-env": "^7.0",
"jquery": "^3.7",
"laravel-mix": "^6.0.49",
"lodash": "^4.17.21",
- "popper.js": "^1.16",
+ "popper.js": "^1.16.1",
+ "postcss": "^8.5.2",
"resolve-url-loader": "^5.0.0",
- "sass": "^1.69.5",
- "sass-loader": "^13.3.2",
- "vue": "^3.3.13"
+ "sass": "^1.85.0",
+ "sass-loader": "^16.0.5"
}
-}
+}
\ No newline at end of file
diff --git a/public/css/all.min.css b/public/css/allv5.min.css
similarity index 97%
rename from public/css/all.min.css
rename to public/css/allv5.min.css
index a74835e25b..20ac1f2209 100644
--- a/public/css/all.min.css
+++ b/public/css/allv5.min.css
@@ -1 +1 @@
-.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}
\ No newline at end of file
+.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-v5/fa-brands-400.eot);src:url(../webfonts/fa-v5/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-v5/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-v5/fa-brands-400.woff) format("woff"),url(../webfonts/fa-v5/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-v5/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-v5/fa-regular-400.eot);src:url(../webfonts/fa-v5/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-v5/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-v5/fa-regular-400.woff) format("woff"),url(../webfonts/fa-v5/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-v5/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-v5/fa-solid-900.eot);src:url(../webfonts/fa-v5/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-v5/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-v5/fa-solid-900.woff) format("woff"),url(../webfonts/fa-v5/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-v5/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}
diff --git a/public/css/allv6.min.css b/public/css/allv6.min.css
new file mode 100644
index 0000000000..0f1a9b0ce7
--- /dev/null
+++ b/public/css/allv6.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp-solid,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}
+
+.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-thumb-tack-slash:before,.fa-thumbtack-slash:before{content:"\e68f"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-table-cells-row-unlock:before{content:"\e691"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}
+.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-v6/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-dart-lang:before{content:"\e693"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-flutter:before{content:"\e694"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-v6/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-v6/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-v6/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-v6/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-v6/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-v6/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-v6/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v6/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-v6/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v6/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v6/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v6/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v6/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
diff --git a/public/css/allvmix.min.css b/public/css/allvmix.min.css
new file mode 100644
index 0000000000..9abeffdb26
--- /dev/null
+++ b/public/css/allvmix.min.css
@@ -0,0 +1,11 @@
+/*!
+ * Font Awesome Free v6 & v5 by @fontawesome - https://fontawesome.com
+ * Mixed version compiled by Min (liwoyadan)
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ * Copyright 2024 Fonticons, Inc.
+ */
+.fa-beat,.fa-bounce{animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite)}.fa-fw,.fa-li{text-align:center}.fa{font-family:var(--fa-style-family, "Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp-solid,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid{font-family:"Font Awesome 6 Free"}.far,.fas{font-family:"Font Awesome 5 Free"}.fab{font-family:"Font Awesome 5 Brands"}.fa-brands{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x,.fa-stack-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.0833333337em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.0714285718em;vertical-align:.0535714295em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.0416666682em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(-1 * var(--fa-li-width,2em));position:absolute;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-color:var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);border-style:var(--fa-border-style,solid);border-width:var(--fa-border-width,.08em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-timing-function:var(--fa-animation-timing,cubic-bezier(0.28,0.84,0.42,1))}.fa-beat-fade,.fa-fade{animation-timing-function:var(--fa-animation-timing,cubic-bezier(0.4,0,0.6,1));animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction,normal);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-duration:var(--fa-animation-duration, 1s)}.fa-fade{animation-name:fa-fade}.fa-beat-fade{animation-name:fa-beat-fade}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay, 0s);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake{animation-name:fa-shake;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite)}.fa-pulse,.fa-spin,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-iteration-count:var(--fa-animation-iteration-count,infinite)}.fa-spin{animation-duration:var(--fa-animation-duration, 2s)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-duration:var(--fa-animation-duration, 1s);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%,100%,64%{transform:scale(1,1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em))}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity, .4)}}@keyframes fa-beat-fade{0%,100%{opacity:var(--fa-beat-fade-opacity, .4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}24%,8%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}100%,40%{transform:rotate(0)}}@keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scale(-1,1)}.fa-flip-vertical{transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1,-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}
+
+.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-thumb-tack-slash:before,.fa-thumbtack-slash:before{content:"\e68f"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-table-cells-row-unlock:before{content:"\e691"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}
+ .fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-v6/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-dart-lang:before{content:"\e693"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-flutter:before{content:"\e694"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-v6/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-v6/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-v6/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-v5/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-v5/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-v6/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-v5/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v6/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-v6/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v6/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v6/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-v6/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v6/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v6/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
+
diff --git a/public/css/app.css b/public/css/app.css
index 1937c51d94..91a1f0835b 100644
--- a/public/css/app.css
+++ b/public/css/app.css
@@ -1,8 +1,6 @@
-@import url(https://fonts.googleapis.com/css?family=Nunito);
-
/*!
- * Bootstrap v4.1.3 (https://getbootstrap.com/)
- * Copyright 2011-2018 The Bootstrap Authors
- * Copyright 2011-2018 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */:root{--blue:#3490dc;--indigo:#6574cd;--purple:#9561e2;--pink:#f66d9b;--red:#e3342f;--orange:#f6993f;--yellow:#ffed4a;--green:#38c172;--teal:#4dc0b5;--cyan:#6cb2eb;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#3490dc;--secondary:#6c757d;--success:#38c172;--info:#6cb2eb;--warning:#ffed4a;--danger:#e3342f;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nunito",sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:Nunito,sans-serif;font-size:.9rem;font-weight:400;line-height:1.6;color:#212529;text-align:left;background-color:#f8fafc}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#3490dc;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#1d68a7;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.25rem}.h2,h2{font-size:1.8rem}.h3,h3{font-size:1.575rem}.h4,h4{font-size:1.35rem}.h5,h5{font-size:1.125rem}.h6,h6{font-size:.9rem}.lead{font-size:1.125rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.125rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014\A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#f8fafc;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#f66d9b;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:none}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:none}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:none}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:none}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:none}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#f8fafc}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#c6e0f5}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b0d4f1}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c7eed8}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b3e8ca}.table-info,.table-info>td,.table-info>th{background-color:#d6e9f9}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c0ddf6}.table-warning,.table-warning>td,.table-warning>th{background-color:#fffacc}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#fff8b3}.table-danger,.table-danger>td,.table-danger>th{background-color:#f7c6c5}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f4b0af}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#f8fafc;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#f8fafc;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.19rem + 2px);padding:.375rem .75rem;font-size:.9rem;line-height:1.6;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#a1cbef;outline:0;box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.6}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.125rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.7875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.6;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.68125rem + 2px);padding:.25rem .5rem;font-size:.7875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.6875rem + 2px);padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#38c172}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.7875rem;line-height:1.6;color:#fff;background-color:rgba(56,193,114,.9);border-radius:.25rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#38c172}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#38c172;box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#38c172}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#38c172}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{background-color:#98e1b7}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#5cd08d}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(56,193,114,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#38c172}.custom-file-input.is-valid~.custom-file-label:after,.was-validated .custom-file-input:valid~.custom-file-label:after{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#e3342f}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.7875rem;line-height:1.6;color:#fff;background-color:rgba(227,52,47,.9);border-radius:.25rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#e3342f}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#e3342f;box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#e3342f}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#e3342f}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{background-color:#f2a29f}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e9605c}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(227,52,47,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#e3342f}.custom-file-input.is-invalid~.custom-file-label:after,.was-validated .custom-file-input:invalid~.custom-file-label:after{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{display:flex;align-items:center;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:.9rem;line-height:1.6;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#3490dc;border-color:#3490dc}.btn-primary:hover{color:#fff;background-color:#227dc7;border-color:#2176bd}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#3490dc;border-color:#3490dc}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#2176bd;border-color:#1f6fb2}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#38c172;border-color:#38c172}.btn-success:hover{color:#fff;background-color:#2fa360;border-color:#2d995b}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#38c172;border-color:#38c172}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#2d995b;border-color:#2a9055}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-info{color:#212529;background-color:#6cb2eb;border-color:#6cb2eb}.btn-info:hover{color:#fff;background-color:#4aa0e6;border-color:#3f9ae5}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-info.disabled,.btn-info:disabled{color:#212529;background-color:#6cb2eb;border-color:#6cb2eb}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#3f9ae5;border-color:#3495e3}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-warning{color:#212529;background-color:#ffed4a;border-color:#ffed4a}.btn-warning:hover{color:#212529;background-color:#ffe924;border-color:#ffe817}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffed4a;border-color:#ffed4a}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#ffe817;border-color:#ffe70a}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-danger{color:#fff;background-color:#e3342f;border-color:#e3342f}.btn-danger:hover{color:#fff;background-color:#d0211c;border-color:#c51f1a}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#e3342f;border-color:#e3342f}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c51f1a;border-color:#b91d19}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#3490dc;background-color:transparent;background-image:none;border-color:#3490dc}.btn-outline-primary:hover{color:#fff;background-color:#3490dc;border-color:#3490dc}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#3490dc;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#3490dc;border-color:#3490dc}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#38c172;background-color:transparent;background-image:none;border-color:#38c172}.btn-outline-success:hover{color:#fff;background-color:#38c172;border-color:#38c172}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#38c172;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#38c172;border-color:#38c172}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-outline-info{color:#6cb2eb;background-color:transparent;background-image:none;border-color:#6cb2eb}.btn-outline-info:hover{color:#212529;background-color:#6cb2eb;border-color:#6cb2eb}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#6cb2eb;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#212529;background-color:#6cb2eb;border-color:#6cb2eb}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-outline-warning{color:#ffed4a;background-color:transparent;background-image:none;border-color:#ffed4a}.btn-outline-warning:hover{color:#212529;background-color:#ffed4a;border-color:#ffed4a}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffed4a;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffed4a;border-color:#ffed4a}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-outline-danger{color:#e3342f;background-color:transparent;background-image:none;border-color:#e3342f}.btn-outline-danger:hover{color:#fff;background-color:#e3342f;border-color:#e3342f}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#e3342f;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#e3342f;border-color:#e3342f}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#3490dc;background-color:transparent}.btn-link:hover{color:#1d68a7;background-color:transparent}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline;border-color:transparent}.btn-link.focus,.btn-link:focus{box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.7875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:.9rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#3490dc}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.7875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:0 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group,.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:.9rem;font-weight:400;line-height:1.6;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{height:calc(2.6875rem + 2px);padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{height:calc(1.68125rem + 2px);padding:.25rem .5rem;font-size:.7875rem;line-height:1.5;border-radius:.2rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.44rem;padding-left:1.5rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;background-color:#3490dc}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-control-input:active~.custom-control-label:before{color:#fff;background-color:#cce3f6}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label:before{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.22rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background-repeat:no-repeat;background-position:50%;background-size:50% 50%}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:before{background-color:#3490dc}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#3490dc}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:before{background-color:#3490dc}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.19rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.6;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#a1cbef;outline:0;box-shadow:0 0 0 .2rem rgba(161,203,239,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.68125rem + 2px);font-size:75%}.custom-select-lg,.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem}.custom-select-lg{height:calc(2.6875rem + 2px);font-size:125%}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(2.19rem + 2px)}.custom-file-input{z-index:2;margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#a1cbef;box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.custom-file-input:focus~.custom-file-label:after{border-color:#a1cbef}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-label{left:0;z-index:1;height:calc(2.19rem + 2px);background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.6;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:2.19rem;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#3490dc;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#cce3f6}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#3490dc;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#cce3f6}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#3490dc;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#cce3f6}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#f8fafc;border-color:#dee2e6 #dee2e6 #f8fafc}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#3490dc}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.32rem;padding-bottom:.32rem;margin-right:1rem;font-size:1.125rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.125rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:flex;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:flex;flex:1 0 0%;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:flex;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child),.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#3490dc;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#1d68a7;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#3490dc;border-color:#3490dc}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.125rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.7875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#3490dc}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#2176bd}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#38c172}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#2d995b}.badge-info{color:#212529;background-color:#6cb2eb}.badge-info[href]:focus,.badge-info[href]:hover{color:#212529;text-decoration:none;background-color:#3f9ae5}.badge-warning{color:#212529;background-color:#ffed4a}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#ffe817}.badge-danger{color:#fff;background-color:#e3342f}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#c51f1a}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.85rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#1b4b72;background-color:#d6e9f8;border-color:#c6e0f5}.alert-primary hr{border-top-color:#b0d4f1}.alert-primary .alert-link{color:#113049}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#1d643b;background-color:#d7f3e3;border-color:#c7eed8}.alert-success hr{border-top-color:#b3e8ca}.alert-success .alert-link{color:#123c24}.alert-info{color:#385d7a;background-color:#e2f0fb;border-color:#d6e9f9}.alert-info hr{border-top-color:#c0ddf6}.alert-info .alert-link{color:#284257}.alert-warning{color:#857b26;background-color:#fffbdb;border-color:#fffacc}.alert-warning hr{border-top-color:#fff8b3}.alert-warning .alert-link{color:#5d561b}.alert-danger{color:#761b18;background-color:#f9d6d5;border-color:#f7c6c5}.alert-danger hr{border-top-color:#f4b0af}.alert-danger .alert-link{color:#4c110f}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.675rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#3490dc;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#3490dc;border-color:#3490dc}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#1b4b72;background-color:#c6e0f5}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#1b4b72;background-color:#b0d4f1}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#1b4b72;border-color:#1b4b72}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#1d643b;background-color:#c7eed8}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#1d643b;background-color:#b3e8ca}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1d643b;border-color:#1d643b}.list-group-item-info{color:#385d7a;background-color:#d6e9f9}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#385d7a;background-color:#c0ddf6}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#385d7a;border-color:#385d7a}.list-group-item-warning{color:#857b26;background-color:#fffacc}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#857b26;background-color:#fff8b3}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#857b26;border-color:#857b26}.list-group-item-danger{color:#761b18;background-color:#f7c6c5}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#761b18;background-color:#f4b0af}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#761b18;border-color:#761b18}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.35rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translateY(-25%);transform:translateY(-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0);transform:translate(0)}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);content:""}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.6}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;align-items:center;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:Nunito,sans-serif;font-style:normal;font-weight:400;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.7875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:Nunito,sans-serif;font-style:normal;font-weight:400;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.7875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc(-.5rem + -1px)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:after,.bs-popover-top .arrow:before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-top .arrow:after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc(-.5rem + -1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:after,.bs-popover-right .arrow:before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-right .arrow:after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc(-.5rem + -1px)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:after,.bs-popover-bottom .arrow:before{border-width:0 .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-bottom .arrow:after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc(-.5rem + -1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:after,.bs-popover-left .arrow:before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-left .arrow:after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:.9rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item-next,.carousel-item-prev,.carousel-item.active{transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateZ(0);transform:translateZ(0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateZ(0);transform:translateZ(0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat 50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:hsla(0,0%,100%,.5)}.carousel-indicators li:before{top:-10px}.carousel-indicators li:after,.carousel-indicators li:before{position:absolute;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li:after{bottom:-10px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#3490dc!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#2176bd!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#38c172!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#2d995b!important}.bg-info{background-color:#6cb2eb!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#3f9ae5!important}.bg-warning{background-color:#ffed4a!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#ffe817!important}.bg-danger{background-color:#e3342f!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#c51f1a!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#3490dc!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#38c172!important}.border-info{border-color:#6cb2eb!important}.border-warning{border-color:#ffed4a!important}.border-danger{border-color:#e3342f!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.8571428571%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#3490dc!important}a.text-primary:focus,a.text-primary:hover{color:#2176bd!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#38c172!important}a.text-success:focus,a.text-success:hover{color:#2d995b!important}.text-info{color:#6cb2eb!important}a.text-info:focus,a.text-info:hover{color:#3f9ae5!important}.text-warning{color:#ffed4a!important}a.text-warning:focus,a.text-warning:hover{color:#ffe817!important}.text-danger{color:#e3342f!important}a.text-danger:focus,a.text-danger:hover{color:#c51f1a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}.navbar-laravel{background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.04)}
\ No newline at end of file
+ * Bootstrap v4.6.2 (https://getbootstrap.com/)
+ * Copyright 2011-2022 The Bootstrap Authors
+ * Copyright 2011-2022 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */:root{--blue:#3490dc;--indigo:#6574cd;--purple:#9561e2;--pink:#f66d9b;--red:#e3342f;--orange:#f6993f;--yellow:#ffed4a;--green:#38c172;--teal:#4dc0b5;--cyan:#6cb2eb;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#3490dc;--secondary:#6c757d;--success:#38c172;--info:#6cb2eb;--warning:#ffed4a;--danger:#e3342f;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nunito",sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:sans-serif;line-height:1.15}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{background-color:#f8fafc;color:#212529;font-family:Nunito,sans-serif;font-size:.9rem;font-weight:400;line-height:1.6;margin:0;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;margin-top:0}p{margin-bottom:1rem;margin-top:0}abbr[data-original-title],abbr[title]{border-bottom:0;cursor:help;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{background-color:transparent;color:#3490dc;text-decoration:none}a:hover{color:#1d68a7;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{-ms-overflow-style:scrollbar;margin-bottom:1rem;margin-top:0;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{caption-side:bottom;color:#6c757d;padding-bottom:.75rem;padding-top:.75rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{color:inherit;display:block;font-size:1.5rem;line-height:inherit;margin-bottom:.5rem;max-width:100%;padding:0;white-space:normal;width:100%}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:none;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}summary{cursor:pointer;display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.2;margin-bottom:.5rem}.h1,h1{font-size:2.25rem}.h2,h2{font-size:1.8rem}.h3,h3{font-size:1.575rem}.h4,h4{font-size:1.35rem}.h5,h5{font-size:1.125rem}.h6,h6{font-size:.9rem}.lead{font-size:1.125rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{border:0;border-top:1px solid rgba(0,0,0,.1);margin-bottom:1rem;margin-top:1rem}.small,small{font-size:.875em;font-weight:400}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{font-size:1.125rem;margin-bottom:1rem}.blockquote-footer{color:#6c757d;display:block;font-size:.875em}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{height:auto;max-width:100%}.img-thumbnail{background-color:#f8fafc;border:1px solid #dee2e6;border-radius:.25rem;padding:.25rem}.figure{display:inline-block}.figure-img{line-height:1;margin-bottom:.5rem}.figure-caption{color:#6c757d;font-size:90%}code{word-wrap:break-word;color:#f66d9b;font-size:87.5%}a>code{color:inherit}kbd{background-color:#212529;border-radius:.2rem;color:#fff;font-size:87.5%;padding:.2rem .4rem}kbd kbd{font-size:100%;font-weight:700;padding:0}pre{color:#212529;display:block;font-size:87.5%}pre code{color:inherit;font-size:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media(min-width:576px){.container,.container-sm{max-width:540px}}@media(min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media(min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media(min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.no-gutters{margin-left:0;margin-right:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-left:0;padding-right:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-left:15px;padding-right:15px;position:relative;width:100%}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;max-width:100%;width:auto}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media(min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;max-width:100%;width:auto}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media(min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;max-width:100%;width:auto}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media(min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;max-width:100%;width:auto}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media(min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;max-width:100%;width:auto}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{color:#212529;margin-bottom:1rem;width:100%}.table td,.table th{border-top:1px solid #dee2e6;padding:.75rem;vertical-align:top}.table thead th{border-bottom:2px solid #dee2e6;vertical-align:bottom}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075);color:#212529}.table-primary,.table-primary>td,.table-primary>th{background-color:#c6e0f5}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#95c5ed}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b0d4f1}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cccf}.table-success,.table-success>td,.table-success>th{background-color:#c7eed8}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#98dfb6}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b4e8ca}.table-info,.table-info>td,.table-info>th{background-color:#d6e9f9}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#b3d7f5}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#bfdef6}.table-warning,.table-warning>td,.table-warning>th{background-color:#fffacc}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#fff6a1}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#fff7b3}.table-danger,.table-danger>td,.table-danger>th{background-color:#f7c6c5}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#f09593}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f4b0ae}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#eef1f3}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbd}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{background-color:#343a40;border-color:#454d55;color:#fff}.table .thead-light th{background-color:#e9ecef;border-color:#dee2e6;color:#495057}.table-dark{background-color:#343a40;color:#fff}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075);color:#fff}@media(max-width:575.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-sm>.table-bordered{border:0}}@media(max-width:767.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-md>.table-bordered{border:0}}@media(max-width:991.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-lg>.table-bordered{border:0}}@media(max-width:1199.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive>.table-bordered{border:0}.form-control{background-clip:padding-box;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:block;font-size:.9rem;font-weight:400;height:calc(1.6em + .75rem + 2px);line-height:1.6;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{background-color:#fff;border-color:#a1cbef;box-shadow:0 0 0 .2rem rgba(52,144,220,.25);color:#495057;outline:0}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{background-color:#fff;color:#495057}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{font-size:inherit;line-height:1.6;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-top:calc(.375rem + 1px)}.col-form-label-lg{font-size:1.125rem;line-height:1.5;padding-bottom:calc(.5rem + 1px);padding-top:calc(.5rem + 1px)}.col-form-label-sm{font-size:.7875rem;line-height:1.5;padding-bottom:calc(.25rem + 1px);padding-top:calc(.25rem + 1px)}.form-control-plaintext{background-color:transparent;border:solid transparent;border-width:1px 0;color:#212529;display:block;font-size:.9rem;line-height:1.6;margin-bottom:0;padding:.375rem 0;width:100%}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{border-radius:.2rem;font-size:.7875rem;height:calc(1.5em + .5rem + 2px);line-height:1.5;padding:.25rem .5rem}.form-control-lg{border-radius:.3rem;font-size:1.125rem;height:calc(1.5em + 1rem + 2px);line-height:1.5;padding:.5rem 1rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.form-row>.col,.form-row>[class*=col-]{padding-left:5px;padding-right:5px}.form-check{display:block;padding-left:1.25rem;position:relative}.form-check-input{margin-left:-1.25rem;margin-top:.3rem;position:absolute}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{align-items:center;display:inline-flex;margin-right:.75rem;padding-left:0}.form-check-inline .form-check-input{margin-left:0;margin-right:.3125rem;margin-top:0;position:static}.valid-feedback{color:#38c172;display:none;font-size:.875em;margin-top:.25rem;width:100%}.valid-tooltip{background-color:rgba(56,193,114,.9);border-radius:.25rem;color:#fff;display:none;font-size:.7875rem;left:0;line-height:1.6;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2338c172' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.4em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.8em + .375rem) calc(.8em + .375rem);border-color:#38c172;padding-right:calc(1.6em + .75rem)!important}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#38c172;box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:top calc(.4em + .1875rem) right calc(.4em + .1875rem);padding-right:calc(1.6em + .75rem)}.custom-select.is-valid,.was-validated .custom-select:valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2338c172' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.8em + .375rem) calc(.8em + .375rem) no-repeat;border-color:#38c172;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#38c172;box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#38c172}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#38c172}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#38c172}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#5cd08d;border-color:#5cd08d}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before{border-color:#38c172}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#38c172}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#38c172;box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.invalid-feedback{color:#e3342f;display:none;font-size:.875em;margin-top:.25rem;width:100%}.invalid-tooltip{background-color:rgba(227,52,47,.9);border-radius:.25rem;color:#fff;display:none;font-size:.7875rem;left:0;line-height:1.6;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e3342f'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23e3342f' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.4em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.8em + .375rem) calc(.8em + .375rem);border-color:#e3342f;padding-right:calc(1.6em + .75rem)!important}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#e3342f;box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:top calc(.4em + .1875rem) right calc(.4em + .1875rem);padding-right:calc(1.6em + .75rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e3342f'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23e3342f' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.8em + .375rem) calc(.8em + .375rem) no-repeat;border-color:#e3342f;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#e3342f;box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#e3342f}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#e3342f}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#e3342f}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e9605c;border-color:#e9605c}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before{border-color:#e3342f}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#e3342f}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#e3342f;box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.form-inline{align-items:center;display:flex;flex-flow:row wrap}.form-inline .form-check{width:100%}@media(min-width:576px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{align-items:center;display:flex;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{align-items:center;display:flex;justify-content:center;padding-left:0;width:auto}.form-inline .form-check-input{flex-shrink:0;margin-left:0;margin-right:.25rem;margin-top:0;position:relative}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;color:#212529;display:inline-block;font-size:.9rem;font-weight:400;line-height:1.6;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}@media(prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.25);outline:0}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{background-color:#3490dc;border-color:#3490dc;color:#fff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{background-color:#227dc7;border-color:#2176bd;color:#fff}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(82,161,225,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#3490dc;border-color:#3490dc;color:#fff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{background-color:#2176bd;border-color:#1f6fb2;color:#fff}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,161,225,.5)}.btn-secondary{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{background-color:#5a6268;border-color:#545b62;color:#fff}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem hsla(208,6%,54%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{background-color:#545b62;border-color:#4e555b;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(208,6%,54%,.5)}.btn-success{background-color:#38c172;border-color:#38c172;color:#fff}.btn-success.focus,.btn-success:focus,.btn-success:hover{background-color:#2fa360;border-color:#2d995b;color:#fff}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(86,202,135,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#38c172;border-color:#38c172;color:#fff}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{background-color:#2d995b;border-color:#2a9055;color:#fff}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(86,202,135,.5)}.btn-info{background-color:#6cb2eb;border-color:#6cb2eb;color:#212529}.btn-info.focus,.btn-info:focus,.btn-info:hover{background-color:#4aa0e6;border-color:#3f9ae5;color:#fff}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(97,157,206,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#6cb2eb;border-color:#6cb2eb;color:#212529}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{background-color:#3f9ae5;border-color:#3495e3;color:#fff}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(97,157,206,.5)}.btn-warning{background-color:#ffed4a;border-color:#ffed4a;color:#212529}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{background-color:#ffe924;border-color:#ffe817;color:#212529}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,207,69,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#ffed4a;border-color:#ffed4a;color:#212529}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{background-color:#ffe817;border-color:#ffe70a;color:#212529}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,207,69,.5)}.btn-danger{background-color:#e3342f;border-color:#e3342f;color:#fff}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{background-color:#d0211c;border-color:#c51f1a;color:#fff}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(231,82,78,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#e3342f;border-color:#e3342f;color:#fff}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{background-color:#c51f1a;border-color:#b91d19;color:#fff}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(231,82,78,.5)}.btn-light{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-light.focus,.btn-light:focus,.btn-light:hover{background-color:#e2e6ea;border-color:#dae0e5;color:#212529}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem hsla(210,4%,85%,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{background-color:#dae0e5;border-color:#d3d9df;color:#212529}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(210,4%,85%,.5)}.btn-dark{background-color:#343a40;border-color:#343a40;color:#fff}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{background-color:#23272b;border-color:#1d2124;color:#fff}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#343a40;border-color:#343a40;color:#fff}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{background-color:#1d2124;border-color:#171a1d;color:#fff}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{border-color:#3490dc;color:#3490dc}.btn-outline-primary:hover{background-color:#3490dc;border-color:#3490dc;color:#fff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{background-color:transparent;color:#3490dc}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{background-color:#3490dc;border-color:#3490dc;color:#fff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-outline-secondary{border-color:#6c757d;color:#6c757d}.btn-outline-secondary:hover{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{background-color:transparent;color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-success{border-color:#38c172;color:#38c172}.btn-outline-success:hover{background-color:#38c172;border-color:#38c172;color:#fff}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{background-color:transparent;color:#38c172}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{background-color:#38c172;border-color:#38c172;color:#fff}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-outline-info{border-color:#6cb2eb;color:#6cb2eb}.btn-outline-info:hover{background-color:#6cb2eb;border-color:#6cb2eb;color:#212529}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{background-color:transparent;color:#6cb2eb}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{background-color:#6cb2eb;border-color:#6cb2eb;color:#212529}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-outline-warning{border-color:#ffed4a;color:#ffed4a}.btn-outline-warning:hover{background-color:#ffed4a;border-color:#ffed4a;color:#212529}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{background-color:transparent;color:#ffed4a}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{background-color:#ffed4a;border-color:#ffed4a;color:#212529}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-outline-danger{border-color:#e3342f;color:#e3342f}.btn-outline-danger:hover{background-color:#e3342f;border-color:#e3342f;color:#fff}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{background-color:transparent;color:#e3342f}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{background-color:#e3342f;border-color:#e3342f;color:#fff}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-outline-light{border-color:#f8f9fa;color:#f8f9fa}.btn-outline-light:hover{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{background-color:transparent;color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{border-color:#343a40;color:#343a40}.btn-outline-dark:hover{background-color:#343a40;border-color:#343a40;color:#fff}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{background-color:transparent;color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{background-color:#343a40;border-color:#343a40;color:#fff}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{color:#3490dc;font-weight:400;text-decoration:none}.btn-link:hover{color:#1d68a7}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{border-radius:.3rem;font-size:1.125rem;line-height:1.5;padding:.5rem 1rem}.btn-group-sm>.btn,.btn-sm{border-radius:.2rem;font-size:.7875rem;line-height:1.5;padding:.25rem .5rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;position:relative;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.width{height:auto;transition:width .35s ease;width:0}@media(prefers-reduced-motion:reduce){.collapsing.width{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{border-bottom:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;color:#212529;display:none;float:left;font-size:.9rem;left:0;list-style:none;margin:.125rem 0 0;min-width:10rem;padding:.5rem 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu-left{left:0;right:auto}.dropdown-menu-right{left:auto;right:0}@media(min-width:576px){.dropdown-menu-sm-left{left:0;right:auto}.dropdown-menu-sm-right{left:auto;right:0}}@media(min-width:768px){.dropdown-menu-md-left{left:0;right:auto}.dropdown-menu-md-right{left:auto;right:0}}@media(min-width:992px){.dropdown-menu-lg-left{left:0;right:auto}.dropdown-menu-lg-right{left:auto;right:0}}@media(min-width:1200px){.dropdown-menu-xl-left{left:0;right:auto}.dropdown-menu-xl-right{left:auto;right:0}}.dropup .dropdown-menu{bottom:100%;margin-bottom:.125rem;margin-top:0;top:auto}.dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{left:100%;margin-left:.125rem;margin-top:0;right:auto;top:0}.dropright .dropdown-toggle:after{border-bottom:.3em solid transparent;border-left:.3em solid;border-right:0;border-top:.3em solid transparent;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{left:auto;margin-right:.125rem;margin-top:0;right:100%;top:0}.dropleft .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:before{border-bottom:.3em solid transparent;border-right:.3em solid;border-top:.3em solid transparent;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{bottom:auto;right:auto}.dropdown-divider{border-top:1px solid #e9ecef;height:0;margin:.5rem 0;overflow:hidden}.dropdown-item{background-color:transparent;border:0;clear:both;color:#212529;display:block;font-weight:400;padding:.25rem 1.5rem;text-align:inherit;white-space:nowrap;width:100%}.dropdown-item:focus,.dropdown-item:hover{background-color:#e9ecef;color:#16181b;text-decoration:none}.dropdown-item.active,.dropdown-item:active{background-color:#3490dc;color:#fff;text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{background-color:transparent;color:#adb5bd;pointer-events:none}.dropdown-menu.show{display:block}.dropdown-header{color:#6c757d;display:block;font-size:.7875rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.dropdown-item-text{color:#212529;display:block;padding:.25rem 1.5rem}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{flex:1 1 auto;margin-bottom:0;min-width:0;position:relative;width:1%}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group>.custom-file{align-items:center;display:flex}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-bottom-left-radius:0;border-top-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{align-items:center;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:flex;font-size:.9rem;font-weight:400;line-height:1.6;margin-bottom:0;padding:.375rem .75rem;text-align:center;white-space:nowrap}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{border-radius:.3rem;font-size:1.125rem;line-height:1.5;padding:.5rem 1rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{border-radius:.2rem;font-size:.7875rem;line-height:1.5;padding:.25rem .5rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-bottom-left-radius:0;border-top-left-radius:0}.custom-control{display:block;min-height:1.44rem;padding-left:1.5rem;position:relative;-webkit-print-color-adjust:exact;print-color-adjust:exact;z-index:1}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{height:1.22rem;left:0;opacity:0;position:absolute;width:1rem;z-index:-1}.custom-control-input:checked~.custom-control-label:before{background-color:#3490dc;border-color:#3490dc;color:#fff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#a1cbef}.custom-control-input:not(:disabled):active~.custom-control-label:before{background-color:#cce3f6;border-color:#cce3f6;color:#fff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{margin-bottom:0;position:relative;vertical-align:top}.custom-control-label:before{background-color:#fff;border:1px solid #adb5bd;pointer-events:none}.custom-control-label:after,.custom-control-label:before{content:"";display:block;height:1rem;left:-1.5rem;position:absolute;top:.22rem;width:1rem}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='m6.564.75-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#3490dc;border-color:#3490dc}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{border-radius:.5rem;left:-2.25rem;pointer-events:all;width:1.75rem}.custom-switch .custom-control-label:after{background-color:#adb5bd;border-radius:.5rem;height:calc(1rem - 4px);left:calc(-2.25rem + 2px);top:calc(.22rem + 2px);transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:calc(1rem - 4px)}@media(prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:inline-block;font-size:.9rem;font-weight:400;height:calc(1.6em + .75rem + 2px);line-height:1.6;padding:.375rem 1.75rem .375rem .75rem;vertical-align:middle;width:100%}.custom-select:focus{border-color:#a1cbef;box-shadow:0 0 0 .2rem rgba(52,144,220,.25);outline:0}.custom-select:focus::-ms-value{background-color:#fff;color:#495057}.custom-select[multiple],.custom-select[size]:not([size="1"]){background-image:none;height:auto;padding-right:.75rem}.custom-select:disabled{background-color:#e9ecef;color:#6c757d}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{font-size:.7875rem;height:calc(1.5em + .5rem + 2px);padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.custom-select-lg{font-size:1.125rem;height:calc(1.5em + 1rem + 2px);padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{height:calc(1.6em + .75rem + 2px);position:relative;width:100%}.custom-file-input{margin:0;opacity:0;overflow:hidden;z-index:2}.custom-file-input:focus~.custom-file-label{border-color:#a1cbef;box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;font-weight:400;height:calc(1.6em + .75rem + 2px);left:0;overflow:hidden;z-index:1}.custom-file-label,.custom-file-label:after{color:#495057;line-height:1.6;padding:.375rem .75rem;position:absolute;right:0;top:0}.custom-file-label:after{background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0;bottom:0;content:"Browse";display:block;height:calc(1.6em + .75rem);z-index:3}.custom-range{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;height:1.4rem;padding:0;width:100%}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#3490dc;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media(prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#cce3f6}.custom-range::-webkit-slider-runnable-track{background-color:#dee2e6;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-moz-range-thumb{-moz-appearance:none;appearance:none;background-color:#3490dc;border:0;border-radius:1rem;height:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media(prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#cce3f6}.custom-range::-moz-range-track{background-color:#dee2e6;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-thumb{appearance:none;background-color:#3490dc;border:0;border-radius:1rem;height:1rem;margin-left:.2rem;margin-right:.2rem;margin-top:0;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media(prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#cce3f6}.custom-range::-ms-track{background-color:transparent;border-color:transparent;border-width:.5rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;cursor:default;pointer-events:none}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{background-color:transparent;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem;margin-bottom:-1px}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{background-color:transparent;border-color:transparent;color:#6c757d}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{background-color:#f8fafc;border-color:#dee2e6 #dee2e6 #f8fafc;color:#495057}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.nav-pills .nav-link{background:none;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{background-color:#3490dc;color:#fff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{padding:.5rem 1rem;position:relative}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.navbar-brand{display:inline-block;font-size:1.125rem;line-height:inherit;margin-right:1rem;padding-bottom:.32rem;padding-top:.32rem;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.navbar-nav .nav-link{padding-left:0;padding-right:0}.navbar-nav .dropdown-menu{float:none;position:static}.navbar-text{display:inline-block;padding-bottom:.5rem;padding-top:.5rem}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{background-color:transparent;border:1px solid transparent;border-radius:.25rem;font-size:1.125rem;line-height:1;padding:.25rem .75rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{background:50%/100% 100% no-repeat;content:"";display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media(max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-left:0;padding-right:0}}@media(min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-left:0;padding-right:0}}@media(min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-left:0;padding-right:0}}@media(min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-left:0;padding-right:0}}@media(min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-left:0;padding-right:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.5)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{border-color:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{word-wrap:break-word;background-clip:border-box;background-color:#fff;border:1px solid rgba(0,0,0,.125);border-radius:.25rem;display:flex;flex-direction:column;min-width:0;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-bottom:inherit;border-top:inherit}.card>.list-group:first-child{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);border-top-width:0}.card>.list-group:last-child{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px);border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125);margin-bottom:0;padding:.75rem 1.25rem}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125);padding:.75rem 1.25rem}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{border-bottom:0;margin-bottom:-.75rem}.card-header-pills,.card-header-tabs{margin-left:-.625rem;margin-right:-.625rem}.card-img-overlay{border-radius:calc(.25rem - 1px);bottom:0;left:0;padding:1.25rem;position:absolute;right:0;top:0}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media(min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-left:-15px;margin-right:-15px}.card-deck .card{flex:1 0 0%;margin-bottom:0;margin-left:15px;margin-right:15px}}.card-group>.card{margin-bottom:15px}@media(min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media(min-width:576px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{background-color:#e9ecef;border-radius:.25rem;display:flex;flex-wrap:wrap;list-style:none;margin-bottom:1rem;padding:.75rem 1rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{color:#6c757d;content:"/";float:left;padding-right:.5rem}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{border-radius:.25rem;display:flex;list-style:none;padding-left:0}.page-link{background-color:#fff;border:1px solid #dee2e6;color:#3490dc;display:block;line-height:1.25;margin-left:-1px;padding:.5rem .75rem;position:relative}.page-link:hover{background-color:#e9ecef;border-color:#dee2e6;color:#1d68a7;text-decoration:none;z-index:2}.page-link:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.25);outline:0;z-index:3}.page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem;margin-left:0}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link{background-color:#3490dc;border-color:#3490dc;color:#fff;z-index:3}.page-item.disabled .page-link{background-color:#fff;border-color:#dee2e6;color:#6c757d;cursor:auto;pointer-events:none}.pagination-lg .page-link{font-size:1.125rem;line-height:1.5;padding:.75rem 1.5rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.3rem;border-top-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.3rem;border-top-right-radius:.3rem}.pagination-sm .page-link{font-size:.7875rem;line-height:1.5;padding:.25rem .5rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.badge{border-radius:.25rem;display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .4em;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:baseline;white-space:nowrap}@media(prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.badge-primary{background-color:#3490dc;color:#fff}a.badge-primary:focus,a.badge-primary:hover{background-color:#2176bd;color:#fff}a.badge-primary.focus,a.badge-primary:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.5);outline:0}.badge-secondary{background-color:#6c757d;color:#fff}a.badge-secondary:focus,a.badge-secondary:hover{background-color:#545b62;color:#fff}a.badge-secondary.focus,a.badge-secondary:focus{box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);outline:0}.badge-success{background-color:#38c172;color:#fff}a.badge-success:focus,a.badge-success:hover{background-color:#2d995b;color:#fff}a.badge-success.focus,a.badge-success:focus{box-shadow:0 0 0 .2rem rgba(56,193,114,.5);outline:0}.badge-info{background-color:#6cb2eb;color:#212529}a.badge-info:focus,a.badge-info:hover{background-color:#3f9ae5;color:#212529}a.badge-info.focus,a.badge-info:focus{box-shadow:0 0 0 .2rem rgba(108,178,235,.5);outline:0}.badge-warning{background-color:#ffed4a;color:#212529}a.badge-warning:focus,a.badge-warning:hover{background-color:#ffe817;color:#212529}a.badge-warning.focus,a.badge-warning:focus{box-shadow:0 0 0 .2rem rgba(255,237,74,.5);outline:0}.badge-danger{background-color:#e3342f;color:#fff}a.badge-danger:focus,a.badge-danger:hover{background-color:#c51f1a;color:#fff}a.badge-danger.focus,a.badge-danger:focus{box-shadow:0 0 0 .2rem rgba(227,52,47,.5);outline:0}.badge-light{background-color:#f8f9fa;color:#212529}a.badge-light:focus,a.badge-light:hover{background-color:#dae0e5;color:#212529}a.badge-light.focus,a.badge-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5);outline:0}.badge-dark{background-color:#343a40;color:#fff}a.badge-dark:focus,a.badge-dark:hover{background-color:#1d2124;color:#fff}a.badge-dark.focus,a.badge-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5);outline:0}.jumbotron{background-color:#e9ecef;border-radius:.3rem;margin-bottom:2rem;padding:2rem 1rem}@media(min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{border-radius:0;padding-left:0;padding-right:0}.alert{border:1px solid transparent;border-radius:.25rem;margin-bottom:1rem;padding:.75rem 1.25rem;position:relative}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.85rem}.alert-dismissible .close{color:inherit;padding:.75rem 1.25rem;position:absolute;right:0;top:0;z-index:2}.alert-primary{background-color:#d6e9f8;border-color:#c6e0f5;color:#1b4b72}.alert-primary hr{border-top-color:#b0d4f1}.alert-primary .alert-link{color:#113049}.alert-secondary{background-color:#e2e3e5;border-color:#d6d8db;color:#383d41}.alert-secondary hr{border-top-color:#c8cccf}.alert-secondary .alert-link{color:#212326}.alert-success{background-color:#d7f3e3;border-color:#c7eed8;color:#1d643b}.alert-success hr{border-top-color:#b4e8ca}.alert-success .alert-link{color:#123d24}.alert-info{background-color:#e2f0fb;border-color:#d6e9f9;color:#385d7a}.alert-info hr{border-top-color:#bfdef6}.alert-info .alert-link{color:#284257}.alert-warning{background-color:#fffbdb;border-color:#fffacc;color:#857b26}.alert-warning hr{border-top-color:#fff7b3}.alert-warning .alert-link{color:#5d571b}.alert-danger{background-color:#f9d6d5;border-color:#f7c6c5;color:#761b18}.alert-danger hr{border-top-color:#f4b0ae}.alert-danger .alert-link{color:#4c1110}.alert-light{background-color:#fefefe;border-color:#fdfdfe;color:#818182}.alert-light hr{border-top-color:#eef1f3}.alert-light .alert-link{color:#686868}.alert-dark{background-color:#d6d8d9;border-color:#c6c8ca;color:#1b1e21}.alert-dark hr{border-top-color:#b9bbbd}.alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{background-color:#e9ecef;border-radius:.25rem;font-size:.675rem;height:1rem;line-height:0}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{background-color:#3490dc;color:#fff;flex-direction:column;justify-content:center;text-align:center;transition:width .6s ease;white-space:nowrap}@media(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media(prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.media{align-items:flex-start;display:flex}.media-body{flex:1}.list-group{border-radius:.25rem;display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.list-group-item-action{color:#495057;text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{background-color:#f8f9fa;color:#495057;text-decoration:none;z-index:1}.list-group-item-action:active{background-color:#e9ecef;color:#212529}.list-group-item{background-color:#fff;border:1px solid rgba(0,0,0,.125);display:block;padding:.75rem 1.25rem;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{background-color:#fff;color:#6c757d;pointer-events:none}.list-group-item.active{background-color:#3490dc;border-color:#3490dc;color:#fff;z-index:2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{border-top-width:1px;margin-top:-1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}@media(min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media(min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media(min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media(min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{background-color:#c6e0f5;color:#1b4b72}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{background-color:#b0d4f1;color:#1b4b72}.list-group-item-primary.list-group-item-action.active{background-color:#1b4b72;border-color:#1b4b72;color:#fff}.list-group-item-secondary{background-color:#d6d8db;color:#383d41}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{background-color:#c8cccf;color:#383d41}.list-group-item-secondary.list-group-item-action.active{background-color:#383d41;border-color:#383d41;color:#fff}.list-group-item-success{background-color:#c7eed8;color:#1d643b}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{background-color:#b4e8ca;color:#1d643b}.list-group-item-success.list-group-item-action.active{background-color:#1d643b;border-color:#1d643b;color:#fff}.list-group-item-info{background-color:#d6e9f9;color:#385d7a}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{background-color:#bfdef6;color:#385d7a}.list-group-item-info.list-group-item-action.active{background-color:#385d7a;border-color:#385d7a;color:#fff}.list-group-item-warning{background-color:#fffacc;color:#857b26}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{background-color:#fff7b3;color:#857b26}.list-group-item-warning.list-group-item-action.active{background-color:#857b26;border-color:#857b26;color:#fff}.list-group-item-danger{background-color:#f7c6c5;color:#761b18}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{background-color:#f4b0ae;color:#761b18}.list-group-item-danger.list-group-item-action.active{background-color:#761b18;border-color:#761b18;color:#fff}.list-group-item-light{background-color:#fdfdfe;color:#818182}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{background-color:#eef1f3;color:#818182}.list-group-item-light.list-group-item-action.active{background-color:#818182;border-color:#818182;color:#fff}.list-group-item-dark{background-color:#c6c8ca;color:#1b1e21}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{background-color:#b9bbbd;color:#1b1e21}.list-group-item-dark.list-group-item-action.active{background-color:#1b1e21;border-color:#1b1e21;color:#fff}.close{color:#000;float:right;font-size:1.35rem;font-weight:700;line-height:1;opacity:.5;text-shadow:0 1px 0 #fff}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{background-color:transparent;border:0;padding:0}a.close.disabled{pointer-events:none}.toast{background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border:1px solid rgba(0,0,0,.1);border-radius:.25rem;box-shadow:0 .25rem .75rem rgba(0,0,0,.1);flex-basis:350px;font-size:.875rem;max-width:350px;opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{align-items:center;background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);color:#6c757d;display:flex;padding:.25rem .75rem}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{display:none;height:100%;left:0;outline:0;overflow:hidden;position:fixed;top:0;width:100%;z-index:1050}.modal-dialog{margin:.5rem;pointer-events:none;position:relative;width:auto}.modal.fade .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{content:"";display:block;height:calc(100vh - 1rem);height:-moz-min-content;height:min-content}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;height:100%;justify-content:center}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.modal-backdrop{background-color:#000;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{align-items:flex-start;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);display:flex;justify-content:space-between;padding:1rem}.modal-header .close{margin:-1rem -1rem -1rem auto;padding:1rem}.modal-title{line-height:1.6;margin-bottom:0}.modal-body{flex:1 1 auto;padding:1rem;position:relative}.modal-footer{align-items:center;border-bottom-left-radius:calc(.3rem - 1px);border-bottom-right-radius:calc(.3rem - 1px);border-top:1px solid #dee2e6;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:.75rem}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media(min-width:576px){.modal-dialog{margin:1.75rem auto;max-width:500px}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media(min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media(min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{word-wrap:break-word;display:block;font-family:Nunito,sans-serif;font-size:.7875rem;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.6;margin:0;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1070}.tooltip.show{opacity:.9}.tooltip .arrow{display:block;height:.4rem;position:absolute;width:.8rem}.tooltip .arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{border-top-color:#000;border-width:.4rem .4rem 0;top:0}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{height:.8rem;left:0;width:.4rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{border-right-color:#000;border-width:.4rem .4rem .4rem 0;right:0}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{border-bottom-color:#000;border-width:0 .4rem .4rem;bottom:0}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{height:.8rem;right:0;width:.4rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{border-left-color:#000;border-width:.4rem 0 .4rem .4rem;left:0}.tooltip-inner{background-color:#000;border-radius:.25rem;color:#fff;max-width:200px;padding:.25rem .5rem;text-align:center}.popover{word-wrap:break-word;background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;font-family:Nunito,sans-serif;font-size:.7875rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.6;max-width:276px;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1060}.popover,.popover .arrow{display:block;position:absolute}.popover .arrow{height:.5rem;margin:0 .3rem;width:1rem}.popover .arrow:after,.popover .arrow:before{border-color:transparent;border-style:solid;content:"";display:block;position:absolute}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{border-top-color:rgba(0,0,0,.25);border-width:.5rem .5rem 0;bottom:0}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{border-top-color:#fff;border-width:.5rem .5rem 0;bottom:1px}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{height:1rem;left:calc(-.5rem - 1px);margin:.3rem 0;width:.5rem}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{border-right-color:rgba(0,0,0,.25);border-width:.5rem .5rem .5rem 0;left:0}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{border-right-color:#fff;border-width:.5rem .5rem .5rem 0;left:1px}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{border-bottom-color:rgba(0,0,0,.25);border-width:0 .5rem .5rem;top:0}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{border-bottom-color:#fff;border-width:0 .5rem .5rem;top:1px}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:1px solid #f7f7f7;content:"";display:block;left:50%;margin-left:-.5rem;position:absolute;top:0;width:1rem}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{height:1rem;margin:.3rem 0;right:calc(-.5rem - 1px);width:.5rem}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{border-left-color:rgba(0,0,0,.25);border-width:.5rem 0 .5rem .5rem;right:0}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{border-left-color:#fff;border-width:.5rem 0 .5rem .5rem;right:1px}.popover-header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);font-size:.9rem;margin-bottom:0;padding:.5rem .75rem}.popover-header:empty{display:none}.popover-body{color:#212529;padding:.5rem .75rem}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{overflow:hidden;position:relative;width:100%}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1;z-index:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0;transition:opacity 0s .6s;z-index:0}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{align-items:center;background:none;border:0;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;padding:0;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media(prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background:50%/100% 100% no-repeat;display:inline-block;height:20px;width:20px}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m5.25 0-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m2.75 0-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-left:15%;margin-right:15%;padding-left:0;position:absolute;right:0;z-index:15}.carousel-indicators li{background-clip:padding-box;background-color:#fff;border-bottom:10px solid transparent;border-top:10px solid transparent;box-sizing:content-box;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;text-indent:-999px;transition:opacity .6s ease;width:30px}@media(prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{bottom:20px;color:#fff;left:15%;padding-bottom:20px;padding-top:20px;position:absolute;right:15%;text-align:center;z-index:10}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid transparent;display:inline-block;height:2rem;vertical-align:-.125em;width:2rem}.spinner-border-sm{border-width:.2em;height:1rem;width:1rem}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{animation:spinner-grow .75s linear infinite;background-color:currentcolor;border-radius:50%;display:inline-block;height:2rem;opacity:0;vertical-align:-.125em;width:2rem}.spinner-grow-sm{height:1rem;width:1rem}@media(prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#3490dc!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#2176bd!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#38c172!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#2d995b!important}.bg-info{background-color:#6cb2eb!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#3f9ae5!important}.bg-warning{background-color:#ffed4a!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#ffe817!important}.bg-danger{background-color:#e3342f!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#c51f1a!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#3490dc!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#38c172!important}.border-info{border-color:#6cb2eb!important}.border-warning{border-color:#ffed4a!important}.border-danger{border-color:#e3342f!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{clear:both;content:"";display:block}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media(min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media(min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media(min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media(min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.embed-responsive:before{content:"";display:block}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.embed-responsive-21by9:before{padding-top:42.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media(min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media(min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media(min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media(min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media(min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media(min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media(min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media(min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{left:0;position:fixed;right:0;z-index:1030}.fixed-bottom{bottom:0}@supports(position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;overflow:visible;position:static;white-space:normal;width:auto}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media(min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media(min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media(min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media(min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{background-color:transparent;bottom:0;content:"";left:0;pointer-events:auto;position:absolute;right:0;top:0;z-index:1}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media(min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media(min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media(min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media(min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#3490dc!important}a.text-primary:focus,a.text-primary:hover{color:#1d68a7!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#38c172!important}a.text-success:focus,a.text-success:hover{color:#27864f!important}.text-info{color:#6cb2eb!important}a.text-info:focus,a.text-info:hover{color:#298fe2!important}.text-warning{color:#ffed4a!important}a.text-warning:focus,a.text-warning:hover{color:#fde300!important}.text-danger{color:#e3342f!important}a.text-danger:focus,a.text-danger:hover{color:#ae1c17!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{background-color:transparent;border:0;color:transparent;font:0/0 a;text-shadow:none}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd}blockquote,img,pre,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{border-color:#dee2e6;color:inherit}}
diff --git a/public/css/lorekeeper.css b/public/css/lorekeeper.css
index 69da64e317..0e8e2acf4a 100644
--- a/public/css/lorekeeper.css
+++ b/public/css/lorekeeper.css
@@ -68,6 +68,17 @@ body {
height: auto !important;
}
+.mobile-handle {
+ font-size: 1.75rem;
+ position: absolute;
+ top: -1rem;
+ right: 0;
+}
+
+.mobile-handle i {
+ transform: rotate(-25deg);
+}
+
/**************************************************************************************************
Layout
@@ -753,3 +764,24 @@ tr.accountbound {
@media only screen and (max-width: 600px) {
.comment_replies { padding-left:1rem;}
}
+
+.content-warning {
+ filter: blur(2px) grayscale(60%);
+ transition: filter 0.25s ease;
+}
+
+.content-warning:hover {
+ filter: none;
+}
+
+/* CODE EDITOR *************************************************************************************/
+#ace-code-editor-wrapper .editor-btn {
+ background: white;
+ font-size: 14px;
+ height: 34px;
+ width: 34px;
+}
+
+#ace-code-editor-wrapper .editor-btn:hover {
+ background: buttonface;
+}
diff --git a/public/images/content_warning.png b/public/images/content-warning.png
similarity index 100%
rename from public/images/content_warning.png
rename to public/images/content-warning.png
diff --git a/public/js/app-secondary.js b/public/js/app-secondary.js
new file mode 100644
index 0000000000..9567e6d53b
--- /dev/null
+++ b/public/js/app-secondary.js
@@ -0,0 +1,2 @@
+/*! For license information please see app-secondary.js.LICENSE.txt */
+(()=>{var e={516:()=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}!function(t){"use strict";var n=function(e,n){this.$element=t(e),this.options=t.extend({},this.defaults(),n),this.render()};n.VERSION="3.4.0-beta",n.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"light",size:"normal",style:"",width:null,height:null},n.prototype.defaults=function(){return{on:this.$element.attr("data-on")||n.DEFAULTS.on,off:this.$element.attr("data-off")||n.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||n.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||n.DEFAULTS.offstyle,size:this.$element.attr("data-size")||n.DEFAULTS.size,style:this.$element.attr("data-style")||n.DEFAULTS.style,width:this.$element.attr("data-width")||n.DEFAULTS.width,height:this.$element.attr("data-height")||n.DEFAULTS.height}},n.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var e="large"===this.options.size||"lg"===this.options.size?"btn-lg":"small"===this.options.size||"sm"===this.options.size?"btn-sm":"mini"===this.options.size||"xs"===this.options.size?"btn-xs":"",n=t('').html(this.options.on).addClass(this._onstyle+" "+e),i=t('').html(this.options.off).addClass(this._offstyle+" "+e),r=t('').addClass(e),o=t('').append(n,i,r),a=t('
').addClass(this.$element.prop("checked")?this._onstyle:this._offstyle+" off").addClass(e).addClass(this.options.style);this.$element.wrap(a),t.extend(this,{$toggle:this.$element.parent(),$toggleOn:n,$toggleOff:i,$toggleGroup:o}),this.$toggle.append(o);var s=this.options.width||Math.max(n.outerWidth(),i.outerWidth())+r.outerWidth()/2,l=this.options.height||Math.max(n.outerHeight(),i.outerHeight());n.addClass("toggle-on"),i.addClass("toggle-off"),this.$toggle.css({width:s,height:l}),this.options.height&&(n.css("line-height",n.height()+"px"),i.css("line-height",i.height()+"px")),this.update(!0),this.trigger(!0)},n.prototype.toggle=function(){this.$element.prop("checked")?this.off():this.on()},n.prototype.on=function(e){if(this.$element.prop("disabled"))return!1;this.$toggle.removeClass(this._offstyle+" off").addClass(this._onstyle),this.$element.prop("checked",!0),e||this.trigger()},n.prototype.off=function(e){if(this.$element.prop("disabled"))return!1;this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+" off"),this.$element.prop("checked",!1),e||this.trigger()},n.prototype.enable=function(){this.$toggle.removeAttr("disabled"),this.$element.prop("disabled",!1)},n.prototype.disable=function(){this.$toggle.attr("disabled","disabled"),this.$element.prop("disabled",!0)},n.prototype.update=function(e){this.$element.prop("disabled")?this.disable():this.enable(),this.$element.prop("checked")?this.on(e):this.off(e)},n.prototype.trigger=function(e){this.$element.off("change.bs.toggle"),e||this.$element.change(),this.$element.on("change.bs.toggle",t.proxy((function(){this.update()}),this))},n.prototype.destroy=function(){this.$element.off("change.bs.toggle"),this.$toggleGroup.remove(),this.$element.removeData("bs.toggle"),this.$element.unwrap()};var i=t.fn.bootstrapToggle;t.fn.bootstrapToggle=function(i){return this.each((function(){var r=t(this),o=r.data("bs.toggle"),a="object"==e(i)&&i;o||r.data("bs.toggle",o=new n(this,a)),"string"==typeof i&&o[i]&&o[i]()}))},t.fn.bootstrapToggle.Constructor=n,t.fn.toggle.noConflict=function(){return t.fn.bootstrapToggle=i,this},t((function(){t("input[type=checkbox][data-toggle^=toggle]").bootstrapToggle()})),t(document).on("touch.bs.toggle click.bs.toggle","div[data-toggle^=toggle]",(function(e){t(this).find("input[type=checkbox]").bootstrapToggle("toggle"),e.preventDefault()}))}(jQuery)},566:function(e,t,n){var i,r,o;r=[n(755)],void 0===(o="function"==typeof(i=function(e){function t(t){this.album=[],this.currentImageIndex=void 0,this.init(),this.options=e.extend({},this.constructor.defaults),this.option(t)}return t.defaults={albumLabel:"Image %1 of %2",alwaysShowNavOnTouchDevices:!1,fadeDuration:600,fitImagesInViewport:!0,imageFadeDuration:600,positionFromTop:50,resizeDuration:700,showImageNumberLabel:!0,wrapAround:!1,disableScrolling:!1,sanitizeTitle:!1},t.prototype.option=function(t){e.extend(this.options,t)},t.prototype.imageCountLabel=function(e,t){return this.options.albumLabel.replace(/%1/g,e).replace(/%2/g,t)},t.prototype.init=function(){var t=this;e(document).ready((function(){t.enable(),t.build()}))},t.prototype.enable=function(){var t=this;e("body").on("click","a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]",(function(n){return t.start(e(n.currentTarget)),!1}))},t.prototype.build=function(){if(!(e("#lightbox").length>0)){var t=this;e('
').appendTo(e("body")),this.$lightbox=e("#lightbox"),this.$overlay=e("#lightboxOverlay"),this.$outerContainer=this.$lightbox.find(".lb-outerContainer"),this.$container=this.$lightbox.find(".lb-container"),this.$image=this.$lightbox.find(".lb-image"),this.$nav=this.$lightbox.find(".lb-nav"),this.containerPadding={top:parseInt(this.$container.css("padding-top"),10),right:parseInt(this.$container.css("padding-right"),10),bottom:parseInt(this.$container.css("padding-bottom"),10),left:parseInt(this.$container.css("padding-left"),10)},this.imageBorderWidth={top:parseInt(this.$image.css("border-top-width"),10),right:parseInt(this.$image.css("border-right-width"),10),bottom:parseInt(this.$image.css("border-bottom-width"),10),left:parseInt(this.$image.css("border-left-width"),10)},this.$overlay.hide().on("click",(function(){return t.end(),!1})),this.$lightbox.hide().on("click",(function(n){"lightbox"===e(n.target).attr("id")&&t.end()})),this.$outerContainer.on("click",(function(n){return"lightbox"===e(n.target).attr("id")&&t.end(),!1})),this.$lightbox.find(".lb-prev").on("click",(function(){return 0===t.currentImageIndex?t.changeImage(t.album.length-1):t.changeImage(t.currentImageIndex-1),!1})),this.$lightbox.find(".lb-next").on("click",(function(){return t.currentImageIndex===t.album.length-1?t.changeImage(0):t.changeImage(t.currentImageIndex+1),!1})),this.$nav.on("mousedown",(function(e){3===e.which&&(t.$nav.css("pointer-events","none"),t.$lightbox.one("contextmenu",(function(){setTimeout(function(){this.$nav.css("pointer-events","auto")}.bind(t),0)})))})),this.$lightbox.find(".lb-loader, .lb-close").on("click",(function(){return t.end(),!1}))}},t.prototype.start=function(t){var n=this,i=e(window);i.on("resize",e.proxy(this.sizeOverlay,this)),this.sizeOverlay(),this.album=[];var r=0;function o(e){n.album.push({alt:e.attr("data-alt"),link:e.attr("href"),title:e.attr("data-title")||e.attr("title")})}var a,s=t.attr("data-lightbox");if(s){a=e(t.prop("tagName")+'[data-lightbox="'+s+'"]');for(var l=0;l
c||a.height>u)&&(a.width/c>a.height/u?(l=c,s=parseInt(a.height/(a.width/l),10),o.width(l),o.height(s)):(s=u,l=parseInt(a.width/(a.height/s),10),o.width(l),o.height(s))),n.sizeContainer(o.width(),o.height())},a.src=this.album[t].link,this.currentImageIndex=t},t.prototype.sizeOverlay=function(){var t=this;setTimeout((function(){t.$overlay.width(e(document).width()).height(e(document).height())}),0)},t.prototype.sizeContainer=function(e,t){var n=this,i=this.$outerContainer.outerWidth(),r=this.$outerContainer.outerHeight(),o=e+this.containerPadding.left+this.containerPadding.right+this.imageBorderWidth.left+this.imageBorderWidth.right,a=t+this.containerPadding.top+this.containerPadding.bottom+this.imageBorderWidth.top+this.imageBorderWidth.bottom;function s(){n.$lightbox.find(".lb-dataContainer").width(o),n.$lightbox.find(".lb-prevLink").height(a),n.$lightbox.find(".lb-nextLink").height(a),n.$overlay.focus(),n.showImage()}i!==o||r!==a?this.$outerContainer.animate({width:o,height:a},this.options.resizeDuration,"swing",(function(){s()})):s()},t.prototype.showImage=function(){this.$lightbox.find(".lb-loader").stop(!0).hide(),this.$lightbox.find(".lb-image").fadeIn(this.options.imageFadeDuration),this.updateNav(),this.updateDetails(),this.preloadNeighboringImages(),this.enableKeyboardNav()},t.prototype.updateNav=function(){var e=!1;try{document.createEvent("TouchEvent"),e=!!this.options.alwaysShowNavOnTouchDevices}catch(e){}this.$lightbox.find(".lb-nav").show(),this.album.length>1&&(this.options.wrapAround?(e&&this.$lightbox.find(".lb-prev, .lb-next").css("opacity","1"),this.$lightbox.find(".lb-prev, .lb-next").show()):(this.currentImageIndex>0&&(this.$lightbox.find(".lb-prev").show(),e&&this.$lightbox.find(".lb-prev").css("opacity","1")),this.currentImageIndex1&&this.options.showImageNumberLabel){var n=this.imageCountLabel(this.currentImageIndex+1,this.album.length);this.$lightbox.find(".lb-number").text(n).fadeIn("fast")}else this.$lightbox.find(".lb-number").hide();this.$outerContainer.removeClass("animating"),this.$lightbox.find(".lb-dataContainer").fadeIn(this.options.resizeDuration,(function(){return e.sizeOverlay()}))},t.prototype.preloadNeighboringImages=function(){this.album.length>this.currentImageIndex+1&&((new Image).src=this.album[this.currentImageIndex+1].link),this.currentImageIndex>0&&((new Image).src=this.album[this.currentImageIndex-1].link)},t.prototype.enableKeyboardNav=function(){this.$lightbox.on("keyup.keyboard",e.proxy(this.keyboardAction,this)),this.$overlay.on("keyup.keyboard",e.proxy(this.keyboardAction,this))},t.prototype.disableKeyboardNav=function(){this.$lightbox.off(".keyboard"),this.$overlay.off(".keyboard")},t.prototype.keyboardAction=function(e){var t=27,n=37,i=39,r=e.keyCode;r===t?(e.stopPropagation(),this.end()):r===n?0!==this.currentImageIndex?this.changeImage(this.currentImageIndex-1):this.options.wrapAround&&this.album.length>1&&this.changeImage(this.album.length-1):r===i&&(this.currentImageIndex!==this.album.length-1?this.changeImage(this.currentImageIndex+1):this.options.wrapAround&&this.album.length>1&&this.changeImage(0))},t.prototype.end=function(){this.disableKeyboardNav(),e(window).off("resize",this.sizeOverlay),this.$lightbox.fadeOut(this.options.fadeDuration),this.$overlay.fadeOut(this.options.fadeDuration),this.options.disableScrolling&&e("body").removeClass("lb-disable-scrolling")},new t})?i.apply(t,r):i)||(e.exports=o)},755:function(e,t){var n;!function(t,n){"use strict";"object"==typeof e.exports?e.exports=t.document?n(t,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return n(e)}:n(t)}("undefined"!=typeof window?window:this,(function(i,r){"use strict";var o=[],a=Object.getPrototypeOf,s=o.slice,l=o.flat?function(e){return o.flat.call(e)}:function(e){return o.concat.apply([],e)},u=o.push,c=o.indexOf,f={},d=f.toString,p=f.hasOwnProperty,h=p.toString,g=h.call(Object),m={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},b=i.document,x={type:!0,src:!0,nonce:!0,noModule:!0};function w(e,t,n){var i,r,o=(n=n||b).createElement("script");if(o.text=e,t)for(i in x)(r=t[i]||t.getAttribute&&t.getAttribute(i))&&o.setAttribute(i,r);n.head.appendChild(o).parentNode.removeChild(o)}function T(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?f[d.call(e)]||"object":typeof e}var C="3.7.1",k=/HTML$/i,A=function(e,t){return new A.fn.init(e,t)};function S(e){var t=!!e&&"length"in e&&e.length,n=T(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function E(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}A.fn=A.prototype={jquery:C,constructor:A,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=A.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return A.each(this,e)},map:function(e){return this.pushStack(A.map(this,(function(t,n){return e.call(t,n,t)})))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(A.grep(this,(function(e,t){return(t+1)%2})))},odd:function(){return this.pushStack(A.grep(this,(function(e,t){return t%2})))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n+~]|"+I+")"+I+"*"),F=new RegExp(I+"|>"),B=new RegExp(P),_=new RegExp("^"+L+"$"),z={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+I+"*(even|odd|(([+-]|)(\\d*)n|)"+I+"*(?:([+-]|)"+I+"*(\\d+)|))"+I+"*\\)|)","i"),bool:new RegExp("^(?:"+S+")$","i"),needsContext:new RegExp("^"+I+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+I+"*((?:-\\d)?\\d*)"+I+"*\\)|)(?=[^-]|$)","i")},U=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,V=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/[+~]/,Q=new RegExp("\\\\[\\da-fA-F]{1,6}"+I+"?|\\\\([^\\r\\n\\f])","g"),Y=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},K=function(){le()},J=de((function(e){return!0===e.disabled&&E(e,"fieldset")}),{dir:"parentNode",next:"legend"});try{g.apply(o=s.call(H.childNodes),H.childNodes),o[H.childNodes.length].nodeType}catch(e){g={apply:function(e,t){q.apply(e,s.call(t))},call:function(e){q.apply(e,s.call(arguments,1))}}}function Z(e,t,n,i){var r,o,a,s,u,c,p,h=t&&t.ownerDocument,y=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==y&&9!==y&&11!==y)return n;if(!i&&(le(t),t=t||l,f)){if(11!==y&&(u=V.exec(e)))if(r=u[1]){if(9===y){if(!(a=t.getElementById(r)))return n;if(a.id===r)return g.call(n,a),n}else if(h&&(a=h.getElementById(r))&&Z.contains(t,a)&&a.id===r)return g.call(n,a),n}else{if(u[2])return g.apply(n,t.getElementsByTagName(e)),n;if((r=u[3])&&t.getElementsByClassName)return g.apply(n,t.getElementsByClassName(r)),n}if(!(C[e+" "]||d&&d.test(e))){if(p=e,h=t,1===y&&(F.test(e)||W.test(e))){for((h=G.test(e)&&se(t.parentNode)||t)==t&&m.scope||((s=t.getAttribute("id"))?s=A.escapeSelector(s):t.setAttribute("id",s=v)),o=(c=ce(e)).length;o--;)c[o]=(s?"#"+s:":scope")+" "+fe(c[o]);p=c.join(",")}try{return g.apply(n,h.querySelectorAll(p)),n}catch(t){C(e,!0)}finally{s===v&&t.removeAttribute("id")}}}return ye(e.replace(N,"$1"),t,n,i)}function ee(){var e=[];return function n(i,r){return e.push(i+" ")>t.cacheLength&&delete n[e.shift()],n[i+" "]=r}}function te(e){return e[v]=!0,e}function ne(e){var t=l.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ie(e){return function(t){return E(t,"input")&&t.type===e}}function re(e){return function(t){return(E(t,"input")||E(t,"button"))&&t.type===e}}function oe(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&J(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function ae(e){return te((function(t){return t=+t,te((function(n,i){for(var r,o=e([],n.length,t),a=o.length;a--;)n[r=o[a]]&&(n[r]=!(i[r]=n[r]))}))}))}function se(e){return e&&void 0!==e.getElementsByTagName&&e}function le(e){var n,i=e?e.ownerDocument||e:H;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!A.isXMLDoc(l),h=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&H!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",K),m.getById=ne((function(e){return u.appendChild(e).id=A.expando,!l.getElementsByName||!l.getElementsByName(A.expando).length})),m.disconnectedMatch=ne((function(e){return h.call(e,"*")})),m.scope=ne((function(){return l.querySelectorAll(":scope")})),m.cssHas=ne((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}})),m.getById?(t.filter.ID=function(e){var t=e.replace(Q,Y);return function(e){return e.getAttribute("id")===t}},t.find.ID=function(e,t){if(void 0!==t.getElementById&&f){var n=t.getElementById(e);return n?[n]:[]}}):(t.filter.ID=function(e){var t=e.replace(Q,Y);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},t.find.ID=function(e,t){if(void 0!==t.getElementById&&f){var n,i,r,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(r=t.getElementsByName(e),i=0;o=r[i++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),t.find.TAG=function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},t.find.CLASS=function(e,t){if(void 0!==t.getElementsByClassName&&f)return t.getElementsByClassName(e)},d=[],ne((function(e){var t;u.appendChild(e).innerHTML=" ",e.querySelectorAll("[selected]").length||d.push("\\["+I+"*(?:value|"+S+")"),e.querySelectorAll("[id~="+v+"-]").length||d.push("~="),e.querySelectorAll("a#"+v+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=l.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),u.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=l.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+I+"*name"+I+"*="+I+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),k=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!m.sortDetached&&t.compareDocumentPosition(e)===n?e===l||e.ownerDocument==H&&Z.contains(H,e)?-1:t===l||t.ownerDocument==H&&Z.contains(H,t)?1:r?c.call(r,e)-c.call(r,t):0:4&n?-1:1)},l):l}for(e in Z.matches=function(e,t){return Z(e,null,null,t)},Z.matchesSelector=function(e,t){if(le(e),f&&!C[t+" "]&&(!d||!d.test(t)))try{var n=h.call(e,t);if(n||m.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){C(t,!0)}return Z(t,l,null,[e]).length>0},Z.contains=function(e,t){return(e.ownerDocument||e)!=l&&le(e),A.contains(e,t)},Z.attr=function(e,n){(e.ownerDocument||e)!=l&&le(e);var i=t.attrHandle[n.toLowerCase()],r=i&&p.call(t.attrHandle,n.toLowerCase())?i(e,n,!f):void 0;return void 0!==r?r:e.getAttribute(n)},Z.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},A.uniqueSort=function(e){var t,n=[],i=0,o=0;if(a=!m.sortStable,r=!m.sortStable&&s.call(e,0),j.call(e,k),a){for(;t=e[o++];)t===e[o]&&(i=n.push(o));for(;i--;)$.call(e,n[i],1)}return r=null,e},A.fn.uniqueSort=function(){return this.pushStack(A.uniqueSort(s.apply(this)))},t=A.expr={cacheLength:50,createPseudo:te,match:z,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Q,Y),e[3]=(e[3]||e[4]||e[5]||"").replace(Q,Y),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||Z.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&Z.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return z.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&B.test(n)&&(t=ce(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Q,Y).toLowerCase();return"*"===e?function(){return!0}:function(e){return E(e,t)}},CLASS:function(e){var t=x[e+" "];return t||(t=new RegExp("(^|"+I+")"+e+"("+I+"|$)"))&&x(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(i){var r=Z.attr(i,e);return null==r?"!="===t:!t||(r+="","="===t?r===n:"!="===t?r!==n:"^="===t?n&&0===r.indexOf(n):"*="===t?n&&r.indexOf(n)>-1:"$="===t?n&&r.slice(-n.length)===n:"~="===t?(" "+r.replace(R," ")+" ").indexOf(n)>-1:"|="===t&&(r===n||r.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,i,r){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===i&&0===r?function(e){return!!e.parentNode}:function(t,n,l){var u,c,f,d,p,h=o!==a?"nextSibling":"previousSibling",g=t.parentNode,m=s&&t.nodeName.toLowerCase(),b=!l&&!s,x=!1;if(g){if(o){for(;h;){for(f=t;f=f[h];)if(s?E(f,m):1===f.nodeType)return!1;p=h="only"===e&&!p&&"nextSibling"}return!0}if(p=[a?g.firstChild:g.lastChild],a&&b){for(x=(d=(u=(c=g[v]||(g[v]={}))[e]||[])[0]===y&&u[1])&&u[2],f=d&&g.childNodes[d];f=++d&&f&&f[h]||(x=d=0)||p.pop();)if(1===f.nodeType&&++x&&f===t){c[e]=[y,d,x];break}}else if(b&&(x=d=(u=(c=t[v]||(t[v]={}))[e]||[])[0]===y&&u[1]),!1===x)for(;(f=++d&&f&&f[h]||(x=d=0)||p.pop())&&(!(s?E(f,m):1===f.nodeType)||!++x||(b&&((c=f[v]||(f[v]={}))[e]=[y,x]),f!==t)););return(x-=r)===i||x%i==0&&x/i>=0}}},PSEUDO:function(e,n){var i,r=t.pseudos[e]||t.setFilters[e.toLowerCase()]||Z.error("unsupported pseudo: "+e);return r[v]?r(n):r.length>1?(i=[e,e,"",n],t.setFilters.hasOwnProperty(e.toLowerCase())?te((function(e,t){for(var i,o=r(e,n),a=o.length;a--;)e[i=c.call(e,o[a])]=!(t[i]=o[a])})):function(e){return r(e,0,i)}):r}},pseudos:{not:te((function(e){var t=[],n=[],i=ve(e.replace(N,"$1"));return i[v]?te((function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))})):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}})),has:te((function(e){return function(t){return Z(e,t).length>0}})),contains:te((function(e){return e=e.replace(Q,Y),function(t){return(t.textContent||A.text(t)).indexOf(e)>-1}})),lang:te((function(e){return _.test(e||"")||Z.error("unsupported lang: "+e),e=e.replace(Q,Y).toLowerCase(),function(t){var n;do{if(n=f?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}})),target:function(e){var t=i.location&&i.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===u},focus:function(e){return e===function(){try{return l.activeElement}catch(e){}}()&&l.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:oe(!1),disabled:oe(!0),checked:function(e){return E(e,"input")&&!!e.checked||E(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!t.pseudos.empty(e)},header:function(e){return X.test(e.nodeName)},input:function(e){return U.test(e.nodeName)},button:function(e){return E(e,"input")&&"button"===e.type||E(e,"button")},text:function(e){var t;return E(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ae((function(){return[0]})),last:ae((function(e,t){return[t-1]})),eq:ae((function(e,t,n){return[n<0?n+t:n]})),even:ae((function(e,t){for(var n=0;nt?t:n;--i>=0;)e.push(i);return e})),gt:ae((function(e,t,n){for(var i=n<0?n+t:n;++i1?function(t,n,i){for(var r=e.length;r--;)if(!e[r](t,n,i))return!1;return!0}:e[0]}function he(e,t,n,i,r){for(var o,a=[],s=0,l=e.length,u=null!=t;s-1&&(o[u]=!(a[u]=d))}}else p=he(p===a?p.splice(v,p.length):p),r?r(null,a,p,l):g.apply(a,p)}))}function me(e){for(var i,r,o,a=e.length,s=t.relative[e[0].type],l=s||t.relative[" "],u=s?1:0,f=de((function(e){return e===i}),l,!0),d=de((function(e){return c.call(i,e)>-1}),l,!0),p=[function(e,t,r){var o=!s&&(r||t!=n)||((i=t).nodeType?f(e,t,r):d(e,t,r));return i=null,o}];u1&&pe(p),u>1&&fe(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(N,"$1"),r,u0,o=e.length>0,a=function(a,s,u,c,d){var p,h,m,v=0,b="0",x=a&&[],w=[],T=n,C=a||o&&t.find.TAG("*",d),k=y+=null==T?1:Math.random()||.1,S=C.length;for(d&&(n=s==l||s||d);b!==S&&null!=(p=C[b]);b++){if(o&&p){for(h=0,s||p.ownerDocument==l||(le(p),u=!f);m=e[h++];)if(m(p,s||l,u)){g.call(c,p);break}d&&(y=k)}r&&((p=!m&&p)&&v--,a&&x.push(p))}if(v+=b,r&&b!==v){for(h=0;m=i[h++];)m(x,w,s,u);if(a){if(v>0)for(;b--;)x[b]||w[b]||(w[b]=D.call(c));w=he(w)}g.apply(c,w),d&&!a&&w.length>0&&v+i.length>1&&A.uniqueSort(c)}return d&&(y=k,n=T),x};return r?te(a):a}(a,o)),s.selector=e}return s}function ye(e,n,i,r){var o,a,s,l,u,c="function"==typeof e&&e,d=!r&&ce(e=c.selector||e);if(i=i||[],1===d.length){if((a=d[0]=d[0].slice(0)).length>2&&"ID"===(s=a[0]).type&&9===n.nodeType&&f&&t.relative[a[1].type]){if(!(n=(t.find.ID(s.matches[0].replace(Q,Y),n)||[])[0]))return i;c&&(n=n.parentNode),e=e.slice(a.shift().value.length)}for(o=z.needsContext.test(e)?0:a.length;o--&&(s=a[o],!t.relative[l=s.type]);)if((u=t.find[l])&&(r=u(s.matches[0].replace(Q,Y),G.test(a[0].type)&&se(n.parentNode)||n))){if(a.splice(o,1),!(e=r.length&&fe(a)))return g.apply(i,r),i;break}}return(c||ve(e,d))(r,n,!f,i,!n||G.test(e)&&se(n.parentNode)||n),i}ue.prototype=t.filters=t.pseudos,t.setFilters=new ue,m.sortStable=v.split("").sort(k).join("")===v,le(),m.sortDetached=ne((function(e){return 1&e.compareDocumentPosition(l.createElement("fieldset"))})),A.find=Z,A.expr[":"]=A.expr.pseudos,A.unique=A.uniqueSort,Z.compile=ve,Z.select=ye,Z.setDocument=le,Z.tokenize=ce,Z.escape=A.escapeSelector,Z.getText=A.text,Z.isXML=A.isXMLDoc,Z.selectors=A.expr,Z.support=A.support,Z.uniqueSort=A.uniqueSort}();var P=function(e,t,n){for(var i=[],r=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(r&&A(e).is(n))break;i.push(e)}return i},R=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},M=A.expr.match.needsContext,W=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(e,t,n){return v(t)?A.grep(e,(function(e,i){return!!t.call(e,i,e)!==n})):t.nodeType?A.grep(e,(function(e){return e===t!==n})):"string"!=typeof t?A.grep(e,(function(e){return c.call(t,e)>-1!==n})):A.filter(t,e,n)}A.filter=function(e,t,n){var i=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===i.nodeType?A.find.matchesSelector(i,e)?[i]:[]:A.find.matches(e,A.grep(t,(function(e){return 1===e.nodeType})))},A.fn.extend({find:function(e){var t,n,i=this.length,r=this;if("string"!=typeof e)return this.pushStack(A(e).filter((function(){for(t=0;t1?A.uniqueSort(n):n},filter:function(e){return this.pushStack(F(this,e||[],!1))},not:function(e){return this.pushStack(F(this,e||[],!0))},is:function(e){return!!F(this,"string"==typeof e&&M.test(e)?A(e):e||[],!1).length}});var B,_=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(A.fn.init=function(e,t,n){var i,r;if(!e)return this;if(n=n||B,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:_.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof A?t[0]:t,A.merge(this,A.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:b,!0)),W.test(i[1])&&A.isPlainObject(t))for(i in t)v(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(r=b.getElementById(i[2]))&&(this[0]=r,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(A):A.makeArray(e,this)}).prototype=A.fn,B=A(b);var z=/^(?:parents|prev(?:Until|All))/,U={children:!0,contents:!0,next:!0,prev:!0};function X(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}A.fn.extend({has:function(e){var t=A(e,this),n=t.length;return this.filter((function(){for(var e=0;e-1:1===n.nodeType&&A.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?A.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?c.call(A(e),this[0]):c.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(A.uniqueSort(A.merge(this.get(),A(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),A.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return P(e,"parentNode")},parentsUntil:function(e,t,n){return P(e,"parentNode",n)},next:function(e){return X(e,"nextSibling")},prev:function(e){return X(e,"previousSibling")},nextAll:function(e){return P(e,"nextSibling")},prevAll:function(e){return P(e,"previousSibling")},nextUntil:function(e,t,n){return P(e,"nextSibling",n)},prevUntil:function(e,t,n){return P(e,"previousSibling",n)},siblings:function(e){return R((e.parentNode||{}).firstChild,e)},children:function(e){return R(e.firstChild)},contents:function(e){return null!=e.contentDocument&&a(e.contentDocument)?e.contentDocument:(E(e,"template")&&(e=e.content||e),A.merge([],e.childNodes))}},(function(e,t){A.fn[e]=function(n,i){var r=A.map(this,t,n);return"Until"!==e.slice(-5)&&(i=n),i&&"string"==typeof i&&(r=A.filter(i,r)),this.length>1&&(U[e]||A.uniqueSort(r),z.test(e)&&r.reverse()),this.pushStack(r)}}));var V=/[^\x20\t\r\n\f]+/g;function G(e){return e}function Q(e){throw e}function Y(e,t,n,i){var r;try{e&&v(r=e.promise)?r.call(e).done(t).fail(n):e&&v(r=e.then)?r.call(e,t,n):t.apply(void 0,[e].slice(i))}catch(e){n.apply(void 0,[e])}}A.Callbacks=function(e){e="string"==typeof e?function(e){var t={};return A.each(e.match(V)||[],(function(e,n){t[n]=!0})),t}(e):A.extend({},e);var t,n,i,r,o=[],a=[],s=-1,l=function(){for(r=r||e.once,i=t=!0;a.length;s=-1)for(n=a.shift();++s-1;)o.splice(n,1),n<=s&&s--})),this},has:function(e){return e?A.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return r=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return r=a=[],n||t||(o=n=""),this},locked:function(){return!!r},fireWith:function(e,n){return r||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},A.extend({Deferred:function(e){var t=[["notify","progress",A.Callbacks("memory"),A.Callbacks("memory"),2],["resolve","done",A.Callbacks("once memory"),A.Callbacks("once memory"),0,"resolved"],["reject","fail",A.Callbacks("once memory"),A.Callbacks("once memory"),1,"rejected"]],n="pending",r={state:function(){return n},always:function(){return o.done(arguments).fail(arguments),this},catch:function(e){return r.then(null,e)},pipe:function(){var e=arguments;return A.Deferred((function(n){A.each(t,(function(t,i){var r=v(e[i[4]])&&e[i[4]];o[i[1]]((function(){var e=r&&r.apply(this,arguments);e&&v(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,r?[e]:arguments)}))})),e=null})).promise()},then:function(e,n,r){var o=0;function a(e,t,n,r){return function(){var s=this,l=arguments,u=function(){var i,u;if(!(e=o&&(n!==Q&&(s=void 0,l=[i]),t.rejectWith(s,l))}};e?c():(A.Deferred.getErrorHook?c.error=A.Deferred.getErrorHook():A.Deferred.getStackHook&&(c.error=A.Deferred.getStackHook()),i.setTimeout(c))}}return A.Deferred((function(i){t[0][3].add(a(0,i,v(r)?r:G,i.notifyWith)),t[1][3].add(a(0,i,v(e)?e:G)),t[2][3].add(a(0,i,v(n)?n:Q))})).promise()},promise:function(e){return null!=e?A.extend(e,r):r}},o={};return A.each(t,(function(e,i){var a=i[2],s=i[5];r[i[1]]=a.add,s&&a.add((function(){n=s}),t[3-e][2].disable,t[3-e][3].disable,t[0][2].lock,t[0][3].lock),a.add(i[3].fire),o[i[0]]=function(){return o[i[0]+"With"](this===o?void 0:this,arguments),this},o[i[0]+"With"]=a.fireWith})),r.promise(o),e&&e.call(o,o),o},when:function(e){var t=arguments.length,n=t,i=Array(n),r=s.call(arguments),o=A.Deferred(),a=function(e){return function(n){i[e]=this,r[e]=arguments.length>1?s.call(arguments):n,--t||o.resolveWith(i,r)}};if(t<=1&&(Y(e,o.done(a(n)).resolve,o.reject,!t),"pending"===o.state()||v(r[n]&&r[n].then)))return o.then();for(;n--;)Y(r[n],a(n),o.reject);return o.promise()}});var K=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;A.Deferred.exceptionHook=function(e,t){i.console&&i.console.warn&&e&&K.test(e.name)&&i.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},A.readyException=function(e){i.setTimeout((function(){throw e}))};var J=A.Deferred();function Z(){b.removeEventListener("DOMContentLoaded",Z),i.removeEventListener("load",Z),A.ready()}A.fn.ready=function(e){return J.then(e).catch((function(e){A.readyException(e)})),this},A.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--A.readyWait:A.isReady)||(A.isReady=!0,!0!==e&&--A.readyWait>0||J.resolveWith(b,[A]))}}),A.ready.then=J.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(A.ready):(b.addEventListener("DOMContentLoaded",Z),i.addEventListener("load",Z));var ee=function(e,t,n,i,r,o,a){var s=0,l=e.length,u=null==n;if("object"===T(n))for(s in r=!0,n)ee(e,t,s,n[s],!0,o,a);else if(void 0!==i&&(r=!0,v(i)||(a=!0),u&&(a?(t.call(e,i),t=null):(u=t,t=function(e,t,n){return u.call(A(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each((function(){le.remove(this,e)}))}}),A.extend({queue:function(e,t,n){var i;if(e)return t=(t||"fx")+"queue",i=se.get(e,t),n&&(!i||Array.isArray(n)?i=se.access(e,t,A.makeArray(n)):i.push(n)),i||[]},dequeue:function(e,t){t=t||"fx";var n=A.queue(e,t),i=n.length,r=n.shift(),o=A._queueHooks(e,t);"inprogress"===r&&(r=n.shift(),i--),r&&("fx"===t&&n.unshift("inprogress"),delete o.stop,r.call(e,(function(){A.dequeue(e,t)}),o)),!i&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return se.get(e,n)||se.access(e,n,{empty:A.Callbacks("once memory").add((function(){se.remove(e,[t+"queue",n])}))})}}),A.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ee=/^$|^module$|\/(?:java|ecma)script/i;Ce=b.createDocumentFragment().appendChild(b.createElement("div")),(ke=b.createElement("input")).setAttribute("type","radio"),ke.setAttribute("checked","checked"),ke.setAttribute("name","t"),Ce.appendChild(ke),m.checkClone=Ce.cloneNode(!0).cloneNode(!0).lastChild.checked,Ce.innerHTML="",m.noCloneChecked=!!Ce.cloneNode(!0).lastChild.defaultValue,Ce.innerHTML=" ",m.option=!!Ce.lastChild;var De={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function je(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&E(e,t)?A.merge([e],n):n}function $e(e,t){for(var n=0,i=e.length;n",""]);var Ie=/<|?\w+;/;function Ne(e,t,n,i,r){for(var o,a,s,l,u,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p-1)r&&r.push(o);else if(u=me(o),a=je(f.appendChild(o),"script"),u&&$e(a),n)for(c=0;o=a[c++];)Ee.test(o.type||"")&&n.push(o);return f}var Le=/^([^.]*)(?:\.(.+)|)/;function Oe(){return!0}function He(){return!1}function qe(e,t,n,i,r,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(i=i||n,n=void 0),t)qe(e,s,n,i,t[s],o);return e}if(null==i&&null==r?(r=n,i=n=void 0):null==r&&("string"==typeof n?(r=i,i=void 0):(r=i,i=n,n=void 0)),!1===r)r=He;else if(!r)return e;return 1===o&&(a=r,r=function(e){return A().off(e),a.apply(this,arguments)},r.guid=a.guid||(a.guid=A.guid++)),e.each((function(){A.event.add(this,t,r,i,n)}))}function Pe(e,t,n){n?(se.set(e,t,!1),A.event.add(e,t,{namespace:!1,handler:function(e){var n,i=se.get(this,t);if(1&e.isTrigger&&this[t]){if(i)(A.event.special[t]||{}).delegateType&&e.stopPropagation();else if(i=s.call(arguments),se.set(this,t,i),this[t](),n=se.get(this,t),se.set(this,t,!1),i!==n)return e.stopImmediatePropagation(),e.preventDefault(),n}else i&&(se.set(this,t,A.event.trigger(i[0],i.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Oe)}})):void 0===se.get(e,t)&&A.event.add(e,t,Oe)}A.event={global:{},add:function(e,t,n,i,r){var o,a,s,l,u,c,f,d,p,h,g,m=se.get(e);if(oe(e))for(n.handler&&(n=(o=n).handler,r=o.selector),r&&A.find.matchesSelector(ge,r),n.guid||(n.guid=A.guid++),(l=m.events)||(l=m.events=Object.create(null)),(a=m.handle)||(a=m.handle=function(t){return void 0!==A&&A.event.triggered!==t.type?A.event.dispatch.apply(e,arguments):void 0}),u=(t=(t||"").match(V)||[""]).length;u--;)p=g=(s=Le.exec(t[u])||[])[1],h=(s[2]||"").split(".").sort(),p&&(f=A.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,f=A.event.special[p]||{},c=A.extend({type:p,origType:g,data:i,handler:n,guid:n.guid,selector:r,needsContext:r&&A.expr.match.needsContext.test(r),namespace:h.join(".")},o),(d=l[p])||((d=l[p]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,i,h,a)||e.addEventListener&&e.addEventListener(p,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),r?d.splice(d.delegateCount++,0,c):d.push(c),A.event.global[p]=!0)},remove:function(e,t,n,i,r){var o,a,s,l,u,c,f,d,p,h,g,m=se.hasData(e)&&se.get(e);if(m&&(l=m.events)){for(u=(t=(t||"").match(V)||[""]).length;u--;)if(p=g=(s=Le.exec(t[u])||[])[1],h=(s[2]||"").split(".").sort(),p){for(f=A.event.special[p]||{},d=l[p=(i?f.delegateType:f.bindType)||p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=d.length;o--;)c=d[o],!r&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(o,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(e,c));a&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,h,m.handle)||A.removeEvent(e,p,m.handle),delete l[p])}else for(p in l)A.event.remove(e,p+t[u],n,i,!0);A.isEmptyObject(l)&&se.remove(e,"handle events")}},dispatch:function(e){var t,n,i,r,o,a,s=new Array(arguments.length),l=A.event.fix(e),u=(se.get(this,"events")||Object.create(null))[l.type]||[],c=A.event.special[l.type]||{};for(s[0]=l,t=1;t=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==e.type||!0!==u.disabled)){for(o=[],a={},n=0;n-1:A.find(r,this,null,[u]).length),a[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return u=this,l\s*$/g;function Fe(e,t){return E(e,"table")&&E(11!==t.nodeType?t:t.firstChild,"tr")&&A(e).children("tbody")[0]||e}function Be(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function _e(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function ze(e,t){var n,i,r,o,a,s;if(1===t.nodeType){if(se.hasData(e)&&(s=se.get(e).events))for(r in se.remove(t,"handle events"),s)for(n=0,i=s[r].length;n1&&"string"==typeof h&&!m.checkClone&&Me.test(h))return e.each((function(r){var o=e.eq(r);g&&(t[0]=h.call(this,r,o.html())),Xe(o,t,n,i)}));if(d&&(o=(r=Ne(t,e[0].ownerDocument,!1,e,i)).firstChild,1===r.childNodes.length&&(r=o),o||i)){for(s=(a=A.map(je(r,"script"),Be)).length;f0&&$e(a,!l&&je(e,"script")),s},cleanData:function(e){for(var t,n,i,r=A.event.special,o=0;void 0!==(n=e[o]);o++)if(oe(n)){if(t=n[se.expando]){if(t.events)for(i in t.events)r[i]?A.event.remove(n,i):A.removeEvent(n,i,t.handle);n[se.expando]=void 0}n[le.expando]&&(n[le.expando]=void 0)}}}),A.fn.extend({detach:function(e){return Ve(this,e,!0)},remove:function(e){return Ve(this,e)},text:function(e){return ee(this,(function(e){return void 0===e?A.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return Xe(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Fe(this,e).appendChild(e)}))},prepend:function(){return Xe(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Fe(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return Xe(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return Xe(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(A.cleanData(je(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return A.clone(this,e,t)}))},html:function(e){return ee(this,(function(e){var t=this[0]||{},n=0,i=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Re.test(e)&&!De[(Se.exec(e)||["",""])[1].toLowerCase()]){e=A.htmlPrefilter(e);try{for(;n=0&&(l+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-l-s-.5))||0),l+u}function ct(e,t,n){var i=Ye(e),r=(!m.boxSizingReliable()||n)&&"border-box"===A.css(e,"boxSizing",!1,i),o=r,a=Ze(e,t,i),s="offset"+t[0].toUpperCase()+t.slice(1);if(Ge.test(a)){if(!n)return a;a="auto"}return(!m.boxSizingReliable()&&r||!m.reliableTrDimensions()&&E(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===A.css(e,"display",!1,i))&&e.getClientRects().length&&(r="border-box"===A.css(e,"boxSizing",!1,i),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+ut(e,t,n||(r?"border":"content"),o,i,a)+"px"}function ft(e,t,n,i,r){return new ft.prototype.init(e,t,n,i,r)}A.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ze(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var r,o,a,s=re(t),l=Qe.test(t),u=e.style;if(l||(t=rt(s)),a=A.cssHooks[t]||A.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(r=a.get(e,!1,i))?r:u[t];"string"===(o=typeof n)&&(r=pe.exec(n))&&r[1]&&(n=be(e,t,r),o="number"),null!=n&&n==n&&("number"!==o||l||(n+=r&&r[3]||(A.cssNumber[s]?"":"px")),m.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,i))||(l?u.setProperty(t,n):u[t]=n))}},css:function(e,t,n,i){var r,o,a,s=re(t);return Qe.test(t)||(t=rt(s)),(a=A.cssHooks[t]||A.cssHooks[s])&&"get"in a&&(r=a.get(e,!0,n)),void 0===r&&(r=Ze(e,t,i)),"normal"===r&&t in st&&(r=st[t]),""===n||n?(o=parseFloat(r),!0===n||isFinite(o)?o||0:r):r}}),A.each(["height","width"],(function(e,t){A.cssHooks[t]={get:function(e,n,i){if(n)return!ot.test(A.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ct(e,t,i):Ke(e,at,(function(){return ct(e,t,i)}))},set:function(e,n,i){var r,o=Ye(e),a=!m.scrollboxSize()&&"absolute"===o.position,s=(a||i)&&"border-box"===A.css(e,"boxSizing",!1,o),l=i?ut(e,t,i,s,o):0;return s&&a&&(l-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-ut(e,t,"border",!1,o)-.5)),l&&(r=pe.exec(n))&&"px"!==(r[3]||"px")&&(e.style[t]=n,n=A.css(e,t)),lt(0,n,l)}}})),A.cssHooks.marginLeft=et(m.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(Ze(e,"marginLeft"))||e.getBoundingClientRect().left-Ke(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),A.each({margin:"",padding:"",border:"Width"},(function(e,t){A.cssHooks[e+t]={expand:function(n){for(var i=0,r={},o="string"==typeof n?n.split(" "):[n];i<4;i++)r[e+he[i]+t]=o[i]||o[i-2]||o[0];return r}},"margin"!==e&&(A.cssHooks[e+t].set=lt)})),A.fn.extend({css:function(e,t){return ee(this,(function(e,t,n){var i,r,o={},a=0;if(Array.isArray(t)){for(i=Ye(e),r=t.length;a1)}}),A.Tween=ft,ft.prototype={constructor:ft,init:function(e,t,n,i,r,o){this.elem=e,this.prop=n,this.easing=r||A.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=i,this.unit=o||(A.cssNumber[n]?"":"px")},cur:function(){var e=ft.propHooks[this.prop];return e&&e.get?e.get(this):ft.propHooks._default.get(this)},run:function(e){var t,n=ft.propHooks[this.prop];return this.options.duration?this.pos=t=A.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ft.propHooks._default.set(this),this}},ft.prototype.init.prototype=ft.prototype,ft.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=A.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){A.fx.step[e.prop]?A.fx.step[e.prop](e):1!==e.elem.nodeType||!A.cssHooks[e.prop]&&null==e.elem.style[rt(e.prop)]?e.elem[e.prop]=e.now:A.style(e.elem,e.prop,e.now+e.unit)}}},ft.propHooks.scrollTop=ft.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},A.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},A.fx=ft.prototype.init,A.fx.step={};var dt,pt,ht=/^(?:toggle|show|hide)$/,gt=/queueHooks$/;function mt(){pt&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(mt):i.setTimeout(mt,A.fx.interval),A.fx.tick())}function vt(){return i.setTimeout((function(){dt=void 0})),dt=Date.now()}function yt(e,t){var n,i=0,r={height:e};for(t=t?1:0;i<4;i+=2-t)r["margin"+(n=he[i])]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function bt(e,t,n){for(var i,r=(xt.tweeners[t]||[]).concat(xt.tweeners["*"]),o=0,a=r.length;o1)},removeAttr:function(e){return this.each((function(){A.removeAttr(this,e)}))}}),A.extend({attr:function(e,t,n){var i,r,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?A.prop(e,t,n):(1===o&&A.isXMLDoc(e)||(r=A.attrHooks[t.toLowerCase()]||(A.expr.match.bool.test(t)?wt:void 0)),void 0!==n?null===n?void A.removeAttr(e,t):r&&"set"in r&&void 0!==(i=r.set(e,n,t))?i:(e.setAttribute(t,n+""),n):r&&"get"in r&&null!==(i=r.get(e,t))?i:null==(i=A.find.attr(e,t))?void 0:i)},attrHooks:{type:{set:function(e,t){if(!m.radioValue&&"radio"===t&&E(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,i=0,r=t&&t.match(V);if(r&&1===e.nodeType)for(;n=r[i++];)e.removeAttribute(n)}}),wt={set:function(e,t,n){return!1===t?A.removeAttr(e,n):e.setAttribute(n,n),n}},A.each(A.expr.match.bool.source.match(/\w+/g),(function(e,t){var n=Tt[t]||A.find.attr;Tt[t]=function(e,t,i){var r,o,a=t.toLowerCase();return i||(o=Tt[a],Tt[a]=r,r=null!=n(e,t,i)?a:null,Tt[a]=o),r}}));var Ct=/^(?:input|select|textarea|button)$/i,kt=/^(?:a|area)$/i;function At(e){return(e.match(V)||[]).join(" ")}function St(e){return e.getAttribute&&e.getAttribute("class")||""}function Et(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(V)||[]}A.fn.extend({prop:function(e,t){return ee(this,A.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[A.propFix[e]||e]}))}}),A.extend({prop:function(e,t,n){var i,r,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&A.isXMLDoc(e)||(t=A.propFix[t]||t,r=A.propHooks[t]),void 0!==n?r&&"set"in r&&void 0!==(i=r.set(e,n,t))?i:e[t]=n:r&&"get"in r&&null!==(i=r.get(e,t))?i:e[t]},propHooks:{tabIndex:{get:function(e){var t=A.find.attr(e,"tabindex");return t?parseInt(t,10):Ct.test(e.nodeName)||kt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(A.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),A.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){A.propFix[this.toLowerCase()]=this})),A.fn.extend({addClass:function(e){var t,n,i,r,o,a;return v(e)?this.each((function(t){A(this).addClass(e.call(this,t,St(this)))})):(t=Et(e)).length?this.each((function(){if(i=St(this),n=1===this.nodeType&&" "+At(i)+" "){for(o=0;o-1;)n=n.replace(" "+r+" "," ");a=At(n),i!==a&&this.setAttribute("class",a)}})):this:this.attr("class","")},toggleClass:function(e,t){var n,i,r,o,a=typeof e,s="string"===a||Array.isArray(e);return v(e)?this.each((function(n){A(this).toggleClass(e.call(this,n,St(this),t),t)})):"boolean"==typeof t&&s?t?this.addClass(e):this.removeClass(e):(n=Et(e),this.each((function(){if(s)for(o=A(this),r=0;r-1)return!0;return!1}});var Dt=/\r/g;A.fn.extend({val:function(e){var t,n,i,r=this[0];return arguments.length?(i=v(e),this.each((function(n){var r;1===this.nodeType&&(null==(r=i?e.call(this,n,A(this).val()):e)?r="":"number"==typeof r?r+="":Array.isArray(r)&&(r=A.map(r,(function(e){return null==e?"":e+""}))),(t=A.valHooks[this.type]||A.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,r,"value")||(this.value=r))}))):r?(t=A.valHooks[r.type]||A.valHooks[r.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(r,"value"))?n:"string"==typeof(n=r.value)?n.replace(Dt,""):null==n?"":n:void 0}}),A.extend({valHooks:{option:{get:function(e){var t=A.find.attr(e,"value");return null!=t?t:At(A.text(e))}},select:{get:function(e){var t,n,i,r=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],l=a?o+1:r.length;for(i=o<0?l:a?o:0;i-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),A.each(["radio","checkbox"],(function(){A.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=A.inArray(A(e).val(),t)>-1}},m.checkOn||(A.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}));var jt=i.location,$t={guid:Date.now()},It=/\?/;A.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new i.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||A.error("Invalid XML: "+(n?A.map(n.childNodes,(function(e){return e.textContent})).join("\n"):e)),t};var Nt=/^(?:focusinfocus|focusoutblur)$/,Lt=function(e){e.stopPropagation()};A.extend(A.event,{trigger:function(e,t,n,r){var o,a,s,l,u,c,f,d,h=[n||b],g=p.call(e,"type")?e.type:e,m=p.call(e,"namespace")?e.namespace.split("."):[];if(a=d=s=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Nt.test(g+A.event.triggered)&&(g.indexOf(".")>-1&&(m=g.split("."),g=m.shift(),m.sort()),u=g.indexOf(":")<0&&"on"+g,(e=e[A.expando]?e:new A.Event(g,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=m.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:A.makeArray(t,[e]),f=A.event.special[g]||{},r||!f.trigger||!1!==f.trigger.apply(n,t))){if(!r&&!f.noBubble&&!y(n)){for(l=f.delegateType||g,Nt.test(l+g)||(a=a.parentNode);a;a=a.parentNode)h.push(a),s=a;s===(n.ownerDocument||b)&&h.push(s.defaultView||s.parentWindow||i)}for(o=0;(a=h[o++])&&!e.isPropagationStopped();)d=a,e.type=o>1?l:f.bindType||g,(c=(se.get(a,"events")||Object.create(null))[e.type]&&se.get(a,"handle"))&&c.apply(a,t),(c=u&&a[u])&&c.apply&&oe(a)&&(e.result=c.apply(a,t),!1===e.result&&e.preventDefault());return e.type=g,r||e.isDefaultPrevented()||f._default&&!1!==f._default.apply(h.pop(),t)||!oe(n)||u&&v(n[g])&&!y(n)&&((s=n[u])&&(n[u]=null),A.event.triggered=g,e.isPropagationStopped()&&d.addEventListener(g,Lt),n[g](),e.isPropagationStopped()&&d.removeEventListener(g,Lt),A.event.triggered=void 0,s&&(n[u]=s)),e.result}},simulate:function(e,t,n){var i=A.extend(new A.Event,n,{type:e,isSimulated:!0});A.event.trigger(i,null,t)}}),A.fn.extend({trigger:function(e,t){return this.each((function(){A.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return A.event.trigger(e,t,n,!0)}});var Ot=/\[\]$/,Ht=/\r?\n/g,qt=/^(?:submit|button|image|reset|file)$/i,Pt=/^(?:input|select|textarea|keygen)/i;function Rt(e,t,n,i){var r;if(Array.isArray(t))A.each(t,(function(t,r){n||Ot.test(e)?i(e,r):Rt(e+"["+("object"==typeof r&&null!=r?t:"")+"]",r,n,i)}));else if(n||"object"!==T(t))i(e,t);else for(r in t)Rt(e+"["+r+"]",t[r],n,i)}A.param=function(e,t){var n,i=[],r=function(e,t){var n=v(t)?t():t;i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!A.isPlainObject(e))A.each(e,(function(){r(this.name,this.value)}));else for(n in e)Rt(n,e[n],t,r);return i.join("&")},A.fn.extend({serialize:function(){return A.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=A.prop(this,"elements");return e?A.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!A(this).is(":disabled")&&Pt.test(this.nodeName)&&!qt.test(e)&&(this.checked||!Ae.test(e))})).map((function(e,t){var n=A(this).val();return null==n?null:Array.isArray(n)?A.map(n,(function(e){return{name:t.name,value:e.replace(Ht,"\r\n")}})):{name:t.name,value:n.replace(Ht,"\r\n")}})).get()}});var Mt=/%20/g,Wt=/#.*$/,Ft=/([?&])_=[^&]*/,Bt=/^(.*?):[ \t]*([^\r\n]*)$/gm,_t=/^(?:GET|HEAD)$/,zt=/^\/\//,Ut={},Xt={},Vt="*/".concat("*"),Gt=b.createElement("a");function Qt(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var i,r=0,o=t.toLowerCase().match(V)||[];if(v(n))for(;i=o[r++];)"+"===i[0]?(i=i.slice(1)||"*",(e[i]=e[i]||[]).unshift(n)):(e[i]=e[i]||[]).push(n)}}function Yt(e,t,n,i){var r={},o=e===Xt;function a(s){var l;return r[s]=!0,A.each(e[s]||[],(function(e,s){var u=s(t,n,i);return"string"!=typeof u||o||r[u]?o?!(l=u):void 0:(t.dataTypes.unshift(u),a(u),!1)})),l}return a(t.dataTypes[0])||!r["*"]&&a("*")}function Kt(e,t){var n,i,r=A.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((r[n]?e:i||(i={}))[n]=t[n]);return i&&A.extend(!0,e,i),e}Gt.href=jt.href,A.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:jt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(jt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Vt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":A.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Kt(Kt(e,A.ajaxSettings),t):Kt(A.ajaxSettings,e)},ajaxPrefilter:Qt(Ut),ajaxTransport:Qt(Xt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var n,r,o,a,s,l,u,c,f,d,p=A.ajaxSetup({},t),h=p.context||p,g=p.context&&(h.nodeType||h.jquery)?A(h):A.event,m=A.Deferred(),v=A.Callbacks("once memory"),y=p.statusCode||{},x={},w={},T="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(u){if(!a)for(a={};t=Bt.exec(o);)a[t[1].toLowerCase()+" "]=(a[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=a[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return u?o:null},setRequestHeader:function(e,t){return null==u&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,x[e]=t),this},overrideMimeType:function(e){return null==u&&(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(u)C.always(e[C.status]);else for(t in e)y[t]=[y[t],e[t]];return this},abort:function(e){var t=e||T;return n&&n.abort(t),k(0,t),this}};if(m.promise(C),p.url=((e||p.url||jt.href)+"").replace(zt,jt.protocol+"//"),p.type=t.method||t.type||p.method||p.type,p.dataTypes=(p.dataType||"*").toLowerCase().match(V)||[""],null==p.crossDomain){l=b.createElement("a");try{l.href=p.url,l.href=l.href,p.crossDomain=Gt.protocol+"//"+Gt.host!=l.protocol+"//"+l.host}catch(e){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=A.param(p.data,p.traditional)),Yt(Ut,p,t,C),u)return C;for(f in(c=A.event&&p.global)&&0==A.active++&&A.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!_t.test(p.type),r=p.url.replace(Wt,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(Mt,"+")):(d=p.url.slice(r.length),p.data&&(p.processData||"string"==typeof p.data)&&(r+=(It.test(r)?"&":"?")+p.data,delete p.data),!1===p.cache&&(r=r.replace(Ft,"$1"),d=(It.test(r)?"&":"?")+"_="+$t.guid+++d),p.url=r+d),p.ifModified&&(A.lastModified[r]&&C.setRequestHeader("If-Modified-Since",A.lastModified[r]),A.etag[r]&&C.setRequestHeader("If-None-Match",A.etag[r])),(p.data&&p.hasContent&&!1!==p.contentType||t.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Vt+"; q=0.01":""):p.accepts["*"]),p.headers)C.setRequestHeader(f,p.headers[f]);if(p.beforeSend&&(!1===p.beforeSend.call(h,C,p)||u))return C.abort();if(T="abort",v.add(p.complete),C.done(p.success),C.fail(p.error),n=Yt(Xt,p,t,C)){if(C.readyState=1,c&&g.trigger("ajaxSend",[C,p]),u)return C;p.async&&p.timeout>0&&(s=i.setTimeout((function(){C.abort("timeout")}),p.timeout));try{u=!1,n.send(x,k)}catch(e){if(u)throw e;k(-1,e)}}else k(-1,"No Transport");function k(e,t,a,l){var f,d,b,x,w,T=t;u||(u=!0,s&&i.clearTimeout(s),n=void 0,o=l||"",C.readyState=e>0?4:0,f=e>=200&&e<300||304===e,a&&(x=function(e,t,n){for(var i,r,o,a,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(r in s)if(s[r]&&s[r].test(i)){l.unshift(r);break}if(l[0]in n)o=l[0];else{for(r in n){if(!l[0]||e.converters[r+" "+l[0]]){o=r;break}a||(a=r)}o=o||a}if(o)return o!==l[0]&&l.unshift(o),n[o]}(p,C,a)),!f&&A.inArray("script",p.dataTypes)>-1&&A.inArray("json",p.dataTypes)<0&&(p.converters["text script"]=function(){}),x=function(e,t,n,i){var r,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&i&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(!(a=u[l+" "+o]||u["* "+o]))for(r in u)if((s=r.split(" "))[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){!0===a?a=u[r]:!0!==u[r]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}(p,x,C,f),f?(p.ifModified&&((w=C.getResponseHeader("Last-Modified"))&&(A.lastModified[r]=w),(w=C.getResponseHeader("etag"))&&(A.etag[r]=w)),204===e||"HEAD"===p.type?T="nocontent":304===e?T="notmodified":(T=x.state,d=x.data,f=!(b=x.error))):(b=T,!e&&T||(T="error",e<0&&(e=0))),C.status=e,C.statusText=(t||T)+"",f?m.resolveWith(h,[d,T,C]):m.rejectWith(h,[C,T,b]),C.statusCode(y),y=void 0,c&&g.trigger(f?"ajaxSuccess":"ajaxError",[C,p,f?d:b]),v.fireWith(h,[C,T]),c&&(g.trigger("ajaxComplete",[C,p]),--A.active||A.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return A.get(e,t,n,"json")},getScript:function(e,t){return A.get(e,void 0,t,"script")}}),A.each(["get","post"],(function(e,t){A[t]=function(e,n,i,r){return v(n)&&(r=r||i,i=n,n=void 0),A.ajax(A.extend({url:e,type:t,dataType:r,data:n,success:i},A.isPlainObject(e)&&e))}})),A.ajaxPrefilter((function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")})),A._evalUrl=function(e,t,n){return A.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){A.globalEval(e,t,n)}})},A.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=A(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return v(e)?this.each((function(t){A(this).wrapInner(e.call(this,t))})):this.each((function(){var t=A(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=v(e);return this.each((function(n){A(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){A(this).replaceWith(this.childNodes)})),this}}),A.expr.pseudos.hidden=function(e){return!A.expr.pseudos.visible(e)},A.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},A.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(e){}};var Jt={0:200,1223:204},Zt=A.ajaxSettings.xhr();m.cors=!!Zt&&"withCredentials"in Zt,m.ajax=Zt=!!Zt,A.ajaxTransport((function(e){var t,n;if(m.cors||Zt&&!e.crossDomain)return{send:function(r,o){var a,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(a in e.xhrFields)s[a]=e.xhrFields[a];for(a in e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest"),r)s.setRequestHeader(a,r[a]);t=function(e){return function(){t&&(t=n=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Jt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=t(),n=s.onerror=s.ontimeout=t("error"),void 0!==s.onabort?s.onabort=n:s.onreadystatechange=function(){4===s.readyState&&i.setTimeout((function(){t&&n()}))},t=t("abort");try{s.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}})),A.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),A.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return A.globalEval(e),e}}}),A.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),A.ajaxTransport("script",(function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(i,r){t=A("
@endsection
diff --git a/resources/views/admin/characters/create_edit_character_category.blade.php b/resources/views/admin/characters/create_edit_character_category.blade.php
index 10f2958ccb..2c5b1d4fdd 100644
--- a/resources/views/admin/characters/create_edit_character_category.blade.php
+++ b/resources/views/admin/characters/create_edit_character_category.blade.php
@@ -85,6 +85,7 @@
@section('scripts')
@parent
+ @include('js._tinymce_wysiwyg')
@endsection
diff --git a/resources/views/admin/currencies/create_edit_currency_category.blade.php b/resources/views/admin/currencies/create_edit_currency_category.blade.php
new file mode 100644
index 0000000000..26ed8d26b1
--- /dev/null
+++ b/resources/views/admin/currencies/create_edit_currency_category.blade.php
@@ -0,0 +1,81 @@
+@extends('admin.layout')
+
+@section('admin-title')
+ {{ $category->id ? 'Edit' : 'Create' }} Currency Category
+@endsection
+
+@section('admin-content')
+ {!! breadcrumbs([
+ 'Admin Panel' => 'admin',
+ 'Currency Categories' => 'admin/data/currency-categories',
+ ($category->id ? 'Edit' : 'Create') . ' Category' => $category->id ? 'admin/data/currency-categories/edit/' . $category->id : 'admin/data/currency-categories/create',
+ ]) !!}
+
+ {{ $category->id ? 'Edit' : 'Create' }} Currency Category
+ @if ($category->id)
+ Delete Category
+ @endif
+
+
+ {!! Form::open(['url' => $category->id ? 'admin/data/currency-categories/edit/' . $category->id : 'admin/data/currency-categories/create', 'files' => true]) !!}
+
+ Basic Information
+
+
+ {!! Form::label('Name') !!}
+ {!! Form::text('name', $category->name, ['class' => 'form-control']) !!}
+
+
+
+
+
+ {!! Form::label('Description (Optional)') !!}
+ {!! Form::textarea('description', $category->description, ['class' => 'form-control wysiwyg']) !!}
+
+
+
+ {!! Form::checkbox('is_visible', 1, $category->id ? $category->is_visible : 1, ['class' => 'form-check-input', 'data-toggle' => 'toggle']) !!}
+ {!! Form::label('is_visible', 'Is Visible', ['class' => 'form-check-label ml-3']) !!} {!! add_help('If turned off, the category will not be visible in the category list or available for selection in search. Permissioned staff will still be able to add currencies to them, however.') !!}
+
+
+
+ {!! Form::submit($category->id ? 'Edit' : 'Create', ['class' => 'btn btn-primary']) !!}
+
+
+ {!! Form::close() !!}
+
+ @if ($category->id)
+ Preview
+
+
+ @include('world._entry', ['imageUrl' => $category->categoryImageUrl, 'name' => $category->displayName, 'description' => $category->parsed_description, 'category' => $category, 'visible' => $category->is_visible])
+
+
+ @endif
+@endsection
+
+@section('scripts')
+ @parent
+ @include('js._tinymce_wysiwyg')
+
+@endsection
diff --git a/resources/views/admin/currencies/currencies.blade.php b/resources/views/admin/currencies/currencies.blade.php
index 7644d1b0a4..57d42fcdf8 100644
--- a/resources/views/admin/currencies/currencies.blade.php
+++ b/resources/views/admin/currencies/currencies.blade.php
@@ -15,18 +15,25 @@
The order of currencies as displayed on user and character profiles can be edited from the Sort Currencies page.
-
+
+
{!! $currencies->render() !!}