diff --git a/asset-manifest.json b/asset-manifest.json index e635614a..7d35b55f 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,7 +1,7 @@ { "files": { - "main.css": "./static/css/main.8218d45b.css", - "main.js": "./static/js/main.687b5f90.js", + "main.css": "./static/css/main.70c6ef9a.css", + "main.js": "./static/js/main.5f6720cf.js", "static/media/play-again.png": "./static/media/play-again.38923238033620c8ab00.png", "static/media/home.png": "./static/media/home.cbf4d9badcc4e56f2636.png", "static/media/login.png": "./static/media/login.d6892222d1bfefcefde6.png", @@ -10,11 +10,11 @@ "static/media/gem.png": "./static/media/gem.b19d06f98a5cf6c31cbd.png", "static/media/cursor.cur": "./static/media/cursor.138cb2f1fcf8183aaa1b.cur", "index.html": "./index.html", - "main.8218d45b.css.map": "./static/css/main.8218d45b.css.map", - "main.687b5f90.js.map": "./static/js/main.687b5f90.js.map" + "main.70c6ef9a.css.map": "./static/css/main.70c6ef9a.css.map", + "main.5f6720cf.js.map": "./static/js/main.5f6720cf.js.map" }, "entrypoints": [ - "static/css/main.8218d45b.css", - "static/js/main.687b5f90.js" + "static/css/main.70c6ef9a.css", + "static/js/main.5f6720cf.js" ] } \ No newline at end of file diff --git a/assets/game/player/aerialPlayer.png b/assets/game/player/aerialPlayer.png new file mode 100644 index 00000000..9fbba5e3 Binary files /dev/null and b/assets/game/player/aerialPlayer.png differ diff --git a/assets/game/player/arialSword.png b/assets/game/player/aerialSword.png similarity index 100% rename from assets/game/player/arialSword.png rename to assets/game/player/aerialSword.png diff --git a/assets/game/player/ancientcoinPlayer.png b/assets/game/player/ancientcoinPlayer.png new file mode 100644 index 00000000..d458e308 Binary files /dev/null and b/assets/game/player/ancientcoinPlayer.png differ diff --git a/assets/game/player/ancientcoinSword.png b/assets/game/player/ancientcoinSword.png new file mode 100644 index 00000000..01f26fc9 Binary files /dev/null and b/assets/game/player/ancientcoinSword.png differ diff --git a/assets/game/player/applePlayer.png b/assets/game/player/applePlayer.png new file mode 100644 index 00000000..21f95144 Binary files /dev/null and b/assets/game/player/applePlayer.png differ diff --git a/assets/game/player/appleSword.png b/assets/game/player/appleSword.png new file mode 100644 index 00000000..5e5fad21 Binary files /dev/null and b/assets/game/player/appleSword.png differ diff --git a/assets/game/player/arialPlayer.png b/assets/game/player/arialPlayer.png deleted file mode 100644 index 9b67c3a7..00000000 Binary files a/assets/game/player/arialPlayer.png and /dev/null differ diff --git a/assets/game/player/ashPlayer.png b/assets/game/player/ashPlayer.png new file mode 100644 index 00000000..072d00c4 Binary files /dev/null and b/assets/game/player/ashPlayer.png differ diff --git a/assets/game/player/ashSword.png b/assets/game/player/ashSword.png new file mode 100644 index 00000000..b5879ccf Binary files /dev/null and b/assets/game/player/ashSword.png differ diff --git a/assets/game/player/auroraborealisPlayer.png b/assets/game/player/auroraborealisPlayer.png new file mode 100644 index 00000000..29f7e354 Binary files /dev/null and b/assets/game/player/auroraborealisPlayer.png differ diff --git a/assets/game/player/auroraborealisSword.png b/assets/game/player/auroraborealisSword.png new file mode 100644 index 00000000..da0d1f19 Binary files /dev/null and b/assets/game/player/auroraborealisSword.png differ diff --git a/assets/game/player/autumnPlayer.png b/assets/game/player/autumnPlayer.png new file mode 100644 index 00000000..9bc7d752 Binary files /dev/null and b/assets/game/player/autumnPlayer.png differ diff --git a/assets/game/player/autumnSword.png b/assets/game/player/autumnSword.png new file mode 100644 index 00000000..b233e192 Binary files /dev/null and b/assets/game/player/autumnSword.png differ diff --git a/assets/game/player/aztecPlayer.png b/assets/game/player/aztecPlayer.png index d3d8987b..11b1a232 100644 Binary files a/assets/game/player/aztecPlayer.png and b/assets/game/player/aztecPlayer.png differ diff --git a/assets/game/player/basketballv2Player.png b/assets/game/player/basketballv2Player.png new file mode 100644 index 00000000..3ac661a9 Binary files /dev/null and b/assets/game/player/basketballv2Player.png differ diff --git a/assets/game/player/basketballv2Sword.png b/assets/game/player/basketballv2Sword.png new file mode 100644 index 00000000..d7743b5c Binary files /dev/null and b/assets/game/player/basketballv2Sword.png differ diff --git a/assets/game/player/beachv2Player.png b/assets/game/player/beachv2Player.png new file mode 100644 index 00000000..1cb09a99 Binary files /dev/null and b/assets/game/player/beachv2Player.png differ diff --git a/assets/game/player/beachv2Sword.png b/assets/game/player/beachv2Sword.png new file mode 100644 index 00000000..067588de Binary files /dev/null and b/assets/game/player/beachv2Sword.png differ diff --git a/assets/game/player/bitPlayer.png b/assets/game/player/bitPlayer.png new file mode 100644 index 00000000..22295c67 Binary files /dev/null and b/assets/game/player/bitPlayer.png differ diff --git a/assets/game/player/bitSword.png b/assets/game/player/bitSword.png new file mode 100644 index 00000000..f4aad776 Binary files /dev/null and b/assets/game/player/bitSword.png differ diff --git a/assets/game/player/blackandwhitePlayer.png b/assets/game/player/blackandwhitePlayer.png new file mode 100644 index 00000000..87f875c6 Binary files /dev/null and b/assets/game/player/blackandwhitePlayer.png differ diff --git a/assets/game/player/blackandwhiteSword.png b/assets/game/player/blackandwhiteSword.png new file mode 100644 index 00000000..d2ad8172 Binary files /dev/null and b/assets/game/player/blackandwhiteSword.png differ diff --git a/assets/game/player/blueberryv2Player.png b/assets/game/player/blueberryv2Player.png new file mode 100644 index 00000000..982987a3 Binary files /dev/null and b/assets/game/player/blueberryv2Player.png differ diff --git a/assets/game/player/blueberryv2Sword.png b/assets/game/player/blueberryv2Sword.png new file mode 100644 index 00000000..1ddf9d03 Binary files /dev/null and b/assets/game/player/blueberryv2Sword.png differ diff --git a/assets/game/player/brickPlayer.png b/assets/game/player/brickPlayer.png new file mode 100644 index 00000000..b5d2c4b4 Binary files /dev/null and b/assets/game/player/brickPlayer.png differ diff --git a/assets/game/player/brickSword.png b/assets/game/player/brickSword.png new file mode 100644 index 00000000..00477554 Binary files /dev/null and b/assets/game/player/brickSword.png differ diff --git a/assets/game/player/brokenPlayer.png b/assets/game/player/brokenPlayer.png new file mode 100644 index 00000000..d17b6754 Binary files /dev/null and b/assets/game/player/brokenPlayer.png differ diff --git a/assets/game/player/brokenSword.png b/assets/game/player/brokenSword.png new file mode 100644 index 00000000..b896b4ed Binary files /dev/null and b/assets/game/player/brokenSword.png differ diff --git a/assets/game/player/calculatorPlayer.png b/assets/game/player/calculatorPlayer.png index 7424db1f..77a1f822 100644 Binary files a/assets/game/player/calculatorPlayer.png and b/assets/game/player/calculatorPlayer.png differ diff --git a/assets/game/player/calculatorSword.png b/assets/game/player/calculatorSword.png index 4c49a760..b960e166 100644 Binary files a/assets/game/player/calculatorSword.png and b/assets/game/player/calculatorSword.png differ diff --git a/assets/game/player/chestPlayer.png b/assets/game/player/chestPlayer.png new file mode 100644 index 00000000..f84d6aae Binary files /dev/null and b/assets/game/player/chestPlayer.png differ diff --git a/assets/game/player/chestSword.png b/assets/game/player/chestSword.png new file mode 100644 index 00000000..968c8c87 Binary files /dev/null and b/assets/game/player/chestSword.png differ diff --git a/assets/game/player/chromaPlayer.png b/assets/game/player/chromaPlayer.png new file mode 100644 index 00000000..abaf717b Binary files /dev/null and b/assets/game/player/chromaPlayer.png differ diff --git a/assets/game/player/chromaSword.png b/assets/game/player/chromaSword.png new file mode 100644 index 00000000..91cee2a4 Binary files /dev/null and b/assets/game/player/chromaSword.png differ diff --git a/assets/game/player/coolcarlPlayer.png b/assets/game/player/coolcarlPlayer.png new file mode 100644 index 00000000..1f6d9880 Binary files /dev/null and b/assets/game/player/coolcarlPlayer.png differ diff --git a/assets/game/player/coolercarlSword.png b/assets/game/player/coolcarlSword.png similarity index 100% rename from assets/game/player/coolercarlSword.png rename to assets/game/player/coolcarlSword.png diff --git a/assets/game/player/coolercarlPlayer.png b/assets/game/player/coolercarlPlayer.png deleted file mode 100644 index 8e9e251b..00000000 Binary files a/assets/game/player/coolercarlPlayer.png and /dev/null differ diff --git a/assets/game/player/corruptionPlayer.png b/assets/game/player/corruptionPlayer.png index acab7cc6..d5d68f0c 100644 Binary files a/assets/game/player/corruptionPlayer.png and b/assets/game/player/corruptionPlayer.png differ diff --git a/assets/game/player/cowboyPlayer.png b/assets/game/player/cowboyPlayer.png new file mode 100644 index 00000000..7560f9c7 Binary files /dev/null and b/assets/game/player/cowboyPlayer.png differ diff --git a/assets/game/player/cowboySword.png b/assets/game/player/cowboySword.png new file mode 100644 index 00000000..058380e8 Binary files /dev/null and b/assets/game/player/cowboySword.png differ diff --git a/assets/game/player/crosshairPlayer.png b/assets/game/player/crosshairPlayer.png new file mode 100644 index 00000000..300340b5 Binary files /dev/null and b/assets/game/player/crosshairPlayer.png differ diff --git a/assets/game/player/crosshairSword.png b/assets/game/player/crosshairSword.png new file mode 100644 index 00000000..d5e101b8 Binary files /dev/null and b/assets/game/player/crosshairSword.png differ diff --git a/assets/game/player/cyberneticPlayer.png b/assets/game/player/cyberneticPlayer.png new file mode 100644 index 00000000..14b15236 Binary files /dev/null and b/assets/game/player/cyberneticPlayer.png differ diff --git a/assets/game/player/cyberneticSword.png b/assets/game/player/cyberneticSword.png new file mode 100644 index 00000000..bcd953d0 Binary files /dev/null and b/assets/game/player/cyberneticSword.png differ diff --git a/assets/game/player/dangerPlayer.png b/assets/game/player/dangerPlayer.png index 87f60f69..2607d68e 100644 Binary files a/assets/game/player/dangerPlayer.png and b/assets/game/player/dangerPlayer.png differ diff --git a/assets/game/player/desertninjaPlayer.png b/assets/game/player/desertninjaPlayer.png new file mode 100644 index 00000000..53447e92 Binary files /dev/null and b/assets/game/player/desertninjaPlayer.png differ diff --git a/assets/game/player/desertninjaSword.png b/assets/game/player/desertninjaSword.png new file mode 100644 index 00000000..3c7d8c4d Binary files /dev/null and b/assets/game/player/desertninjaSword.png differ diff --git a/assets/game/player/digitalPlayer.png b/assets/game/player/digitalPlayer.png new file mode 100644 index 00000000..0dea5daa Binary files /dev/null and b/assets/game/player/digitalPlayer.png differ diff --git a/assets/game/player/digitalSword.png b/assets/game/player/digitalSword.png new file mode 100644 index 00000000..ad2c3e52 Binary files /dev/null and b/assets/game/player/digitalSword.png differ diff --git a/assets/game/player/disguisedPlayer.png b/assets/game/player/disguisedPlayer.png new file mode 100644 index 00000000..d8b9139b Binary files /dev/null and b/assets/game/player/disguisedPlayer.png differ diff --git a/assets/game/player/disguisedSword.png b/assets/game/player/disguisedSword.png new file mode 100644 index 00000000..d6ec0d11 Binary files /dev/null and b/assets/game/player/disguisedSword.png differ diff --git a/assets/game/player/donutv2Player.png b/assets/game/player/donutv2Player.png new file mode 100644 index 00000000..b841783e Binary files /dev/null and b/assets/game/player/donutv2Player.png differ diff --git a/assets/game/player/donutv2Sword.png b/assets/game/player/donutv2Sword.png new file mode 100644 index 00000000..e865e8c5 Binary files /dev/null and b/assets/game/player/donutv2Sword.png differ diff --git a/assets/game/player/empyreanPlayer.png b/assets/game/player/empyreanPlayer.png new file mode 100644 index 00000000..48fa62e5 Binary files /dev/null and b/assets/game/player/empyreanPlayer.png differ diff --git a/assets/game/player/empyreanSword.png b/assets/game/player/empyreanSword.png new file mode 100644 index 00000000..81954c04 Binary files /dev/null and b/assets/game/player/empyreanSword.png differ diff --git a/assets/game/player/fadePlayer.png b/assets/game/player/fadePlayer.png new file mode 100644 index 00000000..739b7579 Binary files /dev/null and b/assets/game/player/fadePlayer.png differ diff --git a/assets/game/player/fadeSword.png b/assets/game/player/fadeSword.png new file mode 100644 index 00000000..23e8efef Binary files /dev/null and b/assets/game/player/fadeSword.png differ diff --git a/assets/game/player/fireandwaterPlayer.png b/assets/game/player/fireandwaterPlayer.png new file mode 100644 index 00000000..a04878d5 Binary files /dev/null and b/assets/game/player/fireandwaterPlayer.png differ diff --git a/assets/game/player/fireandwaterSword.png b/assets/game/player/fireandwaterSword.png new file mode 100644 index 00000000..80f54727 Binary files /dev/null and b/assets/game/player/fireandwaterSword.png differ diff --git a/assets/game/player/fireworkPlayer.png b/assets/game/player/fireworkPlayer.png new file mode 100644 index 00000000..6846df6d Binary files /dev/null and b/assets/game/player/fireworkPlayer.png differ diff --git a/assets/game/player/fireworkSword.png b/assets/game/player/fireworkSword.png new file mode 100644 index 00000000..158e6fd4 Binary files /dev/null and b/assets/game/player/fireworkSword.png differ diff --git a/assets/game/player/flameconjurerPlayer.png b/assets/game/player/flameconjurerPlayer.png new file mode 100644 index 00000000..86f4aebd Binary files /dev/null and b/assets/game/player/flameconjurerPlayer.png differ diff --git a/assets/game/player/flameconjurerSword.png b/assets/game/player/flameconjurerSword.png new file mode 100644 index 00000000..20cd88f2 Binary files /dev/null and b/assets/game/player/flameconjurerSword.png differ diff --git a/assets/game/player/forestninjaPlayer.png b/assets/game/player/forestninjaPlayer.png new file mode 100644 index 00000000..6dfd876f Binary files /dev/null and b/assets/game/player/forestninjaPlayer.png differ diff --git a/assets/game/player/forestninjaSword.png b/assets/game/player/forestninjaSword.png new file mode 100644 index 00000000..0991f146 Binary files /dev/null and b/assets/game/player/forestninjaSword.png differ diff --git a/assets/game/player/frostNinjaPlayer.png b/assets/game/player/frostNinjaPlayer.png deleted file mode 100644 index c990b590..00000000 Binary files a/assets/game/player/frostNinjaPlayer.png and /dev/null differ diff --git a/assets/game/player/frostNinjaSword.png b/assets/game/player/frostNinjaSword.png deleted file mode 100644 index 9a31c93d..00000000 Binary files a/assets/game/player/frostNinjaSword.png and /dev/null differ diff --git a/assets/game/player/frostconjurerPlayer.png b/assets/game/player/frostconjurerPlayer.png new file mode 100644 index 00000000..69d81444 Binary files /dev/null and b/assets/game/player/frostconjurerPlayer.png differ diff --git a/assets/game/player/frostconjurerSword.png b/assets/game/player/frostconjurerSword.png new file mode 100644 index 00000000..81188190 Binary files /dev/null and b/assets/game/player/frostconjurerSword.png differ diff --git a/assets/game/player/frostninjaPlayer.png b/assets/game/player/frostninjaPlayer.png new file mode 100644 index 00000000..63cce840 Binary files /dev/null and b/assets/game/player/frostninjaPlayer.png differ diff --git a/assets/game/player/frostninjaSword.png b/assets/game/player/frostninjaSword.png new file mode 100644 index 00000000..62437878 Binary files /dev/null and b/assets/game/player/frostninjaSword.png differ diff --git a/assets/game/player/glassv2Player.png b/assets/game/player/glassv2Player.png new file mode 100644 index 00000000..5be7aa88 Binary files /dev/null and b/assets/game/player/glassv2Player.png differ diff --git a/assets/game/player/glassv2Sword.png b/assets/game/player/glassv2Sword.png new file mode 100644 index 00000000..61726fd2 Binary files /dev/null and b/assets/game/player/glassv2Sword.png differ diff --git a/assets/game/player/goldenPlayer.png b/assets/game/player/goldenPlayer.png new file mode 100644 index 00000000..7e867fa1 Binary files /dev/null and b/assets/game/player/goldenPlayer.png differ diff --git a/assets/game/player/goldenSword.png b/assets/game/player/goldenSword.png new file mode 100644 index 00000000..893ec99b Binary files /dev/null and b/assets/game/player/goldenSword.png differ diff --git a/assets/game/player/hologramPlayer.png b/assets/game/player/hologramPlayer.png new file mode 100644 index 00000000..88f697d0 Binary files /dev/null and b/assets/game/player/hologramPlayer.png differ diff --git a/assets/game/player/hologramSword.png b/assets/game/player/hologramSword.png new file mode 100644 index 00000000..87f50ba2 Binary files /dev/null and b/assets/game/player/hologramSword.png differ diff --git a/assets/game/player/hotairballoonPlayer.png b/assets/game/player/hotairballoonPlayer.png new file mode 100644 index 00000000..37d8da9e Binary files /dev/null and b/assets/game/player/hotairballoonPlayer.png differ diff --git a/assets/game/player/hotairballoonSword.png b/assets/game/player/hotairballoonSword.png new file mode 100644 index 00000000..1aa1b351 Binary files /dev/null and b/assets/game/player/hotairballoonSword.png differ diff --git a/assets/game/player/hyperspherePlayer.png b/assets/game/player/hyperspherePlayer.png index c369def6..08578402 100644 Binary files a/assets/game/player/hyperspherePlayer.png and b/assets/game/player/hyperspherePlayer.png differ diff --git a/assets/game/player/hypersphereSword.png b/assets/game/player/hypersphereSword.png index 7b48f88c..06982aa6 100644 Binary files a/assets/game/player/hypersphereSword.png and b/assets/game/player/hypersphereSword.png differ diff --git a/assets/game/player/infinityPlayer.png b/assets/game/player/infinityPlayer.png new file mode 100644 index 00000000..b968d8d3 Binary files /dev/null and b/assets/game/player/infinityPlayer.png differ diff --git a/assets/game/player/infinitySword.png b/assets/game/player/infinitySword.png new file mode 100644 index 00000000..1360ba42 Binary files /dev/null and b/assets/game/player/infinitySword.png differ diff --git a/assets/game/player/keyboardPlayer.png b/assets/game/player/keyboardPlayer.png index 07eb9b27..323c587b 100644 Binary files a/assets/game/player/keyboardPlayer.png and b/assets/game/player/keyboardPlayer.png differ diff --git a/assets/game/player/lavaninjaPlayer.png b/assets/game/player/lavaninjaPlayer.png new file mode 100644 index 00000000..2fb93ef1 Binary files /dev/null and b/assets/game/player/lavaninjaPlayer.png differ diff --git a/assets/game/player/lavaninjaSword.png b/assets/game/player/lavaninjaSword.png new file mode 100644 index 00000000..793d474c Binary files /dev/null and b/assets/game/player/lavaninjaSword.png differ diff --git a/assets/game/player/leafpilePlayer.png b/assets/game/player/leafpilePlayer.png new file mode 100644 index 00000000..bc336098 Binary files /dev/null and b/assets/game/player/leafpilePlayer.png differ diff --git a/assets/game/player/leafpileSword.png b/assets/game/player/leafpileSword.png new file mode 100644 index 00000000..9c432379 Binary files /dev/null and b/assets/game/player/leafpileSword.png differ diff --git a/assets/game/player/lightPlayer.png b/assets/game/player/lightPlayer.png new file mode 100644 index 00000000..a053ce6a Binary files /dev/null and b/assets/game/player/lightPlayer.png differ diff --git a/assets/game/player/lightSword.png b/assets/game/player/lightSword.png new file mode 100644 index 00000000..3d5c300d Binary files /dev/null and b/assets/game/player/lightSword.png differ diff --git a/assets/game/player/lightningconjurerPlayer.png b/assets/game/player/lightningconjurerPlayer.png new file mode 100644 index 00000000..296e740e Binary files /dev/null and b/assets/game/player/lightningconjurerPlayer.png differ diff --git a/assets/game/player/lightningconjurerSword.png b/assets/game/player/lightningconjurerSword.png new file mode 100644 index 00000000..1c959248 Binary files /dev/null and b/assets/game/player/lightningconjurerSword.png differ diff --git a/assets/game/player/lionPlayer.png b/assets/game/player/lionPlayer.png index bedd663f..9f36e0e4 100644 Binary files a/assets/game/player/lionPlayer.png and b/assets/game/player/lionPlayer.png differ diff --git a/assets/game/player/lionSword.png b/assets/game/player/lionSword.png index 52f5d001..d2c487d6 100644 Binary files a/assets/game/player/lionSword.png and b/assets/game/player/lionSword.png differ diff --git a/assets/game/player/luminousPlayer.png b/assets/game/player/luminousPlayer.png new file mode 100644 index 00000000..d713c04a Binary files /dev/null and b/assets/game/player/luminousPlayer.png differ diff --git a/assets/game/player/luminousSword.png b/assets/game/player/luminousSword.png new file mode 100644 index 00000000..83e6fa4e Binary files /dev/null and b/assets/game/player/luminousSword.png differ diff --git a/assets/game/player/lunarPlayer.png b/assets/game/player/lunarPlayer.png deleted file mode 100644 index 7eaabe81..00000000 Binary files a/assets/game/player/lunarPlayer.png and /dev/null differ diff --git a/assets/game/player/macePlayer.png b/assets/game/player/macePlayer.png new file mode 100644 index 00000000..8e5249a8 Binary files /dev/null and b/assets/game/player/macePlayer.png differ diff --git a/assets/game/player/maceSword.png b/assets/game/player/maceSword.png new file mode 100644 index 00000000..55a11cee Binary files /dev/null and b/assets/game/player/maceSword.png differ diff --git a/assets/game/player/magmaticPlayer.png b/assets/game/player/magmaticPlayer.png new file mode 100644 index 00000000..b45596b1 Binary files /dev/null and b/assets/game/player/magmaticPlayer.png differ diff --git a/assets/game/player/magmaticSword.png b/assets/game/player/magmaticSword.png new file mode 100644 index 00000000..d7d06948 Binary files /dev/null and b/assets/game/player/magmaticSword.png differ diff --git a/assets/game/player/maliceSword.png b/assets/game/player/maliceSword.png deleted file mode 100644 index de56f4a2..00000000 Binary files a/assets/game/player/maliceSword.png and /dev/null differ diff --git a/assets/game/player/metalPlayer.png b/assets/game/player/metalPlayer.png new file mode 100644 index 00000000..a37c7452 Binary files /dev/null and b/assets/game/player/metalPlayer.png differ diff --git a/assets/game/player/metalSword.png b/assets/game/player/metalSword.png new file mode 100644 index 00000000..fca8c3be Binary files /dev/null and b/assets/game/player/metalSword.png differ diff --git a/assets/game/player/midnightPlayer.png b/assets/game/player/midnightPlayer.png new file mode 100644 index 00000000..a4d750d1 Binary files /dev/null and b/assets/game/player/midnightPlayer.png differ diff --git a/assets/game/player/lunarSword.png b/assets/game/player/midnightSword.png similarity index 100% rename from assets/game/player/lunarSword.png rename to assets/game/player/midnightSword.png diff --git a/assets/game/player/mummyPlayer.png b/assets/game/player/mummyPlayer.png index 3e10f382..11d2b4b4 100644 Binary files a/assets/game/player/mummyPlayer.png and b/assets/game/player/mummyPlayer.png differ diff --git a/assets/game/player/necromancerPlayer.png b/assets/game/player/necromancerPlayer.png new file mode 100644 index 00000000..e306be97 Binary files /dev/null and b/assets/game/player/necromancerPlayer.png differ diff --git a/assets/game/player/necromancerSword.png b/assets/game/player/necromancerSword.png new file mode 100644 index 00000000..516abcc7 Binary files /dev/null and b/assets/game/player/necromancerSword.png differ diff --git a/assets/game/player/neoPlayer.png b/assets/game/player/neoPlayer.png deleted file mode 100644 index dd9d4931..00000000 Binary files a/assets/game/player/neoPlayer.png and /dev/null differ diff --git a/assets/game/player/malicePlayer.png b/assets/game/player/nightlurkerPlayer.png similarity index 100% rename from assets/game/player/malicePlayer.png rename to assets/game/player/nightlurkerPlayer.png diff --git a/assets/game/player/nightlurkerSword.png b/assets/game/player/nightlurkerSword.png new file mode 100644 index 00000000..737c5799 Binary files /dev/null and b/assets/game/player/nightlurkerSword.png differ diff --git a/assets/game/player/nightmareninjaPlayer.png b/assets/game/player/nightmareninjaPlayer.png new file mode 100644 index 00000000..c5c0c70f Binary files /dev/null and b/assets/game/player/nightmareninjaPlayer.png differ diff --git a/assets/game/player/nightmareninjaSword.png b/assets/game/player/nightmareninjaSword.png new file mode 100644 index 00000000..8b1145e4 Binary files /dev/null and b/assets/game/player/nightmareninjaSword.png differ diff --git a/assets/game/player/ninjav2Player.png b/assets/game/player/ninjav2Player.png new file mode 100644 index 00000000..190ef23b Binary files /dev/null and b/assets/game/player/ninjav2Player.png differ diff --git a/assets/game/player/ninjav2Sword.png b/assets/game/player/ninjav2Sword.png new file mode 100644 index 00000000..ee24a64a Binary files /dev/null and b/assets/game/player/ninjav2Sword.png differ diff --git a/assets/game/player/obliteratorPlayer.png b/assets/game/player/obliteratorPlayer.png new file mode 100644 index 00000000..520271fe Binary files /dev/null and b/assets/game/player/obliteratorPlayer.png differ diff --git a/assets/game/player/obliteratorSword.png b/assets/game/player/obliteratorSword.png new file mode 100644 index 00000000..393d19c3 Binary files /dev/null and b/assets/game/player/obliteratorSword.png differ diff --git a/assets/game/player/orangePlayer.png b/assets/game/player/orangePlayer.png new file mode 100644 index 00000000..012a4e2b Binary files /dev/null and b/assets/game/player/orangePlayer.png differ diff --git a/assets/game/player/orangeSword.png b/assets/game/player/orangeSword.png new file mode 100644 index 00000000..84f4778d Binary files /dev/null and b/assets/game/player/orangeSword.png differ diff --git a/assets/game/player/radarPlayer.png b/assets/game/player/radarPlayer.png new file mode 100644 index 00000000..1a42dfef Binary files /dev/null and b/assets/game/player/radarPlayer.png differ diff --git a/assets/game/player/radarSword.png b/assets/game/player/radarSword.png new file mode 100644 index 00000000..ebe9ac06 Binary files /dev/null and b/assets/game/player/radarSword.png differ diff --git a/assets/game/player/reduxPlayer.png b/assets/game/player/reduxPlayer.png new file mode 100644 index 00000000..db41c8f5 Binary files /dev/null and b/assets/game/player/reduxPlayer.png differ diff --git a/assets/game/player/reduxSword.png b/assets/game/player/reduxSword.png new file mode 100644 index 00000000..016b7f56 Binary files /dev/null and b/assets/game/player/reduxSword.png differ diff --git a/assets/game/player/refusalPlayer.png b/assets/game/player/refusalPlayer.png new file mode 100644 index 00000000..099f5f4a Binary files /dev/null and b/assets/game/player/refusalPlayer.png differ diff --git a/assets/game/player/refusalSword.png b/assets/game/player/refusalSword.png new file mode 100644 index 00000000..2af860cb Binary files /dev/null and b/assets/game/player/refusalSword.png differ diff --git a/assets/game/player/roboPlayer.png b/assets/game/player/roboPlayer.png new file mode 100644 index 00000000..d943f5dc Binary files /dev/null and b/assets/game/player/roboPlayer.png differ diff --git a/assets/game/player/roboSword.png b/assets/game/player/roboSword.png new file mode 100644 index 00000000..b1a213fa Binary files /dev/null and b/assets/game/player/roboSword.png differ diff --git a/assets/game/player/shieldPlayer.png b/assets/game/player/shieldPlayer.png new file mode 100644 index 00000000..c3f7bf34 Binary files /dev/null and b/assets/game/player/shieldPlayer.png differ diff --git a/assets/game/player/shieldSword.png b/assets/game/player/shieldSword.png new file mode 100644 index 00000000..994d01eb Binary files /dev/null and b/assets/game/player/shieldSword.png differ diff --git a/assets/game/player/stainedglassPlayer.png b/assets/game/player/stainedglassPlayer.png index a9327fb6..d974b9ce 100644 Binary files a/assets/game/player/stainedglassPlayer.png and b/assets/game/player/stainedglassPlayer.png differ diff --git a/assets/game/player/stainedglassSword.png b/assets/game/player/stainedglassSword.png index 75566bc5..359e6628 100644 Binary files a/assets/game/player/stainedglassSword.png and b/assets/game/player/stainedglassSword.png differ diff --git a/assets/game/player/stainedglassrevisedSword.png b/assets/game/player/stainedglassrevisedSword.png deleted file mode 100644 index 75566bc5..00000000 Binary files a/assets/game/player/stainedglassrevisedSword.png and /dev/null differ diff --git a/assets/game/player/steampunkPlayer.png b/assets/game/player/steampunkPlayer.png new file mode 100644 index 00000000..fc36d8cf Binary files /dev/null and b/assets/game/player/steampunkPlayer.png differ diff --git a/assets/game/player/steampunkSword.png b/assets/game/player/steampunkSword.png new file mode 100644 index 00000000..c79adf38 Binary files /dev/null and b/assets/game/player/steampunkSword.png differ diff --git a/assets/game/player/steelPlayer.png b/assets/game/player/steelPlayer.png new file mode 100644 index 00000000..e1fdc483 Binary files /dev/null and b/assets/game/player/steelPlayer.png differ diff --git a/assets/game/player/steelSword.png b/assets/game/player/steelSword.png new file mode 100644 index 00000000..5577917e Binary files /dev/null and b/assets/game/player/steelSword.png differ diff --git a/assets/game/player/summitninjaPlayer.png b/assets/game/player/summitninjaPlayer.png new file mode 100644 index 00000000..1654d676 Binary files /dev/null and b/assets/game/player/summitninjaPlayer.png differ diff --git a/assets/game/player/summitninjaSword.png b/assets/game/player/summitninjaSword.png new file mode 100644 index 00000000..09d8f980 Binary files /dev/null and b/assets/game/player/summitninjaSword.png differ diff --git a/assets/game/player/sunsetv2Player.png b/assets/game/player/sunsetv2Player.png new file mode 100644 index 00000000..79a35eed Binary files /dev/null and b/assets/game/player/sunsetv2Player.png differ diff --git a/assets/game/player/sunsetv2Sword.png b/assets/game/player/sunsetv2Sword.png new file mode 100644 index 00000000..81632956 Binary files /dev/null and b/assets/game/player/sunsetv2Sword.png differ diff --git a/assets/game/player/thedividerPlayer.png b/assets/game/player/thedividerPlayer.png new file mode 100644 index 00000000..194ade54 Binary files /dev/null and b/assets/game/player/thedividerPlayer.png differ diff --git a/assets/game/player/thedividerSword.png b/assets/game/player/thedividerSword.png new file mode 100644 index 00000000..f4974e7a Binary files /dev/null and b/assets/game/player/thedividerSword.png differ diff --git a/assets/game/player/thundercloudninjaPlayer.png b/assets/game/player/thundercloudninjaPlayer.png new file mode 100644 index 00000000..554d4524 Binary files /dev/null and b/assets/game/player/thundercloudninjaPlayer.png differ diff --git a/assets/game/player/thundercloudninjaSword.png b/assets/game/player/thundercloudninjaSword.png new file mode 100644 index 00000000..29d0c9cc Binary files /dev/null and b/assets/game/player/thundercloudninjaSword.png differ diff --git a/assets/game/player/unknownPlayer.png b/assets/game/player/unknownPlayer.png new file mode 100644 index 00000000..c3800dfb Binary files /dev/null and b/assets/game/player/unknownPlayer.png differ diff --git a/assets/game/player/unknownSword.png b/assets/game/player/unknownSword.png new file mode 100644 index 00000000..64694333 Binary files /dev/null and b/assets/game/player/unknownSword.png differ diff --git a/assets/game/player/voidPlayer.png b/assets/game/player/voidPlayer.png new file mode 100644 index 00000000..6bc11ab0 Binary files /dev/null and b/assets/game/player/voidPlayer.png differ diff --git a/assets/game/player/neoSword.png b/assets/game/player/voidSword.png similarity index 100% rename from assets/game/player/neoSword.png rename to assets/game/player/voidSword.png diff --git a/assets/game/player/worldPlayer.png b/assets/game/player/worldPlayer.png new file mode 100644 index 00000000..21da902e Binary files /dev/null and b/assets/game/player/worldPlayer.png differ diff --git a/assets/game/player/worldSword.png b/assets/game/player/worldSword.png new file mode 100644 index 00000000..75fb3669 Binary files /dev/null and b/assets/game/player/worldSword.png differ diff --git a/index.html b/index.html index 7e3eab57..2e0de549 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Swordbattle.ioSwordbattle.io
\ No newline at end of file +Swordbattle.ioSwordbattle.io
\ No newline at end of file diff --git a/static/css/main.8218d45b.css b/static/css/main.70c6ef9a.css similarity index 97% rename from static/css/main.8218d45b.css rename to static/css/main.70c6ef9a.css index e1453e10..55a025c1 100644 --- a/static/css/main.8218d45b.css +++ b/static/css/main.70c6ef9a.css @@ -1,4 +1,4 @@ -@import url(https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap);@import url(https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap);#chat{background-color:#f0f8ff;border:2px solid #00000024;font-family:Franklin Gothic Medium,Arial,sans-serif;font-size:max(min(1.5vw,36px),24px);padding:3px 6px}.leaderboard{color:#fff;font-family:Arial,Helvetica,sans-serif;padding:5px;pointer-events:none;position:fixed;right:10px;text-shadow:1px 1px 1px #000;top:10px;transform-origin:top right;-webkit-user-select:none;user-select:none;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.leaderboard .leaderboard-title{font-size:24px;margin-bottom:5px;pointer-events:all;text-align:center}.leaderboard .leaderboard-title:hover{cursor:pointer}.leaderboard .leaderboard-content{opacity:1;transition:all .2s ease-in}.leaderboard .leaderboard-content.hidden{opacity:0}.leaderboard-line{display:block;font-size:22px;white-space:nowrap}.results{animation:fadeIn 1s ease both;left:50%;position:fixed;top:50%;transform:translate(-50%,-50%);-webkit-user-select:none;user-select:none;width:600px}.results .results-main{background-color:#000000b3;border:5px solid #111;border-radius:10px;text-shadow:1px 1px 1px #000}.results .results-title{color:#fff;font-size:45px;font-weight:700;margin-bottom:5px;margin-top:10px;text-align:center}.results .results-title .name{color:#eef6ff;font-size:30px;margin-top:10px}.results .results-container{margin:0 auto 15px;text-align:center}.results .results-container .info{color:#ccc;display:inline-block;font-size:13px;margin:15px;text-align:center}.results .results-container .info .title{color:#f5f5f5;font-size:22px;margin-bottom:5px}.results .results-buttons{align-items:center;display:flex;flex-direction:column;justify-content:center;padding:15px}.results .results-buttons .play-again img{height:150px;transition:.2s;width:150px}.results .results-buttons .play-again img:hover{scale:1.1}.results .results-buttons .to-home{margin-bottom:5px}.results .results-buttons .to-home img{height:60px;transition:.2s;width:auto}.results .results-buttons .to-home img:hover{scale:1.1}.game{cursor:url(../../static/media/cursor.138cb2f1fcf8183aaa1b.cur) 20 20,crosshair;height:100%;overflow:hidden;width:100%}.game,.modal{position:absolute}.modal{background-color:#141414!important;border-radius:10px;box-shadow:0 0 0 5px #2f2f2ffa;color:#e7e7e7;left:50%;min-width:300px;padding:15px 30px;top:50%;transform:translate(-50%,-50%);z-index:5}.modal .modal-close{align-items:center;-webkit-appearance:none;appearance:none;background-color:#000;border:2px solid #fff;border-radius:30px;cursor:pointer;display:flex;height:30px;justify-content:center;line-height:normal;position:absolute;right:0;top:0;transform:rotate(0deg);transition:all .2s linear;width:30px}.modal .modal-close:after,.modal .modal-close:before{background-color:#fff;content:" ";display:block;height:2px;margin:0 auto;position:absolute;transform:rotate(45deg);width:20px}.modal .modal-close:after{transform:rotate(-45deg)}.modal .modal-close:hover{transform:rotate(180deg)}.settings .settings-title{font-size:24px;letter-spacing:2px;margin:0 0 20px}.settings label{display:block;margin-bottom:10px}.settings .settings-line{display:flex;flex-direction:row;justify-content:space-between}.settings input,.settings select{font-size:18px;margin:0 0 10px;width:100%}.switch{display:inline-block;height:21px;position:relative;width:50px}.switch input{height:0;opacity:0;width:0}.switch .slider{background-color:#ccc;bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0;transition:.4s}.switch .slider:before{background-color:#fff;bottom:3px;content:"";height:15px;left:6px;position:absolute;transition:.4s;width:15px}.switch input:checked+.slider{background-color:#2196f3}.switch input:checked+.slider:before{transform:translateX(26px)}.switch input:focus+.slider{box-shadow:0 0 1px #2196f3}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}.loading-screen{align-items:center;background-color:#333;display:flex;height:100%;justify-content:center;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);transition:all .5s ease-in-out;width:100%;z-index:2}.loading-screen .loading-container{text-align:center;width:400px}.loading-screen .loading-container .loading-text{color:#fff;font-size:45px;margin-bottom:10px}.loading-screen .loading-container .progress-bar{background-color:#eee;height:20px;width:100%}.loading-screen .loading-container .progress-bar .progress{background-color:lime;height:100%;transition:width .5s ease-in-out}.login-modal{align-items:center;display:flex;flex-direction:column}.login-modal input{font-size:20px;font-weight:700;margin:5px}.login-modal button{background-color:#4caf50;border:none;border-radius:10px;color:#fff;font-size:22px;margin-top:10px;padding:5px;transition:all .2s ease-in;width:120px}.login-modal button:hover{background-color:#fff;color:#4caf50;cursor:pointer}.signup-modal{align-items:center;display:flex;flex-direction:column}.signup-modal input{font-size:20px;font-weight:700;margin:5px}.signup-modal button{background-color:#4caf50;border:none;border-radius:10px;color:#fff;font-size:22px;margin-top:10px;padding:5px;transition:all .2s ease-in;width:120px}.signup-modal button:hover{background-color:#fff;color:#4caf50;cursor:pointer}.connectionErrorModal{align-items:center;animation:fadeIn 1s ease both;background:none;display:flex;height:100%;justify-content:center;width:100%;z-index:3}.connectionErrorModal .content{border-radius:10px;font-family:Poppins,sans-serif;padding:2rem 3rem 1rem;width:400px}.connectionErrorModal .content h2{font-size:2rem;font-weight:600}.connectionErrorModal .content p{font-size:1rem;line-height:1rem;padding:.5rem 0}.connectionErrorModal .content button{margin:5px}.connectionErrorModal .reload-btn{background:green;border:1px solid #000;border-radius:10px;color:#000;cursor:pointer;font-size:1rem;font-weight:600;padding:.5rem 1rem;transition:all .3s ease}.connectionErrorModal .reload-btn:hover{background:#000;color:#fff}@keyframes fadeIn{0%{-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0);opacity:0}to{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);opacity:1}}.panel{background-color:#222!important;border-radius:10px;box-shadow:0 0 0 3px #333333fa;box-sizing:border-box;color:#e7e7e7;margin:8px;padding:15px}.shop-btn{cursor:pointer;left:0;position:absolute;top:0;transform-origin:left}.shop-btn img{display:inline-block;height:auto;margin-left:10px;margin-top:10px;transition:transform .3s ease}.shop-btn img:hover{transform:scale(1.1)}footer{bottom:10px;box-sizing:border-box;color:#e7e7e7;display:flex;flex-direction:row;gap:30px;height:50px;justify-content:center;padding-top:15px;pointer-events:none;position:absolute;text-align:center;width:100%}footer a{font-size:30px;pointer-events:auto;text-decoration:underline}.auth-buttons{display:flex;flex-direction:column;position:absolute;right:5px;top:5px;transform-origin:top right}.auth-buttons .dropdown .dropdown-menu{background-color:#f9f9f9;border-radius:10px;display:none;padding:12px 16px;right:10px;-webkit-user-select:none;user-select:none}.auth-buttons .dropdown .dropdown-menu li{list-style:none}.auth-buttons .dropdown .dropdown-menu .dropdown-item{color:green;font-size:18px}.auth-buttons .dropdown .dropdown-menu .dropdown-item:active{background-color:#0000;color:inherit}.auth-buttons .dropdown:hover .dropdown-menu{display:block}.auth-buttons .auth-username{color:#fff;cursor:pointer;font-size:40px;margin-right:40px;margin-top:20px}.auth-buttons .auth-btn{height:70px;margin-bottom:10px;margin-right:5px;transition:all .2s ease-in-out}.auth-buttons .auth-btn:hover{cursor:pointer;transform:scale(1.05)}::-webkit-resizer,::-webkit-scrollbar,::-webkit-scrollbar-button,::-webkit-scrollbar-corner,::-webkit-scrollbar-thumb,::-webkit-scrollbar-track,::-webkit-scrollbar-track-piece{background:#0000}::-webkit-scrollbar{border-radius:5px;width:7px}::-webkit-scrollbar-track-piece{border-radius:5px}::-webkit-scrollbar-thumb{background:#9e9e9e;border-radius:5px}::-webkit-scrollbar-thumb:hover{background:#858585}::-webkit-scrollbar-button{height:0;width:0}.connectionErrorModal{z-index:100}input[type=email],input[type=password],input[type=text]{-webkit-touch-callout:text;background-color:#e5e3e3;border:none;border-radius:10px;box-sizing:border-box;color:#4a4a4a;font-size:26px;outline:none;padding:6px;text-align:center;-webkit-user-select:text;user-select:text}input[type=email][disabled],input[type=password][disabled],input[type=text][disabled]{cursor:not-allowed;opacity:.7}.login-modal input,.signup-modal input{font-size:20px}a{color:#6eef95;text-decoration:none}a:hover{color:#29e763}a:active{color:#16c74c}.altLink{color:#6eef95;font-size:24px;text-decoration:none}.altLink:hover{color:#40ea73}.altLink:active{color:#19de54}.inline{display:inline-block}span{font-size:inherit}.material-icons{vertical-align:sub}.ui-icon{font-size:30px;vertical-align:middle}.mainMenu{background-color:#2c7616;height:100%;position:absolute;width:100%;z-index:10}.mainMenu.loaded{background-color:rgba(0,0,0,.507);display:block}#menuContainer{pointer-events:auto;position:absolute;text-align:center;top:45%;white-space:nowrap}#contentt,#menuContainer{transform:translateY(-50%);width:100%}#contentt{height:100%;pointer-events:none}.menuCard{word-wrap:break-word;overflow:hidden;padding:18px;text-align:left;white-space:normal}.menuHeader{color:#dadada;font-size:24px;margin-bottom:5px}.menuSubheader{color:#dadada;font-size:20px;margin-bottom:3px}.menuText{color:#a8a8a8;font-size:18px;margin-bottom:10px}.menuLink{font-size:20px}#gameName{color:#fff;font-size:110px;text-shadow:#474747 3px 5px 2px}.menuButton{background-color:#168f16;border-radius:10px;box-shadow:inset 0 -8px 0 rgba(0,0,0,.294);box-sizing:border-box;color:#fff;cursor:pointer;font-size:23px;padding:6px;text-align:center;transform:scale(1);transition:transform .2s cubic-bezier(.77,0,.175,1);width:100%}.menuButton:hover{transform:scale(1.05)}.menuButton:active{transform:scale(.95)}#topRight1{color:#fff;font-size:24px;text-decoration:none;top:20px}#topRight1,#topRight2{position:absolute;right:20px}#topRight2{cursor:pointer;top:54px}#settingsButton{bottom:12px;cursor:pointer;font-size:35px;left:12px;line-height:20px;position:absolute;transition:transform .1s cubic-bezier(.77,0,.175,1)}#settingsButton:hover{transform:scale(1.05)}#settingsButton:active{transform:scale(.95)}.fullWidth{width:100%}#menuCardHolder #adBelow{bottom:auto;box-sizing:border-box;display:"inline-block"!important;height:auto!important;left:50%;position:absolute;transform:translateX(-50%)}#menuCardHolder .menu{display:flex}#menuCardHolder .menu *{box-sizing:border-box}#menuCardHolder .menu a{cursor:pointer}#menuCardHolder .menu #nameInput{transform:scale(1);transition:transform .2s cubic-bezier(.77,0,.175,1)}#menuCardHolder .menu #nameInput:focus{transform:scale(1.05)}#menuCardHolder .menu #serverInfo{margin-bottom:8px;text-align:center}#menuCardHolder .menu .joinCard{width:375px}#menuCardHolder .menu .accountCard{width:310px}#menuCardHolder .menu .forumCard{padding:0;width:310px}#linksContainer{bottom:12px;font-size:20px;left:12px;position:absolute;text-align:right}#loadingText{color:#fff;font-size:45px;text-align:center}#loadingText a{display:block}.joinCardInput{width:100%}.joinCardInput #enterGame,.joinCardInput #nameInput{height:44px;margin-bottom:10px;top:50%;width:100%}.joinCardInput #enterGame{background-position:0 0;font-size:48px;height:74px;line-height:50px}@keyframes animatedBackground{0%{background-position:0 0}to{background-position:-10000px 20000px}}.joinCardContent{position:relative;top:50%;transform:translateY(-50%)}.account-badge{-webkit-user-drag:none;height:1.5em;margin-right:4px}#serverBrowser{background-color:#f7faf6;border:none;border-radius:10px;box-sizing:border-box;color:#464646;cursor:pointer;font-size:16px;margin-bottom:10px;padding:6px;text-align:center;width:100%}@media only screen and (max-width:1040px){#menuCardHolder #adBelow,.forumCard{display:none}#menuCardHolder .menu{flex-direction:column}#menuCardHolder .menu .menuCard{width:85vw!important}#menuCardHolder .menu .joinCard{order:-1}}@media only screen and (max-width:768px){#menuCardHolder #adBelow{display:none}#loadingText{margin-top:20px}#mainMenu{overflow:scroll}#gameName{font-size:55px;line-height:2}#gameName-mobile{display:inline!important;display:initial!important}#setupCard{margin-top:4px;width:260px}#topRight1{left:33%}#topRight1,#topRight2{right:inherit;top:8px;transform:translateX(-50%)}#topRight2{left:66%}#linksContainer{display:none}}*,:after,:before{box-sizing:border-box}.shop-modal{background:linear-gradient(to bottom left,#0a3e0a 5%,green);border-radius:10px;box-shadow:0 20px 40px -14px #00000040;color:#fff;display:flex;flex-direction:column;height:calc(100vh - 100px);margin:20px auto;max-width:1000px;padding:20px;width:calc(100vw - 100px)}.skins{align-content:flex-start;display:flex;flex-grow:1;flex-wrap:wrap;justify-content:space-around;overflow-x:hidden;overflow-y:auto}.shop-title{font-size:30px;margin:0}.shop-desc,.shop-title{color:#fff;text-align:center}.shop-desc{font-size:20px;margin:0 0 10px}.gem{transform:translateY(25%)}.skin-card{align-items:center;background-color:#272727;border-radius:10px;box-shadow:0 10px 20px -10px #00000040;display:flex;flex-direction:column;justify-content:space-between;margin:10px;padding:10px;width:200px}.skin-card .skin-name{color:#fff;font-size:25px;font-weight:700;text-align:center}.skin-card .skin-img{background-position:50%;background-size:cover;height:150px;width:150px}.skin-card .skin-count{color:#fff;font-size:20px;font-weight:400;margin-bottom:10px;margin-top:10px;text-align:center}.skin-card .buy-button{background:#0000;border:1px solid #fff3;border-radius:4px;color:#fff;cursor:pointer;display:block;font-size:14px;font-weight:400;margin-top:5px;padding:.8rem;text-transform:uppercase;width:100%}.skin-card .buy-button:hover{background-color:#fff3}@media screen and (max-height:600px){.skin-card{margin:5px}.skin-card .skin-img{height:50px;margin:0;width:50px}.skin-card .skin-name{font-size:20px;margin:0}.skin-card .skin-count{font-size:15px;margin:0}.skin-card .buy-button{font-size:12px;margin:5px 0 0;padding:.2rem}.skin-card .skin-desc{font-size:12px;margin:0}.shop-title{font-size:20px}.shop-desc{font-size:15px}}h1{color:#fff;font-size:24px;font-weight:400;text-align:center}.highlight{background-color:#ff0}.search-bar{display:flex;justify-content:center;margin-bottom:10px}.search-bar input{border:none;border-radius:20px;box-shadow:0 0 15px 4px #0000000f;font-size:15px;padding:5px;width:50%}.search-bar input:focus{box-shadow:0 0 15px 4px #0000001a;outline:none}.search-bar input::placeholder{color:#aaa}.badges{display:flex;justify-content:center;margin-bottom:5px}.badges button{background-color:#ddd;border:none;border-radius:20px;cursor:pointer;margin:0 10px;padding:5px 10px;transition:background-color .3s ease}.badges button.active{background-color:#ff0;border:3px solid #000}.reward-container{flex-wrap:wrap;gap:20px;justify-content:space-around;margin-top:20px}.reward-box,.reward-container{align-items:center;display:flex}.reward-box{border:2px solid #0000;border-radius:10px;flex:0 1 auto;gap:10px;justify-content:start;padding:10px;text-align:left;transition:border-color .3s ease-in-out,transform .3s ease-in-out}.reward-box:hover{border-color:#fff;transform:scale(1.05)}.reward-box .icon{align-items:center;display:flex;justify-content:center}.reward-box .text{font-size:16px;font-weight:700}.gems{background-color:#04390f}.skinsbox{background-color:#b52555}.xp{background-color:#1d9fe1}#logged-in .stats{align-items:center;border-left:1px solid var(--color-border);display:flex;flex-direction:row;gap:1rem;justify-content:center;margin:0 0 0 1rem;padding:.5rem .5rem .5rem 0}#logged-in h1{margin-bottom:0;margin-top:0}#logged-in .profilebutton{align-items:center;background-color:#168f16;border-radius:.5rem;color:#fff;cursor:pointer;display:flex;flex-direction:row;gap:.5rem;justify-content:center;padding:.5rem;transition:transform .3s ease}#logged-in .profilebutton:hover{transform:scale(1.1)}.global-leaderboard-body{--bs-table-bg:#0000;/*! +@import url(https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap);@import url(https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap);#chat{background-color:#f0f8ff;border:2px solid #00000024;font-family:Franklin Gothic Medium,Arial,sans-serif;font-size:max(min(1.5vw,36px),24px);padding:3px 6px}.leaderboard{color:#fff;font-family:Arial,Helvetica,sans-serif;padding:5px;pointer-events:none;position:fixed;right:10px;text-shadow:1px 1px 1px #000;top:10px;transform-origin:top right;-webkit-user-select:none;user-select:none;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.leaderboard .leaderboard-title{font-size:24px;margin-bottom:5px;pointer-events:all;text-align:center}.leaderboard .leaderboard-title:hover{cursor:pointer}.leaderboard .leaderboard-content{opacity:1;transition:all .2s ease-in}.leaderboard .leaderboard-content.hidden{opacity:0}.leaderboard-line{display:block;font-size:22px;white-space:nowrap}.results{animation:fadeIn 1s ease both;left:50%;position:fixed;top:50%;transform:translate(-50%,-50%);-webkit-user-select:none;user-select:none;width:600px}.results .results-main{background-color:#000000b3;border:5px solid #111;border-radius:10px;text-shadow:1px 1px 1px #000}.results .results-title{color:#fff;font-size:45px;font-weight:700;margin-bottom:5px;margin-top:10px;text-align:center}.results .results-title .name{color:#eef6ff;font-size:30px;margin-top:10px}.results .results-container{margin:0 auto 15px;text-align:center}.results .results-container .info{color:#ccc;display:inline-block;font-size:13px;margin:15px;text-align:center}.results .results-container .info .title{color:#f5f5f5;font-size:22px;margin-bottom:5px}.results .results-buttons{align-items:center;display:flex;flex-direction:column;justify-content:center;padding:15px}.results .results-buttons .play-again img{height:150px;transition:.2s;width:150px}.results .results-buttons .play-again img:hover{scale:1.1}.results .results-buttons .to-home{margin-bottom:5px}.results .results-buttons .to-home img{height:60px;transition:.2s;width:auto}.results .results-buttons .to-home img:hover{scale:1.1}.game{cursor:url(../../static/media/cursor.138cb2f1fcf8183aaa1b.cur) 20 20,crosshair;height:100%;overflow:hidden;width:100%}.game,.modal{position:absolute}.modal{background-color:#141414!important;border-radius:10px;box-shadow:0 0 0 5px #2f2f2ffa;color:#e7e7e7;left:50%;min-width:300px;padding:15px 30px;top:50%;transform:translate(-50%,-50%);z-index:5}.modal .modal-close{align-items:center;-webkit-appearance:none;appearance:none;background-color:#000;border:2px solid #fff;border-radius:30px;cursor:pointer;display:flex;height:30px;justify-content:center;line-height:normal;position:absolute;right:0;top:0;transform:rotate(0deg);transition:all .2s linear;width:30px}.modal .modal-close:after,.modal .modal-close:before{background-color:#fff;content:" ";display:block;height:2px;margin:0 auto;position:absolute;transform:rotate(45deg);width:20px}.modal .modal-close:after{transform:rotate(-45deg)}.modal .modal-close:hover{transform:rotate(180deg)}.settings .settings-title{font-size:24px;letter-spacing:2px;margin:0 0 20px}.settings label{display:block;margin-bottom:10px}.settings .settings-line{display:flex;flex-direction:row;justify-content:space-between}.settings input,.settings select{font-size:18px;margin:0 0 10px;width:100%}.switch{display:inline-block;height:21px;position:relative;width:50px}.switch input{height:0;opacity:0;width:0}.switch .slider{background-color:#ccc;bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0;transition:.4s}.switch .slider:before{background-color:#fff;bottom:3px;content:"";height:15px;left:6px;position:absolute;transition:.4s;width:15px}.switch input:checked+.slider{background-color:#2196f3}.switch input:checked+.slider:before{transform:translateX(26px)}.switch input:focus+.slider{box-shadow:0 0 1px #2196f3}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}.loading-screen{align-items:center;background-color:#333;display:flex;height:100%;justify-content:center;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);transition:all .5s ease-in-out;width:100%;z-index:2}.loading-screen .loading-container{text-align:center;width:400px}.loading-screen .loading-container .loading-text{color:#fff;font-size:45px;margin-bottom:10px}.loading-screen .loading-container .progress-bar{background-color:#eee;height:20px;width:100%}.loading-screen .loading-container .progress-bar .progress{background-color:lime;height:100%;transition:width .5s ease-in-out}.changelog{text-align:center}.changelog h1{font-size:32px;margin-top:20px}.changelog h2{font-size:28px}.changelog h1,.changelog h2{color:#fff;font-family:courier new,courier;margin:0 0 20px}.changelog li,.changelog ul{color:#fff;line-height:normal;margin:0;padding:0}.changelog li{font-size:22px;font-weight:700;list-style:none}.changelog .primary-link{color:lime;display:inline-block;font-size:120%;font-weight:700;margin:20px auto}.login-modal{align-items:center;display:flex;flex-direction:column}.login-modal input{font-size:20px;font-weight:700;margin:5px}.login-modal button{background-color:#4caf50;border:none;border-radius:10px;color:#fff;font-size:22px;margin-top:10px;padding:5px;transition:all .2s ease-in;width:120px}.login-modal button:hover{background-color:#fff;color:#4caf50;cursor:pointer}.signup-modal{align-items:center;display:flex;flex-direction:column}.signup-modal input{font-size:20px;font-weight:700;margin:5px}.signup-modal button{background-color:#4caf50;border:none;border-radius:10px;color:#fff;font-size:22px;margin-top:10px;padding:5px;transition:all .2s ease-in;width:120px}.signup-modal button:hover{background-color:#fff;color:#4caf50;cursor:pointer}.connectionErrorModal{align-items:center;animation:fadeIn 1s ease both;background:none;display:flex;height:100%;justify-content:center;width:100%;z-index:3}.connectionErrorModal .content{border-radius:10px;font-family:Poppins,sans-serif;padding:2rem 3rem 1rem;width:400px}.connectionErrorModal .content h2{font-size:2rem;font-weight:600}.connectionErrorModal .content p{font-size:1rem;line-height:1rem;padding:.5rem 0}.connectionErrorModal .content button{margin:5px}.connectionErrorModal .reload-btn{background:green;border:1px solid #000;border-radius:10px;color:#000;cursor:pointer;font-size:1rem;font-weight:600;padding:.5rem 1rem;transition:all .3s ease}.connectionErrorModal .reload-btn:hover{background:#000;color:#fff}@keyframes fadeIn{0%{-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0);opacity:0}to{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);opacity:1}}.panel{background-color:#222!important;border-radius:10px;box-shadow:0 0 0 3px #333333fa;box-sizing:border-box;color:#e7e7e7;margin:8px;padding:15px}.shop-btn{cursor:pointer;left:0;position:absolute;top:0;transform-origin:left}.shop-btn img{display:inline-block;height:auto;margin-left:10px;margin-top:10px;transition:transform .3s ease}.shop-btn img:hover{transform:scale(1.1)}footer{bottom:10px;box-sizing:border-box;color:#e7e7e7;display:flex;flex-direction:row;gap:30px;height:50px;justify-content:center;padding-top:15px;pointer-events:none;position:absolute;text-align:center;width:100%}footer a{font-size:30px;pointer-events:auto;text-decoration:underline}.auth-buttons{display:flex;flex-direction:column;position:absolute;right:5px;top:5px;transform-origin:top right}.auth-buttons .dropdown .dropdown-menu{background-color:#f9f9f9;border-radius:10px;display:none;padding:12px 16px;right:10px;-webkit-user-select:none;user-select:none}.auth-buttons .dropdown .dropdown-menu li{list-style:none}.auth-buttons .dropdown .dropdown-menu .dropdown-item{color:green;font-size:18px}.auth-buttons .dropdown .dropdown-menu .dropdown-item:active{background-color:#0000;color:inherit}.auth-buttons .dropdown:hover .dropdown-menu{display:block}.auth-buttons .auth-username{color:#fff;cursor:pointer;font-size:40px;margin-right:40px;margin-top:20px}.auth-buttons .auth-btn{height:70px;margin-bottom:10px;margin-right:5px;transition:all .2s ease-in-out}.auth-buttons .auth-btn:hover{cursor:pointer;transform:scale(1.05)}::-webkit-resizer,::-webkit-scrollbar,::-webkit-scrollbar-button,::-webkit-scrollbar-corner,::-webkit-scrollbar-thumb,::-webkit-scrollbar-track,::-webkit-scrollbar-track-piece{background:#0000}::-webkit-scrollbar{border-radius:5px;width:7px}::-webkit-scrollbar-track-piece{border-radius:5px}::-webkit-scrollbar-thumb{background:#9e9e9e;border-radius:5px}::-webkit-scrollbar-thumb:hover{background:#858585}::-webkit-scrollbar-button{height:0;width:0}.connectionErrorModal{z-index:100}input[type=email],input[type=password],input[type=text]{-webkit-touch-callout:text;background-color:#e5e3e3;border:none;border-radius:10px;box-sizing:border-box;color:#4a4a4a;font-size:26px;outline:none;padding:6px;text-align:center;-webkit-user-select:text;user-select:text}input[type=email][disabled],input[type=password][disabled],input[type=text][disabled]{cursor:not-allowed;opacity:.7}.login-modal input,.signup-modal input{font-size:20px}a{color:#6eef95;text-decoration:none}a:hover{color:#29e763}a:active{color:#16c74c}.altLink{color:#6eef95;font-size:24px;text-decoration:none}.altLink:hover{color:#40ea73}.altLink:active{color:#19de54}.inline{display:inline-block}span{font-size:inherit}.material-icons{vertical-align:sub}.ui-icon{font-size:30px;vertical-align:middle}.mainMenu{background-color:#2c7616;height:100%;position:absolute;width:100%;z-index:10}.mainMenu.loaded{background-color:rgba(0,0,0,.507);display:block}#menuContainer{pointer-events:auto;position:absolute;text-align:center;top:45%;white-space:nowrap}#contentt,#menuContainer{transform:translateY(-50%);width:100%}#contentt{height:100%;pointer-events:none}.menuCard{word-wrap:break-word;overflow:hidden;padding:18px;text-align:left;white-space:normal}.menuHeader{color:#dadada;font-size:24px;margin-bottom:5px}.menuSubheader{color:#dadada;font-size:20px;margin-bottom:3px}.menuText{color:#a8a8a8;font-size:18px;margin-bottom:10px}.menuLink{font-size:20px}#gameName{color:#fff;font-size:110px;text-shadow:#474747 3px 5px 2px}.menuButton{background-color:#168f16;border-radius:10px;box-shadow:inset 0 -8px 0 rgba(0,0,0,.294);box-sizing:border-box;color:#fff;cursor:pointer;font-size:23px;padding:6px;text-align:center;transform:scale(1);transition:transform .2s cubic-bezier(.77,0,.175,1);width:100%}.menuButton:hover{transform:scale(1.05)}.menuButton:active{transform:scale(.95)}#topRight1{color:#fff;font-size:24px;text-decoration:none;top:20px}#topRight1,#topRight2{position:absolute;right:20px}#topRight2{cursor:pointer;top:54px}#settingsButton{bottom:12px;cursor:pointer;font-size:35px;left:12px;line-height:20px;position:absolute;transition:transform .1s cubic-bezier(.77,0,.175,1)}#settingsButton:hover{transform:scale(1.05)}#settingsButton:active{transform:scale(.95)}.fullWidth{width:100%}#menuCardHolder #adBelow{bottom:auto;box-sizing:border-box;display:"inline-block"!important;height:auto!important;left:50%;position:absolute;transform:translateX(-50%)}#menuCardHolder .menu{display:flex}#menuCardHolder .menu *{box-sizing:border-box}#menuCardHolder .menu a{cursor:pointer}#menuCardHolder .menu #nameInput{transform:scale(1);transition:transform .2s cubic-bezier(.77,0,.175,1)}#menuCardHolder .menu #nameInput:focus{transform:scale(1.05)}#menuCardHolder .menu #serverInfo{margin-bottom:8px;text-align:center}#menuCardHolder .menu .joinCard{width:375px}#menuCardHolder .menu .accountCard{width:310px}#menuCardHolder .menu .forumCard{padding:0;width:310px}#linksContainer{bottom:12px;font-size:20px;left:12px;position:absolute;text-align:right}#loadingText{color:#fff;font-size:45px;text-align:center}#loadingText a{display:block}.joinCardInput{width:100%}.joinCardInput #enterGame,.joinCardInput #nameInput{height:44px;margin-bottom:10px;top:50%;width:100%}.joinCardInput #enterGame{background-position:0 0;font-size:48px;height:74px;line-height:50px}@keyframes animatedBackground{0%{background-position:0 0}to{background-position:-10000px 20000px}}.joinCardContent{position:relative;top:50%;transform:translateY(-50%)}.account-badge{-webkit-user-drag:none;height:1.5em;margin-right:4px}#serverBrowser{background-color:#f7faf6;border:none;border-radius:10px;box-sizing:border-box;color:#464646;cursor:pointer;font-size:16px;margin-bottom:10px;padding:6px;text-align:center;width:100%}@media only screen and (max-width:1040px){#menuCardHolder #adBelow,.forumCard{display:none}#menuCardHolder .menu{flex-direction:column}#menuCardHolder .menu .menuCard{width:85vw!important}#menuCardHolder .menu .joinCard{order:-1}}@media only screen and (max-width:768px){#menuCardHolder #adBelow{display:none}#loadingText{margin-top:20px}#mainMenu{overflow:scroll}#gameName{font-size:55px;line-height:2}#gameName-mobile{display:inline!important;display:initial!important}#setupCard{margin-top:4px;width:260px}#topRight1{left:33%}#topRight1,#topRight2{right:inherit;top:8px;transform:translateX(-50%)}#topRight2{left:66%}#linksContainer{display:none}}*,:after,:before{box-sizing:border-box}.shop-modal{background:linear-gradient(to bottom left,#0a3e0a 5%,green);border-radius:10px;box-shadow:0 20px 40px -14px #00000040;color:#fff;display:flex;flex-direction:column;height:calc(100vh - 100px);margin:20px auto;max-width:1000px;padding:20px;width:calc(100vw - 100px)}.skins{align-content:flex-start;display:flex;flex-grow:1;flex-wrap:wrap;justify-content:space-around;overflow-x:hidden;overflow-y:auto}.shop-title{font-size:30px;margin:0}.shop-desc,.shop-title{color:#fff;text-align:center}.shop-desc{font-size:20px;margin:0 0 10px}.gem{transform:translateY(25%)}.skin-card{align-items:center;background-color:#272727;border-radius:10px;box-shadow:0 10px 20px -10px #00000040;display:flex;flex-direction:column;justify-content:space-between;margin:10px;padding:10px;width:200px}.skin-card .skin-name{color:#fff;font-size:25px;font-weight:700;text-align:center}.skin-card .skin-img{background-position:50%;background-size:cover;height:150px;width:150px}.skin-card .skin-count{color:#fff;font-size:20px;font-weight:400;margin-bottom:10px;margin-top:10px;text-align:center}.skin-card .buy-button{background:#0000;border:1px solid #fff3;border-radius:4px;color:#fff;cursor:pointer;display:block;font-size:14px;font-weight:400;margin-top:5px;padding:.8rem;text-transform:uppercase;width:100%}.skin-card .buy-button:hover{background-color:#fff3}@media screen and (max-height:600px){.skin-card{margin:5px}.skin-card .skin-img{height:50px;margin:0;width:50px}.skin-card .skin-name{font-size:20px;margin:0}.skin-card .skin-count{font-size:15px;margin:0}.skin-card .buy-button{font-size:12px;margin:5px 0 0;padding:.2rem}.skin-card .skin-desc{font-size:12px;margin:0}.shop-title{font-size:20px}.shop-desc{font-size:15px}}h1{color:#fff;font-size:24px;font-weight:400;text-align:center}.highlight{background-color:#ff0}.search-bar{display:flex;justify-content:center;margin-bottom:10px}.search-bar input{border:none;border-radius:20px;box-shadow:0 0 15px 4px #0000000f;font-size:15px;padding:5px;width:50%}.search-bar input:focus{box-shadow:0 0 15px 4px #0000001a;outline:none}.search-bar input::placeholder{color:#aaa}.badges{display:flex;justify-content:center;margin-bottom:5px}.badges button{background-color:#ddd;border:none;border-radius:20px;cursor:pointer;margin:0 10px;padding:5px 10px;transition:background-color .3s ease}.badges button.active{background-color:#ff0;border:3px solid #000}.reward-container{flex-wrap:wrap;gap:20px;justify-content:space-around;margin-top:20px}.reward-box,.reward-container{align-items:center;display:flex}.reward-box{border:2px solid #0000;border-radius:10px;flex:0 1 auto;gap:10px;justify-content:start;padding:10px;text-align:left;transition:border-color .3s ease-in-out,transform .3s ease-in-out}.reward-box:hover{border-color:#fff;transform:scale(1.05)}.reward-box .icon{align-items:center;display:flex;justify-content:center}.reward-box .text{font-size:16px;font-weight:700}.gems{background-color:#04390f}.skinsbox{background-color:#b52555}.xp{background-color:#1d9fe1}#logged-in .stats{align-items:center;border-left:1px solid var(--color-border);display:flex;flex-direction:row;gap:1rem;justify-content:center;margin:0 0 0 1rem;padding:.5rem .5rem .5rem 0}#logged-in h1{margin-bottom:0;margin-top:0}#logged-in .profilebutton{align-items:center;background-color:#168f16;border-radius:.5rem;color:#fff;cursor:pointer;display:flex;flex-direction:row;gap:.5rem;justify-content:center;padding:.5rem;transition:transform .3s ease}#logged-in .profilebutton:hover{transform:scale(1.1)}.global-leaderboard-body{--bs-table-bg:#0000;/*! * Bootstrap v5.3.2 (https://getbootstrap.com/) * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) @@ -7,4 +7,4 @@ * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */font-family:Roboto,sans-serif;overflow-y:auto}.profile-body :root,.profile-body [data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg,#ffffff26,#fff0);--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:#212529bf;--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:#21252980;--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0,0,0,.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem #00000026;--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0,0,0,.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0,0,0,.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0,0,0,.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:#0d6efd40;--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}.profile-body [data-bs-theme=dark]{--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:#dee2e6bf;--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:#dee2e680;--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:#ffffff26;--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f;color-scheme:dark}.profile-body *,.profile-body :after,.profile-body :before{box-sizing:border-box}@media(prefers-reduced-motion:no-preference){.profile-body :root{scroll-behavior:smooth}}.profile-body body{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);background-color:var(--bs-body-bg);color:var(--bs-body-color);font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);margin:0;text-align:var(--bs-body-text-align)}.profile-body hr{border:0;border-top:var(--bs-border-width) solid;color:inherit;margin:1rem 0;opacity:.25}.profile-body .h1,.profile-body .h2,.profile-body .h3,.profile-body .h4,.profile-body .h5,.profile-body .h6,.profile-body h1,.profile-body h2,.profile-body h3,.profile-body h4,.profile-body h5,.profile-body h6{color:var(--bs-heading-color);font-weight:500;line-height:1.2;margin-bottom:.5rem;margin-top:0}.profile-body .h1,.profile-body h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width:1200px){.profile-body .h1,.profile-body h1{font-size:2.5rem}}.profile-body .h2,.profile-body h2{font-size:calc(1.325rem + .9vw)}@media(min-width:1200px){.profile-body .h2,.profile-body h2{font-size:2rem}}.profile-body .h3,.profile-body h3{font-size:calc(1.3rem + .6vw)}@media(min-width:1200px){.profile-body .h3,.profile-body h3{font-size:1.75rem}}.profile-body .h4,.profile-body h4{font-size:calc(1.275rem + .3vw)}@media(min-width:1200px){.profile-body .h4,.profile-body h4{font-size:1.5rem}}.profile-body .h5,.profile-body h5{font-size:1.25rem}.profile-body .h6,.profile-body h6{font-size:1rem}.profile-body p{margin-bottom:1rem;margin-top:0}.profile-body abbr[title]{cursor:help;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}.profile-body address{font-style:normal;line-height:inherit;margin-bottom:1rem}.profile-body ol,.profile-body ul{padding-left:2rem}.profile-body dl,.profile-body ol,.profile-body ul{margin-bottom:1rem;margin-top:0}.profile-body ol ol,.profile-body ol ul,.profile-body ul ol,.profile-body ul ul{margin-bottom:0}.profile-body dt{font-weight:700}.profile-body dd{margin-bottom:.5rem;margin-left:0}.profile-body blockquote{margin:0 0 1rem}.profile-body b,.profile-body strong{font-weight:bolder}.profile-body .small,.profile-body small{font-size:.875em}.profile-body .mark,.profile-body mark{background-color:var(--bs-highlight-bg);color:var(--bs-highlight-color);padding:.1875em}.profile-body sub,.profile-body sup{font-size:.75em;line-height:0;position:relative;vertical-align:initial}.profile-body sub{bottom:-.25em}.profile-body sup{top:-.5em}.profile-body a{color:rgba(var(--bs-link-color-rgb),1);color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}.profile-body a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}.profile-body a:not([href]):not([class]),.profile-body a:not([href]):not([class]):hover{color:inherit;text-decoration:none}.profile-body code,.profile-body kbd,.profile-body pre,.profile-body samp{font-family:var(--bs-font-monospace);font-size:1em}.profile-body pre{display:block;font-size:.875em;margin-bottom:1rem;margin-top:0;overflow:auto}.profile-body pre code{color:inherit;font-size:inherit;word-break:normal}.profile-body code{word-wrap:break-word;color:var(--bs-code-color);font-size:.875em}a>.profile-body code{color:inherit}.profile-body kbd{background-color:var(--bs-body-color);border-radius:.25rem;color:var(--bs-body-bg);font-size:.875em;padding:.1875rem .375rem}.profile-body kbd kbd{font-size:1em;padding:0}.profile-body figure{margin:0 0 1rem}.profile-body img,.profile-body svg{vertical-align:middle}.profile-body table{border-collapse:collapse;caption-side:bottom}.profile-body caption{color:var(--bs-secondary-color);padding-bottom:.5rem;padding-top:.5rem;text-align:left}.profile-body th{text-align:inherit;text-align:-webkit-match-parent}.profile-body tbody,.profile-body td,.profile-body tfoot,.profile-body th,.profile-body thead,.profile-body tr{border:0 solid;border-color:inherit}.profile-body label{display:inline-block}.profile-body button{border-radius:0}.profile-body button:focus:not(:focus-visible){outline:0}.profile-body button,.profile-body input,.profile-body optgroup,.profile-body select,.profile-body textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}.profile-body button,.profile-body select{text-transform:none}.profile-body [role=button]{cursor:pointer}.profile-body select{word-wrap:normal}.profile-body select:disabled{opacity:1}.profile-body [list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}.profile-body [type=button],.profile-body [type=reset],.profile-body [type=submit],.profile-body button{-webkit-appearance:button}.profile-body [type=button]:not(:disabled),.profile-body [type=reset]:not(:disabled),.profile-body [type=submit]:not(:disabled),.profile-body button:not(:disabled){cursor:pointer}.profile-body ::-moz-focus-inner{border-style:none;padding:0}.profile-body textarea{resize:vertical}.profile-body fieldset{border:0;margin:0;min-width:0;padding:0}.profile-body legend{float:left;font-size:calc(1.275rem + .3vw);line-height:inherit;margin-bottom:.5rem;padding:0;width:100%}@media(min-width:1200px){.profile-body legend{font-size:1.5rem}}.profile-body legend+*{clear:left}.profile-body ::-webkit-datetime-edit-day-field,.profile-body ::-webkit-datetime-edit-fields-wrapper,.profile-body ::-webkit-datetime-edit-hour-field,.profile-body ::-webkit-datetime-edit-minute,.profile-body ::-webkit-datetime-edit-month-field,.profile-body ::-webkit-datetime-edit-text,.profile-body ::-webkit-datetime-edit-year-field{padding:0}.profile-body ::-webkit-inner-spin-button{height:auto}.profile-body [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.profile-body ::-webkit-search-decoration{-webkit-appearance:none}.profile-body ::-webkit-color-swatch-wrapper{padding:0}.profile-body ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.profile-body ::file-selector-button{-webkit-appearance:button;font:inherit}.profile-body output{display:inline-block}.profile-body iframe{border:0}.profile-body summary{cursor:pointer;display:list-item}.profile-body progress{vertical-align:initial}.profile-body [hidden]{display:none!important}.profile-body .lead{font-size:1.25rem;font-weight:300}.profile-body .display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.profile-body .display-1{font-size:5rem}}.profile-body .display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.profile-body .display-2{font-size:4.5rem}}.profile-body .display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.profile-body .display-3{font-size:4rem}}.profile-body .display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.profile-body .display-4{font-size:3.5rem}}.profile-body .display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.profile-body .display-5{font-size:3rem}}.profile-body .display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.profile-body .display-6{font-size:2.5rem}}.profile-body .list-inline,.profile-body .list-unstyled{list-style:none;padding-left:0}.profile-body .list-inline-item{display:inline-block}.profile-body .list-inline-item:not(:last-child){margin-right:.5rem}.profile-body .initialism{font-size:.875em;text-transform:uppercase}.profile-body .blockquote{font-size:1.25rem;margin-bottom:1rem}.profile-body .blockquote>:last-child{margin-bottom:0}.profile-body .blockquote-footer{color:#6c757d;font-size:.875em;margin-bottom:1rem;margin-top:-1rem}.profile-body .blockquote-footer:before{content:"— "}.profile-body .img-fluid{height:auto;max-width:100%}.profile-body .img-thumbnail{background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);height:auto;max-width:100%;padding:.25rem}.profile-body .figure{display:inline-block}.profile-body .figure-img{line-height:1;margin-bottom:.5rem}.profile-body .figure-caption{color:var(--bs-secondary-color);font-size:.875em}.profile-body .container,.profile-body .container-fluid,.profile-body .container-lg,.profile-body .container-md,.profile-body .container-sm,.profile-body .container-xl,.profile-body .container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;margin-left:auto;margin-right:auto;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}@media(min-width:576px){.profile-body .container,.profile-body .container-sm{max-width:540px}}@media(min-width:768px){.profile-body .container,.profile-body .container-md,.profile-body .container-sm{max-width:720px}}@media(min-width:992px){.profile-body .container,.profile-body .container-lg,.profile-body .container-md,.profile-body .container-sm{max-width:960px}}@media(min-width:1200px){.profile-body .container,.profile-body .container-lg,.profile-body .container-md,.profile-body .container-sm,.profile-body .container-xl{max-width:1140px}}@media(min-width:1400px){.profile-body .container,.profile-body .container-lg,.profile-body .container-md,.profile-body .container-sm,.profile-body .container-xl,.profile-body .container-xxl{max-width:1320px}}.profile-body :root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.profile-body .row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-left:calc(var(--bs-gutter-x)*-.5);margin-right:calc(var(--bs-gutter-x)*-.5);margin-top:calc(var(--bs-gutter-y)*-1)}.profile-body .row>*{flex-shrink:0;margin-top:var(--bs-gutter-y);max-width:100%;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}.profile-body .col{flex:1 0}.profile-body .row-cols-auto>*{flex:0 0 auto;width:auto}.profile-body .row-cols-1>*{flex:0 0 auto;width:100%}.profile-body .row-cols-2>*{flex:0 0 auto;width:50%}.profile-body .row-cols-3>*{flex:0 0 auto;width:33.33333333%}.profile-body .row-cols-4>*{flex:0 0 auto;width:25%}.profile-body .row-cols-5>*{flex:0 0 auto;width:20%}.profile-body .row-cols-6>*{flex:0 0 auto;width:16.66666667%}.profile-body .col-auto{flex:0 0 auto;width:auto}.profile-body .col-1{flex:0 0 auto;width:8.33333333%}.profile-body .col-2{flex:0 0 auto;width:16.66666667%}.profile-body .col-3{flex:0 0 auto;width:25%}.profile-body .col-4{flex:0 0 auto;width:33.33333333%}.profile-body .col-5{flex:0 0 auto;width:41.66666667%}.profile-body .col-6{flex:0 0 auto;width:50%}.profile-body .col-7{flex:0 0 auto;width:58.33333333%}.profile-body .col-8{flex:0 0 auto;width:66.66666667%}.profile-body .col-9{flex:0 0 auto;width:75%}.profile-body .col-10{flex:0 0 auto;width:83.33333333%}.profile-body .col-11{flex:0 0 auto;width:91.66666667%}.profile-body .col-12{flex:0 0 auto;width:100%}.profile-body .offset-1{margin-left:8.33333333%}.profile-body .offset-2{margin-left:16.66666667%}.profile-body .offset-3{margin-left:25%}.profile-body .offset-4{margin-left:33.33333333%}.profile-body .offset-5{margin-left:41.66666667%}.profile-body .offset-6{margin-left:50%}.profile-body .offset-7{margin-left:58.33333333%}.profile-body .offset-8{margin-left:66.66666667%}.profile-body .offset-9{margin-left:75%}.profile-body .offset-10{margin-left:83.33333333%}.profile-body .offset-11{margin-left:91.66666667%}.profile-body .g-0,.profile-body .gx-0{--bs-gutter-x:0}.profile-body .g-0,.profile-body .gy-0{--bs-gutter-y:0}.profile-body .g-1,.profile-body .gx-1{--bs-gutter-x:0.25rem}.profile-body .g-1,.profile-body .gy-1{--bs-gutter-y:0.25rem}.profile-body .g-2,.profile-body .gx-2{--bs-gutter-x:0.5rem}.profile-body .g-2,.profile-body .gy-2{--bs-gutter-y:0.5rem}.profile-body .g-3,.profile-body .gx-3{--bs-gutter-x:1rem}.profile-body .g-3,.profile-body .gy-3{--bs-gutter-y:1rem}.profile-body .g-4,.profile-body .gx-4{--bs-gutter-x:1.5rem}.profile-body .g-4,.profile-body .gy-4{--bs-gutter-y:1.5rem}.profile-body .g-5,.profile-body .gx-5{--bs-gutter-x:3rem}.profile-body .g-5,.profile-body .gy-5{--bs-gutter-y:3rem}@media(min-width:576px){.profile-body .col-sm{flex:1 0}.profile-body .row-cols-sm-auto>*{flex:0 0 auto;width:auto}.profile-body .row-cols-sm-1>*{flex:0 0 auto;width:100%}.profile-body .row-cols-sm-2>*{flex:0 0 auto;width:50%}.profile-body .row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.profile-body .row-cols-sm-4>*{flex:0 0 auto;width:25%}.profile-body .row-cols-sm-5>*{flex:0 0 auto;width:20%}.profile-body .row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.profile-body .col-sm-auto{flex:0 0 auto;width:auto}.profile-body .col-sm-1{flex:0 0 auto;width:8.33333333%}.profile-body .col-sm-2{flex:0 0 auto;width:16.66666667%}.profile-body .col-sm-3{flex:0 0 auto;width:25%}.profile-body .col-sm-4{flex:0 0 auto;width:33.33333333%}.profile-body .col-sm-5{flex:0 0 auto;width:41.66666667%}.profile-body .col-sm-6{flex:0 0 auto;width:50%}.profile-body .col-sm-7{flex:0 0 auto;width:58.33333333%}.profile-body .col-sm-8{flex:0 0 auto;width:66.66666667%}.profile-body .col-sm-9{flex:0 0 auto;width:75%}.profile-body .col-sm-10{flex:0 0 auto;width:83.33333333%}.profile-body .col-sm-11{flex:0 0 auto;width:91.66666667%}.profile-body .col-sm-12{flex:0 0 auto;width:100%}.profile-body .offset-sm-0{margin-left:0}.profile-body .offset-sm-1{margin-left:8.33333333%}.profile-body .offset-sm-2{margin-left:16.66666667%}.profile-body .offset-sm-3{margin-left:25%}.profile-body .offset-sm-4{margin-left:33.33333333%}.profile-body .offset-sm-5{margin-left:41.66666667%}.profile-body .offset-sm-6{margin-left:50%}.profile-body .offset-sm-7{margin-left:58.33333333%}.profile-body .offset-sm-8{margin-left:66.66666667%}.profile-body .offset-sm-9{margin-left:75%}.profile-body .offset-sm-10{margin-left:83.33333333%}.profile-body .offset-sm-11{margin-left:91.66666667%}.profile-body .g-sm-0,.profile-body .gx-sm-0{--bs-gutter-x:0}.profile-body .g-sm-0,.profile-body .gy-sm-0{--bs-gutter-y:0}.profile-body .g-sm-1,.profile-body .gx-sm-1{--bs-gutter-x:0.25rem}.profile-body .g-sm-1,.profile-body .gy-sm-1{--bs-gutter-y:0.25rem}.profile-body .g-sm-2,.profile-body .gx-sm-2{--bs-gutter-x:0.5rem}.profile-body .g-sm-2,.profile-body .gy-sm-2{--bs-gutter-y:0.5rem}.profile-body .g-sm-3,.profile-body .gx-sm-3{--bs-gutter-x:1rem}.profile-body .g-sm-3,.profile-body .gy-sm-3{--bs-gutter-y:1rem}.profile-body .g-sm-4,.profile-body .gx-sm-4{--bs-gutter-x:1.5rem}.profile-body .g-sm-4,.profile-body .gy-sm-4{--bs-gutter-y:1.5rem}.profile-body .g-sm-5,.profile-body .gx-sm-5{--bs-gutter-x:3rem}.profile-body .g-sm-5,.profile-body .gy-sm-5{--bs-gutter-y:3rem}}@media(min-width:768px){.profile-body .col-md{flex:1 0}.profile-body .row-cols-md-auto>*{flex:0 0 auto;width:auto}.profile-body .row-cols-md-1>*{flex:0 0 auto;width:100%}.profile-body .row-cols-md-2>*{flex:0 0 auto;width:50%}.profile-body .row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.profile-body .row-cols-md-4>*{flex:0 0 auto;width:25%}.profile-body .row-cols-md-5>*{flex:0 0 auto;width:20%}.profile-body .row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.profile-body .col-md-auto{flex:0 0 auto;width:auto}.profile-body .col-md-1{flex:0 0 auto;width:8.33333333%}.profile-body .col-md-2{flex:0 0 auto;width:16.66666667%}.profile-body .col-md-3{flex:0 0 auto;width:25%}.profile-body .col-md-4{flex:0 0 auto;width:33.33333333%}.profile-body .col-md-5{flex:0 0 auto;width:41.66666667%}.profile-body .col-md-6{flex:0 0 auto;width:50%}.profile-body .col-md-7{flex:0 0 auto;width:58.33333333%}.profile-body .col-md-8{flex:0 0 auto;width:66.66666667%}.profile-body .col-md-9{flex:0 0 auto;width:75%}.profile-body .col-md-10{flex:0 0 auto;width:83.33333333%}.profile-body .col-md-11{flex:0 0 auto;width:91.66666667%}.profile-body .col-md-12{flex:0 0 auto;width:100%}.profile-body .offset-md-0{margin-left:0}.profile-body .offset-md-1{margin-left:8.33333333%}.profile-body .offset-md-2{margin-left:16.66666667%}.profile-body .offset-md-3{margin-left:25%}.profile-body .offset-md-4{margin-left:33.33333333%}.profile-body .offset-md-5{margin-left:41.66666667%}.profile-body .offset-md-6{margin-left:50%}.profile-body .offset-md-7{margin-left:58.33333333%}.profile-body .offset-md-8{margin-left:66.66666667%}.profile-body .offset-md-9{margin-left:75%}.profile-body .offset-md-10{margin-left:83.33333333%}.profile-body .offset-md-11{margin-left:91.66666667%}.profile-body .g-md-0,.profile-body .gx-md-0{--bs-gutter-x:0}.profile-body .g-md-0,.profile-body .gy-md-0{--bs-gutter-y:0}.profile-body .g-md-1,.profile-body .gx-md-1{--bs-gutter-x:0.25rem}.profile-body .g-md-1,.profile-body .gy-md-1{--bs-gutter-y:0.25rem}.profile-body .g-md-2,.profile-body .gx-md-2{--bs-gutter-x:0.5rem}.profile-body .g-md-2,.profile-body .gy-md-2{--bs-gutter-y:0.5rem}.profile-body .g-md-3,.profile-body .gx-md-3{--bs-gutter-x:1rem}.profile-body .g-md-3,.profile-body .gy-md-3{--bs-gutter-y:1rem}.profile-body .g-md-4,.profile-body .gx-md-4{--bs-gutter-x:1.5rem}.profile-body .g-md-4,.profile-body .gy-md-4{--bs-gutter-y:1.5rem}.profile-body .g-md-5,.profile-body .gx-md-5{--bs-gutter-x:3rem}.profile-body .g-md-5,.profile-body .gy-md-5{--bs-gutter-y:3rem}}@media(min-width:992px){.profile-body .col-lg{flex:1 0}.profile-body .row-cols-lg-auto>*{flex:0 0 auto;width:auto}.profile-body .row-cols-lg-1>*{flex:0 0 auto;width:100%}.profile-body .row-cols-lg-2>*{flex:0 0 auto;width:50%}.profile-body .row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.profile-body .row-cols-lg-4>*{flex:0 0 auto;width:25%}.profile-body .row-cols-lg-5>*{flex:0 0 auto;width:20%}.profile-body .row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.profile-body .col-lg-auto{flex:0 0 auto;width:auto}.profile-body .col-lg-1{flex:0 0 auto;width:8.33333333%}.profile-body .col-lg-2{flex:0 0 auto;width:16.66666667%}.profile-body .col-lg-3{flex:0 0 auto;width:25%}.profile-body .col-lg-4{flex:0 0 auto;width:33.33333333%}.profile-body .col-lg-5{flex:0 0 auto;width:41.66666667%}.profile-body .col-lg-6{flex:0 0 auto;width:50%}.profile-body .col-lg-7{flex:0 0 auto;width:58.33333333%}.profile-body .col-lg-8{flex:0 0 auto;width:66.66666667%}.profile-body .col-lg-9{flex:0 0 auto;width:75%}.profile-body .col-lg-10{flex:0 0 auto;width:83.33333333%}.profile-body .col-lg-11{flex:0 0 auto;width:91.66666667%}.profile-body .col-lg-12{flex:0 0 auto;width:100%}.profile-body .offset-lg-0{margin-left:0}.profile-body .offset-lg-1{margin-left:8.33333333%}.profile-body .offset-lg-2{margin-left:16.66666667%}.profile-body .offset-lg-3{margin-left:25%}.profile-body .offset-lg-4{margin-left:33.33333333%}.profile-body .offset-lg-5{margin-left:41.66666667%}.profile-body .offset-lg-6{margin-left:50%}.profile-body .offset-lg-7{margin-left:58.33333333%}.profile-body .offset-lg-8{margin-left:66.66666667%}.profile-body .offset-lg-9{margin-left:75%}.profile-body .offset-lg-10{margin-left:83.33333333%}.profile-body .offset-lg-11{margin-left:91.66666667%}.profile-body .g-lg-0,.profile-body .gx-lg-0{--bs-gutter-x:0}.profile-body .g-lg-0,.profile-body .gy-lg-0{--bs-gutter-y:0}.profile-body .g-lg-1,.profile-body .gx-lg-1{--bs-gutter-x:0.25rem}.profile-body .g-lg-1,.profile-body .gy-lg-1{--bs-gutter-y:0.25rem}.profile-body .g-lg-2,.profile-body .gx-lg-2{--bs-gutter-x:0.5rem}.profile-body .g-lg-2,.profile-body .gy-lg-2{--bs-gutter-y:0.5rem}.profile-body .g-lg-3,.profile-body .gx-lg-3{--bs-gutter-x:1rem}.profile-body .g-lg-3,.profile-body .gy-lg-3{--bs-gutter-y:1rem}.profile-body .g-lg-4,.profile-body .gx-lg-4{--bs-gutter-x:1.5rem}.profile-body .g-lg-4,.profile-body .gy-lg-4{--bs-gutter-y:1.5rem}.profile-body .g-lg-5,.profile-body .gx-lg-5{--bs-gutter-x:3rem}.profile-body .g-lg-5,.profile-body .gy-lg-5{--bs-gutter-y:3rem}}@media(min-width:1200px){.profile-body .col-xl{flex:1 0}.profile-body .row-cols-xl-auto>*{flex:0 0 auto;width:auto}.profile-body .row-cols-xl-1>*{flex:0 0 auto;width:100%}.profile-body .row-cols-xl-2>*{flex:0 0 auto;width:50%}.profile-body .row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.profile-body .row-cols-xl-4>*{flex:0 0 auto;width:25%}.profile-body .row-cols-xl-5>*{flex:0 0 auto;width:20%}.profile-body .row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.profile-body .col-xl-auto{flex:0 0 auto;width:auto}.profile-body .col-xl-1{flex:0 0 auto;width:8.33333333%}.profile-body .col-xl-2{flex:0 0 auto;width:16.66666667%}.profile-body .col-xl-3{flex:0 0 auto;width:25%}.profile-body .col-xl-4{flex:0 0 auto;width:33.33333333%}.profile-body .col-xl-5{flex:0 0 auto;width:41.66666667%}.profile-body .col-xl-6{flex:0 0 auto;width:50%}.profile-body .col-xl-7{flex:0 0 auto;width:58.33333333%}.profile-body .col-xl-8{flex:0 0 auto;width:66.66666667%}.profile-body .col-xl-9{flex:0 0 auto;width:75%}.profile-body .col-xl-10{flex:0 0 auto;width:83.33333333%}.profile-body .col-xl-11{flex:0 0 auto;width:91.66666667%}.profile-body .col-xl-12{flex:0 0 auto;width:100%}.profile-body .offset-xl-0{margin-left:0}.profile-body .offset-xl-1{margin-left:8.33333333%}.profile-body .offset-xl-2{margin-left:16.66666667%}.profile-body .offset-xl-3{margin-left:25%}.profile-body .offset-xl-4{margin-left:33.33333333%}.profile-body .offset-xl-5{margin-left:41.66666667%}.profile-body .offset-xl-6{margin-left:50%}.profile-body .offset-xl-7{margin-left:58.33333333%}.profile-body .offset-xl-8{margin-left:66.66666667%}.profile-body .offset-xl-9{margin-left:75%}.profile-body .offset-xl-10{margin-left:83.33333333%}.profile-body .offset-xl-11{margin-left:91.66666667%}.profile-body .g-xl-0,.profile-body .gx-xl-0{--bs-gutter-x:0}.profile-body .g-xl-0,.profile-body .gy-xl-0{--bs-gutter-y:0}.profile-body .g-xl-1,.profile-body .gx-xl-1{--bs-gutter-x:0.25rem}.profile-body .g-xl-1,.profile-body .gy-xl-1{--bs-gutter-y:0.25rem}.profile-body .g-xl-2,.profile-body .gx-xl-2{--bs-gutter-x:0.5rem}.profile-body .g-xl-2,.profile-body .gy-xl-2{--bs-gutter-y:0.5rem}.profile-body .g-xl-3,.profile-body .gx-xl-3{--bs-gutter-x:1rem}.profile-body .g-xl-3,.profile-body .gy-xl-3{--bs-gutter-y:1rem}.profile-body .g-xl-4,.profile-body .gx-xl-4{--bs-gutter-x:1.5rem}.profile-body .g-xl-4,.profile-body .gy-xl-4{--bs-gutter-y:1.5rem}.profile-body .g-xl-5,.profile-body .gx-xl-5{--bs-gutter-x:3rem}.profile-body .g-xl-5,.profile-body .gy-xl-5{--bs-gutter-y:3rem}}@media(min-width:1400px){.profile-body .col-xxl{flex:1 0}.profile-body .row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.profile-body .row-cols-xxl-1>*{flex:0 0 auto;width:100%}.profile-body .row-cols-xxl-2>*{flex:0 0 auto;width:50%}.profile-body .row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.profile-body .row-cols-xxl-4>*{flex:0 0 auto;width:25%}.profile-body .row-cols-xxl-5>*{flex:0 0 auto;width:20%}.profile-body .row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.profile-body .col-xxl-auto{flex:0 0 auto;width:auto}.profile-body .col-xxl-1{flex:0 0 auto;width:8.33333333%}.profile-body .col-xxl-2{flex:0 0 auto;width:16.66666667%}.profile-body .col-xxl-3{flex:0 0 auto;width:25%}.profile-body .col-xxl-4{flex:0 0 auto;width:33.33333333%}.profile-body .col-xxl-5{flex:0 0 auto;width:41.66666667%}.profile-body .col-xxl-6{flex:0 0 auto;width:50%}.profile-body .col-xxl-7{flex:0 0 auto;width:58.33333333%}.profile-body .col-xxl-8{flex:0 0 auto;width:66.66666667%}.profile-body .col-xxl-9{flex:0 0 auto;width:75%}.profile-body .col-xxl-10{flex:0 0 auto;width:83.33333333%}.profile-body .col-xxl-11{flex:0 0 auto;width:91.66666667%}.profile-body .col-xxl-12{flex:0 0 auto;width:100%}.profile-body .offset-xxl-0{margin-left:0}.profile-body .offset-xxl-1{margin-left:8.33333333%}.profile-body .offset-xxl-2{margin-left:16.66666667%}.profile-body .offset-xxl-3{margin-left:25%}.profile-body .offset-xxl-4{margin-left:33.33333333%}.profile-body .offset-xxl-5{margin-left:41.66666667%}.profile-body .offset-xxl-6{margin-left:50%}.profile-body .offset-xxl-7{margin-left:58.33333333%}.profile-body .offset-xxl-8{margin-left:66.66666667%}.profile-body .offset-xxl-9{margin-left:75%}.profile-body .offset-xxl-10{margin-left:83.33333333%}.profile-body .offset-xxl-11{margin-left:91.66666667%}.profile-body .g-xxl-0,.profile-body .gx-xxl-0{--bs-gutter-x:0}.profile-body .g-xxl-0,.profile-body .gy-xxl-0{--bs-gutter-y:0}.profile-body .g-xxl-1,.profile-body .gx-xxl-1{--bs-gutter-x:0.25rem}.profile-body .g-xxl-1,.profile-body .gy-xxl-1{--bs-gutter-y:0.25rem}.profile-body .g-xxl-2,.profile-body .gx-xxl-2{--bs-gutter-x:0.5rem}.profile-body .g-xxl-2,.profile-body .gy-xxl-2{--bs-gutter-y:0.5rem}.profile-body .g-xxl-3,.profile-body .gx-xxl-3{--bs-gutter-x:1rem}.profile-body .g-xxl-3,.profile-body .gy-xxl-3{--bs-gutter-y:1rem}.profile-body .g-xxl-4,.profile-body .gx-xxl-4{--bs-gutter-x:1.5rem}.profile-body .g-xxl-4,.profile-body .gy-xxl-4{--bs-gutter-y:1.5rem}.profile-body .g-xxl-5,.profile-body .gx-xxl-5{--bs-gutter-x:3rem}.profile-body .g-xxl-5,.profile-body .gy-xxl-5{--bs-gutter-y:3rem}}.profile-body .table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:#0000;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb),0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb),0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb),0.075);border-color:var(--bs-table-border-color);margin-bottom:1rem;vertical-align:top;width:100%}.profile-body .table>:not(caption)>*>*{background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)));color:var(--bs-table-color);color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));padding:.5rem}.profile-body .table>tbody{vertical-align:inherit}.profile-body .table>thead{vertical-align:bottom}.profile-body .table-group-divider{border-top:calc(var(--bs-border-width)*2) solid}.profile-body .caption-top{caption-side:top}.profile-body .table-sm>:not(caption)>*>*{padding:.25rem}.profile-body .table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.profile-body .table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.profile-body .table-borderless>:not(caption)>*>*{border-bottom-width:0}.profile-body .table-borderless>:not(:first-child){border-top-width:0}.profile-body .table-striped-columns>:not(caption)>tr>:nth-child(2n),.profile-body .table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.profile-body .table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.profile-body .table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.profile-body .table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000}.profile-body .table-primary,.profile-body .table-secondary{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.profile-body .table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000}.profile-body .table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000}.profile-body .table-info,.profile-body .table-success{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.profile-body .table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000}.profile-body .table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000}.profile-body .table-danger,.profile-body .table-warning{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.profile-body .table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000}.profile-body .table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000}.profile-body .table-dark,.profile-body .table-light{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.profile-body .table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff}.profile-body .table-responsive{-webkit-overflow-scrolling:touch;overflow-x:auto}@media(max-width:575.98px){.profile-body .table-responsive-sm{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media(max-width:767.98px){.profile-body .table-responsive-md{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media(max-width:991.98px){.profile-body .table-responsive-lg{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media(max-width:1199.98px){.profile-body .table-responsive-xl{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media(max-width:1399.98px){.profile-body .table-responsive-xxl{-webkit-overflow-scrolling:touch;overflow-x:auto}}.profile-body .form-label{margin-bottom:.5rem}.profile-body .col-form-label{font-size:inherit;line-height:1.5;margin-bottom:0;padding-bottom:calc(.375rem + var(--bs-border-width));padding-top:calc(.375rem + var(--bs-border-width))}.profile-body .col-form-label-lg{font-size:1.25rem;padding-bottom:calc(.5rem + var(--bs-border-width));padding-top:calc(.5rem + var(--bs-border-width))}.profile-body .col-form-label-sm{font-size:.875rem;padding-bottom:calc(.25rem + var(--bs-border-width));padding-top:calc(.25rem + var(--bs-border-width))}.profile-body .form-text{color:var(--bs-secondary-color);font-size:.875em;margin-top:.25rem}.profile-body .form-control{-webkit-appearance:none;appearance:none;background-clip:padding-box;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);color:var(--bs-body-color);display:block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.profile-body .form-control{transition:none}}.profile-body .form-control[type=file]{overflow:hidden}.profile-body .form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.profile-body .form-control:focus{background-color:var(--bs-body-bg);border-color:#86b7fe;box-shadow:0 0 0 .25rem #0d6efd40;color:var(--bs-body-color);outline:0}.profile-body .form-control::-webkit-date-and-time-value{height:1.5em;margin:0;min-width:85px}.profile-body .form-control::-webkit-datetime-edit{display:block;padding:0}.profile-body .form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.profile-body .form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.profile-body .form-control::-webkit-file-upload-button{background-color:var(--bs-tertiary-bg);border:0 solid;border-color:inherit;border-inline-end-width:var(--bs-border-width);border-radius:0;color:var(--bs-body-color);margin:-.375rem -.75rem;margin-inline-end:.75rem;padding:.375rem .75rem;pointer-events:none;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.profile-body .form-control::file-selector-button{background-color:var(--bs-tertiary-bg);border:0 solid;border-color:inherit;border-inline-end-width:var(--bs-border-width);border-radius:0;color:var(--bs-body-color);margin:-.375rem -.75rem;margin-inline-end:.75rem;padding:.375rem .75rem;pointer-events:none;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(prefers-reduced-motion:reduce){.profile-body .form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.profile-body .form-control::file-selector-button{transition:none}}.profile-body .form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.profile-body .form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.profile-body .form-control-plaintext{background-color:#0000;border:solid #0000;border-width:var(--bs-border-width) 0;color:var(--bs-body-color);display:block;line-height:1.5;margin-bottom:0;padding:.375rem 0;width:100%}.profile-body .form-control-plaintext:focus{outline:0}.profile-body .form-control-plaintext.form-control-lg,.profile-body .form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.profile-body .form-control-sm{border-radius:var(--bs-border-radius-sm);font-size:.875rem;min-height:calc(1.5em + .5rem + var(--bs-border-width)*2);padding:.25rem .5rem}.profile-body .form-control-sm::-webkit-file-upload-button{margin:-.25rem -.5rem;margin-inline-end:.5rem;padding:.25rem .5rem}.profile-body .form-control-sm::file-selector-button{margin:-.25rem -.5rem;margin-inline-end:.5rem;padding:.25rem .5rem}.profile-body .form-control-lg{border-radius:var(--bs-border-radius-lg);font-size:1.25rem;min-height:calc(1.5em + 1rem + var(--bs-border-width)*2);padding:.5rem 1rem}.profile-body .form-control-lg::-webkit-file-upload-button{margin:-.5rem -1rem;margin-inline-end:1rem;padding:.5rem 1rem}.profile-body .form-control-lg::file-selector-button{margin:-.5rem -1rem;margin-inline-end:1rem;padding:.5rem 1rem}.profile-body textarea.form-control{min-height:calc(1.5em + .75rem + var(--bs-border-width)*2)}.profile-body textarea.form-control-sm{min-height:calc(1.5em + .5rem + var(--bs-border-width)*2)}.profile-body textarea.form-control-lg{min-height:calc(1.5em + 1rem + var(--bs-border-width)*2)}.profile-body .form-control-color{height:calc(1.5em + .75rem + var(--bs-border-width)*2);padding:.375rem;width:3rem}.profile-body .form-control-color:not(:disabled):not([readonly]){cursor:pointer}.profile-body .form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.profile-body .form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.profile-body .form-control-color.form-control-sm{height:calc(1.5em + .5rem + var(--bs-border-width)*2)}.profile-body .form-control-color.form-control-lg{height:calc(1.5em + 1rem + var(--bs-border-width)*2)}.profile-body .form-select{--bs-form-select-bg-img:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E");-webkit-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),none;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-position:right .75rem center;background-repeat:no-repeat;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);color:var(--bs-body-color);display:block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem 2.25rem .375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.profile-body .form-select{transition:none}}.profile-body .form-select:focus{border-color:#86b7fe;box-shadow:0 0 0 .25rem #0d6efd40;outline:0}.profile-body .form-select[multiple],.profile-body .form-select[size]:not([size="1"]){background-image:none;padding-right:.75rem}.profile-body .form-select:disabled{background-color:var(--bs-secondary-bg)}.profile-body .form-select:-moz-focusring{color:#0000;text-shadow:0 0 0 var(--bs-body-color)}.profile-body .form-select-sm{border-radius:var(--bs-border-radius-sm);font-size:.875rem;padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.profile-body .form-select-lg{border-radius:var(--bs-border-radius-lg);font-size:1.25rem;padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.profile-body [data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E")}.profile-body .form-check{display:block;margin-bottom:.125rem;min-height:1.5rem;padding-left:1.5em}.profile-body .form-check .form-check-input{float:left;margin-left:-1.5em}.profile-body .form-check-reverse{padding-left:0;padding-right:1.5em;text-align:right}.profile-body .form-check-reverse .form-check-input{float:right;margin-left:0;margin-right:-1.5em}.profile-body .form-check-input{--bs-form-check-bg:var(--bs-body-bg);-webkit-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-position:50%;background-repeat:no-repeat;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);flex-shrink:0;height:1em;margin-top:.25em;-webkit-print-color-adjust:exact;print-color-adjust:exact;vertical-align:top;width:1em}.profile-body .form-check-input[type=checkbox]{border-radius:.25em}.profile-body .form-check-input[type=radio]{border-radius:50%}.profile-body .form-check-input:active{filter:brightness(90%)}.profile-body .form-check-input:focus{border-color:#86b7fe;box-shadow:0 0 0 .25rem #0d6efd40;outline:0}.profile-body .form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.profile-body .form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3E%3C/svg%3E")}.profile-body .form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='2' fill='%23fff'/%3E%3C/svg%3E")}.profile-body .form-check-input[type=checkbox]:indeterminate{--bs-form-check-bg-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3E%3C/svg%3E");background-color:#0d6efd;border-color:#0d6efd}.profile-body .form-check-input:disabled{filter:none;opacity:.5;pointer-events:none}.profile-body .form-check-input:disabled~.form-check-label,.profile-body .form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.profile-body .form-switch{padding-left:2.5em}.profile-body .form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='rgba(0, 0, 0, 0.25)'/%3E%3C/svg%3E");background-image:var(--bs-form-switch-bg);background-position:0;border-radius:2em;margin-left:-2.5em;transition:background-position .15s ease-in-out;width:2em}@media(prefers-reduced-motion:reduce){.profile-body .form-switch .form-check-input{transition:none}}.profile-body .form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%2386b7fe'/%3E%3C/svg%3E")}.profile-body .form-switch .form-check-input:checked{--bs-form-switch-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");background-position:100%}.profile-body .form-switch.form-check-reverse{padding-left:0;padding-right:2.5em}.profile-body .form-switch.form-check-reverse .form-check-input{margin-left:0;margin-right:-2.5em}.profile-body .form-check-inline{display:inline-block;margin-right:1rem}.profile-body .btn-check{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.profile-body .btn-check:disabled+.btn,.profile-body .btn-check[disabled]+.btn{filter:none;opacity:.65;pointer-events:none}.profile-body [data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='rgba(255, 255, 255, 0.25)'/%3E%3C/svg%3E")}.profile-body .form-range{-webkit-appearance:none;appearance:none;background-color:#0000;height:1.5rem;padding:0;width:100%}.profile-body .form-range:focus{outline:0}.profile-body .form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.profile-body .form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.profile-body .form-range::-moz-focus-outer{border:0}.profile-body .form-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#0d6efd;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){.profile-body .form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.profile-body .form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.profile-body .form-range::-webkit-slider-runnable-track{background-color:var(--bs-secondary-bg);border-color:#0000;border-radius:1rem;color:#0000;cursor:pointer;height:.5rem;width:100%}.profile-body .form-range::-moz-range-thumb{appearance:none;background-color:#0d6efd;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){.profile-body .form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.profile-body .form-range::-moz-range-thumb:active{background-color:#b6d4fe}.profile-body .form-range::-moz-range-track{background-color:var(--bs-secondary-bg);border-color:#0000;border-radius:1rem;color:#0000;cursor:pointer;height:.5rem;width:100%}.profile-body .form-range:disabled{pointer-events:none}.profile-body .form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.profile-body .form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.profile-body .form-floating{position:relative}.profile-body .form-floating>.form-control,.profile-body .form-floating>.form-control-plaintext,.profile-body .form-floating>.form-select{height:calc(3.5rem + var(--bs-border-width)*2);line-height:1.25;min-height:calc(3.5rem + var(--bs-border-width)*2)}.profile-body .form-floating>label{border:var(--bs-border-width) solid #0000;height:100%;left:0;overflow:hidden;padding:1rem .75rem;pointer-events:none;position:absolute;text-align:start;text-overflow:ellipsis;top:0;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out;white-space:nowrap;z-index:2}@media(prefers-reduced-motion:reduce){.profile-body .form-floating>label{transition:none}}.profile-body .form-floating>.form-control,.profile-body .form-floating>.form-control-plaintext{padding:1rem .75rem}.profile-body .form-floating>.form-control-plaintext::placeholder,.profile-body .form-floating>.form-control::placeholder{color:#0000}.profile-body .form-floating>.form-control-plaintext:focus,.profile-body .form-floating>.form-control-plaintext:not(:placeholder-shown),.profile-body .form-floating>.form-control:focus,.profile-body .form-floating>.form-control:not(:placeholder-shown){padding-bottom:.625rem;padding-top:1.625rem}.profile-body .form-floating>.form-control-plaintext:-webkit-autofill,.profile-body .form-floating>.form-control:-webkit-autofill{padding-bottom:.625rem;padding-top:1.625rem}.profile-body .form-floating>.form-select{padding-bottom:.625rem;padding-top:1.625rem}.profile-body .form-floating>.form-control-plaintext~label,.profile-body .form-floating>.form-control:focus~label,.profile-body .form-floating>.form-control:not(:placeholder-shown)~label,.profile-body .form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.profile-body .form-floating>.form-control-plaintext~label:after,.profile-body .form-floating>.form-control:focus~label:after,.profile-body .form-floating>.form-control:not(:placeholder-shown)~label:after,.profile-body .form-floating>.form-select~label:after{background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius);content:"";height:1.5em;inset:1rem .375rem;position:absolute;z-index:-1}.profile-body .form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.profile-body .form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.profile-body .form-floating>.form-control:disabled~label,.profile-body .form-floating>:disabled~label{color:#6c757d}.profile-body .form-floating>.form-control:disabled~label:after,.profile-body .form-floating>:disabled~label:after{background-color:var(--bs-secondary-bg)}.profile-body .input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.profile-body .input-group>.form-control,.profile-body .input-group>.form-floating,.profile-body .input-group>.form-select{flex:1 1 auto;min-width:0;position:relative;width:1%}.profile-body .input-group>.form-control:focus,.profile-body .input-group>.form-floating:focus-within,.profile-body .input-group>.form-select:focus{z-index:5}.profile-body .input-group .btn{position:relative;z-index:2}.profile-body .input-group .btn:focus{z-index:5}.profile-body .input-group-text{align-items:center;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);color:var(--bs-body-color);display:flex;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;white-space:nowrap}.profile-body .input-group-lg>.btn,.profile-body .input-group-lg>.form-control,.profile-body .input-group-lg>.form-select,.profile-body .input-group-lg>.input-group-text{border-radius:var(--bs-border-radius-lg);font-size:1.25rem;padding:.5rem 1rem}.profile-body .input-group-sm>.btn,.profile-body .input-group-sm>.form-control,.profile-body .input-group-sm>.form-select,.profile-body .input-group-sm>.input-group-text{border-radius:var(--bs-border-radius-sm);font-size:.875rem;padding:.25rem .5rem}.profile-body .input-group-lg>.form-select,.profile-body .input-group-sm>.form-select{padding-right:3rem}.profile-body .input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.profile-body .input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.profile-body .input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.profile-body .input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.profile-body .input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.profile-body .input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.profile-body .input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.profile-body .input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-bottom-right-radius:0;border-top-right-radius:0}.profile-body .input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:calc(var(--bs-border-width)*-1)}.profile-body .input-group>.form-floating:not(:first-child)>.form-control,.profile-body .input-group>.form-floating:not(:first-child)>.form-select{border-bottom-left-radius:0;border-top-left-radius:0}.profile-body .valid-feedback{color:var(--bs-form-valid-color);display:none;font-size:.875em;margin-top:.25rem;width:100%}.profile-body .valid-tooltip{background-color:var(--bs-success);border-radius:var(--bs-border-radius);color:#fff;display:none;font-size:.875rem;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.profile-body.is-valid~.valid-feedback,.profile-body.is-valid~.valid-tooltip,.was-validated .profile-body:valid~.valid-feedback,.was-validated .profile-body:valid~.valid-tooltip{display:block}.profile-body .form-control.is-valid,.was-validated .profile-body .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23198754' 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(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem)}.profile-body .form-control.is-valid:focus,.was-validated .profile-body .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.profile-body textarea.form-control.is-valid,.was-validated .profile-body textarea.form-control:valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.profile-body .form-select.is-valid,.was-validated .profile-body .form-select:valid{border-color:var(--bs-form-valid-border-color)}.profile-body .form-select.is-valid:not([multiple]):not([size]),.profile-body .form-select.is-valid:not([multiple])[size="1"],.was-validated .profile-body .form-select:valid:not([multiple]):not([size]),.was-validated .profile-body .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23198754' 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 .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.profile-body .form-select.is-valid:focus,.was-validated .profile-body .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.profile-body .form-control-color.is-valid,.was-validated .profile-body .form-control-color:valid{width:calc(3.75rem + 1.5em)}.profile-body .form-check-input.is-valid,.was-validated .profile-body .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.profile-body .form-check-input.is-valid:checked,.was-validated .profile-body .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.profile-body .form-check-input.is-valid:focus,.was-validated .profile-body .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.profile-body .form-check-input.is-valid~.form-check-label,.was-validated .profile-body .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.profile-body .form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.profile-body .input-group>.form-control:not(:focus).is-valid,.profile-body .input-group>.form-floating:not(:focus-within).is-valid,.profile-body .input-group>.form-select:not(:focus).is-valid,.was-validated .profile-body .input-group>.form-control:not(:focus):valid,.was-validated .profile-body .input-group>.form-floating:not(:focus-within):valid,.was-validated .profile-body .input-group>.form-select:not(:focus):valid{z-index:3}.profile-body .invalid-feedback{color:var(--bs-form-invalid-color);display:none;font-size:.875em;margin-top:.25rem;width:100%}.profile-body .invalid-tooltip{background-color:var(--bs-danger);border-radius:var(--bs-border-radius);color:#fff;display:none;font-size:.875rem;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.profile-body.is-invalid~.invalid-feedback,.profile-body.is-invalid~.invalid-tooltip,.was-validated .profile-body:invalid~.invalid-feedback,.was-validated .profile-body:invalid~.invalid-tooltip{display:block}.profile-body .form-control.is-invalid,.was-validated .profile-body .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='%23dc3545'%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='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem)}.profile-body .form-control.is-invalid:focus,.was-validated .profile-body .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.profile-body textarea.form-control.is-invalid,.was-validated .profile-body textarea.form-control:invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.profile-body .form-select.is-invalid,.was-validated .profile-body .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.profile-body .form-select.is-invalid:not([multiple]):not([size]),.profile-body .form-select.is-invalid:not([multiple])[size="1"],.was-validated .profile-body .form-select:invalid:not([multiple]):not([size]),.was-validated .profile-body .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%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='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.profile-body .form-select.is-invalid:focus,.was-validated .profile-body .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.profile-body .form-control-color.is-invalid,.was-validated .profile-body .form-control-color:invalid{width:calc(3.75rem + 1.5em)}.profile-body .form-check-input.is-invalid,.was-validated .profile-body .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.profile-body .form-check-input.is-invalid:checked,.was-validated .profile-body .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.profile-body .form-check-input.is-invalid:focus,.was-validated .profile-body .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.profile-body .form-check-input.is-invalid~.form-check-label,.was-validated .profile-body .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.profile-body .form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.profile-body .input-group>.form-control:not(:focus).is-invalid,.profile-body .input-group>.form-floating:not(:focus-within).is-invalid,.profile-body .input-group>.form-select:not(:focus).is-invalid,.was-validated .profile-body .input-group>.form-control:not(:focus):invalid,.was-validated .profile-body .input-group>.form-floating:not(:focus-within):invalid,.was-validated .profile-body .input-group>.form-select:not(:focus):invalid{z-index:4}.profile-body .btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:#0000;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:#0000;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:#0000;--bs-btn-box-shadow:inset 0 1px 0 #ffffff26,0 1px 1px rgba(0,0,0,.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb),.5);background-color:var(--bs-btn-bg);border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);color:var(--bs-btn-color);cursor:pointer;display:inline-block;font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);text-align:center;text-decoration:none;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;user-select:none;vertical-align:middle}@media(prefers-reduced-motion:reduce){.profile-body .btn{transition:none}}.profile-body .btn:hover{background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);color:var(--bs-btn-hover-color)}.btn-check+.profile-body .btn:hover{background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color);color:var(--bs-btn-color)}.profile-body .btn:focus-visible{background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);color:var(--bs-btn-hover-color);outline:0}.btn-check:focus-visible+.profile-body .btn{border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);outline:0}.btn-check:checked+.profile-body .btn,.profile-body .btn.active,.profile-body .btn.show,.profile-body .btn:first-child:active,:not(.btn-check)+.profile-body .btn:active{background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color);color:var(--bs-btn-active-color)}.btn-check:checked+.profile-body .btn:focus-visible,.profile-body .btn.active:focus-visible,.profile-body .btn.show:focus-visible,.profile-body .btn:first-child:active:focus-visible,:not(.btn-check)+.profile-body .btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.profile-body .btn.disabled,.profile-body .btn:disabled,fieldset:disabled .profile-body .btn{background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);color:var(--bs-btn-disabled-color);opacity:var(--bs-btn-disabled-opacity);pointer-events:none}.profile-body .btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.profile-body .btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.profile-body .btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.profile-body .btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.profile-body .btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.profile-body .btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.profile-body .btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.profile-body .btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.profile-body .btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:#0000;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.profile-body .btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:#0000;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.profile-body .btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:#0000;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.profile-body .btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:#0000;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.profile-body .btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:#0000;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.profile-body .btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:#0000;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.profile-body .btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:#0000;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.profile-body .btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:#0000;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.profile-body .btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:#0000;--bs-btn-border-color:#0000;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:#0000;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:#0000;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:#0000;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.profile-body .btn-link:focus-visible{color:var(--bs-btn-color)}.profile-body .btn-link:hover{color:var(--bs-btn-hover-color)}.profile-body .btn-group-lg>.btn,.profile-body .btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.profile-body .btn-group-sm>.btn,.profile-body .btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.profile-body .fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.profile-body .fade{transition:none}}.profile-body .fade:not(.show){opacity:0}.profile-body .collapse:not(.show){display:none}.profile-body .collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.profile-body .collapsing{transition:none}}.profile-body .collapsing.collapse-horizontal{height:auto;transition:width .35s ease;width:0}@media(prefers-reduced-motion:reduce){.profile-body .collapsing.collapse-horizontal{transition:none}}.profile-body .dropdown,.profile-body .dropdown-center,.profile-body .dropend,.profile-body .dropstart,.profile-body .dropup,.profile-body .dropup-center{position:relative}.profile-body .dropdown-toggle{white-space:nowrap}.profile-body .dropdown-toggle:after{border-bottom:0;border-left:.3em solid #0000;border-right:.3em solid #0000;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.profile-body .dropdown-toggle:empty:after{margin-left:0}.profile-body .dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;background-clip:padding-box;background-color:var(--bs-dropdown-bg);border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius);color:var(--bs-dropdown-color);display:none;font-size:var(--bs-dropdown-font-size);list-style:none;margin:0;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);position:absolute;text-align:left;z-index:var(--bs-dropdown-zindex)}.profile-body .dropdown-menu[data-bs-popper]{left:0;margin-top:var(--bs-dropdown-spacer);top:100%}.profile-body .dropdown-menu-start{--bs-position:start}.profile-body .dropdown-menu-start[data-bs-popper]{left:0;right:auto}.profile-body .dropdown-menu-end{--bs-position:end}.profile-body .dropdown-menu-end[data-bs-popper]{left:auto;right:0}@media(min-width:576px){.profile-body .dropdown-menu-sm-start{--bs-position:start}.profile-body .dropdown-menu-sm-start[data-bs-popper]{left:0;right:auto}.profile-body .dropdown-menu-sm-end{--bs-position:end}.profile-body .dropdown-menu-sm-end[data-bs-popper]{left:auto;right:0}}@media(min-width:768px){.profile-body .dropdown-menu-md-start{--bs-position:start}.profile-body .dropdown-menu-md-start[data-bs-popper]{left:0;right:auto}.profile-body .dropdown-menu-md-end{--bs-position:end}.profile-body .dropdown-menu-md-end[data-bs-popper]{left:auto;right:0}}@media(min-width:992px){.profile-body .dropdown-menu-lg-start{--bs-position:start}.profile-body .dropdown-menu-lg-start[data-bs-popper]{left:0;right:auto}.profile-body .dropdown-menu-lg-end{--bs-position:end}.profile-body .dropdown-menu-lg-end[data-bs-popper]{left:auto;right:0}}@media(min-width:1200px){.profile-body .dropdown-menu-xl-start{--bs-position:start}.profile-body .dropdown-menu-xl-start[data-bs-popper]{left:0;right:auto}.profile-body .dropdown-menu-xl-end{--bs-position:end}.profile-body .dropdown-menu-xl-end[data-bs-popper]{left:auto;right:0}}@media(min-width:1400px){.profile-body .dropdown-menu-xxl-start{--bs-position:start}.profile-body .dropdown-menu-xxl-start[data-bs-popper]{left:0;right:auto}.profile-body .dropdown-menu-xxl-end{--bs-position:end}.profile-body .dropdown-menu-xxl-end[data-bs-popper]{left:auto;right:0}}.profile-body .dropup .dropdown-menu[data-bs-popper]{bottom:100%;margin-bottom:var(--bs-dropdown-spacer);margin-top:0;top:auto}.profile-body .dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid #0000;border-right:.3em solid #0000;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.profile-body .dropup .dropdown-toggle:empty:after{margin-left:0}.profile-body .dropend .dropdown-menu[data-bs-popper]{left:100%;margin-left:var(--bs-dropdown-spacer);margin-top:0;right:auto;top:0}.profile-body .dropend .dropdown-toggle:after{border-bottom:.3em solid #0000;border-left:.3em solid;border-right:0;border-top:.3em solid #0000;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.profile-body .dropend .dropdown-toggle:empty:after{margin-left:0}.profile-body .dropend .dropdown-toggle:after{vertical-align:0}.profile-body .dropstart .dropdown-menu[data-bs-popper]{left:auto;margin-right:var(--bs-dropdown-spacer);margin-top:0;right:100%;top:0}.profile-body .dropstart .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.profile-body .dropstart .dropdown-toggle:before{border-bottom:.3em solid #0000;border-right:.3em solid;border-top:.3em solid #0000;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.profile-body .dropstart .dropdown-toggle:empty:after{margin-left:0}.profile-body .dropstart .dropdown-toggle:before{vertical-align:0}.profile-body .dropdown-divider{border-top:1px solid var(--bs-dropdown-divider-bg);height:0;margin:var(--bs-dropdown-divider-margin-y) 0;opacity:1;overflow:hidden}.profile-body .dropdown-item{background-color:#0000;border:0;border-radius:0;border-radius:var(--bs-dropdown-item-border-radius,0);clear:both;color:var(--bs-dropdown-link-color);display:block;font-weight:400;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);text-align:inherit;text-decoration:none;white-space:nowrap;width:100%}.profile-body .dropdown-item:focus,.profile-body .dropdown-item:hover{background-color:var(--bs-dropdown-link-hover-bg);color:var(--bs-dropdown-link-hover-color)}.profile-body .dropdown-item.active,.profile-body .dropdown-item:active{background-color:var(--bs-dropdown-link-active-bg);color:var(--bs-dropdown-link-active-color);text-decoration:none}.profile-body .dropdown-item.disabled,.profile-body .dropdown-item:disabled{background-color:#0000;color:var(--bs-dropdown-link-disabled-color);pointer-events:none}.profile-body .dropdown-menu.show{display:block}.profile-body .dropdown-header{color:var(--bs-dropdown-header-color);display:block;font-size:.875rem;margin-bottom:0;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);white-space:nowrap}.profile-body .dropdown-item-text{color:var(--bs-dropdown-link-color);display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x)}.profile-body .dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:#ffffff26;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.profile-body .btn-group,.profile-body .btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.profile-body .btn-group-vertical>.btn,.profile-body .btn-group>.btn{flex:1 1 auto;position:relative}.profile-body .btn-group-vertical>.btn-check:checked+.btn,.profile-body .btn-group-vertical>.btn-check:focus+.btn,.profile-body .btn-group-vertical>.btn.active,.profile-body .btn-group-vertical>.btn:active,.profile-body .btn-group-vertical>.btn:focus,.profile-body .btn-group-vertical>.btn:hover,.profile-body .btn-group>.btn-check:checked+.btn,.profile-body .btn-group>.btn-check:focus+.btn,.profile-body .btn-group>.btn.active,.profile-body .btn-group>.btn:active,.profile-body .btn-group>.btn:focus,.profile-body .btn-group>.btn:hover{z-index:1}.profile-body .btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.profile-body .btn-toolbar .input-group{width:auto}.profile-body .btn-group{border-radius:var(--bs-border-radius)}.profile-body .btn-group>.btn-group:not(:first-child),.profile-body .btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width)*-1)}.profile-body .btn-group>.btn-group:not(:last-child)>.btn,.profile-body .btn-group>.btn.dropdown-toggle-split:first-child,.profile-body .btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.profile-body .btn-group>.btn-group:not(:first-child)>.btn,.profile-body .btn-group>.btn:nth-child(n+3),.profile-body .btn-group>:not(.btn-check)+.btn{border-bottom-left-radius:0;border-top-left-radius:0}.profile-body .dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropend .profile-body .dropdown-toggle-split:after,.dropup .profile-body .dropdown-toggle-split:after,.profile-body .dropdown-toggle-split:after{margin-left:0}.dropstart .profile-body .dropdown-toggle-split:before{margin-right:0}.profile-body .btn-group-sm>.btn+.dropdown-toggle-split,.profile-body .btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.profile-body .btn-group-lg>.btn+.dropdown-toggle-split,.profile-body .btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.profile-body .btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.profile-body .btn-group-vertical>.btn,.profile-body .btn-group-vertical>.btn-group{width:100%}.profile-body .btn-group-vertical>.btn-group:not(:first-child),.profile-body .btn-group-vertical>.btn:not(:first-child){margin-top:calc(var(--bs-border-width)*-1)}.profile-body .btn-group-vertical>.btn-group:not(:last-child)>.btn,.profile-body .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.profile-body .btn-group-vertical>.btn-group:not(:first-child)>.btn,.profile-body .btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.profile-body .nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.profile-body .nav-link{background:none;border:0;color:var(--bs-nav-link-color);display:block;font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion:reduce){.profile-body .nav-link{transition:none}}.profile-body .nav-link:focus,.profile-body .nav-link:hover{color:var(--bs-nav-link-hover-color)}.profile-body .nav-link:focus-visible{box-shadow:0 0 0 .25rem #0d6efd40;outline:0}.profile-body .nav-link.disabled,.profile-body .nav-link:disabled{color:var(--bs-nav-link-disabled-color);cursor:default;pointer-events:none}.profile-body .nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.profile-body .nav-tabs .nav-link{border:var(--bs-nav-tabs-border-width) solid #0000;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius);margin-bottom:calc(var(--bs-nav-tabs-border-width)*-1)}.profile-body .nav-tabs .nav-link:focus,.profile-body .nav-tabs .nav-link:hover{border-color:var(--bs-nav-tabs-link-hover-border-color);isolation:isolate}.profile-body .nav-tabs .nav-item.show .nav-link,.profile-body .nav-tabs .nav-link.active{background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color);color:var(--bs-nav-tabs-link-active-color)}.profile-body .nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:calc(var(--bs-nav-tabs-border-width)*-1)}.profile-body .nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.profile-body .nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.profile-body .nav-pills .nav-link.active,.profile-body .nav-pills .show>.nav-link{background-color:var(--bs-nav-pills-link-active-bg);color:var(--bs-nav-pills-link-active-color)}.profile-body .nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.profile-body .nav-underline .nav-link{border-bottom:var(--bs-nav-underline-border-width) solid #0000;padding-left:0;padding-right:0}.profile-body .nav-underline .nav-link:focus,.profile-body .nav-underline .nav-link:hover{border-bottom-color:initial}.profile-body .nav-underline .nav-link.active,.profile-body .nav-underline .show>.nav-link{border-bottom-color:initial;color:var(--bs-nav-underline-link-active-color);font-weight:700}.profile-body .nav-fill .nav-item,.profile-body .nav-fill>.nav-link{flex:1 1 auto;text-align:center}.profile-body .nav-justified .nav-item,.profile-body .nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.profile-body .nav-fill .nav-item .nav-link,.profile-body .nav-justified .nav-item .nav-link{width:100%}.profile-body .tab-content>.tab-pane{display:none}.profile-body .tab-content>.active{display:block}.profile-body .navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb),0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb),0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb),0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb),1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb),1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb),1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='rgba(33, 37, 41, 0.75)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb),0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);position:relative}.profile-body .navbar>.container,.profile-body .navbar>.container-fluid,.profile-body .navbar>.container-lg,.profile-body .navbar>.container-md,.profile-body .navbar>.container-sm,.profile-body .navbar>.container-xl,.profile-body .navbar>.container-xxl{align-items:center;display:flex;flex-wrap:inherit;justify-content:space-between}.profile-body .navbar-brand{color:var(--bs-navbar-brand-color);font-size:var(--bs-navbar-brand-font-size);margin-right:var(--bs-navbar-brand-margin-end);padding-bottom:var(--bs-navbar-brand-padding-y);padding-top:var(--bs-navbar-brand-padding-y);text-decoration:none;white-space:nowrap}.profile-body .navbar-brand:focus,.profile-body .navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.profile-body .navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.profile-body .navbar-nav .nav-link.active,.profile-body .navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.profile-body .navbar-nav .dropdown-menu{position:static}.profile-body .navbar-text{color:var(--bs-navbar-color);padding-bottom:.5rem;padding-top:.5rem}.profile-body .navbar-text a,.profile-body .navbar-text a:focus,.profile-body .navbar-text a:hover{color:var(--bs-navbar-active-color)}.profile-body .navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.profile-body .navbar-toggler{background-color:#0000;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);color:var(--bs-navbar-color);font-size:var(--bs-navbar-toggler-font-size);line-height:1;padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion:reduce){.profile-body .navbar-toggler{transition:none}}.profile-body .navbar-toggler:hover{text-decoration:none}.profile-body .navbar-toggler:focus{box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width);outline:0;text-decoration:none}.profile-body .navbar-toggler-icon{background-image:var(--bs-navbar-toggler-icon-bg);background-position:50%;background-repeat:no-repeat;background-size:100%;display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.profile-body .navbar-nav-scroll{max-height:75vh;max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media(min-width:576px){.profile-body .navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.profile-body .navbar-expand-sm .navbar-nav{flex-direction:row}.profile-body .navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.profile-body .navbar-expand-sm .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.profile-body .navbar-expand-sm .navbar-nav-scroll{overflow:visible}.profile-body .navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.profile-body .navbar-expand-sm .navbar-toggler{display:none}.profile-body .navbar-expand-sm .offcanvas{background-color:#0000!important;border:0!important;flex-grow:1;height:auto!important;position:static;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.profile-body .navbar-expand-sm .offcanvas .offcanvas-header{display:none}.profile-body .navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(min-width:768px){.profile-body .navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.profile-body .navbar-expand-md .navbar-nav{flex-direction:row}.profile-body .navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.profile-body .navbar-expand-md .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.profile-body .navbar-expand-md .navbar-nav-scroll{overflow:visible}.profile-body .navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.profile-body .navbar-expand-md .navbar-toggler{display:none}.profile-body .navbar-expand-md .offcanvas{background-color:#0000!important;border:0!important;flex-grow:1;height:auto!important;position:static;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.profile-body .navbar-expand-md .offcanvas .offcanvas-header{display:none}.profile-body .navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(min-width:992px){.profile-body .navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.profile-body .navbar-expand-lg .navbar-nav{flex-direction:row}.profile-body .navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.profile-body .navbar-expand-lg .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.profile-body .navbar-expand-lg .navbar-nav-scroll{overflow:visible}.profile-body .navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.profile-body .navbar-expand-lg .navbar-toggler{display:none}.profile-body .navbar-expand-lg .offcanvas{background-color:#0000!important;border:0!important;flex-grow:1;height:auto!important;position:static;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.profile-body .navbar-expand-lg .offcanvas .offcanvas-header{display:none}.profile-body .navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(min-width:1200px){.profile-body .navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.profile-body .navbar-expand-xl .navbar-nav{flex-direction:row}.profile-body .navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.profile-body .navbar-expand-xl .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.profile-body .navbar-expand-xl .navbar-nav-scroll{overflow:visible}.profile-body .navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.profile-body .navbar-expand-xl .navbar-toggler{display:none}.profile-body .navbar-expand-xl .offcanvas{background-color:#0000!important;border:0!important;flex-grow:1;height:auto!important;position:static;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.profile-body .navbar-expand-xl .offcanvas .offcanvas-header{display:none}.profile-body .navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(min-width:1400px){.profile-body .navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.profile-body .navbar-expand-xxl .navbar-nav{flex-direction:row}.profile-body .navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.profile-body .navbar-expand-xxl .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.profile-body .navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.profile-body .navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.profile-body .navbar-expand-xxl .navbar-toggler{display:none}.profile-body .navbar-expand-xxl .offcanvas{background-color:#0000!important;border:0!important;flex-grow:1;height:auto!important;position:static;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.profile-body .navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.profile-body .navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}.profile-body .navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.profile-body .navbar-expand .navbar-nav{flex-direction:row}.profile-body .navbar-expand .navbar-nav .dropdown-menu{position:absolute}.profile-body .navbar-expand .navbar-nav .nav-link{padding-left:var(--bs-navbar-nav-link-padding-x);padding-right:var(--bs-navbar-nav-link-padding-x)}.profile-body .navbar-expand .navbar-nav-scroll{overflow:visible}.profile-body .navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.profile-body .navbar-expand .navbar-toggler{display:none}.profile-body .navbar-expand .offcanvas{background-color:#0000!important;border:0!important;flex-grow:1;height:auto!important;position:static;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.profile-body .navbar-expand .offcanvas .offcanvas-header{display:none}.profile-body .navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}.profile-body .navbar-dark,.profile-body .navbar[data-bs-theme=dark]{--bs-navbar-color:#ffffff8c;--bs-navbar-hover-color:#ffffffbf;--bs-navbar-disabled-color:#ffffff40;--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:#ffffff1a}.profile-body .navbar-dark,.profile-body .navbar[data-bs-theme=dark],.profile-body [data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.55)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.profile-body .card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb),0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;word-wrap:break-word;background-clip:initial;background-color:var(--bs-card-bg);border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius);color:var(--bs-body-color);display:flex;flex-direction:column;height:var(--bs-card-height);min-width:0;position:relative}.profile-body .card>hr{margin-left:0;margin-right:0}.profile-body .card>.list-group{border-bottom:inherit;border-top:inherit}.profile-body .card>.list-group:first-child{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius);border-top-width:0}.profile-body .card>.list-group:last-child{border-bottom-left-radius:var(--bs-card-inner-border-radius);border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-width:0}.profile-body .card>.card-header+.list-group,.profile-body .card>.list-group+.card-footer{border-top:0}.profile-body .card-body{color:var(--bs-card-color);flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x)}.profile-body .card-title{color:var(--bs-card-title-color);margin-bottom:var(--bs-card-title-spacer-y)}.profile-body .card-subtitle{color:var(--bs-card-subtitle-color);margin-bottom:0;margin-top:calc(var(--bs-card-title-spacer-y)*-.5)}.profile-body .card-text:last-child{margin-bottom:0}.profile-body .card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.profile-body .card-header{background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color);color:var(--bs-card-cap-color);margin-bottom:0;padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x)}.profile-body .card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.profile-body .card-footer{background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color);color:var(--bs-card-cap-color);padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x)}.profile-body .card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.profile-body .card-header-tabs{border-bottom:0;margin-bottom:calc(var(--bs-card-cap-padding-y)*-1);margin-left:calc(var(--bs-card-cap-padding-x)*-.5);margin-right:calc(var(--bs-card-cap-padding-x)*-.5)}.profile-body .card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.profile-body .card-header-pills{margin-left:calc(var(--bs-card-cap-padding-x)*-.5);margin-right:calc(var(--bs-card-cap-padding-x)*-.5)}.profile-body .card-img-overlay{border-radius:var(--bs-card-inner-border-radius);bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);position:absolute;right:0;top:0}.profile-body .card-img,.profile-body .card-img-bottom,.profile-body .card-img-top{width:100%}.profile-body .card-img,.profile-body .card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.profile-body .card-img,.profile-body .card-img-bottom{border-bottom-left-radius:var(--bs-card-inner-border-radius);border-bottom-right-radius:var(--bs-card-inner-border-radius)}.profile-body .card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width:576px){.profile-body .card-group{display:flex;flex-flow:row wrap}.profile-body .card-group>.card{flex:1 0;margin-bottom:0}.profile-body .card-group>.card+.card{border-left:0;margin-left:0}.profile-body .card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.profile-body .card-group>.card:not(:last-child) .card-header,.profile-body .card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.profile-body .card-group>.card:not(:last-child) .card-footer,.profile-body .card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.profile-body .card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.profile-body .card-group>.card:not(:first-child) .card-header,.profile-body .card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.profile-body .card-group>.card:not(:first-child) .card-footer,.profile-body .card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.profile-body .accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E");--bs-accordion-btn-focus-border-color:#86b7fe;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem #0d6efd40;--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.profile-body .accordion-button{align-items:center;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;color:var(--bs-accordion-btn-color);display:flex;font-size:1rem;overflow-anchor:none;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);position:relative;text-align:left;transition:var(--bs-accordion-transition);width:100%}@media(prefers-reduced-motion:reduce){.profile-body .accordion-button{transition:none}}.profile-body .accordion-button:not(.collapsed){background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(var(--bs-accordion-border-width)*-1) 0 var(--bs-accordion-border-color);color:var(--bs-accordion-active-color)}.profile-body .accordion-button:not(.collapsed):after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.profile-body .accordion-button:after{background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);content:"";flex-shrink:0;height:var(--bs-accordion-btn-icon-width);margin-left:auto;transition:var(--bs-accordion-btn-icon-transition);width:var(--bs-accordion-btn-icon-width)}@media(prefers-reduced-motion:reduce){.profile-body .accordion-button:after{transition:none}}.profile-body .accordion-button:hover{z-index:2}.profile-body .accordion-button:focus{border-color:var(--bs-accordion-btn-focus-border-color);box-shadow:var(--bs-accordion-btn-focus-box-shadow);outline:0;z-index:3}.profile-body .accordion-header{margin-bottom:0}.profile-body .accordion-item{background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);color:var(--bs-accordion-color)}.profile-body .accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.profile-body .accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.profile-body .accordion-item:not(:first-of-type){border-top:0}.profile-body .accordion-item:last-of-type{border-bottom-left-radius:var(--bs-accordion-border-radius);border-bottom-right-radius:var(--bs-accordion-border-radius)}.profile-body .accordion-item:last-of-type .accordion-button.collapsed{border-bottom-left-radius:var(--bs-accordion-inner-border-radius);border-bottom-right-radius:var(--bs-accordion-inner-border-radius)}.profile-body .accordion-item:last-of-type .accordion-collapse{border-bottom-left-radius:var(--bs-accordion-border-radius);border-bottom-right-radius:var(--bs-accordion-border-radius)}.profile-body .accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.profile-body .accordion-flush .accordion-collapse{border-width:0}.profile-body .accordion-flush .accordion-item{border-left:0;border-radius:0;border-right:0}.profile-body .accordion-flush .accordion-item:first-child{border-top:0}.profile-body .accordion-flush .accordion-item:last-child{border-bottom:0}.profile-body .accordion-flush .accordion-item .accordion-button,.profile-body .accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}.profile-body [data-bs-theme=dark] .accordion-button:after{--bs-accordion-btn-icon:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E");--bs-accordion-btn-active-icon:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E")}.profile-body .breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius);display:flex;flex-wrap:wrap;font-size:var(--bs-breadcrumb-font-size);list-style:none;margin-bottom:var(--bs-breadcrumb-margin-bottom);padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x)}.profile-body .breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.profile-body .breadcrumb-item+.breadcrumb-item:before{color:var(--bs-breadcrumb-divider-color);content:"/";content:var(--bs-breadcrumb-divider,"/");float:left;padding-right:var(--bs-breadcrumb-item-padding-x)}.profile-body .breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.profile-body .pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem #0d6efd40;--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;list-style:none;padding-left:0}.profile-body .page-link{background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);color:var(--bs-pagination-color);display:block;font-size:var(--bs-pagination-font-size);padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);position:relative;text-decoration:none;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(prefers-reduced-motion:reduce){.profile-body .page-link{transition:none}}.profile-body .page-link:hover{background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color);color:var(--bs-pagination-hover-color);z-index:2}.profile-body .page-link:focus{background-color:var(--bs-pagination-focus-bg);box-shadow:var(--bs-pagination-focus-box-shadow);color:var(--bs-pagination-focus-color);outline:0;z-index:3}.active>.profile-body .page-link,.profile-body .page-link.active{background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color);color:var(--bs-pagination-active-color);z-index:3}.disabled>.profile-body .page-link,.profile-body .page-link.disabled{background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color);color:var(--bs-pagination-disabled-color);pointer-events:none}.profile-body .page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width)*-1)}.profile-body .page-item:first-child .page-link{border-bottom-left-radius:var(--bs-pagination-border-radius);border-top-left-radius:var(--bs-pagination-border-radius)}.profile-body .page-item:last-child .page-link{border-bottom-right-radius:var(--bs-pagination-border-radius);border-top-right-radius:var(--bs-pagination-border-radius)}.profile-body .pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.profile-body .pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.profile-body .badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);border-radius:var(--bs-badge-border-radius);color:var(--bs-badge-color);display:inline-block;font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);text-align:center;vertical-align:initial;white-space:nowrap}.profile-body .badge:empty{display:none}.profile-body .btn .badge{position:relative;top:-1px}.profile-body .alert{--bs-alert-bg:#0000;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:#0000;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius);color:var(--bs-alert-color);margin-bottom:var(--bs-alert-margin-bottom);padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);position:relative}.profile-body .alert-heading{color:inherit}.profile-body .alert-link{color:var(--bs-alert-link-color);font-weight:700}.profile-body .alert-dismissible{padding-right:3rem}.profile-body .alert-dismissible .btn-close{padding:1.25rem 1rem;position:absolute;right:0;top:0;z-index:2}.profile-body .alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.profile-body .alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.profile-body .alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.profile-body .alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.profile-body .alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.profile-body .alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.profile-body .alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.profile-body .alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.profile-body .progress,.profile-body .progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius);display:flex;font-size:var(--bs-progress-font-size);height:var(--bs-progress-height);overflow:hidden}.profile-body .progress-bar{background-color:var(--bs-progress-bar-bg);color:var(--bs-progress-bar-color);display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-align:center;transition:var(--bs-progress-bar-transition);white-space:nowrap}@media(prefers-reduced-motion:reduce){.profile-body .progress-bar{transition:none}}.profile-body .progress-bar-striped{background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-size:var(--bs-progress-height) var(--bs-progress-height)}.profile-body .progress-stacked>.progress{overflow:visible}.profile-body .progress-stacked>.progress>.progress-bar{width:100%}.profile-body .progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media(prefers-reduced-motion:reduce){.profile-body .progress-bar-animated{animation:none}}.profile-body .list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;border-radius:var(--bs-list-group-border-radius);display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.profile-body .list-group-numbered{counter-reset:section;list-style-type:none}.profile-body .list-group-numbered>.list-group-item:before{content:counters(section,".") ". ";counter-increment:section}.profile-body .list-group-item-action{color:var(--bs-list-group-action-color);text-align:inherit;width:100%}.profile-body .list-group-item-action:focus,.profile-body .list-group-item-action:hover{background-color:var(--bs-list-group-action-hover-bg);color:var(--bs-list-group-action-hover-color);text-decoration:none;z-index:1}.profile-body .list-group-item-action:active{background-color:var(--bs-list-group-action-active-bg);color:var(--bs-list-group-action-active-color)}.profile-body .list-group-item{background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);color:var(--bs-list-group-color);display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);position:relative;text-decoration:none}.profile-body .list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.profile-body .list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.profile-body .list-group-item.disabled,.profile-body .list-group-item:disabled{background-color:var(--bs-list-group-disabled-bg);color:var(--bs-list-group-disabled-color);pointer-events:none}.profile-body .list-group-item.active{background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color);color:var(--bs-list-group-active-color);z-index:2}.profile-body .list-group-item+.list-group-item{border-top-width:0}.profile-body .list-group-item+.list-group-item.active{border-top-width:var(--bs-list-group-border-width);margin-top:calc(var(--bs-list-group-border-width)*-1)}.profile-body .list-group-horizontal{flex-direction:row}.profile-body .list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.profile-body .list-group-horizontal>.list-group-item:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.profile-body .list-group-horizontal>.list-group-item.active{margin-top:0}.profile-body .list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.profile-body .list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}@media(min-width:576px){.profile-body .list-group-horizontal-sm{flex-direction:row}.profile-body .list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.profile-body .list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.profile-body .list-group-horizontal-sm>.list-group-item.active{margin-top:0}.profile-body .list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.profile-body .list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}@media(min-width:768px){.profile-body .list-group-horizontal-md{flex-direction:row}.profile-body .list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.profile-body .list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.profile-body .list-group-horizontal-md>.list-group-item.active{margin-top:0}.profile-body .list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.profile-body .list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}@media(min-width:992px){.profile-body .list-group-horizontal-lg{flex-direction:row}.profile-body .list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.profile-body .list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.profile-body .list-group-horizontal-lg>.list-group-item.active{margin-top:0}.profile-body .list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.profile-body .list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}@media(min-width:1200px){.profile-body .list-group-horizontal-xl{flex-direction:row}.profile-body .list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.profile-body .list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.profile-body .list-group-horizontal-xl>.list-group-item.active{margin-top:0}.profile-body .list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.profile-body .list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}@media(min-width:1400px){.profile-body .list-group-horizontal-xxl{flex-direction:row}.profile-body .list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.profile-body .list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.profile-body .list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.profile-body .list-group-horizontal-xxl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.profile-body .list-group-horizontal-xxl>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}.profile-body .list-group-flush{border-radius:0}.profile-body .list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.profile-body .list-group-flush>.list-group-item:last-child{border-bottom-width:0}.profile-body .list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.profile-body .list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.profile-body .list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.profile-body .list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.profile-body .list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.profile-body .list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.profile-body .list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.profile-body .list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.profile-body .btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3E%3C/svg%3E");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem #0d6efd40;--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);background:#0000 var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;box-sizing:initial;color:var(--bs-btn-close-color);height:1em;opacity:var(--bs-btn-close-opacity);padding:.25em;width:1em}.profile-body .btn-close:hover{color:var(--bs-btn-close-color);opacity:var(--bs-btn-close-hover-opacity);text-decoration:none}.profile-body .btn-close:focus{box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity);outline:0}.profile-body .btn-close.disabled,.profile-body .btn-close:disabled{opacity:var(--bs-btn-close-disabled-opacity);pointer-events:none;-webkit-user-select:none;user-select:none}.profile-body .btn-close-white,.profile-body [data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.profile-body .toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb),0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb),0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);background-clip:padding-box;background-color:var(--bs-toast-bg);border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);border-radius:var(--bs-toast-border-radius);box-shadow:var(--bs-toast-box-shadow);color:var(--bs-toast-color);font-size:var(--bs-toast-font-size);max-width:100%;pointer-events:auto;width:var(--bs-toast-max-width)}.profile-body .toast.showing{opacity:0}.profile-body .toast:not(.show){display:none}.profile-body .toast-container{--bs-toast-zindex:1090;max-width:100%;pointer-events:none;position:absolute;width:-webkit-max-content;width:max-content;z-index:var(--bs-toast-zindex)}.profile-body .toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.profile-body .toast-header{align-items:center;background-clip:padding-box;background-color:var(--bs-toast-header-bg);border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));color:var(--bs-toast-header-color);display:flex;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x)}.profile-body .toast-header .btn-close{margin-left:var(--bs-toast-padding-x);margin-right:calc(var(--bs-toast-padding-x)*-.5)}.profile-body .toast-body{word-wrap:break-word;padding:var(--bs-toast-padding-x)}.profile-body .modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);display:none;height:100%;left:0;outline:0;overflow-x:hidden;overflow-y:auto;position:fixed;top:0;width:100%;z-index:var(--bs-modal-zindex)}.profile-body .modal-dialog{margin:var(--bs-modal-margin);pointer-events:none;position:relative;width:auto}.modal.fade .profile-body .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media(prefers-reduced-motion:reduce){.modal.fade .profile-body .modal-dialog{transition:none}}.modal.show .profile-body .modal-dialog{transform:none}.modal.modal-static .profile-body .modal-dialog{transform:scale(1.02)}.profile-body .modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.profile-body .modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.profile-body .modal-dialog-scrollable .modal-body{overflow-y:auto}.profile-body .modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - var(--bs-modal-margin)*2)}.profile-body .modal-content{background-clip:padding-box;background-color:var(--bs-modal-bg);border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);color:var(--bs-modal-color);display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.profile-body .modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;background-color:var(--bs-backdrop-bg);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:var(--bs-backdrop-zindex)}.profile-body .modal-backdrop.fade{opacity:0}.profile-body .modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.profile-body .modal-header{align-items:center;border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius);display:flex;flex-shrink:0;justify-content:space-between;padding:var(--bs-modal-header-padding)}.profile-body .modal-header .btn-close{margin:calc(var(--bs-modal-header-padding-y)*-.5) calc(var(--bs-modal-header-padding-x)*-.5) calc(var(--bs-modal-header-padding-y)*-.5) auto;padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5)}.profile-body .modal-title{line-height:var(--bs-modal-title-line-height);margin-bottom:0}.profile-body .modal-body{flex:1 1 auto;padding:var(--bs-modal-padding);position:relative}.profile-body .modal-footer{align-items:center;background-color:var(--bs-modal-footer-bg);border-bottom-left-radius:var(--bs-modal-inner-border-radius);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5)}.profile-body .modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width:576px){.profile-body .modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.profile-body .modal-dialog{margin-left:auto;margin-right:auto;max-width:var(--bs-modal-width)}.profile-body .modal-sm{--bs-modal-width:300px}}@media(min-width:992px){.profile-body .modal-lg,.profile-body .modal-xl{--bs-modal-width:800px}}@media(min-width:1200px){.profile-body .modal-xl{--bs-modal-width:1140px}}.profile-body .modal-fullscreen{height:100%;margin:0;max-width:none;width:100vw}.profile-body .modal-fullscreen .modal-content{border:0;border-radius:0;height:100%}.profile-body .modal-fullscreen .modal-footer,.profile-body .modal-fullscreen .modal-header{border-radius:0}.profile-body .modal-fullscreen .modal-body{overflow-y:auto}@media(max-width:575.98px){.profile-body .modal-fullscreen-sm-down{height:100%;margin:0;max-width:none;width:100vw}.profile-body .modal-fullscreen-sm-down .modal-content{border:0;border-radius:0;height:100%}.profile-body .modal-fullscreen-sm-down .modal-footer,.profile-body .modal-fullscreen-sm-down .modal-header{border-radius:0}.profile-body .modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width:767.98px){.profile-body .modal-fullscreen-md-down{height:100%;margin:0;max-width:none;width:100vw}.profile-body .modal-fullscreen-md-down .modal-content{border:0;border-radius:0;height:100%}.profile-body .modal-fullscreen-md-down .modal-footer,.profile-body .modal-fullscreen-md-down .modal-header{border-radius:0}.profile-body .modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width:991.98px){.profile-body .modal-fullscreen-lg-down{height:100%;margin:0;max-width:none;width:100vw}.profile-body .modal-fullscreen-lg-down .modal-content{border:0;border-radius:0;height:100%}.profile-body .modal-fullscreen-lg-down .modal-footer,.profile-body .modal-fullscreen-lg-down .modal-header{border-radius:0}.profile-body .modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width:1199.98px){.profile-body .modal-fullscreen-xl-down{height:100%;margin:0;max-width:none;width:100vw}.profile-body .modal-fullscreen-xl-down .modal-content{border:0;border-radius:0;height:100%}.profile-body .modal-fullscreen-xl-down .modal-footer,.profile-body .modal-fullscreen-xl-down .modal-header{border-radius:0}.profile-body .modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width:1399.98px){.profile-body .modal-fullscreen-xxl-down{height:100%;margin:0;max-width:none;width:100vw}.profile-body .modal-fullscreen-xxl-down .modal-content{border:0;border-radius:0;height:100%}.profile-body .modal-fullscreen-xxl-down .modal-footer,.profile-body .modal-fullscreen-xxl-down .modal-header{border-radius:0}.profile-body .modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.profile-body .tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;word-wrap:break-word;display:block;font-family:var(--bs-font-sans-serif);font-size:var(--bs-tooltip-font-size);font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;margin:var(--bs-tooltip-margin);opacity:0;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:var(--bs-tooltip-zindex)}.profile-body .tooltip.show{opacity:var(--bs-tooltip-opacity)}.profile-body .tooltip .tooltip-arrow{display:block;height:var(--bs-tooltip-arrow-height);width:var(--bs-tooltip-arrow-width)}.profile-body .tooltip .tooltip-arrow:before{border-color:#0000;border-style:solid;content:"";position:absolute}.profile-body .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.profile-body .bs-tooltip-top .tooltip-arrow{bottom:calc(var(--bs-tooltip-arrow-height)*-1)}.profile-body .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before,.profile-body .bs-tooltip-top .tooltip-arrow:before{border-top-color:var(--bs-tooltip-bg);border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;top:-1px}.profile-body .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.profile-body .bs-tooltip-end .tooltip-arrow{height:var(--bs-tooltip-arrow-width);left:calc(var(--bs-tooltip-arrow-height)*-1);width:var(--bs-tooltip-arrow-height)}.profile-body .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before,.profile-body .bs-tooltip-end .tooltip-arrow:before{border-right-color:var(--bs-tooltip-bg);border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;right:-1px}.profile-body .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.profile-body .bs-tooltip-bottom .tooltip-arrow{top:calc(var(--bs-tooltip-arrow-height)*-1)}.profile-body .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before,.profile-body .bs-tooltip-bottom .tooltip-arrow:before{border-bottom-color:var(--bs-tooltip-bg);border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);bottom:-1px}.profile-body .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.profile-body .bs-tooltip-start .tooltip-arrow{height:var(--bs-tooltip-arrow-width);right:calc(var(--bs-tooltip-arrow-height)*-1);width:var(--bs-tooltip-arrow-height)}.profile-body .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before,.profile-body .bs-tooltip-start .tooltip-arrow:before{border-left-color:var(--bs-tooltip-bg);border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);left:-1px}.profile-body .tooltip-inner{background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius);color:var(--bs-tooltip-color);max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);text-align:center}.profile-body .popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);word-wrap:break-word;background-clip:padding-box;background-color:var(--bs-popover-bg);border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius);display:block;font-family:var(--bs-font-sans-serif);font-size:var(--bs-popover-font-size);font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:var(--bs-popover-max-width);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:var(--bs-popover-zindex)}.profile-body .popover .popover-arrow{display:block;height:var(--bs-popover-arrow-height);width:var(--bs-popover-arrow-width)}.profile-body .popover .popover-arrow:after,.profile-body .popover .popover-arrow:before{border:0 solid #0000;content:"";display:block;position:absolute}.profile-body .bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.profile-body .bs-popover-top>.popover-arrow{bottom:calc((var(--bs-popover-arrow-height))*-1 - var(--bs-popover-border-width))}.profile-body .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.profile-body .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.profile-body .bs-popover-top>.popover-arrow:after,.profile-body .bs-popover-top>.popover-arrow:before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.profile-body .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.profile-body .bs-popover-top>.popover-arrow:before{border-top-color:var(--bs-popover-arrow-border);bottom:0}.profile-body .bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.profile-body .bs-popover-top>.popover-arrow:after{border-top-color:var(--bs-popover-bg);bottom:var(--bs-popover-border-width)}.profile-body .bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.profile-body .bs-popover-end>.popover-arrow{height:var(--bs-popover-arrow-width);left:calc((var(--bs-popover-arrow-height))*-1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height)}.profile-body .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.profile-body .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.profile-body .bs-popover-end>.popover-arrow:after,.profile-body .bs-popover-end>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.profile-body .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.profile-body .bs-popover-end>.popover-arrow:before{border-right-color:var(--bs-popover-arrow-border);left:0}.profile-body .bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.profile-body .bs-popover-end>.popover-arrow:after{border-right-color:var(--bs-popover-bg);left:var(--bs-popover-border-width)}.profile-body .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.profile-body .bs-popover-bottom>.popover-arrow{top:calc((var(--bs-popover-arrow-height))*-1 - var(--bs-popover-border-width))}.profile-body .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.profile-body .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.profile-body .bs-popover-bottom>.popover-arrow:after,.profile-body .bs-popover-bottom>.popover-arrow:before{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.profile-body .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.profile-body .bs-popover-bottom>.popover-arrow:before{border-bottom-color:var(--bs-popover-arrow-border);top:0}.profile-body .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.profile-body .bs-popover-bottom>.popover-arrow:after{border-bottom-color:var(--bs-popover-bg);top:var(--bs-popover-border-width)}.profile-body .bs-popover-auto[data-popper-placement^=bottom] .popover-header:before,.profile-body .bs-popover-bottom .popover-header:before{border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg);content:"";display:block;left:50%;margin-left:calc(var(--bs-popover-arrow-width)*-.5);position:absolute;top:0;width:var(--bs-popover-arrow-width)}.profile-body .bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.profile-body .bs-popover-start>.popover-arrow{height:var(--bs-popover-arrow-width);right:calc((var(--bs-popover-arrow-height))*-1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height)}.profile-body .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.profile-body .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.profile-body .bs-popover-start>.popover-arrow:after,.profile-body .bs-popover-start>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.profile-body .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.profile-body .bs-popover-start>.popover-arrow:before{border-left-color:var(--bs-popover-arrow-border);right:0}.profile-body .bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.profile-body .bs-popover-start>.popover-arrow:after{border-left-color:var(--bs-popover-bg);right:var(--bs-popover-border-width)}.profile-body .popover-header{background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius);color:var(--bs-popover-header-color);font-size:var(--bs-popover-header-font-size);margin-bottom:0;padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x)}.profile-body .popover-header:empty{display:none}.profile-body .popover-body{color:var(--bs-popover-body-color);padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x)}.profile-body .carousel{position:relative}.profile-body .carousel.pointer-event{touch-action:pan-y}.profile-body .carousel-inner{overflow:hidden;position:relative;width:100%}.profile-body .carousel-inner:after{clear:both;content:"";display:block}.profile-body .carousel-item{-webkit-backface-visibility:hidden;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){.profile-body .carousel-item{transition:none}}.profile-body .carousel-item-next,.profile-body .carousel-item-prev,.profile-body .carousel-item.active{display:block}.profile-body .active.carousel-item-end,.profile-body .carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.profile-body .active.carousel-item-start,.profile-body .carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.profile-body .carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.profile-body .carousel-fade .carousel-item-next.carousel-item-start,.profile-body .carousel-fade .carousel-item-prev.carousel-item-end,.profile-body .carousel-fade .carousel-item.active{opacity:1;z-index:1}.profile-body .carousel-fade .active.carousel-item-end,.profile-body .carousel-fade .active.carousel-item-start{opacity:0;transition:opacity 0s .6s;z-index:0}@media(prefers-reduced-motion:reduce){.profile-body .carousel-fade .active.carousel-item-end,.profile-body .carousel-fade .active.carousel-item-start{transition:none}}.profile-body .carousel-control-next,.profile-body .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){.profile-body .carousel-control-next,.profile-body .carousel-control-prev{transition:none}}.profile-body .carousel-control-next:focus,.profile-body .carousel-control-next:hover,.profile-body .carousel-control-prev:focus,.profile-body .carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.profile-body .carousel-control-prev{left:0}.profile-body .carousel-control-next{right:0}.profile-body .carousel-control-next-icon,.profile-body .carousel-control-prev-icon{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;display:inline-block;height:2rem;width:2rem}.profile-body .carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3E%3C/svg%3E")}.profile-body .carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3E%3Cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E")}.profile-body .carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;margin-bottom:1rem;margin-left:15%;margin-right:15%;padding:0;position:absolute;right:0;z-index:2}.profile-body .carousel-indicators [data-bs-target]{background-clip:padding-box;background-color:#fff;border:0;border-bottom:10px solid #0000;border-top:10px solid #0000;box-sizing:initial;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;padding:0;text-indent:-999px;transition:opacity .6s ease;width:30px}@media(prefers-reduced-motion:reduce){.profile-body .carousel-indicators [data-bs-target]{transition:none}}.profile-body .carousel-indicators .active{opacity:1}.profile-body .carousel-caption{bottom:1.25rem;color:#fff;left:15%;padding-bottom:1.25rem;padding-top:1.25rem;position:absolute;right:15%;text-align:center}.profile-body .carousel-dark .carousel-control-next-icon,.profile-body .carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.profile-body .carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.profile-body .carousel-dark .carousel-caption{color:#000}.profile-body [data-bs-theme=dark] .carousel .carousel-control-next-icon,.profile-body [data-bs-theme=dark] .carousel .carousel-control-prev-icon,.profile-body [data-bs-theme=dark].carousel .carousel-control-next-icon,.profile-body [data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.profile-body [data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],.profile-body [data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}.profile-body [data-bs-theme=dark] .carousel .carousel-caption,.profile-body [data-bs-theme=dark].carousel .carousel-caption{color:#000}.profile-body .spinner-border,.profile-body .spinner-grow{animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);border-radius:50%;display:inline-block;height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);width:var(--bs-spinner-width)}@keyframes spinner-border{to{transform:rotate(1turn)}}.profile-body .spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border-right-color:currentcolor;border:var(--bs-spinner-border-width) solid;border-right:var(--bs-spinner-border-width) solid #0000}.profile-body .spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.profile-body .spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.profile-body .spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media(prefers-reduced-motion:reduce){.profile-body .spinner-border,.profile-body .spinner-grow{--bs-spinner-animation-speed:1.5s}}.profile-body .offcanvas,.profile-body .offcanvas-lg,.profile-body .offcanvas-md,.profile-body .offcanvas-sm,.profile-body .offcanvas-xl,.profile-body .offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media(max-width:575.98px){.profile-body .offcanvas-sm{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media(max-width:575.98px)and (prefers-reduced-motion:reduce){.profile-body .offcanvas-sm{transition:none}}@media(max-width:575.98px){.profile-body .offcanvas-sm.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;transform:translateX(-100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas-sm.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;transform:translateX(100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas-sm.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;top:0;transform:translateY(-100%)}.profile-body .offcanvas-sm.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;transform:translateY(100%)}.profile-body .offcanvas-sm.show:not(.hiding),.profile-body .offcanvas-sm.showing{transform:none}.profile-body .offcanvas-sm.hiding,.profile-body .offcanvas-sm.show,.profile-body .offcanvas-sm.showing{visibility:visible}}@media(min-width:576px){.profile-body .offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.profile-body .offcanvas-sm .offcanvas-header{display:none}.profile-body .offcanvas-sm .offcanvas-body{background-color:#0000!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(max-width:767.98px){.profile-body .offcanvas-md{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media(max-width:767.98px)and (prefers-reduced-motion:reduce){.profile-body .offcanvas-md{transition:none}}@media(max-width:767.98px){.profile-body .offcanvas-md.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;transform:translateX(-100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas-md.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;transform:translateX(100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas-md.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;top:0;transform:translateY(-100%)}.profile-body .offcanvas-md.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;transform:translateY(100%)}.profile-body .offcanvas-md.show:not(.hiding),.profile-body .offcanvas-md.showing{transform:none}.profile-body .offcanvas-md.hiding,.profile-body .offcanvas-md.show,.profile-body .offcanvas-md.showing{visibility:visible}}@media(min-width:768px){.profile-body .offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.profile-body .offcanvas-md .offcanvas-header{display:none}.profile-body .offcanvas-md .offcanvas-body{background-color:#0000!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(max-width:991.98px){.profile-body .offcanvas-lg{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media(max-width:991.98px)and (prefers-reduced-motion:reduce){.profile-body .offcanvas-lg{transition:none}}@media(max-width:991.98px){.profile-body .offcanvas-lg.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;transform:translateX(-100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas-lg.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;transform:translateX(100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas-lg.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;top:0;transform:translateY(-100%)}.profile-body .offcanvas-lg.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;transform:translateY(100%)}.profile-body .offcanvas-lg.show:not(.hiding),.profile-body .offcanvas-lg.showing{transform:none}.profile-body .offcanvas-lg.hiding,.profile-body .offcanvas-lg.show,.profile-body .offcanvas-lg.showing{visibility:visible}}@media(min-width:992px){.profile-body .offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.profile-body .offcanvas-lg .offcanvas-header{display:none}.profile-body .offcanvas-lg .offcanvas-body{background-color:#0000!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(max-width:1199.98px){.profile-body .offcanvas-xl{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media(max-width:1199.98px)and (prefers-reduced-motion:reduce){.profile-body .offcanvas-xl{transition:none}}@media(max-width:1199.98px){.profile-body .offcanvas-xl.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;transform:translateX(-100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas-xl.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;transform:translateX(100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas-xl.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;top:0;transform:translateY(-100%)}.profile-body .offcanvas-xl.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;transform:translateY(100%)}.profile-body .offcanvas-xl.show:not(.hiding),.profile-body .offcanvas-xl.showing{transform:none}.profile-body .offcanvas-xl.hiding,.profile-body .offcanvas-xl.show,.profile-body .offcanvas-xl.showing{visibility:visible}}@media(min-width:1200px){.profile-body .offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.profile-body .offcanvas-xl .offcanvas-header{display:none}.profile-body .offcanvas-xl .offcanvas-body{background-color:#0000!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media(max-width:1399.98px){.profile-body .offcanvas-xxl{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media(max-width:1399.98px)and (prefers-reduced-motion:reduce){.profile-body .offcanvas-xxl{transition:none}}@media(max-width:1399.98px){.profile-body .offcanvas-xxl.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;transform:translateX(-100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas-xxl.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;transform:translateX(100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas-xxl.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;top:0;transform:translateY(-100%)}.profile-body .offcanvas-xxl.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;transform:translateY(100%)}.profile-body .offcanvas-xxl.show:not(.hiding),.profile-body .offcanvas-xxl.showing{transform:none}.profile-body .offcanvas-xxl.hiding,.profile-body .offcanvas-xxl.show,.profile-body .offcanvas-xxl.showing{visibility:visible}}@media(min-width:1400px){.profile-body .offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.profile-body .offcanvas-xxl .offcanvas-header{display:none}.profile-body .offcanvas-xxl .offcanvas-body{background-color:#0000!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}.profile-body .offcanvas{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}@media(prefers-reduced-motion:reduce){.profile-body .offcanvas{transition:none}}.profile-body .offcanvas.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;transform:translateX(-100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;transform:translateX(100%);width:var(--bs-offcanvas-width)}.profile-body .offcanvas.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;top:0;transform:translateY(-100%)}.profile-body .offcanvas.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0;transform:translateY(100%)}.profile-body .offcanvas.show:not(.hiding),.profile-body .offcanvas.showing{transform:none}.profile-body .offcanvas.hiding,.profile-body .offcanvas.show,.profile-body .offcanvas.showing{visibility:visible}.profile-body .offcanvas-backdrop{background-color:#000;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.profile-body .offcanvas-backdrop.fade{opacity:0}.profile-body .offcanvas-backdrop.show{opacity:.5}.profile-body .offcanvas-header{align-items:center;display:flex;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.profile-body .offcanvas-header .btn-close{margin-bottom:calc(var(--bs-offcanvas-padding-y)*-.5);margin-right:calc(var(--bs-offcanvas-padding-x)*-.5);margin-top:calc(var(--bs-offcanvas-padding-y)*-.5);padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5)}.profile-body .offcanvas-title{line-height:var(--bs-offcanvas-title-line-height);margin-bottom:0}.profile-body .offcanvas-body{flex-grow:1;overflow-y:auto;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.profile-body .placeholder{background-color:currentcolor;cursor:wait;display:inline-block;min-height:1em;opacity:.5;vertical-align:middle}.profile-body .placeholder.btn:before{content:"";display:inline-block}.profile-body .placeholder-xs{min-height:.6em}.profile-body .placeholder-sm{min-height:.8em}.profile-body .placeholder-lg{min-height:1.2em}.profile-body .placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.profile-body .placeholder-wave{animation:placeholder-wave 2s linear infinite;-webkit-mask-image:linear-gradient(130deg,#000 55%,#000c 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,#000c 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0;mask-position:-200% 0}}.profile-body .clearfix:after{clear:both;content:"";display:block}.profile-body .text-bg-primary{background-color:RGBA(var(--bs-primary-rgb),1)!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important;color:#fff!important}.profile-body .text-bg-secondary{background-color:RGBA(var(--bs-secondary-rgb),1)!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important;color:#fff!important}.profile-body .text-bg-success{background-color:RGBA(var(--bs-success-rgb),1)!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important;color:#fff!important}.profile-body .text-bg-info{background-color:RGBA(var(--bs-info-rgb),1)!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important;color:#000!important}.profile-body .text-bg-warning{background-color:RGBA(var(--bs-warning-rgb),1)!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important;color:#000!important}.profile-body .text-bg-danger{background-color:RGBA(var(--bs-danger-rgb),1)!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important;color:#fff!important}.profile-body .text-bg-light{background-color:RGBA(var(--bs-light-rgb),1)!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important;color:#000!important}.profile-body .text-bg-dark{background-color:RGBA(var(--bs-dark-rgb),1)!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important;color:#fff!important}.profile-body .link-primary{color:RGBA(var(--bs-primary-rgb),1)!important;color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),1)!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.profile-body .link-primary:focus,.profile-body .link-primary:hover{color:#0a58ca!important;color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;text-decoration-color:#0a58ca!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.profile-body .link-secondary{color:RGBA(var(--bs-secondary-rgb),1)!important;color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),1)!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.profile-body .link-secondary:focus,.profile-body .link-secondary:hover{color:#565e64!important;color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;text-decoration-color:#565e64!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.profile-body .link-success{color:RGBA(var(--bs-success-rgb),1)!important;color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),1)!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.profile-body .link-success:focus,.profile-body .link-success:hover{color:#146c43!important;color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;text-decoration-color:#146c43!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.profile-body .link-info{color:RGBA(var(--bs-info-rgb),1)!important;color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),1)!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.profile-body .link-info:focus,.profile-body .link-info:hover{color:#3dd5f3!important;color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;text-decoration-color:#3dd5f3!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.profile-body .link-warning{color:RGBA(var(--bs-warning-rgb),1)!important;color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),1)!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.profile-body .link-warning:focus,.profile-body .link-warning:hover{color:#ffcd39!important;color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;text-decoration-color:#ffcd39!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.profile-body .link-danger{color:RGBA(var(--bs-danger-rgb),1)!important;color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),1)!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.profile-body .link-danger:focus,.profile-body .link-danger:hover{color:#b02a37!important;color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;text-decoration-color:#b02a37!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.profile-body .link-light{color:RGBA(var(--bs-light-rgb),1)!important;color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),1)!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.profile-body .link-light:focus,.profile-body .link-light:hover{color:#f9fafb!important;color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;text-decoration-color:#f9fafb!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.profile-body .link-dark{color:RGBA(var(--bs-dark-rgb),1)!important;color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),1)!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.profile-body .link-dark:focus,.profile-body .link-dark:hover{color:#1a1e21!important;color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;text-decoration-color:#1a1e21!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.profile-body .link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),1)!important;color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),1)!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.profile-body .link-body-emphasis:focus,.profile-body .link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),.75)!important;color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),.75)!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important}.profile-body .focus-ring:focus{box-shadow:0 0 0 var(--bs-focus-ring-width) var(--bs-focus-ring-color);box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);outline:0}.profile-body .icon-link{align-items:center;-webkit-backface-visibility:hidden;backface-visibility:hidden;display:inline-flex;gap:.375rem;text-decoration-color:rgba(var(--bs-link-color-rgb),.5);text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-underline-offset:.25em}.profile-body .icon-link>.bi{fill:currentcolor;flex-shrink:0;height:1em;transition:transform .2s ease-in-out;width:1em}@media(prefers-reduced-motion:reduce){.profile-body .icon-link>.bi{transition:none}}.profile-body .icon-link-hover:focus-visible>.bi,.profile-body .icon-link-hover:hover>.bi{transform:translate3d(.25em,0,0);transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.profile-body .ratio{position:relative;width:100%}.profile-body .ratio:before{content:"";display:block;padding-top:var(--bs-aspect-ratio)}.profile-body .ratio>*{height:100%;left:0;position:absolute;top:0;width:100%}.profile-body .ratio-1x1{--bs-aspect-ratio:100%}.profile-body .ratio-4x3{--bs-aspect-ratio:75%}.profile-body .ratio-16x9{--bs-aspect-ratio:56.25%}.profile-body .ratio-21x9{--bs-aspect-ratio:42.8571428571%}.profile-body .fixed-top{left:0;position:fixed;right:0;top:0;z-index:1030}.profile-body .fixed-bottom{bottom:0;left:0;position:fixed;right:0;z-index:1030}.profile-body .sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.profile-body .sticky-bottom{bottom:0;position:-webkit-sticky;position:sticky;z-index:1020}@media(min-width:576px){.profile-body .sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.profile-body .sticky-sm-bottom{bottom:0;position:-webkit-sticky;position:sticky;z-index:1020}}@media(min-width:768px){.profile-body .sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.profile-body .sticky-md-bottom{bottom:0;position:-webkit-sticky;position:sticky;z-index:1020}}@media(min-width:992px){.profile-body .sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.profile-body .sticky-lg-bottom{bottom:0;position:-webkit-sticky;position:sticky;z-index:1020}}@media(min-width:1200px){.profile-body .sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.profile-body .sticky-xl-bottom{bottom:0;position:-webkit-sticky;position:sticky;z-index:1020}}@media(min-width:1400px){.profile-body .sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.profile-body .sticky-xxl-bottom{bottom:0;position:-webkit-sticky;position:sticky;z-index:1020}}.profile-body .hstack{align-items:center;align-self:stretch;display:flex;flex-direction:row}.profile-body .vstack{align-self:stretch;display:flex;flex:1 1 auto;flex-direction:column}.profile-body .visually-hidden,.profile-body .visually-hidden-focusable:not(:focus):not(:focus-within){clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;white-space:nowrap!important;width:1px!important}.profile-body .visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.profile-body .visually-hidden:not(caption){position:absolute!important}.profile-body .stretched-link:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:1}.profile-body .text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profile-body .vr{align-self:stretch;background-color:currentcolor;display:inline-block;min-height:1em;opacity:.25;width:var(--bs-border-width)}.profile-body .align-baseline{vertical-align:initial!important}.profile-body .align-top{vertical-align:top!important}.profile-body .align-middle{vertical-align:middle!important}.profile-body .align-bottom{vertical-align:bottom!important}.profile-body .align-text-bottom{vertical-align:text-bottom!important}.profile-body .align-text-top{vertical-align:text-top!important}.profile-body .float-start{float:left!important}.profile-body .float-end{float:right!important}.profile-body .float-none{float:none!important}.profile-body .object-fit-contain{object-fit:contain!important}.profile-body .object-fit-cover{object-fit:cover!important}.profile-body .object-fit-fill{object-fit:fill!important}.profile-body .object-fit-scale{object-fit:scale-down!important}.profile-body .object-fit-none{object-fit:none!important}.profile-body .opacity-0{opacity:0!important}.profile-body .opacity-25{opacity:.25!important}.profile-body .opacity-50{opacity:.5!important}.profile-body .opacity-75{opacity:.75!important}.profile-body .opacity-100{opacity:1!important}.profile-body .overflow-auto{overflow:auto!important}.profile-body .overflow-hidden{overflow:hidden!important}.profile-body .overflow-visible{overflow:visible!important}.profile-body .overflow-scroll{overflow:scroll!important}.profile-body .overflow-x-auto{overflow-x:auto!important}.profile-body .overflow-x-hidden{overflow-x:hidden!important}.profile-body .overflow-x-visible{overflow-x:visible!important}.profile-body .overflow-x-scroll{overflow-x:scroll!important}.profile-body .overflow-y-auto{overflow-y:auto!important}.profile-body .overflow-y-hidden{overflow-y:hidden!important}.profile-body .overflow-y-visible{overflow-y:visible!important}.profile-body .overflow-y-scroll{overflow-y:scroll!important}.profile-body .d-inline{display:inline!important}.profile-body .d-inline-block{display:inline-block!important}.profile-body .d-block{display:block!important}.profile-body .d-grid{display:grid!important}.profile-body .d-inline-grid{display:inline-grid!important}.profile-body .d-table{display:table!important}.profile-body .d-table-row{display:table-row!important}.profile-body .d-table-cell{display:table-cell!important}.profile-body .d-flex{display:flex!important}.profile-body .d-inline-flex{display:inline-flex!important}.profile-body .d-none{display:none!important}.profile-body .shadow{box-shadow:var(--bs-box-shadow)!important}.profile-body .shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.profile-body .shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.profile-body .shadow-none{box-shadow:none!important}.profile-body .focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb),var(--bs-focus-ring-opacity))}.profile-body .focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb),var(--bs-focus-ring-opacity))}.profile-body .focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb),var(--bs-focus-ring-opacity))}.profile-body .focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb),var(--bs-focus-ring-opacity))}.profile-body .focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb),var(--bs-focus-ring-opacity))}.profile-body .focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb),var(--bs-focus-ring-opacity))}.profile-body .focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb),var(--bs-focus-ring-opacity))}.profile-body .focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb),var(--bs-focus-ring-opacity))}.profile-body .position-static{position:static!important}.profile-body .position-relative{position:relative!important}.profile-body .position-absolute{position:absolute!important}.profile-body .position-fixed{position:fixed!important}.profile-body .position-sticky{position:-webkit-sticky!important;position:sticky!important}.profile-body .top-0{top:0!important}.profile-body .top-50{top:50%!important}.profile-body .top-100{top:100%!important}.profile-body .bottom-0{bottom:0!important}.profile-body .bottom-50{bottom:50%!important}.profile-body .bottom-100{bottom:100%!important}.profile-body .start-0{left:0!important}.profile-body .start-50{left:50%!important}.profile-body .start-100{left:100%!important}.profile-body .end-0{right:0!important}.profile-body .end-50{right:50%!important}.profile-body .end-100{right:100%!important}.profile-body .translate-middle{transform:translate(-50%,-50%)!important}.profile-body .translate-middle-x{transform:translateX(-50%)!important}.profile-body .translate-middle-y{transform:translateY(-50%)!important}.profile-body .border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.profile-body .border-0{border:0!important}.profile-body .border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.profile-body .border-top-0{border-top:0!important}.profile-body .border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.profile-body .border-end-0{border-right:0!important}.profile-body .border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.profile-body .border-bottom-0{border-bottom:0!important}.profile-body .border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.profile-body .border-start-0{border-left:0!important}.profile-body .border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.profile-body .border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.profile-body .border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.profile-body .border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.profile-body .border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.profile-body .border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.profile-body .border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.profile-body .border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.profile-body .border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.profile-body .border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.profile-body .border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.profile-body .border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.profile-body .border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.profile-body .border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.profile-body .border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.profile-body .border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.profile-body .border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.profile-body .border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.profile-body .border-1{border-width:1px!important}.profile-body .border-2{border-width:2px!important}.profile-body .border-3{border-width:3px!important}.profile-body .border-4{border-width:4px!important}.profile-body .border-5{border-width:5px!important}.profile-body .border-opacity-10{--bs-border-opacity:0.1}.profile-body .border-opacity-25{--bs-border-opacity:0.25}.profile-body .border-opacity-50{--bs-border-opacity:0.5}.profile-body .border-opacity-75{--bs-border-opacity:0.75}.profile-body .border-opacity-100{--bs-border-opacity:1}.profile-body .w-25{width:25%!important}.profile-body .w-50{width:50%!important}.profile-body .w-75{width:75%!important}.profile-body .w-100{width:100%!important}.profile-body .w-auto{width:auto!important}.profile-body .mw-100{max-width:100%!important}.profile-body .vw-100{width:100vw!important}.profile-body .min-vw-100{min-width:100vw!important}.profile-body .h-25{height:25%!important}.profile-body .h-50{height:50%!important}.profile-body .h-75{height:75%!important}.profile-body .h-100{height:100%!important}.profile-body .h-auto{height:auto!important}.profile-body .mh-100{max-height:100%!important}.profile-body .vh-100{height:100vh!important}.profile-body .min-vh-100{min-height:100vh!important}.profile-body .flex-fill{flex:1 1 auto!important}.profile-body .flex-row{flex-direction:row!important}.profile-body .flex-column{flex-direction:column!important}.profile-body .flex-row-reverse{flex-direction:row-reverse!important}.profile-body .flex-column-reverse{flex-direction:column-reverse!important}.profile-body .flex-grow-0{flex-grow:0!important}.profile-body .flex-grow-1{flex-grow:1!important}.profile-body .flex-shrink-0{flex-shrink:0!important}.profile-body .flex-shrink-1{flex-shrink:1!important}.profile-body .flex-wrap{flex-wrap:wrap!important}.profile-body .flex-nowrap{flex-wrap:nowrap!important}.profile-body .flex-wrap-reverse{flex-wrap:wrap-reverse!important}.profile-body .justify-content-start{justify-content:flex-start!important}.profile-body .justify-content-end{justify-content:flex-end!important}.profile-body .justify-content-center{justify-content:center!important}.profile-body .justify-content-between{justify-content:space-between!important}.profile-body .justify-content-around{justify-content:space-around!important}.profile-body .justify-content-evenly{justify-content:space-evenly!important}.profile-body .align-items-start{align-items:flex-start!important}.profile-body .align-items-end{align-items:flex-end!important}.profile-body .align-items-center{align-items:center!important}.profile-body .align-items-baseline{align-items:baseline!important}.profile-body .align-items-stretch{align-items:stretch!important}.profile-body .align-content-start{align-content:flex-start!important}.profile-body .align-content-end{align-content:flex-end!important}.profile-body .align-content-center{align-content:center!important}.profile-body .align-content-between{align-content:space-between!important}.profile-body .align-content-around{align-content:space-around!important}.profile-body .align-content-stretch{align-content:stretch!important}.profile-body .align-self-auto{align-self:auto!important}.profile-body .align-self-start{align-self:flex-start!important}.profile-body .align-self-end{align-self:flex-end!important}.profile-body .align-self-center{align-self:center!important}.profile-body .align-self-baseline{align-self:baseline!important}.profile-body .align-self-stretch{align-self:stretch!important}.profile-body .order-first{order:-1!important}.profile-body .order-0{order:0!important}.profile-body .order-1{order:1!important}.profile-body .order-2{order:2!important}.profile-body .order-3{order:3!important}.profile-body .order-4{order:4!important}.profile-body .order-5{order:5!important}.profile-body .order-last{order:6!important}.profile-body .m-0{margin:0!important}.profile-body .m-1{margin:.25rem!important}.profile-body .m-2{margin:.5rem!important}.profile-body .m-3{margin:1rem!important}.profile-body .m-4{margin:1.5rem!important}.profile-body .m-5{margin:3rem!important}.profile-body .m-auto{margin:auto!important}.profile-body .mx-0{margin-left:0!important;margin-right:0!important}.profile-body .mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.profile-body .mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.profile-body .mx-3{margin-left:1rem!important;margin-right:1rem!important}.profile-body .mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.profile-body .mx-5{margin-left:3rem!important;margin-right:3rem!important}.profile-body .mx-auto{margin-left:auto!important;margin-right:auto!important}.profile-body .my-0{margin-bottom:0!important;margin-top:0!important}.profile-body .my-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.profile-body .my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.profile-body .my-3{margin-bottom:1rem!important;margin-top:1rem!important}.profile-body .my-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.profile-body .my-5{margin-bottom:3rem!important;margin-top:3rem!important}.profile-body .my-auto{margin-bottom:auto!important;margin-top:auto!important}.profile-body .mt-0{margin-top:0!important}.profile-body .mt-1{margin-top:.25rem!important}.profile-body .mt-2{margin-top:.5rem!important}.profile-body .mt-3{margin-top:1rem!important}.profile-body .mt-4{margin-top:1.5rem!important}.profile-body .mt-5{margin-top:3rem!important}.profile-body .mt-auto{margin-top:auto!important}.profile-body .me-0{margin-right:0!important}.profile-body .me-1{margin-right:.25rem!important}.profile-body .me-2{margin-right:.5rem!important}.profile-body .me-3{margin-right:1rem!important}.profile-body .me-4{margin-right:1.5rem!important}.profile-body .me-5{margin-right:3rem!important}.profile-body .me-auto{margin-right:auto!important}.profile-body .mb-0{margin-bottom:0!important}.profile-body .mb-1{margin-bottom:.25rem!important}.profile-body .mb-2{margin-bottom:.5rem!important}.profile-body .mb-3{margin-bottom:1rem!important}.profile-body .mb-4{margin-bottom:1.5rem!important}.profile-body .mb-5{margin-bottom:3rem!important}.profile-body .mb-auto{margin-bottom:auto!important}.profile-body .ms-0{margin-left:0!important}.profile-body .ms-1{margin-left:.25rem!important}.profile-body .ms-2{margin-left:.5rem!important}.profile-body .ms-3{margin-left:1rem!important}.profile-body .ms-4{margin-left:1.5rem!important}.profile-body .ms-5{margin-left:3rem!important}.profile-body .ms-auto{margin-left:auto!important}.profile-body .p-0{padding:0!important}.profile-body .p-1{padding:.25rem!important}.profile-body .p-2{padding:.5rem!important}.profile-body .p-3{padding:1rem!important}.profile-body .p-4{padding:1.5rem!important}.profile-body .p-5{padding:3rem!important}.profile-body .px-0{padding-left:0!important;padding-right:0!important}.profile-body .px-1{padding-left:.25rem!important;padding-right:.25rem!important}.profile-body .px-2{padding-left:.5rem!important;padding-right:.5rem!important}.profile-body .px-3{padding-left:1rem!important;padding-right:1rem!important}.profile-body .px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.profile-body .px-5{padding-left:3rem!important;padding-right:3rem!important}.profile-body .py-0{padding-bottom:0!important;padding-top:0!important}.profile-body .py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.profile-body .py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.profile-body .py-3{padding-bottom:1rem!important;padding-top:1rem!important}.profile-body .py-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.profile-body .py-5{padding-bottom:3rem!important;padding-top:3rem!important}.profile-body .pt-0{padding-top:0!important}.profile-body .pt-1{padding-top:.25rem!important}.profile-body .pt-2{padding-top:.5rem!important}.profile-body .pt-3{padding-top:1rem!important}.profile-body .pt-4{padding-top:1.5rem!important}.profile-body .pt-5{padding-top:3rem!important}.profile-body .pe-0{padding-right:0!important}.profile-body .pe-1{padding-right:.25rem!important}.profile-body .pe-2{padding-right:.5rem!important}.profile-body .pe-3{padding-right:1rem!important}.profile-body .pe-4{padding-right:1.5rem!important}.profile-body .pe-5{padding-right:3rem!important}.profile-body .pb-0{padding-bottom:0!important}.profile-body .pb-1{padding-bottom:.25rem!important}.profile-body .pb-2{padding-bottom:.5rem!important}.profile-body .pb-3{padding-bottom:1rem!important}.profile-body .pb-4{padding-bottom:1.5rem!important}.profile-body .pb-5{padding-bottom:3rem!important}.profile-body .ps-0{padding-left:0!important}.profile-body .ps-1{padding-left:.25rem!important}.profile-body .ps-2{padding-left:.5rem!important}.profile-body .ps-3{padding-left:1rem!important}.profile-body .ps-4{padding-left:1.5rem!important}.profile-body .ps-5{padding-left:3rem!important}.profile-body .gap-0{gap:0!important}.profile-body .gap-1{gap:.25rem!important}.profile-body .gap-2{gap:.5rem!important}.profile-body .gap-3{gap:1rem!important}.profile-body .gap-4{gap:1.5rem!important}.profile-body .gap-5{gap:3rem!important}.profile-body .row-gap-0{row-gap:0!important}.profile-body .row-gap-1{row-gap:.25rem!important}.profile-body .row-gap-2{row-gap:.5rem!important}.profile-body .row-gap-3{row-gap:1rem!important}.profile-body .row-gap-4{row-gap:1.5rem!important}.profile-body .row-gap-5{row-gap:3rem!important}.profile-body .column-gap-0{column-gap:0!important}.profile-body .column-gap-1{column-gap:.25rem!important}.profile-body .column-gap-2{column-gap:.5rem!important}.profile-body .column-gap-3{column-gap:1rem!important}.profile-body .column-gap-4{column-gap:1.5rem!important}.profile-body .column-gap-5{column-gap:3rem!important}.profile-body .font-monospace{font-family:var(--bs-font-monospace)!important}.profile-body .fs-1{font-size:calc(1.375rem + 1.5vw)!important}.profile-body .fs-2{font-size:calc(1.325rem + .9vw)!important}.profile-body .fs-3{font-size:calc(1.3rem + .6vw)!important}.profile-body .fs-4{font-size:calc(1.275rem + .3vw)!important}.profile-body .fs-5{font-size:1.25rem!important}.profile-body .fs-6{font-size:1rem!important}.profile-body .fst-italic{font-style:italic!important}.profile-body .fst-normal{font-style:normal!important}.profile-body .fw-lighter{font-weight:lighter!important}.profile-body .fw-light{font-weight:300!important}.profile-body .fw-normal{font-weight:400!important}.profile-body .fw-medium{font-weight:500!important}.profile-body .fw-semibold{font-weight:600!important}.profile-body .fw-bold{font-weight:700!important}.profile-body .fw-bolder{font-weight:bolder!important}.profile-body .lh-1{line-height:1!important}.profile-body .lh-sm{line-height:1.25!important}.profile-body .lh-base{line-height:1.5!important}.profile-body .lh-lg{line-height:2!important}.profile-body .text-start{text-align:left!important}.profile-body .text-end{text-align:right!important}.profile-body .text-center{text-align:center!important}.profile-body .text-decoration-none{text-decoration:none!important}.profile-body .text-decoration-underline{text-decoration:underline!important}.profile-body .text-decoration-line-through{text-decoration:line-through!important}.profile-body .text-lowercase{text-transform:lowercase!important}.profile-body .text-uppercase{text-transform:uppercase!important}.profile-body .text-capitalize{text-transform:capitalize!important}.profile-body .text-wrap{white-space:normal!important}.profile-body .text-nowrap{white-space:nowrap!important}.profile-body .text-break{word-wrap:break-word!important;word-break:break-word!important}.profile-body .text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.profile-body .text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.profile-body .text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.profile-body .text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.profile-body .text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.profile-body .text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.profile-body .text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.profile-body .text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.profile-body .text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.profile-body .text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.profile-body .text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.profile-body .text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.profile-body .text-black-50{--bs-text-opacity:1;color:#00000080!important}.profile-body .text-white-50{--bs-text-opacity:1;color:#ffffff80!important}.profile-body .text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.profile-body .text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.profile-body .text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.profile-body .text-reset{--bs-text-opacity:1;color:inherit!important}.profile-body .text-opacity-25{--bs-text-opacity:0.25}.profile-body .text-opacity-50{--bs-text-opacity:0.5}.profile-body .text-opacity-75{--bs-text-opacity:0.75}.profile-body .text-opacity-100{--bs-text-opacity:1}.profile-body .text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.profile-body .text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.profile-body .text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.profile-body .text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.profile-body .text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.profile-body .text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.profile-body .text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.profile-body .text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.profile-body .link-opacity-10,.profile-body .link-opacity-10-hover:hover{--bs-link-opacity:0.1}.profile-body .link-opacity-25,.profile-body .link-opacity-25-hover:hover{--bs-link-opacity:0.25}.profile-body .link-opacity-50,.profile-body .link-opacity-50-hover:hover{--bs-link-opacity:0.5}.profile-body .link-opacity-75,.profile-body .link-opacity-75-hover:hover{--bs-link-opacity:0.75}.profile-body .link-opacity-100,.profile-body .link-opacity-100-hover:hover{--bs-link-opacity:1}.profile-body .link-offset-1,.profile-body .link-offset-1-hover:hover{text-underline-offset:.125em!important}.profile-body .link-offset-2,.profile-body .link-offset-2-hover:hover{text-underline-offset:.25em!important}.profile-body .link-offset-3,.profile-body .link-offset-3-hover:hover{text-underline-offset:.375em!important}.profile-body .link-underline-primary{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.profile-body .link-underline-secondary{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.profile-body .link-underline-success{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.profile-body .link-underline-info{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.profile-body .link-underline-warning{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.profile-body .link-underline-danger{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.profile-body .link-underline-light{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.profile-body .link-underline-dark{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.profile-body .link-underline{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-link-color-rgb),1)!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.profile-body .link-underline-opacity-0,.profile-body .link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.profile-body .link-underline-opacity-10,.profile-body .link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.profile-body .link-underline-opacity-25,.profile-body .link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.profile-body .link-underline-opacity-50,.profile-body .link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.profile-body .link-underline-opacity-75,.profile-body .link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.profile-body .link-underline-opacity-100,.profile-body .link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.profile-body .bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-transparent{--bs-bg-opacity:1;background-color:#0000!important}.profile-body .bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.profile-body .bg-opacity-10{--bs-bg-opacity:0.1}.profile-body .bg-opacity-25{--bs-bg-opacity:0.25}.profile-body .bg-opacity-50{--bs-bg-opacity:0.5}.profile-body .bg-opacity-75{--bs-bg-opacity:0.75}.profile-body .bg-opacity-100{--bs-bg-opacity:1}.profile-body .bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.profile-body .bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.profile-body .bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.profile-body .bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.profile-body .bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.profile-body .bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.profile-body .bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.profile-body .bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.profile-body .bg-gradient{background-image:var(--bs-gradient)!important}.profile-body .user-select-all{-webkit-user-select:all!important;user-select:all!important}.profile-body .user-select-auto{-webkit-user-select:auto!important;user-select:auto!important}.profile-body .user-select-none{-webkit-user-select:none!important;user-select:none!important}.profile-body .pe-none{pointer-events:none!important}.profile-body .pe-auto{pointer-events:auto!important}.profile-body .rounded{border-radius:var(--bs-border-radius)!important}.profile-body .rounded-0{border-radius:0!important}.profile-body .rounded-1{border-radius:var(--bs-border-radius-sm)!important}.profile-body .rounded-2{border-radius:var(--bs-border-radius)!important}.profile-body .rounded-3{border-radius:var(--bs-border-radius-lg)!important}.profile-body .rounded-4{border-radius:var(--bs-border-radius-xl)!important}.profile-body .rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.profile-body .rounded-circle{border-radius:50%!important}.profile-body .rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.profile-body .rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.profile-body .rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.profile-body .rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.profile-body .rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.profile-body .rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.profile-body .rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.profile-body .rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.profile-body .rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.profile-body .rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.profile-body .rounded-end{border-bottom-right-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.profile-body .rounded-end-0{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.profile-body .rounded-end-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.profile-body .rounded-end-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.profile-body .rounded-end-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.profile-body .rounded-end-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.profile-body .rounded-end-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.profile-body .rounded-end-circle{border-bottom-right-radius:50%!important;border-top-right-radius:50%!important}.profile-body .rounded-end-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.profile-body .rounded-bottom{border-bottom-left-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.profile-body .rounded-bottom-0{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.profile-body .rounded-bottom-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.profile-body .rounded-bottom-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.profile-body .rounded-bottom-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.profile-body .rounded-bottom-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.profile-body .rounded-bottom-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.profile-body .rounded-bottom-circle{border-bottom-left-radius:50%!important;border-bottom-right-radius:50%!important}.profile-body .rounded-bottom-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.profile-body .rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.profile-body .rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.profile-body .rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.profile-body .rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.profile-body .rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.profile-body .rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.profile-body .rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.profile-body .rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.profile-body .rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.profile-body .visible{visibility:visible!important}.profile-body .invisible{visibility:hidden!important}.profile-body .z-n1{z-index:-1!important}.profile-body .z-0{z-index:0!important}.profile-body .z-1{z-index:1!important}.profile-body .z-2{z-index:2!important}.profile-body .z-3{z-index:3!important}@media(min-width:576px){.profile-body .float-sm-start{float:left!important}.profile-body .float-sm-end{float:right!important}.profile-body .float-sm-none{float:none!important}.profile-body .object-fit-sm-contain{object-fit:contain!important}.profile-body .object-fit-sm-cover{object-fit:cover!important}.profile-body .object-fit-sm-fill{object-fit:fill!important}.profile-body .object-fit-sm-scale{object-fit:scale-down!important}.profile-body .object-fit-sm-none{object-fit:none!important}.profile-body .d-sm-inline{display:inline!important}.profile-body .d-sm-inline-block{display:inline-block!important}.profile-body .d-sm-block{display:block!important}.profile-body .d-sm-grid{display:grid!important}.profile-body .d-sm-inline-grid{display:inline-grid!important}.profile-body .d-sm-table{display:table!important}.profile-body .d-sm-table-row{display:table-row!important}.profile-body .d-sm-table-cell{display:table-cell!important}.profile-body .d-sm-flex{display:flex!important}.profile-body .d-sm-inline-flex{display:inline-flex!important}.profile-body .d-sm-none{display:none!important}.profile-body .flex-sm-fill{flex:1 1 auto!important}.profile-body .flex-sm-row{flex-direction:row!important}.profile-body .flex-sm-column{flex-direction:column!important}.profile-body .flex-sm-row-reverse{flex-direction:row-reverse!important}.profile-body .flex-sm-column-reverse{flex-direction:column-reverse!important}.profile-body .flex-sm-grow-0{flex-grow:0!important}.profile-body .flex-sm-grow-1{flex-grow:1!important}.profile-body .flex-sm-shrink-0{flex-shrink:0!important}.profile-body .flex-sm-shrink-1{flex-shrink:1!important}.profile-body .flex-sm-wrap{flex-wrap:wrap!important}.profile-body .flex-sm-nowrap{flex-wrap:nowrap!important}.profile-body .flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.profile-body .justify-content-sm-start{justify-content:flex-start!important}.profile-body .justify-content-sm-end{justify-content:flex-end!important}.profile-body .justify-content-sm-center{justify-content:center!important}.profile-body .justify-content-sm-between{justify-content:space-between!important}.profile-body .justify-content-sm-around{justify-content:space-around!important}.profile-body .justify-content-sm-evenly{justify-content:space-evenly!important}.profile-body .align-items-sm-start{align-items:flex-start!important}.profile-body .align-items-sm-end{align-items:flex-end!important}.profile-body .align-items-sm-center{align-items:center!important}.profile-body .align-items-sm-baseline{align-items:baseline!important}.profile-body .align-items-sm-stretch{align-items:stretch!important}.profile-body .align-content-sm-start{align-content:flex-start!important}.profile-body .align-content-sm-end{align-content:flex-end!important}.profile-body .align-content-sm-center{align-content:center!important}.profile-body .align-content-sm-between{align-content:space-between!important}.profile-body .align-content-sm-around{align-content:space-around!important}.profile-body .align-content-sm-stretch{align-content:stretch!important}.profile-body .align-self-sm-auto{align-self:auto!important}.profile-body .align-self-sm-start{align-self:flex-start!important}.profile-body .align-self-sm-end{align-self:flex-end!important}.profile-body .align-self-sm-center{align-self:center!important}.profile-body .align-self-sm-baseline{align-self:baseline!important}.profile-body .align-self-sm-stretch{align-self:stretch!important}.profile-body .order-sm-first{order:-1!important}.profile-body .order-sm-0{order:0!important}.profile-body .order-sm-1{order:1!important}.profile-body .order-sm-2{order:2!important}.profile-body .order-sm-3{order:3!important}.profile-body .order-sm-4{order:4!important}.profile-body .order-sm-5{order:5!important}.profile-body .order-sm-last{order:6!important}.profile-body .m-sm-0{margin:0!important}.profile-body .m-sm-1{margin:.25rem!important}.profile-body .m-sm-2{margin:.5rem!important}.profile-body .m-sm-3{margin:1rem!important}.profile-body .m-sm-4{margin:1.5rem!important}.profile-body .m-sm-5{margin:3rem!important}.profile-body .m-sm-auto{margin:auto!important}.profile-body .mx-sm-0{margin-left:0!important;margin-right:0!important}.profile-body .mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.profile-body .mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.profile-body .mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.profile-body .mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.profile-body .mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.profile-body .mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.profile-body .my-sm-0{margin-bottom:0!important;margin-top:0!important}.profile-body .my-sm-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.profile-body .my-sm-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.profile-body .my-sm-3{margin-bottom:1rem!important;margin-top:1rem!important}.profile-body .my-sm-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.profile-body .my-sm-5{margin-bottom:3rem!important;margin-top:3rem!important}.profile-body .my-sm-auto{margin-bottom:auto!important;margin-top:auto!important}.profile-body .mt-sm-0{margin-top:0!important}.profile-body .mt-sm-1{margin-top:.25rem!important}.profile-body .mt-sm-2{margin-top:.5rem!important}.profile-body .mt-sm-3{margin-top:1rem!important}.profile-body .mt-sm-4{margin-top:1.5rem!important}.profile-body .mt-sm-5{margin-top:3rem!important}.profile-body .mt-sm-auto{margin-top:auto!important}.profile-body .me-sm-0{margin-right:0!important}.profile-body .me-sm-1{margin-right:.25rem!important}.profile-body .me-sm-2{margin-right:.5rem!important}.profile-body .me-sm-3{margin-right:1rem!important}.profile-body .me-sm-4{margin-right:1.5rem!important}.profile-body .me-sm-5{margin-right:3rem!important}.profile-body .me-sm-auto{margin-right:auto!important}.profile-body .mb-sm-0{margin-bottom:0!important}.profile-body .mb-sm-1{margin-bottom:.25rem!important}.profile-body .mb-sm-2{margin-bottom:.5rem!important}.profile-body .mb-sm-3{margin-bottom:1rem!important}.profile-body .mb-sm-4{margin-bottom:1.5rem!important}.profile-body .mb-sm-5{margin-bottom:3rem!important}.profile-body .mb-sm-auto{margin-bottom:auto!important}.profile-body .ms-sm-0{margin-left:0!important}.profile-body .ms-sm-1{margin-left:.25rem!important}.profile-body .ms-sm-2{margin-left:.5rem!important}.profile-body .ms-sm-3{margin-left:1rem!important}.profile-body .ms-sm-4{margin-left:1.5rem!important}.profile-body .ms-sm-5{margin-left:3rem!important}.profile-body .ms-sm-auto{margin-left:auto!important}.profile-body .p-sm-0{padding:0!important}.profile-body .p-sm-1{padding:.25rem!important}.profile-body .p-sm-2{padding:.5rem!important}.profile-body .p-sm-3{padding:1rem!important}.profile-body .p-sm-4{padding:1.5rem!important}.profile-body .p-sm-5{padding:3rem!important}.profile-body .px-sm-0{padding-left:0!important;padding-right:0!important}.profile-body .px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.profile-body .px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.profile-body .px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.profile-body .px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.profile-body .px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.profile-body .py-sm-0{padding-bottom:0!important;padding-top:0!important}.profile-body .py-sm-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.profile-body .py-sm-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.profile-body .py-sm-3{padding-bottom:1rem!important;padding-top:1rem!important}.profile-body .py-sm-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.profile-body .py-sm-5{padding-bottom:3rem!important;padding-top:3rem!important}.profile-body .pt-sm-0{padding-top:0!important}.profile-body .pt-sm-1{padding-top:.25rem!important}.profile-body .pt-sm-2{padding-top:.5rem!important}.profile-body .pt-sm-3{padding-top:1rem!important}.profile-body .pt-sm-4{padding-top:1.5rem!important}.profile-body .pt-sm-5{padding-top:3rem!important}.profile-body .pe-sm-0{padding-right:0!important}.profile-body .pe-sm-1{padding-right:.25rem!important}.profile-body .pe-sm-2{padding-right:.5rem!important}.profile-body .pe-sm-3{padding-right:1rem!important}.profile-body .pe-sm-4{padding-right:1.5rem!important}.profile-body .pe-sm-5{padding-right:3rem!important}.profile-body .pb-sm-0{padding-bottom:0!important}.profile-body .pb-sm-1{padding-bottom:.25rem!important}.profile-body .pb-sm-2{padding-bottom:.5rem!important}.profile-body .pb-sm-3{padding-bottom:1rem!important}.profile-body .pb-sm-4{padding-bottom:1.5rem!important}.profile-body .pb-sm-5{padding-bottom:3rem!important}.profile-body .ps-sm-0{padding-left:0!important}.profile-body .ps-sm-1{padding-left:.25rem!important}.profile-body .ps-sm-2{padding-left:.5rem!important}.profile-body .ps-sm-3{padding-left:1rem!important}.profile-body .ps-sm-4{padding-left:1.5rem!important}.profile-body .ps-sm-5{padding-left:3rem!important}.profile-body .gap-sm-0{gap:0!important}.profile-body .gap-sm-1{gap:.25rem!important}.profile-body .gap-sm-2{gap:.5rem!important}.profile-body .gap-sm-3{gap:1rem!important}.profile-body .gap-sm-4{gap:1.5rem!important}.profile-body .gap-sm-5{gap:3rem!important}.profile-body .row-gap-sm-0{row-gap:0!important}.profile-body .row-gap-sm-1{row-gap:.25rem!important}.profile-body .row-gap-sm-2{row-gap:.5rem!important}.profile-body .row-gap-sm-3{row-gap:1rem!important}.profile-body .row-gap-sm-4{row-gap:1.5rem!important}.profile-body .row-gap-sm-5{row-gap:3rem!important}.profile-body .column-gap-sm-0{column-gap:0!important}.profile-body .column-gap-sm-1{column-gap:.25rem!important}.profile-body .column-gap-sm-2{column-gap:.5rem!important}.profile-body .column-gap-sm-3{column-gap:1rem!important}.profile-body .column-gap-sm-4{column-gap:1.5rem!important}.profile-body .column-gap-sm-5{column-gap:3rem!important}.profile-body .text-sm-start{text-align:left!important}.profile-body .text-sm-end{text-align:right!important}.profile-body .text-sm-center{text-align:center!important}}@media(min-width:768px){.profile-body .float-md-start{float:left!important}.profile-body .float-md-end{float:right!important}.profile-body .float-md-none{float:none!important}.profile-body .object-fit-md-contain{object-fit:contain!important}.profile-body .object-fit-md-cover{object-fit:cover!important}.profile-body .object-fit-md-fill{object-fit:fill!important}.profile-body .object-fit-md-scale{object-fit:scale-down!important}.profile-body .object-fit-md-none{object-fit:none!important}.profile-body .d-md-inline{display:inline!important}.profile-body .d-md-inline-block{display:inline-block!important}.profile-body .d-md-block{display:block!important}.profile-body .d-md-grid{display:grid!important}.profile-body .d-md-inline-grid{display:inline-grid!important}.profile-body .d-md-table{display:table!important}.profile-body .d-md-table-row{display:table-row!important}.profile-body .d-md-table-cell{display:table-cell!important}.profile-body .d-md-flex{display:flex!important}.profile-body .d-md-inline-flex{display:inline-flex!important}.profile-body .d-md-none{display:none!important}.profile-body .flex-md-fill{flex:1 1 auto!important}.profile-body .flex-md-row{flex-direction:row!important}.profile-body .flex-md-column{flex-direction:column!important}.profile-body .flex-md-row-reverse{flex-direction:row-reverse!important}.profile-body .flex-md-column-reverse{flex-direction:column-reverse!important}.profile-body .flex-md-grow-0{flex-grow:0!important}.profile-body .flex-md-grow-1{flex-grow:1!important}.profile-body .flex-md-shrink-0{flex-shrink:0!important}.profile-body .flex-md-shrink-1{flex-shrink:1!important}.profile-body .flex-md-wrap{flex-wrap:wrap!important}.profile-body .flex-md-nowrap{flex-wrap:nowrap!important}.profile-body .flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.profile-body .justify-content-md-start{justify-content:flex-start!important}.profile-body .justify-content-md-end{justify-content:flex-end!important}.profile-body .justify-content-md-center{justify-content:center!important}.profile-body .justify-content-md-between{justify-content:space-between!important}.profile-body .justify-content-md-around{justify-content:space-around!important}.profile-body .justify-content-md-evenly{justify-content:space-evenly!important}.profile-body .align-items-md-start{align-items:flex-start!important}.profile-body .align-items-md-end{align-items:flex-end!important}.profile-body .align-items-md-center{align-items:center!important}.profile-body .align-items-md-baseline{align-items:baseline!important}.profile-body .align-items-md-stretch{align-items:stretch!important}.profile-body .align-content-md-start{align-content:flex-start!important}.profile-body .align-content-md-end{align-content:flex-end!important}.profile-body .align-content-md-center{align-content:center!important}.profile-body .align-content-md-between{align-content:space-between!important}.profile-body .align-content-md-around{align-content:space-around!important}.profile-body .align-content-md-stretch{align-content:stretch!important}.profile-body .align-self-md-auto{align-self:auto!important}.profile-body .align-self-md-start{align-self:flex-start!important}.profile-body .align-self-md-end{align-self:flex-end!important}.profile-body .align-self-md-center{align-self:center!important}.profile-body .align-self-md-baseline{align-self:baseline!important}.profile-body .align-self-md-stretch{align-self:stretch!important}.profile-body .order-md-first{order:-1!important}.profile-body .order-md-0{order:0!important}.profile-body .order-md-1{order:1!important}.profile-body .order-md-2{order:2!important}.profile-body .order-md-3{order:3!important}.profile-body .order-md-4{order:4!important}.profile-body .order-md-5{order:5!important}.profile-body .order-md-last{order:6!important}.profile-body .m-md-0{margin:0!important}.profile-body .m-md-1{margin:.25rem!important}.profile-body .m-md-2{margin:.5rem!important}.profile-body .m-md-3{margin:1rem!important}.profile-body .m-md-4{margin:1.5rem!important}.profile-body .m-md-5{margin:3rem!important}.profile-body .m-md-auto{margin:auto!important}.profile-body .mx-md-0{margin-left:0!important;margin-right:0!important}.profile-body .mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.profile-body .mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.profile-body .mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.profile-body .mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.profile-body .mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.profile-body .mx-md-auto{margin-left:auto!important;margin-right:auto!important}.profile-body .my-md-0{margin-bottom:0!important;margin-top:0!important}.profile-body .my-md-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.profile-body .my-md-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.profile-body .my-md-3{margin-bottom:1rem!important;margin-top:1rem!important}.profile-body .my-md-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.profile-body .my-md-5{margin-bottom:3rem!important;margin-top:3rem!important}.profile-body .my-md-auto{margin-bottom:auto!important;margin-top:auto!important}.profile-body .mt-md-0{margin-top:0!important}.profile-body .mt-md-1{margin-top:.25rem!important}.profile-body .mt-md-2{margin-top:.5rem!important}.profile-body .mt-md-3{margin-top:1rem!important}.profile-body .mt-md-4{margin-top:1.5rem!important}.profile-body .mt-md-5{margin-top:3rem!important}.profile-body .mt-md-auto{margin-top:auto!important}.profile-body .me-md-0{margin-right:0!important}.profile-body .me-md-1{margin-right:.25rem!important}.profile-body .me-md-2{margin-right:.5rem!important}.profile-body .me-md-3{margin-right:1rem!important}.profile-body .me-md-4{margin-right:1.5rem!important}.profile-body .me-md-5{margin-right:3rem!important}.profile-body .me-md-auto{margin-right:auto!important}.profile-body .mb-md-0{margin-bottom:0!important}.profile-body .mb-md-1{margin-bottom:.25rem!important}.profile-body .mb-md-2{margin-bottom:.5rem!important}.profile-body .mb-md-3{margin-bottom:1rem!important}.profile-body .mb-md-4{margin-bottom:1.5rem!important}.profile-body .mb-md-5{margin-bottom:3rem!important}.profile-body .mb-md-auto{margin-bottom:auto!important}.profile-body .ms-md-0{margin-left:0!important}.profile-body .ms-md-1{margin-left:.25rem!important}.profile-body .ms-md-2{margin-left:.5rem!important}.profile-body .ms-md-3{margin-left:1rem!important}.profile-body .ms-md-4{margin-left:1.5rem!important}.profile-body .ms-md-5{margin-left:3rem!important}.profile-body .ms-md-auto{margin-left:auto!important}.profile-body .p-md-0{padding:0!important}.profile-body .p-md-1{padding:.25rem!important}.profile-body .p-md-2{padding:.5rem!important}.profile-body .p-md-3{padding:1rem!important}.profile-body .p-md-4{padding:1.5rem!important}.profile-body .p-md-5{padding:3rem!important}.profile-body .px-md-0{padding-left:0!important;padding-right:0!important}.profile-body .px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.profile-body .px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.profile-body .px-md-3{padding-left:1rem!important;padding-right:1rem!important}.profile-body .px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.profile-body .px-md-5{padding-left:3rem!important;padding-right:3rem!important}.profile-body .py-md-0{padding-bottom:0!important;padding-top:0!important}.profile-body .py-md-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.profile-body .py-md-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.profile-body .py-md-3{padding-bottom:1rem!important;padding-top:1rem!important}.profile-body .py-md-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.profile-body .py-md-5{padding-bottom:3rem!important;padding-top:3rem!important}.profile-body .pt-md-0{padding-top:0!important}.profile-body .pt-md-1{padding-top:.25rem!important}.profile-body .pt-md-2{padding-top:.5rem!important}.profile-body .pt-md-3{padding-top:1rem!important}.profile-body .pt-md-4{padding-top:1.5rem!important}.profile-body .pt-md-5{padding-top:3rem!important}.profile-body .pe-md-0{padding-right:0!important}.profile-body .pe-md-1{padding-right:.25rem!important}.profile-body .pe-md-2{padding-right:.5rem!important}.profile-body .pe-md-3{padding-right:1rem!important}.profile-body .pe-md-4{padding-right:1.5rem!important}.profile-body .pe-md-5{padding-right:3rem!important}.profile-body .pb-md-0{padding-bottom:0!important}.profile-body .pb-md-1{padding-bottom:.25rem!important}.profile-body .pb-md-2{padding-bottom:.5rem!important}.profile-body .pb-md-3{padding-bottom:1rem!important}.profile-body .pb-md-4{padding-bottom:1.5rem!important}.profile-body .pb-md-5{padding-bottom:3rem!important}.profile-body .ps-md-0{padding-left:0!important}.profile-body .ps-md-1{padding-left:.25rem!important}.profile-body .ps-md-2{padding-left:.5rem!important}.profile-body .ps-md-3{padding-left:1rem!important}.profile-body .ps-md-4{padding-left:1.5rem!important}.profile-body .ps-md-5{padding-left:3rem!important}.profile-body .gap-md-0{gap:0!important}.profile-body .gap-md-1{gap:.25rem!important}.profile-body .gap-md-2{gap:.5rem!important}.profile-body .gap-md-3{gap:1rem!important}.profile-body .gap-md-4{gap:1.5rem!important}.profile-body .gap-md-5{gap:3rem!important}.profile-body .row-gap-md-0{row-gap:0!important}.profile-body .row-gap-md-1{row-gap:.25rem!important}.profile-body .row-gap-md-2{row-gap:.5rem!important}.profile-body .row-gap-md-3{row-gap:1rem!important}.profile-body .row-gap-md-4{row-gap:1.5rem!important}.profile-body .row-gap-md-5{row-gap:3rem!important}.profile-body .column-gap-md-0{column-gap:0!important}.profile-body .column-gap-md-1{column-gap:.25rem!important}.profile-body .column-gap-md-2{column-gap:.5rem!important}.profile-body .column-gap-md-3{column-gap:1rem!important}.profile-body .column-gap-md-4{column-gap:1.5rem!important}.profile-body .column-gap-md-5{column-gap:3rem!important}.profile-body .text-md-start{text-align:left!important}.profile-body .text-md-end{text-align:right!important}.profile-body .text-md-center{text-align:center!important}}@media(min-width:992px){.profile-body .float-lg-start{float:left!important}.profile-body .float-lg-end{float:right!important}.profile-body .float-lg-none{float:none!important}.profile-body .object-fit-lg-contain{object-fit:contain!important}.profile-body .object-fit-lg-cover{object-fit:cover!important}.profile-body .object-fit-lg-fill{object-fit:fill!important}.profile-body .object-fit-lg-scale{object-fit:scale-down!important}.profile-body .object-fit-lg-none{object-fit:none!important}.profile-body .d-lg-inline{display:inline!important}.profile-body .d-lg-inline-block{display:inline-block!important}.profile-body .d-lg-block{display:block!important}.profile-body .d-lg-grid{display:grid!important}.profile-body .d-lg-inline-grid{display:inline-grid!important}.profile-body .d-lg-table{display:table!important}.profile-body .d-lg-table-row{display:table-row!important}.profile-body .d-lg-table-cell{display:table-cell!important}.profile-body .d-lg-flex{display:flex!important}.profile-body .d-lg-inline-flex{display:inline-flex!important}.profile-body .d-lg-none{display:none!important}.profile-body .flex-lg-fill{flex:1 1 auto!important}.profile-body .flex-lg-row{flex-direction:row!important}.profile-body .flex-lg-column{flex-direction:column!important}.profile-body .flex-lg-row-reverse{flex-direction:row-reverse!important}.profile-body .flex-lg-column-reverse{flex-direction:column-reverse!important}.profile-body .flex-lg-grow-0{flex-grow:0!important}.profile-body .flex-lg-grow-1{flex-grow:1!important}.profile-body .flex-lg-shrink-0{flex-shrink:0!important}.profile-body .flex-lg-shrink-1{flex-shrink:1!important}.profile-body .flex-lg-wrap{flex-wrap:wrap!important}.profile-body .flex-lg-nowrap{flex-wrap:nowrap!important}.profile-body .flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.profile-body .justify-content-lg-start{justify-content:flex-start!important}.profile-body .justify-content-lg-end{justify-content:flex-end!important}.profile-body .justify-content-lg-center{justify-content:center!important}.profile-body .justify-content-lg-between{justify-content:space-between!important}.profile-body .justify-content-lg-around{justify-content:space-around!important}.profile-body .justify-content-lg-evenly{justify-content:space-evenly!important}.profile-body .align-items-lg-start{align-items:flex-start!important}.profile-body .align-items-lg-end{align-items:flex-end!important}.profile-body .align-items-lg-center{align-items:center!important}.profile-body .align-items-lg-baseline{align-items:baseline!important}.profile-body .align-items-lg-stretch{align-items:stretch!important}.profile-body .align-content-lg-start{align-content:flex-start!important}.profile-body .align-content-lg-end{align-content:flex-end!important}.profile-body .align-content-lg-center{align-content:center!important}.profile-body .align-content-lg-between{align-content:space-between!important}.profile-body .align-content-lg-around{align-content:space-around!important}.profile-body .align-content-lg-stretch{align-content:stretch!important}.profile-body .align-self-lg-auto{align-self:auto!important}.profile-body .align-self-lg-start{align-self:flex-start!important}.profile-body .align-self-lg-end{align-self:flex-end!important}.profile-body .align-self-lg-center{align-self:center!important}.profile-body .align-self-lg-baseline{align-self:baseline!important}.profile-body .align-self-lg-stretch{align-self:stretch!important}.profile-body .order-lg-first{order:-1!important}.profile-body .order-lg-0{order:0!important}.profile-body .order-lg-1{order:1!important}.profile-body .order-lg-2{order:2!important}.profile-body .order-lg-3{order:3!important}.profile-body .order-lg-4{order:4!important}.profile-body .order-lg-5{order:5!important}.profile-body .order-lg-last{order:6!important}.profile-body .m-lg-0{margin:0!important}.profile-body .m-lg-1{margin:.25rem!important}.profile-body .m-lg-2{margin:.5rem!important}.profile-body .m-lg-3{margin:1rem!important}.profile-body .m-lg-4{margin:1.5rem!important}.profile-body .m-lg-5{margin:3rem!important}.profile-body .m-lg-auto{margin:auto!important}.profile-body .mx-lg-0{margin-left:0!important;margin-right:0!important}.profile-body .mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.profile-body .mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.profile-body .mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.profile-body .mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.profile-body .mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.profile-body .mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.profile-body .my-lg-0{margin-bottom:0!important;margin-top:0!important}.profile-body .my-lg-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.profile-body .my-lg-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.profile-body .my-lg-3{margin-bottom:1rem!important;margin-top:1rem!important}.profile-body .my-lg-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.profile-body .my-lg-5{margin-bottom:3rem!important;margin-top:3rem!important}.profile-body .my-lg-auto{margin-bottom:auto!important;margin-top:auto!important}.profile-body .mt-lg-0{margin-top:0!important}.profile-body .mt-lg-1{margin-top:.25rem!important}.profile-body .mt-lg-2{margin-top:.5rem!important}.profile-body .mt-lg-3{margin-top:1rem!important}.profile-body .mt-lg-4{margin-top:1.5rem!important}.profile-body .mt-lg-5{margin-top:3rem!important}.profile-body .mt-lg-auto{margin-top:auto!important}.profile-body .me-lg-0{margin-right:0!important}.profile-body .me-lg-1{margin-right:.25rem!important}.profile-body .me-lg-2{margin-right:.5rem!important}.profile-body .me-lg-3{margin-right:1rem!important}.profile-body .me-lg-4{margin-right:1.5rem!important}.profile-body .me-lg-5{margin-right:3rem!important}.profile-body .me-lg-auto{margin-right:auto!important}.profile-body .mb-lg-0{margin-bottom:0!important}.profile-body .mb-lg-1{margin-bottom:.25rem!important}.profile-body .mb-lg-2{margin-bottom:.5rem!important}.profile-body .mb-lg-3{margin-bottom:1rem!important}.profile-body .mb-lg-4{margin-bottom:1.5rem!important}.profile-body .mb-lg-5{margin-bottom:3rem!important}.profile-body .mb-lg-auto{margin-bottom:auto!important}.profile-body .ms-lg-0{margin-left:0!important}.profile-body .ms-lg-1{margin-left:.25rem!important}.profile-body .ms-lg-2{margin-left:.5rem!important}.profile-body .ms-lg-3{margin-left:1rem!important}.profile-body .ms-lg-4{margin-left:1.5rem!important}.profile-body .ms-lg-5{margin-left:3rem!important}.profile-body .ms-lg-auto{margin-left:auto!important}.profile-body .p-lg-0{padding:0!important}.profile-body .p-lg-1{padding:.25rem!important}.profile-body .p-lg-2{padding:.5rem!important}.profile-body .p-lg-3{padding:1rem!important}.profile-body .p-lg-4{padding:1.5rem!important}.profile-body .p-lg-5{padding:3rem!important}.profile-body .px-lg-0{padding-left:0!important;padding-right:0!important}.profile-body .px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.profile-body .px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.profile-body .px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.profile-body .px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.profile-body .px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.profile-body .py-lg-0{padding-bottom:0!important;padding-top:0!important}.profile-body .py-lg-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.profile-body .py-lg-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.profile-body .py-lg-3{padding-bottom:1rem!important;padding-top:1rem!important}.profile-body .py-lg-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.profile-body .py-lg-5{padding-bottom:3rem!important;padding-top:3rem!important}.profile-body .pt-lg-0{padding-top:0!important}.profile-body .pt-lg-1{padding-top:.25rem!important}.profile-body .pt-lg-2{padding-top:.5rem!important}.profile-body .pt-lg-3{padding-top:1rem!important}.profile-body .pt-lg-4{padding-top:1.5rem!important}.profile-body .pt-lg-5{padding-top:3rem!important}.profile-body .pe-lg-0{padding-right:0!important}.profile-body .pe-lg-1{padding-right:.25rem!important}.profile-body .pe-lg-2{padding-right:.5rem!important}.profile-body .pe-lg-3{padding-right:1rem!important}.profile-body .pe-lg-4{padding-right:1.5rem!important}.profile-body .pe-lg-5{padding-right:3rem!important}.profile-body .pb-lg-0{padding-bottom:0!important}.profile-body .pb-lg-1{padding-bottom:.25rem!important}.profile-body .pb-lg-2{padding-bottom:.5rem!important}.profile-body .pb-lg-3{padding-bottom:1rem!important}.profile-body .pb-lg-4{padding-bottom:1.5rem!important}.profile-body .pb-lg-5{padding-bottom:3rem!important}.profile-body .ps-lg-0{padding-left:0!important}.profile-body .ps-lg-1{padding-left:.25rem!important}.profile-body .ps-lg-2{padding-left:.5rem!important}.profile-body .ps-lg-3{padding-left:1rem!important}.profile-body .ps-lg-4{padding-left:1.5rem!important}.profile-body .ps-lg-5{padding-left:3rem!important}.profile-body .gap-lg-0{gap:0!important}.profile-body .gap-lg-1{gap:.25rem!important}.profile-body .gap-lg-2{gap:.5rem!important}.profile-body .gap-lg-3{gap:1rem!important}.profile-body .gap-lg-4{gap:1.5rem!important}.profile-body .gap-lg-5{gap:3rem!important}.profile-body .row-gap-lg-0{row-gap:0!important}.profile-body .row-gap-lg-1{row-gap:.25rem!important}.profile-body .row-gap-lg-2{row-gap:.5rem!important}.profile-body .row-gap-lg-3{row-gap:1rem!important}.profile-body .row-gap-lg-4{row-gap:1.5rem!important}.profile-body .row-gap-lg-5{row-gap:3rem!important}.profile-body .column-gap-lg-0{column-gap:0!important}.profile-body .column-gap-lg-1{column-gap:.25rem!important}.profile-body .column-gap-lg-2{column-gap:.5rem!important}.profile-body .column-gap-lg-3{column-gap:1rem!important}.profile-body .column-gap-lg-4{column-gap:1.5rem!important}.profile-body .column-gap-lg-5{column-gap:3rem!important}.profile-body .text-lg-start{text-align:left!important}.profile-body .text-lg-end{text-align:right!important}.profile-body .text-lg-center{text-align:center!important}}@media(min-width:1200px){.profile-body .float-xl-start{float:left!important}.profile-body .float-xl-end{float:right!important}.profile-body .float-xl-none{float:none!important}.profile-body .object-fit-xl-contain{object-fit:contain!important}.profile-body .object-fit-xl-cover{object-fit:cover!important}.profile-body .object-fit-xl-fill{object-fit:fill!important}.profile-body .object-fit-xl-scale{object-fit:scale-down!important}.profile-body .object-fit-xl-none{object-fit:none!important}.profile-body .d-xl-inline{display:inline!important}.profile-body .d-xl-inline-block{display:inline-block!important}.profile-body .d-xl-block{display:block!important}.profile-body .d-xl-grid{display:grid!important}.profile-body .d-xl-inline-grid{display:inline-grid!important}.profile-body .d-xl-table{display:table!important}.profile-body .d-xl-table-row{display:table-row!important}.profile-body .d-xl-table-cell{display:table-cell!important}.profile-body .d-xl-flex{display:flex!important}.profile-body .d-xl-inline-flex{display:inline-flex!important}.profile-body .d-xl-none{display:none!important}.profile-body .flex-xl-fill{flex:1 1 auto!important}.profile-body .flex-xl-row{flex-direction:row!important}.profile-body .flex-xl-column{flex-direction:column!important}.profile-body .flex-xl-row-reverse{flex-direction:row-reverse!important}.profile-body .flex-xl-column-reverse{flex-direction:column-reverse!important}.profile-body .flex-xl-grow-0{flex-grow:0!important}.profile-body .flex-xl-grow-1{flex-grow:1!important}.profile-body .flex-xl-shrink-0{flex-shrink:0!important}.profile-body .flex-xl-shrink-1{flex-shrink:1!important}.profile-body .flex-xl-wrap{flex-wrap:wrap!important}.profile-body .flex-xl-nowrap{flex-wrap:nowrap!important}.profile-body .flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.profile-body .justify-content-xl-start{justify-content:flex-start!important}.profile-body .justify-content-xl-end{justify-content:flex-end!important}.profile-body .justify-content-xl-center{justify-content:center!important}.profile-body .justify-content-xl-between{justify-content:space-between!important}.profile-body .justify-content-xl-around{justify-content:space-around!important}.profile-body .justify-content-xl-evenly{justify-content:space-evenly!important}.profile-body .align-items-xl-start{align-items:flex-start!important}.profile-body .align-items-xl-end{align-items:flex-end!important}.profile-body .align-items-xl-center{align-items:center!important}.profile-body .align-items-xl-baseline{align-items:baseline!important}.profile-body .align-items-xl-stretch{align-items:stretch!important}.profile-body .align-content-xl-start{align-content:flex-start!important}.profile-body .align-content-xl-end{align-content:flex-end!important}.profile-body .align-content-xl-center{align-content:center!important}.profile-body .align-content-xl-between{align-content:space-between!important}.profile-body .align-content-xl-around{align-content:space-around!important}.profile-body .align-content-xl-stretch{align-content:stretch!important}.profile-body .align-self-xl-auto{align-self:auto!important}.profile-body .align-self-xl-start{align-self:flex-start!important}.profile-body .align-self-xl-end{align-self:flex-end!important}.profile-body .align-self-xl-center{align-self:center!important}.profile-body .align-self-xl-baseline{align-self:baseline!important}.profile-body .align-self-xl-stretch{align-self:stretch!important}.profile-body .order-xl-first{order:-1!important}.profile-body .order-xl-0{order:0!important}.profile-body .order-xl-1{order:1!important}.profile-body .order-xl-2{order:2!important}.profile-body .order-xl-3{order:3!important}.profile-body .order-xl-4{order:4!important}.profile-body .order-xl-5{order:5!important}.profile-body .order-xl-last{order:6!important}.profile-body .m-xl-0{margin:0!important}.profile-body .m-xl-1{margin:.25rem!important}.profile-body .m-xl-2{margin:.5rem!important}.profile-body .m-xl-3{margin:1rem!important}.profile-body .m-xl-4{margin:1.5rem!important}.profile-body .m-xl-5{margin:3rem!important}.profile-body .m-xl-auto{margin:auto!important}.profile-body .mx-xl-0{margin-left:0!important;margin-right:0!important}.profile-body .mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.profile-body .mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.profile-body .mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.profile-body .mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.profile-body .mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.profile-body .mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.profile-body .my-xl-0{margin-bottom:0!important;margin-top:0!important}.profile-body .my-xl-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.profile-body .my-xl-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.profile-body .my-xl-3{margin-bottom:1rem!important;margin-top:1rem!important}.profile-body .my-xl-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.profile-body .my-xl-5{margin-bottom:3rem!important;margin-top:3rem!important}.profile-body .my-xl-auto{margin-bottom:auto!important;margin-top:auto!important}.profile-body .mt-xl-0{margin-top:0!important}.profile-body .mt-xl-1{margin-top:.25rem!important}.profile-body .mt-xl-2{margin-top:.5rem!important}.profile-body .mt-xl-3{margin-top:1rem!important}.profile-body .mt-xl-4{margin-top:1.5rem!important}.profile-body .mt-xl-5{margin-top:3rem!important}.profile-body .mt-xl-auto{margin-top:auto!important}.profile-body .me-xl-0{margin-right:0!important}.profile-body .me-xl-1{margin-right:.25rem!important}.profile-body .me-xl-2{margin-right:.5rem!important}.profile-body .me-xl-3{margin-right:1rem!important}.profile-body .me-xl-4{margin-right:1.5rem!important}.profile-body .me-xl-5{margin-right:3rem!important}.profile-body .me-xl-auto{margin-right:auto!important}.profile-body .mb-xl-0{margin-bottom:0!important}.profile-body .mb-xl-1{margin-bottom:.25rem!important}.profile-body .mb-xl-2{margin-bottom:.5rem!important}.profile-body .mb-xl-3{margin-bottom:1rem!important}.profile-body .mb-xl-4{margin-bottom:1.5rem!important}.profile-body .mb-xl-5{margin-bottom:3rem!important}.profile-body .mb-xl-auto{margin-bottom:auto!important}.profile-body .ms-xl-0{margin-left:0!important}.profile-body .ms-xl-1{margin-left:.25rem!important}.profile-body .ms-xl-2{margin-left:.5rem!important}.profile-body .ms-xl-3{margin-left:1rem!important}.profile-body .ms-xl-4{margin-left:1.5rem!important}.profile-body .ms-xl-5{margin-left:3rem!important}.profile-body .ms-xl-auto{margin-left:auto!important}.profile-body .p-xl-0{padding:0!important}.profile-body .p-xl-1{padding:.25rem!important}.profile-body .p-xl-2{padding:.5rem!important}.profile-body .p-xl-3{padding:1rem!important}.profile-body .p-xl-4{padding:1.5rem!important}.profile-body .p-xl-5{padding:3rem!important}.profile-body .px-xl-0{padding-left:0!important;padding-right:0!important}.profile-body .px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.profile-body .px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.profile-body .px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.profile-body .px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.profile-body .px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.profile-body .py-xl-0{padding-bottom:0!important;padding-top:0!important}.profile-body .py-xl-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.profile-body .py-xl-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.profile-body .py-xl-3{padding-bottom:1rem!important;padding-top:1rem!important}.profile-body .py-xl-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.profile-body .py-xl-5{padding-bottom:3rem!important;padding-top:3rem!important}.profile-body .pt-xl-0{padding-top:0!important}.profile-body .pt-xl-1{padding-top:.25rem!important}.profile-body .pt-xl-2{padding-top:.5rem!important}.profile-body .pt-xl-3{padding-top:1rem!important}.profile-body .pt-xl-4{padding-top:1.5rem!important}.profile-body .pt-xl-5{padding-top:3rem!important}.profile-body .pe-xl-0{padding-right:0!important}.profile-body .pe-xl-1{padding-right:.25rem!important}.profile-body .pe-xl-2{padding-right:.5rem!important}.profile-body .pe-xl-3{padding-right:1rem!important}.profile-body .pe-xl-4{padding-right:1.5rem!important}.profile-body .pe-xl-5{padding-right:3rem!important}.profile-body .pb-xl-0{padding-bottom:0!important}.profile-body .pb-xl-1{padding-bottom:.25rem!important}.profile-body .pb-xl-2{padding-bottom:.5rem!important}.profile-body .pb-xl-3{padding-bottom:1rem!important}.profile-body .pb-xl-4{padding-bottom:1.5rem!important}.profile-body .pb-xl-5{padding-bottom:3rem!important}.profile-body .ps-xl-0{padding-left:0!important}.profile-body .ps-xl-1{padding-left:.25rem!important}.profile-body .ps-xl-2{padding-left:.5rem!important}.profile-body .ps-xl-3{padding-left:1rem!important}.profile-body .ps-xl-4{padding-left:1.5rem!important}.profile-body .ps-xl-5{padding-left:3rem!important}.profile-body .gap-xl-0{gap:0!important}.profile-body .gap-xl-1{gap:.25rem!important}.profile-body .gap-xl-2{gap:.5rem!important}.profile-body .gap-xl-3{gap:1rem!important}.profile-body .gap-xl-4{gap:1.5rem!important}.profile-body .gap-xl-5{gap:3rem!important}.profile-body .row-gap-xl-0{row-gap:0!important}.profile-body .row-gap-xl-1{row-gap:.25rem!important}.profile-body .row-gap-xl-2{row-gap:.5rem!important}.profile-body .row-gap-xl-3{row-gap:1rem!important}.profile-body .row-gap-xl-4{row-gap:1.5rem!important}.profile-body .row-gap-xl-5{row-gap:3rem!important}.profile-body .column-gap-xl-0{column-gap:0!important}.profile-body .column-gap-xl-1{column-gap:.25rem!important}.profile-body .column-gap-xl-2{column-gap:.5rem!important}.profile-body .column-gap-xl-3{column-gap:1rem!important}.profile-body .column-gap-xl-4{column-gap:1.5rem!important}.profile-body .column-gap-xl-5{column-gap:3rem!important}.profile-body .text-xl-start{text-align:left!important}.profile-body .text-xl-end{text-align:right!important}.profile-body .text-xl-center{text-align:center!important}}@media(min-width:1400px){.profile-body .float-xxl-start{float:left!important}.profile-body .float-xxl-end{float:right!important}.profile-body .float-xxl-none{float:none!important}.profile-body .object-fit-xxl-contain{object-fit:contain!important}.profile-body .object-fit-xxl-cover{object-fit:cover!important}.profile-body .object-fit-xxl-fill{object-fit:fill!important}.profile-body .object-fit-xxl-scale{object-fit:scale-down!important}.profile-body .object-fit-xxl-none{object-fit:none!important}.profile-body .d-xxl-inline{display:inline!important}.profile-body .d-xxl-inline-block{display:inline-block!important}.profile-body .d-xxl-block{display:block!important}.profile-body .d-xxl-grid{display:grid!important}.profile-body .d-xxl-inline-grid{display:inline-grid!important}.profile-body .d-xxl-table{display:table!important}.profile-body .d-xxl-table-row{display:table-row!important}.profile-body .d-xxl-table-cell{display:table-cell!important}.profile-body .d-xxl-flex{display:flex!important}.profile-body .d-xxl-inline-flex{display:inline-flex!important}.profile-body .d-xxl-none{display:none!important}.profile-body .flex-xxl-fill{flex:1 1 auto!important}.profile-body .flex-xxl-row{flex-direction:row!important}.profile-body .flex-xxl-column{flex-direction:column!important}.profile-body .flex-xxl-row-reverse{flex-direction:row-reverse!important}.profile-body .flex-xxl-column-reverse{flex-direction:column-reverse!important}.profile-body .flex-xxl-grow-0{flex-grow:0!important}.profile-body .flex-xxl-grow-1{flex-grow:1!important}.profile-body .flex-xxl-shrink-0{flex-shrink:0!important}.profile-body .flex-xxl-shrink-1{flex-shrink:1!important}.profile-body .flex-xxl-wrap{flex-wrap:wrap!important}.profile-body .flex-xxl-nowrap{flex-wrap:nowrap!important}.profile-body .flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.profile-body .justify-content-xxl-start{justify-content:flex-start!important}.profile-body .justify-content-xxl-end{justify-content:flex-end!important}.profile-body .justify-content-xxl-center{justify-content:center!important}.profile-body .justify-content-xxl-between{justify-content:space-between!important}.profile-body .justify-content-xxl-around{justify-content:space-around!important}.profile-body .justify-content-xxl-evenly{justify-content:space-evenly!important}.profile-body .align-items-xxl-start{align-items:flex-start!important}.profile-body .align-items-xxl-end{align-items:flex-end!important}.profile-body .align-items-xxl-center{align-items:center!important}.profile-body .align-items-xxl-baseline{align-items:baseline!important}.profile-body .align-items-xxl-stretch{align-items:stretch!important}.profile-body .align-content-xxl-start{align-content:flex-start!important}.profile-body .align-content-xxl-end{align-content:flex-end!important}.profile-body .align-content-xxl-center{align-content:center!important}.profile-body .align-content-xxl-between{align-content:space-between!important}.profile-body .align-content-xxl-around{align-content:space-around!important}.profile-body .align-content-xxl-stretch{align-content:stretch!important}.profile-body .align-self-xxl-auto{align-self:auto!important}.profile-body .align-self-xxl-start{align-self:flex-start!important}.profile-body .align-self-xxl-end{align-self:flex-end!important}.profile-body .align-self-xxl-center{align-self:center!important}.profile-body .align-self-xxl-baseline{align-self:baseline!important}.profile-body .align-self-xxl-stretch{align-self:stretch!important}.profile-body .order-xxl-first{order:-1!important}.profile-body .order-xxl-0{order:0!important}.profile-body .order-xxl-1{order:1!important}.profile-body .order-xxl-2{order:2!important}.profile-body .order-xxl-3{order:3!important}.profile-body .order-xxl-4{order:4!important}.profile-body .order-xxl-5{order:5!important}.profile-body .order-xxl-last{order:6!important}.profile-body .m-xxl-0{margin:0!important}.profile-body .m-xxl-1{margin:.25rem!important}.profile-body .m-xxl-2{margin:.5rem!important}.profile-body .m-xxl-3{margin:1rem!important}.profile-body .m-xxl-4{margin:1.5rem!important}.profile-body .m-xxl-5{margin:3rem!important}.profile-body .m-xxl-auto{margin:auto!important}.profile-body .mx-xxl-0{margin-left:0!important;margin-right:0!important}.profile-body .mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.profile-body .mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.profile-body .mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.profile-body .mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.profile-body .mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.profile-body .mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.profile-body .my-xxl-0{margin-bottom:0!important;margin-top:0!important}.profile-body .my-xxl-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.profile-body .my-xxl-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.profile-body .my-xxl-3{margin-bottom:1rem!important;margin-top:1rem!important}.profile-body .my-xxl-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.profile-body .my-xxl-5{margin-bottom:3rem!important;margin-top:3rem!important}.profile-body .my-xxl-auto{margin-bottom:auto!important;margin-top:auto!important}.profile-body .mt-xxl-0{margin-top:0!important}.profile-body .mt-xxl-1{margin-top:.25rem!important}.profile-body .mt-xxl-2{margin-top:.5rem!important}.profile-body .mt-xxl-3{margin-top:1rem!important}.profile-body .mt-xxl-4{margin-top:1.5rem!important}.profile-body .mt-xxl-5{margin-top:3rem!important}.profile-body .mt-xxl-auto{margin-top:auto!important}.profile-body .me-xxl-0{margin-right:0!important}.profile-body .me-xxl-1{margin-right:.25rem!important}.profile-body .me-xxl-2{margin-right:.5rem!important}.profile-body .me-xxl-3{margin-right:1rem!important}.profile-body .me-xxl-4{margin-right:1.5rem!important}.profile-body .me-xxl-5{margin-right:3rem!important}.profile-body .me-xxl-auto{margin-right:auto!important}.profile-body .mb-xxl-0{margin-bottom:0!important}.profile-body .mb-xxl-1{margin-bottom:.25rem!important}.profile-body .mb-xxl-2{margin-bottom:.5rem!important}.profile-body .mb-xxl-3{margin-bottom:1rem!important}.profile-body .mb-xxl-4{margin-bottom:1.5rem!important}.profile-body .mb-xxl-5{margin-bottom:3rem!important}.profile-body .mb-xxl-auto{margin-bottom:auto!important}.profile-body .ms-xxl-0{margin-left:0!important}.profile-body .ms-xxl-1{margin-left:.25rem!important}.profile-body .ms-xxl-2{margin-left:.5rem!important}.profile-body .ms-xxl-3{margin-left:1rem!important}.profile-body .ms-xxl-4{margin-left:1.5rem!important}.profile-body .ms-xxl-5{margin-left:3rem!important}.profile-body .ms-xxl-auto{margin-left:auto!important}.profile-body .p-xxl-0{padding:0!important}.profile-body .p-xxl-1{padding:.25rem!important}.profile-body .p-xxl-2{padding:.5rem!important}.profile-body .p-xxl-3{padding:1rem!important}.profile-body .p-xxl-4{padding:1.5rem!important}.profile-body .p-xxl-5{padding:3rem!important}.profile-body .px-xxl-0{padding-left:0!important;padding-right:0!important}.profile-body .px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.profile-body .px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.profile-body .px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.profile-body .px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.profile-body .px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.profile-body .py-xxl-0{padding-bottom:0!important;padding-top:0!important}.profile-body .py-xxl-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.profile-body .py-xxl-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.profile-body .py-xxl-3{padding-bottom:1rem!important;padding-top:1rem!important}.profile-body .py-xxl-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.profile-body .py-xxl-5{padding-bottom:3rem!important;padding-top:3rem!important}.profile-body .pt-xxl-0{padding-top:0!important}.profile-body .pt-xxl-1{padding-top:.25rem!important}.profile-body .pt-xxl-2{padding-top:.5rem!important}.profile-body .pt-xxl-3{padding-top:1rem!important}.profile-body .pt-xxl-4{padding-top:1.5rem!important}.profile-body .pt-xxl-5{padding-top:3rem!important}.profile-body .pe-xxl-0{padding-right:0!important}.profile-body .pe-xxl-1{padding-right:.25rem!important}.profile-body .pe-xxl-2{padding-right:.5rem!important}.profile-body .pe-xxl-3{padding-right:1rem!important}.profile-body .pe-xxl-4{padding-right:1.5rem!important}.profile-body .pe-xxl-5{padding-right:3rem!important}.profile-body .pb-xxl-0{padding-bottom:0!important}.profile-body .pb-xxl-1{padding-bottom:.25rem!important}.profile-body .pb-xxl-2{padding-bottom:.5rem!important}.profile-body .pb-xxl-3{padding-bottom:1rem!important}.profile-body .pb-xxl-4{padding-bottom:1.5rem!important}.profile-body .pb-xxl-5{padding-bottom:3rem!important}.profile-body .ps-xxl-0{padding-left:0!important}.profile-body .ps-xxl-1{padding-left:.25rem!important}.profile-body .ps-xxl-2{padding-left:.5rem!important}.profile-body .ps-xxl-3{padding-left:1rem!important}.profile-body .ps-xxl-4{padding-left:1.5rem!important}.profile-body .ps-xxl-5{padding-left:3rem!important}.profile-body .gap-xxl-0{gap:0!important}.profile-body .gap-xxl-1{gap:.25rem!important}.profile-body .gap-xxl-2{gap:.5rem!important}.profile-body .gap-xxl-3{gap:1rem!important}.profile-body .gap-xxl-4{gap:1.5rem!important}.profile-body .gap-xxl-5{gap:3rem!important}.profile-body .row-gap-xxl-0{row-gap:0!important}.profile-body .row-gap-xxl-1{row-gap:.25rem!important}.profile-body .row-gap-xxl-2{row-gap:.5rem!important}.profile-body .row-gap-xxl-3{row-gap:1rem!important}.profile-body .row-gap-xxl-4{row-gap:1.5rem!important}.profile-body .row-gap-xxl-5{row-gap:3rem!important}.profile-body .column-gap-xxl-0{column-gap:0!important}.profile-body .column-gap-xxl-1{column-gap:.25rem!important}.profile-body .column-gap-xxl-2{column-gap:.5rem!important}.profile-body .column-gap-xxl-3{column-gap:1rem!important}.profile-body .column-gap-xxl-4{column-gap:1.5rem!important}.profile-body .column-gap-xxl-5{column-gap:3rem!important}.profile-body .text-xxl-start{text-align:left!important}.profile-body .text-xxl-end{text-align:right!important}.profile-body .text-xxl-center{text-align:center!important}}@media(min-width:1200px){.profile-body .fs-1{font-size:2.5rem!important}.profile-body .fs-2{font-size:2rem!important}.profile-body .fs-3{font-size:1.75rem!important}.profile-body .fs-4{font-size:1.5rem!important}}@media print{.profile-body .d-print-inline{display:inline!important}.profile-body .d-print-inline-block{display:inline-block!important}.profile-body .d-print-block{display:block!important}.profile-body .d-print-grid{display:grid!important}.profile-body .d-print-inline-grid{display:inline-grid!important}.profile-body .d-print-table{display:table!important}.profile-body .d-print-table-row{display:table-row!important}.profile-body .d-print-table-cell{display:table-cell!important}.profile-body .d-print-flex{display:flex!important}.profile-body .d-print-inline-flex{display:inline-flex!important}.profile-body .d-print-none{display:none!important}}.profile-body .back-button{background:#013d00;border-radius:25px;color:#fff;cursor:pointer;font-size:20px;font-weight:700;height:50px;padding:10px;right:10px;top:10px;width:50px;z-index:100}.profile-body .main-content .h1,.profile-body .main-content .h2,.profile-body .main-content .h3,.profile-body .main-content .h4,.profile-body .main-content .h5,.profile-body .main-content .h6,.profile-body .main-content h1,.profile-body .main-content h2,.profile-body .main-content h3,.profile-body .main-content h4,.profile-body .main-content h5,.profile-body .main-content h6{color:#fff}.profile-body .main-content .stat{font-size:25px}.profile-body .main-content .h1,.profile-body .main-content h1{background:#013d01;border:3px solid #fff;border-radius:25px;display:inline-block;padding:10px}.profile-body .main-content .equipped-skin{display:inline-block;height:100px;margin-right:10px;width:100px}.profile-body .main-content .cluster{background-color:#013d00;border:1px solid #011c01;border-radius:25px;padding-left:10px;padding-top:10px}.profile-body .main-content .container{border:5px solid #fff;border-radius:25px;padding:10px}.profile-body .main-content .xp-graph{background-color:#013301;border-radius:5px;height:calc(100vh - 800px);padding:10px}.profile-body .main-content .leaderboard-card{background:#011c01;border-radius:5px;box-shadow:0 2px 10px #0000001a;margin-bottom:30px;overflow:hidden}.profile-body .main-content .leaderboard-card__top{background:#013d00;padding:20px 0 10px}.profile-body .main-content .leaderboard-card__body{margin-top:-40px;padding:15px;z-index:inherit}.profile-body .main-content .leaderboard-card__first{transform:scale(1.05)}.profile-body .main-content .leaderboard-card__first .leaderboard-card__top{background:linear-gradient(45deg,#7e57c2,#ab47bc);color:#fff}body{-webkit-font-smoothing:antialiased;cursor:url(../../static/media/cursor.138cb2f1fcf8183aaa1b.cur) 20 20,crosshair;font-family:Franklin Gothic Medium,Ubuntu,Arial,sans-serif;margin:0;padding:0}body,html{height:100%;position:relative;width:100%}.grecaptcha-badge{visibility:hidden}#imaContainer,#imaContainer_new{cursor:default} -/*# sourceMappingURL=main.8218d45b.css.map*/ \ No newline at end of file +/*# sourceMappingURL=main.70c6ef9a.css.map*/ \ No newline at end of file diff --git a/static/css/main.70c6ef9a.css.map b/static/css/main.70c6ef9a.css.map new file mode 100644 index 00000000..dbe7a875 --- /dev/null +++ b/static/css/main.70c6ef9a.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/main.70c6ef9a.css","mappings":"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A,CAKF,kCACE,gBAUF,kCAIE,QAAO,CADP,SAFA,YACA,SAEA,CAQF,gCACE,WF9MM,gCEoNN,oBAHA,mBCmN4B,CDpN5B,UADA,UAKA,CFhXE,yBEyWJ,gCFtMQ,kBE+MN,kCACE,WAOJ,8ZAOE,UAGF,qDACE,YASF,uCACE,6BACA,oBAmBF,qDACE,wBAKF,wDACE,UAOF,sDAEE,0BADA,YACA,CAFF,gDAEE,0BADA,YACA,CAKF,gCACE,qBAKF,gCACE,SAOF,iCAEE,eADA,iBACA,CAQF,kCACE,uBAQF,kCACE,uBGrkBF,+BLmQM,iBALI,CK5PR,eFwoB4B,CEnoB5B,oCLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,oCLuQM,gBKvQN,oCLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,oCLuQM,kBKvQN,oCLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,oCLuQM,gBKvQN,oCLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,oCLuQM,kBKvQN,oCLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,oCLuQM,gBKvQN,oCLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,oCLuQM,kBK1OR,8EC3DE,gBADA,cACA,CD8DF,2CACE,qBAEA,4DACE,kBFsoB0B,CE5nB9B,qCL8MM,gBALI,CKvMR,yBAIF,qCLwMM,kBKvMJ,kBLkMQ,CK/LR,iDACE,gBAIJ,4CAIE,cL2LI,gBALI,CKxLR,kBFuTO,CExTP,gBFnFS,CEwFT,mDACE,aEhGJ,oCCOE,YAHA,cAGA,CDDF,wCAEE,kCJ6jDkC,CI5jDlC,2DHGE,sCILF,YAHA,eDGA,cCAA,CDcF,iCAEE,qBAGF,qCAEE,aAAY,CADZ,mBACA,CAGF,yCAEE,gCPuPI,gBGyzC8B,CMllDlC,kRCHA,qBACA,gBAKA,iBADA,kBADA,yCADA,0CADA,UAIA,CCsDE,wBF5CE,2EACE,eNkee,EQvbnB,wBF5CE,kHACE,eNkee,EQvbnB,wBF5CE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CjBqiCgC,Cel8B9B,eAFA,qBAGA,8CfgsB0B,Ce/rB1B,gBAPA,0BfsyBoC,CexyBpC,wBACA,wBforB0B,CetrB1B,uBAKA,oBCpFE,mQD0FF,CAZF,6DE1FA,sCjBqiCgC,Cel8B9B,eAFA,qBAGA,8CfgsB0B,Ce/rB1B,gBAPA,0BfsyBoC,CexyBpC,wBACA,wBforB0B,CetrB1B,uBAKA,oBCpFE,6HD0FF,CCtFE,sCD0EJ,mECzEM,wCDyEN,6DCzEM,iBDwFN,wGACE,uCf47B8B,Ce77BhC,kGACE,uCf47B8B,Cen7BlC,iDAOE,uBACA,mBACA,sCAHA,0Bf2xBsC,CehyBtC,cAIA,efwf4B,Cezf5B,gBADA,kBADA,UAOA,CAEA,uDACE,UAGF,kIAGE,cAAa,CADb,eACA,CAWJ,0CdjII,yCJ4QE,iBALI,CkBrIR,yDf4wBsC,Ce3wBtC,oBdnIE,CcuIF,sEAEE,sBACA,wBAFA,oBfsoB0B,CevoB5B,gEAEE,sBACA,wBAFA,oBfsoB0B,CehoB9B,0Cd9II,yCJ4QE,iBALI,CkBxHR,wDfgwBsC,Ce/vBtC,kBdhJE,CcoJF,sEAEE,oBACA,uBAFA,kBf6nB0B,Ce9nB5B,gEAEE,oBACA,uBAFA,kBf6nB0B,CennB5B,+CACE,0Df6uBoC,Ce1uBtC,kDACE,yDf0uBoC,CevuBtC,kDACE,wDfuuBoC,CeluBxC,6CAEE,sDf8tBsC,Ce7tBtC,gBAFA,UfmlB4B,Ce/kB5B,4EACE,eAGF,gEACE,mBdvLA,sCc2LF,mEACE,mBd5LA,sCcgMF,kHf8sBsC,Ce7sBtC,iHf8sBsC,CkB75BxC,sCACE,qQAYA,CACA,uBACA,mDACA,mDACA,iFFNI,wCAIA,CAJA,4BAIA,yBEfN,2DAsBE,sCACE,CAVF,0BACA,CADA,oGAUE,oEAUF,CApBA,UAoBA,0IAGE,oBAGF,kCAEE,CAFF,SAEE,6GAOA,qBAIJ,CAJI,oBAIJ,gDAEE,uCrBoOI,sDI5QF,WiB8CJ,uCACE,0CASE,yCjBxDA,iBiBwDA,CrB+MM,qBIvQN,oBiBiDF,kBAOE,CACE,yCCtEJ,wCAEA,CAJF,iBACE,CDuEI,oBCxEN,mBDwEM,iBCp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CrGA,yCACA,mBACA,oBACA,8BACA,0BACA,8DACA,sCAEA,sDACA,qCACA,wDAEA,0DDyFA,uCCrGA,uCACA,mBACA,oBACA,8BACA,0BACA,8DAEA,qCACA,2BACA,gEACA,wDAEA,8BDmHA,mECvGA,CACA,mCACA,uCACA,8BACA,0BACA,2BACA,mCACA,qCACA,2BACA,gEACA,wDAEA,8BACA,4BD0FA,uCCvGA,uCACA,mBACA,qBACA,6BACA,oDACA,oCACA,oCACA,CACA,qDACA,6FAEA,6BACA,6BACA,uCD0FA,sCCvGA,mBACA,oBACA,8BACA,0BACA,0BACA,wEAEA,2BACA,4BACA,4FAEA,6BACA,oED2FA,qCCvGA,mBACA,kDACA,0BACA,0BACA,oCACA,sCACA,2BACA,2BACA,qCACA,wDACA,6BACA,6BACA,uCACA,oCD0FA,mBCvGA,oBACA,8BACA,0BACA,0BACA,oCACA,mCACA,2BACA,2BACA,qCACA,wDACA,0DACA,uCACA,+CD2FA,uBCvGA,6BACA,0BACA,0BACA,oCACA,qCACA,2BACA,2BACA,qCACA,wDACA,gCACA,2BACA,uCACA,oED2FA,sBCvGA,8BACA,0BACA,0BACA,oCACA,sCACA,2BACA,2BACA,qCACA,wDACA,gCACA,2BACA,uCACA,mBACA,+CD0FA,sBCvGA,8BACA,0BACA,0BACA,oCACA,oCACA,2BACA,2BACA,qCACA,wDACA,gCACA,2BACA,uCACA,mBACA,4CDsGF,sBACE,8BACA,0BACA,0BACA,oCACA,qCACA,sDACA,qCACA,wDACA,gCACA,2BACA,uCACA,mBAEA,+CAUA,sBACE,8BAGF,oDACE,oCAWJ,+DCxIE,2BACA,qCAEA,wDDyIF,2DC5IE,uCACA,mB5B8NI,8C4B5NJ,oDCnEF,0BVgBM,0BAIA,oCUpBN,oCAGE,sDAOA,qCACE,wDAMF,gCVDI,2BAIA,uCULN,mBVMQ,6CUDN,sBACE,CACA,6BVNE,0BAIA,oGWnBN,8MAME,uCAGF,mBACE,4CCwBE,sBACE,8BAEA,0BACA,0BApCJ,oCACA,mCACA,2BA0DE,gED7CJ,wDAGE,gCACA,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GE,iBAGA,8BACE,UAOJ,wJACE,uBAQF,wGAIE,0BAGE,oKACE,eAON,iCAEE,kBADA,SACA,CAKF,uBACE,gBAUF,uBAIE,QAAO,CADP,SAFA,YACA,SAEA,CAQF,qBACE,WF9MM,gCEoNN,oBAHA,mBCmN4B,CDpN5B,UADA,UAKA,CFhXE,yBEyWJ,qBFtMQ,kBE+MN,uBACE,WAOJ,iVAOE,UAGF,0CACE,YASF,4BACE,6BACA,oBAmBF,0CACE,wBAKF,6CACE,UAOF,2CAEE,0BADA,YACA,CAFF,qCAEE,0BADA,YACA,CAKF,qBACE,qBAKF,qBACE,SAOF,sBAEE,eADA,iBACA,CAQF,uBACE,uBAQF,uBACE,uBGrkBF,oBLmQM,iBALI,CK5PR,eFwoB4B,CEnoB5B,yBLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,yBLuQM,gBKvQN,yBLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,yBLuQM,kBKvQN,yBLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,yBLuQM,gBKvQN,yBLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,yBLuQM,kBKvQN,yBLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,yBLuQM,gBKvQN,yBLgQM,iCK5PJ,eFynBkB,CExnBlB,eFwmB0B,CHzgB1B,yBKpGF,yBLuQM,kBK1OR,wDC3DE,gBADA,cACA,CD8DF,gCACE,qBAEA,iDACE,kBFsoB0B,CE5nB9B,0BL8MM,gBALI,CKvMR,yBAIF,0BLwMM,kBKvMJ,kBLkMQ,CK/LR,sCACE,gBAIJ,iCAIE,cL2LI,gBALI,CKxLR,kBFuTO,CExTP,gBFnFS,CEwFT,wCACE,aEhGJ,yBCOE,YAHA,cAGA,CDDF,6BAEE,kCJ6jDkC,CI5jDlC,2DHGE,sCILF,YAHA,eDGA,cCAA,CDcF,sBAEE,qBAGF,0BAEE,aAAY,CADZ,mBACA,CAGF,8BAEE,gCPuPI,gBGyzC8B,CMllDlC,qMCHA,qBACA,gBAKA,iBADA,kBADA,yCADA,0CADA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CCtGA,gDAEA,CASA,kCAEA,CAXA,sCACA,CAUA,mBAVA,4BACA,mBACA,kDACA,0BACA,0BACA,oCACA,qCACA,sDACA,qCACA,wDD0FA,6BCtGA,CACA,4BACA,uCACA,8BACA,mBACA,kDACA,0BACA,0BACA,oCACA,sCACA,sDACA,qCACA,wDD0FA,6BCrGA,6BACA,uCACA,4BACA,mBACA,oBACA,wDACA,0BACA,oCACA,qCACA,sDACA,qCAEA,wDDmHA,6BCvGA,6BACA,uCAEA,yBACA,uCACA,8BACA,2BACA,6DACA,qCACA,2BACA,4BACA,oCACA,wDD2FA,0DCtGA,uCACA,4BACA,mBACA,kDACA,0BACA,0BACA,oCACA,oCACA,sDACA,qCACA,wDAEA,6BD0FA,6BCvGA,uCACA,2BACA,mBACA,oBACA,8BACA,oDACA,oCACA,oCACA,2BACA,gEACA,wDAEA,6BACA,6BD0FA,uCCtGA,0BACA,uCACA,8BACA,0BACA,2BACA,mCACA,sCACA,2BACA,gEACA,wDAEA,6BACA,6BD0FA,uCCvGA,yBACA,mBACA,qBACA,6BACA,oDACA,oCACA,mCAEA,sDACA,6FAEA,6BACA,6BACA,uCD0FA,oCCtGA,uBACA,6BACA,0BACA,8DACA,qCAEA,2BACA,gEACA,wDACA,gCACA,2BACA,uCD2FA,yDCtGA,sBACA,8BACA,0BACA,8DACA,sCAEA,2BACA,gEACA,wDAEA,gCACA,kED2FA,mBCvGA,oCACA,sBACA,8BACA,0BACA,0BACA,oCACA,oCACA,2BACA,2BACA,6FAEA,gCACA,4BACA,sCDsGF,mBACE,iCACA,sBACA,8BACA,0BACA,8DACA,qCACA,sDACA,qCACA,wDAEA,gCACA,2BAEC,CAAD,sCAUA,uDAIA,sBACE,+BAWJ,uFCvIE,oC5B8NI,2B4B5NJ,2BDyIF,6FC3IE,gC5B8NI,2B4B5NJ,uCCnEF,mBVgBM,mCAIA,sBUpBN,8BVqBQ,CUlBN,mDAOA,oCAKF,oCAEE,2BVDI,2BAIA,qCULN,wDAKE,gCVJI,2BAIA,4FWnBN,kLASA,2BACE,2BCwBE,qCACE,CACA,uDAnCJ,gCA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","sources":["ui/game/ChatInput.scss","ui/game/Leaderboard.scss","ui/game/GameResults.scss","ui/game/GameComponent.scss","ui/modals/Modal.scss","ui/modals/SettingsModal.scss","ui/LoadingScreen.scss","ui/modals/ChangelogModal.scss","ui/modals/LoginModal.scss","ui/modals/SignupModal.scss","ui/modals/ConnectionError.scss","ui/App.scss","ui/modals/ShopModal.scss","ui/modals/MigrationModal.scss","ui/AccountCard.scss","ui/GlobalLeaderboard.scss","../node_modules/bootstrap/scss/mixins/_banner.scss","../node_modules/bootstrap/scss/_root.scss","../node_modules/bootstrap/scss/vendor/_rfs.scss","../node_modules/bootstrap/scss/mixins/_color-mode.scss","../node_modules/bootstrap/scss/_reboot.scss","../node_modules/bootstrap/scss/_variables.scss","../node_modules/bootstrap/scss/mixins/_border-radius.scss","../node_modules/bootstrap/scss/_type.scss","../node_modules/bootstrap/scss/mixins/_lists.scss","../node_modules/bootstrap/scss/_images.scss","../node_modules/bootstrap/scss/mixins/_image.scss","../node_modules/bootstrap/scss/_containers.scss","../node_modules/bootstrap/scss/mixins/_container.scss","../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../node_modules/bootstrap/scss/_grid.scss","../node_modules/bootstrap/scss/mixins/_grid.scss","../node_modules/bootstrap/scss/_tables.scss","../node_modules/bootstrap/scss/mixins/_table-variants.scss","../node_modules/bootstrap/scss/forms/_labels.scss","../node_modules/bootstrap/scss/forms/_form-text.scss","../node_modules/bootstrap/scss/forms/_form-control.scss","../node_modules/bootstrap/scss/mixins/_transition.scss","../node_modules/bootstrap/scss/mixins/_gradients.scss","../node_modules/bootstrap/scss/forms/_form-select.scss","../node_modules/bootstrap/scss/forms/_form-check.scss","../node_modules/bootstrap/scss/forms/_form-range.scss","../node_modules/bootstrap/scss/forms/_floating-labels.scss","../node_modules/bootstrap/scss/forms/_input-group.scss","../node_modules/bootstrap/scss/mixins/_forms.scss","../node_modules/bootstrap/scss/_buttons.scss","../node_modules/bootstrap/scss/mixins/_buttons.scss","../node_modules/bootstrap/scss/_transitions.scss","../node_modules/bootstrap/scss/_dropdown.scss","../node_modules/bootstrap/scss/mixins/_caret.scss","../node_modules/bootstrap/scss/_button-group.scss","../node_modules/bootstrap/scss/_nav.scss","../node_modules/bootstrap/scss/_navbar.scss","../node_modules/bootstrap/scss/_card.scss","../node_modules/bootstrap/scss/_accordion.scss","../node_modules/bootstrap/scss/_breadcrumb.scss","../node_modules/bootstrap/scss/_pagination.scss","../node_modules/bootstrap/scss/mixins/_pagination.scss","../node_modules/bootstrap/scss/_badge.scss","../node_modules/bootstrap/scss/_alert.scss","../node_modules/bootstrap/scss/_progress.scss","../node_modules/bootstrap/scss/_list-group.scss","../node_modules/bootstrap/scss/_close.scss","../node_modules/bootstrap/scss/_toasts.scss","../node_modules/bootstrap/scss/_modal.scss","../node_modules/bootstrap/scss/mixins/_backdrop.scss","../node_modules/bootstrap/scss/_tooltip.scss","../node_modules/bootstrap/scss/mixins/_reset-text.scss","../node_modules/bootstrap/scss/_popover.scss","../node_modules/bootstrap/scss/mixins/_clearfix.scss","../node_modules/bootstrap/scss/_carousel.scss","../node_modules/bootstrap/scss/_spinners.scss","../node_modules/bootstrap/scss/_offcanvas.scss","../node_modules/bootstrap/scss/_placeholders.scss","../node_modules/bootstrap/scss/helpers/_color-bg.scss","../node_modules/bootstrap/scss/helpers/_colored-links.scss","../node_modules/bootstrap/scss/helpers/_focus-ring.scss","../node_modules/bootstrap/scss/helpers/_icon-link.scss","../node_modules/bootstrap/scss/helpers/_ratio.scss","../node_modules/bootstrap/scss/helpers/_position.scss","../node_modules/bootstrap/scss/helpers/_stacks.scss","../node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../node_modules/bootstrap/scss/helpers/_stretched-link.scss","../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../node_modules/bootstrap/scss/helpers/_vr.scss","../node_modules/bootstrap/scss/mixins/_utilities.scss","../node_modules/bootstrap/scss/utilities/_api.scss","ui/Profile.scss","../node_modules/bootstrap/scss/helpers/_text-truncation.scss","global.scss"],"sourcesContent":["#chat {\n border: 2px solid #cdcdcd;\n border-color: rgba(0, 0, 0, .14);\n background-color: AliceBlue;\n padding: 3px 6px;\n font-size: max(min(1.5vw, 36px), 24px);\n font-family: 'Franklin Gothic Medium', Arial, sans-serif;\n}\n",".leaderboard {\n position: fixed;\n top: 10px;\n right: 10px;\n width: fit-content;\n padding: 5px;\n color: white;\n font-family: Arial, Helvetica, sans-serif;\n\ttext-shadow: 1px 1px 1px rgb(0, 0, 0);\n transform-origin: top right;\n user-select: none;\n pointer-events: none;\n\n .leaderboard-title {\n margin-bottom: 5px;\n text-align: center;\n font-size: 24px;\n pointer-events: all;\n\n &:hover {\n cursor: pointer;\n }\n }\n\n .leaderboard-content {\n opacity: 1;\n transition: all 0.2s ease-in;\n\n &.hidden {\n opacity: 0;\n }\n }\n}\n\n.leaderboard-line {\n display: block;\n font-size: 22px;\n white-space: nowrap;\n}\n",".results {\n\tposition: fixed;\n\tuser-select: none;\n\tleft: 50%;\n\ttop: 50%;\n\twidth: 600px;\n\ttransform: translate(-50%, -50%);\n\t.results-main {\n background-color: rgb(0, 0, 0, 0.7);\n\ttext-shadow: 1px 1px 1px rgb(0, 0, 0);\n border: 5px solid #111111;\n\tborder-radius: 10px;\n\t}\n\tanimation: fadeIn 1s ease both;\n\n\t.results-title {\n\t\tmargin-top: 10px;\n\t\tmargin-bottom: 5px;\n\t\ttext-align: center;\n\t\tcolor: #ffffff;\n\t\tfont-size: 45px;\n\t\tfont-weight: 700;\n\n\t\t.name {\n\t\t\tmargin-top: 10px;\n\t\t\tfont-size: 30px;\n\t\t\tcolor: #eef6ff;\n\t\t}\n\t}\n\n\t.results-container {\n\t\ttext-align: center;\n\t\tmargin: 0 auto 15px;\n\n\t\t.info {\n\t\t\tmargin: 15px;\n\t\t\tcolor: #cccccc;\n\t\t\tfont-size: 13px;\n\t\t\ttext-align: center;\n\t\t\tdisplay: inline-block;\n\n\t\t\t.title {\n\t\t\t\tmargin-bottom: 5px;\n\t\t\t\tfont-size: 22px;\n\t\t\t\tcolor: #f5f5f5;\n\t\t\t}\n\t\t}\n\t}\n\n\t.results-buttons {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: 15px;\n\n\t\t.play-again {\n\t\t\timg {\n\t\t\t\twidth: 150px;\n\t\t\t\theight: 150px;\n\t\t\t\ttransition: 0.2s;\n\n\t\t\t\t&:hover {\n\t\t\t\t\tscale: 1.1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t.to-home {\n\t\t\tmargin-bottom: 5px;\n\t\t\timg {\n\t\t\t\twidth: auto;\n\t\t\t\theight: 60px;\n\t\t\t\ttransition: 0.2s;\n\n\t\t\t\t&:hover {\n\t\t\t\t\tscale: 1.1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t@keyframes fadeIn {\n from {\n opacity: 0;\n backdrop-filter: blur(0px);\n }\n to {\n opacity: 1;\n backdrop-filter: blur(8px);\n }\n }\n}\n",".game {\n width: 100%;\n height: 100%;\n overflow: hidden;\n position: absolute;\n cursor: url(/assets/img/cursor.cur) 20 20, crosshair;\n}\n",".modal {\n position: absolute;\n left: 50%;\n top: 50%;\n min-width: 300px;\n transform: translate(-50%, -50%);\n background-color: rgb(20, 20, 20) !important;\n box-shadow: 0 0 0 5px rgba(47, 47, 47, 0.98);\n color: rgb(231, 231, 231);\n border-radius: 10px;\n padding: 15px 30px;\n z-index: 5;\n\n .modal-close {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n top: 0px;\n right: 0px;\n width: 30px;\n\n cursor: pointer;\n appearance: none;\n background-color: #000;\n border: 2px solid #fff;\n height: 30px;\n line-height: normal;\n border-radius: 30px;\n transform: rotate(0deg);\n transition: all 0.2s linear;\n\n &::before, &::after {\n content: ' ';\n display: block;\n width: 20px;\n height: 2px;\n background-color: #fff;\n transform: rotate(45deg);\n margin: 0 auto;\n position: absolute;\n }\n &::after {\n transform: rotate(-45deg);\n }\n &:hover {\n transform: rotate(180deg);\n }\n }\n}\n",".settings {\n .settings-title {\n font-size: 24px;\n margin: 0 0 20px;\n letter-spacing: 2px;\n }\n\n label {\n display: block;\n margin-bottom: 10px;\n }\n\n .settings-line {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n }\n \n select, input {\n width: 100%;\n margin: 0 0 10px;\n font-size: 18px;\n }\n}\n\n.switch {\n position: relative;\n display: inline-block;\n width: 50px;\n height: 21px;\n\n input {\n opacity: 0;\n width: 0;\n height: 0;\n }\n\n .slider {\n position: absolute;\n cursor: pointer;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: #ccc;\n -webkit-transition: .4s;\n transition: .4s;\n\n &:before {\n position: absolute;\n content: \"\";\n height: 15px;\n width: 15px;\n left: 6px;\n bottom: 3px;\n background-color: white;\n -webkit-transition: .4s;\n transition: .4s;\n }\n }\n\n input:checked + .slider {\n background-color: #2196F3;\n\n &:before {\n -webkit-transform: translateX(26px);\n -ms-transform: translateX(26px);\n transform: translateX(26px);\n }\n }\n\n input:focus + .slider {\n box-shadow: 0 0 1px #2196F3;\n }\n}\n\n.slider.round {\n border-radius: 34px;\n\n &:before {\n border-radius: 50%;\n }\n}\n",".loading-screen {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n z-index: 2;\n background-color: #333333;\n width: 100%;\n height: 100%;\n\ttransition: 500ms all ease-in-out;\n\n .loading-container {\n width: 400px;\n text-align: center;\n\n .loading-text {\n color: #ffffff;\n font-size: 45px;\n margin-bottom: 10px\n }\n\n .progress-bar {\n width: 100%;\n height: 20px;\n background-color: #eee;\n\n .progress {\n height: 100%;\n background-color: lime;\n transition: width 0.5s ease-in-out;\n }\n }\n }\n}\n",".changelog {\n text-align: center;\n \n h1 {\n margin-top: 20px;\n font-size: 32px;\n }\n\n h2 {\n font-size: 28px;\n }\n\n h1, h2 {\n margin: 0 0 20px;\n font-family: 'courier new', courier;\n color: #fff;\n }\n\n ul, li {\n color: #fff;\n margin: 0;\n padding: 0;\n line-height: normal;\n }\n\n li {\n font-weight: bold;\n list-style: none;\n font-size: 22px;\n }\n\n .primary-link {\n color: lime;\n font-size: 120%;\n font-weight: bold;\n display: inline-block;\n margin: 20px auto;\n }\n}\n",".login-modal {\n display: flex;\n flex-direction: column;\n align-items: center;\n\n input {\n margin: 5px;\n font-size: 20px;\n font-weight: bold;\n }\n\n button {\n width: 120px;\n color: white;\n background-color: #4caf50;\n transition: all 0.2s ease-in;\n border: none;\n border-radius: 10px;\n font-size: 22px;\n padding: 5px;\n margin-top: 10px;\n\n &:hover {\n color: #4caf50;\n background-color: white;\n cursor: pointer;\n }\n }\n}\n",".signup-modal {\n display: flex;\n flex-direction: column;\n align-items: center;\n\n input {\n margin: 5px;\n font-size: 20px;\n font-weight: bold;\n }\n\n button {\n width: 120px;\n color: white;\n background-color: #4caf50;\n transition: all 0.2s ease-in;\n border: none;\n border-radius: 10px;\n font-size: 22px;\n padding: 5px;\n margin-top: 10px;\n\n &:hover {\n color: #4caf50;\n background-color: white;\n cursor: pointer;\n }\n }\n}\n","@import url(\"https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap\");\n\n.connectionErrorModal {\n animation: fadeIn 1s ease both;\n background: none;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 3;\n\n .content {\n width: 400px;\n padding: 1rem 3rem;\n padding-top: 2rem;\n border-radius: 10px;\n font-family: Poppins, sans-serif;\n\n h2 {\n font-weight: 600;\n font-size: 2rem;\n }\n\n p {\n font-size: 1rem;\n line-height: 1rem;\n padding: 0.5rem 0;\n }\n\n button {\n margin: 5px;\n }\n }\n\n .reload-btn {\n background: green;\n color: black;\n border: 1px solid black;\n padding: 0.5rem 1rem;\n border-radius: 10px;\n font-size: 1rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s ease;\n\n &:hover {\n background: black;\n color: white;\n }\n }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n backdrop-filter: blur(0px);\n }\n to {\n opacity: 1;\n backdrop-filter: blur(8px);\n }\n }\n}\n",".panel {\n padding: 15px;\n margin: 8px;\n border-radius: 10px;\n background-color: rgb(34, 34, 34) !important;\n box-shadow: 0 0 0 3px rgba(51, 51, 51, 0.98);\n color: rgb(231, 231, 231);\n box-sizing: border-box;\n}\n\n.shop-btn{\n position: absolute;\n\n\n // left\n left: 0%;\n top: 0%;\n transform-origin: left;\n cursor: pointer;\n\n\n img {\n height: auto;\n display: inline-block;\n margin-left: 10px;\n margin-top: 10px;\n transition: transform 0.3s ease;\n }\n\n img:hover {\n transform: scale(1.1);\n }\n}\n\nfooter {\n position: absolute;\n bottom: 10px;\n width: 100%;\n pointer-events: none;\n height: 50px;\n color: rgb(231, 231, 231);\n text-align: center;\n padding-top: 15px;\n box-sizing: border-box;\n display: flex;\n justify-content: center;\n flex-direction: row;\n gap: 30px;\n\n a {\n font-size: 30px;\n text-decoration: underline;\n pointer-events: auto;\n }\n\n}\n\n.auth-buttons {\n position: absolute;\n top:5px;\n right: 5px;\n display: flex;\n flex-direction: column;\n transform-origin: top right;\n\n .dropdown {\n\n .dropdown-menu {\n background-color: #f9f9f9;\n padding: 12px 16px;\n border-radius: 10px;\n right: 10px;\n user-select: none;\n display: none;\n\n li {\n list-style: none;\n }\n\n .dropdown-item {\n font-size: 18px;\n color: green;\n\n &:active {\n background-color: transparent;\n color: unset;\n }\n }\n }\n }\n .dropdown:hover .dropdown-menu {\n display: block;\n }\n\n .auth-username {\n font-size: 40px;\n margin-top: 20px;\n margin-right: 40px;\n cursor: pointer;\n color: white;\n }\n .auth-btn {\n margin-bottom: 10px;\n height: 70px;\n margin-right: 5px;\n\n transition: all 0.2s ease-in-out;\n\n &:hover {\n cursor: pointer;\n transform: scale(1.05);\n }\n }\n}\n\n*::-webkit-scrollbar, *::-webkit-scrollbar-button, *::-webkit-scrollbar-track, *::-webkit-scrollbar-track-piece, *::-webkit-scrollbar-thumb, *::-webkit-scrollbar-corner, *::-webkit-resizer {\n background: transparent;\n}\n*::-webkit-scrollbar {\n width: 7px;\n border-radius: 5px;\n}\n*::-webkit-scrollbar-track-piece {\n border-radius: 5px;\n}\n*::-webkit-scrollbar-thumb {\n background: #9e9e9e;\n border-radius: 5px;\n}\n*::-webkit-scrollbar-thumb:hover {\n background: #858585;\n}\n*::-webkit-scrollbar-button {\n width: 0;\n height: 0;\n}\n\n.connectionErrorModal {\n z-index: 100;\n}\n\n\ninput[type=text],\ninput[type=email],\ninput[type=password] {\n -webkit-touch-callout: text;\n -webkit-user-select: text;\n user-select: text;\n text-align: center;\n font-size: 26px;\n padding: 6px;\n border: none;\n outline: none;\n box-sizing: border-box;\n color: #4a4a4a;\n background-color: #e5e3e3;\n border-radius: 10px;\n}\ninput[type=text][disabled],\ninput[type=email][disabled],\ninput[type=password][disabled] {\n cursor: not-allowed;\n opacity: 0.7;\n}\n\n.login-modal,\n.signup-modal {\ninput {\n font-size: 20px;\n}\n}\n\na {\n color: #6eef95;\n text-decoration: none;\n}\na:hover {\n color: #29e763;\n}\na:active {\n color: #16c74c;\n}\n\n.altLink {\n color: #6eef95;\n font-size: 24px;\n text-decoration: none;\n}\n.altLink:hover {\n color: #40ea73;\n}\n.altLink:active {\n color: #19de54;\n}\n\n.inline {\n display: inline-block;\n}\n\nspan {\n font-size: inherit;\n}\n\n.material-icons {\n vertical-align: sub;\n}\n\n.ui-icon {\n font-size: 30px;\n vertical-align: middle;\n}\n\n\n\n.mainMenu {\n background-color: rgb(44, 118, 22);\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 10;\n}\n\n.mainMenu.loaded {\n background-color: rgba(0, 0, 0, 0.507);\n display: block;\n}\n\n#menuContainer {\n width: 100%;\n white-space: nowrap;\n text-align: center;\n position: absolute;\n top: 45%;\n transform: translateY(-50%);\n pointer-events: auto;\n\n}\n\n#contentt {\n transform: translateY(-50%);\n height: 100%;\n width: 100%;\n pointer-events: none;\n}\n\n.menuCard {\n text-align: left;\n white-space: normal;\n word-wrap: break-word;\n padding: 18px;\n overflow: hidden;\n}\n\n.menuHeader {\n font-size: 24px;\n color: #dadada;\n margin-bottom: 5px;\n}\n\n.menuSubheader {\n font-size: 20px;\n color: #dadada;\n margin-bottom: 3px;\n}\n\n.menuText {\n font-size: 18px;\n color: #a8a8a8;\n margin-bottom: 10px;\n}\n\n.menuLink {\n font-size: 20px;\n}\n\n#gameName {\n font-size: 110px;\n text-shadow: #474747 3px 5px 2px;\n color: #fff;\n}\n\n.menuButton {\n text-align: center;\n font-size: 23px;\n padding: 6px;\n box-sizing: border-box;\n color: #fff;\n background-color: rgb(22, 143, 22);\n width: 100%;\n border-radius: 10px;\n cursor: pointer;\n box-shadow: inset 0 -8px 0 rgba(0, 0, 0, 0.2941176471);\n transition: transform cubic-bezier(0.77, 0, 0.175, 1) 0.2s;\n transform: scale(1);\n}\n.menuButton:hover {\n transform: scale(1.05);\n}\n.menuButton:active {\n transform: scale(0.95);\n}\n\n#topRight1 {\n position: absolute;\n color: white;\n top: 20px;\n right: 20px;\n font-size: 24px;\n text-decoration: none;\n}\n\n#topRight2 {\n position: absolute;\n top: 54px;\n right: 20px;\n cursor: pointer;\n}\n\n#settingsButton {\n position: absolute;\n cursor: pointer;\n font-size: 35px;\n line-height: 20px;\n bottom: 12px;\n left: 12px;\n transition: transform cubic-bezier(0.77, 0, 0.175, 1) 0.1s;\n}\n#settingsButton:hover {\n transform: scale(1.05);\n}\n#settingsButton:active {\n transform: scale(0.95);\n}\n\n.fullWidth {\n width: 100%;\n}\n\n#menuCardHolder #adBelow {\n height: auto !important;\n position: absolute;\n bottom: auto;\n // center the ad\n left: 50%;\n transform: translateX(-50%);\n box-sizing: border-box;\n display: 'inline-block' !important;\n}\n#menuCardHolder .menu {\n display: flex;\n}\n#menuCardHolder .menu * {\n box-sizing: border-box;\n}\n#menuCardHolder .menu a {\n cursor: pointer;\n}\n#menuCardHolder .menu #nameInput {\n transition: transform cubic-bezier(0.77, 0, 0.175, 1) 0.2s;\n transform: scale(1);\n}\n#menuCardHolder .menu #nameInput:focus {\n transform: scale(1.05);\n}\n#menuCardHolder .menu #serverInfo {\n margin-bottom: 8px;\n text-align: center;\n}\n#menuCardHolder .menu .joinCard {\n width: 375px;\n}\n#menuCardHolder .menu .accountCard {\n width: 310px;\n}\n#menuCardHolder .menu .forumCard {\n width: 310px;\n padding: 0;\n}\n\n#linksContainer {\n position: absolute;\n bottom: 12px;\n left: 12px;\n text-align: right;\n font-size: 20px;\n}\n\n#loadingText {\n font-size: 45px;\n color: #fff;\n text-align: center;\n}\n#loadingText a {\n display: block;\n}\n\n.joinCardInput {\n width: 100%;\n}\n.joinCardInput #nameInput,\n.joinCardInput #enterGame {\n height: 44px;\n top: 50%;\n width: 100%;\n margin-bottom: 10px;\n}\n.joinCardInput #enterGame {\n height: 74px;\n font-size: 48px;\n line-height: 50px;\n // background-image: url(\"../img/ui/bg.png\");\n background-position: 0px 0px;\n // background-repeat: repeat;\n // animation: animatedBackground 500s linear infinite;\n}\n@keyframes animatedBackground {\n 0% {\n background-position: 0 0;\n }\n 100% {\n background-position: -10000px 20000px;\n }\n}\n\n.joinCardContent {\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.account-badge {\n height: 1.5em;\n -webkit-user-drag: none;\n margin-right: 4px;\n}\n\n#serverBrowser {\n border: none;\n text-align: center;\n font-size: 16px;\n padding: 6px;\n box-sizing: border-box;\n color: rgb(70, 70, 70);\n background-color: #f7faf6;\n width: 100%;\n border-radius: 10px;\n margin-bottom: 10px;\n cursor: pointer;\n}\n@media only screen and (max-width: 1040px) {\n #menuCardHolder #adBelow {\n display: none;\n }\n .forumCard {\n display: none;\n }\n #menuCardHolder .menu {\n flex-direction: column;\n }\n #menuCardHolder .menu .menuCard {\n width: 85vw !important;\n }\n #menuCardHolder .menu .joinCard {\n order: -1;\n }\n}\n@media only screen and (max-width: 768px) {\n #menuCardHolder #adBelow {\n display: none;\n }\n #loadingText {\n margin-top: 20px;\n }\n #mainMenu {\n overflow: scroll;\n }\n #gameName {\n font-size: 55px;\n line-height: 2;\n }\n #gameName-mobile {\n display: initial !important;\n }\n #setupCard {\n width: 260px;\n margin-top: 4px;\n }\n #topRight1 {\n top: 8px;\n left: 33%;\n right: inherit;\n transform: translateX(-50%);\n }\n #topRight2 {\n top: 8px;\n left: 66%;\n right: inherit;\n transform: translateX(-50%);\n }\n #linksContainer {\n display: none;\n }\n}","/* General Styles */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* Modal Styles */\n.shop-modal {\n display: flex;\n flex-direction: column;\n height: calc(100vh - 100px);\n width: calc(100vw - 100px);\n max-width: 1000px;\n margin: 20px auto;\n background: linear-gradient(to bottom left, #0a3e0a 5%, green 100%);\n box-shadow: 0 20px 40px -14px rgba(0, 0, 0, 0.25);\n padding: 20px;\n border-radius: 10px;\n color: #ffffff;\n /* White text color for modal */\n\n}\n\n/* Skins Container Styles */\n.skins {\n flex-grow: 1;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-around;\n overflow-y: auto;\n overflow-x: hidden;\n align-content: flex-start;\n}\n\n.shop-title {\n font-size: 30px;\n text-align: center;\n color: #ffffff;\n /* Adjusting header color to fit modal style */\n margin: 0;\n}\n\n.shop-desc {\n font-size: 20px;\n text-align: center;\n color: #ffffff;\n /* Adjusting header color to fit modal style */\n margin: 0;\n margin-bottom: 10px;\n}\n\n.gem {\n transform: translate(0, 25%);\n}\n\n/* Skin Card Styles */\n.skin-card {\n margin: 10px;\n border-radius: 10px;\n background-color: #272727;\n /* Dark background for cards */\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: center;\n padding: 10px;\n box-shadow: 0 10px 20px -10px rgba(0, 0, 0, 0.25);\n width: 200px;\n\n .skin-name {\n font-size: 25px;\n color: white;\n text-align: center;\n font-weight: 700;\n }\n\n .skin-img {\n width: 150px;\n height: 150px;\n background-size: cover;\n background-position: center;\n }\n\n .skin-count {\n font-size: 20px;\n color: white;\n text-align: center;\n font-weight: normal;\n margin-top: 10px;\n margin-bottom: 10px;\n }\n\n .buy-button {\n color: #ffffff;\n padding: 0.8rem;\n margin-top: 5px;\n font-size: 14px;\n text-transform: uppercase;\n border-radius: 4px;\n font-weight: 400;\n display: block;\n width: 100%;\n cursor: pointer;\n border: 1px solid rgba(255, 255, 255, 0.2);\n background: transparent;\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.2);\n }\n }\n}\n\n// low height\n@media screen and (max-height: 600px) {\n\n .skin-card {\n margin: 5px;\n\n .skin-img {\n width: 50px;\n height: 50px;\n margin: 0;\n }\n\n .skin-name {\n font-size: 20px;\n margin: 0;\n }\n\n .skin-count {\n font-size: 15px;\n margin: 0;\n }\n\n .buy-button {\n font-size: 12px;\n margin: 0;\n margin-top: 5px;\n padding: 0.2rem;\n }\n\n .skin-desc {\n font-size: 12px;\n margin: 0;\n }\n\n }\n\n .shop-title {\n font-size: 20px;\n }\n\n .shop-desc {\n font-size: 15px;\n }\n}\n\n/* General Styling Adjustments */\nh1 {\n font-size: 24px;\n font-weight: 400;\n text-align: center;\n color: #ffffff;\n /* Adjusting header color to fit modal style */\n}\n\n.highlight {\n background-color: yellow;\n}\n\n.search-bar {\n display: flex;\n justify-content: center;\n margin-bottom: 10px;\n}\n\n.search-bar input {\n width: 50%;\n padding: 5px;\n border: none;\n border-radius: 20px;\n box-shadow: 0 0 15px 4px rgba(0, 0, 0, 0.06);\n font-size: 15px;\n}\n\n.search-bar input:focus {\n outline: none;\n box-shadow: 0 0 15px 4px rgba(0, 0, 0, 0.1);\n}\n\n.search-bar input::placeholder {\n color: #aaa;\n}\n\n.badges {\n display: flex;\n justify-content: center;\n margin-bottom: 5px;\n}\n\n.badges button {\n margin: 0 10px;\n padding: 5px 10px;\n border: none;\n border-radius: 20px;\n background-color: #ddd;\n cursor: pointer;\n transition: background-color 0.3s ease;\n}\n\n.badges button.active {\n background-color: yellow;\n border: 3px solid #000;\n}",".reward-container {\n display: flex;\n justify-content: space-around;\n align-items: center;\n flex-wrap: wrap;\n gap: 20px;\n margin-top:\n20px;\n}\n\n\n.reward-box {\n display: flex;\n align-items: center;\n justify-content: start;\n flex: 0 1 auto;\n border: 2px solid transparent;\n border-radius: 10px;\n padding: 10px;\n text-align: left; // Align text to the left\n gap: 10px; // Space between icon and text\n transition: border-color 0.3s ease-in-out, transform 0.3s ease-in-out;\n\n &:hover {\n border-color: #fff;\n transform: scale(1.05);\n }\n\n .icon {\n // Icon styles, adjust as needed\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .text {\n // Text styles, adjust as needed\n font-size: 16px;\n font-weight: bold;\n }\n}\n\n\n// Different colors for each type of reward\n.gems {\nbackground-color: #04390f;\n}\n\n.skinsbox {\nbackground-color: #b52555;\n}\n\n.xp {\nbackground-color: #1d9fe1;\n}","#logged-in {\n .stats {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n margin: 0 0 0 1rem;\n padding: 0.5rem 0.5rem 0.5rem 0;\n border-left: 1px solid var(--color-border);\n gap: 1rem;\n }\n\n h1 {\n margin-top: 0;\n margin-bottom: 0;\n }\n\n .profilebutton {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.5rem;\n border-radius: 0.5rem;\n background-color: rgb(22, 143, 22);\n color: white;\n cursor: pointer;\n transition: transform 0.3s ease;\n\n &:hover {\n transform: scale(1.1);\n }\n }\n\n}","@import url(\"https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap\");\n\n.global-leaderboard-body {\n\t@import '~bootstrap/scss/bootstrap';\n\n\t--bs-table-bg: transparent;\n\t--bs-body-bg: transparent;\n\n\t.btn {\n\t\t--bs-btn-border-radius: 0.25rem;\n\n\t\t&:focus {\n\t\t\tbox-shadow: 0 0 0 0.25rem rgba(130,138,145,0.5);\n\t\t}\n\t}\n\n\t.dropdown {\n\t\tmargin-right: 5px;\n\n\t\t.dropdown-menu {\n\t\t\tborder-radius: 0.25rem;\n\t\t\tbackground: #ffffff;\n\t\t\tborder: 1px solid rgba(0,0,0,0.15);\n\n\t\t\tli {\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\t}\n\n\tbackground: #f9f9f9;\n\tfont-family: \"Roboto\", sans-serif;\n\n\t.main-content {\n\t\tpadding-top: 100px;\n\t\tpadding-bottom: 100px;\n\n\t\t.leaderboard-card {\n\t\t\tbackground: #fff;\n\t\t\tmargin-bottom: 30px;\n\t\t\tborder-radius: 5px;\n\t\t\toverflow: hidden;\n\t\t\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n\n\t\t\t&__top {\n\t\t\t\tbackground: #f9f6ff;\n\t\t\t\tpadding: 20px 0 10px 0;\n\t\t\t}\n\n\t\t\t&__body {\n\t\t\t\tpadding: 15px;\n\t\t\t\tmargin-top: -20px;\n\t\t\t}\n\n\t\t\t&--first {\n\t\t\t\ttransform: scale(1.05);\n\n\t\t\t\t.leaderboard-card__top {\n\t\t\t\t\tbackground: linear-gradient(45deg, #7e57c2, #ab47bc);\n\t\t\t\t\tcolor: #fff;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t.table {\n\t\t\tborder-spacing: 0 15px;\n\t\t\tborder-collapse: separate;\n\n\t\t\tthead tr th,\n\t\t\tthead tr td,\n\t\t\ttbody tr th,\n\t\t\ttbody tr td {\n\t\t\t\tvertical-align: middle;\n\t\t\t\tborder: none;\n\n\t\t\t\t&:nth-last-child(1) {\n\t\t\t\t\ttext-align: center;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttbody tr {\n\t\t\t\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n\t\t\t\tborder-radius: 5px;\n\n\t\t\t\ttd {\n\t\t\t\t\tbackground: #fff;\n\n\t\t\t\t\t&:nth-child(1) {\n\t\t\t\t\t\tborder-radius: 5px 0 0 5px;\n\t\t\t\t\t}\n\n\t\t\t\t\t&:nth-last-child(1) {\n\t\t\t\t\t\tborder-radius: 0 5px 5px 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-color: #{$mark-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n --#{$prefix}highlight-color: #{$mark-color-dark};\n --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n color: var(--#{$prefix}highlight-color);\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`\r\n * \r\n * )\r\n * }\r\n */\n\nexport const useDispatch = /*#__PURE__*/createDispatchHook();","////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Actions represent the type of change to a location value.\n */\nexport enum Action {\n /**\n * A POP indicates a change to an arbitrary index in the history stack, such\n * as a back or forward navigation. It does not describe the direction of the\n * navigation, only that the current index changed.\n *\n * Note: This is the default action for newly created history objects.\n */\n Pop = \"POP\",\n\n /**\n * A PUSH indicates a new entry being added to the history stack, such as when\n * a link is clicked and a new page loads. When this happens, all subsequent\n * entries in the stack are lost.\n */\n Push = \"PUSH\",\n\n /**\n * A REPLACE indicates the entry at the current index in the history stack\n * being replaced by a new one.\n */\n Replace = \"REPLACE\",\n}\n\n/**\n * The pathname, search, and hash values of a URL.\n */\nexport interface Path {\n /**\n * A URL pathname, beginning with a /.\n */\n pathname: string;\n\n /**\n * A URL search string, beginning with a ?.\n */\n search: string;\n\n /**\n * A URL fragment identifier, beginning with a #.\n */\n hash: string;\n}\n\n// TODO: (v7) Change the Location generic default from `any` to `unknown` and\n// remove Remix `useLocation` wrapper.\n\n/**\n * An entry in a history stack. A location contains information about the\n * URL path, as well as possibly some arbitrary state and a key.\n */\nexport interface Location extends Path {\n /**\n * A value of arbitrary data associated with this location.\n */\n state: State;\n\n /**\n * A unique string associated with this location. May be used to safely store\n * and retrieve data in some other storage API, like `localStorage`.\n *\n * Note: This value is always \"default\" on the initial location.\n */\n key: string;\n}\n\n/**\n * A change to the current location.\n */\nexport interface Update {\n /**\n * The action that triggered the change.\n */\n action: Action;\n\n /**\n * The new location.\n */\n location: Location;\n\n /**\n * The delta between this location and the former location in the history stack\n */\n delta: number | null;\n}\n\n/**\n * A function that receives notifications about location changes.\n */\nexport interface Listener {\n (update: Update): void;\n}\n\n/**\n * Describes a location that is the destination of some navigation, either via\n * `history.push` or `history.replace`. This may be either a URL or the pieces\n * of a URL path.\n */\nexport type To = string | Partial;\n\n/**\n * A history is an interface to the navigation stack. The history serves as the\n * source of truth for the current location, as well as provides a set of\n * methods that may be used to change it.\n *\n * It is similar to the DOM's `window.history` object, but with a smaller, more\n * focused API.\n */\nexport interface History {\n /**\n * The last action that modified the current location. This will always be\n * Action.Pop when a history instance is first created. This value is mutable.\n */\n readonly action: Action;\n\n /**\n * The current location. This value is mutable.\n */\n readonly location: Location;\n\n /**\n * Returns a valid href for the given `to` value that may be used as\n * the value of an attribute.\n *\n * @param to - The destination URL\n */\n createHref(to: To): string;\n\n /**\n * Returns a URL for the given `to` value\n *\n * @param to - The destination URL\n */\n createURL(to: To): URL;\n\n /**\n * Encode a location the same way window.history would do (no-op for memory\n * history) so we ensure our PUSH/REPLACE navigations for data routers\n * behave the same as POP\n *\n * @param to Unencoded path\n */\n encodeLocation(to: To): Path;\n\n /**\n * Pushes a new location onto the history stack, increasing its length by one.\n * If there were any entries in the stack after the current one, they are\n * lost.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n push(to: To, state?: any): void;\n\n /**\n * Replaces the current location in the history stack with a new one. The\n * location that was replaced will no longer be available.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n replace(to: To, state?: any): void;\n\n /**\n * Navigates `n` entries backward/forward in the history stack relative to the\n * current index. For example, a \"back\" navigation would use go(-1).\n *\n * @param delta - The delta in the stack index\n */\n go(delta: number): void;\n\n /**\n * Sets up a listener that will be called whenever the current location\n * changes.\n *\n * @param listener - A function that will be called when the location changes\n * @returns unlisten - A function that may be used to stop listening\n */\n listen(listener: Listener): () => void;\n}\n\ntype HistoryState = {\n usr: any;\n key?: string;\n idx: number;\n};\n\nconst PopStateEventType = \"popstate\";\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Memory History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A user-supplied object that describes a location. Used when providing\n * entries to `createMemoryHistory` via its `initialEntries` option.\n */\nexport type InitialEntry = string | Partial;\n\nexport type MemoryHistoryOptions = {\n initialEntries?: InitialEntry[];\n initialIndex?: number;\n v5Compat?: boolean;\n};\n\n/**\n * A memory history stores locations in memory. This is useful in stateful\n * environments where there is no web browser, such as node tests or React\n * Native.\n */\nexport interface MemoryHistory extends History {\n /**\n * The current index in the history stack.\n */\n readonly index: number;\n}\n\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\nexport function createMemoryHistory(\n options: MemoryHistoryOptions = {}\n): MemoryHistory {\n let { initialEntries = [\"/\"], initialIndex, v5Compat = false } = options;\n let entries: Location[]; // Declare so we can access from createMemoryLocation\n entries = initialEntries.map((entry, index) =>\n createMemoryLocation(\n entry,\n typeof entry === \"string\" ? null : entry.state,\n index === 0 ? \"default\" : undefined\n )\n );\n let index = clampIndex(\n initialIndex == null ? entries.length - 1 : initialIndex\n );\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n function clampIndex(n: number): number {\n return Math.min(Math.max(n, 0), entries.length - 1);\n }\n function getCurrentLocation(): Location {\n return entries[index];\n }\n function createMemoryLocation(\n to: To,\n state: any = null,\n key?: string\n ): Location {\n let location = createLocation(\n entries ? getCurrentLocation().pathname : \"/\",\n to,\n state,\n key\n );\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in memory history: ${JSON.stringify(\n to\n )}`\n );\n return location;\n }\n\n function createHref(to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n let history: MemoryHistory = {\n get index() {\n return index;\n },\n get action() {\n return action;\n },\n get location() {\n return getCurrentLocation();\n },\n createHref,\n createURL(to) {\n return new URL(createHref(to), \"http://localhost\");\n },\n encodeLocation(to: To) {\n let path = typeof to === \"string\" ? parsePath(to) : to;\n return {\n pathname: path.pathname || \"\",\n search: path.search || \"\",\n hash: path.hash || \"\",\n };\n },\n push(to, state) {\n action = Action.Push;\n let nextLocation = createMemoryLocation(to, state);\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 1 });\n }\n },\n replace(to, state) {\n action = Action.Replace;\n let nextLocation = createMemoryLocation(to, state);\n entries[index] = nextLocation;\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 0 });\n }\n },\n go(delta) {\n action = Action.Pop;\n let nextIndex = clampIndex(index + delta);\n let nextLocation = entries[nextIndex];\n index = nextIndex;\n if (listener) {\n listener({ action, location: nextLocation, delta });\n }\n },\n listen(fn: Listener) {\n listener = fn;\n return () => {\n listener = null;\n };\n },\n };\n\n return history;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Browser History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A browser history stores the current location in regular URLs in a web\n * browser environment. This is the standard for most web apps and provides the\n * cleanest URLs the browser's address bar.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#browserhistory\n */\nexport interface BrowserHistory extends UrlHistory {}\n\nexport type BrowserHistoryOptions = UrlHistoryOptions;\n\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\nexport function createBrowserHistory(\n options: BrowserHistoryOptions = {}\n): BrowserHistory {\n function createBrowserLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let { pathname, search, hash } = window.location;\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createBrowserHref(window: Window, to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n return getUrlBasedHistory(\n createBrowserLocation,\n createBrowserHref,\n null,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hash History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A hash history stores the current location in the fragment identifier portion\n * of the URL in a web browser environment.\n *\n * This is ideal for apps that do not control the server for some reason\n * (because the fragment identifier is never sent to the server), including some\n * shared hosting environments that do not provide fine-grained controls over\n * which pages are served at which URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#hashhistory\n */\nexport interface HashHistory extends UrlHistory {}\n\nexport type HashHistoryOptions = UrlHistoryOptions;\n\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don't want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\nexport function createHashHistory(\n options: HashHistoryOptions = {}\n): HashHistory {\n function createHashLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n } = parsePath(window.location.hash.substr(1));\n\n // Hash URL should always have a leading / just like window.location.pathname\n // does, so if an app ends up at a route like /#something then we add a\n // leading slash so all of our path-matching behaves the same as if it would\n // in a browser router. This is particularly important when there exists a\n // root splat route () since that matches internally against\n // \"/*\" and we'd expect /#something to 404 in a hash router app.\n if (!pathname.startsWith(\"/\") && !pathname.startsWith(\".\")) {\n pathname = \"/\" + pathname;\n }\n\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createHashHref(window: Window, to: To) {\n let base = window.document.querySelector(\"base\");\n let href = \"\";\n\n if (base && base.getAttribute(\"href\")) {\n let url = window.location.href;\n let hashIndex = url.indexOf(\"#\");\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n\n return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n }\n\n function validateHashLocation(location: Location, to: To) {\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in hash history.push(${JSON.stringify(\n to\n )})`\n );\n }\n\n return getUrlBasedHistory(\n createHashLocation,\n createHashHref,\n validateHashLocation,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region UTILS\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @private\n */\nexport function invariant(value: boolean, message?: string): asserts value;\nexport function invariant(\n value: T | null | undefined,\n message?: string\n): asserts value is T;\nexport function invariant(value: any, message?: string) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\n\nexport function warning(cond: any, message: string) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== \"undefined\") console.warn(message);\n\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience, so you can more easily\n // find the source for a warning that appears in the console by\n // enabling \"pause on exceptions\" in your JavaScript debugger.\n throw new Error(message);\n // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\n\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n\n/**\n * For browser-based histories, we combine the state and key into an object\n */\nfunction getHistoryState(location: Location, index: number): HistoryState {\n return {\n usr: location.state,\n key: location.key,\n idx: index,\n };\n}\n\n/**\n * Creates a Location object with a unique key from the given Path\n */\nexport function createLocation(\n current: string | Location,\n to: To,\n state: any = null,\n key?: string\n): Readonly {\n let location: Readonly = {\n pathname: typeof current === \"string\" ? current : current.pathname,\n search: \"\",\n hash: \"\",\n ...(typeof to === \"string\" ? parsePath(to) : to),\n state,\n // TODO: This could be cleaned up. push/replace should probably just take\n // full Locations now and avoid the need to run through this flow at all\n // But that's a pretty big refactor to the current test suite so going to\n // keep as is for the time being and just let any incoming keys take precedence\n key: (to && (to as Location).key) || key || createKey(),\n };\n return location;\n}\n\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\nexport function createPath({\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n}: Partial) {\n if (search && search !== \"?\")\n pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\")\n pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\n\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\nexport function parsePath(path: string): Partial {\n let parsedPath: Partial = {};\n\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n\n if (path) {\n parsedPath.pathname = path;\n }\n }\n\n return parsedPath;\n}\n\nexport interface UrlHistory extends History {}\n\nexport type UrlHistoryOptions = {\n window?: Window;\n v5Compat?: boolean;\n};\n\nfunction getUrlBasedHistory(\n getLocation: (window: Window, globalHistory: Window[\"history\"]) => Location,\n createHref: (window: Window, to: To) => string,\n validateLocation: ((location: Location, to: To) => void) | null,\n options: UrlHistoryOptions = {}\n): UrlHistory {\n let { window = document.defaultView!, v5Compat = false } = options;\n let globalHistory = window.history;\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n let index = getIndex()!;\n // Index should only be null when we initialize. If not, it's because the\n // user called history.pushState or history.replaceState directly, in which\n // case we should log a warning as it will result in bugs.\n if (index == null) {\n index = 0;\n globalHistory.replaceState({ ...globalHistory.state, idx: index }, \"\");\n }\n\n function getIndex(): number {\n let state = globalHistory.state || { idx: null };\n return state.idx;\n }\n\n function handlePop() {\n action = Action.Pop;\n let nextIndex = getIndex();\n let delta = nextIndex == null ? null : nextIndex - index;\n index = nextIndex;\n if (listener) {\n listener({ action, location: history.location, delta });\n }\n }\n\n function push(to: To, state?: any) {\n action = Action.Push;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex() + 1;\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n\n // try...catch because iOS limits us to 100 pushState calls :/\n try {\n globalHistory.pushState(historyState, \"\", url);\n } catch (error) {\n // If the exception is because `state` can't be serialized, let that throw\n // outwards just like a replace call would so the dev knows the cause\n // https://html.spec.whatwg.org/multipage/nav-history-apis.html#shared-history-push/replace-state-steps\n // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal\n if (error instanceof DOMException && error.name === \"DataCloneError\") {\n throw error;\n }\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 1 });\n }\n }\n\n function replace(to: To, state?: any) {\n action = Action.Replace;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex();\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n globalHistory.replaceState(historyState, \"\", url);\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 0 });\n }\n }\n\n function createURL(to: To): URL {\n // window.location.origin is \"null\" (the literal string value) in Firefox\n // under certain conditions, notably when serving from a local HTML file\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n let base =\n window.location.origin !== \"null\"\n ? window.location.origin\n : window.location.href;\n\n let href = typeof to === \"string\" ? to : createPath(to);\n invariant(\n base,\n `No window.location.(origin|href) available to create URL for href: ${href}`\n );\n return new URL(href, base);\n }\n\n let history: History = {\n get action() {\n return action;\n },\n get location() {\n return getLocation(window, globalHistory);\n },\n listen(fn: Listener) {\n if (listener) {\n throw new Error(\"A history only accepts one active listener\");\n }\n window.addEventListener(PopStateEventType, handlePop);\n listener = fn;\n\n return () => {\n window.removeEventListener(PopStateEventType, handlePop);\n listener = null;\n };\n },\n createHref(to) {\n return createHref(window, to);\n },\n createURL,\n encodeLocation(to) {\n // Encode a Location the same way window.location would\n let url = createURL(to);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n };\n },\n push,\n replace,\n go(n) {\n return globalHistory.go(n);\n },\n };\n\n return history;\n}\n\n//#endregion\n","// The primary entry point assumes we're working with standard ReactDOM/RN, but\n// older versions that do not include `useSyncExternalStore` (React 16.9 - 17.x).\n// Because of that, the useSyncExternalStore compat shim is needed.\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector';\nimport { unstable_batchedUpdates as batch } from './utils/reactBatchedUpdates';\nimport { setBatch } from './utils/batch';\nimport { initializeUseSelector } from './hooks/useSelector';\nimport { initializeConnect } from './components/connect';\ninitializeUseSelector(useSyncExternalStoreWithSelector);\ninitializeConnect(useSyncExternalStore); // Enable batched updates in our subscriptions for use\n// with standard React renderers (ReactDOM, React Native)\n\nsetBatch(batch);\nexport { batch };\nexport * from './exports';","import type { Location, Path, To } from \"./history\";\nimport { invariant, parsePath, warning } from \"./history\";\n\n/**\n * Map of routeId -> data returned from a loader/action/error\n */\nexport interface RouteData {\n [routeId: string]: any;\n}\n\nexport enum ResultType {\n data = \"data\",\n deferred = \"deferred\",\n redirect = \"redirect\",\n error = \"error\",\n}\n\n/**\n * Successful result from a loader or action\n */\nexport interface SuccessResult {\n type: ResultType.data;\n data: any;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Successful defer() result from a loader or action\n */\nexport interface DeferredResult {\n type: ResultType.deferred;\n deferredData: DeferredData;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Redirect result from a loader or action\n */\nexport interface RedirectResult {\n type: ResultType.redirect;\n status: number;\n location: string;\n revalidate: boolean;\n reloadDocument?: boolean;\n}\n\n/**\n * Unsuccessful result from a loader or action\n */\nexport interface ErrorResult {\n type: ResultType.error;\n error: any;\n headers?: Headers;\n}\n\n/**\n * Result from a loader or action - potentially successful or unsuccessful\n */\nexport type DataResult =\n | SuccessResult\n | DeferredResult\n | RedirectResult\n | ErrorResult;\n\ntype LowerCaseFormMethod = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\ntype UpperCaseFormMethod = Uppercase;\n\n/**\n * Users can specify either lowercase or uppercase form methods on `

`,\n * useSubmit(), ``, etc.\n */\nexport type HTMLFormMethod = LowerCaseFormMethod | UpperCaseFormMethod;\n\n/**\n * Active navigation/fetcher form methods are exposed in lowercase on the\n * RouterState\n */\nexport type FormMethod = LowerCaseFormMethod;\nexport type MutationFormMethod = Exclude;\n\n/**\n * In v7, active navigation/fetcher form methods are exposed in uppercase on the\n * RouterState. This is to align with the normalization done via fetch().\n */\nexport type V7_FormMethod = UpperCaseFormMethod;\nexport type V7_MutationFormMethod = Exclude;\n\nexport type FormEncType =\n | \"application/x-www-form-urlencoded\"\n | \"multipart/form-data\"\n | \"application/json\"\n | \"text/plain\";\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\n/**\n * @private\n * Internal interface to pass around for action submissions, not intended for\n * external consumption\n */\nexport type Submission =\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: FormData;\n json: undefined;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: JsonValue;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: undefined;\n text: string;\n };\n\n/**\n * @private\n * Arguments passed to route loader/action functions. Same for now but we keep\n * this as a private implementation detail in case they diverge in the future.\n */\ninterface DataFunctionArgs {\n request: Request;\n params: Params;\n context?: Context;\n}\n\n// TODO: (v7) Change the defaults from any to unknown in and remove Remix wrappers:\n// ActionFunction, ActionFunctionArgs, LoaderFunction, LoaderFunctionArgs\n// Also, make them a type alias instead of an interface\n\n/**\n * Arguments passed to loader functions\n */\nexport interface LoaderFunctionArgs\n extends DataFunctionArgs {}\n\n/**\n * Arguments passed to action functions\n */\nexport interface ActionFunctionArgs\n extends DataFunctionArgs {}\n\n/**\n * Loaders and actions can return anything except `undefined` (`null` is a\n * valid return value if there is no data to return). Responses are preferred\n * and will ease any future migration to Remix\n */\ntype DataFunctionValue = Response | NonNullable | null;\n\n/**\n * Route loader function signature\n */\nexport interface LoaderFunction {\n (args: LoaderFunctionArgs):\n | Promise\n | DataFunctionValue;\n}\n\n/**\n * Route action function signature\n */\nexport interface ActionFunction {\n (args: ActionFunctionArgs):\n | Promise\n | DataFunctionValue;\n}\n\n/**\n * Arguments passed to shouldRevalidate function\n */\nexport interface ShouldRevalidateFunctionArgs {\n currentUrl: URL;\n currentParams: AgnosticDataRouteMatch[\"params\"];\n nextUrl: URL;\n nextParams: AgnosticDataRouteMatch[\"params\"];\n formMethod?: Submission[\"formMethod\"];\n formAction?: Submission[\"formAction\"];\n formEncType?: Submission[\"formEncType\"];\n text?: Submission[\"text\"];\n formData?: Submission[\"formData\"];\n json?: Submission[\"json\"];\n actionResult?: any;\n defaultShouldRevalidate: boolean;\n}\n\n/**\n * Route shouldRevalidate function signature. This runs after any submission\n * (navigation or fetcher), so we flatten the navigation/fetcher submission\n * onto the arguments. It shouldn't matter whether it came from a navigation\n * or a fetcher, what really matters is the URLs and the formData since loaders\n * have to re-run based on the data models that were potentially mutated.\n */\nexport interface ShouldRevalidateFunction {\n (args: ShouldRevalidateFunctionArgs): boolean;\n}\n\n/**\n * Function provided by the framework-aware layers to set `hasErrorBoundary`\n * from the framework-aware `errorElement` prop\n *\n * @deprecated Use `mapRouteProperties` instead\n */\nexport interface DetectErrorBoundaryFunction {\n (route: AgnosticRouteObject): boolean;\n}\n\n/**\n * Function provided by the framework-aware layers to set any framework-specific\n * properties from framework-agnostic properties\n */\nexport interface MapRoutePropertiesFunction {\n (route: AgnosticRouteObject): {\n hasErrorBoundary: boolean;\n } & Record;\n}\n\n/**\n * Keys we cannot change from within a lazy() function. We spread all other keys\n * onto the route. Either they're meaningful to the router, or they'll get\n * ignored.\n */\nexport type ImmutableRouteKey =\n | \"lazy\"\n | \"caseSensitive\"\n | \"path\"\n | \"id\"\n | \"index\"\n | \"children\";\n\nexport const immutableRouteKeys = new Set([\n \"lazy\",\n \"caseSensitive\",\n \"path\",\n \"id\",\n \"index\",\n \"children\",\n]);\n\ntype RequireOne = Exclude<\n {\n [K in keyof T]: K extends Key ? Omit & Required> : never;\n }[keyof T],\n undefined\n>;\n\n/**\n * lazy() function to load a route definition, which can add non-matching\n * related properties to a route\n */\nexport interface LazyRouteFunction {\n (): Promise>>;\n}\n\n/**\n * Base RouteObject with common props shared by all types of routes\n */\ntype AgnosticBaseRouteObject = {\n caseSensitive?: boolean;\n path?: string;\n id?: string;\n loader?: LoaderFunction;\n action?: ActionFunction;\n hasErrorBoundary?: boolean;\n shouldRevalidate?: ShouldRevalidateFunction;\n handle?: any;\n lazy?: LazyRouteFunction;\n};\n\n/**\n * Index routes must not have children\n */\nexport type AgnosticIndexRouteObject = AgnosticBaseRouteObject & {\n children?: undefined;\n index: true;\n};\n\n/**\n * Non-index routes may have children, but cannot have index\n */\nexport type AgnosticNonIndexRouteObject = AgnosticBaseRouteObject & {\n children?: AgnosticRouteObject[];\n index?: false;\n};\n\n/**\n * A route object represents a logical route, with (optionally) its child\n * routes organized in a tree-like structure.\n */\nexport type AgnosticRouteObject =\n | AgnosticIndexRouteObject\n | AgnosticNonIndexRouteObject;\n\nexport type AgnosticDataIndexRouteObject = AgnosticIndexRouteObject & {\n id: string;\n};\n\nexport type AgnosticDataNonIndexRouteObject = AgnosticNonIndexRouteObject & {\n children?: AgnosticDataRouteObject[];\n id: string;\n};\n\n/**\n * A data route object, which is just a RouteObject with a required unique ID\n */\nexport type AgnosticDataRouteObject =\n | AgnosticDataIndexRouteObject\n | AgnosticDataNonIndexRouteObject;\n\nexport type RouteManifest = Record;\n\n// Recursive helper for finding path parameters in the absence of wildcards\ntype _PathParam =\n // split path into individual path segments\n Path extends `${infer L}/${infer R}`\n ? _PathParam | _PathParam\n : // find params after `:`\n Path extends `:${infer Param}`\n ? Param extends `${infer Optional}?`\n ? Optional\n : Param\n : // otherwise, there aren't any params present\n never;\n\n/**\n * Examples:\n * \"/a/b/*\" -> \"*\"\n * \":a\" -> \"a\"\n * \"/a/:b\" -> \"b\"\n * \"/a/blahblahblah:b\" -> \"b\"\n * \"/:a/:b\" -> \"a\" | \"b\"\n * \"/:a/b/:c/*\" -> \"a\" | \"c\" | \"*\"\n */\ntype PathParam =\n // check if path is just a wildcard\n Path extends \"*\" | \"/*\"\n ? \"*\"\n : // look for wildcard at the end of the path\n Path extends `${infer Rest}/*`\n ? \"*\" | _PathParam\n : // look for params in the absence of wildcards\n _PathParam;\n\n// Attempt to parse the given string segment. If it fails, then just return the\n// plain string type as a default fallback. Otherwise, return the union of the\n// parsed string literals that were referenced as dynamic segments in the route.\nexport type ParamParseKey =\n // if you could not find path params, fallback to `string`\n [PathParam] extends [never] ? string : PathParam;\n\n/**\n * The parameters that were parsed from the URL path.\n */\nexport type Params = {\n readonly [key in Key]: string | undefined;\n};\n\n/**\n * A RouteMatch contains info about how a route matched a URL.\n */\nexport interface AgnosticRouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The route object that was used to match.\n */\n route: RouteObjectType;\n}\n\nexport interface AgnosticDataRouteMatch\n extends AgnosticRouteMatch {}\n\nfunction isIndexRoute(\n route: AgnosticRouteObject\n): route is AgnosticIndexRouteObject {\n return route.index === true;\n}\n\n// Walk the route tree generating unique IDs where necessary, so we are working\n// solely with AgnosticDataRouteObject's within the Router\nexport function convertRoutesToDataRoutes(\n routes: AgnosticRouteObject[],\n mapRouteProperties: MapRoutePropertiesFunction,\n parentPath: number[] = [],\n manifest: RouteManifest = {}\n): AgnosticDataRouteObject[] {\n return routes.map((route, index) => {\n let treePath = [...parentPath, index];\n let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n invariant(\n route.index !== true || !route.children,\n `Cannot specify children on an index route`\n );\n invariant(\n !manifest[id],\n `Found a route id collision on id \"${id}\". Route ` +\n \"id's must be globally unique within Data Router usages\"\n );\n\n if (isIndexRoute(route)) {\n let indexRoute: AgnosticDataIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n };\n manifest[id] = indexRoute;\n return indexRoute;\n } else {\n let pathOrLayoutRoute: AgnosticDataNonIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n children: undefined,\n };\n manifest[id] = pathOrLayoutRoute;\n\n if (route.children) {\n pathOrLayoutRoute.children = convertRoutesToDataRoutes(\n route.children,\n mapRouteProperties,\n treePath,\n manifest\n );\n }\n\n return pathOrLayoutRoute;\n }\n });\n}\n\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/utils/match-routes\n */\nexport function matchRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n locationArg: Partial | string,\n basename = \"/\"\n): AgnosticRouteMatch[] | null {\n let location =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n let pathname = stripBasename(location.pathname || \"/\", basename);\n\n if (pathname == null) {\n return null;\n }\n\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n\n let matches = null;\n for (let i = 0; matches == null && i < branches.length; ++i) {\n matches = matchRouteBranch(\n branches[i],\n // Incoming pathnames are generally encoded from either window.location\n // or from router.navigate, but we want to match against the unencoded\n // paths in the route definitions. Memory router locations won't be\n // encoded here but there also shouldn't be anything to decode so this\n // should be a safe operation. This avoids needing matchRoutes to be\n // history-aware.\n safelyDecodeURI(pathname)\n );\n }\n\n return matches;\n}\n\nexport interface UIMatch {\n id: string;\n pathname: string;\n params: AgnosticRouteMatch[\"params\"];\n data: Data;\n handle: Handle;\n}\n\nexport function convertRouteMatchToUiMatch(\n match: AgnosticDataRouteMatch,\n loaderData: RouteData\n): UIMatch {\n let { route, pathname, params } = match;\n return {\n id: route.id,\n pathname,\n params,\n data: loaderData[route.id],\n handle: route.handle,\n };\n}\n\ninterface RouteMeta<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n relativePath: string;\n caseSensitive: boolean;\n childrenIndex: number;\n route: RouteObjectType;\n}\n\ninterface RouteBranch<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n path: string;\n score: number;\n routesMeta: RouteMeta[];\n}\n\nfunction flattenRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n branches: RouteBranch[] = [],\n parentsMeta: RouteMeta[] = [],\n parentPath = \"\"\n): RouteBranch[] {\n let flattenRoute = (\n route: RouteObjectType,\n index: number,\n relativePath?: string\n ) => {\n let meta: RouteMeta = {\n relativePath:\n relativePath === undefined ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route,\n };\n\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(\n meta.relativePath.startsWith(parentPath),\n `Absolute route path \"${meta.relativePath}\" nested under path ` +\n `\"${parentPath}\" is not valid. An absolute child route path ` +\n `must start with the combined path of all its parent routes.`\n );\n\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n\n // Add the children before adding this route to the array, so we traverse the\n // route tree depth-first and child routes appear before their parents in\n // the \"flattened\" version.\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true,\n `Index routes must not have child routes. Please remove ` +\n `all child routes from route path \"${path}\".`\n );\n\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n\n // Routes without a path shouldn't ever match by themselves unless they are\n // index routes, so don't add them to the list of possible branches.\n if (route.path == null && !route.index) {\n return;\n }\n\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta,\n });\n };\n routes.forEach((route, index) => {\n // coarse-grain check for optional params\n if (route.path === \"\" || !route.path?.includes(\"?\")) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n\n return branches;\n}\n\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\nfunction explodeOptionalSegments(path: string): string[] {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n\n let [first, ...rest] = segments;\n\n // Optional path segments are denoted by a trailing `?`\n let isOptional = first.endsWith(\"?\");\n // Compute the corresponding required segment: `foo?` -> `foo`\n let required = first.replace(/\\?$/, \"\");\n\n if (rest.length === 0) {\n // Intepret empty string as omitting an optional segment\n // `[\"one\", \"\", \"three\"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n return isOptional ? [required, \"\"] : [required];\n }\n\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n\n let result: string[] = [];\n\n // All child paths with the prefix. Do this for all children before the\n // optional version for all children, so we get consistent ordering where the\n // parent optional aspect is preferred as required. Otherwise, we can get\n // child sections interspersed where deeper optional segments are higher than\n // parent optional segments, where for example, /:two would explode _earlier_\n // then /:one. By always including the parent as required _for all children_\n // first, we avoid this issue\n result.push(\n ...restExploded.map((subpath) =>\n subpath === \"\" ? required : [required, subpath].join(\"/\")\n )\n );\n\n // Then, if this is an optional value, add all child versions without\n if (isOptional) {\n result.push(...restExploded);\n }\n\n // for absolute paths, ensure `/` instead of empty segment\n return result.map((exploded) =>\n path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded\n );\n}\n\nfunction rankRouteBranches(branches: RouteBranch[]): void {\n branches.sort((a, b) =>\n a.score !== b.score\n ? b.score - a.score // Higher score first\n : compareIndexes(\n a.routesMeta.map((meta) => meta.childrenIndex),\n b.routesMeta.map((meta) => meta.childrenIndex)\n )\n );\n}\n\nconst paramRe = /^:\\w+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s: string) => s === \"*\";\n\nfunction computeScore(path: string, index: boolean | undefined): number {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n\n if (index) {\n initialScore += indexRouteValue;\n }\n\n return segments\n .filter((s) => !isSplat(s))\n .reduce(\n (score, segment) =>\n score +\n (paramRe.test(segment)\n ? dynamicSegmentValue\n : segment === \"\"\n ? emptySegmentValue\n : staticSegmentValue),\n initialScore\n );\n}\n\nfunction compareIndexes(a: number[], b: number[]): number {\n let siblings =\n a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n\n return siblings\n ? // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1]\n : // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0;\n}\n\nfunction matchRouteBranch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n branch: RouteBranch,\n pathname: string\n): AgnosticRouteMatch[] | null {\n let { routesMeta } = branch;\n\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches: AgnosticRouteMatch[] = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname =\n matchedPathname === \"/\"\n ? pathname\n : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath(\n { path: meta.relativePath, caseSensitive: meta.caseSensitive, end },\n remainingPathname\n );\n\n if (!match) return null;\n\n Object.assign(matchedParams, match.params);\n\n let route = meta.route;\n\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams as Params,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(\n joinPaths([matchedPathname, match.pathnameBase])\n ),\n route,\n });\n\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n\n return matches;\n}\n\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/utils/generate-path\n */\nexport function generatePath(\n originalPath: Path,\n params: {\n [key in PathParam]: string | null;\n } = {} as any\n): string {\n let path: string = originalPath;\n if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n warning(\n false,\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n path = path.replace(/\\*$/, \"/*\") as Path;\n }\n\n // ensure `/` is added at the beginning if the path is absolute\n const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n\n const stringify = (p: any) =>\n p == null ? \"\" : typeof p === \"string\" ? p : String(p);\n\n const segments = path\n .split(/\\/+/)\n .map((segment, index, array) => {\n const isLastSegment = index === array.length - 1;\n\n // only apply the splat if it's the last segment\n if (isLastSegment && segment === \"*\") {\n const star = \"*\" as PathParam;\n // Apply the splat\n return stringify(params[star]);\n }\n\n const keyMatch = segment.match(/^:(\\w+)(\\??)$/);\n if (keyMatch) {\n const [, key, optional] = keyMatch;\n let param = params[key as PathParam];\n invariant(optional === \"?\" || param != null, `Missing \":${key}\" param`);\n return stringify(param);\n }\n\n // Remove any optional markers from optional static segments\n return segment.replace(/\\?$/g, \"\");\n })\n // Remove empty segments\n .filter((segment) => !!segment);\n\n return prefix + segments.join(\"/\");\n}\n\n/**\n * A PathPattern is used to match on some portion of a URL pathname.\n */\nexport interface PathPattern {\n /**\n * A string to match against a URL pathname. May contain `:id`-style segments\n * to indicate placeholders for dynamic parameters. May also end with `/*` to\n * indicate matching the rest of the URL pathname.\n */\n path: Path;\n /**\n * Should be `true` if the static portions of the `path` should be matched in\n * the same case.\n */\n caseSensitive?: boolean;\n /**\n * Should be `true` if this pattern should match the entire URL pathname.\n */\n end?: boolean;\n}\n\n/**\n * A PathMatch contains info about how a PathPattern matched on a URL pathname.\n */\nexport interface PathMatch {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The pattern that was used to match.\n */\n pattern: PathPattern;\n}\n\ntype Mutable = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/utils/match-path\n */\nexport function matchPath<\n ParamKey extends ParamParseKey,\n Path extends string\n>(\n pattern: PathPattern | Path,\n pathname: string\n): PathMatch | null {\n if (typeof pattern === \"string\") {\n pattern = { path: pattern, caseSensitive: false, end: true };\n }\n\n let [matcher, compiledParams] = compilePath(\n pattern.path,\n pattern.caseSensitive,\n pattern.end\n );\n\n let match = pathname.match(matcher);\n if (!match) return null;\n\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params: Params = compiledParams.reduce>(\n (memo, { paramName, isOptional }, index) => {\n // We need to compute the pathnameBase here using the raw splat value\n // instead of using params[\"*\"] later because it will be decoded then\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname\n .slice(0, matchedPathname.length - splatValue.length)\n .replace(/(.)\\/+$/, \"$1\");\n }\n\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo[paramName] = undefined;\n } else {\n memo[paramName] = safelyDecodeURIComponent(value || \"\", paramName);\n }\n return memo;\n },\n {}\n );\n\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern,\n };\n}\n\ntype CompiledPathParam = { paramName: string; isOptional?: boolean };\n\nfunction compilePath(\n path: string,\n caseSensitive = false,\n end = true\n): [RegExp, CompiledPathParam[]] {\n warning(\n path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"),\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n\n let params: CompiledPathParam[] = [];\n let regexpSource =\n \"^\" +\n path\n .replace(/\\/*\\*?$/, \"\") // Ignore trailing / and /*, we'll handle it below\n .replace(/^\\/*/, \"/\") // Make sure it has a leading /\n .replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\") // Escape special regex chars\n .replace(/\\/:(\\w+)(\\?)?/g, (_: string, paramName: string, isOptional) => {\n params.push({ paramName, isOptional: isOptional != null });\n return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n });\n\n if (path.endsWith(\"*\")) {\n params.push({ paramName: \"*\" });\n regexpSource +=\n path === \"*\" || path === \"/*\"\n ? \"(.*)$\" // Already matched the initial /, just match the rest\n : \"(?:\\\\/(.+)|\\\\/*)$\"; // Don't include the / in params[\"*\"]\n } else if (end) {\n // When matching to the end, ignore trailing slashes\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n // If our path is non-empty and contains anything beyond an initial slash,\n // then we have _some_ form of path in our regex, so we should expect to\n // match only if we find the end of this path segment. Look for an optional\n // non-captured trailing slash (to match a portion of the URL) or the end\n // of the path (if we've matched to the end). We used to do this with a\n // word boundary but that gives false positives on routes like\n // /user-preferences since `-` counts as a word boundary.\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else {\n // Nothing to match for \"\" or \"/\"\n }\n\n let matcher = new RegExp(regexpSource, caseSensitive ? undefined : \"i\");\n\n return [matcher, params];\n}\n\nfunction safelyDecodeURI(value: string) {\n try {\n return decodeURI(value);\n } catch (error) {\n warning(\n false,\n `The URL path \"${value}\" could not be decoded because it is is a ` +\n `malformed URL segment. This is probably due to a bad percent ` +\n `encoding (${error}).`\n );\n\n return value;\n }\n}\n\nfunction safelyDecodeURIComponent(value: string, paramName: string) {\n try {\n return decodeURIComponent(value);\n } catch (error) {\n warning(\n false,\n `The value for the URL param \"${paramName}\" will not be decoded because` +\n ` the string \"${value}\" is a malformed URL segment. This is probably` +\n ` due to a bad percent encoding (${error}).`\n );\n\n return value;\n }\n}\n\n/**\n * @private\n */\nexport function stripBasename(\n pathname: string,\n basename: string\n): string | null {\n if (basename === \"/\") return pathname;\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n let startIndex = basename.endsWith(\"/\")\n ? basename.length - 1\n : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n // pathname does not start with basename/\n return null;\n }\n\n return pathname.slice(startIndex) || \"/\";\n}\n\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/utils/resolve-path\n */\nexport function resolvePath(to: To, fromPathname = \"/\"): Path {\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\",\n } = typeof to === \"string\" ? parsePath(to) : to;\n\n let pathname = toPathname\n ? toPathname.startsWith(\"/\")\n ? toPathname\n : resolvePathname(toPathname, fromPathname)\n : fromPathname;\n\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash),\n };\n}\n\nfunction resolvePathname(relativePath: string, fromPathname: string): string {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n\n relativeSegments.forEach((segment) => {\n if (segment === \"..\") {\n // Keep the root \"\" segment so the pathname starts at /\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\n\nfunction getInvalidPathError(\n char: string,\n field: string,\n dest: string,\n path: Partial\n) {\n return (\n `Cannot include a '${char}' character in a manually specified ` +\n `\\`to.${field}\\` field [${JSON.stringify(\n path\n )}]. Please separate it out to the ` +\n `\\`to.${dest}\\` field. Alternatively you may provide the full path as ` +\n `a string in and the router will parse it for you.`\n );\n}\n\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don't\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same. Both of the following examples should link back to the root:\n *\n * \n * \n * \n *\n * \n * \n * }> // <-- Does not contribute\n * // <-- Does not contribute\n * \n * \n */\nexport function getPathContributingMatches<\n T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[]) {\n return matches.filter(\n (match, index) =>\n index === 0 || (match.route.path && match.route.path.length > 0)\n );\n}\n\n/**\n * @private\n */\nexport function resolveTo(\n toArg: To,\n routePathnames: string[],\n locationPathname: string,\n isPathRelative = false\n): Path {\n let to: Partial;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = { ...toArg };\n\n invariant(\n !to.pathname || !to.pathname.includes(\"?\"),\n getInvalidPathError(\"?\", \"pathname\", \"search\", to)\n );\n invariant(\n !to.pathname || !to.pathname.includes(\"#\"),\n getInvalidPathError(\"#\", \"pathname\", \"hash\", to)\n );\n invariant(\n !to.search || !to.search.includes(\"#\"),\n getInvalidPathError(\"#\", \"search\", \"hash\", to)\n );\n }\n\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n\n let from: string;\n\n // Routing is relative to the current pathname if explicitly requested.\n //\n // If a pathname is explicitly provided in `to`, it should be relative to the\n // route context. This is explained in `Note on `` values` in our\n // migration guide from v5 as a means of disambiguation between `to` values\n // that begin with `/` and those that do not. However, this is problematic for\n // `to` values that do not provide a pathname. `to` can simply be a search or\n // hash string, in which case we should assume that the navigation is relative\n // to the current location's pathname and *not* the route pathname.\n if (toPathname == null) {\n from = locationPathname;\n } else if (isPathRelative) {\n let fromSegments = routePathnames[routePathnames.length - 1]\n .replace(/^\\//, \"\")\n .split(\"/\");\n\n if (toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n\n // With relative=\"path\", each leading .. segment means \"go up one URL segment\"\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n fromSegments.pop();\n }\n\n to.pathname = toSegments.join(\"/\");\n }\n\n from = \"/\" + fromSegments.join(\"/\");\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n\n if (toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n\n // With relative=\"route\" (the default), each leading .. segment means\n // \"go up one route\" instead of \"go up one URL segment\". This is a key\n // difference from how works and a major reason we call this a\n // \"to\" value instead of a \"href\".\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n\n to.pathname = toSegments.join(\"/\");\n }\n\n // If there are more \"..\" segments than parent routes, resolve relative to\n // the root / URL.\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n\n let path = resolvePath(to, from);\n\n // Ensure the pathname has a trailing slash if the original \"to\" had one\n let hasExplicitTrailingSlash =\n toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n // Or if this was a link to the current path which has a trailing slash\n let hasCurrentTrailingSlash =\n (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (\n !path.pathname.endsWith(\"/\") &&\n (hasExplicitTrailingSlash || hasCurrentTrailingSlash)\n ) {\n path.pathname += \"/\";\n }\n\n return path;\n}\n\n/**\n * @private\n */\nexport function getToPathname(to: To): string | undefined {\n // Empty strings should be treated the same as / paths\n return to === \"\" || (to as Path).pathname === \"\"\n ? \"/\"\n : typeof to === \"string\"\n ? parsePath(to).pathname\n : to.pathname;\n}\n\n/**\n * @private\n */\nexport const joinPaths = (paths: string[]): string =>\n paths.join(\"/\").replace(/\\/\\/+/g, \"/\");\n\n/**\n * @private\n */\nexport const normalizePathname = (pathname: string): string =>\n pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\n\n/**\n * @private\n */\nexport const normalizeSearch = (search: string): string =>\n !search || search === \"?\"\n ? \"\"\n : search.startsWith(\"?\")\n ? search\n : \"?\" + search;\n\n/**\n * @private\n */\nexport const normalizeHash = (hash: string): string =>\n !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\n\nexport type JsonFunction = (\n data: Data,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n */\nexport const json: JsonFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n let headers = new Headers(responseInit.headers);\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n\n return new Response(JSON.stringify(data), {\n ...responseInit,\n headers,\n });\n};\n\nexport interface TrackedPromise extends Promise {\n _tracked?: boolean;\n _data?: any;\n _error?: any;\n}\n\nexport class AbortedDeferredError extends Error {}\n\nexport class DeferredData {\n private pendingKeysSet: Set = new Set();\n private controller: AbortController;\n private abortPromise: Promise;\n private unlistenAbortSignal: () => void;\n private subscribers: Set<(aborted: boolean, settledKey?: string) => void> =\n new Set();\n data: Record;\n init?: ResponseInit;\n deferredKeys: string[] = [];\n\n constructor(data: Record, responseInit?: ResponseInit) {\n invariant(\n data && typeof data === \"object\" && !Array.isArray(data),\n \"defer() only accepts plain objects\"\n );\n\n // Set up an AbortController + Promise we can race against to exit early\n // cancellation\n let reject: (e: AbortedDeferredError) => void;\n this.abortPromise = new Promise((_, r) => (reject = r));\n this.controller = new AbortController();\n let onAbort = () =>\n reject(new AbortedDeferredError(\"Deferred data aborted\"));\n this.unlistenAbortSignal = () =>\n this.controller.signal.removeEventListener(\"abort\", onAbort);\n this.controller.signal.addEventListener(\"abort\", onAbort);\n\n this.data = Object.entries(data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: this.trackPromise(key, value),\n }),\n {}\n );\n\n if (this.done) {\n // All incoming values were resolved\n this.unlistenAbortSignal();\n }\n\n this.init = responseInit;\n }\n\n private trackPromise(\n key: string,\n value: Promise | unknown\n ): TrackedPromise | unknown {\n if (!(value instanceof Promise)) {\n return value;\n }\n\n this.deferredKeys.push(key);\n this.pendingKeysSet.add(key);\n\n // We store a little wrapper promise that will be extended with\n // _data/_error props upon resolve/reject\n let promise: TrackedPromise = Promise.race([value, this.abortPromise]).then(\n (data) => this.onSettle(promise, key, undefined, data as unknown),\n (error) => this.onSettle(promise, key, error as unknown)\n );\n\n // Register rejection listeners to avoid uncaught promise rejections on\n // errors or aborted deferred values\n promise.catch(() => {});\n\n Object.defineProperty(promise, \"_tracked\", { get: () => true });\n return promise;\n }\n\n private onSettle(\n promise: TrackedPromise,\n key: string,\n error: unknown,\n data?: unknown\n ): unknown {\n if (\n this.controller.signal.aborted &&\n error instanceof AbortedDeferredError\n ) {\n this.unlistenAbortSignal();\n Object.defineProperty(promise, \"_error\", { get: () => error });\n return Promise.reject(error);\n }\n\n this.pendingKeysSet.delete(key);\n\n if (this.done) {\n // Nothing left to abort!\n this.unlistenAbortSignal();\n }\n\n // If the promise was resolved/rejected with undefined, we'll throw an error as you\n // should always resolve with a value or null\n if (error === undefined && data === undefined) {\n let undefinedError = new Error(\n `Deferred data for key \"${key}\" resolved/rejected with \\`undefined\\`, ` +\n `you must resolve/reject with a value or \\`null\\`.`\n );\n Object.defineProperty(promise, \"_error\", { get: () => undefinedError });\n this.emit(false, key);\n return Promise.reject(undefinedError);\n }\n\n if (data === undefined) {\n Object.defineProperty(promise, \"_error\", { get: () => error });\n this.emit(false, key);\n return Promise.reject(error);\n }\n\n Object.defineProperty(promise, \"_data\", { get: () => data });\n this.emit(false, key);\n return data;\n }\n\n private emit(aborted: boolean, settledKey?: string) {\n this.subscribers.forEach((subscriber) => subscriber(aborted, settledKey));\n }\n\n subscribe(fn: (aborted: boolean, settledKey?: string) => void) {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n cancel() {\n this.controller.abort();\n this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n this.emit(true);\n }\n\n async resolveData(signal: AbortSignal) {\n let aborted = false;\n if (!this.done) {\n let onAbort = () => this.cancel();\n signal.addEventListener(\"abort\", onAbort);\n aborted = await new Promise((resolve) => {\n this.subscribe((aborted) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (aborted || this.done) {\n resolve(aborted);\n }\n });\n });\n }\n return aborted;\n }\n\n get done() {\n return this.pendingKeysSet.size === 0;\n }\n\n get unwrappedData() {\n invariant(\n this.data !== null && this.done,\n \"Can only unwrap data on initialized and settled deferreds\"\n );\n\n return Object.entries(this.data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: unwrapTrackedPromise(value),\n }),\n {}\n );\n }\n\n get pendingKeys() {\n return Array.from(this.pendingKeysSet);\n }\n}\n\nfunction isTrackedPromise(value: any): value is TrackedPromise {\n return (\n value instanceof Promise && (value as TrackedPromise)._tracked === true\n );\n}\n\nfunction unwrapTrackedPromise(value: any) {\n if (!isTrackedPromise(value)) {\n return value;\n }\n\n if (value._error) {\n throw value._error;\n }\n return value._data;\n}\n\nexport type DeferFunction = (\n data: Record,\n init?: number | ResponseInit\n) => DeferredData;\n\nexport const defer: DeferFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n return new DeferredData(data, responseInit);\n};\n\nexport type RedirectFunction = (\n url: string,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirect: RedirectFunction = (url, init = 302) => {\n let responseInit = init;\n if (typeof responseInit === \"number\") {\n responseInit = { status: responseInit };\n } else if (typeof responseInit.status === \"undefined\") {\n responseInit.status = 302;\n }\n\n let headers = new Headers(responseInit.headers);\n headers.set(\"Location\", url);\n\n return new Response(null, {\n ...responseInit,\n headers,\n });\n};\n\n/**\n * A redirect response that will force a document reload to the new location.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirectDocument: RedirectFunction = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Reload-Document\", \"true\");\n return response;\n};\n\nexport type ErrorResponse = {\n status: number;\n statusText: string;\n data: any;\n};\n\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n *\n * We don't export the class for public use since it's an implementation\n * detail, but we export the interface above so folks can build their own\n * abstractions around instances via isRouteErrorResponse()\n */\nexport class ErrorResponseImpl implements ErrorResponse {\n status: number;\n statusText: string;\n data: any;\n private error?: Error;\n private internal: boolean;\n\n constructor(\n status: number,\n statusText: string | undefined,\n data: any,\n internal = false\n ) {\n this.status = status;\n this.statusText = statusText || \"\";\n this.internal = internal;\n if (data instanceof Error) {\n this.data = data.toString();\n this.error = data;\n } else {\n this.data = data;\n }\n }\n}\n\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\nexport function isRouteErrorResponse(error: any): error is ErrorResponse {\n return (\n error != null &&\n typeof error.status === \"number\" &&\n typeof error.statusText === \"string\" &&\n typeof error.internal === \"boolean\" &&\n \"data\" in error\n );\n}\n","import type { History, Location, Path, To } from \"./history\";\nimport {\n Action as HistoryAction,\n createLocation,\n createPath,\n invariant,\n parsePath,\n warning,\n} from \"./history\";\nimport type {\n ActionFunction,\n AgnosticDataRouteMatch,\n AgnosticDataRouteObject,\n AgnosticRouteObject,\n DataResult,\n DeferredData,\n DeferredResult,\n DetectErrorBoundaryFunction,\n ErrorResult,\n FormEncType,\n FormMethod,\n HTMLFormMethod,\n ImmutableRouteKey,\n LoaderFunction,\n MapRoutePropertiesFunction,\n MutationFormMethod,\n RedirectResult,\n RouteData,\n RouteManifest,\n ShouldRevalidateFunctionArgs,\n Submission,\n SuccessResult,\n UIMatch,\n V7_FormMethod,\n V7_MutationFormMethod,\n} from \"./utils\";\nimport {\n ErrorResponseImpl,\n ResultType,\n convertRouteMatchToUiMatch,\n convertRoutesToDataRoutes,\n getPathContributingMatches,\n immutableRouteKeys,\n isRouteErrorResponse,\n joinPaths,\n matchRoutes,\n resolveTo,\n stripBasename,\n} from \"./utils\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A Router instance manages all navigation and data loading/mutations\n */\nexport interface Router {\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the basename for the router\n */\n get basename(): RouterInit[\"basename\"];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the current state of the router\n */\n get state(): RouterState;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the routes for this router instance\n */\n get routes(): AgnosticDataRouteObject[];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the window associated with the router\n */\n get window(): RouterInit[\"window\"];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Initialize the router, including adding history listeners and kicking off\n * initial data fetches. Returns a function to cleanup listeners and abort\n * any in-progress loads\n */\n initialize(): Router;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Subscribe to router.state updates\n *\n * @param fn function to call with the new state\n */\n subscribe(fn: RouterSubscriber): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Enable scroll restoration behavior in the router\n *\n * @param savedScrollPositions Object that will manage positions, in case\n * it's being restored from sessionStorage\n * @param getScrollPosition Function to get the active Y scroll position\n * @param getKey Function to get the key to use for restoration\n */\n enableScrollRestoration(\n savedScrollPositions: Record,\n getScrollPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Navigate forward/backward in the history stack\n * @param to Delta to move in the history stack\n */\n navigate(to: number): Promise;\n\n /**\n * Navigate to the given path\n * @param to Path to navigate to\n * @param opts Navigation options (method, submission, etc.)\n */\n navigate(to: To | null, opts?: RouterNavigateOptions): Promise;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a fetcher load/submission\n *\n * @param key Fetcher key\n * @param routeId Route that owns the fetcher\n * @param href href to fetch\n * @param opts Fetcher options, (method, submission, etc.)\n */\n fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a revalidation of all current route loaders and fetcher loads\n */\n revalidate(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to create an href for the given location\n * @param location\n */\n createHref(location: Location | URL): string;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to URL encode a destination path according to the internal\n * history implementation\n * @param to\n */\n encodeLocation(to: To): Path;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get/create a fetcher for the given key\n * @param key\n */\n getFetcher(key: string): Fetcher;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete the fetcher for a given key\n * @param key\n */\n deleteFetcher(key: string): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Cleanup listeners and abort any in-progress loads\n */\n dispose(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get a navigation blocker\n * @param key The identifier for the blocker\n * @param fn The blocker function implementation\n */\n getBlocker(key: string, fn: BlockerFunction): Blocker;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete a navigation blocker\n * @param key The identifier for the blocker\n */\n deleteBlocker(key: string): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * HMR needs to pass in-flight route updates to React Router\n * TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute)\n */\n _internalSetRoutes(routes: AgnosticRouteObject[]): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal fetch AbortControllers accessed by unit tests\n */\n _internalFetchControllers: Map;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal pending DeferredData instances accessed by unit tests\n */\n _internalActiveDeferreds: Map;\n}\n\n/**\n * State maintained internally by the router. During a navigation, all states\n * reflect the the \"old\" location unless otherwise noted.\n */\nexport interface RouterState {\n /**\n * The action of the most recent navigation\n */\n historyAction: HistoryAction;\n\n /**\n * The current location reflected by the router\n */\n location: Location;\n\n /**\n * The current set of route matches\n */\n matches: AgnosticDataRouteMatch[];\n\n /**\n * Tracks whether we've completed our initial data load\n */\n initialized: boolean;\n\n /**\n * Current scroll position we should start at for a new view\n * - number -> scroll position to restore to\n * - false -> do not restore scroll at all (used during submissions)\n * - null -> don't have a saved position, scroll to hash or top of page\n */\n restoreScrollPosition: number | false | null;\n\n /**\n * Indicate whether this navigation should skip resetting the scroll position\n * if we are unable to restore the scroll position\n */\n preventScrollReset: boolean;\n\n /**\n * Tracks the state of the current navigation\n */\n navigation: Navigation;\n\n /**\n * Tracks any in-progress revalidations\n */\n revalidation: RevalidationState;\n\n /**\n * Data from the loaders for the current matches\n */\n loaderData: RouteData;\n\n /**\n * Data from the action for the current matches\n */\n actionData: RouteData | null;\n\n /**\n * Errors caught from loaders for the current matches\n */\n errors: RouteData | null;\n\n /**\n * Map of current fetchers\n */\n fetchers: Map;\n\n /**\n * Map of current blockers\n */\n blockers: Map;\n}\n\n/**\n * Data that can be passed into hydrate a Router from SSR\n */\nexport type HydrationState = Partial<\n Pick\n>;\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface FutureConfig {\n v7_fetcherPersist: boolean;\n v7_normalizeFormMethod: boolean;\n v7_prependBasename: boolean;\n}\n\n/**\n * Initialization options for createRouter\n */\nexport interface RouterInit {\n routes: AgnosticRouteObject[];\n history: History;\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n future?: Partial;\n hydrationData?: HydrationState;\n window?: Window;\n}\n\n/**\n * State returned from a server-side query() call\n */\nexport interface StaticHandlerContext {\n basename: Router[\"basename\"];\n location: RouterState[\"location\"];\n matches: RouterState[\"matches\"];\n loaderData: RouterState[\"loaderData\"];\n actionData: RouterState[\"actionData\"];\n errors: RouterState[\"errors\"];\n statusCode: number;\n loaderHeaders: Record;\n actionHeaders: Record;\n activeDeferreds: Record | null;\n _deepestRenderedBoundaryId?: string | null;\n}\n\n/**\n * A StaticHandler instance manages a singular SSR navigation/fetch event\n */\nexport interface StaticHandler {\n dataRoutes: AgnosticDataRouteObject[];\n query(\n request: Request,\n opts?: { requestContext?: unknown }\n ): Promise;\n queryRoute(\n request: Request,\n opts?: { routeId?: string; requestContext?: unknown }\n ): Promise;\n}\n\ntype ViewTransitionOpts = {\n currentLocation: Location;\n nextLocation: Location;\n};\n\n/**\n * Subscriber function signature for changes to router state\n */\nexport interface RouterSubscriber {\n (\n state: RouterState,\n opts: {\n deletedFetchers: string[];\n unstable_viewTransitionOpts?: ViewTransitionOpts;\n unstable_flushSync: boolean;\n }\n ): void;\n}\n\n/**\n * Function signature for determining the key to be used in scroll restoration\n * for a given location\n */\nexport interface GetScrollRestorationKeyFunction {\n (location: Location, matches: UIMatch[]): string | null;\n}\n\n/**\n * Function signature for determining the current scroll position\n */\nexport interface GetScrollPositionFunction {\n (): number;\n}\n\nexport type RelativeRoutingType = \"route\" | \"path\";\n\n// Allowed for any navigation or fetch\ntype BaseNavigateOrFetchOptions = {\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n unstable_flushSync?: boolean;\n};\n\n// Only allowed for navigations\ntype BaseNavigateOptions = BaseNavigateOrFetchOptions & {\n replace?: boolean;\n state?: any;\n fromRouteId?: string;\n unstable_viewTransition?: boolean;\n};\n\n// Only allowed for submission navigations\ntype BaseSubmissionOptions = {\n formMethod?: HTMLFormMethod;\n formEncType?: FormEncType;\n} & (\n | { formData: FormData; body?: undefined }\n | { formData?: undefined; body: any }\n);\n\n/**\n * Options for a navigate() call for a normal (non-submission) navigation\n */\ntype LinkNavigateOptions = BaseNavigateOptions;\n\n/**\n * Options for a navigate() call for a submission navigation\n */\ntype SubmissionNavigateOptions = BaseNavigateOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to navigate() for a navigation\n */\nexport type RouterNavigateOptions =\n | LinkNavigateOptions\n | SubmissionNavigateOptions;\n\n/**\n * Options for a fetch() load\n */\ntype LoadFetchOptions = BaseNavigateOrFetchOptions;\n\n/**\n * Options for a fetch() submission\n */\ntype SubmitFetchOptions = BaseNavigateOrFetchOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to fetch()\n */\nexport type RouterFetchOptions = LoadFetchOptions | SubmitFetchOptions;\n\n/**\n * Potential states for state.navigation\n */\nexport type NavigationStates = {\n Idle: {\n state: \"idle\";\n location: undefined;\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n formData: undefined;\n json: undefined;\n text: undefined;\n };\n Loading: {\n state: \"loading\";\n location: Location;\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n text: Submission[\"text\"] | undefined;\n };\n Submitting: {\n state: \"submitting\";\n location: Location;\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n text: Submission[\"text\"];\n };\n};\n\nexport type Navigation = NavigationStates[keyof NavigationStates];\n\nexport type RevalidationState = \"idle\" | \"loading\";\n\n/**\n * Potential states for fetchers\n */\ntype FetcherStates = {\n Idle: {\n state: \"idle\";\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n text: undefined;\n formData: undefined;\n json: undefined;\n data: TData | undefined;\n };\n Loading: {\n state: \"loading\";\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n text: Submission[\"text\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n data: TData | undefined;\n };\n Submitting: {\n state: \"submitting\";\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n text: Submission[\"text\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n data: TData | undefined;\n };\n};\n\nexport type Fetcher =\n FetcherStates[keyof FetcherStates];\n\ninterface BlockerBlocked {\n state: \"blocked\";\n reset(): void;\n proceed(): void;\n location: Location;\n}\n\ninterface BlockerUnblocked {\n state: \"unblocked\";\n reset: undefined;\n proceed: undefined;\n location: undefined;\n}\n\ninterface BlockerProceeding {\n state: \"proceeding\";\n reset: undefined;\n proceed: undefined;\n location: Location;\n}\n\nexport type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;\n\nexport type BlockerFunction = (args: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n}) => boolean;\n\ninterface ShortCircuitable {\n /**\n * startNavigation does not need to complete the navigation because we\n * redirected or got interrupted\n */\n shortCircuited?: boolean;\n}\n\ninterface HandleActionResult extends ShortCircuitable {\n /**\n * Error thrown from the current action, keyed by the route containing the\n * error boundary to render the error. To be committed to the state after\n * loaders have completed\n */\n pendingActionError?: RouteData;\n /**\n * Data returned from the current action, keyed by the route owning the action.\n * To be committed to the state after loaders have completed\n */\n pendingActionData?: RouteData;\n}\n\ninterface HandleLoadersResult extends ShortCircuitable {\n /**\n * loaderData returned from the current set of loaders\n */\n loaderData?: RouterState[\"loaderData\"];\n /**\n * errors thrown from the current set of loaders\n */\n errors?: RouterState[\"errors\"];\n}\n\n/**\n * Cached info for active fetcher.load() instances so they can participate\n * in revalidation\n */\ninterface FetchLoadMatch {\n routeId: string;\n path: string;\n}\n\n/**\n * Identified fetcher.load() calls that need to be revalidated\n */\ninterface RevalidatingFetcher extends FetchLoadMatch {\n key: string;\n match: AgnosticDataRouteMatch | null;\n matches: AgnosticDataRouteMatch[] | null;\n controller: AbortController | null;\n}\n\n/**\n * Wrapper object to allow us to throw any response out from callLoaderOrAction\n * for queryRouter while preserving whether or not it was thrown or returned\n * from the loader/action\n */\ninterface QueryRouteResponse {\n type: ResultType.data | ResultType.error;\n response: Response;\n}\n\nconst validMutationMethodsArr: MutationFormMethod[] = [\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n];\nconst validMutationMethods = new Set(\n validMutationMethodsArr\n);\n\nconst validRequestMethodsArr: FormMethod[] = [\n \"get\",\n ...validMutationMethodsArr,\n];\nconst validRequestMethods = new Set(validRequestMethodsArr);\n\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\n\nexport const IDLE_NAVIGATION: NavigationStates[\"Idle\"] = {\n state: \"idle\",\n location: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_FETCHER: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n data: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_BLOCKER: BlockerUnblocked = {\n state: \"unblocked\",\n proceed: undefined,\n reset: undefined,\n location: undefined,\n};\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\nconst defaultMapRouteProperties: MapRoutePropertiesFunction = (route) => ({\n hasErrorBoundary: Boolean(route.hasErrorBoundary),\n});\n\nconst TRANSITIONS_STORAGE_KEY = \"remix-router-transitions\";\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create a router and listen to history POP navigations\n */\nexport function createRouter(init: RouterInit): Router {\n const routerWindow = init.window\n ? init.window\n : typeof window !== \"undefined\"\n ? window\n : undefined;\n const isBrowser =\n typeof routerWindow !== \"undefined\" &&\n typeof routerWindow.document !== \"undefined\" &&\n typeof routerWindow.document.createElement !== \"undefined\";\n const isServer = !isBrowser;\n\n invariant(\n init.routes.length > 0,\n \"You must provide a non-empty routes array to createRouter\"\n );\n\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (init.mapRouteProperties) {\n mapRouteProperties = init.mapRouteProperties;\n } else if (init.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = init.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n\n // Routes keyed by ID\n let manifest: RouteManifest = {};\n // Routes in tree format for matching\n let dataRoutes = convertRoutesToDataRoutes(\n init.routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n let inFlightDataRoutes: AgnosticDataRouteObject[] | undefined;\n let basename = init.basename || \"/\";\n // Config driven behavior flags\n let future: FutureConfig = {\n v7_fetcherPersist: false,\n v7_normalizeFormMethod: false,\n v7_prependBasename: false,\n ...init.future,\n };\n // Cleanup function for history\n let unlistenHistory: (() => void) | null = null;\n // Externally-provided functions to call on all state changes\n let subscribers = new Set();\n // Externally-provided object to hold scroll restoration locations during routing\n let savedScrollPositions: Record | null = null;\n // Externally-provided function to get scroll restoration keys\n let getScrollRestorationKey: GetScrollRestorationKeyFunction | null = null;\n // Externally-provided function to get current scroll position\n let getScrollPosition: GetScrollPositionFunction | null = null;\n // One-time flag to control the initial hydration scroll restoration. Because\n // we don't get the saved positions from until _after_\n // the initial render, we need to manually trigger a separate updateState to\n // send along the restoreScrollPosition\n // Set to true if we have `hydrationData` since we assume we were SSR'd and that\n // SSR did the initial scroll restoration.\n let initialScrollRestored = init.hydrationData != null;\n\n let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n let initialErrors: RouteData | null = null;\n\n if (initialMatches == null) {\n // If we do not match a user-provided-route, fall back to the root\n // to allow the error boundary to take over\n let error = getInternalRouterError(404, {\n pathname: init.history.location.pathname,\n });\n let { matches, route } = getShortCircuitMatches(dataRoutes);\n initialMatches = matches;\n initialErrors = { [route.id]: error };\n }\n\n let initialized =\n // All initialMatches need to be loaded before we're ready. If we have lazy\n // functions around still then we'll need to run them in initialize()\n !initialMatches.some((m) => m.route.lazy) &&\n // And we have to either have no loaders or have been provided hydrationData\n (!initialMatches.some((m) => m.route.loader) || init.hydrationData != null);\n\n let router: Router;\n let state: RouterState = {\n historyAction: init.history.action,\n location: init.history.location,\n matches: initialMatches,\n initialized,\n navigation: IDLE_NAVIGATION,\n // Don't restore on initial updateState() if we were SSR'd\n restoreScrollPosition: init.hydrationData != null ? false : null,\n preventScrollReset: false,\n revalidation: \"idle\",\n loaderData: (init.hydrationData && init.hydrationData.loaderData) || {},\n actionData: (init.hydrationData && init.hydrationData.actionData) || null,\n errors: (init.hydrationData && init.hydrationData.errors) || initialErrors,\n fetchers: new Map(),\n blockers: new Map(),\n };\n\n // -- Stateful internal variables to manage navigations --\n // Current navigation in progress (to be committed in completeNavigation)\n let pendingAction: HistoryAction = HistoryAction.Pop;\n\n // Should the current navigation prevent the scroll reset if scroll cannot\n // be restored?\n let pendingPreventScrollReset = false;\n\n // AbortController for the active navigation\n let pendingNavigationController: AbortController | null;\n\n // Should the current navigation enable document.startViewTransition?\n let pendingViewTransitionEnabled = false;\n\n // Store applied view transitions so we can apply them on POP\n let appliedViewTransitions: Map> = new Map<\n string,\n Set\n >();\n\n // Cleanup function for persisting applied transitions to sessionStorage\n let removePageHideEventListener: (() => void) | null = null;\n\n // We use this to avoid touching history in completeNavigation if a\n // revalidation is entirely uninterrupted\n let isUninterruptedRevalidation = false;\n\n // Use this internal flag to force revalidation of all loaders:\n // - submissions (completed or interrupted)\n // - useRevalidator()\n // - X-Remix-Revalidate (from redirect)\n let isRevalidationRequired = false;\n\n // Use this internal array to capture routes that require revalidation due\n // to a cancelled deferred on action submission\n let cancelledDeferredRoutes: string[] = [];\n\n // Use this internal array to capture fetcher loads that were cancelled by an\n // action navigation and require revalidation\n let cancelledFetcherLoads: string[] = [];\n\n // AbortControllers for any in-flight fetchers\n let fetchControllers = new Map();\n\n // Track loads based on the order in which they started\n let incrementingLoadId = 0;\n\n // Track the outstanding pending navigation data load to be compared against\n // the globally incrementing load when a fetcher load lands after a completed\n // navigation\n let pendingNavigationLoadId = -1;\n\n // Fetchers that triggered data reloads as a result of their actions\n let fetchReloadIds = new Map();\n\n // Fetchers that triggered redirect navigations\n let fetchRedirectIds = new Set();\n\n // Most recent href/match for fetcher.load calls for fetchers\n let fetchLoadMatches = new Map();\n\n // Ref-count mounted fetchers so we know when it's ok to clean them up\n let activeFetchers = new Map();\n\n // Fetchers that have requested a delete when using v7_fetcherPersist,\n // they'll be officially removed after they return to idle\n let deletedFetchers = new Set();\n\n // Store DeferredData instances for active route matches. When a\n // route loader returns defer() we stick one in here. Then, when a nested\n // promise resolves we update loaderData. If a new navigation starts we\n // cancel active deferreds for eliminated routes.\n let activeDeferreds = new Map();\n\n // Store blocker functions in a separate Map outside of router state since\n // we don't need to update UI state if they change\n let blockerFunctions = new Map();\n\n // Flag to ignore the next history update, so we can revert the URL change on\n // a POP navigation that was blocked by the user without touching router state\n let ignoreNextHistoryUpdate = false;\n\n // Initialize the router, all side effects should be kicked off from here.\n // Implemented as a Fluent API for ease of:\n // let router = createRouter(init).initialize();\n function initialize() {\n // If history informs us of a POP navigation, start the navigation but do not update\n // state. We'll update our own state once the navigation completes\n unlistenHistory = init.history.listen(\n ({ action: historyAction, location, delta }) => {\n // Ignore this event if it was just us resetting the URL from a\n // blocked POP navigation\n if (ignoreNextHistoryUpdate) {\n ignoreNextHistoryUpdate = false;\n return;\n }\n\n warning(\n blockerFunctions.size === 0 || delta != null,\n \"You are trying to use a blocker on a POP navigation to a location \" +\n \"that was not created by @remix-run/router. This will fail silently in \" +\n \"production. This can happen if you are navigating outside the router \" +\n \"via `window.history.pushState`/`window.location.hash` instead of using \" +\n \"router navigation APIs. This can also happen if you are using \" +\n \"createHashRouter and the user manually changes the URL.\"\n );\n\n let blockerKey = shouldBlockNavigation({\n currentLocation: state.location,\n nextLocation: location,\n historyAction,\n });\n\n if (blockerKey && delta != null) {\n // Restore the URL to match the current UI, but don't update router state\n ignoreNextHistoryUpdate = true;\n init.history.go(delta * -1);\n\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location,\n });\n // Re-do the same POP navigation we just blocked\n init.history.go(delta);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return startNavigation(historyAction, location);\n }\n );\n\n if (isBrowser) {\n // FIXME: This feels gross. How can we cleanup the lines between\n // scrollRestoration/appliedTransitions persistance?\n restoreAppliedTransitions(routerWindow, appliedViewTransitions);\n let _saveAppliedTransitions = () =>\n persistAppliedTransitions(routerWindow, appliedViewTransitions);\n routerWindow.addEventListener(\"pagehide\", _saveAppliedTransitions);\n removePageHideEventListener = () =>\n routerWindow.removeEventListener(\"pagehide\", _saveAppliedTransitions);\n }\n\n // Kick off initial data load if needed. Use Pop to avoid modifying history\n // Note we don't do any handling of lazy here. For SPA's it'll get handled\n // in the normal navigation flow. For SSR it's expected that lazy modules are\n // resolved prior to router creation since we can't go into a fallbackElement\n // UI for SSR'd apps\n if (!state.initialized) {\n startNavigation(HistoryAction.Pop, state.location);\n }\n\n return router;\n }\n\n // Clean up a router and it's side effects\n function dispose() {\n if (unlistenHistory) {\n unlistenHistory();\n }\n if (removePageHideEventListener) {\n removePageHideEventListener();\n }\n subscribers.clear();\n pendingNavigationController && pendingNavigationController.abort();\n state.fetchers.forEach((_, key) => deleteFetcher(key));\n state.blockers.forEach((_, key) => deleteBlocker(key));\n }\n\n // Subscribe to state updates for the router\n function subscribe(fn: RouterSubscriber) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n }\n\n // Update our state and notify the calling context of the change\n function updateState(\n newState: Partial,\n opts: {\n flushSync?: boolean;\n viewTransitionOpts?: ViewTransitionOpts;\n } = {}\n ): void {\n state = {\n ...state,\n ...newState,\n };\n\n // Prep fetcher cleanup so we can tell the UI which fetcher data entries\n // can be removed\n let completedFetchers: string[] = [];\n let deletedFetchersKeys: string[] = [];\n\n if (future.v7_fetcherPersist) {\n state.fetchers.forEach((fetcher, key) => {\n if (fetcher.state === \"idle\") {\n if (deletedFetchers.has(key)) {\n // Unmounted from the UI and can be totally removed\n deletedFetchersKeys.push(key);\n } else {\n // Returned to idle but still mounted in the UI, so semi-remains for\n // revalidations and such\n completedFetchers.push(key);\n }\n }\n });\n }\n\n // Iterate over a local copy so that if flushSync is used and we end up\n // removing and adding a new subscriber due to the useCallback dependencies,\n // we don't get ourselves into a loop calling the new subscriber immediately\n [...subscribers].forEach((subscriber) =>\n subscriber(state, {\n deletedFetchers: deletedFetchersKeys,\n unstable_viewTransitionOpts: opts.viewTransitionOpts,\n unstable_flushSync: opts.flushSync === true,\n })\n );\n\n // Remove idle fetchers from state since we only care about in-flight fetchers.\n if (future.v7_fetcherPersist) {\n completedFetchers.forEach((key) => state.fetchers.delete(key));\n deletedFetchersKeys.forEach((key) => deleteFetcher(key));\n }\n }\n\n // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n // and setting state.[historyAction/location/matches] to the new route.\n // - Location is a required param\n // - Navigation will always be set to IDLE_NAVIGATION\n // - Can pass any other state in newState\n function completeNavigation(\n location: Location,\n newState: Partial>,\n { flushSync }: { flushSync?: boolean } = {}\n ): void {\n // Deduce if we're in a loading/actionReload state:\n // - We have committed actionData in the store\n // - The current navigation was a mutation submission\n // - We're past the submitting state and into the loading state\n // - The location being loaded is not the result of a redirect\n let isActionReload =\n state.actionData != null &&\n state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n state.navigation.state === \"loading\" &&\n location.state?._isRedirect !== true;\n\n let actionData: RouteData | null;\n if (newState.actionData) {\n if (Object.keys(newState.actionData).length > 0) {\n actionData = newState.actionData;\n } else {\n // Empty actionData -> clear prior actionData due to an action error\n actionData = null;\n }\n } else if (isActionReload) {\n // Keep the current data if we're wrapping up the action reload\n actionData = state.actionData;\n } else {\n // Clear actionData on any other completed navigations\n actionData = null;\n }\n\n // Always preserve any existing loaderData from re-used routes\n let loaderData = newState.loaderData\n ? mergeLoaderData(\n state.loaderData,\n newState.loaderData,\n newState.matches || [],\n newState.errors\n )\n : state.loaderData;\n\n // On a successful navigation we can assume we got through all blockers\n // so we can start fresh\n let blockers = state.blockers;\n if (blockers.size > 0) {\n blockers = new Map(blockers);\n blockers.forEach((_, k) => blockers.set(k, IDLE_BLOCKER));\n }\n\n // Always respect the user flag. Otherwise don't reset on mutation\n // submission navigations unless they redirect\n let preventScrollReset =\n pendingPreventScrollReset === true ||\n (state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n location.state?._isRedirect !== true);\n\n if (inFlightDataRoutes) {\n dataRoutes = inFlightDataRoutes;\n inFlightDataRoutes = undefined;\n }\n\n if (isUninterruptedRevalidation) {\n // If this was an uninterrupted revalidation then do not touch history\n } else if (pendingAction === HistoryAction.Pop) {\n // Do nothing for POP - URL has already been updated\n } else if (pendingAction === HistoryAction.Push) {\n init.history.push(location, location.state);\n } else if (pendingAction === HistoryAction.Replace) {\n init.history.replace(location, location.state);\n }\n\n let viewTransitionOpts: ViewTransitionOpts | undefined;\n\n // On POP, enable transitions if they were enabled on the original navigation\n if (pendingAction === HistoryAction.Pop) {\n // Forward takes precedence so they behave like the original navigation\n let priorPaths = appliedViewTransitions.get(state.location.pathname);\n if (priorPaths && priorPaths.has(location.pathname)) {\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location,\n };\n } else if (appliedViewTransitions.has(location.pathname)) {\n // If we don't have a previous forward nav, assume we're popping back to\n // the new location and enable if that location previously enabled\n viewTransitionOpts = {\n currentLocation: location,\n nextLocation: state.location,\n };\n }\n } else if (pendingViewTransitionEnabled) {\n // Store the applied transition on PUSH/REPLACE\n let toPaths = appliedViewTransitions.get(state.location.pathname);\n if (toPaths) {\n toPaths.add(location.pathname);\n } else {\n toPaths = new Set([location.pathname]);\n appliedViewTransitions.set(state.location.pathname, toPaths);\n }\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location,\n };\n }\n\n updateState(\n {\n ...newState, // matches, errors, fetchers go through as-is\n actionData,\n loaderData,\n historyAction: pendingAction,\n location,\n initialized: true,\n navigation: IDLE_NAVIGATION,\n revalidation: \"idle\",\n restoreScrollPosition: getSavedScrollPosition(\n location,\n newState.matches || state.matches\n ),\n preventScrollReset,\n blockers,\n },\n {\n viewTransitionOpts,\n flushSync: flushSync === true,\n }\n );\n\n // Reset stateful navigation vars\n pendingAction = HistoryAction.Pop;\n pendingPreventScrollReset = false;\n pendingViewTransitionEnabled = false;\n isUninterruptedRevalidation = false;\n isRevalidationRequired = false;\n cancelledDeferredRoutes = [];\n cancelledFetcherLoads = [];\n }\n\n // Trigger a navigation event, which can either be a numerical POP or a PUSH\n // replace with an optional submission\n async function navigate(\n to: number | To | null,\n opts?: RouterNavigateOptions\n ): Promise {\n if (typeof to === \"number\") {\n init.history.go(to);\n return;\n }\n\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n to,\n opts?.fromRouteId,\n opts?.relative\n );\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n false,\n normalizedPath,\n opts\n );\n\n let currentLocation = state.location;\n let nextLocation = createLocation(state.location, path, opts && opts.state);\n\n // When using navigate as a PUSH/REPLACE we aren't reading an already-encoded\n // URL from window.location, so we need to encode it here so the behavior\n // remains the same as POP and non-data-router usages. new URL() does all\n // the same encoding we'd get from a history.pushState/window.location read\n // without having to touch history\n nextLocation = {\n ...nextLocation,\n ...init.history.encodeLocation(nextLocation),\n };\n\n let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n\n let historyAction = HistoryAction.Push;\n\n if (userReplace === true) {\n historyAction = HistoryAction.Replace;\n } else if (userReplace === false) {\n // no-op\n } else if (\n submission != null &&\n isMutationMethod(submission.formMethod) &&\n submission.formAction === state.location.pathname + state.location.search\n ) {\n // By default on submissions to the current location we REPLACE so that\n // users don't have to double-click the back button to get to the prior\n // location. If the user redirects to a different location from the\n // action/loader this will be ignored and the redirect will be a PUSH\n historyAction = HistoryAction.Replace;\n }\n\n let preventScrollReset =\n opts && \"preventScrollReset\" in opts\n ? opts.preventScrollReset === true\n : undefined;\n\n let flushSync = (opts && opts.unstable_flushSync) === true;\n\n let blockerKey = shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n });\n\n if (blockerKey) {\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location: nextLocation,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location: nextLocation,\n });\n // Send the same navigation through\n navigate(to, opts);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return await startNavigation(historyAction, nextLocation, {\n submission,\n // Send through the formData serialization error if we have one so we can\n // render at the right error boundary after we match routes\n pendingError: error,\n preventScrollReset,\n replace: opts && opts.replace,\n enableViewTransition: opts && opts.unstable_viewTransition,\n flushSync,\n });\n }\n\n // Revalidate all current loaders. If a navigation is in progress or if this\n // is interrupted by a navigation, allow this to \"succeed\" by calling all\n // loaders during the next loader round\n function revalidate() {\n interruptActiveLoads();\n updateState({ revalidation: \"loading\" });\n\n // If we're currently submitting an action, we don't need to start a new\n // navigation, we'll just let the follow up loader execution call all loaders\n if (state.navigation.state === \"submitting\") {\n return;\n }\n\n // If we're currently in an idle state, start a new navigation for the current\n // action/location and mark it as uninterrupted, which will skip the history\n // update in completeNavigation\n if (state.navigation.state === \"idle\") {\n startNavigation(state.historyAction, state.location, {\n startUninterruptedRevalidation: true,\n });\n return;\n }\n\n // Otherwise, if we're currently in a loading state, just start a new\n // navigation to the navigation.location but do not trigger an uninterrupted\n // revalidation so that history correctly updates once the navigation completes\n startNavigation(\n pendingAction || state.historyAction,\n state.navigation.location,\n { overrideNavigation: state.navigation }\n );\n }\n\n // Start a navigation to the given action/location. Can optionally provide a\n // overrideNavigation which will override the normalLoad in the case of a redirect\n // navigation\n async function startNavigation(\n historyAction: HistoryAction,\n location: Location,\n opts?: {\n submission?: Submission;\n fetcherSubmission?: Submission;\n overrideNavigation?: Navigation;\n pendingError?: ErrorResponseImpl;\n startUninterruptedRevalidation?: boolean;\n preventScrollReset?: boolean;\n replace?: boolean;\n enableViewTransition?: boolean;\n flushSync?: boolean;\n }\n ): Promise {\n // Abort any in-progress navigations and start a new one. Unset any ongoing\n // uninterrupted revalidations unless told otherwise, since we want this\n // new navigation to update history normally\n pendingNavigationController && pendingNavigationController.abort();\n pendingNavigationController = null;\n pendingAction = historyAction;\n isUninterruptedRevalidation =\n (opts && opts.startUninterruptedRevalidation) === true;\n\n // Save the current scroll position every time we start a new navigation,\n // and track whether we should reset scroll on completion\n saveScrollPosition(state.location, state.matches);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let loadingNavigation = opts && opts.overrideNavigation;\n let matches = matchRoutes(routesToUse, location, basename);\n let flushSync = (opts && opts.flushSync) === true;\n\n // Short circuit with a 404 on the root error boundary if we match nothing\n if (!matches) {\n let error = getInternalRouterError(404, { pathname: location.pathname });\n let { matches: notFoundMatches, route } =\n getShortCircuitMatches(routesToUse);\n // Cancel all pending deferred on 404s since we don't keep any routes\n cancelActiveDeferreds();\n completeNavigation(\n location,\n {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error,\n },\n },\n { flushSync }\n );\n return;\n }\n\n // Short circuit if it's only a hash change and not a revalidation or\n // mutation submission.\n //\n // Ignore on initial page loads because since the initial load will always\n // be \"same hash\". For example, on /page#hash and submit a \n // which will default to a navigation to /page\n if (\n state.initialized &&\n !isRevalidationRequired &&\n isHashChangeOnly(state.location, location) &&\n !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))\n ) {\n completeNavigation(location, { matches }, { flushSync });\n return;\n }\n\n // Create a controller/Request for this navigation\n pendingNavigationController = new AbortController();\n let request = createClientSideRequest(\n init.history,\n location,\n pendingNavigationController.signal,\n opts && opts.submission\n );\n let pendingActionData: RouteData | undefined;\n let pendingError: RouteData | undefined;\n\n if (opts && opts.pendingError) {\n // If we have a pendingError, it means the user attempted a GET submission\n // with binary FormData so assign here and skip to handleLoaders. That\n // way we handle calling loaders above the boundary etc. It's not really\n // different from an actionError in that sense.\n pendingError = {\n [findNearestBoundary(matches).route.id]: opts.pendingError,\n };\n } else if (\n opts &&\n opts.submission &&\n isMutationMethod(opts.submission.formMethod)\n ) {\n // Call action if we received an action submission\n let actionOutput = await handleAction(\n request,\n location,\n opts.submission,\n matches,\n { replace: opts.replace, flushSync }\n );\n\n if (actionOutput.shortCircuited) {\n return;\n }\n\n pendingActionData = actionOutput.pendingActionData;\n pendingError = actionOutput.pendingActionError;\n loadingNavigation = getLoadingNavigation(location, opts.submission);\n flushSync = false;\n\n // Create a GET request for the loaders\n request = new Request(request.url, { signal: request.signal });\n }\n\n // Call loaders\n let { shortCircuited, loaderData, errors } = await handleLoaders(\n request,\n location,\n matches,\n loadingNavigation,\n opts && opts.submission,\n opts && opts.fetcherSubmission,\n opts && opts.replace,\n flushSync,\n pendingActionData,\n pendingError\n );\n\n if (shortCircuited) {\n return;\n }\n\n // Clean up now that the action/loaders have completed. Don't clean up if\n // we short circuited because pendingNavigationController will have already\n // been assigned to a new controller for the next navigation\n pendingNavigationController = null;\n\n completeNavigation(location, {\n matches,\n ...(pendingActionData ? { actionData: pendingActionData } : {}),\n loaderData,\n errors,\n });\n }\n\n // Call the action matched by the leaf route for this navigation and handle\n // redirects/errors\n async function handleAction(\n request: Request,\n location: Location,\n submission: Submission,\n matches: AgnosticDataRouteMatch[],\n opts: { replace?: boolean; flushSync?: boolean } = {}\n ): Promise {\n interruptActiveLoads();\n\n // Put us in a submitting state\n let navigation = getSubmittingNavigation(location, submission);\n updateState({ navigation }, { flushSync: opts.flushSync === true });\n\n // Call our action and get the result\n let result: DataResult;\n let actionMatch = getTargetMatch(matches, location);\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n result = {\n type: ResultType.error,\n error: getInternalRouterError(405, {\n method: request.method,\n pathname: location.pathname,\n routeId: actionMatch.route.id,\n }),\n };\n } else {\n result = await callLoaderOrAction(\n \"action\",\n request,\n actionMatch,\n matches,\n manifest,\n mapRouteProperties,\n basename\n );\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n }\n\n if (isRedirectResult(result)) {\n let replace: boolean;\n if (opts && opts.replace != null) {\n replace = opts.replace;\n } else {\n // If the user didn't explicity indicate replace behavior, replace if\n // we redirected to the exact same location we're currently at to avoid\n // double back-buttons\n replace =\n result.location === state.location.pathname + state.location.search;\n }\n await startRedirectNavigation(state, result, { submission, replace });\n return { shortCircuited: true };\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n\n // By default, all submissions are REPLACE navigations, but if the\n // action threw an error that'll be rendered in an errorElement, we fall\n // back to PUSH so that the user can use the back button to get back to\n // the pre-submission form location to try again\n if ((opts && opts.replace) !== true) {\n pendingAction = HistoryAction.Push;\n }\n\n return {\n // Send back an empty object we can use to clear out any prior actionData\n pendingActionData: {},\n pendingActionError: { [boundaryMatch.route.id]: result.error },\n };\n }\n\n if (isDeferredResult(result)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n return {\n pendingActionData: { [actionMatch.route.id]: result.data },\n };\n }\n\n // Call all applicable loaders for the given matches, handling redirects,\n // errors, etc.\n async function handleLoaders(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n overrideNavigation?: Navigation,\n submission?: Submission,\n fetcherSubmission?: Submission,\n replace?: boolean,\n flushSync?: boolean,\n pendingActionData?: RouteData,\n pendingError?: RouteData\n ): Promise {\n // Figure out the right navigation we want to use for data loading\n let loadingNavigation =\n overrideNavigation || getLoadingNavigation(location, submission);\n\n // If this was a redirect from an action we don't have a \"submission\" but\n // we have it on the loading navigation so use that if available\n let activeSubmission =\n submission ||\n fetcherSubmission ||\n getSubmissionFromNavigation(loadingNavigation);\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n activeSubmission,\n location,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n pendingActionData,\n pendingError\n );\n\n // Cancel pending deferreds for no-longer-matched routes or routes we're\n // about to reload. Note that if this is an action reload we would have\n // already cancelled all pending deferreds so this would be a no-op\n cancelActiveDeferreds(\n (routeId) =>\n !(matches && matches.some((m) => m.route.id === routeId)) ||\n (matchesToLoad && matchesToLoad.some((m) => m.route.id === routeId))\n );\n\n pendingNavigationLoadId = ++incrementingLoadId;\n\n // Short circuit if we have no loaders to run\n if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n let updatedFetchers = markFetchRedirectsDone();\n completeNavigation(\n location,\n {\n matches,\n loaderData: {},\n // Commit pending error if we're short circuiting\n errors: pendingError || null,\n ...(pendingActionData ? { actionData: pendingActionData } : {}),\n ...(updatedFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n },\n { flushSync }\n );\n return { shortCircuited: true };\n }\n\n // If this is an uninterrupted revalidation, we remain in our current idle\n // state. If not, we need to switch to our loading state and load data,\n // preserving any new action data or existing action data (in the case of\n // a revalidation interrupting an actionReload)\n if (!isUninterruptedRevalidation) {\n revalidatingFetchers.forEach((rf) => {\n let fetcher = state.fetchers.get(rf.key);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n fetcher ? fetcher.data : undefined\n );\n state.fetchers.set(rf.key, revalidatingFetcher);\n });\n let actionData = pendingActionData || state.actionData;\n updateState(\n {\n navigation: loadingNavigation,\n ...(actionData\n ? Object.keys(actionData).length === 0\n ? { actionData: null }\n : { actionData }\n : {}),\n ...(revalidatingFetchers.length > 0\n ? { fetchers: new Map(state.fetchers) }\n : {}),\n },\n {\n flushSync,\n }\n );\n }\n\n revalidatingFetchers.forEach((rf) => {\n if (fetchControllers.has(rf.key)) {\n abortFetcher(rf.key);\n }\n if (rf.controller) {\n // Fetchers use an independent AbortController so that aborting a fetcher\n // (via deleteFetcher) does not abort the triggering navigation that\n // triggered the revalidation\n fetchControllers.set(rf.key, rf.controller);\n }\n });\n\n // Proxy navigation abort through to revalidation fetchers\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((f) => abortFetcher(f.key));\n if (pendingNavigationController) {\n pendingNavigationController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n\n let { results, loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state.matches,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n request\n );\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n\n // Clean up _after_ loaders have completed. Don't clean up if we short\n // circuited because fetchControllers would have been aborted and\n // reassigned to new controllers for the next navigation\n if (pendingNavigationController) {\n pendingNavigationController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n revalidatingFetchers.forEach((rf) => fetchControllers.delete(rf.key));\n\n // If any loaders returned a redirect Response, start a new REPLACE navigation\n let redirect = findRedirect(results);\n if (redirect) {\n if (redirect.idx >= matchesToLoad.length) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n let fetcherKey =\n revalidatingFetchers[redirect.idx - matchesToLoad.length].key;\n fetchRedirectIds.add(fetcherKey);\n }\n await startRedirectNavigation(state, redirect.result, { replace });\n return { shortCircuited: true };\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n matches,\n matchesToLoad,\n loaderResults,\n pendingError,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Wire up subscribers to update loaderData as promises settle\n activeDeferreds.forEach((deferredData, routeId) => {\n deferredData.subscribe((aborted) => {\n // Note: No need to updateState here since the TrackedPromise on\n // loaderData is stable across resolve/reject\n // Remove this instance if we were aborted or if promises have settled\n if (aborted || deferredData.done) {\n activeDeferreds.delete(routeId);\n }\n });\n });\n\n let updatedFetchers = markFetchRedirectsDone();\n let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n let shouldUpdateFetchers =\n updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n\n return {\n loaderData,\n errors,\n ...(shouldUpdateFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n };\n }\n\n // Trigger a fetcher load/submit for the given fetcher key\n function fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ) {\n if (isServer) {\n throw new Error(\n \"router.fetch() was called during the server render, but it shouldn't be. \" +\n \"You are likely calling a useFetcher() method in the body of your component. \" +\n \"Try moving it to a useEffect or a callback.\"\n );\n }\n\n if (fetchControllers.has(key)) abortFetcher(key);\n let flushSync = (opts && opts.unstable_flushSync) === true;\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n href,\n routeId,\n opts?.relative\n );\n let matches = matchRoutes(routesToUse, normalizedPath, basename);\n\n if (!matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: normalizedPath }),\n { flushSync }\n );\n return;\n }\n\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n true,\n normalizedPath,\n opts\n );\n\n if (error) {\n setFetcherError(key, routeId, error, { flushSync });\n return;\n }\n\n let match = getTargetMatch(matches, path);\n\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n if (submission && isMutationMethod(submission.formMethod)) {\n handleFetcherAction(\n key,\n routeId,\n path,\n match,\n matches,\n flushSync,\n submission\n );\n return;\n }\n\n // Store off the match so we can call it's shouldRevalidate on subsequent\n // revalidations\n fetchLoadMatches.set(key, { routeId, path });\n handleFetcherLoader(\n key,\n routeId,\n path,\n match,\n matches,\n flushSync,\n submission\n );\n }\n\n // Call the action for the matched fetcher.submit(), and then handle redirects,\n // errors, and revalidation\n async function handleFetcherAction(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n requestMatches: AgnosticDataRouteMatch[],\n flushSync: boolean,\n submission: Submission\n ) {\n interruptActiveLoads();\n fetchLoadMatches.delete(key);\n\n if (!match.route.action && !match.route.lazy) {\n let error = getInternalRouterError(405, {\n method: submission.formMethod,\n pathname: path,\n routeId: routeId,\n });\n setFetcherError(key, routeId, error, { flushSync });\n return;\n }\n\n // Put this fetcher into it's submitting state\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), {\n flushSync,\n });\n\n // Call the action for the fetcher\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal,\n submission\n );\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let actionResult = await callLoaderOrAction(\n \"action\",\n fetchRequest,\n match,\n requestMatches,\n manifest,\n mapRouteProperties,\n basename\n );\n\n if (fetchRequest.signal.aborted) {\n // We can delete this so long as we weren't aborted by our own fetcher\n // re-submit which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n return;\n }\n\n if (deletedFetchers.has(key)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n\n if (isRedirectResult(actionResult)) {\n fetchControllers.delete(key);\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our action started, so that\n // should take precedence over this redirect navigation. We already\n // set isRevalidationRequired so all loaders for the new route should\n // fire unless opted out via shouldRevalidate\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n updateFetcherState(key, getLoadingFetcher(submission));\n return startRedirectNavigation(state, actionResult, {\n fetcherSubmission: submission,\n });\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(actionResult)) {\n setFetcherError(key, routeId, actionResult.error);\n return;\n }\n\n if (isDeferredResult(actionResult)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n // Start the data load for current matches, or the next location if we're\n // in the middle of a navigation\n let nextLocation = state.navigation.location || state.location;\n let revalidationRequest = createClientSideRequest(\n init.history,\n nextLocation,\n abortController.signal\n );\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let matches =\n state.navigation.state !== \"idle\"\n ? matchRoutes(routesToUse, state.navigation.location, basename)\n : state.matches;\n\n invariant(matches, \"Didn't find any matches after fetcher action\");\n\n let loadId = ++incrementingLoadId;\n fetchReloadIds.set(key, loadId);\n\n let loadFetcher = getLoadingFetcher(submission, actionResult.data);\n state.fetchers.set(key, loadFetcher);\n\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n submission,\n nextLocation,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n { [match.route.id]: actionResult.data },\n undefined // No need to send through errors since we short circuit above\n );\n\n // Put all revalidating fetchers into the loading state, except for the\n // current fetcher which we want to keep in it's current loading state which\n // contains it's action submission info + action data\n revalidatingFetchers\n .filter((rf) => rf.key !== key)\n .forEach((rf) => {\n let staleKey = rf.key;\n let existingFetcher = state.fetchers.get(staleKey);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n existingFetcher ? existingFetcher.data : undefined\n );\n state.fetchers.set(staleKey, revalidatingFetcher);\n if (fetchControllers.has(staleKey)) {\n abortFetcher(staleKey);\n }\n if (rf.controller) {\n fetchControllers.set(staleKey, rf.controller);\n }\n });\n\n updateState({ fetchers: new Map(state.fetchers) });\n\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((rf) => abortFetcher(rf.key));\n\n abortController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n let { results, loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state.matches,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n revalidationRequest\n );\n\n if (abortController.signal.aborted) {\n return;\n }\n\n abortController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n fetchReloadIds.delete(key);\n fetchControllers.delete(key);\n revalidatingFetchers.forEach((r) => fetchControllers.delete(r.key));\n\n let redirect = findRedirect(results);\n if (redirect) {\n if (redirect.idx >= matchesToLoad.length) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n let fetcherKey =\n revalidatingFetchers[redirect.idx - matchesToLoad.length].key;\n fetchRedirectIds.add(fetcherKey);\n }\n return startRedirectNavigation(state, redirect.result);\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n state.matches,\n matchesToLoad,\n loaderResults,\n undefined,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Since we let revalidations complete even if the submitting fetcher was\n // deleted, only put it back to idle if it hasn't been deleted\n if (state.fetchers.has(key)) {\n let doneFetcher = getDoneFetcher(actionResult.data);\n state.fetchers.set(key, doneFetcher);\n }\n\n abortStaleFetchLoads(loadId);\n\n // If we are currently in a navigation loading state and this fetcher is\n // more recent than the navigation, we want the newer data so abort the\n // navigation and complete it with the fetcher data\n if (\n state.navigation.state === \"loading\" &&\n loadId > pendingNavigationLoadId\n ) {\n invariant(pendingAction, \"Expected pending action\");\n pendingNavigationController && pendingNavigationController.abort();\n\n completeNavigation(state.navigation.location, {\n matches,\n loaderData,\n errors,\n fetchers: new Map(state.fetchers),\n });\n } else {\n // otherwise just update with the fetcher data, preserving any existing\n // loaderData for loaders that did not need to reload. We have to\n // manually merge here since we aren't going through completeNavigation\n updateState({\n errors,\n loaderData: mergeLoaderData(\n state.loaderData,\n loaderData,\n matches,\n errors\n ),\n fetchers: new Map(state.fetchers),\n });\n isRevalidationRequired = false;\n }\n }\n\n // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n async function handleFetcherLoader(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n matches: AgnosticDataRouteMatch[],\n flushSync: boolean,\n submission?: Submission\n ) {\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(\n key,\n getLoadingFetcher(\n submission,\n existingFetcher ? existingFetcher.data : undefined\n ),\n { flushSync }\n );\n\n // Call the loader for this fetcher route match\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal\n );\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let result: DataResult = await callLoaderOrAction(\n \"loader\",\n fetchRequest,\n match,\n matches,\n manifest,\n mapRouteProperties,\n basename\n );\n\n // Deferred isn't supported for fetcher loads, await everything and treat it\n // as a normal load. resolveDeferredData will return undefined if this\n // fetcher gets aborted, so we just leave result untouched and short circuit\n // below if that happens\n if (isDeferredResult(result)) {\n result =\n (await resolveDeferredData(result, fetchRequest.signal, true)) ||\n result;\n }\n\n // We can delete this so long as we weren't aborted by our our own fetcher\n // re-load which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n\n if (fetchRequest.signal.aborted) {\n return;\n }\n\n if (deletedFetchers.has(key)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n\n // If the loader threw a redirect Response, start a new REPLACE navigation\n if (isRedirectResult(result)) {\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our loader started, so that\n // should take precedence over this redirect navigation\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n await startRedirectNavigation(state, result);\n return;\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(result)) {\n setFetcherError(key, routeId, result.error);\n return;\n }\n\n invariant(!isDeferredResult(result), \"Unhandled fetcher deferred data\");\n\n // Put the fetcher back into an idle state\n updateFetcherState(key, getDoneFetcher(result.data));\n }\n\n /**\n * Utility function to handle redirects returned from an action or loader.\n * Normally, a redirect \"replaces\" the navigation that triggered it. So, for\n * example:\n *\n * - user is on /a\n * - user clicks a link to /b\n * - loader for /b redirects to /c\n *\n * In a non-JS app the browser would track the in-flight navigation to /b and\n * then replace it with /c when it encountered the redirect response. In\n * the end it would only ever update the URL bar with /c.\n *\n * In client-side routing using pushState/replaceState, we aim to emulate\n * this behavior and we also do not update history until the end of the\n * navigation (including processed redirects). This means that we never\n * actually touch history until we've processed redirects, so we just use\n * the history action from the original navigation (PUSH or REPLACE).\n */\n async function startRedirectNavigation(\n state: RouterState,\n redirect: RedirectResult,\n {\n submission,\n fetcherSubmission,\n replace,\n }: {\n submission?: Submission;\n fetcherSubmission?: Submission;\n replace?: boolean;\n } = {}\n ) {\n if (redirect.revalidate) {\n isRevalidationRequired = true;\n }\n\n let redirectLocation = createLocation(state.location, redirect.location, {\n _isRedirect: true,\n });\n invariant(\n redirectLocation,\n \"Expected a location on the redirect navigation\"\n );\n\n if (isBrowser) {\n let isDocumentReload = false;\n\n if (redirect.reloadDocument) {\n // Hard reload if the response contained X-Remix-Reload-Document\n isDocumentReload = true;\n } else if (ABSOLUTE_URL_REGEX.test(redirect.location)) {\n const url = init.history.createURL(redirect.location);\n isDocumentReload =\n // Hard reload if it's an absolute URL to a new origin\n url.origin !== routerWindow.location.origin ||\n // Hard reload if it's an absolute URL that does not match our basename\n stripBasename(url.pathname, basename) == null;\n }\n\n if (isDocumentReload) {\n if (replace) {\n routerWindow.location.replace(redirect.location);\n } else {\n routerWindow.location.assign(redirect.location);\n }\n return;\n }\n }\n\n // There's no need to abort on redirects, since we don't detect the\n // redirect until the action/loaders have settled\n pendingNavigationController = null;\n\n let redirectHistoryAction =\n replace === true ? HistoryAction.Replace : HistoryAction.Push;\n\n // Use the incoming submission if provided, fallback on the active one in\n // state.navigation\n let { formMethod, formAction, formEncType } = state.navigation;\n if (\n !submission &&\n !fetcherSubmission &&\n formMethod &&\n formAction &&\n formEncType\n ) {\n submission = getSubmissionFromNavigation(state.navigation);\n }\n\n // If this was a 307/308 submission we want to preserve the HTTP method and\n // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n // redirected location\n let activeSubmission = submission || fetcherSubmission;\n if (\n redirectPreserveMethodStatusCodes.has(redirect.status) &&\n activeSubmission &&\n isMutationMethod(activeSubmission.formMethod)\n ) {\n await startNavigation(redirectHistoryAction, redirectLocation, {\n submission: {\n ...activeSubmission,\n formAction: redirect.location,\n },\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset,\n });\n } else {\n // If we have a navigation submission, we will preserve it through the\n // redirect navigation\n let overrideNavigation = getLoadingNavigation(\n redirectLocation,\n submission\n );\n await startNavigation(redirectHistoryAction, redirectLocation, {\n overrideNavigation,\n // Send fetcher submissions through for shouldRevalidate\n fetcherSubmission,\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset,\n });\n }\n }\n\n async function callLoadersAndMaybeResolveData(\n currentMatches: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n fetchersToLoad: RevalidatingFetcher[],\n request: Request\n ) {\n // Call all navigation loaders and revalidating fetcher loaders in parallel,\n // then slice off the results into separate arrays so we can handle them\n // accordingly\n let results = await Promise.all([\n ...matchesToLoad.map((match) =>\n callLoaderOrAction(\n \"loader\",\n request,\n match,\n matches,\n manifest,\n mapRouteProperties,\n basename\n )\n ),\n ...fetchersToLoad.map((f) => {\n if (f.matches && f.match && f.controller) {\n return callLoaderOrAction(\n \"loader\",\n createClientSideRequest(init.history, f.path, f.controller.signal),\n f.match,\n f.matches,\n manifest,\n mapRouteProperties,\n basename\n );\n } else {\n let error: ErrorResult = {\n type: ResultType.error,\n error: getInternalRouterError(404, { pathname: f.path }),\n };\n return error;\n }\n }),\n ]);\n let loaderResults = results.slice(0, matchesToLoad.length);\n let fetcherResults = results.slice(matchesToLoad.length);\n\n await Promise.all([\n resolveDeferredResults(\n currentMatches,\n matchesToLoad,\n loaderResults,\n loaderResults.map(() => request.signal),\n false,\n state.loaderData\n ),\n resolveDeferredResults(\n currentMatches,\n fetchersToLoad.map((f) => f.match),\n fetcherResults,\n fetchersToLoad.map((f) => (f.controller ? f.controller.signal : null)),\n true\n ),\n ]);\n\n return { results, loaderResults, fetcherResults };\n }\n\n function interruptActiveLoads() {\n // Every interruption triggers a revalidation\n isRevalidationRequired = true;\n\n // Cancel pending route-level deferreds and mark cancelled routes for\n // revalidation\n cancelledDeferredRoutes.push(...cancelActiveDeferreds());\n\n // Abort in-flight fetcher loads\n fetchLoadMatches.forEach((_, key) => {\n if (fetchControllers.has(key)) {\n cancelledFetcherLoads.push(key);\n abortFetcher(key);\n }\n });\n }\n\n function updateFetcherState(\n key: string,\n fetcher: Fetcher,\n opts: { flushSync?: boolean } = {}\n ) {\n state.fetchers.set(key, fetcher);\n updateState(\n { fetchers: new Map(state.fetchers) },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n\n function setFetcherError(\n key: string,\n routeId: string,\n error: any,\n opts: { flushSync?: boolean } = {}\n ) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n deleteFetcher(key);\n updateState(\n {\n errors: {\n [boundaryMatch.route.id]: error,\n },\n fetchers: new Map(state.fetchers),\n },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n\n function getFetcher(key: string): Fetcher {\n if (future.v7_fetcherPersist) {\n activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1);\n // If this fetcher was previously marked for deletion, unmark it since we\n // have a new instance\n if (deletedFetchers.has(key)) {\n deletedFetchers.delete(key);\n }\n }\n return state.fetchers.get(key) || IDLE_FETCHER;\n }\n\n function deleteFetcher(key: string): void {\n let fetcher = state.fetchers.get(key);\n // Don't abort the controller if this is a deletion of a fetcher.submit()\n // in it's loading phase since - we don't want to abort the corresponding\n // revalidation and want them to complete and land\n if (\n fetchControllers.has(key) &&\n !(fetcher && fetcher.state === \"loading\" && fetchReloadIds.has(key))\n ) {\n abortFetcher(key);\n }\n fetchLoadMatches.delete(key);\n fetchReloadIds.delete(key);\n fetchRedirectIds.delete(key);\n deletedFetchers.delete(key);\n state.fetchers.delete(key);\n }\n\n function deleteFetcherAndUpdateState(key: string): void {\n if (future.v7_fetcherPersist) {\n let count = (activeFetchers.get(key) || 0) - 1;\n if (count <= 0) {\n activeFetchers.delete(key);\n deletedFetchers.add(key);\n } else {\n activeFetchers.set(key, count);\n }\n } else {\n deleteFetcher(key);\n }\n updateState({ fetchers: new Map(state.fetchers) });\n }\n\n function abortFetcher(key: string) {\n let controller = fetchControllers.get(key);\n invariant(controller, `Expected fetch controller: ${key}`);\n controller.abort();\n fetchControllers.delete(key);\n }\n\n function markFetchersDone(keys: string[]) {\n for (let key of keys) {\n let fetcher = getFetcher(key);\n let doneFetcher = getDoneFetcher(fetcher.data);\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n function markFetchRedirectsDone(): boolean {\n let doneKeys = [];\n let updatedFetchers = false;\n for (let key of fetchRedirectIds) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n fetchRedirectIds.delete(key);\n doneKeys.push(key);\n updatedFetchers = true;\n }\n }\n markFetchersDone(doneKeys);\n return updatedFetchers;\n }\n\n function abortStaleFetchLoads(landedId: number): boolean {\n let yeetedKeys = [];\n for (let [key, id] of fetchReloadIds) {\n if (id < landedId) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n abortFetcher(key);\n fetchReloadIds.delete(key);\n yeetedKeys.push(key);\n }\n }\n }\n markFetchersDone(yeetedKeys);\n return yeetedKeys.length > 0;\n }\n\n function getBlocker(key: string, fn: BlockerFunction) {\n let blocker: Blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n if (blockerFunctions.get(key) !== fn) {\n blockerFunctions.set(key, fn);\n }\n\n return blocker;\n }\n\n function deleteBlocker(key: string) {\n state.blockers.delete(key);\n blockerFunctions.delete(key);\n }\n\n // Utility function to update blockers, ensuring valid state transitions\n function updateBlocker(key: string, newBlocker: Blocker) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n // Poor mans state machine :)\n // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n invariant(\n (blocker.state === \"unblocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"proceeding\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"unblocked\") ||\n (blocker.state === \"proceeding\" && newBlocker.state === \"unblocked\"),\n `Invalid blocker state transition: ${blocker.state} -> ${newBlocker.state}`\n );\n\n let blockers = new Map(state.blockers);\n blockers.set(key, newBlocker);\n updateState({ blockers });\n }\n\n function shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n }: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n }): string | undefined {\n if (blockerFunctions.size === 0) {\n return;\n }\n\n // We ony support a single active blocker at the moment since we don't have\n // any compelling use cases for multi-blocker yet\n if (blockerFunctions.size > 1) {\n warning(false, \"A router only supports one blocker at a time\");\n }\n\n let entries = Array.from(blockerFunctions.entries());\n let [blockerKey, blockerFunction] = entries[entries.length - 1];\n let blocker = state.blockers.get(blockerKey);\n\n if (blocker && blocker.state === \"proceeding\") {\n // If the blocker is currently proceeding, we don't need to re-check\n // it and can let this navigation continue\n return;\n }\n\n // At this point, we know we're unblocked/blocked so we need to check the\n // user-provided blocker function\n if (blockerFunction({ currentLocation, nextLocation, historyAction })) {\n return blockerKey;\n }\n }\n\n function cancelActiveDeferreds(\n predicate?: (routeId: string) => boolean\n ): string[] {\n let cancelledRouteIds: string[] = [];\n activeDeferreds.forEach((dfd, routeId) => {\n if (!predicate || predicate(routeId)) {\n // Cancel the deferred - but do not remove from activeDeferreds here -\n // we rely on the subscribers to do that so our tests can assert proper\n // cleanup via _internalActiveDeferreds\n dfd.cancel();\n cancelledRouteIds.push(routeId);\n activeDeferreds.delete(routeId);\n }\n });\n return cancelledRouteIds;\n }\n\n // Opt in to capturing and reporting scroll positions during navigations,\n // used by the component\n function enableScrollRestoration(\n positions: Record,\n getPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ) {\n savedScrollPositions = positions;\n getScrollPosition = getPosition;\n getScrollRestorationKey = getKey || null;\n\n // Perform initial hydration scroll restoration, since we miss the boat on\n // the initial updateState() because we've not yet rendered \n // and therefore have no savedScrollPositions available\n if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n initialScrollRestored = true;\n let y = getSavedScrollPosition(state.location, state.matches);\n if (y != null) {\n updateState({ restoreScrollPosition: y });\n }\n }\n\n return () => {\n savedScrollPositions = null;\n getScrollPosition = null;\n getScrollRestorationKey = null;\n };\n }\n\n function getScrollKey(location: Location, matches: AgnosticDataRouteMatch[]) {\n if (getScrollRestorationKey) {\n let key = getScrollRestorationKey(\n location,\n matches.map((m) => convertRouteMatchToUiMatch(m, state.loaderData))\n );\n return key || location.key;\n }\n return location.key;\n }\n\n function saveScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): void {\n if (savedScrollPositions && getScrollPosition) {\n let key = getScrollKey(location, matches);\n savedScrollPositions[key] = getScrollPosition();\n }\n }\n\n function getSavedScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): number | null {\n if (savedScrollPositions) {\n let key = getScrollKey(location, matches);\n let y = savedScrollPositions[key];\n if (typeof y === \"number\") {\n return y;\n }\n }\n return null;\n }\n\n function _internalSetRoutes(newRoutes: AgnosticDataRouteObject[]) {\n manifest = {};\n inFlightDataRoutes = convertRoutesToDataRoutes(\n newRoutes,\n mapRouteProperties,\n undefined,\n manifest\n );\n }\n\n router = {\n get basename() {\n return basename;\n },\n get state() {\n return state;\n },\n get routes() {\n return dataRoutes;\n },\n get window() {\n return routerWindow;\n },\n initialize,\n subscribe,\n enableScrollRestoration,\n navigate,\n fetch,\n revalidate,\n // Passthrough to history-aware createHref used by useHref so we get proper\n // hash-aware URLs in DOM paths\n createHref: (to: To) => init.history.createHref(to),\n encodeLocation: (to: To) => init.history.encodeLocation(to),\n getFetcher,\n deleteFetcher: deleteFetcherAndUpdateState,\n dispose,\n getBlocker,\n deleteBlocker,\n _internalFetchControllers: fetchControllers,\n _internalActiveDeferreds: activeDeferreds,\n // TODO: Remove setRoutes, it's temporary to avoid dealing with\n // updating the tree while validating the update algorithm.\n _internalSetRoutes,\n };\n\n return router;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\n\nexport const UNSAFE_DEFERRED_SYMBOL = Symbol(\"deferred\");\n\nexport interface CreateStaticHandlerOptions {\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n}\n\nexport function createStaticHandler(\n routes: AgnosticRouteObject[],\n opts?: CreateStaticHandlerOptions\n): StaticHandler {\n invariant(\n routes.length > 0,\n \"You must provide a non-empty routes array to createStaticHandler\"\n );\n\n let manifest: RouteManifest = {};\n let basename = (opts ? opts.basename : null) || \"/\";\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (opts?.mapRouteProperties) {\n mapRouteProperties = opts.mapRouteProperties;\n } else if (opts?.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = opts.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n\n let dataRoutes = convertRoutesToDataRoutes(\n routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n\n /**\n * The query() method is intended for document requests, in which we want to\n * call an optional action and potentially multiple loaders for all nested\n * routes. It returns a StaticHandlerContext object, which is very similar\n * to the router state (location, loaderData, actionData, errors, etc.) and\n * also adds SSR-specific information such as the statusCode and headers\n * from action/loaders Responses.\n *\n * It _should_ never throw and should report all errors through the\n * returned context.errors object, properly associating errors to their error\n * boundary. Additionally, it tracks _deepestRenderedBoundaryId which can be\n * used to emulate React error boundaries during SSr by performing a second\n * pass only down to the boundaryId.\n *\n * The one exception where we do not return a StaticHandlerContext is when a\n * redirect response is returned or thrown from any action/loader. We\n * propagate that out and return the raw Response so the HTTP server can\n * return it directly.\n */\n async function query(\n request: Request,\n { requestContext }: { requestContext?: unknown } = {}\n ): Promise {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\") {\n let error = getInternalRouterError(405, { method });\n let { matches: methodNotAllowedMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: methodNotAllowedMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n } else if (!matches) {\n let error = getInternalRouterError(404, { pathname: location.pathname });\n let { matches: notFoundMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: notFoundMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let result = await queryImpl(request, location, matches, requestContext);\n if (isResponse(result)) {\n return result;\n }\n\n // When returning StaticHandlerContext, we patch back in the location here\n // since we need it for React Context. But this helps keep our submit and\n // loadRouteData operating on a Request instead of a Location\n return { location, basename, ...result };\n }\n\n /**\n * The queryRoute() method is intended for targeted route requests, either\n * for fetch ?_data requests or resource route requests. In this case, we\n * are only ever calling a single action or loader, and we are returning the\n * returned value directly. In most cases, this will be a Response returned\n * from the action/loader, but it may be a primitive or other value as well -\n * and in such cases the calling context should handle that accordingly.\n *\n * We do respect the throw/return differentiation, so if an action/loader\n * throws, then this method will throw the value. This is important so we\n * can do proper boundary identification in Remix where a thrown Response\n * must go to the Catch Boundary but a returned Response is happy-path.\n *\n * One thing to note is that any Router-initiated Errors that make sense\n * to associate with a status code will be thrown as an ErrorResponse\n * instance which include the raw Error, such that the calling context can\n * serialize the error as they see fit while including the proper response\n * code. Examples here are 404 and 405 errors that occur prior to reaching\n * any user-defined loaders.\n */\n async function queryRoute(\n request: Request,\n {\n routeId,\n requestContext,\n }: { requestContext?: unknown; routeId?: string } = {}\n ): Promise {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\" && method !== \"OPTIONS\") {\n throw getInternalRouterError(405, { method });\n } else if (!matches) {\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let match = routeId\n ? matches.find((m) => m.route.id === routeId)\n : getTargetMatch(matches, location);\n\n if (routeId && !match) {\n throw getInternalRouterError(403, {\n pathname: location.pathname,\n routeId,\n });\n } else if (!match) {\n // This should never hit I don't think?\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n match\n );\n if (isResponse(result)) {\n return result;\n }\n\n let error = result.errors ? Object.values(result.errors)[0] : undefined;\n if (error !== undefined) {\n // If we got back result.errors, that means the loader/action threw\n // _something_ that wasn't a Response, but it's not guaranteed/required\n // to be an `instanceof Error` either, so we have to use throw here to\n // preserve the \"error\" state outside of queryImpl.\n throw error;\n }\n\n // Pick off the right state value to return\n if (result.actionData) {\n return Object.values(result.actionData)[0];\n }\n\n if (result.loaderData) {\n let data = Object.values(result.loaderData)[0];\n if (result.activeDeferreds?.[match.route.id]) {\n data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n }\n return data;\n }\n\n return undefined;\n }\n\n async function queryImpl(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n routeMatch?: AgnosticDataRouteMatch\n ): Promise | Response> {\n invariant(\n request.signal,\n \"query()/queryRoute() requests must contain an AbortController signal\"\n );\n\n try {\n if (isMutationMethod(request.method.toLowerCase())) {\n let result = await submit(\n request,\n matches,\n routeMatch || getTargetMatch(matches, location),\n requestContext,\n routeMatch != null\n );\n return result;\n }\n\n let result = await loadRouteData(\n request,\n matches,\n requestContext,\n routeMatch\n );\n return isResponse(result)\n ? result\n : {\n ...result,\n actionData: null,\n actionHeaders: {},\n };\n } catch (e) {\n // If the user threw/returned a Response in callLoaderOrAction, we throw\n // it to bail out and then return or throw here based on whether the user\n // returned or threw\n if (isQueryRouteResponse(e)) {\n if (e.type === ResultType.error) {\n throw e.response;\n }\n return e.response;\n }\n // Redirects are always returned since they don't propagate to catch\n // boundaries\n if (isRedirectResponse(e)) {\n return e;\n }\n throw e;\n }\n }\n\n async function submit(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n actionMatch: AgnosticDataRouteMatch,\n requestContext: unknown,\n isRouteRequest: boolean\n ): Promise | Response> {\n let result: DataResult;\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n let error = getInternalRouterError(405, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: actionMatch.route.id,\n });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n } else {\n result = await callLoaderOrAction(\n \"action\",\n request,\n actionMatch,\n matches,\n manifest,\n mapRouteProperties,\n basename,\n { isStaticRequest: true, isRouteRequest, requestContext }\n );\n\n if (request.signal.aborted) {\n let method = isRouteRequest ? \"queryRoute\" : \"query\";\n throw new Error(\n `${method}() call aborted: ${request.method} ${request.url}`\n );\n }\n }\n\n if (isRedirectResult(result)) {\n // Uhhhh - this should never happen, we should always throw these from\n // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n // can get back on the \"throw all redirect responses\" train here should\n // this ever happen :/\n throw new Response(null, {\n status: result.status,\n headers: {\n Location: result.location,\n },\n });\n }\n\n if (isDeferredResult(result)) {\n let error = getInternalRouterError(400, { type: \"defer-action\" });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n }\n\n if (isRouteRequest) {\n // Note: This should only be non-Response values if we get here, since\n // isRouteRequest should throw any Response received in callLoaderOrAction\n if (isErrorResult(result)) {\n throw result.error;\n }\n\n return {\n matches: [actionMatch],\n loaderData: {},\n actionData: { [actionMatch.route.id]: result.data },\n errors: null,\n // Note: statusCode + headers are unused here since queryRoute will\n // return the raw Response or value\n statusCode: 200,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n let context = await loadRouteData(\n request,\n matches,\n requestContext,\n undefined,\n {\n [boundaryMatch.route.id]: result.error,\n }\n );\n\n // action status codes take precedence over loader status codes\n return {\n ...context,\n statusCode: isRouteErrorResponse(result.error)\n ? result.error.status\n : 500,\n actionData: null,\n actionHeaders: {\n ...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),\n },\n };\n }\n\n // Create a GET request for the loaders\n let loaderRequest = new Request(request.url, {\n headers: request.headers,\n redirect: request.redirect,\n signal: request.signal,\n });\n let context = await loadRouteData(loaderRequest, matches, requestContext);\n\n return {\n ...context,\n // action status codes take precedence over loader status codes\n ...(result.statusCode ? { statusCode: result.statusCode } : {}),\n actionData: {\n [actionMatch.route.id]: result.data,\n },\n actionHeaders: {\n ...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),\n },\n };\n }\n\n async function loadRouteData(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n routeMatch?: AgnosticDataRouteMatch,\n pendingActionError?: RouteData\n ): Promise<\n | Omit<\n StaticHandlerContext,\n \"location\" | \"basename\" | \"actionData\" | \"actionHeaders\"\n >\n | Response\n > {\n let isRouteRequest = routeMatch != null;\n\n // Short circuit if we have no loaders to run (queryRoute())\n if (\n isRouteRequest &&\n !routeMatch?.route.loader &&\n !routeMatch?.route.lazy\n ) {\n throw getInternalRouterError(400, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: routeMatch?.route.id,\n });\n }\n\n let requestMatches = routeMatch\n ? [routeMatch]\n : getLoaderMatchesUntilBoundary(\n matches,\n Object.keys(pendingActionError || {})[0]\n );\n let matchesToLoad = requestMatches.filter(\n (m) => m.route.loader || m.route.lazy\n );\n\n // Short circuit if we have no loaders to run (query())\n if (matchesToLoad.length === 0) {\n return {\n matches,\n // Add a null for all matched routes for proper revalidation on the client\n loaderData: matches.reduce(\n (acc, m) => Object.assign(acc, { [m.route.id]: null }),\n {}\n ),\n errors: pendingActionError || null,\n statusCode: 200,\n loaderHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let results = await Promise.all([\n ...matchesToLoad.map((match) =>\n callLoaderOrAction(\n \"loader\",\n request,\n match,\n matches,\n manifest,\n mapRouteProperties,\n basename,\n { isStaticRequest: true, isRouteRequest, requestContext }\n )\n ),\n ]);\n\n if (request.signal.aborted) {\n let method = isRouteRequest ? \"queryRoute\" : \"query\";\n throw new Error(\n `${method}() call aborted: ${request.method} ${request.url}`\n );\n }\n\n // Process and commit output from loaders\n let activeDeferreds = new Map();\n let context = processRouteLoaderData(\n matches,\n matchesToLoad,\n results,\n pendingActionError,\n activeDeferreds\n );\n\n // Add a null for any non-loader matches for proper revalidation on the client\n let executedLoaders = new Set(\n matchesToLoad.map((match) => match.route.id)\n );\n matches.forEach((match) => {\n if (!executedLoaders.has(match.route.id)) {\n context.loaderData[match.route.id] = null;\n }\n });\n\n return {\n ...context,\n matches,\n activeDeferreds:\n activeDeferreds.size > 0\n ? Object.fromEntries(activeDeferreds.entries())\n : null,\n };\n }\n\n return {\n dataRoutes,\n query,\n queryRoute,\n };\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\nexport function getStaticContextFromError(\n routes: AgnosticDataRouteObject[],\n context: StaticHandlerContext,\n error: any\n) {\n let newContext: StaticHandlerContext = {\n ...context,\n statusCode: 500,\n errors: {\n [context._deepestRenderedBoundaryId || routes[0].id]: error,\n },\n };\n return newContext;\n}\n\nfunction isSubmissionNavigation(\n opts: BaseNavigateOrFetchOptions\n): opts is SubmissionNavigateOptions {\n return (\n opts != null &&\n ((\"formData\" in opts && opts.formData != null) ||\n (\"body\" in opts && opts.body !== undefined))\n );\n}\n\nfunction normalizeTo(\n location: Path,\n matches: AgnosticDataRouteMatch[],\n basename: string,\n prependBasename: boolean,\n to: To | null,\n fromRouteId?: string,\n relative?: RelativeRoutingType\n) {\n let contextualMatches: AgnosticDataRouteMatch[];\n let activeRouteMatch: AgnosticDataRouteMatch | undefined;\n if (fromRouteId) {\n // Grab matches up to the calling route so our route-relative logic is\n // relative to the correct source route\n contextualMatches = [];\n for (let match of matches) {\n contextualMatches.push(match);\n if (match.route.id === fromRouteId) {\n activeRouteMatch = match;\n break;\n }\n }\n } else {\n contextualMatches = matches;\n activeRouteMatch = matches[matches.length - 1];\n }\n\n // Resolve the relative path\n let path = resolveTo(\n to ? to : \".\",\n getPathContributingMatches(contextualMatches).map((m) => m.pathnameBase),\n stripBasename(location.pathname, basename) || location.pathname,\n relative === \"path\"\n );\n\n // When `to` is not specified we inherit search/hash from the current\n // location, unlike when to=\".\" and we just inherit the path.\n // See https://github.com/remix-run/remix/issues/927\n if (to == null) {\n path.search = location.search;\n path.hash = location.hash;\n }\n\n // Add an ?index param for matched index routes if we don't already have one\n if (\n (to == null || to === \"\" || to === \".\") &&\n activeRouteMatch &&\n activeRouteMatch.route.index &&\n !hasNakedIndexQuery(path.search)\n ) {\n path.search = path.search\n ? path.search.replace(/^\\?/, \"?index&\")\n : \"?index\";\n }\n\n // If we're operating within a basename, prepend it to the pathname. If\n // this is a root navigation, then just use the raw basename which allows\n // the basename to have full control over the presence of a trailing slash\n // on root actions\n if (prependBasename && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n\n return createPath(path);\n}\n\n// Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\nfunction normalizeNavigateOptions(\n normalizeFormMethod: boolean,\n isFetcher: boolean,\n path: string,\n opts?: BaseNavigateOrFetchOptions\n): {\n path: string;\n submission?: Submission;\n error?: ErrorResponseImpl;\n} {\n // Return location verbatim on non-submission navigations\n if (!opts || !isSubmissionNavigation(opts)) {\n return { path };\n }\n\n if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n return {\n path,\n error: getInternalRouterError(405, { method: opts.formMethod }),\n };\n }\n\n let getInvalidBodyError = () => ({\n path,\n error: getInternalRouterError(400, { type: \"invalid-body\" }),\n });\n\n // Create a Submission on non-GET navigations\n let rawFormMethod = opts.formMethod || \"get\";\n let formMethod = normalizeFormMethod\n ? (rawFormMethod.toUpperCase() as V7_FormMethod)\n : (rawFormMethod.toLowerCase() as FormMethod);\n let formAction = stripHashFromPath(path);\n\n if (opts.body !== undefined) {\n if (opts.formEncType === \"text/plain\") {\n // text only support POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n let text =\n typeof opts.body === \"string\"\n ? opts.body\n : opts.body instanceof FormData ||\n opts.body instanceof URLSearchParams\n ? // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data\n Array.from(opts.body.entries()).reduce(\n (acc, [name, value]) => `${acc}${name}=${value}\\n`,\n \"\"\n )\n : String(opts.body);\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json: undefined,\n text,\n },\n };\n } else if (opts.formEncType === \"application/json\") {\n // json only supports POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n try {\n let json =\n typeof opts.body === \"string\" ? JSON.parse(opts.body) : opts.body;\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json,\n text: undefined,\n },\n };\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n }\n\n invariant(\n typeof FormData === \"function\",\n \"FormData is not available in this environment\"\n );\n\n let searchParams: URLSearchParams;\n let formData: FormData;\n\n if (opts.formData) {\n searchParams = convertFormDataToSearchParams(opts.formData);\n formData = opts.formData;\n } else if (opts.body instanceof FormData) {\n searchParams = convertFormDataToSearchParams(opts.body);\n formData = opts.body;\n } else if (opts.body instanceof URLSearchParams) {\n searchParams = opts.body;\n formData = convertSearchParamsToFormData(searchParams);\n } else if (opts.body == null) {\n searchParams = new URLSearchParams();\n formData = new FormData();\n } else {\n try {\n searchParams = new URLSearchParams(opts.body);\n formData = convertSearchParamsToFormData(searchParams);\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n\n let submission: Submission = {\n formMethod,\n formAction,\n formEncType:\n (opts && opts.formEncType) || \"application/x-www-form-urlencoded\",\n formData,\n json: undefined,\n text: undefined,\n };\n\n if (isMutationMethod(submission.formMethod)) {\n return { path, submission };\n }\n\n // Flatten submission onto URLSearchParams for GET submissions\n let parsedPath = parsePath(path);\n // On GET navigation submissions we can drop the ?index param from the\n // resulting location since all loaders will run. But fetcher GET submissions\n // only run a single loader so we need to preserve any incoming ?index params\n if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n searchParams.append(\"index\", \"\");\n }\n parsedPath.search = `?${searchParams}`;\n\n return { path: createPath(parsedPath), submission };\n}\n\n// Filter out all routes below any caught error as they aren't going to\n// render so we don't need to load them\nfunction getLoaderMatchesUntilBoundary(\n matches: AgnosticDataRouteMatch[],\n boundaryId?: string\n) {\n let boundaryMatches = matches;\n if (boundaryId) {\n let index = matches.findIndex((m) => m.route.id === boundaryId);\n if (index >= 0) {\n boundaryMatches = matches.slice(0, index);\n }\n }\n return boundaryMatches;\n}\n\nfunction getMatchesToLoad(\n history: History,\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n submission: Submission | undefined,\n location: Location,\n isRevalidationRequired: boolean,\n cancelledDeferredRoutes: string[],\n cancelledFetcherLoads: string[],\n fetchLoadMatches: Map,\n fetchRedirectIds: Set,\n routesToUse: AgnosticDataRouteObject[],\n basename: string | undefined,\n pendingActionData?: RouteData,\n pendingError?: RouteData\n): [AgnosticDataRouteMatch[], RevalidatingFetcher[]] {\n let actionResult = pendingError\n ? Object.values(pendingError)[0]\n : pendingActionData\n ? Object.values(pendingActionData)[0]\n : undefined;\n\n let currentUrl = history.createURL(state.location);\n let nextUrl = history.createURL(location);\n\n // Pick navigation matches that are net-new or qualify for revalidation\n let boundaryId = pendingError ? Object.keys(pendingError)[0] : undefined;\n let boundaryMatches = getLoaderMatchesUntilBoundary(matches, boundaryId);\n\n let navigationMatches = boundaryMatches.filter((match, index) => {\n if (match.route.lazy) {\n // We haven't loaded this route yet so we don't know if it's got a loader!\n return true;\n }\n if (match.route.loader == null) {\n return false;\n }\n\n // Always call the loader on new route instances and pending defer cancellations\n if (\n isNewLoader(state.loaderData, state.matches[index], match) ||\n cancelledDeferredRoutes.some((id) => id === match.route.id)\n ) {\n return true;\n }\n\n // This is the default implementation for when we revalidate. If the route\n // provides it's own implementation, then we give them full control but\n // provide this value so they can leverage it if needed after they check\n // their own specific use cases\n let currentRouteMatch = state.matches[index];\n let nextRouteMatch = match;\n\n return shouldRevalidateLoader(match, {\n currentUrl,\n currentParams: currentRouteMatch.params,\n nextUrl,\n nextParams: nextRouteMatch.params,\n ...submission,\n actionResult,\n defaultShouldRevalidate:\n // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n isRevalidationRequired ||\n // Clicked the same link, resubmitted a GET form\n currentUrl.pathname + currentUrl.search ===\n nextUrl.pathname + nextUrl.search ||\n // Search params affect all loaders\n currentUrl.search !== nextUrl.search ||\n isNewRouteInstance(currentRouteMatch, nextRouteMatch),\n });\n });\n\n // Pick fetcher.loads that need to be revalidated\n let revalidatingFetchers: RevalidatingFetcher[] = [];\n fetchLoadMatches.forEach((f, key) => {\n // Don't revalidate if fetcher won't be present in the subsequent render\n if (!matches.some((m) => m.route.id === f.routeId)) {\n return;\n }\n\n let fetcherMatches = matchRoutes(routesToUse, f.path, basename);\n\n // If the fetcher path no longer matches, push it in with null matches so\n // we can trigger a 404 in callLoadersAndMaybeResolveData. Note this is\n // currently only a use-case for Remix HMR where the route tree can change\n // at runtime and remove a route previously loaded via a fetcher\n if (!fetcherMatches) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: null,\n match: null,\n controller: null,\n });\n return;\n }\n\n // Revalidating fetchers are decoupled from the route matches since they\n // load from a static href. They revalidate based on explicit revalidation\n // (submission, useRevalidator, or X-Remix-Revalidate)\n let fetcher = state.fetchers.get(key);\n let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n\n let shouldRevalidate = false;\n if (fetchRedirectIds.has(key)) {\n // Never trigger a revalidation of an actively redirecting fetcher\n shouldRevalidate = false;\n } else if (cancelledFetcherLoads.includes(key)) {\n // Always revalidate if the fetcher was cancelled\n shouldRevalidate = true;\n } else if (\n fetcher &&\n fetcher.state !== \"idle\" &&\n fetcher.data === undefined\n ) {\n // If the fetcher hasn't ever completed loading yet, then this isn't a\n // revalidation, it would just be a brand new load if an explicit\n // revalidation is required\n shouldRevalidate = isRevalidationRequired;\n } else {\n // Otherwise fall back on any user-defined shouldRevalidate, defaulting\n // to explicit revalidations only\n shouldRevalidate = shouldRevalidateLoader(fetcherMatch, {\n currentUrl,\n currentParams: state.matches[state.matches.length - 1].params,\n nextUrl,\n nextParams: matches[matches.length - 1].params,\n ...submission,\n actionResult,\n defaultShouldRevalidate: isRevalidationRequired,\n });\n }\n\n if (shouldRevalidate) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: fetcherMatches,\n match: fetcherMatch,\n controller: new AbortController(),\n });\n }\n });\n\n return [navigationMatches, revalidatingFetchers];\n}\n\nfunction isNewLoader(\n currentLoaderData: RouteData,\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let isNew =\n // [a] -> [a, b]\n !currentMatch ||\n // [a, b] -> [a, c]\n match.route.id !== currentMatch.route.id;\n\n // Handle the case that we don't have data for a re-used route, potentially\n // from a prior error or from a cancelled pending deferred\n let isMissingData = currentLoaderData[match.route.id] === undefined;\n\n // Always load if this is a net-new route or we don't yet have data\n return isNew || isMissingData;\n}\n\nfunction isNewRouteInstance(\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let currentPath = currentMatch.route.path;\n return (\n // param change for this match, /users/123 -> /users/456\n currentMatch.pathname !== match.pathname ||\n // splat param changed, which is not present in match.path\n // e.g. /files/images/avatar.jpg -> files/finances.xls\n (currentPath != null &&\n currentPath.endsWith(\"*\") &&\n currentMatch.params[\"*\"] !== match.params[\"*\"])\n );\n}\n\nfunction shouldRevalidateLoader(\n loaderMatch: AgnosticDataRouteMatch,\n arg: ShouldRevalidateFunctionArgs\n) {\n if (loaderMatch.route.shouldRevalidate) {\n let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n if (typeof routeChoice === \"boolean\") {\n return routeChoice;\n }\n }\n\n return arg.defaultShouldRevalidate;\n}\n\n/**\n * Execute route.lazy() methods to lazily load route modules (loader, action,\n * shouldRevalidate) and update the routeManifest in place which shares objects\n * with dataRoutes so those get updated as well.\n */\nasync function loadLazyRouteModule(\n route: AgnosticDataRouteObject,\n mapRouteProperties: MapRoutePropertiesFunction,\n manifest: RouteManifest\n) {\n if (!route.lazy) {\n return;\n }\n\n let lazyRoute = await route.lazy();\n\n // If the lazy route function was executed and removed by another parallel\n // call then we can return - first lazy() to finish wins because the return\n // value of lazy is expected to be static\n if (!route.lazy) {\n return;\n }\n\n let routeToUpdate = manifest[route.id];\n invariant(routeToUpdate, \"No route found in manifest\");\n\n // Update the route in place. This should be safe because there's no way\n // we could yet be sitting on this route as we can't get there without\n // resolving lazy() first.\n //\n // This is different than the HMR \"update\" use-case where we may actively be\n // on the route being updated. The main concern boils down to \"does this\n // mutation affect any ongoing navigations or any current state.matches\n // values?\". If not, it should be safe to update in place.\n let routeUpdates: Record = {};\n for (let lazyRouteProperty in lazyRoute) {\n let staticRouteValue =\n routeToUpdate[lazyRouteProperty as keyof typeof routeToUpdate];\n\n let isPropertyStaticallyDefined =\n staticRouteValue !== undefined &&\n // This property isn't static since it should always be updated based\n // on the route updates\n lazyRouteProperty !== \"hasErrorBoundary\";\n\n warning(\n !isPropertyStaticallyDefined,\n `Route \"${routeToUpdate.id}\" has a static property \"${lazyRouteProperty}\" ` +\n `defined but its lazy function is also returning a value for this property. ` +\n `The lazy route property \"${lazyRouteProperty}\" will be ignored.`\n );\n\n if (\n !isPropertyStaticallyDefined &&\n !immutableRouteKeys.has(lazyRouteProperty as ImmutableRouteKey)\n ) {\n routeUpdates[lazyRouteProperty] =\n lazyRoute[lazyRouteProperty as keyof typeof lazyRoute];\n }\n }\n\n // Mutate the route with the provided updates. Do this first so we pass\n // the updated version to mapRouteProperties\n Object.assign(routeToUpdate, routeUpdates);\n\n // Mutate the `hasErrorBoundary` property on the route based on the route\n // updates and remove the `lazy` function so we don't resolve the lazy\n // route again.\n Object.assign(routeToUpdate, {\n // To keep things framework agnostic, we use the provided\n // `mapRouteProperties` (or wrapped `detectErrorBoundary`) function to\n // set the framework-aware properties (`element`/`hasErrorBoundary`) since\n // the logic will differ between frameworks.\n ...mapRouteProperties(routeToUpdate),\n lazy: undefined,\n });\n}\n\nasync function callLoaderOrAction(\n type: \"loader\" | \"action\",\n request: Request,\n match: AgnosticDataRouteMatch,\n matches: AgnosticDataRouteMatch[],\n manifest: RouteManifest,\n mapRouteProperties: MapRoutePropertiesFunction,\n basename: string,\n opts: {\n isStaticRequest?: boolean;\n isRouteRequest?: boolean;\n requestContext?: unknown;\n } = {}\n): Promise {\n let resultType;\n let result;\n let onReject: (() => void) | undefined;\n\n let runHandler = (handler: ActionFunction | LoaderFunction) => {\n // Setup a promise we can race against so that abort signals short circuit\n let reject: () => void;\n let abortPromise = new Promise((_, r) => (reject = r));\n onReject = () => reject();\n request.signal.addEventListener(\"abort\", onReject);\n return Promise.race([\n handler({\n request,\n params: match.params,\n context: opts.requestContext,\n }),\n abortPromise,\n ]);\n };\n\n try {\n let handler = match.route[type];\n\n if (match.route.lazy) {\n if (handler) {\n // Run statically defined handler in parallel with lazy()\n let handlerError;\n let values = await Promise.all([\n // If the handler throws, don't let it immediately bubble out,\n // since we need to let the lazy() execution finish so we know if this\n // route has a boundary that can handle the error\n runHandler(handler).catch((e) => {\n handlerError = e;\n }),\n loadLazyRouteModule(match.route, mapRouteProperties, manifest),\n ]);\n if (handlerError) {\n throw handlerError;\n }\n result = values[0];\n } else {\n // Load lazy route module, then run any returned handler\n await loadLazyRouteModule(match.route, mapRouteProperties, manifest);\n\n handler = match.route[type];\n if (handler) {\n // Handler still run even if we got interrupted to maintain consistency\n // with un-abortable behavior of handler execution on non-lazy or\n // previously-lazy-loaded routes\n result = await runHandler(handler);\n } else if (type === \"action\") {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(405, {\n method: request.method,\n pathname,\n routeId: match.route.id,\n });\n } else {\n // lazy() route has no loader to run. Short circuit here so we don't\n // hit the invariant below that errors on returning undefined.\n return { type: ResultType.data, data: undefined };\n }\n }\n } else if (!handler) {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(404, {\n pathname,\n });\n } else {\n result = await runHandler(handler);\n }\n\n invariant(\n result !== undefined,\n `You defined ${type === \"action\" ? \"an action\" : \"a loader\"} for route ` +\n `\"${match.route.id}\" but didn't return anything from your \\`${type}\\` ` +\n `function. Please return a value or \\`null\\`.`\n );\n } catch (e) {\n resultType = ResultType.error;\n result = e;\n } finally {\n if (onReject) {\n request.signal.removeEventListener(\"abort\", onReject);\n }\n }\n\n if (isResponse(result)) {\n let status = result.status;\n\n // Process redirects\n if (redirectStatusCodes.has(status)) {\n let location = result.headers.get(\"Location\");\n invariant(\n location,\n \"Redirects returned/thrown from loaders/actions must have a Location header\"\n );\n\n // Support relative routing in internal redirects\n if (!ABSOLUTE_URL_REGEX.test(location)) {\n location = normalizeTo(\n new URL(request.url),\n matches.slice(0, matches.indexOf(match) + 1),\n basename,\n true,\n location\n );\n } else if (!opts.isStaticRequest) {\n // Strip off the protocol+origin for same-origin + same-basename absolute\n // redirects. If this is a static request, we can let it go back to the\n // browser as-is\n let currentUrl = new URL(request.url);\n let url = location.startsWith(\"//\")\n ? new URL(currentUrl.protocol + location)\n : new URL(location);\n let isSameBasename = stripBasename(url.pathname, basename) != null;\n if (url.origin === currentUrl.origin && isSameBasename) {\n location = url.pathname + url.search + url.hash;\n }\n }\n\n // Don't process redirects in the router during static requests requests.\n // Instead, throw the Response and let the server handle it with an HTTP\n // redirect. We also update the Location header in place in this flow so\n // basename and relative routing is taken into account\n if (opts.isStaticRequest) {\n result.headers.set(\"Location\", location);\n throw result;\n }\n\n return {\n type: ResultType.redirect,\n status,\n location,\n revalidate: result.headers.get(\"X-Remix-Revalidate\") !== null,\n reloadDocument: result.headers.get(\"X-Remix-Reload-Document\") !== null,\n };\n }\n\n // For SSR single-route requests, we want to hand Responses back directly\n // without unwrapping. We do this with the QueryRouteResponse wrapper\n // interface so we can know whether it was returned or thrown\n if (opts.isRouteRequest) {\n let queryRouteResponse: QueryRouteResponse = {\n type:\n resultType === ResultType.error ? ResultType.error : ResultType.data,\n response: result,\n };\n throw queryRouteResponse;\n }\n\n let data: any;\n let contentType = result.headers.get(\"Content-Type\");\n // Check between word boundaries instead of startsWith() due to the last\n // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n data = await result.json();\n } else {\n data = await result.text();\n }\n\n if (resultType === ResultType.error) {\n return {\n type: resultType,\n error: new ErrorResponseImpl(status, result.statusText, data),\n headers: result.headers,\n };\n }\n\n return {\n type: ResultType.data,\n data,\n statusCode: result.status,\n headers: result.headers,\n };\n }\n\n if (resultType === ResultType.error) {\n return { type: resultType, error: result };\n }\n\n if (isDeferredData(result)) {\n return {\n type: ResultType.deferred,\n deferredData: result,\n statusCode: result.init?.status,\n headers: result.init?.headers && new Headers(result.init.headers),\n };\n }\n\n return { type: ResultType.data, data: result };\n}\n\n// Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches. During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\nfunction createClientSideRequest(\n history: History,\n location: string | Location,\n signal: AbortSignal,\n submission?: Submission\n): Request {\n let url = history.createURL(stripHashFromPath(location)).toString();\n let init: RequestInit = { signal };\n\n if (submission && isMutationMethod(submission.formMethod)) {\n let { formMethod, formEncType } = submission;\n // Didn't think we needed this but it turns out unlike other methods, patch\n // won't be properly normalized to uppercase and results in a 405 error.\n // See: https://fetch.spec.whatwg.org/#concept-method\n init.method = formMethod.toUpperCase();\n\n if (formEncType === \"application/json\") {\n init.headers = new Headers({ \"Content-Type\": formEncType });\n init.body = JSON.stringify(submission.json);\n } else if (formEncType === \"text/plain\") {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.text;\n } else if (\n formEncType === \"application/x-www-form-urlencoded\" &&\n submission.formData\n ) {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = convertFormDataToSearchParams(submission.formData);\n } else {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.formData;\n }\n }\n\n return new Request(url, init);\n}\n\nfunction convertFormDataToSearchParams(formData: FormData): URLSearchParams {\n let searchParams = new URLSearchParams();\n\n for (let [key, value] of formData.entries()) {\n // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n searchParams.append(key, typeof value === \"string\" ? value : value.name);\n }\n\n return searchParams;\n}\n\nfunction convertSearchParamsToFormData(\n searchParams: URLSearchParams\n): FormData {\n let formData = new FormData();\n for (let [key, value] of searchParams.entries()) {\n formData.append(key, value);\n }\n return formData;\n}\n\nfunction processRouteLoaderData(\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n results: DataResult[],\n pendingError: RouteData | undefined,\n activeDeferreds: Map\n): {\n loaderData: RouterState[\"loaderData\"];\n errors: RouterState[\"errors\"] | null;\n statusCode: number;\n loaderHeaders: Record;\n} {\n // Fill in loaderData/errors from our loaders\n let loaderData: RouterState[\"loaderData\"] = {};\n let errors: RouterState[\"errors\"] | null = null;\n let statusCode: number | undefined;\n let foundError = false;\n let loaderHeaders: Record = {};\n\n // Process loader results into state.loaderData/state.errors\n results.forEach((result, index) => {\n let id = matchesToLoad[index].route.id;\n invariant(\n !isRedirectResult(result),\n \"Cannot handle redirect results in processLoaderData\"\n );\n if (isErrorResult(result)) {\n // Look upwards from the matched route for the closest ancestor\n // error boundary, defaulting to the root match\n let boundaryMatch = findNearestBoundary(matches, id);\n let error = result.error;\n // If we have a pending action error, we report it at the highest-route\n // that throws a loader error, and then clear it out to indicate that\n // it was consumed\n if (pendingError) {\n error = Object.values(pendingError)[0];\n pendingError = undefined;\n }\n\n errors = errors || {};\n\n // Prefer higher error values if lower errors bubble to the same boundary\n if (errors[boundaryMatch.route.id] == null) {\n errors[boundaryMatch.route.id] = error;\n }\n\n // Clear our any prior loaderData for the throwing route\n loaderData[id] = undefined;\n\n // Once we find our first (highest) error, we set the status code and\n // prevent deeper status codes from overriding\n if (!foundError) {\n foundError = true;\n statusCode = isRouteErrorResponse(result.error)\n ? result.error.status\n : 500;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n if (isDeferredResult(result)) {\n activeDeferreds.set(id, result.deferredData);\n loaderData[id] = result.deferredData.data;\n } else {\n loaderData[id] = result.data;\n }\n\n // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n if (\n result.statusCode != null &&\n result.statusCode !== 200 &&\n !foundError\n ) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n }\n });\n\n // If we didn't consume the pending action error (i.e., all loaders\n // resolved), then consume it here. Also clear out any loaderData for the\n // throwing route\n if (pendingError) {\n errors = pendingError;\n loaderData[Object.keys(pendingError)[0]] = undefined;\n }\n\n return {\n loaderData,\n errors,\n statusCode: statusCode || 200,\n loaderHeaders,\n };\n}\n\nfunction processLoaderData(\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n results: DataResult[],\n pendingError: RouteData | undefined,\n revalidatingFetchers: RevalidatingFetcher[],\n fetcherResults: DataResult[],\n activeDeferreds: Map\n): {\n loaderData: RouterState[\"loaderData\"];\n errors?: RouterState[\"errors\"];\n} {\n let { loaderData, errors } = processRouteLoaderData(\n matches,\n matchesToLoad,\n results,\n pendingError,\n activeDeferreds\n );\n\n // Process results from our revalidating fetchers\n for (let index = 0; index < revalidatingFetchers.length; index++) {\n let { key, match, controller } = revalidatingFetchers[index];\n invariant(\n fetcherResults !== undefined && fetcherResults[index] !== undefined,\n \"Did not find corresponding fetcher result\"\n );\n let result = fetcherResults[index];\n\n // Process fetcher non-redirect errors\n if (controller && controller.signal.aborted) {\n // Nothing to do for aborted fetchers\n continue;\n } else if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, match?.route.id);\n if (!(errors && errors[boundaryMatch.route.id])) {\n errors = {\n ...errors,\n [boundaryMatch.route.id]: result.error,\n };\n }\n state.fetchers.delete(key);\n } else if (isRedirectResult(result)) {\n // Should never get here, redirects should get processed above, but we\n // keep this to type narrow to a success result in the else\n invariant(false, \"Unhandled fetcher revalidation redirect\");\n } else if (isDeferredResult(result)) {\n // Should never get here, deferred data should be awaited for fetchers\n // in resolveDeferredResults\n invariant(false, \"Unhandled fetcher deferred data\");\n } else {\n let doneFetcher = getDoneFetcher(result.data);\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n return { loaderData, errors };\n}\n\nfunction mergeLoaderData(\n loaderData: RouteData,\n newLoaderData: RouteData,\n matches: AgnosticDataRouteMatch[],\n errors: RouteData | null | undefined\n): RouteData {\n let mergedLoaderData = { ...newLoaderData };\n for (let match of matches) {\n let id = match.route.id;\n if (newLoaderData.hasOwnProperty(id)) {\n if (newLoaderData[id] !== undefined) {\n mergedLoaderData[id] = newLoaderData[id];\n } else {\n // No-op - this is so we ignore existing data if we have a key in the\n // incoming object with an undefined value, which is how we unset a prior\n // loaderData if we encounter a loader error\n }\n } else if (loaderData[id] !== undefined && match.route.loader) {\n // Preserve existing keys not included in newLoaderData and where a loader\n // wasn't removed by HMR\n mergedLoaderData[id] = loaderData[id];\n }\n\n if (errors && errors.hasOwnProperty(id)) {\n // Don't keep any loader data below the boundary\n break;\n }\n }\n return mergedLoaderData;\n}\n\n// Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\nfunction findNearestBoundary(\n matches: AgnosticDataRouteMatch[],\n routeId?: string\n): AgnosticDataRouteMatch {\n let eligibleMatches = routeId\n ? matches.slice(0, matches.findIndex((m) => m.route.id === routeId) + 1)\n : [...matches];\n return (\n eligibleMatches.reverse().find((m) => m.route.hasErrorBoundary === true) ||\n matches[0]\n );\n}\n\nfunction getShortCircuitMatches(routes: AgnosticDataRouteObject[]): {\n matches: AgnosticDataRouteMatch[];\n route: AgnosticDataRouteObject;\n} {\n // Prefer a root layout route if present, otherwise shim in a route object\n let route =\n routes.length === 1\n ? routes[0]\n : routes.find((r) => r.index || !r.path || r.path === \"/\") || {\n id: `__shim-error-route__`,\n };\n\n return {\n matches: [\n {\n params: {},\n pathname: \"\",\n pathnameBase: \"\",\n route,\n },\n ],\n route,\n };\n}\n\nfunction getInternalRouterError(\n status: number,\n {\n pathname,\n routeId,\n method,\n type,\n }: {\n pathname?: string;\n routeId?: string;\n method?: string;\n type?: \"defer-action\" | \"invalid-body\";\n } = {}\n) {\n let statusText = \"Unknown Server Error\";\n let errorMessage = \"Unknown @remix-run/router error\";\n\n if (status === 400) {\n statusText = \"Bad Request\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method} request to \"${pathname}\" but ` +\n `did not provide a \\`loader\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (type === \"defer-action\") {\n errorMessage = \"defer() is not supported in actions\";\n } else if (type === \"invalid-body\") {\n errorMessage = \"Unable to encode submission body\";\n }\n } else if (status === 403) {\n statusText = \"Forbidden\";\n errorMessage = `Route \"${routeId}\" does not match URL \"${pathname}\"`;\n } else if (status === 404) {\n statusText = \"Not Found\";\n errorMessage = `No route matches URL \"${pathname}\"`;\n } else if (status === 405) {\n statusText = \"Method Not Allowed\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method.toUpperCase()} request to \"${pathname}\" but ` +\n `did not provide an \\`action\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (method) {\n errorMessage = `Invalid request method \"${method.toUpperCase()}\"`;\n }\n }\n\n return new ErrorResponseImpl(\n status || 500,\n statusText,\n new Error(errorMessage),\n true\n );\n}\n\n// Find any returned redirect errors, starting from the lowest match\nfunction findRedirect(\n results: DataResult[]\n): { result: RedirectResult; idx: number } | undefined {\n for (let i = results.length - 1; i >= 0; i--) {\n let result = results[i];\n if (isRedirectResult(result)) {\n return { result, idx: i };\n }\n }\n}\n\nfunction stripHashFromPath(path: To) {\n let parsedPath = typeof path === \"string\" ? parsePath(path) : path;\n return createPath({ ...parsedPath, hash: \"\" });\n}\n\nfunction isHashChangeOnly(a: Location, b: Location): boolean {\n if (a.pathname !== b.pathname || a.search !== b.search) {\n return false;\n }\n\n if (a.hash === \"\") {\n // /page -> /page#hash\n return b.hash !== \"\";\n } else if (a.hash === b.hash) {\n // /page#hash -> /page#hash\n return true;\n } else if (b.hash !== \"\") {\n // /page#hash -> /page#other\n return true;\n }\n\n // If the hash is removed the browser will re-perform a request to the server\n // /page#hash -> /page\n return false;\n}\n\nfunction isDeferredResult(result: DataResult): result is DeferredResult {\n return result.type === ResultType.deferred;\n}\n\nfunction isErrorResult(result: DataResult): result is ErrorResult {\n return result.type === ResultType.error;\n}\n\nfunction isRedirectResult(result?: DataResult): result is RedirectResult {\n return (result && result.type) === ResultType.redirect;\n}\n\nexport function isDeferredData(value: any): value is DeferredData {\n let deferred: DeferredData = value;\n return (\n deferred &&\n typeof deferred === \"object\" &&\n typeof deferred.data === \"object\" &&\n typeof deferred.subscribe === \"function\" &&\n typeof deferred.cancel === \"function\" &&\n typeof deferred.resolveData === \"function\"\n );\n}\n\nfunction isResponse(value: any): value is Response {\n return (\n value != null &&\n typeof value.status === \"number\" &&\n typeof value.statusText === \"string\" &&\n typeof value.headers === \"object\" &&\n typeof value.body !== \"undefined\"\n );\n}\n\nfunction isRedirectResponse(result: any): result is Response {\n if (!isResponse(result)) {\n return false;\n }\n\n let status = result.status;\n let location = result.headers.get(\"Location\");\n return status >= 300 && status <= 399 && location != null;\n}\n\nfunction isQueryRouteResponse(obj: any): obj is QueryRouteResponse {\n return (\n obj &&\n isResponse(obj.response) &&\n (obj.type === ResultType.data || obj.type === ResultType.error)\n );\n}\n\nfunction isValidMethod(method: string): method is FormMethod | V7_FormMethod {\n return validRequestMethods.has(method.toLowerCase() as FormMethod);\n}\n\nfunction isMutationMethod(\n method: string\n): method is MutationFormMethod | V7_MutationFormMethod {\n return validMutationMethods.has(method.toLowerCase() as MutationFormMethod);\n}\n\nasync function resolveDeferredResults(\n currentMatches: AgnosticDataRouteMatch[],\n matchesToLoad: (AgnosticDataRouteMatch | null)[],\n results: DataResult[],\n signals: (AbortSignal | null)[],\n isFetcher: boolean,\n currentLoaderData?: RouteData\n) {\n for (let index = 0; index < results.length; index++) {\n let result = results[index];\n let match = matchesToLoad[index];\n // If we don't have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n if (!match) {\n continue;\n }\n\n let currentMatch = currentMatches.find(\n (m) => m.route.id === match!.route.id\n );\n let isRevalidatingLoader =\n currentMatch != null &&\n !isNewRouteInstance(currentMatch, match) &&\n (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n\n if (isDeferredResult(result) && (isFetcher || isRevalidatingLoader)) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they'll get aborted\n // there if needed\n let signal = signals[index];\n invariant(\n signal,\n \"Expected an AbortSignal for revalidating fetcher deferred result\"\n );\n await resolveDeferredData(result, signal, isFetcher).then((result) => {\n if (result) {\n results[index] = result || results[index];\n }\n });\n }\n }\n}\n\nasync function resolveDeferredData(\n result: DeferredResult,\n signal: AbortSignal,\n unwrap = false\n): Promise {\n let aborted = await result.deferredData.resolveData(signal);\n if (aborted) {\n return;\n }\n\n if (unwrap) {\n try {\n return {\n type: ResultType.data,\n data: result.deferredData.unwrappedData,\n };\n } catch (e) {\n // Handle any TrackedPromise._error values encountered while unwrapping\n return {\n type: ResultType.error,\n error: e,\n };\n }\n }\n\n return {\n type: ResultType.data,\n data: result.deferredData.data,\n };\n}\n\nfunction hasNakedIndexQuery(search: string): boolean {\n return new URLSearchParams(search).getAll(\"index\").some((v) => v === \"\");\n}\n\nfunction getTargetMatch(\n matches: AgnosticDataRouteMatch[],\n location: Location | string\n) {\n let search =\n typeof location === \"string\" ? parsePath(location).search : location.search;\n if (\n matches[matches.length - 1].route.index &&\n hasNakedIndexQuery(search || \"\")\n ) {\n // Return the leaf index route when index is present\n return matches[matches.length - 1];\n }\n // Otherwise grab the deepest \"path contributing\" match (ignoring index and\n // pathless layout routes)\n let pathMatches = getPathContributingMatches(matches);\n return pathMatches[pathMatches.length - 1];\n}\n\nfunction getSubmissionFromNavigation(\n navigation: Navigation\n): Submission | undefined {\n let { formMethod, formAction, formEncType, text, formData, json } =\n navigation;\n if (!formMethod || !formAction || !formEncType) {\n return;\n }\n\n if (text != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json: undefined,\n text,\n };\n } else if (formData != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData,\n json: undefined,\n text: undefined,\n };\n } else if (json !== undefined) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json,\n text: undefined,\n };\n }\n}\n\nfunction getLoadingNavigation(\n location: Location,\n submission?: Submission\n): NavigationStates[\"Loading\"] {\n if (submission) {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n } else {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n };\n return navigation;\n }\n}\n\nfunction getSubmittingNavigation(\n location: Location,\n submission: Submission\n): NavigationStates[\"Submitting\"] {\n let navigation: NavigationStates[\"Submitting\"] = {\n state: \"submitting\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n}\n\nfunction getLoadingFetcher(\n submission?: Submission,\n data?: Fetcher[\"data\"]\n): FetcherStates[\"Loading\"] {\n if (submission) {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data,\n };\n return fetcher;\n } else {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n };\n return fetcher;\n }\n}\n\nfunction getSubmittingFetcher(\n submission: Submission,\n existingFetcher?: Fetcher\n): FetcherStates[\"Submitting\"] {\n let fetcher: FetcherStates[\"Submitting\"] = {\n state: \"submitting\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data: existingFetcher ? existingFetcher.data : undefined,\n };\n return fetcher;\n}\n\nfunction getDoneFetcher(data: Fetcher[\"data\"]): FetcherStates[\"Idle\"] {\n let fetcher: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n };\n return fetcher;\n}\n\nfunction restoreAppliedTransitions(\n _window: Window,\n transitions: Map>\n) {\n try {\n let sessionPositions = _window.sessionStorage.getItem(\n TRANSITIONS_STORAGE_KEY\n );\n if (sessionPositions) {\n let json = JSON.parse(sessionPositions);\n for (let [k, v] of Object.entries(json || {})) {\n if (v && Array.isArray(v)) {\n transitions.set(k, new Set(v || []));\n }\n }\n }\n } catch (e) {\n // no-op, use default empty object\n }\n}\n\nfunction persistAppliedTransitions(\n _window: Window,\n transitions: Map>\n) {\n if (transitions.size > 0) {\n let json: Record = {};\n for (let [k, v] of transitions) {\n json[k] = [...v];\n }\n try {\n _window.sessionStorage.setItem(\n TRANSITIONS_STORAGE_KEY,\n JSON.stringify(json)\n );\n } catch (error) {\n warning(\n false,\n `Failed to save applied view transitions in sessionStorage (${error}).`\n );\n }\n }\n}\n\n//#endregion\n","import * as React from \"react\";\nimport type {\n AgnosticIndexRouteObject,\n AgnosticNonIndexRouteObject,\n AgnosticRouteMatch,\n History,\n LazyRouteFunction,\n Location,\n Action as NavigationType,\n RelativeRoutingType,\n Router,\n StaticHandlerContext,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\n\n// Create react-specific types from the agnostic types in @remix-run/router to\n// export from react-router\nexport interface IndexRouteObject {\n caseSensitive?: AgnosticIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticIndexRouteObject[\"path\"];\n id?: AgnosticIndexRouteObject[\"id\"];\n loader?: AgnosticIndexRouteObject[\"loader\"];\n action?: AgnosticIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticIndexRouteObject[\"handle\"];\n index: true;\n children?: undefined;\n element?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction;\n}\n\nexport interface NonIndexRouteObject {\n caseSensitive?: AgnosticNonIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticNonIndexRouteObject[\"path\"];\n id?: AgnosticNonIndexRouteObject[\"id\"];\n loader?: AgnosticNonIndexRouteObject[\"loader\"];\n action?: AgnosticNonIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticNonIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticNonIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticNonIndexRouteObject[\"handle\"];\n index?: false;\n children?: RouteObject[];\n element?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction;\n}\n\nexport type RouteObject = IndexRouteObject | NonIndexRouteObject;\n\nexport type DataRouteObject = RouteObject & {\n children?: DataRouteObject[];\n id: string;\n};\n\nexport interface RouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends RouteObject = RouteObject\n> extends AgnosticRouteMatch {}\n\nexport interface DataRouteMatch extends RouteMatch {}\n\nexport interface DataRouterContextObject extends NavigationContextObject {\n router: Router;\n staticContext?: StaticHandlerContext;\n}\n\nexport const DataRouterContext =\n React.createContext(null);\nif (__DEV__) {\n DataRouterContext.displayName = \"DataRouter\";\n}\n\nexport const DataRouterStateContext = React.createContext<\n Router[\"state\"] | null\n>(null);\nif (__DEV__) {\n DataRouterStateContext.displayName = \"DataRouterState\";\n}\n\nexport const AwaitContext = React.createContext(null);\nif (__DEV__) {\n AwaitContext.displayName = \"Await\";\n}\n\nexport interface NavigateOptions {\n replace?: boolean;\n state?: any;\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n unstable_flushSync?: boolean;\n unstable_viewTransition?: boolean;\n}\n\n/**\n * A Navigator is a \"location changer\"; it's how you get to different locations.\n *\n * Every history instance conforms to the Navigator interface, but the\n * distinction is useful primarily when it comes to the low-level `` API\n * where both the location and a navigator must be provided separately in order\n * to avoid \"tearing\" that may occur in a suspense-enabled app if the action\n * and/or location were to be read directly from the history instance.\n */\nexport interface Navigator {\n createHref: History[\"createHref\"];\n // Optional for backwards-compat with Router/HistoryRouter usage (edge case)\n encodeLocation?: History[\"encodeLocation\"];\n go: History[\"go\"];\n push(to: To, state?: any, opts?: NavigateOptions): void;\n replace(to: To, state?: any, opts?: NavigateOptions): void;\n}\n\ninterface NavigationContextObject {\n basename: string;\n navigator: Navigator;\n static: boolean;\n}\n\nexport const NavigationContext = React.createContext(\n null!\n);\n\nif (__DEV__) {\n NavigationContext.displayName = \"Navigation\";\n}\n\ninterface LocationContextObject {\n location: Location;\n navigationType: NavigationType;\n}\n\nexport const LocationContext = React.createContext(\n null!\n);\n\nif (__DEV__) {\n LocationContext.displayName = \"Location\";\n}\n\nexport interface RouteContextObject {\n outlet: React.ReactElement | null;\n matches: RouteMatch[];\n isDataRoute: boolean;\n}\n\nexport const RouteContext = React.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false,\n});\n\nif (__DEV__) {\n RouteContext.displayName = \"Route\";\n}\n\nexport const RouteErrorContext = React.createContext(null);\n\nif (__DEV__) {\n RouteErrorContext.displayName = \"RouteError\";\n}\n","import * as React from \"react\";\nimport type {\n Blocker,\n BlockerFunction,\n Location,\n ParamParseKey,\n Params,\n Path,\n PathMatch,\n PathPattern,\n RelativeRoutingType,\n Router as RemixRouter,\n RevalidationState,\n To,\n UIMatch,\n} from \"@remix-run/router\";\nimport {\n IDLE_BLOCKER,\n Action as NavigationType,\n UNSAFE_convertRouteMatchToUiMatch as convertRouteMatchToUiMatch,\n UNSAFE_getPathContributingMatches as getPathContributingMatches,\n UNSAFE_invariant as invariant,\n isRouteErrorResponse,\n joinPaths,\n matchPath,\n matchRoutes,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\n\nimport type {\n DataRouteMatch,\n NavigateOptions,\n RouteContextObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n RouteErrorContext,\n} from \"./context\";\n\n/**\n * Returns the full href for the given \"to\" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/hooks/use-href\n */\nexport function useHref(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useHref() may be used only in the context of a component.`\n );\n\n let { basename, navigator } = React.useContext(NavigationContext);\n let { hash, pathname, search } = useResolvedPath(to, { relative });\n\n let joinedPathname = pathname;\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to creating the href. If this is a root navigation, then just use the raw\n // basename which allows the basename to have full control over the presence\n // of a trailing slash on root links\n if (basename !== \"/\") {\n joinedPathname =\n pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n\n return navigator.createHref({ pathname: joinedPathname, search, hash });\n}\n\n/**\n * Returns true if this component is a descendant of a ``.\n *\n * @see https://reactrouter.com/hooks/use-in-router-context\n */\nexport function useInRouterContext(): boolean {\n return React.useContext(LocationContext) != null;\n}\n\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you're using this it may mean you're doing some of your own\n * \"routing\" in your app, and we'd like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/hooks/use-location\n */\nexport function useLocation(): Location {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useLocation() may be used only in the context of a component.`\n );\n\n return React.useContext(LocationContext).location;\n}\n\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/hooks/use-navigation-type\n */\nexport function useNavigationType(): NavigationType {\n return React.useContext(LocationContext).navigationType;\n}\n\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know \"active\" state, e.g.\n * ``.\n *\n * @see https://reactrouter.com/hooks/use-match\n */\nexport function useMatch<\n ParamKey extends ParamParseKey,\n Path extends string\n>(pattern: PathPattern | Path): PathMatch | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useMatch() may be used only in the context of a component.`\n );\n\n let { pathname } = useLocation();\n return React.useMemo(\n () => matchPath(pattern, pathname),\n [pathname, pattern]\n );\n}\n\n/**\n * The interface for the navigate() function returned from useNavigate().\n */\nexport interface NavigateFunction {\n (to: To, options?: NavigateOptions): void;\n (delta: number): void;\n}\n\nconst navigateEffectWarning =\n `You should call navigate() in a React.useEffect(), not when ` +\n `your component is first rendered.`;\n\n// Mute warnings for calls to useNavigate in SSR environments\nfunction useIsomorphicLayoutEffect(\n cb: Parameters[0]\n) {\n let isStatic = React.useContext(NavigationContext).static;\n if (!isStatic) {\n // We should be able to get rid of this once react 18.3 is released\n // See: https://github.com/facebook/react/pull/26395\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(cb);\n }\n}\n\n/**\n * Returns an imperative method for changing the location. Used by ``s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/hooks/use-navigate\n */\nexport function useNavigate(): NavigateFunction {\n let { isDataRoute } = React.useContext(RouteContext);\n // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\n\nfunction useNavigateUnstable(): NavigateFunction {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useNavigate() may be used only in the context of a component.`\n );\n\n let dataRouterContext = React.useContext(DataRouterContext);\n let { basename, navigator } = React.useContext(NavigationContext);\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n\n let routePathnamesJson = JSON.stringify(\n getPathContributingMatches(matches).map((match) => match.pathnameBase)\n );\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our history listener yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n\n let path = resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n options.relative === \"path\"\n );\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to handing off to history (but only if we're not in a data router,\n // otherwise it'll prepend the basename inside of the router).\n // If this is a root navigation, then we navigate to the raw basename\n // which allows the basename to have full control over the presence of a\n // trailing slash on root links\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\"\n ? basename\n : joinPaths([basename, path.pathname]);\n }\n\n (!!options.replace ? navigator.replace : navigator.push)(\n path,\n options.state,\n options\n );\n },\n [\n basename,\n navigator,\n routePathnamesJson,\n locationPathname,\n dataRouterContext,\n ]\n );\n\n return navigate;\n}\n\nconst OutletContext = React.createContext(null);\n\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/hooks/use-outlet-context\n */\nexport function useOutletContext(): Context {\n return React.useContext(OutletContext) as Context;\n}\n\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by `` to render child routes.\n *\n * @see https://reactrouter.com/hooks/use-outlet\n */\nexport function useOutlet(context?: unknown): React.ReactElement | null {\n let outlet = React.useContext(RouteContext).outlet;\n if (outlet) {\n return (\n {outlet}\n );\n }\n return outlet;\n}\n\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/hooks/use-params\n */\nexport function useParams<\n ParamsOrKey extends string | Record = string\n>(): Readonly<\n [ParamsOrKey] extends [string] ? Params : Partial\n> {\n let { matches } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? (routeMatch.params as any) : {};\n}\n\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/hooks/use-resolved-path\n */\nexport function useResolvedPath(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): Path {\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n\n // Use the full pathname for the leaf match so we include splat values\n // for \".\" links\n let routePathnamesJson = JSON.stringify(\n getPathContributingMatches(matches).map((match, idx) =>\n idx === matches.length - 1 ? match.pathname : match.pathnameBase\n )\n );\n\n return React.useMemo(\n () =>\n resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n relative === \"path\"\n ),\n [to, routePathnamesJson, locationPathname, relative]\n );\n}\n\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an `` to render their child route's\n * element.\n *\n * @see https://reactrouter.com/hooks/use-routes\n */\nexport function useRoutes(\n routes: RouteObject[],\n locationArg?: Partial | string\n): React.ReactElement | null {\n return useRoutesImpl(routes, locationArg);\n}\n\n// Internal implementation with accept optional param for RouterProvider usage\nexport function useRoutesImpl(\n routes: RouteObject[],\n locationArg?: Partial | string,\n dataRouterState?: RemixRouter[\"state\"]\n): React.ReactElement | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useRoutes() may be used only in the context of a component.`\n );\n\n let { navigator } = React.useContext(NavigationContext);\n let { matches: parentMatches } = React.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n let parentRoute = routeMatch && routeMatch.route;\n\n if (__DEV__) {\n // You won't get a warning about 2 different under a \n // without a trailing *, but this is a best-effort warning anyway since we\n // cannot even give the warning unless they land at the parent route.\n //\n // Example:\n //\n // \n // {/* This route path MUST end with /* because otherwise\n // it will never match /blog/post/123 */}\n // } />\n // } />\n // \n //\n // function Blog() {\n // return (\n // \n // } />\n // \n // );\n // }\n let parentPath = (parentRoute && parentRoute.path) || \"\";\n warningOnce(\n parentPathname,\n !parentRoute || parentPath.endsWith(\"*\"),\n `You rendered descendant (or called \\`useRoutes()\\`) at ` +\n `\"${parentPathname}\" (under ) but the ` +\n `parent route path has no trailing \"*\". This means if you navigate ` +\n `deeper, the parent won't match anymore and therefore the child ` +\n `routes will never render.\\n\\n` +\n `Please change the parent to .`\n );\n }\n\n let locationFromContext = useLocation();\n\n let location;\n if (locationArg) {\n let parsedLocationArg =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n invariant(\n parentPathnameBase === \"/\" ||\n parsedLocationArg.pathname?.startsWith(parentPathnameBase),\n `When overriding the location using \\`\\` or \\`useRoutes(routes, location)\\`, ` +\n `the location pathname must begin with the portion of the URL pathname that was ` +\n `matched by all parent routes. The current pathname base is \"${parentPathnameBase}\" ` +\n `but pathname \"${parsedLocationArg.pathname}\" was given in the \\`location\\` prop.`\n );\n\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n\n let pathname = location.pathname || \"/\";\n let remainingPathname =\n parentPathnameBase === \"/\"\n ? pathname\n : pathname.slice(parentPathnameBase.length) || \"/\";\n\n let matches = matchRoutes(routes, { pathname: remainingPathname });\n\n if (__DEV__) {\n warning(\n parentRoute || matches != null,\n `No routes matched location \"${location.pathname}${location.search}${location.hash}\" `\n );\n\n warning(\n matches == null ||\n matches[matches.length - 1].route.element !== undefined ||\n matches[matches.length - 1].route.Component !== undefined,\n `Matched leaf route at location \"${location.pathname}${location.search}${location.hash}\" ` +\n `does not have an element or Component. This means it will render an with a ` +\n `null value by default resulting in an \"empty\" page.`\n );\n }\n\n let renderedMatches = _renderMatches(\n matches &&\n matches.map((match) =>\n Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathname).pathname\n : match.pathname,\n ]),\n pathnameBase:\n match.pathnameBase === \"/\"\n ? parentPathnameBase\n : joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathnameBase).pathname\n : match.pathnameBase,\n ]),\n })\n ),\n parentMatches,\n dataRouterState\n );\n\n // When a user passes in a `locationArg`, the associated routes need to\n // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n // to use the scoped location instead of the global location.\n if (locationArg && renderedMatches) {\n return (\n \n {renderedMatches}\n \n );\n }\n\n return renderedMatches;\n}\n\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error)\n ? `${error.status} ${error.statusText}`\n : error instanceof Error\n ? error.message\n : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = { padding: \"0.5rem\", backgroundColor: lightgrey };\n let codeStyles = { padding: \"2px 4px\", backgroundColor: lightgrey };\n\n let devInfo = null;\n if (__DEV__) {\n console.error(\n \"Error handled by React Router default ErrorBoundary:\",\n error\n );\n\n devInfo = (\n <>\n

💿 Hey developer 👋

\n

\n You can provide a way better UX than this when your app throws errors\n by providing your own ErrorBoundary or{\" \"}\n errorElement prop on your route.\n

\n \n );\n }\n\n return (\n <>\n

Unexpected Application Error!

\n

{message}

\n {stack ?
{stack}
: null}\n {devInfo}\n \n );\n}\n\nconst defaultErrorElement = ;\n\ntype RenderErrorBoundaryProps = React.PropsWithChildren<{\n location: Location;\n revalidation: RevalidationState;\n error: any;\n component: React.ReactNode;\n routeContext: RouteContextObject;\n}>;\n\ntype RenderErrorBoundaryState = {\n location: Location;\n revalidation: RevalidationState;\n error: any;\n};\n\nexport class RenderErrorBoundary extends React.Component<\n RenderErrorBoundaryProps,\n RenderErrorBoundaryState\n> {\n constructor(props: RenderErrorBoundaryProps) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error,\n };\n }\n\n static getDerivedStateFromError(error: any) {\n return { error: error };\n }\n\n static getDerivedStateFromProps(\n props: RenderErrorBoundaryProps,\n state: RenderErrorBoundaryState\n ) {\n // When we get into an error state, the user will likely click \"back\" to the\n // previous page that didn't have an error. Because this wraps the entire\n // application, that will have no effect--the error page continues to display.\n // This gives us a mechanism to recover from the error when the location changes.\n //\n // Whether we're in an error state or not, we update the location in state\n // so that when we are in an error state, it gets reset when a new location\n // comes in and the user recovers from the error.\n if (\n state.location !== props.location ||\n (state.revalidation !== \"idle\" && props.revalidation === \"idle\")\n ) {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation,\n };\n }\n\n // If we're not changing locations, preserve the location but still surface\n // any new errors that may come through. We retain the existing error, we do\n // this because the error provided from the app state may be cleared without\n // the location changing.\n return {\n error: props.error || state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation,\n };\n }\n\n componentDidCatch(error: any, errorInfo: any) {\n console.error(\n \"React Router caught the following error during render\",\n error,\n errorInfo\n );\n }\n\n render() {\n return this.state.error ? (\n \n \n \n ) : (\n this.props.children\n );\n }\n}\n\ninterface RenderedRouteProps {\n routeContext: RouteContextObject;\n match: RouteMatch;\n children: React.ReactNode | null;\n}\n\nfunction RenderedRoute({ routeContext, match, children }: RenderedRouteProps) {\n let dataRouterContext = React.useContext(DataRouterContext);\n\n // Track how deep we got in our render pass to emulate SSR componentDidCatch\n // in a DataStaticRouter\n if (\n dataRouterContext &&\n dataRouterContext.static &&\n dataRouterContext.staticContext &&\n (match.route.errorElement || match.route.ErrorBoundary)\n ) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n\n return (\n \n {children}\n \n );\n}\n\nexport function _renderMatches(\n matches: RouteMatch[] | null,\n parentMatches: RouteMatch[] = [],\n dataRouterState: RemixRouter[\"state\"] | null = null\n): React.ReactElement | null {\n if (matches == null) {\n if (dataRouterState?.errors) {\n // Don't bail if we have data router errors so we can render them in the\n // boundary. Use the pre-matched (or shimmed) matches\n matches = dataRouterState.matches as DataRouteMatch[];\n } else {\n return null;\n }\n }\n\n let renderedMatches = matches;\n\n // If we have data errors, trim matches to the highest error boundary\n let errors = dataRouterState?.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex(\n (m) => m.route.id && errors?.[m.route.id]\n );\n invariant(\n errorIndex >= 0,\n `Could not find a matching route for errors on route IDs: ${Object.keys(\n errors\n ).join(\",\")}`\n );\n renderedMatches = renderedMatches.slice(\n 0,\n Math.min(renderedMatches.length, errorIndex + 1)\n );\n }\n\n return renderedMatches.reduceRight((outlet, match, index) => {\n let error = match.route.id ? errors?.[match.route.id] : null;\n // Only data routers handle errors\n let errorElement: React.ReactNode | null = null;\n if (dataRouterState) {\n errorElement = match.route.errorElement || defaultErrorElement;\n }\n let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children: React.ReactNode;\n if (error) {\n children = errorElement;\n } else if (match.route.Component) {\n // Note: This is a de-optimized path since React won't re-use the\n // ReactElement since it's identity changes with each new\n // React.createElement call. We keep this so folks can use\n // `` in `` but generally `Component`\n // usage is only advised in `RouterProvider` when we can convert it to\n // `element` ahead of time.\n children = ;\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return (\n \n );\n };\n // Only wrap in an error boundary within data router usages when we have an\n // ErrorBoundary/errorElement on this route. Otherwise let it bubble up to\n // an ancestor ErrorBoundary/errorElement\n return dataRouterState &&\n (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? (\n \n ) : (\n getChildren()\n );\n }, null as React.ReactElement | null);\n}\n\nenum DataRouterHook {\n UseBlocker = \"useBlocker\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n}\n\nenum DataRouterStateHook {\n UseBlocker = \"useBlocker\",\n UseLoaderData = \"useLoaderData\",\n UseActionData = \"useActionData\",\n UseRouteError = \"useRouteError\",\n UseNavigation = \"useNavigation\",\n UseRouteLoaderData = \"useRouteLoaderData\",\n UseMatches = \"useMatches\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n UseRouteId = \"useRouteId\",\n}\n\nfunction getDataRouterConsoleError(\n hookName: DataRouterHook | DataRouterStateHook\n) {\n return `${hookName} must be used within a data router. See https://reactrouter.com/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n let ctx = React.useContext(DataRouterContext);\n invariant(ctx, getDataRouterConsoleError(hookName));\n return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n let state = React.useContext(DataRouterStateContext);\n invariant(state, getDataRouterConsoleError(hookName));\n return state;\n}\n\nfunction useRouteContext(hookName: DataRouterStateHook) {\n let route = React.useContext(RouteContext);\n invariant(route, getDataRouterConsoleError(hookName));\n return route;\n}\n\n// Internal version with hookName-aware debugging\nfunction useCurrentRouteId(hookName: DataRouterStateHook) {\n let route = useRouteContext(hookName);\n let thisRoute = route.matches[route.matches.length - 1];\n invariant(\n thisRoute.route.id,\n `${hookName} can only be used on routes that contain a unique \"id\"`\n );\n return thisRoute.route.id;\n}\n\n/**\n * Returns the ID for the nearest contextual route\n */\nexport function useRouteId() {\n return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n\n/**\n * Returns the current navigation, defaulting to an \"idle\" navigation when\n * no navigation is in progress\n */\nexport function useNavigation() {\n let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n return state.navigation;\n}\n\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */\nexport function useRevalidator() {\n let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n return React.useMemo(\n () => ({\n revalidate: dataRouterContext.router.revalidate,\n state: state.revalidation,\n }),\n [dataRouterContext.router.revalidate, state.revalidation]\n );\n}\n\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route \"handle\" property\n */\nexport function useMatches(): UIMatch[] {\n let { matches, loaderData } = useDataRouterState(\n DataRouterStateHook.UseMatches\n );\n return React.useMemo(\n () => matches.map((m) => convertRouteMatchToUiMatch(m, loaderData)),\n [matches, loaderData]\n );\n}\n\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */\nexport function useLoaderData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n\n if (state.errors && state.errors[routeId] != null) {\n console.error(\n `You cannot \\`useLoaderData\\` in an errorElement (routeId: ${routeId})`\n );\n return undefined;\n }\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the loaderData for the given routeId\n */\nexport function useRouteLoaderData(routeId: string): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the action data for the nearest ancestor Route action\n */\nexport function useActionData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseActionData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n return state.actionData ? state.actionData[routeId] : undefined;\n}\n\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error. This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */\nexport function useRouteError(): unknown {\n let error = React.useContext(RouteErrorContext);\n let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);\n\n // If this was a render error, we put it in a RouteError context inside\n // of RenderErrorBoundary\n if (error) {\n return error;\n }\n\n // Otherwise look for errors from our data router state\n return state.errors?.[routeId];\n}\n\n/**\n * Returns the happy-path data from the nearest ancestor `` value\n */\nexport function useAsyncValue(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._data;\n}\n\n/**\n * Returns the error from the nearest ancestor `` value\n */\nexport function useAsyncError(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._error;\n}\n\nlet blockerId = 0;\n\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation. Mostly used to avoid\n * using half-filled form data. This does not handle hard-reloads or\n * cross-origin navigations.\n */\nexport function useBlocker(shouldBlock: boolean | BlockerFunction): Blocker {\n let { router, basename } = useDataRouterContext(DataRouterHook.UseBlocker);\n let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n\n let [blockerKey, setBlockerKey] = React.useState(\"\");\n let blockerFunction = React.useCallback(\n (arg) => {\n if (typeof shouldBlock !== \"function\") {\n return !!shouldBlock;\n }\n if (basename === \"/\") {\n return shouldBlock(arg);\n }\n\n // If they provided us a function and we've got an active basename, strip\n // it from the locations we expose to the user to match the behavior of\n // useLocation\n let { currentLocation, nextLocation, historyAction } = arg;\n return shouldBlock({\n currentLocation: {\n ...currentLocation,\n pathname:\n stripBasename(currentLocation.pathname, basename) ||\n currentLocation.pathname,\n },\n nextLocation: {\n ...nextLocation,\n pathname:\n stripBasename(nextLocation.pathname, basename) ||\n nextLocation.pathname,\n },\n historyAction,\n });\n },\n [basename, shouldBlock]\n );\n\n // This effect is in charge of blocker key assignment and deletion (which is\n // tightly coupled to the key)\n React.useEffect(() => {\n let key = String(++blockerId);\n setBlockerKey(key);\n return () => router.deleteBlocker(key);\n }, [router]);\n\n // This effect handles assigning the blockerFunction. This is to handle\n // unstable blocker function identities, and happens only after the prior\n // effect so we don't get an orphaned blockerFunction in the router with a\n // key of \"\". Until then we just have the IDLE_BLOCKER.\n React.useEffect(() => {\n if (blockerKey !== \"\") {\n router.getBlocker(blockerKey, blockerFunction);\n }\n }, [router, blockerKey, blockerFunction]);\n\n // Prefer the blocker from `state` not `router.state` since DataRouterContext\n // is memoized so this ensures we update on blocker state updates\n return blockerKey && state.blockers.has(blockerKey)\n ? state.blockers.get(blockerKey)!\n : IDLE_BLOCKER;\n}\n\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */\nfunction useNavigateStable(): NavigateFunction {\n let { router } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our router subscriber yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, { fromRouteId: id, ...options });\n }\n },\n [router, id]\n );\n\n return navigate;\n}\n\nconst alreadyWarned: Record = {};\n\nfunction warningOnce(key: string, cond: boolean, message: string) {\n if (!cond && !alreadyWarned[key]) {\n alreadyWarned[key] = true;\n warning(false, message);\n }\n}\n","import type {\n InitialEntry,\n LazyRouteFunction,\n Location,\n MemoryHistory,\n RelativeRoutingType,\n Router as RemixRouter,\n RouterState,\n RouterSubscriber,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\nimport {\n AbortedDeferredError,\n Action as NavigationType,\n createMemoryHistory,\n UNSAFE_getPathContributingMatches as getPathContributingMatches,\n UNSAFE_invariant as invariant,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\nimport * as React from \"react\";\n\nimport type {\n DataRouteObject,\n IndexRouteObject,\n Navigator,\n NonIndexRouteObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n} from \"./context\";\nimport {\n _renderMatches,\n useAsyncValue,\n useInRouterContext,\n useLocation,\n useNavigate,\n useOutlet,\n useRoutes,\n useRoutesImpl,\n} from \"./hooks\";\n\nexport interface FutureConfig {\n v7_startTransition: boolean;\n}\n\nexport interface RouterProviderProps {\n fallbackElement?: React.ReactNode;\n router: RemixRouter;\n future?: Partial;\n}\n\n/**\n Webpack + React 17 fails to compile on any of the following because webpack\n complains that `startTransition` doesn't exist in `React`:\n * import { startTransition } from \"react\"\n * import * as React from from \"react\";\n \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n * import * as React from from \"react\";\n \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n Moving it to a constant such as the following solves the Webpack/React 17 issue:\n * import * as React from from \"react\";\n const START_TRANSITION = \"startTransition\";\n START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n However, that introduces webpack/terser minification issues in production builds\n in React 18 where minification/obfuscation ends up removing the call of\n React.startTransition entirely from the first half of the ternary. Grabbing\n this exported reference once up front resolves that issue.\n\n See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = React[START_TRANSITION];\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nexport function RouterProvider({\n fallbackElement,\n router,\n future,\n}: RouterProviderProps): React.ReactElement {\n let [state, setStateImpl] = React.useState(router.state);\n let { v7_startTransition } = future || {};\n\n let setState = React.useCallback(\n (newState: RouterState) => {\n if (v7_startTransition && startTransitionImpl) {\n startTransitionImpl(() => setStateImpl(newState));\n } else {\n setStateImpl(newState);\n }\n },\n [setStateImpl, v7_startTransition]\n );\n\n // Need to use a layout effect here so we are subscribed early enough to\n // pick up on any render-driven redirects/navigations (useEffect/)\n React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n\n let navigator = React.useMemo((): Navigator => {\n return {\n createHref: router.createHref,\n encodeLocation: router.encodeLocation,\n go: (n) => router.navigate(n),\n push: (to, state, opts) =>\n router.navigate(to, {\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n replace: (to, state, opts) =>\n router.navigate(to, {\n replace: true,\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n };\n }, [router]);\n\n let basename = router.basename || \"/\";\n\n let dataRouterContext = React.useMemo(\n () => ({\n router,\n navigator,\n static: false,\n basename,\n }),\n [router, navigator, basename]\n );\n\n // The fragment and {null} here are important! We need them to keep React 18's\n // useId happy when we are server-rendering since we may have a