diff --git a/assets/games.json b/assets/games.json new file mode 100644 index 0000000..632f476 --- /dev/null +++ b/assets/games.json @@ -0,0 +1,1462 @@ +[ + { + "name": "1", + "url": "./files/1/index.html", + "img": "./files/1/meta/apple-touch-icon.png" + }, + { + "name": "1v1.lol", + "url": "./files/1v1lol/index.html", + "img": "./files/1v1lol/splash.png" + }, + { + "name": "1v1.space", + "url": "./files/1v1space/index.html", + "img": "./files/1v1space/splash.png" + }, + { + "name": "10 Minutes till dawn", + "url": "./files/10-minutes-till-dawn/index.html", + "img": "./files/10-minutes-till-dawn/splash.png" + }, + { + "name": "100 Player Pong", + "url": "./files/100ng/index.html", + "img": "./files/100ng/100ng.jpg" + }, + { + "name": "2048", + "url": "./files/2048/index.html", + "img": "./files/2048/thumb.png" + }, + { + "name": "2048 Multitask", + "url": "./files/2048-multitask/index.html", + "img": "./files/2048-multitask/splash.png" + }, + { + "name": "9007199254740992", + "url": "./files/9007199254740992/index.html", + "img": "./files/9007199254740992/logo-4.png" + }, + { + "name": "A Dance of Fire and Ice", + "url": "./files/a-dance-of-fire-and-ice/index.html", + "img": "./files/a-dance-of-fire-and-ice/splash.png" + }, + { + "name": "Achievement Unlocked", + "url": "./files/achievementunlocked/index.html", + "img": "./files/achievementunlocked/achievementunlocked.png" + }, + { + "name": "A Dark Room", + "url": "./files/adarkroom/index.html", + "img": "./files/adarkroom/splash.png" + }, + { + "name": "Adrenaline Challenge", + "url": "./files/adrenalinechallenge/index.html", + "img": "./files/adrenalinechallenge/adrenalinechallenge.jpg" + }, + { + "name": "Adventure Drivers", + "url": "./files/adventure-drivers/index.html", + "img": "./files/adventure-drivers/splash.png" + }, + { + "name": "Age of Conflict", + "url": "./files/ages-of-conflict/index.html", + "img": "./files/ages-of-conflict/splash.jpg" + }, + { + "name": "Alien Hominid", + "url": "./files/alienhominid/index.html", + "img": "./files/alienhominid/alienhominid.jpg" + }, + { + "name": "Amidst the Clouds", + "url": "./files/amidst-the-clouds/index.html", + "img": "./files/amidst-the-clouds/splash.png" + }, + { + "name": "Among Us", + "url": "./files/among-us/index.html", + "img": "./files/among-us/red.png" + }, + { + "name": "Angry Sharks", + "url": "./files/angry-sharks/index.html", + "img": "./files/angry-sharks/assets/favicon/icon-512x512.png" + }, + { + "name": "Aquapark slides", + "url": "./files/aquapark-slides/index.html", + "img": "./files/aquapark-slides/splash.png" + }, + { + "name": "Astray", + "url": "./files/astray/index.html", + "img": "./files/astray/splash.png" + }, + { + "name": "Avalanche", + "url": "./files/avalanche/index.html", + "img": "./files/avalanche/avalanche.png" + }, + { + "name": "Awesome Tanks 2", + "url": "./files/awesometanks2/index.html", + "img": "./files/awesometanks2/awesometanks2.jpg" + }, + { + "name": "Backrooms", + "url": "./files/backrooms/index.html", + "img": "./files/backrooms/img/splash.jpg" + }, + { + "name": "Bad Ice Cream", + "url": "./files/bad-ice-cream/index.html", + "img": "./files/bad-ice-cream/bad-ice-cream.png" + }, + { + "name": "Bad Ice Cream 2", + "url": "./files/bad-ice-cream-2/index.html", + "img": "./files/bad-ice-cream-2/bad-ice-cream-2.png" + }, + { + "name": "Bad Ice Cream 3", + "url": "./files/bad-ice-cream-3/index.html", + "img": "./files/bad-ice-cream-3/bad-ice-cream-3.png" + }, + { + "name": "Baldi's Basics", + "url": "./files/baldis-basics/index.html", + "img": "./files/baldis-basics/splash.png" + }, + { + "name": "Ballistic Chickens", + "url": "./files/ballistic-chickens/index.html", + "img": "./files/ballistic-chickens/logo.png" + }, + { + "name": "Basket Random", + "url": "./files/basket-random/index.html", + "img": "./files/basket-random/splash.jpeg" + }, + { + "name": "Basketball Stars", + "url": "./files/basketball-stars/index.html", + "img": "./files/basketball-stars/assets/images/basketball-stars.png" + }, + { + "name": "Basketbros.io", + "url": "./files/basketbros-io/index.html", + "img": "./files/basketbros-io/thumb.jpg" + }, + { + "name": "Battle for Gondor", + "url": "./files/battleforgondor/index.html", + "img": "./files/battleforgondor/battleforgondor.JPG" + }, + { + "name": "Big Red Button", + "url": "./files/bigredbutton/index.html", + "img": "./files/bigredbutton/bigredbutton.png" + }, + { + "name": "Bitlife", + "url": "./files/bitlife/index.html", + "img": "./files/bitlife/logo.png" + }, + { + "name": "Black Hole Square", + "url": "./files/blacholesquare/index.html", + "img": "./files/blacholesquare/icon.png" + }, + { + "name": "Black Knight", + "url": "./files/blackknight/index.html", + "img": "./files/blackknight/blackknight.png" + }, + { + "name": "Bloons TD", + "url": "./files/bloonstd/index.html", + "img": "./files/bloonstd/bloonstd.jpg" + }, + { + "name": "Bloons TD 2", + "url": "./files/bloonstd2/index.html", + "img": "./files/bloonstd2/bloonstd2.png" + }, + { + "name": "Bloxors", + "url": "./files/bloxors/index.html", + "img": "./files/bloxors/block.png" + }, + { + "name": "Bob the Robber 2", + "url": "./files/bobtherobber2/index.html", + "img": "./files/bobtherobber2/splash.jpeg" + }, + { + "name": "Box Head", + "url": "./files/boxhead2play/index.html", + "img": "./files/boxhead2play/boxhead2play.jpg" + }, + { + "name": "Boxing Random", + "url": "./files/boxing-random/index.html", + "img": "./files/boxing-random/512x512.jpg" + }, + { + "name": "Breaking the Bank", + "url": "./files/breakingthebank/index.html", + "img": "./files/breakingthebank/breakingthebank.png" + }, + { + "name": "Big Tower Tiny Square", + "url": "./files/btts/index.html", + "img": "./files/btts/images.png" + }, + { + "name": "Big NEON Tower Tiny Square", + "url": "./files/bntts/index.html", + "img": "./files/bntts/icons/icon-256.png" + }, + { + "name": "Burger and Frights", + "url": "./files/burger-and-frights/index.html", + "img": "./files/burger-and-frights/splash.png" + }, + { + "name": "Cannon Basketball 4", + "url": "./files/cannon-basketball-4/index.html", + "img": "./files/cannon-basketball-4/img/splash.png" + }, + { + "name": "Canyon Defense", + "url": "./files/canyondefense/index.html", + "img": "./files/canyondefense/canyondefense.png" + }, + { + "name": "Cars Simulator", + "url": "./files/cars-simulator/index.html", + "img": "./files/cars-simulator/splash.png" + }, + { + "name": "Cell Machine", + "url": "./files/cell-machine/index.html", + "img": "./files/cell-machine/img/te9nDu.png" + }, + { + "name": "Champion Island", + "url": "./files/champion-island/index.html", + "img": "./files/champion-island/splash.png" + }, + { + "name": "Champion Archer", + "url": "./files/championarcher/index.html", + "img": "./files/championarcher/championarcher.png" + }, + { + "name": "Chill Radio", + "url": "./files/chill-radio/index.html", + "img": "./files/chill-radio/img/icon.png" + }, + { + "name": "Chrome Dino", + "url": "./files/chrome-dino/index.html", + "img": "./files/chrome-dino/icons/icon-256.png" + }, + { + "name": "circlO", + "url": "./files/circlo/index.html", + "img": "./files/circlo/img/download.png" + }, + { + "name": "Cluster Rush", + "url": "./files/cluster-rush/index.html", + "img": "./files/cluster-rush/splash.png" + }, + { + "name": "Table Tennis Ultimate", + "url": "./files/cnpingpong/index.html", + "img": "./files/cnpingpong/tabletennisultimate.png" + }, + { + "name": "Connect 3", + "url": "./files/connect3/index.html", + "img": "./files/connect3/connect3.png" + }, + { + "name": "Cookie Clicker", + "url": "./files/cookie-clicker/index.html", + "img": "./files/cookie-clicker/cookie1.jpeg" + }, + { + "name": "Core Ball", + "url": "./files/core-ball/index.html", + "img": "./files/core-ball/pr_source.png" + }, + { + "name": "CraftMine", + "url": "./files/craftmine/index.html", + "img": "./files/craftmine/images/craftmine.png" + }, + { + "name": "Creative Kill Chamber", + "url": "./files/creativekillchamber/index.html", + "img": "./files/creativekillchamber/creativekillchamber.jpg" + }, + { + "name": "Crossy Road", + "url": "./files/crossyroad/index.html", + "img": "./files/crossyroad/crossyroad.png" + }, + { + "name": "CS:GO Clicker", + "url": "./files/csgo-clicker/index.html", + "img": "./files/csgo-clicker/images/vanguard.png" + }, + { + "name": "Cut the Rope", + "url": "./files/ctr/index.html", + "img": "./files/ctr/logo.png" + }, + { + "name": "Cut the Rope Holiday", + "url": "./files/ctr-holiday/index.html", + "img": "./files/ctr-holiday/Holiday_Gift.webp" + }, + { + "name": "Cut the Rope Time Travel", + "url": "./files/ctr-tr/index.html", + "img": "./files/ctr-tr/logo.png" + }, + { + "name": "Cubefield", + "url": "./files/cubefield/index.html", + "img": "./files/cubefield/assets/unnamed.png" + }, + { + "name": "Cupcake 2048", + "url": "./files/cupcake2048/index.html", + "img": "./files/cupcake2048/favicon.png" + }, + { + "name": "Dante", + "url": "./files/dante/index.html", + "img": "./files/dante/splash.png" + }, + { + "name": "Deal or No Deal", + "url": "./files/deal-or-no-deal/index.html", + "img": "./files/deal-or-no-deal/index.jpg" + }, + { + "name": "Death Run 3D", + "url": "./files/death-run-3d/index.html", + "img": "./files/death-run-3d/img/death.png" + }, + { + "name": "Defend the Tank", + "url": "./files/defend-the-tank/index.html", + "img": "./files/defend-the-tank/images/splash.jpg" + }, + { + "name": "Doctor Acorn 2", + "url": "./files/doctor-acorn2/index.html", + "img": "./files/doctor-acorn2/splash.jpg" + }, + { + "name": "Doge 2048", + "url": "./files/doge2048/index.html", + "img": "./files/doge2048/meta/apple-touch-icon.png" + }, + { + "name": "Doge Miner", + "url": "./files/DogeMiner/index.html", + "img": "./files/DogeMiner/img/dogeminer_300x300.png" + }, + { + "name": "Doodle Jump", + "url": "./files/doodle-jump/index.html", + "img": "./files/doodle-jump/doodle.png" + }, + { + "name": "Double Wires", + "url": "./files/doublewires/index.html", + "img": "./files/doublewires/doublewires.png" + }, + { + "name": "Dragons vs Bricks", + "url": "./files/dragon-vs-bricks/index.html", + "img": "./files/dragon-vs-bricks/icon.jpg" + }, + { + "name": "Draw the Hill", + "url": "./files/draw-the-hill/index.html", + "img": "./files/draw-the-hill/icons/icon-512.png" + }, + { + "name": "Drift Boss", + "url": "./files/drift-boss/index.html", + "img": "./files/drift-boss/drift-boss.png" + }, + { + "name": "Drift Hunters", + "url": "./files/drift-hunters/index.html", + "img": "./files/drift-hunters/drift-hunters.png" + }, + { + "name": "Drive Mad", + "url": "./files/drive-mad/index.html", + "img": "./files/drive-mad/logo.jpg" + }, + { + "name": "Duck Life", + "url": "./files/ducklife1/index.html", + "img": "./files/ducklife1/ducklife.png" + }, + { + "name": "Duck Life 2", + "url": "./files/ducklife2/index.html", + "img": "./files/ducklife2/ducklife2.png" + }, + { + "name": "Duck Life 3", + "url": "./files/ducklife3/index.html", + "img": "./files/ducklife3/duck.png" + }, + { + "name": "Duck Life 4", + "url": "./files/ducklife4/index.html", + "img": "./files/ducklife4/splash.jpg" + }, + { + "name": "Edge Let's surf", + "url": "./files/edge-surf/index.html", + "img": "./files/edge-surf/splash.png" + }, + { + "name": "Edge Not Found", + "url": "./files/edgenotfound/index.html", + "img": "./files/edgenotfound/edge.png" + }, + { + "name": "Eel Slap", + "url": "./files/eel-slap/index.html", + "img": "./files/eel-slap/eel-slap.png" + }, + { + "name": "Elastic Man", + "url": "./files/elasticman/index.html", + "img": "./files/elasticman/elasticman.jpg" + }, + { + "name": "Endless War 3", + "url": "./files/endlesswar3/index.html", + "img": "./files/endlesswar3/endlesswar3.png" + }, + { + "name": "Escaping The Prison", + "url": "./files/escapingtheprison/index.html", + "img": "./files/escapingtheprison/escapingtheprison.jpg" + }, + { + "name": "Evil Glitch", + "url": "./files/evil-glitch/index.html", + "img": "./files/evil-glitch/evil.png" + }, + { + "name": "Evolution", + "url": "./files/evolution/index.html", + "img": "./files/evolution/splash.png" + }, + { + "name": "Exo", + "url": "./files/exo/index.html", + "img": "./files/exo/img/small.jpg" + }, + { + "name": "Factory Balls Forever", + "url": "./files/factoryballs/index.html", + "img": "./files/factoryballs/images/splash.png" + }, + { + "name": "Fair Squares", + "url": "./files/fairsquares/index.html", + "img": "./files/fairsquares/index.apple-touch-icon.png" + }, + { + "name": "Fancy Pants Adventures", + "url": "./files/fancypantsadventures/index.html", + "img": "./files/fancypantsadventures/fancypantsadventure.png" + }, + { + "name": "Fake Virus", + "url": "./files/fake-virus/index.html", + "img": "./files/fake-virus/icon.png" + }, + { + "name": "Fireboy and Watergirl", + "url": "./files/fireboywatergirlforesttemple/index.html", + "img": "./files/fireboywatergirlforesttemple/logo.jpeg" + }, + { + "name": "Flappy 2048", + "url": "./files/flappy-2048/index.html", + "img": "./files/flappy-2048/meta/apple-touch-icon.png" + }, + { + "name": "Flappy Bird", + "url": "./files/flappy-bird/index.html", + "img": "./files/flappy-bird/assets/thumb.png" + }, + { + "name": "Flash Tetris", + "url": "./files/flashtetris/index.html", + "img": "./files/flashtetris/flashtetris.png" + }, + { + "name": "Flippy Fish", + "url": "./files/flippy-fish/index.html", + "img": "./files/flippy-fish/2022_10_28_0jt_Kleki.png" + }, + { + "name": "Five Nights at Winston's", + "url": "./files/fnaw/index.html", + "img": "./files/fnaw/splash.png" + }, + { + "name": "Friday Night Funkin'", + "url": "./files/fridaynightfunkin/index.html", + "img": "./files/fridaynightfunkin/fnf-icon.jpg" + }, + { + "name": "Froggy's Battle", + "url": "./files/froggys-battle/index.html", + "img": "./files/froggys-battle/splash.png" + }, + { + "name": "Fruit Ninja", + "url": "./files/fruitninja/index.html", + "img": "./files/fruitninja/FruitNinjaTeaser.jpg" + }, + { + "name": "Frying Nemo", + "url": "./files/frying-nemo/index.html", + "img": "./files/frying-nemo/splash.png" + }, + { + "name": "Game Inside a Game Inside a Game...", + "url": "./files/game-inside/index.html", + "img": "./files/game-inside/img/display.png" + }, + { + "name": "Generic Fishing Game", + "url": "./files/generic-fishing-game/index.html", + "img": "./files/generic-fishing-game/splash.png" + }, + { + "name": "Geometry Dash (Scratch)", + "url": "./files/geodash/index.html", + "img": "./files/geodash/geoscratchicon.png" + }, + { + "name": "George and the Printer", + "url": "./files/georgeandtheprinter/index.html", + "img": "./files/georgeandtheprinter/img/SnDTEn.png" + }, + { + "name": "Getaway Shootout", + "url": "./files/getaway-shootout/index.html", + "img": "./files/getaway-shootout/img/images.jpg" + }, + { + "name": "Gimme the Airpod", + "url": "./files/gimme-the-airpod/index.html", + "img": "./files/gimme-the-airpod/img/logo.png" + }, + { + "name": "Glass City", + "url": "./files/glass-city/index.html", + "img": "./files/glass-city/image.png" + }, + { + "name": "Go Ball", + "url": "./files/go-ball/index.html", + "img": "./files/go-ball/game.jpg" + }, + { + "name": "GOODNIGHT", + "url": "./files/goodnight/index.html", + "img": "./files/goodnight/goodnight.jpg" + }, + { + "name": "Google Feud", + "url": "./files/google-feud/index.html", + "img": "./files/google-feud/splash.png" + }, + { + "name": "Google Snake", + "url": "./files/google-snake/index.html", + "img": "./files/google-snake/img/snake.png" + }, + { + "name": "Gravity Soccer", + "url": "./files/gravity-soccer/index.html", + "img": "./files/gravity-soccer/splash.png" + }, + { + "name": "Grey Box Testing", + "url": "./files/greybox/index.html", + "img": "./files/greybox/ico.png" + }, + { + "name": "Grind Craft", + "url": "./files/grindcraft/index.html", + "img": "./files/grindcraft/img/splash.png" + }, + { + "name": "Hacker Typer", + "url": "./files/hackertype/index.html", + "img": "./files/hackertype/logo192.png" + }, + { + "name": "Handshakes", + "url": "./files/handshakes/index.html", + "img": "./files/handshakes/splaher.png" + }, + { + "name": "Happy Hop", + "url": "./files/happy-hop/index.html", + "img": "./files/happy-hop/splash.png" + }, + { + "name": "Hover Bot Arena", + "url": "./files/hba/index.html", + "img": "./files/hba/hoverbotarena.JPG" + }, + { + "name": "Helicopter", + "url": "./files/helicopter/index.html", + "img": "./files/helicopter/helicopter.png" + }, + { + "name": "Hex Empire", + "url": "./files/hexempire/index.html", + "img": "./files/hexempire/hexempire.jpg" + }, + { + "name": "HexGL", + "url": "./files/HexGL/index.html", + "img": "./files/HexGL/Hexgl-image-1.jpg" + }, + { + "name": "Hextris", + "url": "./files/hextris/index.html", + "img": "./files/hextris/images/hextris-logo.png" + }, + { + "name": "Hungry Lamu", + "url": "./files/hungry-lamu/index.html", + "img": "./files/hungry-lamu/splash.png" + }, + { + "name": "Idle Breakout", + "url": "./files/idle-breakout/index.html", + "img": "./files/idle-breakout/img/thumbnail.png" + }, + { + "name": "Idle Shark", + "url": "./files/idle-shark/index.html", + "img": "./files/idle-shark/img/sharkgame.png" + }, + { + "name": "Impossible Quiz", + "url": "./files/impossiblequiz/index.html", + "img": "./files/impossiblequiz/impossiblequiz.png" + }, + { + "name": "Interactive Buddy", + "url": "./files/interactivebuddy/index.html", + "img": "./files/interactivebuddy/interactivebuddy.jpg" + }, + { + "name": "Jetpack Joyride", + "url": "./files/jetpack-joyride/index.html", + "img": "./files/jetpack-joyride/splash.jpg" + }, + { + "name": "JustFall.lol", + "url": "./files/just-fall/index.html", + "img": "./files/just-fall/unnamed.png" + }, + { + "name": "Just One Boss", + "url": "./files/just-one-boss/index.html", + "img": "./files/just-one-boss/pv1Gr5.png" + }, + { + "name": "Kitchen gun game", + "url": "./files/kitchen-gun-game/index.html", + "img": "./files/kitchen-gun-game/splash.png" + }, + { + "name": "Kitten Cannon", + "url": "./files/kittencannon/index.html", + "img": "./files/kittencannon/kittencannon.png" + }, + { + "name": "Knife Master", + "url": "./files/knife-master/index.html", + "img": "./files/knife-master/512x512.jpg" + }, + { + "name": "Krunker", + "url": "./files/krunker/index.html", + "img": "./files/krunker/img/krunker-io.jpg" + }, + { + "name": "Learn To Fly", + "url": "./files/learntofly/index.html", + "img": "./files/learntofly/learntofly.png" + }, + { + "name": "Learn to fly 2", + "url": "./files/learntofly2/index.html", + "img": "./files/learntofly2/learn-to-fly-2.jpg" + }, + { + "name": "Madalin Stunt Cars 2", + "url": "./files/madalin-stunt-cars-2/index.html", + "img": "./files/madalin-stunt-cars-2/img/logo.jpg" + }, + { + "name": "Madalin Stunt Cars 3", + "url": "./files/madalin-stunt-cars-3/index.html", + "img": "./files/madalin-stunt-cars-3/img/index.jpg" + }, + { + "name": "Mario", + "url": "./files/mario/index.html", + "img": "./files/mario/Theme/Mario.gif" + }, + { + "name": "Marvin Spectrum", + "url": "./files/marvinspectrum/index.html", + "img": "./files/marvinspectrum/marvinspectrum.png" + }, + { + "name": "Matrix Rampage", + "url": "./files/matrixrampage/index.html", + "img": "./files/matrixrampage/matrixrampage.jpg" + }, + { + "name": "Meme 2048", + "url": "./files/meme2048/index.html", + "img": "./files/meme2048/img/rickroll.gif" + }, + { + "name": "Merge Round Racers", + "url": "./files/merge-round-racers/index.html", + "img": "./files/merge-round-racers/splash.png" + }, + { + "name": "Mine Blocks", + "url": "./files/mineblocks/index.html", + "img": "./files/mineblocks/splash.png" + }, + { + "name": "Eaglercraft 1.5", + "url": "./files/minecraft-15/index.html", + "img": "./files/minecraft-15/splash.jpeg" + }, + { + "name": "Eaglercraft 1.8", + "url": "./files/minecraft-18/index.html", + "img": "./files/minecraft-18/splash.png" + }, + { + "name": "Minecraft Classic", + "url": "./files/minecraft-classic/index.html", + "img": "./files/minecraft-classic/pack.png" + }, + { + "name": "Minecraft Classic Hacks", + "url": "./files/minecraftbeta/index.html", + "img": "./files/minecraftbeta/bg_main.png" + }, + { + "name": "Minesweeper", + "url": "./files/minesweeper/index.html", + "img": "./files/minesweeper/img/minesweeper.png" + }, + { + "name": "Mini-putt", + "url": "./files/miniputt/index.html", + "img": "./files/miniputt/miniputt.png" + }, + { + "name": "Missiles", + "url": "./files/missiles/index.html", + "img": "./files/missiles/miss.png" + }, + { + "name": "MotoX3M", + "url": "./files/motox3m/index.html", + "img": "./files/motox3m/splash.jpg" + }, + { + "name": "MotoX3M 2", + "url": "./files/motox3m2/index.html", + "img": "./files/motox3m/splash.jpg" + }, + { + "name": "MotoX3M Pool", + "url": "./files/motox3m-pool/index.html", + "img": "./files/motox3m-pool/splash.jpg" + }, + { + "name": "MotoX3M Spooky", + "url": "./files/motox3m-spooky/index.html", + "img": "./files/motox3m-spooky/splash.jpeg" + }, + { + "name": "MotoX3M Winter", + "url": "./files/motox3m-winter/index.html", + "img": "./files/motox3m-winter/download.jpeg" + }, + { + "name": "My Rusty Submarine", + "url": "./files/my-rusty-submarine/index.html", + "img": "./files/my-rusty-submarine/splash.png" + }, + { + "name": "n-gon", + "url": "./files/n-gon/index.html", + "img": "./files/n-gon/bot.png" + }, + { + "name": "Ninja", + "url": "./files/ninja/index.html", + "img": "./files/ninja/logo1.png" + }, + { + "name": "Ninja vs Evil Corp", + "url": "./files/ninjavsevilcorp/index.html", + "img": "./files/ninjavsevilcorp/splash.png" + }, + { + "name": "Noob Steve Parkour", + "url": "./files/noob-steve-parkour/index.html", + "img": "./files/noob-steve-parkour/512x512.jpg" + }, + { + "name": "NS-Shaft", + "url": "./files/ns-shaft/index.html", + "img": "./files/ns-shaft/favicon.png" + }, + { + "name": "Neon Square Resurgence", + "url": "./files/nsresurgence/index.html", + "img": "./files/nsresurgence/neon.png" + }, + { + "name": "Offline Paradise", + "url": "./files/OfflineParadise/index.html", + "img": "./files/OfflineParadise/assets/icon.jpeg" + }, + { + "name": "Om Nom Bounce", + "url": "./files/om-bounce/index.html", + "img": "./files/om-bounce/assets/icon.jpeg" + }, + { + "name": "OvO", + "url": "./files/ovo/index.html", + "img": "./files/ovo/ovo.png" + }, + { + "name": "Pandemic 2", + "url": "./files/pandemic2/index.html", + "img": "./files/pandemic2/pandemic2.png" + }, + { + "name": "Papa's Burgeria", + "url": "./files/papasburgeria/index.html", + "img": "./files/papasburgeria/splash.jpg" + }, + { + "name": "Papa's Pizzaria", + "url": "./files/papaspizzaria/index.html", + "img": "./files/papaspizzaria/papaspizzaria.jpg" + }, + { + "name": "Paper.io 2", + "url": "./files/paperio2/index.html", + "img": "./files/paperio2/images/icon512.png" + }, + { + "name": "Papery Planes", + "url": "./files/papery-planes/index.html", + "img": "./files/papery-planes/splash.jpg" + }, + { + "name": "Particle Clicker", + "url": "./files/particle-clicker/index.html", + "img": "./files/particle-clicker/assets/mobile/original.png" + }, + { + "name": "Pixel Gun Survival", + "url": "./files/pixel-gun-survival/index.html", + "img": "./files/pixel-gun-survival/512x512.png" + }, + { + "name": "PolyBranch", + "url": "./files/polybranch/index.html", + "img": "./files/polybranch/img/pic1.png" + }, + { + "name": "POPCAT CLASSIC", + "url": "./files/popcat-classic/index.html", + "img": "./files/popcat-classic/splash.png" + }, + { + "name": "Portal (Flash)", + "url": "./files/portalflash/index.html", + "img": "./files/portalflash/portaltheflashversion.jpg" + }, + { + "name": "Precision Client (Eaglercraft)", + "url": "./files/precision-client/index.html", + "img": "./files/precision-client/logo.png" + }, + { + "name": "Protektor", + "url": "./files/protektor/index.html", + "img": "./files/protektor/splash.jpg" + }, + { + "name": "Push The Square", + "url": "./files/push-the-square/index.html", + "img": "./files/push-the-square/img/splash.png" + }, + { + "name": "Push Your Luck", + "url": "./files/push-your-luck/index.html", + "img": "./files/push-your-luck/assets/img/push.png" + }, + { + "name": "Rabbit Samurai", + "url": "./files/rabbit-samurai/index.html", + "img": "./files/rabbit-samurai/splash.png" + }, + { + "name": "Rabbit Samurai 2", + "url": "./files/rabbit-samurai2/index.html", + "img": "./files/rabbit-samurai2/splash.png" + }, + { + "name": "Resent Client (Eaglercraft)", + "url": "./files/resent-client/index.html", + "img": "./files/resent-client/splash.jpg" + }, + { + "name": "Retro Bowl", + "url": "./files/retro-bowl/index.html", + "img": "./files/retro-bowl/img/icon.jpg" + }, + { + "name": "Riddle School 1", + "url": "./files/riddleschool/index.html", + "img": "./files/riddleschool/riddleschool.png" + }, + { + "name": "Riddle School 2", + "url": "./files/riddleschool2/index.html", + "img": "./files/riddleschool2/riddleschool2.png" + }, + { + "name": "Riddle School 3", + "url": "./files/riddleschool3/index.html", + "img": "./files/riddleschool3/riddleschool3.png" + }, + { + "name": "Riddle School 4", + "url": "./files/riddleschool4/index.html", + "img": "./files/riddleschool4/riddleschool4.png" + }, + { + "name": "Riddle School 5", + "url": "./files/riddleschool5/index.html", + "img": "./files/riddleschool5/riddleschool5.png" + }, + { + "name": "Riddle School Transfer 1", + "url": "./files/riddletransfer/index.html", + "img": "./files/riddletransfer/riddletransfer.png" + }, + { + "name": "Riddle School Transfer 2", + "url": "./files/riddletransfer2/index.html", + "img": "./files/riddletransfer2/riddletransfer2.png" + }, + { + "name": "Rolling Forests", + "url": "./files/rolling-forests/index.html", + "img": "./files/rolling-forests/icon.png" + }, + { + "name": "Rolly Vortex", + "url": "./files/rolly-vortex/index.html", + "img": "./files/rolly-vortex/icon-256.png" + }, + { + "name": "Rooftop Snipers", + "url": "./files/rooftop-snipers/index.html", + "img": "./files/rooftop-snipers/img/preview.png" + }, + { + "name": "Ruffle Emulator", + "url": "./files/ruffle/index.html", + "img": "./files/ruffle/splash.png" + }, + { + "name": "Sandboxels", + "url": "./files/sandboxels/index.html", + "img": "./files/sandboxels/sandboxels.jpg" + }, + { + "name": "Santy is Home", + "url": "./files/santy-is-home/index.html", + "img": "./files/santy-is-home/splash.png" + }, + { + "name": "Sand Game", + "url": "./files/sand-game/index.html", + "img": "./files/sand-game/sand.png" + }, + { + "name": "Scrap Metal 3", + "url": "./files/scrapmetal/index.html", + "img": "./files/scrapmetal/img/splash.png" + }, + { + "name": "Shellshockers", + "url": "./files/shellshockers/index.html", + "img": "./files/shellshockers/img/favicon.jpg" + }, + { + "name": "Shot in the Dark", + "url": "./files/shotinthedark/index.html", + "img": "./files/shotinthedark/shot.png" + }, + { + "name": "SHUTTLEDECK", + "url": "./files/shuttledeck/index.html", + "img": "./files/shuttledeck/splash.png" + }, + { + "name": "Sky Car Stunt", + "url": "./files/sky-car-stunt/index.html", + "img": "./files/sky-car-stunt/512x512.jpg" + }, + { + "name": "Sleeping Beauty", + "url": "./files/sleepingbeauty/index.html", + "img": "./files/sleepingbeauty/splash.png" + }, + { + "name": "Slime Rush TD", + "url": "./files/slime-rush-td/index.html", + "img": "./files/slime-rush-td/splash.png" + }, + { + "name": "Slope", + "url": "./files/slope/index.html", + "img": "./files/slope/slope4.jpeg" + }, + { + "name": "Slope 2", + "url": "./files/slope-2/index.html", + "img": "./files/slope-2/slope-2-logo.png" + }, + { + "name": "Slope Ball", + "url": "./files/slope-ball/index.html", + "img": "./files/slope-ball/splash.png" + }, + { + "name": "Super Mario 64", + "url": "./files/sm64/index.html", + "img": "./files/sm64/logo.png" + }, + { + "name": "Smash Carts", + "url": "./files/smashkarts/index.html", + "img": "./files/smashkarts/images/icon-512.png" + }, + { + "name": "Smoking Barrels", + "url": "./files/smokingbarrels/index.html", + "img": "./files/smokingbarrels/smokingbarrels.jpg" + }, + { + "name": "Snowbattle", + "url": "./files/snowbattle/index.html", + "img": "./files/snowbattle/img/logo.png" + }, + { + "name": "Soccer Random", + "url": "./files/soccer-random/index.html", + "img": "./files/soccer-random/unnamed.png" + }, + { + "name": "Soccer Skills Euro Cup", + "url": "./files/soccer-skills/index.html", + "img": "./files/soccer-skills/splash.png" + }, + { + "name": "Soilder Legend", + "url": "./files/soldier-legend/index.html", + "img": "./files/soldier-legend/images/splash.jpeg" + }, + { + "name": "Solitare", + "url": "./files/solitaire/index.html", + "img": "./files/solitaire/screen-shot.png" + }, + { + "name": "Sort The Court", + "url": "./files/sort-the-court/index.html", + "img": "./files/sort-the-court/img/splash.png" + }, + { + "name": "Soundboard", + "url": "./files/soundboard/index.html", + "img": "./files/soundboard/img/mlg-favicon.png" + }, + { + "name": "Space Company", + "url": "./files/space-company/index.html", + "img": "./files/space-company/Icons/SpaceCompanyFavicon.png" + }, + { + "name": "Space Garden", + "url": "./files/spacegarden/index.html", + "img": "./files/spacegarden/spl.png" + }, + { + "name": "Stack", + "url": "./files/stack/index.html", + "img": "./files/stack/stack.png" + }, + { + "name": "Stack Bump 3D", + "url": "./files/stack-bump-3d/index.html", + "img": "./files/stack-bump-3d/thumbnail.jpg" + }, + { + "name": "Starve.io", + "url": "./files/starve/index.html", + "img": "./files/starve/img/favicon.png" + }, + { + "name": "Station 141", + "url": "./files/station-141/index.html", + "img": "./files/station-141/75wxYs.png" + }, + { + "name": "Stealing The Diamond", + "url": "./files/stealingthediamond/index.html", + "img": "./files/stealingthediamond/stealingthediamond.jpg" + }, + { + "name": "Stick Archers", + "url": "./files/stick-archers/index.html", + "img": "./files/stick-archers/splash.jpg" + }, + { + "name": "Stick Duel Battle", + "url": "./files/stick-duel-battle/index.html", + "img": "./files/stick-duel-battle/512x512.jpg" + }, + { + "name": "Stick Merge", + "url": "./files/stick-merge/index.html", + "img": "./files/stick-merge/splash.png" + }, + { + "name": "Stickman Boost", + "url": "./files/stickman-boost/index.html", + "img": "./files/stickman-boost/base/img1.jpg" + }, + { + "name": "Stickman Golf", + "url": "./files/stickman-golf/index.html", + "img": "./files/stickman-golf/splash.png" + }, + { + "name": "Stickman Hook", + "url": "./files/stickman-hook/index.html", + "img": "./files/stickman-hook/unnamed.jpg" + }, + { + "name": "Stickman Survival", + "url": "./files/Stickman-Survival/index.html", + "img": "./files/Stickman-Survival/Icon.png" + }, + { + "name": "Stick War", + "url": "./files/stickwar/index.html", + "img": "./files/stickwar/stickwar.jpg" + }, + { + "name": "Storm The House 2", + "url": "./files/stormthehouse2/index.html", + "img": "./files/stormthehouse2/stormthehouse2.jpg" + }, + { + "name": "Subway Surfers", + "url": "./files/subway-surfers/index.html", + "img": "./files/subway-surfers/img/splash.jpg" + }, + { + "name": "Subway Surfers New York", + "url": "./files/subway-surfers-ny/index.html", + "img": "./files/subway-surfers-ny/NewYorkIcon.png" + }, + { + "name": "Superhot", + "url": "./files/superhot/index.html", + "img": "./files/superhot/hot.jpg" + }, + { + "name": "Super Mario Constuct", + "url": "./files/supermarioconstruct/index.html", + "img": "./files/supermarioconstruct/media/icons/icon-128.png" + }, + { + "name": "Surviv.io", + "url": "./files/surviv/index.html", + "img": "./files/surviv/img/favicon.png" + }, + { + "name": "Sushi unROLL", + "url": "./files/sushi-unroll/index.html", + "img": "./files/sushi-unroll/favicon.png" + }, + { + "name": "Swerve", + "url": "./files/swerve/index.html", + "img": "./files/swerve/img/favicon.jpg" + }, + { + "name": "Synesthesia", + "url": "./files/synesthesia/index.html", + "img": "./files/synesthesia/index.splash.png" + }, + { + "name": "Tactical Weapon Pack 2", + "url": "./files/tactical-weapon-pack-2/index.html", + "img": "./files/tactical-weapon-pack-2/splash.jpg" + }, + { + "name": "Tactical Assassin 2", + "url": "./files/tacticalassasin2/index.html", + "img": "./files/tacticalassasin2/tacticalassassin2.png" + }, + { + "name": "Tank Trouble 2", + "url": "./files/tank-trouble-2/index.html", + "img": "./files/tank-trouble-2/tank.jpeg" + }, + { + "name": "Tanuki Sunset", + "url": "./files/tanuki-sunset/index.html", + "img": "./files/tanuki-sunset/img/cover.png" + }, + { + "name": "Temple Run 2", + "url": "./files/temple-run-2/index.html", + "img": "./files/temple-run-2/img/og-icon.png" + }, + { + "name": "The Battle", + "url": "./files/thebattle/index.html", + "img": "./files/thebattle/thebattle.png" + }, + { + "name": "The Final Earth", + "url": "./files/the-final-earth/index.html", + "img": "./files/the-final-earth/images.png" + }, + { + "name": "The Hotel", + "url": "./files/the-hotel/index.html", + "img": "./files/the-hotel/splash.png" + }, + { + "name": "The Heist", + "url": "./files/theheist/index.html", + "img": "./files/theheist/theheist.jpg" + }, + { + "name": "There Is No Game", + "url": "./files/there-is-no-game/index.html", + "img": "./files/there-is-no-game/logo.png" + }, + { + "name": "This Is The Only Level", + "url": "./files/thisistheonlylevel/index.html", + "img": "./files/thisistheonlylevel/thisistheonlylevel.png" + }, + { + "name": "Tiny Fishing", + "url": "./files/tiny-fishing/index.html", + "img": "./files/tiny-fishing/thumb.png" + }, + { + "name": "Tiny Islands", + "url": "./files/tiny-islands/index.html", + "img": "./files/tiny-islands/splash.png" + }, + { + "name": "Toss The Turtle", + "url": "./files/tosstheturtle/index.html", + "img": "./files/tosstheturtle/tosstheturtle.png" + }, + { + "name": "Townscaper", + "url": "./files/townscaper/index.html", + "img": "./files/townscaper/img/cover.jpg" + }, + { + "name": "Tube Jumpers", + "url": "./files/tube-jumpers/index.html", + "img": "./files/tube-jumpers/img/shark.jpg" + }, + { + "name": "Tunnel Rush", + "url": "./files/tunnel-rush/index.html", + "img": "./files/tunnel-rush/img/tunnel.jpg" + }, + { + "name": "TV Static", + "url": "./files/tv-static/index.html", + "img": "./files/tv-static/static.png" + }, + { + "name": "Twitch Tetris", + "url": "./files/twitch-tetris/index.html", + "img": "./files/twitch-tetris/logo.png" + }, + { + "name": "VELOCE", + "url": "./files/veloce/index.html", + "img": "./files/veloce/qN6zkD.png" + }, + { + "name": "Vex 3", + "url": "./files/vex3/index.html", + "img": "./files/vex3/vex3.png" + }, + { + "name": "Vex 4", + "url": "./files/vex4/index.html", + "img": "./files/vex4/vex4.png" + }, + { + "name": "Vex 5", + "url": "./files/vex5/index.html", + "img": "./files/vex5/vex.jpeg" + }, + { + "name": "Vex 6", + "url": "./files/vex6/index.html", + "img": "./files/vex6/assets/icon.jpeg" + }, + { + "name": "Vex 7", + "url": "./files/vex7/index.html", + "img": "./files/vex7/assets/icon.jpeg" + }, + { + "name": "Waterworks!", + "url": "./files/waterworks/index.html", + "img": "./files/waterworks/square.png" + }, + { + "name": "Wall Smash", + "url": "./files/wallsmash/index.html", + "img": "./files/wallsmash/thumb.png" + }, + { + "name": "Weave Silk", + "url": "./files/weavesilk/index.html", + "img": "./files/weavesilk/thumb.png" + }, + { + "name": "WebGL Fluid Sim", + "url": "./files/webgl-fluid-simulation/index.html", + "img": "./files/webgl-fluid-simulation/logo.png" + }, + { + "name": "Webretro", + "url": "./files/webretro/roms.html", + "img": "./files/webretro/assets/icons/icon204.png" + }, + { + "name": "Win the Whitehouse", + "url": "./files/win-the-whitehouse/index.html", + "img": "./files/win-the-whitehouse/splash.png" + }, + { + "name": "Wolfenstein 3D", + "url": "./files/wolf3d/index.html", + "img": "./files/wolf3d/art/wolf3d.png" + }, + { + "name": "Wordle", + "url": "./files/wordle/index.html", + "img": "./files/wordle/img/logo_512x512.png" + }, + { + "name": "World's Hardest Game", + "url": "./files/worlds-hardest-game/index.html", + "img": "./files/worlds-hardest-game/images/splash.jpg" + }, + { + "name": "World's Hardest Game 2", + "url": "./files/worlds-hardest-game-2/index.html", + "img": "./files/worlds-hardest-game-2/the-worlds-hardest-game-2.jpg" + }, + { + "name": "X Trial Racing", + "url": "./files/x-trial-racing/index.html", + "img": "./files/x-trial-racing/splash.png" + }, + { + "name": "xx142-b2exe", + "url": "./files/xx142-b2exe/index.html", + "img": "./files/xx142-b2exe/splash.png" + }, + { + "name": "Yoshi's Fabrication Station", + "url": "./files/yoshifabrication/index.html", + "img": "./files/yoshifabrication/icons/icon-512.png" + }, + { + "name": "You Are Jeff Bezos", + "url": "./files/you-are-bezos/index.html", + "img": "./files/you-are-bezos/img/banner.png" + }, + { + "name": "Zombs Royale", + "url": "./files/zombs-royale/index.html", + "img": "./files/zombs-royale/zomb.png" + } +] diff --git a/assets/globe.svg b/assets/globe.svg new file mode 100644 index 0000000..d83657b --- /dev/null +++ b/assets/globe.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/keen-slider.min.js b/assets/keen-slider.min.js new file mode 100644 index 0000000..ba78029 --- /dev/null +++ b/assets/keen-slider.min.js @@ -0,0 +1,7 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/keen-slider@6.8.5/keen-slider.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(n="undefined"!=typeof globalThis?globalThis:n||self).KeenSlider=t()}(this,(function(){"use strict";var n=function(){return n=Object.assign||function(n){for(var t,i=1,e=arguments.length;i0?1:0)-(n<0?1:0)||+n}function f(n){var t=n.getBoundingClientRect();return{height:e(t.height,n.offsetHeight),width:e(t.width,n.offsetWidth)}}function p(n,t,i,e){var r=n&&n[t];return null==r?i:e&&"function"==typeof r?r():r}function v(n){return Math.round(1e6*n)/1e6}function h(n){var t,i,e,r,a,o;function u(t){o||(o=t),s(!0);var a=t-o;a>e&&(a=e);var l=r[i];if(l[3]0?1:-1),{abs:u+i*s*a,origin:o,rel:u}}function I(n,t,i){var e;if(t||!S())return A(n,i);if(!D(n))return null;var r=z(null!=i?i:T),a=r.abs,o=n-r.rel,u=a+o;e=A(u);var c=A(u-s*l(o));return(null!==c&&Math.abs(c)6&&(w=w.slice(-6)),T=v(t);var e=H().abs;if(e!==M){var a=null!==M;M=e,a&&n.emit("slideChanged")}}function H(t){var r=t?null:function(){if(s){var n=S(),t=n?(T%e+e)%e:T,i=(n?T%e:T)-u[0][2],r=0-(i<0&&n?e-Math.abs(i):i),c=0,d=z(T),f=d.abs,p=d.rel,v=u[p][2],k=u.map((function(t,i){var a=r+c;(a<0-t[0]||a>1)&&(a+=(Math.abs(a)>e-1&&n?e:0)*l(-a));var u=i-p,d=l(u),h=u+f;n&&(-1===d&&a>v&&(h+=s),1===d&&ab&&(a-=e));var m=a+t[0]+t[1],x=Math.max(a>=0&&m<=1?1:m<0||a>1?0:a<0?Math.min(1,(t[0]+a)/t[0]):(1-a)/t[0],0);return c+=t[0]+t[1],{abs:h,distance:o.rtl?-1*a+1-t[0]:a,portion:x,size:t[0]}}));return f=L(f),p=O(f),{abs:L(f),length:a,max:y,maxIdx:m,min:x,minIdx:h,position:T,progress:n?t/e:T/a,rel:p,slides:k,slidesLength:e}}}();return i.details=r,n.emit("detailsChanged"),r}return i={absToRel:O,add:C,details:null,distToIdx:E,idxToDist:I,init:function(t){if(function(){if(o=n.options,u=(o.trackConfig||[]).map((function(n){return[p(n,"size",1),p(n,"spacing",0),p(n,"origin",0)]})),s=u.length){e=v(u.reduce((function(n,t){return n+t[0]+t[1]}),0));var t,i=s-1;a=v(e+u[0][2]-u[i][0]-u[i][2]-u[i][1]),c=u.reduce((function(n,i){if(!n)return[0];var e=u[n.length-1],r=n[n.length-1]+(e[0]+e[2])+e[1];return r-=i[2],n[n.length-1]>r&&(r=n[n.length-1]),r=v(r),n.push(r),(!t||t200||(l(e)!==l(t.distance)&&t.distance&&(t={distance:0,lastTimestamp:0,time:0}),t.time&&(t.distance+=e),t.lastTimestamp&&(t.time+=r-t.lastTimestamp),t.lastTimestamp=r),t}),{distance:0,lastTimestamp:0,time:0});return t.distance/t.time||0}}}function g(n){var t,i,e,r,a,o,u,s;function c(n){return 2*n}function f(n){return d(n,u,s)}function p(n){return 1-Math.pow(1-n,3)}function v(){return e?n.track.velocity():0}function h(){b();var t="free-snap"===n.options.mode,i=n.track,e=v();r=l(e);var u=n.track.details,s=[];if(e||!t){var d=m(e),h=d.dist,g=d.dur;if(g=c(g),h*=r,t){var x=i.idxToDist(i.distToIdx(h),!0);x&&(h=x)}s.push({distance:h,duration:g,easing:p});var y=u.position,k=y+h;if(ko){var w=ko||u=M)return t;if(u0||u>T&&i<0)return t;var c=(uM&&x0||x===T&&i<0)&&s(t),g+=c,!b&&Math.abs(g*r)>5&&(b=!0),n.track.add(c),m=o,n.emit("dragged")}}function z(t){!f&&n.track.details&&n.track.details.length&&(g=0,f=!0,b=!1,h=!0,v=t.id,A(t),m=D(t),n.emit("dragStarted"))}function I(t){f&&v===t.idChanged&&(f=!1,n.emit("dragEnded"))}function A(n){var t=L(),i=t?n.y:n.x,e=t?n.x:n.y,r=void 0!==x&&void 0!==y&&Math.abs(y-e)<=Math.abs(x-i);return x=i,y=e,r}function D(n){return L()?n.y:n.x}function L(){return n.options.vertical}function S(){r=n.size,a=L()?window.innerHeight:window.innerWidth;var t=n.track.details;t&&(M=t.min,T=t.max)}function O(n){b&&(s(n),u(n))}function _(){if(C.purge(),n.options.drag&&!n.options.disabled){var i;i=n.options.dragSpeed||1,p="function"==typeof i?i:function(n){return n*i},e=n.options.rtl?-1:1,S(),t=n.container,function(){var n="data-keen-slider-clickable";o("[".concat(n,"]:not([").concat(n,"=false])"),t).map((function(n){C.add(n,"dragstart",s),C.add(n,"mousedown",s),C.add(n,"touchstart",s)}))}(),C.add(t,"dragstart",(function(n){u(n)})),C.add(t,"click",O,{capture:!0}),C.input(t,"ksDragStart",z),C.input(t,"ksDrag",E),C.input(t,"ksDragEnd",I),C.input(t,"mousedown",z),C.input(t,"mousemove",E),C.input(t,"mouseleave",I),C.input(t,"mouseup",I),C.input(t,"touchstart",z,{passive:!0}),C.input(t,"touchmove",E,{passive:!1}),C.input(t,"touchend",I),C.input(t,"touchcancel",I),C.add(window,"wheel",(function(n){f&&u(n)}));var r="data-keen-slider-scrollable";o("[".concat(r,"]:not([").concat(r,"=false])"),n.container).map((function(n){return function(n){var t;C.input(n,"touchstart",(function(n){t=D(n),w=!0,k=!0}),{passive:!0}),C.input(n,"touchmove",(function(i){var e=L(),r=e?n.scrollHeight-n.clientHeight:n.scrollWidth-n.clientWidth,a=t-D(i),o=e?n.scrollTop:n.scrollLeft,s=e&&"scroll"===n.style.overflowY||!e&&"scroll"===n.style.overflowX;if(t=D(i),(a<0&&o>0||a>0&&o=1||(n.origin=1-t-(d>1?0:1-d)),n}))}e.options.trackConfig=a}function E(){I();var n=e.size;e.options.disabled||n===u||(u=n,T())}function z(){E(),setTimeout(E,500),setTimeout(E,2e3)}function I(){var n=f(e.container);e.size=(e.options.vertical?n.height:n.width)||1}function A(){e.slides=o(e.options.selector,e.container)}e.container=(v=o(t,l||document)).length?v[0]:null,e.destroy=function(){h.purge(),e.emit("destroyed"),m(!0)},e.prev=function(){e.moveToIdx(e.track.details.abs-1,!0)},e.next=function(){e.moveToIdx(e.track.details.abs+1,!0)},e.update=T,k(e.options)}}return function(n,i,e){try{return function(n,t){var i,e={};return i={emit:function(n){e[n]&&e[n].forEach((function(n){n(i)}));var t=i.options&&i.options[n];t&&t(i)},moveToIdx:function(n,t,e){var r=i.track.idxToDist(n,t);if(r){var a=i.options.defaultAnimation;i.animator.start([{distance:r,duration:p(e||a,"duration",500),easing:p(e||a,"easing",(function(n){return 1+--n*n*n*n*n}))}])}},on:function(n,t,i){void 0===i&&(i=!1),e[n]||(e[n]=[]);var r=e[n].indexOf(t);r>-1?i&&delete e[n][r]:i||e[n].push(t)},options:n},function(){if(i.track=m(i),i.animator=h(i),t)for(var n=0,e=t;n:((((((" + }, + { + "name": "Rick Astley", + "img": "./images/reviews/rickastley.jpeg", + "review": "11/10 Games are class and ui is ausome." + }, + { + "name": "Alexgaming", + "img": "./images/reviews/Alexgaming.png", + "review": "9/10 good website, just missing a couple games that i wanted" + }, + { + "name": "Professional waster of time", + "img": "./images/reviews/professionalwasteroftime.gif", + "review": "10/10, My nonexistent dog can use this website" + }, + { + "name": "heisenburger", + "img": "./images/reviews/heisenburger.jpg", + "review": "Diviance Shukla 🤓, the greatest philosopher of all time." + }, + { + "name": "Cmartin42", + "img": "./images/reviews/cmartin42.jpg", + "review": "Best games. Like how do you get all of these. My school only has 2 unblocked game websites. Keep up this website. its awesome." + }, + { + "name": "LEGALISE PIRACY", + "img": "./images/reviews/legalisepiracy.png", + "review": "9000/10 best site ever i can play minecraft for free with no virus!" + }, + { + "name": "Bhupendra", + "img": "./images/reviews/bhupendra.jpeg", + "review": "Thanks for the websites we flooded the school with an outrageous amount of duplicates and no matter how many they try to block we make twenty to replace them thx" + }, + { + "name": "Honglong", + "img": "./images/reviews/honglong.jpg", + "review": "Very Great Unblocked Games Website And Is Open Source Just In case It Gets Blocked" + }, + { + "name": "Gamesrain", + "img": "./images/reviews/gamesrain.jpeg", + "review": "this is such a nice website i play this everyday also everything is unblocked there are 200+ games I would recommend this to everybody you know 10/10." + }, + { + "name": "butterminecart", + "img": "./images/reviews/butterminecart.jpg", + "review": "420/69 best site ever I play on it when I procrastinate and there is so many cool games like minecraft, roblox, and fortnite. I highly recommend this site to anyone even my dog who also plays on this site somehow. Anyways I look forward to the future of this site." + }, + { + "name": "JoeBiden", + "img": "./images/reviews/biden.jpg", + "review": "89/89 Best unbocked game site ever has the best games and this is coming from the co-owner of 3kh0 so ya!" + } +] \ No newline at end of file diff --git a/assets/say.json b/assets/say.json new file mode 100644 index 0000000..51200a0 --- /dev/null +++ b/assets/say.json @@ -0,0 +1,657 @@ +[ + "Welcome.", + "Hello!", + "Does this even work?", + "Welcome to my rad website", + "Made with HTML!", + "Uses some css", + "Now with buggy games!", + "You get a cookie!", + "Remember your manners!", + "Dogs are cute", + "Ok, and I know your address now!", + "Beep boop! Are you a robot?", + "Did you know I have a Discord server?", + "How many sides does a circle have?", + "1 + 1 = 3", + "6 + 9 = 69", + "You can read btw", + "Made you look!", + "Never gonna give you up, Never gonna let you down...", + "Redbull gives you wings...", + "What is your highscore on Swerve?", + "Since 2018!", + "Now with 2X more bugs!", + "12345 is not a good password", + "This took to long to make", + "69 hehe funny number", + "Ahhhhhhhhh", + "Awesome!", + "As seen on TV!", + "doot doot", + "100% Fresh!", + "LOL", + "Cold as ice!", + "Why are you looking at me?", + "Made in the US!", + "Made by 3kh0!", + "Nebelung can code", + "Click me :D", + "Reload the page NOW!", + "Downloading your passwords...", + "Running 3kh0.exe", + "WARNING: You may lose braincells if you proceed!", + "Please go away. Thx", + "Made with GitHub!", + "Made with VS code!", + "Made with love", + "Made with H2O", + "This is a splash text!", + "100% Orgainic!", + "Now with Pac-Man!", + "Now with Polybranch!", + "Now with JavaScript!", + "Now with CSS", + "Do you bite your ice cream?", + "Reddit: u/3kh0_reddit", + "Discord: https://discord.gg/3kh0", + "This was not ment to be seen. :o", + "Does anyone know how to stand up?", + "69420", + "Me too bro.", + "#Relatable", + "2 + 2 is 4 - 1 is 3 Quick mafs", + "Feels bad man.", + "Now with games that are unblocked?", + "Now with great games!", + "How do you play tic-tac-toe?", + "Fortnite is cringe", + "You got games on your phone?", + "I am not gonna say anything.", + "Now with Minecraft!", + "Welcome to v4.0!", + "Remember v3.0?", + "Your momma jokes are cringe", + "Now with a new splash!", + "You just dont get it do you?", + "Powered by hamsters!", + "*insert cool explosion*", + "Efficiency is key", + "New update???", + "We have answers!", + "aaaaaaaaaaaaaaaaaaa", + "Yooooooooooooooooooooo", + "Your ip is 69.420.69.420", + "he on x-games mode", + "Got to go fast!", + "GAS GAS GAS GOTTA STEP ON THE GAS!", + "3kh0.github.io would like to view your browser history", + "For legal reasons, that's a joke!", + "It has been 84 years...", + "Made by Gucci, selling for $69420", + "There is someone looking over your shoulder", + "Electric!", + "How many different ones are there?!?!", + "NERDDDDDDDDDDDDDDDDDD", + "My iPad passcode is 563543 btw", + "Get out of my room, I'm not going to let you in!", + "I'm not a robot!", + "I'm not a human!", + "Sponsered by RAID SHADOW LEGENDS!", + "Sponsored by Honey!", + "Sponsored by 3kh0!", + "Sponsored by your mom!", + "Sponsored by your dad!", + "Sponsored by your mom's dad!", + "Sponsored by your dad's mom!", + "Sponsored by your mom's dad's mom!", + "Sponsored by your dad's mom's dad!", + "Sponsored by your mom's dad's mom's dad!", + "Sponsored by your dad's mom's dad's mom!", + "Sponsored by your mom's dad's mom's dad's mom!", + "Sponsored by your dad's mom's dad's mom's dad!", + "Sponsored by your mom's dad's mom's dad's mom's dad!", + "Sponsored by your dad's mom's dad's mom's dad's mom!", + "Sponsored by your mom's dad's mom's dad's mom's dad's mom!", + "Sponsored by your dad's mom's dad's mom's dad's mom's dad!", + "Sponsored by your mom's dad's mom's dad's mom's dad's mom's dad!", + "Sponsored by your dad's mom's dad's mom's dad's mom's dad's mom!", + "Sponsored by your mom's dad's mom's dad's mom's dad's mom's dad's mom!", + "Sponsored by your dad's mom's dad's mom's dad's mom's dad's mom's dad!", + "Sponsored by your mom's dad's mom's dad's mom's dad's mom's dad's mom's dad!", + "Sponsored by your dad's mom's dad's mom's dad's mom's dad's mom's dad's mom!", + "Sponsored by your mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom!", + "Sponsored by your dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad!", + "Sponsored by your dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom!", + "Sponsored by your mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad!", + "Sponsored by your dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad!", + "Sponsored by your mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom!", + "Sponsored by your dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom!", + "Sponsored by your mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad!", + "Sponsored by your dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad!", + "Sponsored by your mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom!", + "Sponsored by your mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad's mom's dad!", + "Sponsored by stepbro", + "Piplup is cute", + "3kh0 is a bozo", + "Nothing has been said yet!", + "I'm not a bird!", + "I'm not a fish!", + "I'm not a cat!", + "I'm not a dog!", + "I'm not a horse!", + "I'm not a cow!", + "I'm not a sheep!", + "I'm not a goat!", + "I'm not a chicken!", + "I'm not a pig!", + "I'm not a Piplup!", + "I'm not a 3kh0!", + "I'm not a Nebelung!", + "Powered by 128 Gigs of RAM!", + "Powered by 1 Gig of RAM!", + "I want to bite you!", + "I want to eat you!", + "I want to drink you!", + "I want to devour you!", + "I'm Slim Shady, yes, I'm the real Shady!", + "I'm not a real Shady!", + "I'll wear your granddad's clothes", + "gooooooooooodbye", + "You're a real jerk!", + "w h a t", + "what the dog doin?", + "what are you doing?", + "Math is kinda boring", + "XD", + "I'm gonna pop some tags", + "Ka-ching!", + "Kablam!", + "Shoutout to 4chan!", + "Shoutout to 4chan's mods! Wait, there are not any!", + "thx stackoverflow!", + "are you a gaemer?", + "mom get out of my room i am playing minecraft!", + "This is a test message!", + "It is time to get funky!", + "people like to barn fish?", + "Why is the sky blue?", + "Can you please burp?", + "Some things are better left unspoken.", + "What is your favorite color?", + "What is your favorite animal?", + "What is your favorite food?", + "What is your favorite drink?", + "What is your favorite band?", + "What is your favorite song?", + "What is your favorite movie?", + "What is your favorite book?", + "What is your favorite sport?", + "What is your favorite game?", + "What is your favorite TV show?", + "What is your favorite TV character?", + "What is your favorite favorite?", + "", + "SOMEONE PLEASE HELP ME!", + "I'm a little teapot.", + "I'm a little teapot, short and stout.", + "We didn't start the fire! It was always burning, since the world's been turning!", + "Don't worry, I'm not a firetruck.", + "Don't ask questions if you can't handle the answers!", + "I'm not a firetruck, I'm a firetruck.", + "If you're not careful, you'll burn your house down.", + "If you are using a computer, you are a computer.", + "If you are using Microsoft Edge, you need some help.", + "Living in space is like living in a hotel.", + "Living in Spain without the S", + "Living in Spain without the S is a bad idea.", + "Shoutout to Piplup!", + "Shoutout to 3kh0!", + "Shoutout to Nebelung!", + "Woo! /g/", + "youtube.com/watch?v=dQw4w9WgXcQ", + "youtube.com/c/shadrYT", + "Pretend inferiority and encourage his arrogance. - Sun Tzu", + "Help im locked in a data center!", + "5261796D6F6E6420486F6C74", + "gif bezos", + "God i just hate reality", + "Please stop posting furry images.", + "i wanted free vbucks :(", + "i want to be a cat", + "i want to be a dog", + "i want to be a horse", + "i want to be a cow", + "i want to be a sheep", + "i want to be a goat", + "i want to be a chicken", + "i want to be a pig", + "i want to be a piplup", + "i want to be a 3kh0", + "i want to be a Nebelung", + "i want to be a bozo", + "i want to be a gaemer", + "Is this the United Airlines costumer service center?", + "we will steal your china and sell it to ip", + "Never half-ass two things. Whole-ass one thing.", + "bottem text", + "top text", + "Why do they call it oven if you oven the cold food of out hot eat the food", + "furryegirl", + "No fun allowed", + "Stop having fun", + "Your toes will be pulled tonight", + "Someone was too lazy to give it a title", + "i do love buying birth certificates from the black market! - Piplup", + "'If you are trash go cry to Fortnite you loser' - Sun Tzu, Art of war", + "What am I doing here helpppppp - Nebelung", + "undefined", + "[]", + "Avocados \ud83e\udd51 from Mexico \ud83c\uddf2\ud83c\uddfd", + "i realised i haven't blinked in like half an hour and now blinking feels uncomfortable", + "reload for another message", + "click me for another messgae", + "Boost the discord server for a very cool role!", + "Why does the discord server exist", + "I purchased a baby clown from the Russian terrorist black market.", + "He stomped on his fruit loops and thus became a cereal killer.", + "Technoblade never dies!", + "And just to think I knew him before he was famous!", + "Trust me, I did not copy Minecraft with this!", + "It is everyday bro!", + "That proves you are unusual", + "What's my age again?", + "If you think you are dumb, it is true", + "This is the 5th time this week, and it's only Monday!", + "You bum", + "Roblox? Cringe!", + "Toss the Turtle is pretty fun", + "Mission failed, we will get them next time!", + "NUKE INCOMING!", + "I spent too much time making these", + "Too cool for school!", + "Pringles", + "Oh heck nah!", + "Hoo hoo hoo!", + "Light mode eww!", + "pretzels", + "Please game responsibly", + "burbur", + "Apple bottom jeans!", + "We out here!", + "what a gaemer", + "Please enjoy responsibly", + "Can you really buy land on the moon?", + "Breaking news! Your computer will blow up in 3...", + "Gaming since 2020!", + "Hacker man!", + "Your fortune is...", + "Let's just hope you dont get caught doing this...", + "Site shutting down in days...jk", + "This is not the first time you did this...", + "baba booey", + "Can't stop me now!", + "beans", + "OwO", + "UwU", + "._.", + "null", + "It's over 100!", + "Get to work!", + "Cats or Dogs?", + "[error] var braincells is to low", + "DM Echo if you want to see your name here!", + "shadrYT on top!", + "Sub to shadrYT!", + "Free robux! Wait who even plays that game eww", + "Did you know that there are other JAWS movies, yeah they are bad!", + "This is the 300th splash text!", + "Extra credit be like", + "Blue's Potatos are superior", + "Have you ever had a dream that you, um, you had, your, you- you could, youll do, you- you wants, you, you could do so, you- youll do, you could- you, you want, you want them to do you so much you could do anything?", + "[object Object]", + "Error 404, Games not found", + "To the person who invented zero, thanks for nothing", + "Piplup gets no b*****s haha (-piplup's sister)", + "mogus", + "Toto, I've a feeling we're not in Kansas anymore", + "You keep using that word. I do not think it means what you think it means.", + "c h a o s", + "a- amogu- *gets shot with laser*", + "potato", + "Ping: 87654ms", + "Ping: 1ms", + "69 x 21 + 420 + 911 - 760 = 2020", + "Aspaceman is n o i c e", + "With great power comes great need to take a nap. Wake me up later.", + "I’m going to defeat you with the power of friendship! ... And this knife I found.", + "If you can’t beat them, dress better than them", + "Died and came back as a cowboy, I call that reintarnation.", + "So what’s for dinner?", + "#VoteForJude", + "0.0", + "Searching for nearby sushi restaraunts...", + "The square root of 27 is 5.196152423.", + "TikTok was just removed from existance!", + "Ordered 420 pizzas from Pizza Hut!", + "Did you know, not breathing means that you are not breathing!", + "Sorry, I do not know what you are trying to do!", + "Launching intercontinental ballistic missile. Target: Northwest Syria", + "You can buy a flying bicycle, would you like to do so?", + "You do want to invade Poland?", + "If you microwave your phone it will become faster!", + "There was a Roomba once that followed me around everwhere.", + "For this emotion, I prescribe will chocolate.", + "Did you know, you have over 50 assignments due by tomorrow that you have not started on.", + "The meaning of life is in fact, chocolate.", + "Ford F150. Holden Ute. GMC Sierra 3500. Lorry.", + "Buying $GME Stock...", + "Preordering tickets to Disney's 2021 Cruella", + "Search results show you may have the black plague.", + "amogus", + "Funyuns are the greatest", + "What the burger!", + "1 in 4 Big Macs are lonely, you can fix this by downloading tinder", + "Dominos > Pizza hut", + "RagerYT", + "Shad, Parrot will never notice you.", + "HEEEEEEEEEEY", + "HOOOOOOOOOOO", + "sussy baka", + "ඞ", + "real?", + "ඞ amongus", + "Now with over 200 games!", + "Hello mario", + "furryeboy", + "Pin this if you love your fans", + "use abnumality.github.io", + "Graphic design is my passion.", + "YOU'RE CRINGE!", + "Spongebob, Spongebob, Patrick, Patrick, Squidward, Squidward, Sandy, Sandy", + "Come join us, we murder and kidnapp people", + "Save 50% off pizza when ordering online at dominos!!!", + "There is no one in the basement!", + "3kh0... 3kh0... 3kh0... I think there's an echo in here", + "No Introduction Needed", + "I pledge allegiance, to the logo of the server of the communist states of 3kh0, into the communism, for which it stands, one nation, under 3kh0, indivisible, with communism and justice for some", + "What's this do?", + "E", + "3kh0.github.io: The best place for illegal activities", + "Your voice sounds good when your not talking", + "peanut", + "Think fast chuckle nuts!", + "its too late", + "IIIII got the feeling in my bones", + "Yugi: I destroy the moon", + "Splash texts brought to you by the EchoDev Discord!", + "Flippy flop flips go flip flop, floppy flip flops go flop flip", + "Josh is the bean man", + "Internet enabled!", + "90% bug free!", + "Technically good!", + "5x more bugs!", + "James, you are not the real echo", + "Mike is murderous", + "we will rule the world!", + "your local gamestop", + "bruh moment", + "can you help me find my son?", + "why.. just why?", + "The Duolingo Owl is coming for you!", + "I like your outfit", + "Baby Shark doo doo doo", + "YEAHHHHHHHHHHH!!!", + "Why was the math book sad? Because it had too many problems.", + "Why couldn't the bicycle stand up by itself? Because it was two-tired.", + "Why did the tomato turn red? Because it saw the salad dressing!", + "Why was the computer cold? Because it left its Windows open.", + "Why did the cookie go to the doctor? Because it was feeling crumbly.", + "Why did the scarecrow win an award? Because he was outstanding in his field.", + "Why did the bee get in trouble at school? Because it had a buzzer on its test.", + "Why couldn't the leopard play hide and seek? Because he was always spotted.", + "Why did the banana go to the doctor? Because it wasn't peeling well.", + "Written by ChatGPT!", + "ChatGPT is cringe", + "Welcome to our website! We hope you have a splashtastic time here.", + "Get ready for an exciting adventure on our website. Buckle up and let's go!", + "Thanks for stopping by! Our website is full of fun and interesting content just for you.", + "We're glad you're here! Take a look around and discover all that our website has to offer.", + "Come on in and make yourself at home! We have everything you need for a great online experience.", + "We've been waiting for you! Take a look around and see what our website has in store for you.", + "It's time to have some fun! Our website is full of exciting games.", + "Welcome to the party! Our website is the place to be for all kinds of entertainment and information.", + "Get ready for an unforgettable experience on our website. It's going to be a blast!", + "Thanks for visiting! We have all sorts of goodies waiting for you on our website. Enjoy!", + "That's it! I am taking your neck!", + "ChatGPT knows...", + "discord.gg/3kh0", + "3kh0 on top!", + "Wenomechainsama", + "Tumajarbisaun", + "Wifenlooof", + "Eselifterbraun", + "Zǎoshang hǎo zhōngguó", + "Zǎoshang hǎo zhōngguó xiànzài wǒ yǒu BING CHILLING 🥶🍦", + "What's up guys! It's Quandale Dingle here!", + "RUUEHEHEHEHEHEEHE", + "My name is Walter Hartwell White. I live at 308 Negra Aroya Lane, Albuquerque, New Mexico, 87104.", + "I’m doing my first Official Donald J. Trump NFT collection right here and right now.", + "Can you believe it guys? Christmas, just a week away. Christmas is in a week! Woohoo! I am so happy about this information. Christmas! Just a week away, oh wow. Can you believe it? Christmas! Just in a week! It got here so fast!", + "I would like to nominate this award to my reformed orthodox rabbi, Bill Clinton.", + "I am living in your walls.", + "Curse you Perry the Platypus.", + "These are just all copypastas!", + "I Sexually Identify as an Attack Helicopter", + "WEE WOO WEE WOO", + "ALERT! COMEDY GOD HAS ENTERED THE BUILDING! GET TO COVER!", + "steps on stage", + "Heh...", + "adjusts fedora", + "Curse you Perry the Platypus", + "the building is filled with fear and anticipation", + "God and Jesus himself looks on in suspense", + "comedy god clears throat", + "everything is completely quiet not a single sound is heard", + "world leaders look and wait with dread", + "everything in the world stops", + "nothing is happening", + "1\n2\n3\n4\n5", + "comedy god smirks", + "no one is prepared for what is going to happen", + "comedy god musters all of this power", + "he bellows out to the world", + "ATTACK", + "HELICOPTER", + "all at once, absolute pandemonium commences", + "all nuclear powers launch their nukes at once", + "giant brawls start", + "43 wars are declared simultaneously", + "a shockwave travels around the earth", + "earth is driven into chaos", + "humanity is regressed back to the stone age", + "the pure funny of that joke destroyed civilization itself", + "all the while people are laughing harder than they ever did", + "people who aren't killed die from laughter", + "literally the funniest joke in the world", + "grunk", + "im gonna break your jaw", + "if there is a burger king, where is the burger queen", + "braed", + "New Ruffle instance created.", + "Just another 3kh0 message", + "Just go to /r/copypasta", + "this is a button??", + "regex is hard", + "I use 3kh0 to play games at school (joking)", + "Play Now", + "Click 'Play Now'", + "Click the button below me", + "o", + "Now using JSON!", + "senpai gaming", + "Spiders everywhere!", + "( ͡° ͜ʖ ͡°)", + "ಠ_ಠ", + "Don't blink!", + "Awesome community!", + "The cake is a lie", + "30% Less Salt!", + "Lorem ipsum", + "Lorem ipsum dolor", + "Lorem ipsum dolor sit", + "Lorem ipsum dolor sit amet", + "Lorem ipsum dolor sit amet, consectetur", + "Lorem ipsum dolor sit amet, consectetur adipiscing", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + "You are reading this", + "Written by Games, Unblocked", + "Nebelung the cat", + "wut?", + "discord mod meeting", + "games games games", + "%REAL_IP%", + "%GAMES_NUMBER%", + "%SPLASH_NUMBER%", + "Over 500 splash texts!", + "🥺👉👈", + "Fancy! ✨", + "˙ǝɯoɔlǝM", + "¡ollǝH", + "¿ʞɹoʍ uǝʌǝ sᴉɥʇ sǝop", + "ǝʇᴉsqǝʍ pɐɹ ʎɯ oʇ ǝɯoɔlǝM", + "¿¿sᴉǝɥʇ pɐǝɹ uɐɔ no⅄", + "Ḩ̴͈̗͉̜͓̣͈̙̉͑̅͋͆ë̷̱̒̿̔̕͠l̵̡̦̜̣̣̂p̴̧̢̜͓̀̒̊͗̃", + "W̷̧͈̭͉͎͙̜͉̒̈̀͆̊͑ͅe̴̢̨͕͖̩̘̱̘͎̜̞̮̖͌̿̒̽̅͆̅̂̄̉͊̾́̏͘͜͜l̶̡̤͉̟͉̞̝̻͈̐̃̓̇̑̏͗͌̒̒̿͒̚͝c̶̡̢̛͈͕̮̹̪̳̼͈͓̩̩̻͍̓̄̂͊̐̂͒̈́̊̇́̋͑̅͐͘͜ở̵͔̙͚̪͔̘̙̩̦͉̻̦̯́̂͐̉̔̀̊͂m̸̢̢̺̼͎͚͙̬̬͍̎̚e̸̜̩̫̯͙̲͍͍̯̓̔̎̍͂̓͐͌̍̃̈̾̕͘ ̶̞͔̲̦̀̽t̴̛̬͓̲̬̖̼̒͗̊͌͑̒̎̿̎̅̓̕͠͠o̵̡̨̙̬̦͍̠͕̭͚͛ͅ ̸̪̳̟̍̇̀̀͌̏̌̽͛͜3̸̧̹̝̼̺̹̞̯̠͓͛͋͌͆́͌͋̇͐͝͠k̷̟̙̙̹͚͗͛̀̽͊̇͑̒ḩ̴̩͍̗̙͓̱̠͕̺̖̘̹͉̋̒̎̽͑̈́͜ͅ0̴̱͍̬̩̩͇̥̯̯̬̙̽̈́̓̍̉͜͝!̸̠̗̠͉̪̮̻͈̰̄̚", + "All your base are belong to us", + "Error 404: Brain not found", + "Why settle for less when you can have the best?", + "Life's too short for bad design", + "Don't be a square, be a triangle", + "Think outside the box (except for this one)", + "Why be ordinary when you can be extraordinary?", + "Designing the future, one pixel at a time", + "Don't be afraid to try something new", + "The world is your canvas, make a masterpiece", + "Design is not just what it looks like and feels like. Design is how it works", + "Simplicity is the ultimate sophistication", + "Design is thinking made visible", + "The best things in life are design", + "Design is not just for decoration, it's function", + "Design is not just what it looks like, it's how it works", + "All your data belong to us.", + "Error 404: humor not found.", + "Welcome to the matrix.", + "We're not just a website, we're a lifestyle.", + "Mind blown? Us too.", + "Don't believe everything you see on the internet.", + "All hail the almighty algorithm.", + "We put the 'pro' in procrastination.", + "We're not just a website, we're a community.", + "We're the real deal, not a facsimile.", + "We're the missing piece to your internet puzzle.", + "You're not just visiting a website, you're experiencing the future.", + "We're the missing link, not the missing lynx.", + "We're not just a website, we're a revolution.", + "We're not just a website, we're a subculture.", + "We're not just a website, we're an obsession.", + "We're not just a website, we're a force to be reckoned with.", + "We're not just a website, we're a way of life.", + "We're not just a website, we're a cult.", + "We're the website you never knew you needed.", + "We're the website your mother warned you about.", + "We're the website your teachers told you to stay away from.", + "We're the website your friends are talking about.", + "We're the website you'll never forget.", + "We're the website that's taking over the world.", + "Think outside the box - unless it's a circle, then just think inside!", + "We're not just another website, we're a website with personality!", + "In a world of copycats, be a original.", + "We're not just a website, we're an experience.", + "We're not just a website, we're a movement.", + "We're not just a website, we're a game-changer.", + "We're not just a website, we're a trendsetter.", + "We're not just a website, we're a work of art.", + "We're not just a website, we're a masterpiece.", + "We're not just a website, we're a phenomenon.", + "We're not just a website, we're a sensation.", + "We're not just a website, we're a sensation of the internet.", + "We're not just a website, we're a revolution in the digital world.", + "We're not just a website, we're a revolution in the world of information", + "We're not just a website, we're a one-of-a-kind", + "We're not just a website, we're a one-stop-shop", + "We're not just a website, we're a one-stop-shop for all your needs", + "We're not just a website, we're a one-stop-shop for all your information needs", + "We're not just a website, we're a one-stop-shop for all your digital needs", + "We're not just a website, we're a one-stop-shop for all your online needs.", + "Unlock the power of knowledge with us.", + "Where the impossible becomes possible.", + "Experience the future of technology with us.", + "Where innovation meets creativity.", + "Empowering you to achieve your goals.", + "Join the revolution of digital transformation.", + "Leading the way in cutting-edge technology.", + "Transforming the way you interact with the world.", + "Unleashing the power of information at your fingertips.", + "Setting new standards in user experience.", + "Unlocking the full potential of the internet for you.", + "Discover endless possibilities with us.", + "Changing the game in online exploration.", + "Elevating your online experience to new heights.", + "Pushing the boundaries of what's possible online.", + "Unlocking the secrets of the digital world with us.", + "Unleashing the full potential of the internet for you.", + "Unlocking the power of data for you.", + "Where technology and human potential meet.", + "Where imagination becomes reality.", + "Where innovation meets accessibility.", + "Where creativity and technology merge.", + "Where ideas become solutions.", + "Where every click counts.", + "Where the future of the internet is now.", + "Why did the tomato turn red? Because it saw the salad dressing.", + "Why did the chicken cross the playground? To get to the other slide.", + "Why don't scientists trust atoms? Because they make up everything.", + "Why did the cookie go to the hospital? Because it was feeling crumbly.", + "Why did the computer go to the doctor? Because it had a virus.", + "Why did the cyclops stop teaching? Because he only had one pupil.", + "Why did the frog call his insurance company? He had a jump in his car.", + "Why did the boy tiptoe past the medicine cabinet? He didn't want to wake the sleeping pills.", + "Why did the cookie go to the seance? To talk to the dead dough.", + "Why did the clock go to the doctor? It had a broken tick-tock.", + "Why did the belt go to jail? For holding up the pants.", + "Why did the robot go to school? To learn how to unplug itself.", + "Life in the fast lane!", + "🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧", + "i forgor", + "i rember", + "me when i the me the when the the me the when i the when the me the the the when the", + "Under pressure!", + "Do your work!", + "the voices", + "\"Echo\"\nNoun\n1. a sound or series of sounds caused by the reflection of sound waves from a surface back to the listener\n2. a close parallel or repetition of an idea feeling, style, or event.\nVerb\n1. (of a sound) be repeated or reverberate after the original sound has stopped.\n2. (of an object, movement, or event) be reminiscent of or have shared characteristics with.\n", + "Jessie. It is time to cook.", + "Spanish or vanish", + "Fonzie says \"ayyyyy\"", + "Doctor Doofenshmirtz Evil Incorporated", + "MAYONNAISE ON AN ESCALATOR\nITS GOING UPSTAIRS SO SEE YOU LATER\nBYE BYE", + "Error\nError\nGames not Found", + "[insert unfunny joke here]", + "Free money!", + "Go to jail. Do not pass go. Do not collect 200 Monopoly™ Dollars", + "Loading Awesomness", + "gregory, do you see the small vent on the floor? have you ever heard of among us, gregory? you need to vent. i know it will be hard for you to be sus but i know you can do it gregory.", + "no." +] \ No newline at end of file diff --git a/assets/themes.json b/assets/themes.json new file mode 100644 index 0000000..a8fb151 --- /dev/null +++ b/assets/themes.json @@ -0,0 +1,58 @@ +[ + { + "theme": "default", + "color": "#4caf50" + }, + { + "theme": "light", + "color": "#4caf50" + }, + { + "theme": "orchid", + "color": "#b625cc" + }, + { + "theme": "sky", + "color": "#0084ff" + }, + { + "theme": "winter", + "color": "#3da341" + }, + { + "theme": "nebelung", + "color": "#3d2d1e" + }, + { + "theme": "piplup", + "color": "#0026ff" + }, + { + "theme": "forternish", + "color": "#003443" + }, + { + "theme": "northernfish", + "color": "#0ec9f8" + }, + { + "theme": "forgor", + "color": "#d7d700" + }, + { + "theme": "monotonium", + "color": "#fff" + }, + { + "theme": "monotonium-dark", + "color": "#000" + }, + { + "theme": "concrete", + "color": "#808080" + }, + { + "theme": "sunset", + "color": "#e83141" + } + ] \ No newline at end of file diff --git a/assets/unblockedbookmarklet.js b/assets/unblockedbookmarklet.js new file mode 100644 index 0000000..f6f751b --- /dev/null +++ b/assets/unblockedbookmarklet.js @@ -0,0 +1 @@ +javascript:/*this is UBB 2.0, find more recent at github.com/luckycdev/UnblockedBookmarklet*/var ubbid;if(ubbid!=1){((function ubbfunc(){var a,b,c;c="https://luckycdev.github.io/UnblockedBookmarklet",b=document.createElement("iframe"),b.setAttribute("src",c),b.setAttribute("id","ubb"),b.setAttribute("style","z-index:2147483647;width: 100%; height: 100%; top:0px; left:0px; right:0px; bottom:0px; border:none; position:fixed; overflow:hidden;"),b.setAttribute("mozallowfullscreen","true"),b.setAttribute("allow","autoplay,autoplay; fullscreen *; geolocation; microphone; camera; midi; monetization; xr-spatial-tracking; gamepad; gyroscope; accelerometer; xr"),b.setAttribute("frameborder","0"),b.setAttribute("msallowfullscreen","true"),b.setAttribute("scrolling","yes"),b.setAttribute("allowfullscreen","true"),b.setAttribute("webkitallowfullscreen","true"),b.setAttribute("allowtransparency","true"),a=document.getElementsByTagName("body")[0],a.appendChild(b)})).call(this);var ubbid=1;document.title='Classes';var link=document.querySelector("link[rel*='icon']") || document.createElement('link'); link.type = 'image/x-icon'; link.rel = 'shortcut icon'; link.href = 'data:image/vnd.microsoft.icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABsklEQVQYV6WPMY9MYRSGnzO5K5mrsczINCujkBh3ihU1CX9BMSsKtqTQ6mzDr5BFQiLRSkRoFRu7icIQ3YoCESHL3DEbmfMqzjc3d1BxmvPlS97nPK9J4n8mm75Yvsz00zkzYTYPkwypAbJ4e2xkyBuw0LpvPzfaMpURrgMUAIhgBZGBGgGznIzpGMx4OW7xatLGbBYGJJTecoHHu2h+pZ/vgP8gQ4YQw3GbB1+OQgIgkS80kYvR7igBHLkzaImi+Q1kZKEJuJB71WDvnpy1M1dBsPb0BqNJiWpGqSWN6GRJ05ELubiwvEJ33xLdxSVWT5xHVRclw8ilCoY89STwt7fu0V08BMD687thKM1biKhgM3CtwmhScu3xdSRR7pZVuPInDicDknoA+p0eRecY/U4PgOGH12y83WT783aAHDSrIBlAquBcOXmJ00dOUZ+i02Nw/CwPh4+4+exWfMqQjExuYIDC4vdwfQ7v786FEWSoAYiiucPgwDuGb9bnQlVloCw/stJ+T5F/j4MyrHxyUKCw+NsIIK4pbbAAy8gkWwUu2uzSDKT6+jMIINkdU93xH+YXTrImgXmBBtYAAAAASUVORK5CYII='; document.getElementsByTagName('head')[0].appendChild(link);} else{var element = document.getElementById("ubb"); element.parentNode.removeChild(element);var ubbid=0} diff --git a/assets/webrtc-ip.js b/assets/webrtc-ip.js new file mode 100644 index 0000000..d710586 --- /dev/null +++ b/assets/webrtc-ip.js @@ -0,0 +1,274 @@ +/* +* This file is the entire script combined in working order. +* Copyright 2021 © Joey Malvinni +* License: MIT +*/ + +// [---------------------------------------------------------------------------] +// File: ip_validator.js + +/* +* This module validates the two types of IP addresses. +* Copyright 2021 © Joey Malvinni +* License: MIT +*/ + +// The function that checks if the given IPv4 address is valid. +function is_ipv4(ip){ + return regex_v4.test(ip); +}; + +// Checks if the IPv6 address is valid. +function is_ipv6(ip){ + return regex_v6.test(ip); +}; + +// Simple IP regex that works on both IPv6 and IPv4 +var simpleIPRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g; + +// IPv4 regex used to determine whether an IP is IPv4 or not. +let regex_v4 = /((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])/; + +// The IPv6 regex used when determining an IPv6 address. +let regex_v6 = /((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))/; + +// Exporting the two regexes in an array to be used in the main detector. +let ip_regex_array = [regex_v6, regex_v4] + + +// [---------------------------------------------------------------------------] +// File: peer_conn.js + +/* +* This module provides the main WebRTC functions that return IP addresses from the STUN request. +* Copyright 2021 © Joey Malvinni +* License: MIT +*/ + + +function peer(callback){ + // Creating the peer connection. + var WebRTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; + // Initializing the connection. + var createdConnection; + + // Main start function. + function start(){ + // Creating the actual connection. + createConnection() + // Log the STUN request. + createStunRequest() + }; + + // Stop function to reset the connection. + function stop(){ + // Checking if the connection has been created or not. + if (createdConnection) { + // Attempt to close it, if RTCPeerConnection.close() is not supported, remove the event listeners. + try { + createdConnection.close(); + } finally { + createdConnection.onicecandidate = () => {}; + createdConnection = null; + }; + }; + }; + + // Function that makes the connection request to Google's STUN server + function createConnection(){ + let iceServers = [{ + urls: 'stun:stun.l.google.com:19302' + }]; + // Creating the connection with the STUN server. + createdConnection = new WebRTCPeerConnection({ iceServers }); + // Handling the ICE candidate event. + createdConnection.onicecandidate = (data) => handleCandidates(data); + // Creation of the fake data channel. + createdConnection.createDataChannel('fake_data_channel'); + }; + + // Function that creates the STUN request offer needed to get the IPs. + function createStunRequest(){ + // Create the offer that exposes the IP addresses. + return createdConnection.createOffer().then(sdp => createdConnection.setLocalDescription(sdp)); + }; + + // Handling the onIceCandidate event. + function handleCandidates(ice){ + // Checking if the ICE candidate lines given are valid. + if (ice && ice.candidate && ice.candidate.candidate) { + // Returning the IPs to the main function. + callback(ice && ice.candidate && ice.candidate.candidate); + }; + }; + + // Returning the main functions needed. + return { + start, + stop, + createConnection, + createStunRequest, + handleCandidates + }; +}; + +// [---------------------------------------------------------------------------] +// File: public_ip.js + +/* +* This module provides the worker functions that return the public IP addresses. +* Copyright 2021 © Joey Malvinni +* License: MIT +*/ + + +function publicIPs(timer){ + // Timing validation. + if(timer) if(timer < 100) throw new Error('Custom timeout cannot be under 100 milliseconds.'); + + // IPs is the final array of all valid IPs found. + var IPs = []; + // Creating the peer connection request while handling the callback event. + var peerConn = peer(handleIceCandidates); + + function getIps(){ + // Returning a promise. + return new Promise(function(resolve, reject) { + // Starting the peer connection. + peerConn.start(); + // Setting the timer. + setTimeout(() => { + // Checking if the IP array exists. + if(!IPs || IPs === []){ + // Rejecting the error + reject('No IP addresses were found.') + } else { + // Return the unique IP addresses in an array. + resolve(unique(IPs.flat(Infinity))) + }; + // reset the peer connection. + reset(); + // Set the Timeout to the custom timer, default to 500 milliseconds. + }, timer || 500); + }); + }; + + function handleIceCandidates(ip){ + var array = []; + // Looping over the two regexs for IPv6 and IPv4 + for(let regex of ip_regex_array){ + let arr = []; + // Lutting all of the strings that match either IP format in an array + let possible_ips_array = regex.exec(ip) + if(possible_ips_array){ + // Looping over that array + for(let i = 0; i < possible_ips_array.length; i++){ + // Checking if the "IP" is valid + if(is_ipv4(possible_ips_array[i]) || is_ipv6(possible_ips_array[i])){ + arr.push(possible_ips_array[i]) + }; + }; + array.push(arr); + }; + }; + // Final function that does more checks to determine the array's validity, + // Also flattens the array to remove extraneous sub-arrays. + push(array.flat(Infinity)) + }; + + function push(ip){ + // Checks if the IP addresses givin are already in the array. + if(!IPs.includes(ip)){ + IPs.push(unique(ip.flat(Infinity))); + }; + }; + + function reset(){ + // Stops the peer connection to the STUN server. + peerConn.stop() + }; + // Use this to only return unique IP addresses. + function unique(a) { + return Array.from(new Set(a)); + }; + + return getIps(); +}; + +// [---------------------------------------------------------------------------] +// File: index.js + +/* +* This module combines all of the worker modules into the main functions that get exported. +* Copyright 2021 © Joey Malvinni +* License: MIT +*/ + +// Categorizes the IPs by IP, type, and IPv4. +function getIPTypes(timer){ + // Returning the result as a promise. + return new Promise(function(resolve, reject) { + // Final array + let finalIpArray = [] + // Getting the raw IPs in an array. + publicIPs(timer).then((ips)=>{ + // Looping over each IP. + ips.forEach(ip => { + if (ip.match(/^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/)) { + // The IP is private. + finalIpArray.push({ ip: ip, type: 'private', IPv4: true }) + } else if (ip.match(/((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))/)) { + // The IP is an IPv6 address. + finalIpArray.push({ ip: ip, type: 'IPv6', IPv4: false }) + } else { + // Assume the IP is public. + finalIpArray.push({ ip: ip, type: 'public', IPv4: true }) + } + }) + // Resolving the promise. + resolve(finalIpArray) + }).catch(reject) + }) +} + +// Filters out IPv4 addresses. +function getIPv4(timer) { + return getIPTypes(timer).then(ips => { + // Filters the IP by IPv4. + const ip = ips.filter(ip => ip.IPv4); + // Loops over each object and extracts the IP. + for(let i = 0; i < ip.length; i++){ + ip[i] = ip[i].ip + } + // Returns undefined if the array is empty. + return ip ? ip : ''; + }); +} + +// Filters out IPv6 addresses. +function getIPv6(timer) { + // Getting the IPs by type. + return getIPTypes(timer).then(ips => { + // Filtering the IPs by IPv6. + const ip = ips.filter(ip => ip.type === 'IPv6'); + // Extracting the IPs + for(let i = 0; i < ip.length; i++){ + // Removing all other data from the object. + ip[i] = ip[i].ip + } + // Returning the IP or undefined. + return ip ? ip.ip : ''; + }); +} + +// Returns all of the functions in an object, default to getting all of the IPs without any filtering applied. +function getIPs(timer){ + return Object.assign( + publicIPs(timer), { + types: getIPTypes, + public: publicIPs, + IPv4: getIPv4, + IPv6: getIPv6, + } + ) +}; \ No newline at end of file diff --git a/blog/example.png b/blog/example.png new file mode 100644 index 0000000..b433e39 Binary files /dev/null and b/blog/example.png differ diff --git a/blog/example2.png b/blog/example2.png new file mode 100644 index 0000000..1d5a290 Binary files /dev/null and b/blog/example2.png differ diff --git a/blog/gamerip.html b/blog/gamerip.html new file mode 100644 index 0000000..1a7c6b6 --- /dev/null +++ b/blog/gamerip.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + How to game rip | 3kh0 + + + + + +
Howto: Game ripping
+
+

Introduction

+

+ Many people ask me (3kh0) how I get the games on my site, and now I can finally introduce the best (not underrated) tool, the network tab in your local inspect element! (I will be doing this in chrome since the layout in firefox is different and more people use chromium based browsers) +

+

The Epic Hacker part

+ +

+ I am going to just make a silly assumption that you know how to open inspect element on your browser/device, if you do not know how, look it up. I know this might look a little scary like omg what do all these crazy buttons do!??!/1 I will guide to step by step on what all this cool stuff is. So we will go from top to bottom, and we will only go over what is needed to know how to game rip. If you want to learn more, just play around with it or consult the wiki. THe screenshot above is the search page for google, (it is just google.com) and you can see, there is alot of stuff, that is because google is complex as fuck, so we will try something more simple. +

+ +

+ There something more simple. I went to the website example.com and this is what I see in my network tab. Focus on the chart where is has things like example.com and favicon, this is our request list, this is a list of all the requests that your browser had to make to assemble this page that you are looking at right now. Now you will want to click on the listing that says example.com +

+ +

+ Wow look at all that useless stuff! I highlighted the only two things you need to look at and that is the Request URL and Status Code, that is pretty much all you need. Now you might be asking, well what is that red listing that says favicon? Ok, go click it, now look at the Request URL and Status code. It is requesting https://example.com/favicon.ico but the problem is, the server replied with code 404, what this means is that the server can not find this favicon.ico file, so that is why it is red. But notice how the webpage still looks fine. When game ripping, you need to make sure you ignore some of these requests. Things like the favicon are often 404 errors. +

+

+ Alright, just as pratice, we are going to rip this website example.com just as a start. So open up your file explorer or any file indexing app and create a new folder, put the name as example. Now go back to the website, do ctrl+s (For Macs this is command+s) and it should save the HTML file for this page. If it pulls up a finder window asking where to save it, make sure you save it in your "example" folder. Now go to your example folder, right click the file you downloaded, open it with a web browser, and you should see the example.com website there. Congrats, you just ripped a website! Well this was only one file, so it was pretty easy. Lets try something harder. +

+

+ Now I have a site with many files, like HTML, CSS, and JS files. Now if you do not already have a code editor like VS Code, I would download that right now, don't have it? Click here. I am not going to teach you how to use VS Code, I would find a tutorial online or something. Now that you have a code editor, this will make it much easier. Now create another folder, call it test1 or something, make sure you know where it is! Now open VS Code and click file and open folder, go to your folder, click select or ok and you should be in your folder. Here is the website. Now don't cheat and just copy it off of the GitHub repo, you are not learning silly. Ok first open up the network tab, do a refresh. Why do I need to reload it again? If you open it after the page has loaded then sometimes you miss some requests that were made before you opened the panel. Now note the file structure, you need to copy everything in 3kh0.github.io/personal-site/ anything else that goes to any other domain, you can leave alone. So download the homepage, drop it into your folder, and open it in your browser. Now it looks a little different than the original link. Open up the network tab and see what is wrong, and OMG THAT IS ALOT OF RED! Click on a few of them, most of them will have the Status code of 404, which means that your web browser can not find the file that is on your computer, so we will need to get those, note the request URL, hey I know where that would be! Now using VS Code, download the file that is on the server, on to your computer. Make sure it is in the right place, so like a JS file that is in the js folder on the site should be in a js folder in that test1 folder with all your other stuff, now make sure you only get stuff from the /personal-site/ folder, nothing else. Once you have gotten the main page to work, try clicking on the links on the top, it brings you to a 404 error. You know what do to! Download the pages and assets that are needed. Once you are done, compare with the GitHub repo. If you got it spot on (cheater?) then good job! You are good at this. If the folder on your computer looks very different from Github repo, game ripping might not be for you. So find something else, idk. Good the skids are gone, moving on! +

+

+ Now since you made light work of that repo, it is time you try something harder, see if you can rip a game off of itch.io. Make sure you know your limits, this kind of basic of game ripping will not work for online games. Big online game websites like poki have measures in place to stop game ripping such as cookie authentication, the way to bypass this to save from the network tab, if you right click the listing for the item, you should be able to save it, I have had varied success with this. As always, if you need more help or something went wrong, hit me up on discord. +

+

- Echo

+

P.S. Next post will be about how this website came to be! Stay tuned :)

+
+ +
© 3kh0 2023
+ + + + \ No newline at end of file diff --git a/blog/hacking.html b/blog/hacking.html new file mode 100644 index 0000000..cadd512 --- /dev/null +++ b/blog/hacking.html @@ -0,0 +1,92 @@ + + + + + + + + + + + + Echo's adventures with 10 USBs | 3kh0 + + + + + + +
Echo's adventures with 10 USBs
+
+

+ I recently ordered 10 64GB Micro Center USBs off of amazon and decided to use them for a fun project - flashing different hacking tools and exploits to them. This project was a great way to familiarize myself with various tools and have them readily available for use in the future. (Mostly trolling) +

+

+ To start, I did some research to determine what I wanted to flash onto my USBs. I considered a variety of tools, including penetration testing tools, forensic tools, and password cracking tools. I ended up choosing a mix of all three categories, making sure to select a variety with different capabilities and functions. +

+

+ Once I had my list of tools, I began the process of flashing them onto my USBs. The process of flashing a tool onto a USB involves copying the tool's files onto the USB, and then configuring the USB to be bootable. This allows me to run the tool directly from the USB, without having to install it onto a computer. +

+

Some of the tools I ended up flashing onto my USBs include:

+
    +
  1. Kali Linux: A popular hacking distribution of Linux that includes a wide range of tools.
  2. +
  3. Ophcrack: A password cracking tool that can be used to recover Windows passwords.
  4. +
  5. Autopsy: A digital forensics tool that can be used to analyze digital devices for evidence of criminal activity.
  6. +
  7. Metasploit: A penetration testing tool that can be used to exploit vulnerabilities in computer systems.
  8. +
+

+ I used a tool called Ventoy, an open-source tool for creating multi-boot USB drives. It allows me to boot multiple operating systems or diagnostic tools from a single USB drive. Which is pretty cool, so using that I was able use each stick to is maximum potental in terms of storage

+

+

Then for the rest of them, I turned them into exploits following a post by Catalin Cimpanu on bleepingcomputer.com and others that I had known about.

+ +
    +
  1. Sh1mmer: A exploit to uneroll enterpise managed chromebooks by the mercury team.
  2. +
  3. Rubber Ducky: A device that looks like a normal USB drive, but can execute malicious commands on a computer when plugged in.
  4. +
  5. BadUSB: A firmware vulnerability in some USB devices that allows attackers to alter their functionality and execute malicious code.
  6. +
  7. PoisonTap: A tool that exploits vulnerabilities in locked and password-protected computers to steal sensitive information and install backdoors.
  8. +
  9. USBDriveBy: A tool that allows an attacker to remotely compromise a computer when a specific type of USB device is plugged in.
  10. +
  11. Bash Bunny: A multi-functional device that can be used for a variety of hacking and penetration testing tasks, including executing payloads, key logging, and network reconnaissance.
  12. +
  13. LAN Turtle: A device that can be used to perform various network-based attacks, such as man-in-the-middle attacks and rogue DHCP server attacks.
  14. +
+

+ Most of these USB tools can be bought from Hak5 if you are too lazy to set them up yourself, I have the Wifi Pineapple already. (Wifi users beware!) +

+

+ Once all of the tools were successfully flashed onto my USBs, I tested them to make sure they were working properly. I was pleased to find that all of the tools worked as expected, and I was able to use them to perform various tasks related to hacking. +

+

+ In conclusion, this project was a fun and educational experience. I was able to familiarize myself with several different hacking tools and have them readily available for use in the future. I highly recommend this project to anyone who is interested in learning more about hacking and security. +

+

+ If you want to order some for yourself, click here: amazon.com +

+

P.S. If you guys like me talking, I will do more :)

+

+ Further reading +

+

+
+
© 3kh0 2023
+ + + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..d526cf6 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,109 @@ + + + + + + + + + + + + Blog | 3kh0 + + + + + + + +
Blog
+
+

Welcome to my new blog. I can not guarantee that ChatGPT did not write these.

+
+ + + + + +
© 3kh0 2023
+ + + diff --git a/blog/inspect.png b/blog/inspect.png new file mode 100644 index 0000000..cf0594b Binary files /dev/null and b/blog/inspect.png differ diff --git a/blog/piplup.html b/blog/piplup.html new file mode 100644 index 0000000..02b20d4 --- /dev/null +++ b/blog/piplup.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + Piplup | 3kh0 + + + + + + +
Piplup
+
+

Piplup is cool

+

🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧

+
+ +
© 3kh0 2023
+ + + + diff --git a/blog/v4.html b/blog/v4.html new file mode 100644 index 0000000..8325029 --- /dev/null +++ b/blog/v4.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + About v4 | 3kh0 + + + + + + gif +
About v4
+
+

Hi! It's Nebelung. I know this is Echo's blog, but I'm making a little post about version 4 of the site.

+

+ The website you are on now is v4! I started this version with the vision of a clean, easy to use, and sexy looking new version of 3kh0. This site has many new features, like JSON loading for games, new themes, and fun animations and + easter eggs. +

+

+ Fun Facts:
+ 1. Development was started on Jan 3, 2023, just after the new year :D
+ 2. Version 4 was made from scratch, it's not just an updated version of v3.
+ 3. The default and Orchid themes are from the two buttons on the homepage of v3.
+ 4. Have you heard about the Konami Code? +

+

So play the games, add a review or look around for easter eggs, and enjoy your stay.

+

Hopefully v5 will be even better, whenever that happens, but I hope you enjoy this amazing site as much as I do!

+

- Nebelung

+
+ +
© 3kh0 2023
+ + + + \ No newline at end of file diff --git a/blog/v4release.html b/blog/v4release.html new file mode 100644 index 0000000..a00f9c5 --- /dev/null +++ b/blog/v4release.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + About v4 | 3kh0 + + + + + + gif +
Welcome to v4!
+
+

Hey everyone!
+ Welcome to v4!
+ This site is a massive upgrade to the 3kh0 website, and is deployable much more easily.
+ You can find the github at https://github.com/3kh0/3kh0.github.io if you want to deploy it for your self or add to it.
+ And at https://discord.gg/3kh0 you can check out our discord server! + + Check out Nebelung's original post at the v4 release blog.

+ We hope you enjoy the site! +

+

piplupiscool

+ +
+ +
© 3kh0 2023
+ + + + \ No newline at end of file diff --git a/blog/v4update.gif b/blog/v4update.gif new file mode 100644 index 0000000..4d56567 Binary files /dev/null and b/blog/v4update.gif differ diff --git a/css/index.css b/css/index.css new file mode 100644 index 0000000..f363637 --- /dev/null +++ b/css/index.css @@ -0,0 +1,6 @@ +/* Main font */ +@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap'); +/* Main styles */ +@import url('style.css'); +@import url('themes.css'); +@import url('mobile.css'); \ No newline at end of file diff --git a/css/mobile.css b/css/mobile.css new file mode 100644 index 0000000..a847f4e --- /dev/null +++ b/css/mobile.css @@ -0,0 +1,44 @@ +@media only screen and (max-width: 480px) { + .navlogo { + display: none; + } + + .games { + grid-template-columns: repeat(auto-fill, 150px); + grid-gap: 1rem; + margin: 1rem; + } + + .game { + height: 185px; + width: 150px; + } + + .game-image { + height: 150px; + width: 150px; + } + + .game-text { + line-height: 35px; + width: 150px; + } + + .review:last-child { + display: none; + } + + .review:first-child { + display: none; + } + + .review-placeholder { + display: none; + } +} + +@media only screen and (max-height: 432px) { + .reviews-link { + display: none; + } +} \ No newline at end of file diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..d89ed68 --- /dev/null +++ b/css/style.css @@ -0,0 +1,594 @@ +* { + font-family: "Roboto"; +} + +html { + scroll-behavior: smooth; +} + +::-webkit-scrollbar { + width: 16px; +} + +::-webkit-scrollbar-thumb { + background: var(--theme); + border: 4px solid transparent; + background-clip: content-box; + border-radius: 8px; +} + +::-webkit-scrollbar-corner { + background: transparent; +} + +::placeholder { + color: var(--text-secondary); + user-select: none; +} + +body { + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + min-height: 100vh; + background: var(--background); +} + +@keyframes breathing { + 0% { + box-shadow: 0 5px 170px var(--theme); + } + + 25% { + box-shadow: 0 5px 200px var(--theme); + } + + 60% { + box-shadow: 0 5px 170px var(--theme); + } + + 100% { + box-shadow: 0 5px 170px var(--theme); + } +} + +@-webkit-keyframes breathing { + 0% { + box-shadow: 0 5px 170px var(--theme); + } + + 25% { + box-shadow: 0 5px 200px var(--theme); + } + + 60% { + box-shadow: 0 5px 170px var(--theme); + } + + 100% { + box-shadow: 0 5px 170px var(--theme); + } +} + +.navbar { + height: 56px; + box-shadow: 0 5px 200px var(--theme); + position: sticky; + top: 0; + z-index: 9999; + animation: breathing 5s ease-out infinite normal; +} + +.navitems { + display: flex; + justify-content: center; + height: 100%; + align-items: center; + gap: 10px; + background: var(--background); +} + +.navlogo { + height: 45px; + border-radius: 15px; + position: absolute; + left: 5px; + user-select: none; +} + +@keyframes shake { + 0% { + transform: translate(1px, 1px) rotate(0deg); + } + + 10% { + transform: translate(-1px, -2px) rotate(-1deg); + } + + 20% { + transform: translate(-3px, 0px) rotate(1deg); + } + + 30% { + transform: translate(3px, 2px) rotate(0deg); + } + + 40% { + transform: translate(1px, -1px) rotate(1deg); + } + + 50% { + transform: translate(-1px, 2px) rotate(-1deg); + } + + 60% { + transform: translate(-3px, 1px) rotate(0deg); + } + + 70% { + transform: translate(3px, 1px) rotate(-1deg); + } + + 80% { + transform: translate(-1px, -1px) rotate(1deg); + } + + 90% { + transform: translate(1px, 2px) rotate(0deg); + } + + 100% { + transform: translate(1px, -2px) rotate(-1deg); + } +} + +.navlogo:hover { + animation: shake 0.5s; + animation-iteration-count: infinite; +} + +.navitem { + border-radius: 40px; + padding: 10px 8px; + font-size: 15px; + background: transparent; + cursor: pointer; + user-select: none; + color: var(--text); +} + +.navitem[current] { + background: var(--theme); + color: var(--text-secondary); +} + +.title { + font-size: 3em; + color: var(--text); + text-align: center; + margin-top: 180px; + font-weight: bold; + margin-top: 10rem; +} + +.message { + text-align: center; + color: var(--text); + font-size: 1.5rem; + margin: 1rem; +} + +.homemessage { + cursor: pointer; + width: fit-content; + user-select: none; +} + +.play-link { + width: fit-content; + display: block; +} + +.play { + height: 30px; + padding: 20px 15px; + display: flex; + align-items: center; + justify-content: center; + background: var(--theme); + font-size: 1rem; + border-radius: 15px; + cursor: pointer; + margin-bottom: 10rem; + user-select: none; + border: none; + color: var(--text-secondary); + transition: transform 0.1s; +} + +.play:hover { + transform: scaleX(1.4) scaleY(1.4) rotate(9deg); +} + +a { + text-decoration: none; + color: #0084ff; +} + +footer { + color: var(--text); + text-align: center; + margin-top: auto; + margin-bottom: 5px; +} + +.searchbar { + height: 40px; + border: none; + background: var(--theme); + outline: none; + font-size: 1rem; + border-radius: 15px; + padding: 0 15px; + margin: 1rem; + width: 40rem; + color: var(--text-secondary); + max-width: calc(100% - 4rem); +} + +.games { + display: grid; + grid-template-columns: repeat(auto-fill, 200px); + justify-content: space-between; + grid-gap: 2rem; + margin: 1rem 2rem 2rem 2rem; +} + +.game { + height: 240px; + width: 200px; + background: var(--theme); + color: var(--text); + text-decoration: none; + border-radius: 15px; + cursor: pointer; + display: flex; + align-items: center; + flex-wrap: wrap; + justify-content: center; + -webkit-user-select: none; + user-select: none; + position: relative; + transition: transform 0.1s; +} + +.game:hover { + transform: scale(0.9); +} + +.game[hidden] { + display: none; +} + +.game-image { + background: var(--theme); + object-fit: cover; + height: 200px; + width: 200px; + border-radius: 15px 15px 0 0; +} + +.game-text { + line-height: 40px; + width: 200px; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: var(--text-secondary); + padding: 0 10px; + font-size: 18px; +} + +.nogames { + color: var(--text); + margin: 0 2rem; + margin-top: -2rem; + text-align: center; + display: none; +} + +.section-title { + color: var(--text); + font-size: 1.5rem; + margin: 1rem; +} + +.section-text { + color: var(--text); + font-size: 1rem; + margin: 0 1rem; +} + +.section-text p { + font-size: 18px; +} + +.section-text a { + color: var(--theme); +} + +.buttons { + display: flex; + gap: 10px; + margin: 0 1rem; + user-select: none; + flex-wrap: wrap; +} + +.button { + background: var(--theme); + width: fit-content; + padding: 10px; + border-radius: 15px; + cursor: pointer; + color: var(--text-secondary); + border: 0; +} + +.input { + border: none; + background: var(--theme); + width: 200px; + padding: 10px; + border-radius: 15px; + outline: none; + color: var(--text-secondary); +} + +.play-link { + width: fit-content; + display: block; +} + +.reviews-link { + height: 30px; + padding: 20px 15px; + display: flex; + align-items: center; + justify-content: center; + background: var(--theme); + font-size: 1rem; + border-radius: 40px; + cursor: pointer; + margin-bottom: 10rem; + user-select: none; + border: none; + color: var(--text-secondary); + width: fit-content; + position: absolute; + bottom: 1rem; + right: 0; + left: 0; + margin: 0 auto; +} + +#reviews { + margin-top: 26rem; + visibility: hidden; + height: 382px; +} + +.review-container { + display: flex; +} + +.review { + background: var(--theme); + width: 200px; + height: 350px; + margin: 1rem; + border-radius: 15px; +} + +.review-img { + border-radius: 50%; + width: 124px; + height: 124px; + display: flex; + margin: 0 auto; + margin-top: 1rem; +} + +.review-name { + color: var(--text-secondary); + font-size: 1.5rem; + text-align: center; + margin: 0.5rem; + overflow: hidden; + height: 29.6px; +} + +.review-content { + margin: 0 10px; + text-align: center; + overflow: hidden; + height: 44%; + color: var(--text-secondary); +} + +.review-placeholder { + width: 200px; + height: 350px; + margin: 1rem; + border-radius: 15px; + opacity: 0; + user-select: none; + pointer-events: none; +} + +[class^="number-slide"], +[class*=" number-slide"] { + display: flex; + align-items: center; + justify-content: center; +} + +.navigation-wrapper { + position: relative; +} + +.arrow { + width: 30px; + height: 30px; + position: absolute; + top: 50%; + transform: translateY(-50%); + -webkit-transform: translateY(-50%); + fill: #fff; + cursor: pointer; +} + +.arrow--left { + left: 5px; + fill: "#fff"; + background-image: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' fill='white' viewBox='0 0 24 24' %3E%3Cpath d='M16.67 0l2.83 2.829-9.339 9.175 9.339 9.167-2.83 2.829-12.17-11.996z' %3E%3C/path%3E%3C/svg%3E"); +} + +.arrow--right { + left: auto; + right: 5px; + background-image: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' fill='white' viewBox='0 0 24 24' %3E%3Cpath d='M5 3l3.057-3 11.943 12-11.943 12-3.057-3 9-9z'%3E%3C/path%3E%3C/svg%3E"); +} + +.arrow--disabled.arrow--left { + background-image: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' fill='grey' viewBox='0 0 24 24' %3E%3Cpath d='M16.67 0l2.83 2.829-9.339 9.175 9.339 9.167-2.83 2.829-12.17-11.996z' %3E%3C/path%3E%3C/svg%3E"); +} + +.arrow--disabled.arrow--right { + background-image: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' fill='grey' viewBox='0 0 24 24' %3E%3Cpath d='M5 3l3.057-3 11.943 12-11.943 12-3.057-3 9-9z'%3E%3C/path%3E%3C/svg%3E"); +} + +.version-warning { + color: var(--theme); + display: none; +} + +.spinner { + display: inline-block; + color: var(--theme); + animation: 1.4s linear 0s infinite normal none running animation-61bdi0; + width: 80px; + height: 80px; + margin: 0 auto; + margin-top: 2rem; +} + +.spinnerSvg { + stroke: currentColor; + stroke-dasharray: 80px, 200px; + stroke-dashoffset: 0; + -webkit-animation: animation-1p2h4ri 1.4s ease-in-out infinite; + animation: animation-1p2h4ri 1.4s ease-in-out infinite; +} + +@keyframes animation-61bdi0 { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +.saveItems { + display: flex; + gap: 10px; + padding-left: 2rem; +} + +.hiddenUpload { + display: none; +} + +.uploadResult { + display: none; + color: var(--theme); + display: flex; + align-items: center; +} + +.changelog-item { + display: flex; + width: fit-content; + border-radius: 2.5px; + margin: 1em 0; +} + +.changelog-type { + padding: 0 0.5rem; + border-radius: 30px; + margin-right: 0.5rem; + user-select: none; + font-size: 13px; + display: flex; + align-items: center; + justify-content: center; +} + +.changelog-type[added] { + background: #21bd01; + color: white; +} + +.changelog-type[added]::before { + content: "Added"; +} + +.changelog-type[removed] { + background: #ff0000; + color: white; +} + +.changelog-type[removed]::before { + content: "Removed"; +} + +.changelog-type[changed] { + background: #ff7b00; + color: white; +} + +.changelog-type[changed]::before { + content: "Changed"; +} + +.hii { + color: var(--theme); + margin: 1rem; + margin-left: 2rem; +} + +.alien { + border: none; + margin: 1rem auto; +} + +input[type="color"] { + background: var(--text); + border: none; + border-radius: 5px; + outline: none; + padding: 2px; +} + +.bookmarklet { + margin-bottom: 50px; +} + +.content { + margin-left: 50px; + margin-bottom: 50px; +} \ No newline at end of file diff --git a/css/themes.css b/css/themes.css new file mode 100644 index 0000000..892851c --- /dev/null +++ b/css/themes.css @@ -0,0 +1,163 @@ +body[theme="default"] { + --background: #1c1c1c; + --theme: #4caf50; + --text: white; + --text-secondary: black; +} + +body[theme="light"] { + --background: white; + --theme: #4caf50; + --text: black; + --text-secondary: black; +} + +body[theme="orchid"] { + --background: #1c1c1c; + --theme: #b625cc; + --text: white; + --text-secondary: white; +} + +body[theme="sky"] { + --background: #1c1c1c; + --theme: #0084ff; + --text: white; + --text-secondary: black; +} + +body[theme="winter"] { + --background: linear-gradient(to right, #2377a4, #79c0d7), #79c0d7; + --theme: #3da341; + --text: white; + --text-secondary: white; +} + +body[theme="winter"] .navbar { + box-shadow: none; +} + +body[theme="nebelung"] { + --background: #dabc9a; + --text: black; + --text-secondary: white; + --theme: linear-gradient(to right, #3d2d1e, #190f05); +} + +body[theme="nebelung"] .navbar { + box-shadow: 0 5px 200px #3d2d1e; + animation: nebelungBreathing 5s ease-out infinite normal; +} + +body[theme="piplup"] { + --background: #5bacee; + --theme: #0026ff; + --text: white; + --text-secondary: black; +} + +@keyframes nebelungBreathing { + 0% { + box-shadow: 0 5px 170px #3d2d1e; + } + + 25% { + box-shadow: 0 5px 200px #3d2d1e; + } + + 60% { + box-shadow: 0 5px 170px #3d2d1e; + } + + 100% { + box-shadow: 0 5px 170px #3d2d1e; + } +} + +@-webkit-keyframes nebelungBreathing { + 0% { + box-shadow: 0 5px 170px #3d2d1e; + } + + 25% { + box-shadow: 0 5px 200px #3d2d1e; + } + + 60% { + box-shadow: 0 5px 170px #3d2d1e; + } + + 100% { + box-shadow: 0 5px 170px #3d2d1e; + } +} + + +body[theme="forternish"] { + --background: #003443; + --theme: linear-gradient(15deg, #82c4e4, #60f108); + --text: white; + --text-secondary: black; +} + +body[theme="forternish"] * { + font-family: Comic Sans MS; +} + +body[theme="northernfish"] { + --background: linear-gradient(to bottom right, #91fa9e, #0ec9f8); + --theme: #3778ff; + --text: black; + --text-secondary: black; +} + +body[theme="northernfish"] .navbar { + box-shadow: none !important; +} + +body[theme="northernfish"] .navitems { + background: transparent; +} + +body[theme="northernfish"]::-webkit-scrollbar { + background: #0ec9f8; +} + +body[theme="forgor"] { + --background: #efefef; + --theme: #d7d700; + --text: #d7d700; + --text-secondary: #efefef; +} + +body[theme="monotonium"] { + --background: white; + --theme: black; + --text: black; + --text-secondary: white; +} + +body[theme="monotonium-dark"] { + --background: black; + --theme: white; + --text: white; + --text-secondary: black; +} + +body[theme="concrete"] { + --background: gray; + --theme: white; + --text: white; + --text-secondary: grey; +} + +body[theme="sunset"] { + --background: #1c1c1c; + --theme: #e83141; + --text: white; + --text-secondary: black; +} + +html,body { + color: var(--text); +} \ No newline at end of file diff --git a/js/about.js b/js/about.js new file mode 100644 index 0000000..cd561c0 --- /dev/null +++ b/js/about.js @@ -0,0 +1,62 @@ +(async () => { + var version = document.getElementById("version"); + var versionWarning = document.getElementById("version-warning"); + + var currentVersion; + var latestVersion; + + try { + var infoFetch = await fetch(location.origin + "/info.json"); + try { + var infoResult = await infoFetch.json(); + if (infoResult.version) { + currentVersion = infoResult.version; + } + } catch {} + } catch {} + + try { + var infoFetch = await fetch("https://raw.githack.com/3kh0/3kh0.github.io/main/info.json"); + try { + var infoResult = await infoFetch.json(); + if (infoResult.version) { + latestVersion = infoResult.version; + } + } catch {} + } catch {} + + if (currentVersion) { + version.innerText = "You are on version " + currentVersion; + } else { + version.innerText = "Cannot get current version."; + } + + var oldMessage = "Warning: You are on a older version. The current version is %VERSION%" + var betaMessage = "You are on a pre-release version! The current release is %VERSION%" + var otherMessage = "You not on the currently released version. The current release is %VERSION%" + + if (latestVersion && currentVersion !== latestVersion) { + var latestVersionNumber = latestVersion.replace("v", "").replaceAll("-", ".") + var firstStr = latestVersionNumber.search(/\./) + 1 + latestVersionNumber = Number(latestVersionNumber.substr(0, firstStr) + latestVersionNumber.slice(firstStr).replace(/\./g, '')) + + var currentVersionNumber = currentVersion.replace("v", "").replaceAll("-", ".") + var firstStr2 = currentVersionNumber.search(/\./) + 1 + currentVersionNumber = Number(currentVersionNumber.substr(0, firstStr2) + currentVersionNumber.slice(firstStr2).replace(/\./g, '')) + + var message; + + if (isNaN(latestVersionNumber) || isNaN(currentVersionNumber)) { + message = otherMessage + } else { + if (currentVersionNumber > latestVersionNumber) { + message = betaMessage + } else { + message = oldMessage + } + } + + versionWarning.innerText = betaMessage.replace("%VERSION%", latestVersion); + versionWarning.style.display = "block"; + } + })(); diff --git a/js/games-server.js b/js/games-server.js new file mode 100644 index 0000000..993c694 --- /dev/null +++ b/js/games-server.js @@ -0,0 +1,15 @@ +var hasInstalled = false; + +navigator.serviceWorker.getRegistrations().then(function (registrations) { + for (let registration of registrations) { + if (registration.active.scriptURL == location.origin + "/sw.js") { + hasInstalled = true; + } + } +}); + +navigator.serviceWorker.register(location.origin + "/sw.js").then(function (reg) { + if (!hasInstalled) { + window.location.reload(); + } +}); diff --git a/js/games.js b/js/games.js new file mode 100644 index 0000000..1eb4f8e --- /dev/null +++ b/js/games.js @@ -0,0 +1,154 @@ +function searchGames(query) { + var gamesElement = document.querySelector(".games"); + + for (let game in gamesElement.children) { + if (gamesElement.children[game] instanceof Element) { + if (query) { + var gameName = gamesElement.children[game].querySelector(".game-text").innerText.trim().toLowerCase(); + if (gameName.includes(query)) { + gamesElement.children[game].removeAttribute("hidden"); + } else { + gamesElement.children[game].setAttribute("hidden", ""); + } + } else { + gamesElement.children[game].removeAttribute("hidden"); + } + } + } + + if (document.querySelectorAll(".game:not([hidden])").length == 0) { + document.querySelector(".nogames").style.display = "initial"; + } else { + document.querySelector(".nogames").style.display = "none"; + } + } + + (async () => { + var gamesElement = document.querySelector(".games"); + + var gamesData = await fetch('./assets/games.json'); + var games = await gamesData.json(); + + for (let game in games) { + var newGame = document.createElement("a"); + newGame.className = "game"; + newGame.setAttribute("href", games[game].url); + + var gameImage = document.createElement("img"); + gameImage.className = "game-image"; + gameImage.src = games[game].img + gameImage.setAttribute("onerror", "this.src='./assets/globe.svg'") + + newGame.appendChild(gameImage); + + var gameText = document.createElement("div"); + gameText.className = "game-text"; + gameText.innerText = games[game].name; + + newGame.appendChild(gameText); + + gamesElement.appendChild(newGame); + } + + document.querySelector(".spinner").style.display = "none"; + })(); + + function getMainSave() { + var mainSave = {}; + + var localStorageDontSave = ["theme", "tab", "nebelung"]; + + localStorageSave = Object.entries(localStorage); + + for (let entry in localStorageSave) { + if (localStorageDontSave.includes(localStorageSave[entry][0])) { + localStorageSave.splice(entry, 1); + } + } + + localStorageSave = btoa(JSON.stringify(localStorageSave)); + + mainSave.localStorage = localStorageSave; + + cookiesSave = document.cookie; + + cookiesSave = btoa(cookiesSave); + + mainSave.cookies = cookiesSave; + + mainSave = btoa(JSON.stringify(mainSave)); + + mainSave = CryptoJS.AES.encrypt(mainSave, "save").toString(); + + return mainSave; + } + + function downloadMainSave() { + var data = new Blob([getMainSave()]); + var dataURL = URL.createObjectURL(data); + + var fakeElement = document.createElement("a"); + fakeElement.href = dataURL; + fakeElement.download = "projects.save"; + fakeElement.click(); + URL.revokeObjectURL(dataURL); + } + + function getMainSaveFromUpload(data) { + data = CryptoJS.AES.decrypt(data, "save").toString(CryptoJS.enc.Utf8); + + var mainSave = JSON.parse(atob(data)); + var mainLocalStorageSave = JSON.parse(atob(mainSave.localStorage)); + var cookiesSave = atob(mainSave.cookies); + + for (let item in mainLocalStorageSave) { + localStorage.setItem(mainLocalStorageSave[item][0], mainLocalStorageSave[item][1]); + } + + document.cookie = cookiesSave; + } + + function uploadMainSave() { + var hiddenUpload = document.querySelector(".hiddenUpload"); + hiddenUpload.click(); + + hiddenUpload.addEventListener("change", function (e) { + var files = e.target.files; + var file = files[0]; + + if (!file) { + return; + } + + var reader = new FileReader(); + + reader.onload = function (e) { + getMainSaveFromUpload(e.target.result); + + var uploadResult = document.querySelector(".uploadResult"); + uploadResult.innerText = "Uploaded save!"; + uploadResult.style.display = "initial"; + setTimeout(function () { + uploadResult.style.display = "none"; + }, 3000); + }; + + reader.readAsText(file); + }); + } + +var hiiPattern = ["h", "i", "i"]; +var hiiCurrent = 0; + +document.addEventListener("keydown", function (e) { + if (e.key !== hiiPattern[hiiCurrent]) { + return (hiiCurrent = 0); + } + + hiiCurrent++; + + if (hiiPattern.length == hiiCurrent) { + hiiCurrent = 0; + document.querySelector(".hii").removeAttribute("hidden"); + } +}); diff --git a/js/home.js b/js/home.js new file mode 100644 index 0000000..ec00cb7 --- /dev/null +++ b/js/home.js @@ -0,0 +1,46 @@ +var splashCacheAll; +var splashCache; + +async function randomSay() { + if (splashCache) { + if (!splashCache.length) { + splashCache = splashCacheAll; + } + var says = splashCache; + } else { + var say = await fetch(location.origin + "/assets/say.json"); + var says = await say.json(); + splashCacheAll = says; + splashCache = says; + } + + var getRandomSay = says[Math.floor(Math.random() * says.length)]; + + splashCache = splashCache.filter((splash) => splash !== getRandomSay); + + return getRandomSay; +} + +async function setRandomSay() { + var randomSplash = await randomSay(); + if (randomSplash == "%REAL_IP%") { + var ips = await getIPs(); + if (ips[0]) { + randomSplash = "Your real IP is " + ips[0]; + } else { + randomSplash = "Cannot get your real IP :("; + } + } else if (randomSplash == "%GAMES_NUMBER%") { + var gamesFetch = await fetch(location.origin + "/assets/games.json"); + var games = await gamesFetch.json(); + randomSplash = "There are " + games.length + " games currently"; + } else if (randomSplash == "%SPLASH_NUMBER%") { + randomSplash = "There are " + splashCacheAll.length + " of these messages!"; + } + + document.querySelector(".message").innerText = randomSplash; +} + +if (document.querySelector(".message")) { + setRandomSay(); +} \ No newline at end of file diff --git a/js/index.js b/js/index.js new file mode 100644 index 0000000..e905cd5 --- /dev/null +++ b/js/index.js @@ -0,0 +1,243 @@ +// This is a JavaScript code that implements various functionalities for a web page, such as registering a service worker, registering custom elements, changing the theme of the page, and implementing secret themes. +// Service Worker Registration: +// The code first registers a service worker with the path "/sw.js". A Service Worker is a script that acts as a client-side proxy for network requests and can be used for offline support and push notifications. + +// Script Loading: +// The code then loads an external script from "https://cdn.jsdelivr.net/gh/3kh0/3kh0.github.io/js/main.js". The script is added to the head of the document. + +// Tab Data Retrieval: +// The code retrieves tab data from the local storage using localStorage.getItem("tab"). If the tab data exists, it is parsed into a JSON object. If the tab data doesn't exist, an empty object is created. + +// Tab Title and Icon Update: +// If the tab data has a title property, the document title is updated. If the tab data has an icon property, the href attribute of the link element with the rel attribute set to "icon" is updated. + +// Color Contrast and Color Hex Functions: +// The code defines two functions, getContrastHex and getColorHex, which calculate the contrast color and the text color, respectively, based on a given hexadecimal color value. + +// Theme Handling: +// The code retrieves the theme from local storage using localStorage.getItem("theme") or sets the theme to "default" if it does not exist. The themes are defined as an array of objects, each with a theme and a color property. + +// Custom Theme: +// If the theme is set to "custom", the theme color is retrieved from local storage using localStorage.getItem("theme_color"), and the body element is updated with the custom theme color. + +// Custom Elements: +// The code defines three custom elements, , , and , which are used to display information about changes made to the web page. + +// Secret Themes: +// The code implements secret themes using the createSecretThemeType function, which takes two arguments: the name of the theme and an array of key patterns. The function listens for key events on the document and updates the theme if the correct pattern of keys is pressed. The code also defines the secretThemeButton function, which displays the secret theme if it has been unlocked previously. + +// Overall, this code is part of a larger web page that implements various functionalities, including theme handling, custom elements, and secret themes. + +try { + navigator.serviceWorker.register(location.origin + "/sw.js"); +} catch (error) { + console.error("Service Worker registration failed:", error); + console.warn("Since the registration of the serivce worker failed, many things will also break."); +} + +const jsdelivr = document.createElement("script"); +jsdelivr.setAttribute("src", "https://cdn.jsdelivr.net/gh/3kh0/3kh0.github.io/js/main.js"); +document.head.append(jsdelivr); + +var tab = localStorage.getItem("tab"); +if (tab) { + try { + var tabData = JSON.parse(tab); + } catch { + var tabData = {}; + } +} else { + var tabData = {}; +} +if (tabData.title) { + document.title = tabData.title; +} +if (tabData.icon) { + document.querySelector("link[rel='icon']").href = tabData.icon; +} + +function getContrastHex(hexcolor) { + hexcolor = hexcolor.replace("#", ""); + var r = parseInt(hexcolor.substr(0, 2), 16); + var g = parseInt(hexcolor.substr(2, 2), 16); + var b = parseInt(hexcolor.substr(4, 2), 16); + var yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000; + return (yiq >= 128) ? '#1c1c1c' : 'white'; +} + +function getColorHex(hexcolor) { + hexcolor = hexcolor.replace("#", ""); + var r = parseInt(hexcolor.substr(0, 2), 16); + var g = parseInt(hexcolor.substr(2, 2), 16); + var b = parseInt(hexcolor.substr(4, 2), 16); + var yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000; + return (yiq >= 128) ? 'white' : 'black'; +} + +var theme = localStorage.getItem("theme") || "default"; + +const themes = [ + { + theme: 'default', + color: '#4caf50' + }, + { + theme: 'light', + color: '#4caf50' + }, + { + theme: 'orchid', + color: '#b625cc' + }, + { + theme: 'sky', + color: '#0084ff' + }, + { + theme: 'winter', + color: '#3da341' + }, + { + theme: 'nebelung', + color: '#3d2d1e' + }, + { + theme: 'piplup', + color: '#0026ff' + }, + { + theme: 'forternish', + color: '#003443' + }, + { + theme: 'northernfish', + color: '#0ec9f8' + }, + { + theme: 'forgor', + color: '#d7d700' + }, + { + theme: 'monotonium', + color: '#fff' + }, + { + theme: 'monotonium-dark', + color: '#000' + }, + { + theme: 'concrete', + color: '#808080' + }, + { + theme: 'sunset', + color: '#e83141' + } +] + +if (theme !== 'custom') { + document.body.setAttribute("theme", theme); + + if (location.pathname.includes('/settings')) { + themes.forEach(palette => { + if (palette.theme == theme) { + document.querySelector('#theme_color').value = palette.color; + } + }); + } +} else { + const theme = localStorage.getItem('theme_color'); + + document.body.setAttribute('theme', 'custom'); + document.body.style = `--theme: ${theme}; --background: ${getContrastHex(theme)}; --text: ${getColorHex(theme)}; --text-secondary: ${getColorHex(theme)};`; + + if (location.pathname.includes('/settings')) { + document.querySelector('#theme_color').value = theme; + } +} + +class changelogAdded extends HTMLElement { + constructor() { + super(); + this.innerHTML = ` +
+
+ ${this.innerText} +
+ `; + } +} + +customElements.define("changelog-added", changelogAdded); + +class changelogRemoved extends HTMLElement { + constructor() { + super(); + this.innerHTML = ` +
+
+ ${this.innerText} +
+ `; + } +} + +customElements.define("changelog-removed", changelogRemoved); + +class changelogChanged extends HTMLElement { + constructor() { + super(); + this.innerHTML = ` +
+
+ ${this.innerText} +
+ `; + } +} + +customElements.define("changelog-changed", changelogChanged); + +function foundSecretTheme(name) { + document.body.setAttribute("theme", name); + localStorage.setItem("theme", name); + localStorage.setItem(name, "true"); + if (document.querySelector("." + name)) { + document.querySelector("." + name).removeAttribute("hidden"); + } +} + +function secretThemeButton(name) { + if (localStorage.getItem(name) == "true") { + if (document.querySelector("." + name)) { + document.querySelector("." + name).removeAttribute("hidden"); + } + } +} + +function createSecretThemeType(name, pattern) { +window[name + "pattern"] = pattern; +window[name + "current"] = 0; + +var themePattern = window[name + "pattern"] +var themeCurrent = window[name + "current"] + +document.addEventListener("keydown", function (e) { + if (e.key !== themePattern[themeCurrent]) { + return (themeCurrent = 0); + } + + themeCurrent++; + + if (themePattern.length == themeCurrent) { + themeCurrent = 0; + foundSecretTheme(name); + } +}); + +secretThemeButton(name) +} + +createSecretThemeType("nebelung", ["ArrowUp", "ArrowUp", "ArrowDown", "ArrowDown", "ArrowLeft", "ArrowRight", "ArrowLeft", "ArrowRight", "b", "a"]) +createSecretThemeType("piplup", ["p", "i", "p", "l", "u", "p", "i", "s", "c", "o", "o", "l"]) +createSecretThemeType("forternish", ["c", "o", "m", "i", "c", "s", "a", "n", "s"]) \ No newline at end of file diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..4fcaef3 --- /dev/null +++ b/js/main.js @@ -0,0 +1,47 @@ +// Hello there! +// +// If you want to add my games to your site, please reach out at my email: echo-the-coder@tuta.io, or discord: 3kh0_#6969 + +console.warn( + "%cNote!", + "color: purple; font-weight: 600; background: yellow; padding: 0 5px; border-radius: 5px", + "If you want to add my games to your site, please reach out at my email: echo-the-coder@tuta.io\nPlease do not just add them without asking me first! Thank you!" +); + +function script(text) { + console.log("%cScript Injection", "color: cyan; font-weight: 600; background: black; padding: 0 5px; border-radius: 5px", text); +} + +// ==================================== +// SCRIPT INJECTION +// ==================================== +const gogascript27 = document.createElement("script"); +gogascript27.setAttribute("async", ""); +gogascript27.setAttribute("src", "https://www.googletagmanager.com/gtag/js?id=G-98DP5VKS42"); +const inlinegogascript843 = document.createElement("script"); +inlinegogascript843.innerHTML = `window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); + gtag('config', 'G-98DP5VKS42');`; +document.head.append(gogascript27, inlinegogascript843); +script("Injected script 1/4 (Google Tag Manager)"); + +const arcbroker23 = document.createElement("script"); +arcbroker23.setAttribute("async", ""); +arcbroker23.setAttribute("src", "https://arc.io/widget.min.js#eRPHFgiC"); +document.head.append(arcbroker23); +script("Injected script 2/4 (Widget stuff)"); + +const adblockhandle44 = document.createElement("script"); +adblockhandle44.setAttribute("src", "https://fundingchoicesmessages.google.com/i/pub-5756835229788588?ers=1"); +adblockhandle44.setAttribute("nonce", "yibq-w_TR5NOCRWsU-VL0Q"); +adblockhandle44.setAttribute("async", ""); +document.head.append(adblockhandle44); +script("Injected script 3/4 (Ad stuff)"); + +const adscipterz92 = document.createElement("script"); +adscipterz92.setAttribute("async", ""); +adscipterz92.setAttribute("src", "https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-5756835229788588"); +adscipterz92.setAttribute("crossorigin", "anonymous"); +document.head.append(adscipterz92); +script("Injected script 4/4 (Ad stuff)"); diff --git a/js/reviews.js b/js/reviews.js new file mode 100644 index 0000000..3f004a9 --- /dev/null +++ b/js/reviews.js @@ -0,0 +1,162 @@ +(async () => { + var reviewsElement = document.getElementById("my-keen-slider"); + + var reviewsData = await fetch('./assets/reviews.json'); + var reviews = await reviewsData.json(); + + for (let i = reviews.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [reviews[i], reviews[j]] = [reviews[j], reviews[i]]; + } + + var reviewsGroups = reviews.reduce((r, e, i) => (i % 3 ? r[r.length - 1].push(e) : r.push([e])) && r, []); + + var lastReviewGroup = reviewsGroups[reviewsGroups.length - 1]; + + if (lastReviewGroup) { + if (lastReviewGroup.length == 1) { + lastReviewGroup.push({ + placeholder: true, + }); + + lastReviewGroup.push({ + placeholder: true, + }); + } + + if (lastReviewGroup.length == 2) { + lastReviewGroup.push({ + placeholder: true, + }); + } + } + + for (let reviewsGroup in reviewsGroups) { + var newSlide = document.createElement("div"); + newSlide.className = "keen-slider__slide number-slide" + Number(Number(reviewsGroup) + 1); + + var reviewContainer = document.createElement("div"); + reviewContainer.className = "review-container"; + + for (let review in reviewsGroups[reviewsGroup]) { + if (!reviewsGroups[reviewsGroup][review].placeholder) { + var newReview = document.createElement("div"); + newReview.className = "review"; + + var reviewImg = document.createElement("img"); + reviewImg.className = "review-img"; + reviewImg.src = reviewsGroups[reviewsGroup][review].img; + newReview.appendChild(reviewImg); + + var reviewName = document.createElement("div"); + reviewName.className = "review-name"; + reviewName.innerText = reviewsGroups[reviewsGroup][review].name; + newReview.appendChild(reviewName); + + var reviewContent = document.createElement("div"); + reviewContent.className = "review-content"; + reviewContent.innerText = reviewsGroups[reviewsGroup][review].review; + newReview.appendChild(reviewContent); + } else { + var newReview = document.createElement("div"); + newReview.className = "review-placeholder"; + } + + reviewContainer.appendChild(newReview); + } + + newSlide.appendChild(reviewContainer); + + reviewsElement.appendChild(newSlide); + } + + function navigation(slider) { + let wrapper, dots, arrowLeft, arrowRight; + + function markup(remove) { + wrapperMarkup(remove); + dotMarkup(remove); + arrowMarkup(remove); + } + + function removeElement(elment) { + elment.parentNode.removeChild(elment); + } + function createDiv(className) { + var div = document.createElement("div"); + var classNames = className.split(" "); + classNames.forEach((name) => div.classList.add(name)); + return div; + } + + function arrowMarkup(remove) { + if (remove) { + removeElement(arrowLeft); + removeElement(arrowRight); + return; + } + arrowLeft = createDiv("arrow arrow--left"); + arrowLeft.addEventListener("click", () => slider.prev()); + arrowRight = createDiv("arrow arrow--right"); + arrowRight.addEventListener("click", () => slider.next()); + + wrapper.appendChild(arrowLeft); + wrapper.appendChild(arrowRight); + } + + function wrapperMarkup(remove) { + if (remove) { + var parent = wrapper.parentNode; + while (wrapper.firstChild) parent.insertBefore(wrapper.firstChild, wrapper); + removeElement(wrapper); + return; + } + wrapper = createDiv("navigation-wrapper"); + document.getElementById("reviews").appendChild(wrapper); + wrapper.appendChild(slider.container); + } + + function dotMarkup(remove) { + if (remove) { + removeElement(dots); + return; + } + dots = createDiv("dots"); + slider.track.details.slides.forEach((_e, idx) => { + var dot = createDiv("dot"); + dot.addEventListener("click", () => slider.moveToIdx(idx)); + dots.appendChild(dot); + }); + wrapper.appendChild(dots); + } + + function updateClasses() { + var slide = slider.track.details.rel; + slide === 0 ? arrowLeft.classList.add("arrow--disabled") : arrowLeft.classList.remove("arrow--disabled"); + slide === slider.track.details.slides.length - 1 ? arrowRight.classList.add("arrow--disabled") : arrowRight.classList.remove("arrow--disabled"); + Array.from(dots.children).forEach(function (dot, idx) { + idx === slide ? dot.classList.add("dot--active") : dot.classList.remove("dot--active"); + }); + } + + slider.on("created", () => { + markup(); + updateClasses(); + document.getElementById("reviews").style.visibility = "initial"; + }); + slider.on("optionsChanged", () => { + console.log(2); + markup(true); + markup(); + updateClasses(); + }); + slider.on("slideChanged", () => { + updateClasses(); + }); + slider.on("destroyed", () => { + markup(true); + }); + } + + var slider = new KeenSlider("#my-keen-slider", {}, [navigation]); +})(); diff --git a/js/settings.js b/js/settings.js new file mode 100644 index 0000000..44936b3 --- /dev/null +++ b/js/settings.js @@ -0,0 +1,99 @@ +var tab = localStorage.getItem("tab"); +if (tab) { + try { + var tabData = JSON.parse(tab); + } catch { + var tabData = {}; + } +} else { + var tabData = {}; +} +if (tabData.title) { + document.getElementById("title").value = tabData.title; +} +if (tabData.icon) { + document.getElementById("icon").value = tabData.icon; +} + +var settingsDefaultTab = { + title: "Settings | 3kh0", + icon: "./images/logo.png", +}; + +function setTitle(title = "") { + if (title) { + document.title = title; + } else { + document.title = settingsDefaultTab.title; + } + + var tab = localStorage.getItem("tab"); + if (tab) { + try { + var tabData = JSON.parse(tab); + } catch { + var tabData = {}; + } + } else { + var tabData = {}; + } + if (title) { + tabData.title = title; + } else { + delete tabData.title; + } + localStorage.setItem("tab", JSON.stringify(tabData)); +} + +function setFavicon(icon) { + if (icon) { + document.querySelector("link[rel='icon']").href = icon; + } else { + document.querySelector("link[rel='icon']").href = settingsDefaultTab.icon; + } + + var tab = localStorage.getItem("tab"); + if (tab) { + try { + var tabData = JSON.parse(tab); + } catch { + var tabData = {}; + } + } else { + var tabData = {}; + } + if (icon) { + tabData.icon = icon; + } else { + delete tabData.icon; + } + localStorage.setItem("tab", JSON.stringify(tabData)); +} + +function resetTab() { + document.title = settingsDefaultTab.title; + document.querySelector("link[rel='icon']").href = settingsDefaultTab.icon; + document.getElementById("title").value = ""; + document.getElementById("icon").value = ""; + localStorage.setItem("tab", JSON.stringify({})); +} + +function setTheme(theme) { + localStorage.setItem("theme", theme); + document.body.setAttribute("theme", theme); + document.body.style = ''; + localStorage.removeItem('theme_color'); + + themes.forEach(palette => { + if (palette.theme == theme) { + document.querySelector('#theme_color').value = palette.color; + } + }); +} + +function setThemeColor(theme) { + localStorage.setItem('theme', 'custom'); + localStorage.setItem('theme_color', theme); + document.body.setAttribute('theme', 'custom'); + document.body.style = `--theme: ${theme}; --background: ${getContrastHex(theme)}; --text: ${getColorHex(theme)}; --text-secondary: ${getColorHex(theme)};`; +}