Compare commits
49 commits
master
...
v6.4_produ
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7f4be9a59 |
||
|
|
19532e62f8 |
||
|
|
0db202d1f0 |
||
|
|
bfc31751dc |
||
|
|
34efae171a |
||
|
|
c3f3126c2a |
||
|
|
26f3eb0dc9 |
||
|
|
a4beabf191 |
||
|
|
91316512c1 |
||
|
|
d1d8e14f68 |
||
|
|
9c00f7ee36 |
||
|
|
f3283e04f1 |
||
|
|
3ecedd58f5 |
||
|
|
bb6c24073d |
||
|
|
2c555a8aa4 |
||
|
|
8f87b56886 |
||
|
|
0778ecbf83 |
||
|
|
32706dd9be |
||
|
|
dc0ff7890b |
||
|
|
961f58af56 |
||
|
|
63a2514dd4 |
||
|
|
4558af2efd |
||
|
|
898c313019 |
||
|
|
8a23d2ad0d |
||
|
|
253f457ba0 |
||
|
|
673c0a37d2 |
||
|
|
35c8b25235 | ||
|
|
df1e03d2c6 |
||
|
|
4645b0140e |
||
|
|
fca2563b15 |
||
|
|
cf8e5d75e4 |
||
|
|
6126f9f74e | ||
|
|
94ba8bce08 | ||
|
|
fa0f0065d0 | ||
|
|
eb7a998a33 | ||
|
|
107b75aca0 | ||
|
|
060a69a9d1 | ||
|
|
25dbf27768 | ||
|
|
b6f976e6ff | ||
|
|
bed7aac10d |
||
|
|
f3ca425a70 |
||
|
|
c71ca40c3d |
||
|
|
53d24d5eda |
||
|
|
7babbc02f7 |
||
|
|
e071a7397e |
||
|
|
dac476fc69 |
||
|
|
2b9c9779fd |
||
|
|
4cb02710e6 |
||
|
|
1e277b2d19 |
35
.github/workflows/ci_production.yml
vendored
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
name: CI-Win-Production
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [v6.4-production]
|
||||
pull_request:
|
||||
branches: [v6.4-production]
|
||||
|
||||
jobs:
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '20.8.0'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
|
||||
- name: Build libraries
|
||||
run: npm run build
|
||||
|
||||
- name: Start server
|
||||
run: npm run workflow-test
|
||||
|
||||
- name: Test server response
|
||||
run: npm test
|
||||
|
||||
- name: Stop server after testing
|
||||
run: npm stop
|
||||
1
.gitignore
vendored
|
|
@ -15,3 +15,4 @@ debug.log
|
|||
/src/.shutdown
|
||||
lib/rammerhead/src/client/hammerhead.min.js
|
||||
lib/rammerhead/src/client/rammerhead.min.js
|
||||
views/archive/gfiles/rarch/roms
|
||||
150
README.md
|
|
@ -5,7 +5,7 @@
|
|||

|
||||

|
||||
|
||||
Holy Unblocker LTS, an experimental web proxy service, can bypass web filters or 'blockers' regardless of whether the method of censorship is client-side or network-based. This includes the potential ability to bypass content blockers overseas, Chrome extensions, localized client firewalls, and network-related filters.
|
||||
Holy Unblocker LTS, an experimental web proxy service, can bypass web filters or 'blockers' regardless of whether the method of censorship is client-side or network-based. This includes the potential ability to bypass content blockers overseas, Chrome extensions, localized client firewalls, and network-related filters. The project even allows the ability to browser Tor/Onion sites in any browser!
|
||||
|
||||
## You can support Holy Unblocker by starring the repository!
|
||||
|
||||
|
|
@ -14,6 +14,22 @@ This project serves mostly as a proof of concept for the ideal clientless soluti
|
|||
Works with a large number of sites, including YouTube, Discord, and more!
|
||||
Also has a good amount of locally hosted games featured on the site.
|
||||
|
||||
#### Current Branch: Production
|
||||
<details><summary>Branch Types</summary>
|
||||
|
||||
- Latest (master; built for FOSS and SEO)
|
||||
- Beta (pending changes; changes that may break things)
|
||||
- Stable (v4, v5, v6; stable version of Holy Unblocker LTS)
|
||||
- Production (changes for self hosting in production settings; max filtering evasion and request handling)
|
||||
</details>
|
||||
|
||||
#### Considering switching branches for self-hosting to a production branch!
|
||||
|
||||
<br>
|
||||
|
||||
> [!CAUTION]
|
||||
> If you are going to self-host Holy Unblocker LTS please switch to the PRODUCTION branch for filter evasion features. The master branch is intended for development work and a highly readable source for developers. You can select a production branch (v6.x_production) via the branches dropdown.
|
||||
|
||||
> [!TIP]
|
||||
> Holy Unblocker LTS is optimized for self-hosting to provide you with maximum privacy control! Fork this repository and consider starring. You can self-host using either free or paid deployment options, or set it up on a dedicated instance (VPS) for enhanced performance.
|
||||
|
||||
|
|
@ -23,13 +39,13 @@ Also has a good amount of locally hosted games featured on the site.
|
|||
| CoolMathGames | Features "Source Randomization" to circumvent major filters effectively along with randomizations to proxy globals |
|
||||
| Discord | Tab title + icon customization using the Settings Menu for improved browsing stealth |
|
||||
| Now.gg | Adblocking support across all websites while surfing |
|
||||
| Reddit.com | SOCKS5 and Onion routing support with Tor within the Settings Menu |
|
||||
| Reddit.com | SOCKS5 and Onion routing support with Tor within the Settings Menu. Use Tor/Onion sites in any browser! |
|
||||
| GeForce NOW | Game library with moderately decent titles and open-source emulation projects |
|
||||
| Spotify | Has frequent support articles for issues relating to various proxy instances |
|
||||
| And essentially all sites! | Built for intensive production loads and speed |
|
||||
|
||||
|
||||
<img src="https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/preview/hu-v6.3.5-preview.png"></img>
|
||||
<img src="https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/preview/hu-v6.4.3-preview.png"></img>
|
||||
<img src="https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/preview/hu-v6.3.0-preview-settings.png"></img>
|
||||
|
||||
Read below for information if the official site is blocked or for obtaining more links. Can't deploy using any of the free options below? Check out Railway or look into cheap, paid VPS hosting solutions.
|
||||
|
|
@ -39,7 +55,7 @@ Read below for information if the official site is blocked or for obtaining more
|
|||
## Deploy Holy Unblocker
|
||||
|
||||
### Free Deployments
|
||||
[](https://app.koyeb.com/deploy?name=holy-unblocker&type=git&repository=QuiteAFancyEmerald%2FHoly-Unblocker&branch=master&builder=buildpack&env%5B%5D=&ports=8080%3Bhttp%3B%2F)
|
||||
[](https://app.koyeb.com/deploy?name=holy-unblocker&type=git&repository=QuiteAFancyEmerald%2FHoly-Unblocker&branch=v6.3_production&builder=buildpack&env%5B%5D=&ports=8080%3Bhttp%3B%2F)
|
||||
[](https://cloud.oracle.com/resourcemanager/stacks/create?zipUrl=https://github.com/BinBashBanana/deploy-buttons/archive/refs/heads/main.zip)
|
||||
|
||||
<details><summary>More</summary>
|
||||
|
|
@ -74,6 +90,13 @@ Replit is no longer free and Heroku has a set policy against web proxies. Try Gi
|
|||
## Table of contents:
|
||||
|
||||
- [Setup](#how-to-setup)
|
||||
- [Terminal](#terminal)
|
||||
- [Project Configuration](#configuration)
|
||||
- [Server Configuration](#server-configuration-setup)
|
||||
- [TOR Routing](#toronion-routing-setup)
|
||||
- [Proxy](#proxy-configuration)
|
||||
- [Client Navigation](#client-navigation-configuration)
|
||||
- [Games Management](#games-management)
|
||||
- [Structure](#structure)
|
||||
- [Structure Information](#structure-information)
|
||||
- [Static Files](#details-of-views)
|
||||
|
|
@ -89,6 +112,12 @@ Replit is no longer free and Heroku has a set policy against web proxies. Try Gi
|
|||
|
||||
## How to Setup
|
||||
|
||||
#### It is highly recommended you switch branches via your IDE to a production released branch. Often the master branch contains unstable or WIP changes.
|
||||
|
||||
#### Example: v6.x_production instead of master
|
||||
|
||||
### Terminal
|
||||
|
||||
Either use the button above to deploy to the deployment options above or type the commands below on a dedicated server:
|
||||
|
||||
```bash
|
||||
|
|
@ -96,19 +125,99 @@ git clone --recurse-submodules https://github.com/titaniumnetwork-dev/Holy-Unblo
|
|||
|
||||
cd Holy-Unblocker
|
||||
|
||||
git submodule init
|
||||
|
||||
# Using the configuration file you can automatically use pm2 if you are hosting on a VPS!
|
||||
npm start
|
||||
|
||||
# Or on subsequent uses...
|
||||
npm restart
|
||||
|
||||
# If you encounter any build errors...
|
||||
npm run build
|
||||
|
||||
# If you encounter any service errors...
|
||||
npm run proxy-validator
|
||||
```
|
||||
|
||||
### It is highly recommended you switch branches via your IDE to a stable released branch. Often the master branch contains unstable or WIP changes.
|
||||
This website is hosted locally with Scramjet, Ultraviolet (Wisp, Bare-Mux, EpoxyTransport, CurlTransport) and Rammerhead built-in.
|
||||
|
||||
#### Example v6.x instead of master
|
||||
### Configuration
|
||||
|
||||
The default place for the proxy when its started is `http://localhost:8080`, but you can change it if needed in `./ecosystem.config.js`. You can also modify the other configuration values at `/src/config.js`
|
||||
#### Server Configuration Setup
|
||||
The default place for the proxy when its started is `http://localhost:8080`, but you can change it if needed in `./ecosystem.config.js`. You can also modify the other configuration values at `./config.json`. To clarify you change the PORT and other production metrics via `./ecosystem.config.js`. Localized changes for source randomization, auto-minify, etc. are located in `./config.json`.
|
||||
|
||||
This website is hosted locally with Ultraviolet and Rammerhead built-in.
|
||||
#### Tor/Onion Routing Setup
|
||||
|
||||
Simply host Tor using this guide: https://tb-manual.torproject.org/installation/
|
||||
|
||||
If you are hosting Holy Unblocker LTS on a VPS utilizing Ubuntu consider attaching Tor to systemctl for easier production management. Once Tor is up and running on either Linux or Windows it will work automatically with Holy Unblocker LTS when enabled by the user via the Settings menu.
|
||||
|
||||
#### Proxy Configuration
|
||||
|
||||
The primary location for tweaking any web proxy related settings assigned via the Settings menu is `./views/assets/js/register-sw.js`. Here you can modify the provided transport options set locally via a cookie, swap out SOCKS5 proxies, change Onion routing ports, specify a blacklist, and more.
|
||||
|
||||
- `stockSW`: The default service worker configuration file for Ultraviolet. For Holy Unblocker however adblocking is automatically enabled so this is not used by default.
|
||||
- `blacklistSW`: A modified version of Ultraviolet that allows for blacklisting domains and adblocking.
|
||||
- `proxyUrl`: Specifies a SOCKS5 protocol URL defaulting to the default Tor proxy port. This can be swapped out with any valid port or SOCK5s proxy.
|
||||
- `transports`: Specifies any provided ports to be swapped via Bare-Mux and utilize Wisp.
|
||||
- `wispUrl`: Modify the pathname or url handling for Wisp
|
||||
- `defaultMode`: Specify the default transport used globally (can be swapped by the users still via the Settings menu)
|
||||
- `ScramjetController`: This contructor allows you to swap out the prefix used for Scramjet dynamically and specify file locations. Note you may need to edit `./views/scram/scramjet.sw` when changing file names.
|
||||
|
||||
#### Client Navigation Configuration
|
||||
|
||||
The primary location for any client side navigation scripts is `./views/assets/js/common.js`. This file is primary used for Omnibox (Search Engine) functionality, swapping proxy options and linking games.
|
||||
|
||||
- `getDomain`: This constant is used for specifying any subdomains to remove when appending a URL into the omnibox.
|
||||
- `goFrame`: This specifies the stealth frame used for Holy Unblocker LTS
|
||||
- `sx`: This constant specifies the search engine you want to be proxied whenever a user types something in that isn't a URL
|
||||
- `search/uvUrl/sjUrl`: These functions specify and parse the queries used for submitted URLs
|
||||
- `RammerheadEncode:` This constant is a dependency for Rammerhead parsing and querying
|
||||
- `urlHandler/asyncUrlHandler`: Used to set functions for the goProx object.
|
||||
- `goProx`: This constant allows for the mapping of URL handling for specific proxies, games or links that need to fall under a web proxy.
|
||||
|
||||
```js
|
||||
const goProx = Object.freeze({
|
||||
ultraviolet: urlHandler(uvUrl),
|
||||
|
||||
scramjet: urlHandler(sjUrl),
|
||||
|
||||
rammerhead: asyncUrlHandler(
|
||||
async (url) => location.origin + (await RammerheadEncode(search(url)))
|
||||
),
|
||||
|
||||
// `location.protocol + "//" + getDomain()` more like `location.origin`
|
||||
|
||||
examplepath: urlHandler(location.protocol + `//c.${getDomain()}/example/`),
|
||||
|
||||
examplesubdomain: urlHandler(location.protocol + '//c.' + getDomain()),
|
||||
|
||||
example: urlHandler(sjUrl('https://example.com')),
|
||||
});
|
||||
```
|
||||
|
||||
- `prSet`: Attaches event listeners using goProx for any buttons or inputs needed
|
||||
|
||||
```js
|
||||
// prSet function code here....
|
||||
|
||||
prSet('pr-uv', 'ultraviolet');
|
||||
prSet('pr-sj', 'scramjet');
|
||||
prSet('pr-rh', 'rammerhead');
|
||||
prSet('pr-yt', 'youtube');
|
||||
prSet('pr-example', 'example');
|
||||
```
|
||||
|
||||
- `huLinks/navLists`: Automatically takes paths stated in `./views/assets/json` and appends them depending on the page and usage. This is used for hiding links that would lead to filter blocks and create an easier system for adding games.
|
||||
|
||||
#### Games Management
|
||||
|
||||
As stated above all game links that need to be appended to a page (including images and descriptions) are managed via the nav files in`./views/assets/json`. When cloning Holy Unblocker utilize `--recurse-submodules` to ensure all submodules are downloaded along with `git submodule init`.
|
||||
|
||||
- `views/archive/g`: Contains any local or external HTML5/web games.
|
||||
- `views/archive/gfiles/flash`: Contains Ruffle (an Adobe Flash emulator) and a collection of flash games linked to an external CDN.
|
||||
- `views/archive/gfiles/rarch`: Contains webretro which is a project that ports RetroArch to WASM. Supports many systems like GBA, N64, etc; ROMS are NOT INCLUDED.
|
||||
|
||||
## Structure
|
||||
|
||||
|
|
@ -133,6 +242,7 @@ WIP
|
|||
- `emulibrary.html`: Games page for emulated games (not included in public release)
|
||||
- `flash.html`: Games page for flash games, credits given to @BinBashBanana and Titanium Network for its assets.
|
||||
- `ultraviolet.html`: TODO
|
||||
- `scramjet.html`: TODO
|
||||
- `rammerhead.html`: TODO
|
||||
- `youtube.html`: A proxied version of Youtube running off the locally hosted Ultraviolet.
|
||||
- `discord.html`: Hub for the Discord proxy.
|
||||
|
|
@ -177,7 +287,7 @@ This will be our nonexhaustive todo list for Holy Unblocker LTS v6.x.x and above
|
|||
- [ ] Ensure all the original submodules get added back to HU-Archive
|
||||
- [x] Mobile support - (welcome screen only, partial/needs work)
|
||||
- [ ] SEO overhaul adapted from the v2 SEO Guide format
|
||||
- [ ] Randomize the \_\_uv$config global, and optionally randomize the UV prefix and URL encoding via cookies
|
||||
- [x] Randomize the \_\_uv$config global, and optionally randomize the UV prefix and URL encoding via cookies
|
||||
|
||||
## Proxy/Site Functionality
|
||||
|
||||
|
|
@ -197,6 +307,9 @@ This will be our nonexhaustive todo list for Holy Unblocker LTS v6.x.x and above
|
|||
- [ ] Update sw.js to support workerware (https://github.com/MercuryWorkshop/workerware)
|
||||
- [ ] Omnibox autoupdate script (for the Google/Bing style auto suggest feature)
|
||||
- [ ] Games library will feature 10000 items; 5000 flash games and 5000 other game types
|
||||
- [ ] Attach proxyvalidatorscript to a status page > have this be served via Fastify, etc. etc; config option disabled as it will cause issues potentially unless if we refactor it slightly.
|
||||
- [ ] Improve adblocking functions on site using AnuraOS standards
|
||||
- [ ] Revamp the Stealth Frame with a slight animation (ease in and then the wheeling loading with a gradient fading away once its loaded or shows the error page LOL), a loading wheel/page and lastly a omnibox widget. It will have like nav buttons, some of the settings from the settings menu, a home button, a button that brings up the Setting menu and be in a designed position. Intent is to reduce the back/forth nature that users have to do currently making it more tedious to use the site.
|
||||
|
||||
## Site Redesign
|
||||
|
||||
|
|
@ -261,6 +374,7 @@ This will be our nonexhaustive todo list for Holy Unblocker LTS v6.x.x and above
|
|||
- Switched to Fastify for serving content from the backend; a separate Express backend file is kept in case it's still needed
|
||||
- Rammerhead is now locally built into the HU LTS repository
|
||||
- Simplified the HU LTS setup process and added more default npm commands
|
||||
- Filter focus via https://gist.github.com/BinBashBanana/a1fd7345e2d86e69d5a532f16cbdbdaa
|
||||
|
||||
## Vague Explanation for Beginners With External Proxies and Hosting
|
||||
|
||||
|
|
@ -279,12 +393,10 @@ After you have selected a decent VPS, use Cloudflare for the DNS records for bot
|
|||
This is an example of DNS records involving Heroku. Self-hosting will require `A records` preferably.
|
||||
<img src="https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/dnssetup.png" width="500"></img>
|
||||
|
||||
- `@` and `www.example.ml` are being used for the local Ultraviolet proxy.
|
||||
- `client.example.ml` is being used for Rammerhead.
|
||||
- `a.example.ml` is being used for womginx.
|
||||
- `cdn.example.ml` is being used for a private Ultraviolet host on the official sites.
|
||||
- `@` and `www.example.ml` are being used for Holy Unblocker LTS.
|
||||
- `client.example.ml` is being used for other instances like Libreddit or Invidious.
|
||||
|
||||
As stated previously, Holy Unblocker is hosted locally with Ultraviolet.
|
||||
As stated previously, Holy Unblocker is hosted locally with Scramjet, Ultraviolet and Rammerhead out of the box. No need for external instances.
|
||||
|
||||
#### Freenom/Domain Steps
|
||||
|
||||
|
|
@ -393,14 +505,16 @@ View the official website for more detail and credits.
|
|||
|
||||
### Web Proxy Sources:
|
||||
|
||||
This project currently uses Ultraviolet, Wisp, Womginx, and Rammerhead, linked below.
|
||||
This project currently uses Scramjet and Ultraviolet as web proxies adhering to the Wisp protocol. Bare-Mux is utilized for swapping transport systems to be utilized with Wisp. The included transport systems are EpoxyTransport and libcurl-transport. Rammerhead is also provided as an additional web proxy option.
|
||||
|
||||
- <a href="https://github.com/MercuryWorkshop/scramjet">Scramjet</a>
|
||||
- <a href="https://github.com/titaniumnetwork-dev/Ultraviolet">Ultraviolet</a>
|
||||
- <a href="https://github.com/binary-person/womginx">Womginx</a>
|
||||
- <a href="https://github.com/binary-person/rammerhead">Rammerhead</a>
|
||||
- <a href="https://github.com/MercuryWorkshop/wisp-server-node">Wisp</a>
|
||||
- <a href="https://github.com/MercuryWorkshop/EpoxyTransport">EpoxyTransport</a>
|
||||
- <a href="https://github.com/MercuryWorkshop/CurlTransport">libcurl-transport</a>
|
||||
- <a href="https://github.com/MercuryWorkshop/bare-mux">Bare-Mux</a>
|
||||
- <a href="https://github.com/tomphttp/bare-server-node">TOMP Bare Server</a>
|
||||
- <a href="https://github.com/binary-person/rammerhead">Rammerhead</a>
|
||||
- <a href="https://gist.github.com/BinBashBanana/a1fd7345e2d86e69d5a532f16cbdbdaa">DetectorDetector</a>
|
||||
|
||||
### Other Dependencies:
|
||||
|
||||
|
|
|
|||
1
TODO.md
|
|
@ -38,6 +38,7 @@ This will be our nonexhaustive todo list for Holy Unblocker LTS v6.x.x and above
|
|||
- [ ] Games library will feature 10000 items; 5000 flash games and 5000 other game types
|
||||
- [ ] Attach proxyvalidatorscript to a status page > have this be served via Fastify, etc. etc; config option disabled as it will cause issues potentially unless if we refactor it slightly.
|
||||
- [ ] Improve adblocking functions on site using AnuraOS standards
|
||||
- [ ] Revamp the Stealth Frame with a slight animation (ease in and then the wheeling loading with a gradient fading away once its loaded or shows the error page LOL), a loading wheel/page and lastly a omnibox widget. It will have like nav buttons, some of the settings from the settings menu, a home button, a button that brings up the Setting menu and be in a designed position. Intent is to reduce the back/forth nature that users have to do currently making it more tedious to use the site.
|
||||
|
||||
## Site Redesign
|
||||
|
||||
|
|
|
|||
2
app.json
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "Holy Unblocker v6.3.9",
|
||||
"name": "Holy Unblocker v6.4.3",
|
||||
"description": "Holy Unblocker is a secure web proxy service supporting numerous sites while concentrating on detail with design, mechanics, and features. Bypass web filters regardless of whether it is an extension or network-based.",
|
||||
"repository": "https://github.com/titaniumnetwork-dev/Holy-Unblocker",
|
||||
"logo": "https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/icon.png",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"title": "HU LTS",
|
||||
"host": "0.0.0.0",
|
||||
"minifyScripts": false,
|
||||
"minifyScripts": true,
|
||||
"randomizeIdentifiers": true,
|
||||
"production": false
|
||||
}
|
||||
152
detectordetector.js
Normal file
20
lib/rammerhead/package-lock.json
generated
|
|
@ -464,10 +464,21 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@types/minimatch": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
|
||||
"integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"optional": true
|
||||
"version": "22.8.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.7.tgz",
|
||||
"integrity": "sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"undici-types": "~6.19.8"
|
||||
}
|
||||
},
|
||||
"node_modules/abstract-logging": {
|
||||
"version": "2.0.1",
|
||||
|
|
@ -4789,6 +4800,13 @@
|
|||
"node": ">=0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "6.19.8",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
|
||||
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/uuid": {
|
||||
"version": "8.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||
|
|
|
|||
2
lib/rammerhead/src/client/hammerhead.min.js
vendored
4
lib/rammerhead/src/client/rammerhead.min.js
vendored
2256
package-lock.json
generated
28
package.json
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "holyunblocker",
|
||||
"version": "6.3.9",
|
||||
"version": "6.4.3",
|
||||
"repository": "https://github.com/QuiteAFancyEmerald/Holy-Unblocker",
|
||||
"description": "Holy Unblocker is a secure web proxy service with support for many sites.",
|
||||
"main": "backend.js",
|
||||
|
|
@ -27,24 +27,24 @@
|
|||
"author": "Titanium Network",
|
||||
"license": "GNU AFFERO",
|
||||
"dependencies": {
|
||||
"@fastify/helmet": "^11.1.1",
|
||||
"@fastify/static": "^7.0.4",
|
||||
"@mercuryworkshop/bare-as-module3": "^2.2.2",
|
||||
"@mercuryworkshop/bare-mux": "^2.0.9",
|
||||
"@mercuryworkshop/epoxy-transport": "^2.1.13",
|
||||
"@mercuryworkshop/libcurl-transport": "^1.3.10",
|
||||
"@titaniumnetwork-dev/ultraviolet": "~3.2.7",
|
||||
"@tomphttp/bare-server-node": "^2.0.3",
|
||||
"axios": "^1.7.2",
|
||||
"fastify": "^4.28.1",
|
||||
"@fastify/helmet": "^12.0.1",
|
||||
"@fastify/static": "^8.0.2",
|
||||
"@mercuryworkshop/bare-as-module3": "^2.2.5",
|
||||
"@mercuryworkshop/bare-mux": "^2.1.6",
|
||||
"@mercuryworkshop/epoxy-transport": "^2.1.26",
|
||||
"@mercuryworkshop/libcurl-transport": "^1.3.12",
|
||||
"@titaniumnetwork-dev/ultraviolet": "~3.2.10",
|
||||
"@tomphttp/bare-server-node": "^2.0.5",
|
||||
"axios": "^1.7.7",
|
||||
"fastify": "^5.1.0",
|
||||
"mime-types": "^2.1.35",
|
||||
"pm2": "^5.4.2",
|
||||
"puppeteer": "^22.12.1",
|
||||
"puppeteer": "^23.7.1",
|
||||
"wisp-server-node": "^1.1.7",
|
||||
"ws": "^8.18.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/node": "^7.25.0",
|
||||
"esbuild": "^0.23.0"
|
||||
"@babel/node": "^7.26.0",
|
||||
"esbuild": "^0.24.0"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -331,4 +331,4 @@ xx xx
|
|||
}
|
||||
};
|
||||
|
||||
testServerResponse();
|
||||
testServerResponse();
|
||||
|
|
@ -7,10 +7,10 @@ import ecosystem from './ecosystem.config.js';
|
|||
// Some necessary constants are copied over from /src/server.mjs.
|
||||
|
||||
const config = Object.freeze(
|
||||
JSON.parse(await readFile(new URL('./src/config.json', import.meta.url)))
|
||||
JSON.parse(await readFile(new URL('./config.json', import.meta.url)))
|
||||
),
|
||||
ecosystemConfig = Object.freeze(
|
||||
ecosystem.apps.find((app) => app.name === 'HolyUB') || ecosystem.apps[0]
|
||||
ecosystem.apps.find((app) => app.name === 'HolyUBLTS') || ecosystem.apps[0]
|
||||
);
|
||||
|
||||
const serverUrl = ((base) => {
|
||||
|
|
@ -121,7 +121,8 @@ commands: for (let i = 2; i < process.argv.length; i++)
|
|||
await mkdir(dist);
|
||||
await build({
|
||||
entryPoints: [
|
||||
'./views/uv/**/*.js',
|
||||
'./views/network/**/*.js',
|
||||
'./views/worker/**/*.js',
|
||||
'./views/assets/js/**/*.js',
|
||||
'./views/assets/css/**/*.css',
|
||||
],
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
"Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2"
|
||||
],
|
||||
"splash": [
|
||||
"This version is the public HU LTS build of the web proxy service project and being worked on (master branch)! Stuff will NOT work!"
|
||||
"This version is the public HU LTS build of the web proxy service project and being worked on (v6.4_production branch)! Stuff will NOT work!"
|
||||
],
|
||||
"version": ["6.3.9"]
|
||||
}
|
||||
"version": ["6.4.3"]
|
||||
}
|
||||
135
src/express.mjs
|
|
@ -1,135 +0,0 @@
|
|||
import { paintSource, tryReadFile } from './randomization.mjs';
|
||||
import loadTemplates from './templates.mjs';
|
||||
import pkg from './routes.mjs';
|
||||
import { readFile } from 'fs/promises';
|
||||
import path from 'path';
|
||||
import express from 'express';
|
||||
import helmet from 'helmet';
|
||||
import http from 'http';
|
||||
import createRammerhead from 'rammerhead/src/server/index.js';
|
||||
import wisp from 'wisp-server-node';
|
||||
import { epoxyPath } from '@mercuryworkshop/epoxy-transport';
|
||||
import { libcurlPath } from '@mercuryworkshop/libcurl-transport';
|
||||
import { bareModulePath } from '@mercuryworkshop/bare-as-module3';
|
||||
import { baremuxPath } from '@mercuryworkshop/bare-mux/node';
|
||||
import { uvPath } from '@titaniumnetwork-dev/ultraviolet';
|
||||
// import { createBareServer } from "@tomphttp/bare-server-node";
|
||||
|
||||
const config = JSON.parse(
|
||||
await readFile(new URL('./config.json', import.meta.url))
|
||||
),
|
||||
{ pages, text404 } = pkg,
|
||||
__dirname = path.resolve(),
|
||||
port = process.env.PORT || config.port,
|
||||
app = express(),
|
||||
router = express.Router(),
|
||||
// bare = createBareServer("/bare/"),
|
||||
rh = createRammerhead();
|
||||
|
||||
const rammerheadScopes = [
|
||||
'/rammerhead.js',
|
||||
'/hammerhead.js',
|
||||
'/transport-worker.js',
|
||||
'/task.js',
|
||||
'/iframe-task.js',
|
||||
'/worker-hammerhead.js',
|
||||
'/messaging',
|
||||
'/sessionexists',
|
||||
'/deletesession',
|
||||
'/newsession',
|
||||
'/editsession',
|
||||
'/needpassword',
|
||||
'/syncLocalStorage',
|
||||
'/api/shuffleDict',
|
||||
'/mainport',
|
||||
];
|
||||
|
||||
const rammerheadSession = /^\/[a-z0-9]{32}/,
|
||||
shouldRouteRh = (req) => {
|
||||
const url = new URL(req.url, 'http://0.0.0.0');
|
||||
return (
|
||||
rammerheadScopes.includes(url.pathname) ||
|
||||
rammerheadSession.test(url.pathname)
|
||||
);
|
||||
},
|
||||
routeRhRequest = (req, res) => {
|
||||
rh.emit('request', req, res);
|
||||
},
|
||||
routeRhUpgrade = (req, socket, head) => {
|
||||
rh.emit('upgrade', req, socket, head);
|
||||
},
|
||||
server = http.createServer((req, res) => {
|
||||
/*
|
||||
if (bare.shouldRoute(req)) {
|
||||
bare.routeRequest(req, res);
|
||||
} else
|
||||
*/
|
||||
if (shouldRouteRh(req)) {
|
||||
routeRhRequest(req, res);
|
||||
} else {
|
||||
app(req, res);
|
||||
}
|
||||
});
|
||||
|
||||
server.on('upgrade', (req, socket, head) => {
|
||||
/*
|
||||
if (bare.shouldRoute(req)) {
|
||||
bare.routeUpgrade(req, socket, head);
|
||||
} else
|
||||
*/
|
||||
if (shouldRouteRh(req)) {
|
||||
routeRhUpgrade(req, socket, head);
|
||||
} else if (req.url.endsWith('/wisp/')) {
|
||||
wisp.routeRequest(req, socket, head);
|
||||
}
|
||||
});
|
||||
|
||||
// Apply Helmet middleware for security.
|
||||
app.use(
|
||||
helmet({
|
||||
contentSecurityPolicy: false, // Disable CSP
|
||||
})
|
||||
);
|
||||
|
||||
/* All website files are stored in the /views directory.
|
||||
* This takes one of those files and displays it for a site visitor.
|
||||
* Query strings like /?j are converted into paths like /views/hidden.html
|
||||
* back here. Which query string converts to what is defined in routes.mjs.
|
||||
*/
|
||||
router.get('/', async (req, res) =>
|
||||
res.send(
|
||||
paintSource(
|
||||
loadTemplates(
|
||||
tryReadFile(
|
||||
path.join(
|
||||
__dirname,
|
||||
'views',
|
||||
// Return the error page if the query is not found in
|
||||
// routes.mjs. Also set index as the default page.
|
||||
'/?'.indexOf(req.url)
|
||||
? pages[Object.keys(req.query)[0]] || 'error.html'
|
||||
: pages.index
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
app.use(router);
|
||||
app.use(express.static(path.join(__dirname, 'views')));
|
||||
app.use('/uv/', express.static(uvPath));
|
||||
app.use('/epoxy/', express.static(epoxyPath));
|
||||
app.use('/libcurl/', express.static(libcurlPath));
|
||||
app.use('/bareasmodule/', express.static(bareModulePath));
|
||||
app.use('/baremux/', express.static(baremuxPath));
|
||||
|
||||
app.disable('x-powered-by');
|
||||
|
||||
// Redundant code since 404 is handled elsewhere; left here as insurance.
|
||||
app.use((req, res) => {
|
||||
res.status(404).send(paintSource(loadTemplates(text404)));
|
||||
});
|
||||
|
||||
server.listen(port);
|
||||
console.log('Holy Unblocker is listening on port ' + port + '.');
|
||||
|
|
@ -24,10 +24,12 @@ const randomListItem = (lis) => () => lis[(Math.random() * lis.length) | 0],
|
|||
hutaoInsert = (str) => str.replaceAll('<!--HUTAOWOA-->', getRandomSplash),
|
||||
versionInsert = (str) => str.replaceAll('<!-- VERSION -->', VersionValue),
|
||||
getCookingText = () =>
|
||||
`<span style="display:none" data-fact="${randomListItem(vegetables)()}">${randomListItem(cookingInserts)()}</span>`,
|
||||
`<span style="display:none" data-fact="${randomListItem(
|
||||
vegetables
|
||||
)()}">${randomListItem(cookingInserts)()}</span>`,
|
||||
insertCooking = (str) =>
|
||||
str.replaceAll(
|
||||
'<!-- IMPORTANT-HUTAOCOOKINGINSERT-DONOTDELETE -->',
|
||||
'<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->',
|
||||
getCookingText
|
||||
),
|
||||
// This one isn't for obfuscation; it's just for dealing with cache issues.
|
||||
|
|
@ -45,44 +47,9 @@ const randomListItem = (lis) => () => lis[(Math.random() * lis.length) | 0],
|
|||
tryReadFile = (file, baseUrl) => {
|
||||
file = fileURLToPath(new URL(file, baseUrl));
|
||||
return existsSync(file + '')
|
||||
? readFileSync(file + '', 'utf8')
|
||||
? readFileSync(
|
||||
file + '',
|
||||
/\.(?:ico|png|jpg|jpeg)$/.test(file) ? undefined : 'utf8'
|
||||
)
|
||||
: preloaded404;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
All of this is now old code.
|
||||
The newer versions of these functions are directly above.
|
||||
|
||||
function randomListItem(lis) {
|
||||
return lis[Math.floor(Math.random() * lis.length)];
|
||||
}
|
||||
|
||||
function insertCharset(str) {
|
||||
return str.replace(/­|​|­|<wbr>/g, function() { return randomListItem(charRandom); });
|
||||
}
|
||||
|
||||
function hutaoInsert(str) {
|
||||
return str.replace(/<!--HUTAOWOA-->/g, function() { return randomListItem(splashRandom); });
|
||||
}
|
||||
|
||||
function insertCooking(str) {
|
||||
return str.replace(/<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->/g, function() { return '<span style="display: none;" data-fact="' + randomListItem(vegetables) + '" data-type="' + randomListItem(vegetables) + '">' + randomListItem(cookingInserts) + '</span>'; }); // this needs to be inside a function, so that not every string is the same
|
||||
}
|
||||
|
||||
function cacheBusting(str) {
|
||||
for (var item of Object.entries(cacheBustList)) {
|
||||
str = str.replace(new RegExp(item[0], "g"), item[1]);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
export function paintSource(str) {
|
||||
return insertCharset(hutaoInsert(insertCooking(cacheBusting(str))));
|
||||
}
|
||||
|
||||
export function tryReadFile(file) {
|
||||
return existsSync(file) ? readFileSync(file, 'utf8') : text404;
|
||||
}
|
||||
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -26,14 +26,16 @@ const pages = {
|
|||
bookmarklets: 'pages/nav/bookmarklets.html',
|
||||
terms: 'pages/nav/terms.html',
|
||||
/* Games */
|
||||
games: 'pages/nav/gtools.html',
|
||||
'web-games': 'pages/nav/games5.html',
|
||||
emulators: 'pages/nav/emulators.html',
|
||||
'flash-games': 'pages/nav/flash.html',
|
||||
'retro-games': 'pages/nav/emulibrary.html',
|
||||
g: 'pages/nav/gtools.html',
|
||||
e: 'pages/nav/games5.html',
|
||||
c: 'pages/nav/emulators.html',
|
||||
f: 'pages/nav/flash.html',
|
||||
d: 'pages/nav/emulibrary.html',
|
||||
/* Proxies */
|
||||
ultraviolet: 'pages/proxnav/ultraviolet.html',
|
||||
rammerhead: 'pages/proxnav/rammerhead.html',
|
||||
a: 'pages/proxnav/ultraviolet.html',
|
||||
j: 'pages/proxnav/scramjet.html',
|
||||
uverror: 'pages/proxnav/ultraviolet-error.html',
|
||||
b: 'pages/proxnav/rammerhead.html',
|
||||
/* Proxy Presets */
|
||||
youtube: 'pages/proxnav/preset/youtube.html',
|
||||
apps: 'pages/proxnav/preset/applications.html',
|
||||
|
|
@ -41,24 +43,29 @@ const pages = {
|
|||
flash: 'archive/gfiles/flash/index.html',
|
||||
webretro: 'archive/gfiles/rarch/index.html',
|
||||
'vibe-os': 'archive/vibeOS/index.html',
|
||||
'robots.txt': 'robots.txt',
|
||||
'sitemap.xml': 'sitemap.xml',
|
||||
'browserconfig.xml': 'browserconfig.xml',
|
||||
'favicon.ico': 'favicon.ico',
|
||||
};
|
||||
|
||||
const externalPages = {
|
||||
github: {
|
||||
default: 'https://github.com/QuiteAFancyEmerald/Holy-Unblocker',
|
||||
aos: 'https://github.com/michalsnik/aos',
|
||||
'bare-module': 'https://github.com/motortruck1221/bare-as-module3',
|
||||
'bare-mux': 'https://github.com/MercuryWorkshop/bare-mux',
|
||||
epoxy: 'https://github.com/MercuryWorkshop/epoxy-tls',
|
||||
bam: 'https://github.com/motortruck1221/bare-as-module3',
|
||||
bm: 'https://github.com/MercuryWorkshop/bare-mux',
|
||||
ep: 'https://github.com/MercuryWorkshop/epoxy-tls',
|
||||
fastify: 'https://github.com/fastify/fastify',
|
||||
'font-awesome': 'https://github.com/FortAwesome/Font-Awesome',
|
||||
'libcurl-js': 'https://github.com/ading2210/libcurl.js',
|
||||
lj: 'https://github.com/ading2210/libcurl.js',
|
||||
'nord-theme': 'https://github.com/nordtheme',
|
||||
ultraviolet: 'https://github.com/titaniumnetwork-dev/Ultraviolet',
|
||||
wisp: 'https://github.com/MercuryWorkshop/wisp-protocol',
|
||||
config: 'https://github.com/titaniumnetwork-dev/Ultraviolet',
|
||||
wm: 'https://github.com/MercuryWorkshop/wisp-protocol',
|
||||
},
|
||||
'titaniumnetwork-documentation': 'https://docs.titaniumnetwork.org',
|
||||
'rammerhead-discord': 'https://discord.gg/VNT4E7gN5Y',
|
||||
'config-docs': 'https://docs.titaniumnetwork.org',
|
||||
'config-chat': 'https://discord.gg/VNT4E7gN5Y',
|
||||
nt: 'https://nordtheme.com',
|
||||
};
|
||||
|
||||
const cookingInserts = insert.content,
|
||||
|
|
@ -67,8 +74,8 @@ const cookingInserts = insert.content,
|
|||
splashRandom = insert.splash,
|
||||
VersionValue = insert.version,
|
||||
cacheBustList = {
|
||||
'styles.css': 'styles-1644738239.css',
|
||||
'common.js': 'common-16451543478.js',
|
||||
'styles.css': 'styles-1735118314.css',
|
||||
'common.js': 'common-1735118314.js',
|
||||
};
|
||||
|
||||
export default {
|
||||
|
|
|
|||
108
src/server.mjs
|
|
@ -19,10 +19,10 @@ import { existsSync, unlinkSync } from 'node:fs';
|
|||
import ecosystem from '../ecosystem.config.js';
|
||||
|
||||
const config = Object.freeze(
|
||||
JSON.parse(await readFile(new URL('./config.json', import.meta.url)))
|
||||
JSON.parse(await readFile(new URL('../config.json', import.meta.url)))
|
||||
),
|
||||
ecosystemConfig = Object.freeze(
|
||||
ecosystem.apps.find((app) => app.name === 'HolyUB') || ecosystem.apps[0]
|
||||
ecosystem.apps.find((app) => app.name === 'HolyUBLTS') || ecosystem.apps[0]
|
||||
),
|
||||
{ pages, externalPages } = pageRoutes,
|
||||
__dirname = path.resolve();
|
||||
|
|
@ -131,6 +131,47 @@ app.register(fastifyStatic, {
|
|||
decorateReply: false,
|
||||
});
|
||||
|
||||
app.register(fastifyStatic, {
|
||||
root: fileURLToPath(
|
||||
new URL('../views/archive/gfiles/rarch', import.meta.url)
|
||||
),
|
||||
prefix: '/serving/',
|
||||
decorateReply: false,
|
||||
});
|
||||
|
||||
app.register(fastifyStatic, {
|
||||
root: fileURLToPath(
|
||||
new URL('../views/archive/gfiles/rarch/cores', import.meta.url)
|
||||
),
|
||||
prefix: '/cores/',
|
||||
decorateReply: false,
|
||||
});
|
||||
|
||||
app.register(fastifyStatic, {
|
||||
root: fileURLToPath(
|
||||
new URL('../views/archive/gfiles/rarch/info', import.meta.url)
|
||||
),
|
||||
prefix: '/info/',
|
||||
decorateReply: false,
|
||||
});
|
||||
|
||||
app.register(fastifyStatic, {
|
||||
root: fileURLToPath(
|
||||
new URL('../views/archive/gfiles/rarch/cores', import.meta.url)
|
||||
),
|
||||
prefix: '/uauth/',
|
||||
decorateReply: false,
|
||||
});
|
||||
|
||||
// NEVER commit roms due to piracy concerns
|
||||
app.register(fastifyStatic, {
|
||||
root: fileURLToPath(
|
||||
new URL('../views/archive/gfiles/rarch/roms', import.meta.url)
|
||||
),
|
||||
prefix: '/roms/',
|
||||
decorateReply: false,
|
||||
});
|
||||
|
||||
app.register(fastifyStatic, {
|
||||
root: fileURLToPath(
|
||||
new URL(
|
||||
|
|
@ -162,13 +203,29 @@ app.register(fastifyStatic, {
|
|||
fileURLToPath(
|
||||
new URL(
|
||||
// Use the pre-compiled, minified scripts instead, if enabled in config.
|
||||
config.minifyScripts ? '../views/dist/uv' : '../views/uv',
|
||||
config.minifyScripts ? '../views/dist/network' : '../views/network',
|
||||
import.meta.url
|
||||
)
|
||||
),
|
||||
uvPath,
|
||||
],
|
||||
prefix: '/uv/',
|
||||
prefix: '/network/',
|
||||
decorateReply: true,
|
||||
});
|
||||
|
||||
// This combines scripts from the official scramjet repository with local scramjet scripts into
|
||||
// one directory path. Local versions of files override the official versions.
|
||||
app.register(fastifyStatic, {
|
||||
root: [
|
||||
fileURLToPath(
|
||||
new URL(
|
||||
// Use the pre-compiled, minified scripts instead, if enabled in config.
|
||||
config.minifyScripts ? '../views/dist/worker' : '../views/worker',
|
||||
import.meta.url
|
||||
)
|
||||
),
|
||||
],
|
||||
prefix: '/worker/',
|
||||
decorateReply: false,
|
||||
});
|
||||
|
||||
|
|
@ -197,6 +254,9 @@ app.register(fastifyStatic, {
|
|||
decorateReply: false,
|
||||
});
|
||||
|
||||
/* If you are trying to add pages or assets in the root folder and
|
||||
NOT entire folders check src/routes.mjs and add it manually. */
|
||||
|
||||
/* All website files are stored in the /views directory.
|
||||
* This takes one of those files and displays it for a site visitor.
|
||||
* Paths like /browsing are converted into paths like /views/pages/surf.html
|
||||
|
|
@ -229,18 +289,27 @@ app.get('/:path', (req, reply) => {
|
|||
if (reqPath && !(reqPath in pages))
|
||||
return reply.code(404).type('text/html').send(preloaded404);
|
||||
|
||||
reply.type('text/html').send(
|
||||
paintSource(
|
||||
loadTemplates(
|
||||
tryReadFile(
|
||||
'../views/' +
|
||||
// Set the index the as the default page.
|
||||
(reqPath ? pages[reqPath] : pages.index),
|
||||
import.meta.url
|
||||
)
|
||||
// Set the index the as the default page. Serve as an html file by default.
|
||||
const fileName = reqPath ? pages[reqPath] : pages.index,
|
||||
supportedTypes = {
|
||||
default: 'text/html',
|
||||
html: 'text/html',
|
||||
txt: 'text/plain',
|
||||
xml: 'application/xml',
|
||||
ico: 'image/vnd.microsoft.icon',
|
||||
},
|
||||
type =
|
||||
supportedTypes[fileName.slice(fileName.lastIndexOf('.') + 1)] ||
|
||||
supportedTypes.default;
|
||||
|
||||
reply.type(type);
|
||||
if (type === supportedTypes.default)
|
||||
reply.send(
|
||||
paintSource(
|
||||
loadTemplates(tryReadFile('../views/' + fileName, import.meta.url))
|
||||
)
|
||||
)
|
||||
);
|
||||
);
|
||||
else reply.send(tryReadFile('../views/' + fileName, import.meta.url));
|
||||
});
|
||||
|
||||
app.get('/github/:redirect', (req, reply) => {
|
||||
|
|
@ -285,7 +354,7 @@ const encodingTable = (() => {
|
|||
JSON.stringify('__uv$config')
|
||||
);
|
||||
|
||||
app.get('/assets/js/common-16451543478.js', (req, reply) => {
|
||||
app.get('/assets/js/common-1735118314.js', (req, reply) => {
|
||||
reply
|
||||
.type('text/javascript')
|
||||
.send(
|
||||
|
|
@ -293,9 +362,9 @@ app.get('/assets/js/common-16451543478.js', (req, reply) => {
|
|||
'../views' + (config.minifyScripts ? '/dist' : '') + req.url
|
||||
)
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/uv/:file.js', (req, reply) => {
|
||||
app.get('/network/:file.js', (req, reply) => {
|
||||
const destination = existsSync(
|
||||
fileURLToPath(new URL('../views' + req.url, import.meta.url))
|
||||
)
|
||||
|
|
@ -316,10 +385,9 @@ app.get('/uv/:file.js', (req, reply) => {
|
|||
);
|
||||
});
|
||||
|
||||
// Set an error page for invalid paths outside the query string system.
|
||||
app.setNotFoundHandler((req, reply) => {
|
||||
reply.code(404).type('text/html').send(preloaded404);
|
||||
});
|
||||
|
||||
app.listen({ port: serverUrl.port, host: serverUrl.hostname });
|
||||
console.log(`Holy Unblocker is listening on port ${serverUrl.port}.`);
|
||||
console.log(`Holy Unblocker is listening on port ${serverUrl.port}.`);
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 0d36a401d2a90f9b2e05ccbc2f6637d277d67257
|
||||
Subproject commit ba041c0299f34a83959dc3dc34427d34b94cbe70
|
||||
|
|
@ -123,12 +123,54 @@ img {
|
|||
|
||||
/* For WebKit/Blink Browsers */
|
||||
::selection {
|
||||
background: rgba(180, 142, 173, 0.513); /* Use rgba for opacity */
|
||||
background: rgba(180, 142, 173, 0.513);
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background-color: var(--nord0);
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background-color: var(--nord0m1);
|
||||
border-radius: 5px;
|
||||
border: 3px solid var;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background-color: var(--nord0m1);
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:active {
|
||||
background: var(--nord11);
|
||||
border-radius: 5px;
|
||||
border: 3px solid transparent;
|
||||
background-clip: padding-box;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-corner {
|
||||
border-left: 1px solid var(--nord10);
|
||||
border-top: 1px solid var(--nord10);
|
||||
background: var(--nord10);
|
||||
}
|
||||
|
||||
|
||||
/* For Gecko Browsers (Firefox) */
|
||||
::-moz-selection {
|
||||
background: rgba(180, 142, 173, 0.513); /* Use rgba for opacity */
|
||||
background: rgba(180, 142, 173, 0.513);
|
||||
}
|
||||
|
||||
@-moz-document url-prefix() {
|
||||
html {
|
||||
scrollbar-color: var(--nord10) var(--nord0);
|
||||
scrollbar-width: thin;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
.text-center {
|
||||
|
|
@ -193,11 +235,11 @@ details[open] summary {
|
|||
}
|
||||
|
||||
#header {
|
||||
background-color: var(--nord0m1);
|
||||
background-color: var(--nord0);
|
||||
display: flex;
|
||||
flex-flow: row wrap;
|
||||
justify-content: space-between; /* Align items horizontally */
|
||||
align-items: center; /* Align items vertically */
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.274);
|
||||
padding: 15px 200px;
|
||||
z-index: 2;
|
||||
|
|
@ -205,14 +247,14 @@ details[open] summary {
|
|||
}
|
||||
|
||||
#banner {
|
||||
background-color: var(--nord0m3);
|
||||
background-color: var(--nord0m1);
|
||||
position: sticky;
|
||||
top: 0;
|
||||
border-top: 1px solid white;
|
||||
border-bottom: 1px solid white;
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
padding: 12px;
|
||||
font-size: 15px;
|
||||
padding: 15px;
|
||||
font-family: 'Figtree', sans-serif;
|
||||
font-weight: 600;
|
||||
z-index: 1;
|
||||
animation: fadeInAnimation ease-in-out 0.3s;
|
||||
animation-iteration-count: 1;
|
||||
|
|
@ -221,13 +263,13 @@ details[open] summary {
|
|||
|
||||
#mainbody {
|
||||
position: relative;
|
||||
animation: fadeInAnimation ease-in-out 0.6s;
|
||||
animation: fadeInAnimation ease-in-out 0.6s;
|
||||
animation-iteration-count: 1;
|
||||
animation-fill-mode: forwards;
|
||||
overflow-x: clip;
|
||||
}
|
||||
|
||||
#particles-js {
|
||||
#background-animated {
|
||||
background-color: var(--nord0);
|
||||
position: fixed;
|
||||
left: 0;
|
||||
|
|
@ -265,7 +307,7 @@ details[open] summary {
|
|||
.brand-logo-container,
|
||||
.new {
|
||||
display: flex;
|
||||
align-items: center; /* Align items vertically */
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.brand {
|
||||
|
|
@ -274,7 +316,7 @@ details[open] summary {
|
|||
height: 30px;
|
||||
line-height: 30px;
|
||||
white-space: nowrap;
|
||||
margin-right: 20px; /* Adjust margin as needed */
|
||||
margin-right: 20px;
|
||||
font-family: 'Figtree', sans-serif;
|
||||
font-weight: 900;
|
||||
letter-spacing: 1px;
|
||||
|
|
@ -283,10 +325,10 @@ details[open] summary {
|
|||
}
|
||||
|
||||
.logo {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
margin-right: 20px;
|
||||
background-image: url('/assets/img/icon.png'); /* Replace with your logo path */
|
||||
background-image: url('/assets/img/icon.png');
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
|
|
@ -297,21 +339,12 @@ details[open] summary {
|
|||
.logo-potato {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background-image: url('/assets/img/potato.webp'); /* Replace with your logo path */
|
||||
background-image: url('/assets/img/potato.webp');
|
||||
background-size: cover;
|
||||
opacity: 0.5;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.new::after {
|
||||
content: '';
|
||||
padding: 22.75px 25px;
|
||||
margin-left: 8px;
|
||||
background-image: url('/assets/img/new.svg');
|
||||
background-size: cover;
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------
|
||||
/* Navigation Bar and Menus (Header Contents)
|
||||
/* ----------------------------------------------- */
|
||||
|
|
@ -321,58 +354,46 @@ details[open] summary {
|
|||
color: var(--nord4) !important;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
display: flex;
|
||||
align-items: center; /* Align items vertically */
|
||||
letter-spacing: 1px;
|
||||
order: 3;
|
||||
}
|
||||
|
||||
.navbar > li {
|
||||
margin-left: 50px; /* Adjust spacing between items */
|
||||
}
|
||||
|
||||
.navbar > li > a {
|
||||
text-decoration: none;
|
||||
color: var(--nord4) !important;
|
||||
}
|
||||
|
||||
.navbar-1 {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
display: flex; /* Ensure it stays horizontal */
|
||||
align-items: center; /* Align items vertically */
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: var(--nord4);
|
||||
order: 2;
|
||||
}
|
||||
|
||||
.navbar-1 > li {
|
||||
margin-left: 30px; /* Adjust spacing between items */
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
.navbar-1 > li > a {
|
||||
text-decoration: none;
|
||||
color: var(--nord4);
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.navbar .dropdown-child {
|
||||
display: none;
|
||||
position: absolute;
|
||||
z-index: 5;
|
||||
background-color: var(--nord0);
|
||||
border: 1px solid var(--nord3);
|
||||
border-radius: 10px;
|
||||
cursor: auto;
|
||||
padding: 15px 25px;
|
||||
margin-top: 10px;
|
||||
font-family: 'Titillium Web', sans-serif;
|
||||
/* New badge styling */
|
||||
.new {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* "More" Navigation Menu */
|
||||
.new::after {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
width: 84px;
|
||||
height: 45px;
|
||||
margin-left: 8px;
|
||||
margin-top: 2px;
|
||||
background-image: url('/assets/svg/new.svg');
|
||||
background-size: contain;
|
||||
background-repeat: no-repeat;
|
||||
image-rendering: -webkit-optimize-contrast; /* Better SVG rendering */
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/* Secondary Navigation Menu w/ Dropdown */
|
||||
|
||||
.subnavbar {
|
||||
list-style: none;
|
||||
|
|
@ -388,10 +409,76 @@ details[open] summary {
|
|||
}
|
||||
|
||||
.subnavbar > li > a:hover {
|
||||
background-color: var(--primary);
|
||||
background-color: var(--nord11) !important;
|
||||
}
|
||||
|
||||
/* "Settings" Navigation Menu */
|
||||
.navbar {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
letter-spacing: 1px;
|
||||
order: 3;
|
||||
}
|
||||
|
||||
.navbar > li {
|
||||
margin-left: 50px;
|
||||
}
|
||||
|
||||
.navbar > li > a {
|
||||
text-decoration: none;
|
||||
color: var(--nord4) !important;
|
||||
font-size: 0.95rem;
|
||||
font-weight: 500;
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
.navbar > li > a:hover {
|
||||
color: var(--nord11);
|
||||
}
|
||||
|
||||
.navbar .dropdown-child {
|
||||
display: none;
|
||||
position: absolute;
|
||||
z-index: 5;
|
||||
background-color: var(--nord0);
|
||||
border: 1px solid var(--nord3);
|
||||
border-radius: 10px;
|
||||
cursor: auto;
|
||||
padding: 15px 25px;
|
||||
margin-top: 15px;
|
||||
font-family: 'Titillium Web', sans-serif;
|
||||
opacity: 0;
|
||||
transform: translateY(-20px);
|
||||
transition: opacity 0.3s ease, transform 0.3s ease;
|
||||
}
|
||||
|
||||
.dropdown-parent:focus-within .dropdown-child {
|
||||
display: block;
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
.subnavbar {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.subnavbar > li > a {
|
||||
display: block;
|
||||
padding: 5px 15px;
|
||||
border-radius: 5px;
|
||||
color: var(--nord4);
|
||||
transition: background-color 0.3s ease, color 0.3s ease;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
.subnavbar > li > a:hover {
|
||||
background-color: var(--primary);
|
||||
color: var(--nord0);
|
||||
}
|
||||
|
||||
.navbar .dropdown-settings {
|
||||
display: none;
|
||||
|
|
@ -401,20 +488,24 @@ details[open] summary {
|
|||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0, 0, 0, 0.5); /* Semi-transparent background */
|
||||
backdrop-filter: blur(10px); /* Blurs the background */
|
||||
z-index: 5; /* Ensures it appears above other content */
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
backdrop-filter: blur(10px);
|
||||
z-index: 5;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
.dropdown-parent:focus-within
|
||||
.dropdown-settings:not(:is(:has(.close-settings-btn:active))) {
|
||||
display: flex; /* Flexbox to center content */
|
||||
display: flex;
|
||||
pointer-events: auto;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.dropdown-parent:focus-within .dropdown-child {
|
||||
display: block;
|
||||
.dropdown-parent:focus-within .dropdown-settings {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Settings Menu (Updated) */
|
||||
|
|
@ -423,12 +514,12 @@ details[open] summary {
|
|||
|
||||
.settings-content {
|
||||
pointer-events: auto;
|
||||
background-color: rgba(46, 52, 64, 0.2); /* Adding transparency */
|
||||
background-color: rgba(46, 52, 64, 0.2);
|
||||
border: 1px solid #4c566a;
|
||||
border-radius: 10px;
|
||||
padding: 25px;
|
||||
z-index: 6;
|
||||
width: 800px; /* Width to accommodate both columns */
|
||||
width: 800px;
|
||||
max-height: 90vh;
|
||||
overflow-y: auto;
|
||||
margin: 5vh auto;
|
||||
|
|
@ -438,7 +529,7 @@ details[open] summary {
|
|||
flex-direction: column;
|
||||
backdrop-filter: blur(10px); /* Frosted glass effect */
|
||||
-webkit-backdrop-filter: blur(10px); /* For Safari */
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* Optional: Add some shadow for depth */
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* Add some shadow for depth */
|
||||
}
|
||||
|
||||
.settings-header {
|
||||
|
|
@ -472,23 +563,23 @@ details[open] summary {
|
|||
|
||||
.settings-content-body {
|
||||
display: flex;
|
||||
gap: 40px; /* Space between left and right columns */
|
||||
gap: 40px;
|
||||
}
|
||||
|
||||
.csel-container-left,
|
||||
.settings-right-column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 15px; /* Space between items within columns */
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.csel-container-left {
|
||||
flex: 1;
|
||||
max-width: 400px; /* Adjusted to fit content without gaps */
|
||||
max-width: 400px;
|
||||
}
|
||||
|
||||
.settings-right-column {
|
||||
width: 300px; /* Fixed width for the right column */
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
.cseltitle {
|
||||
|
|
@ -500,40 +591,40 @@ details[open] summary {
|
|||
.radio-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px; /* Increased space between items for clarity */
|
||||
gap: 10px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.radio-group label {
|
||||
display: flex;
|
||||
align-items: center; /* Align items vertically */
|
||||
justify-content: space-between; /* Aligns text to the left and input to the right */
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
color: #eceff4;
|
||||
font-size: 16px;
|
||||
max-width: 100%; /* Ensure label doesn't exceed container width */
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.radio-group p {
|
||||
margin: 0;
|
||||
flex: 1; /* Take up available space */
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.radio-group input[type='radio'] {
|
||||
accent-color: #88c0d0;
|
||||
cursor: pointer;
|
||||
width: 20px; /* Adjust size for better appearance */
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background-color: #3b4252; /* Default background color */
|
||||
background-color: #3b4252;
|
||||
}
|
||||
|
||||
.switch-container {
|
||||
display: flex;
|
||||
align-items: center; /* Align items vertically centered */
|
||||
justify-content: space-between; /* Distribute space between items */
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.switch-container p {
|
||||
margin: 0; /* Remove default margin to align properly */
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.switch {
|
||||
|
|
@ -577,7 +668,7 @@ select {
|
|||
border-radius: 5px;
|
||||
color: #eceff4;
|
||||
max-width: 300px;
|
||||
box-sizing: border-box; /* Include padding and border in the element's total width and height */
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
select:hover {
|
||||
|
|
@ -799,14 +890,16 @@ input[type='text'] {
|
|||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 100px 0 100px 10%;
|
||||
height: max(85vh, 25em);
|
||||
flex-direction: column;
|
||||
padding: 170px 0 170px 0;
|
||||
gap: 150px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.home-text {
|
||||
max-width: 600px;
|
||||
max-width: 750px;
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.home-text h1 {
|
||||
|
|
@ -828,7 +921,7 @@ input[type='text'] {
|
|||
|
||||
.mac-window {
|
||||
flex: 1;
|
||||
max-width: 800px;
|
||||
max-width: 1100px;
|
||||
height: 510px;
|
||||
border: 1px solid var(--nord0);
|
||||
border-radius: 12px;
|
||||
|
|
@ -895,9 +988,14 @@ input[type='text'] {
|
|||
font-size: 18px;
|
||||
}
|
||||
|
||||
.downarrowgroup {
|
||||
color: var(--nord3);
|
||||
margin-left: 80%;
|
||||
}
|
||||
|
||||
.cmd {
|
||||
color: #a4bbd1;
|
||||
white-space: pre-wrap; /* Preserve new lines */
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.cmd::before {
|
||||
|
|
@ -1042,13 +1140,11 @@ iner .splashstrokeheader {
|
|||
.hero-grid-container {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
||||
gap: 40px;
|
||||
margin: 40px auto;
|
||||
width: 90%;
|
||||
max-width: 1200px;
|
||||
max-width: 1250px;
|
||||
background-color: rgba(46, 52, 64, 0.2);
|
||||
border-radius: 10px;
|
||||
padding: 10px;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
|
|
@ -1109,6 +1205,10 @@ iner .splashstrokeheader {
|
|||
}
|
||||
}
|
||||
|
||||
#scrollfix {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.box-hero {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
|
@ -1185,8 +1285,8 @@ iner .splashstrokeheader {
|
|||
}
|
||||
|
||||
.hero {
|
||||
width: 100%; /* Ensure the image takes full width of its container */
|
||||
max-width: 300px; /* Ensure the image doesn't exceed its container */
|
||||
width: 100%;
|
||||
max-width: 300px;
|
||||
height: auto;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
|
@ -1217,7 +1317,7 @@ iner .splashstrokeheader {
|
|||
gap: 80px;
|
||||
margin: 80px;
|
||||
margin-top: 300px;
|
||||
padding: 0 20px; /* Add padding to prevent overflow */
|
||||
padding: 0 20px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
|
|
@ -1283,7 +1383,7 @@ iner .splashstrokeheader {
|
|||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
width: 30%;
|
||||
max-width: 180px; /* Add a max-width to prevent it from getting too large */
|
||||
max-width: 180px;
|
||||
height: auto;
|
||||
background-color: var(--nord0m3);
|
||||
border-radius: 10px;
|
||||
|
|
@ -1316,16 +1416,15 @@ iner .splashstrokeheader {
|
|||
margin-bottom: 100px;
|
||||
}
|
||||
|
||||
/* Main container with increased margin and padding */
|
||||
.box-main-container {
|
||||
display: flex;
|
||||
align-items: center; /* Center items vertically */
|
||||
justify-content: space-between; /* Space between text and image */
|
||||
max-width: 1300px; /* Adjust to your desired max width */
|
||||
margin: 50px auto 200px auto; /* Increased top margin for distance from navbar */
|
||||
padding: 20px; /* Padding inside the container */
|
||||
gap: 20%; /* Flexible gap between text and image */
|
||||
position: relative; /* Positioning for the divider */
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
max-width: 1300px;
|
||||
margin: 50px auto 200px auto;
|
||||
padding: 20px;
|
||||
gap: 20%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* Badge styling */
|
||||
|
|
@ -1346,20 +1445,17 @@ iner .splashstrokeheader {
|
|||
margin: 0 5px;
|
||||
}
|
||||
|
||||
/* Text container with padding */
|
||||
.box-text-container {
|
||||
max-width: 600px; /* Adjust to control text container width */
|
||||
padding: 20px; /* Padding inside the text container */
|
||||
max-width: 600px;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
/* Headline styling with underline */
|
||||
.box-text-container > h1 {
|
||||
font-size: 2.5rem;
|
||||
font-weight: 900;
|
||||
color: rgb(255, 88, 97);
|
||||
}
|
||||
|
||||
/* Description styling */
|
||||
.box-description {
|
||||
font-size: 1.2rem;
|
||||
margin: 30px 0;
|
||||
|
|
@ -1367,7 +1463,6 @@ iner .splashstrokeheader {
|
|||
color: var(--nord4);
|
||||
}
|
||||
|
||||
/* Button container styling */
|
||||
.box-button-container {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
|
@ -1389,48 +1484,47 @@ iner .splashstrokeheader {
|
|||
/* Image container */
|
||||
.box-image-container {
|
||||
display: flex;
|
||||
align-items: center; /* Center image vertically */
|
||||
margin-left: auto; /* Push image container to the right */
|
||||
align-items: center;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.box-pr-logo {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
width: 600px; /* Fixed width of the image */
|
||||
width: 600px;
|
||||
}
|
||||
|
||||
/* Line divider styling */
|
||||
.box-line-divider {
|
||||
position: absolute;
|
||||
bottom: -50px; /* Position below the main container */
|
||||
bottom: -50px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%); /* Center horizontally */
|
||||
transform: translateX(-50%);
|
||||
width: 80%;
|
||||
height: 1px;
|
||||
background-color: var(--nord11); /* Semi-transparent line */
|
||||
background-color: var(--nord11);
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
/* Media queries for responsiveness */
|
||||
@media (max-width: 768px) {
|
||||
.box-main-container {
|
||||
flex-direction: column; /* Stack text and image vertically on smaller screens */
|
||||
align-items: center; /* Center items horizontally */
|
||||
gap: 20px; /* Reduce gap on smaller screens */
|
||||
position: relative; /* Ensure divider is correctly positioned */
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.box-text-container {
|
||||
max-width: 100%; /* Full width on smaller screens */
|
||||
text-align: center; /* Center text on smaller screens */
|
||||
max-width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.box-image-container {
|
||||
margin-left: 0; /* Reset margin on smaller screens */
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.box-pr-logo {
|
||||
width: 100%; /* Full width on smaller screens */
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1518,33 +1612,6 @@ iner .splashstrokeheader {
|
|||
background-color: var(--nord1);
|
||||
}
|
||||
|
||||
/* Advertisements, obviously. */
|
||||
|
||||
.ad {
|
||||
position: absolute;
|
||||
margin: 0 20px;
|
||||
width: 100px;
|
||||
height: 100%;
|
||||
background-color: var(--nord1);
|
||||
overflow: hidden;
|
||||
display: none;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
#ad-right {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.ad::before {
|
||||
content: 'Advertisement';
|
||||
font-family: 'Titillium Web', sans-serif;
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------
|
||||
/* Proxy Pages
|
||||
/* ----------------------------------------------- */
|
||||
|
|
@ -1565,6 +1632,7 @@ iner .splashstrokeheader {
|
|||
border-radius: 5px;
|
||||
padding: 10px 12px;
|
||||
color: white;
|
||||
background-color: #22262f;
|
||||
font-family: 'Montserrat Alternates', sans-serif;
|
||||
font-size: 20px;
|
||||
margin: 3px;
|
||||
|
|
@ -1778,9 +1846,12 @@ iner .splashstrokeheader {
|
|||
|
||||
/* Pulse Hover Animation */
|
||||
|
||||
.pulse {
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%,
|
||||
100% {
|
||||
0%, 100% {
|
||||
transform: scale(1);
|
||||
}
|
||||
50% {
|
||||
|
|
@ -1793,8 +1864,7 @@ iner .splashstrokeheader {
|
|||
background-color 0.3s ease,
|
||||
color 0.3s ease,
|
||||
transform 0.3s ease;
|
||||
transform: scale(1.05);
|
||||
-webkit-font-smoothing: subpixel-antialiased;
|
||||
transform: scale(1.05) translateZ(0);
|
||||
}
|
||||
|
||||
/* Glowing Button Animation */
|
||||
|
|
@ -2250,4 +2320,4 @@ iner .splashstrokeheader {
|
|||
.splashend > h1 {
|
||||
font-size: 1.625em;
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
views/assets/ico/android-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
views/assets/ico/android-icon-192x192.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
views/assets/ico/android-icon-36x36.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
views/assets/ico/android-icon-48x48.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
views/assets/ico/android-icon-72x72.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
views/assets/ico/android-icon-96x96.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
views/assets/ico/apple-icon-114x114.png
Normal file
|
After Width: | Height: | Size: 8.9 KiB |
BIN
views/assets/ico/apple-icon-120x120.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
views/assets/ico/apple-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
views/assets/ico/apple-icon-152x152.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
views/assets/ico/apple-icon-180x180.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
views/assets/ico/apple-icon-57x57.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
views/assets/ico/apple-icon-60x60.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
views/assets/ico/apple-icon-72x72.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
views/assets/ico/apple-icon-76x76.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
views/assets/ico/apple-icon-precomposed.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
views/assets/ico/apple-icon.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
views/assets/ico/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
views/assets/ico/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
views/assets/ico/favicon-96x96.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
views/assets/ico/favicon.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
views/assets/ico/ms-icon-144x144.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
views/assets/ico/ms-icon-150x150.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
views/assets/ico/ms-icon-310x310.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
views/assets/ico/ms-icon-70x70.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 2 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
|
|
@ -2,7 +2,7 @@
|
|||
await loadFull(tsParticles);
|
||||
|
||||
await tsParticles.load({
|
||||
id: 'particles-js',
|
||||
id: 'background-animated',
|
||||
options: {
|
||||
background: {
|
||||
color: { value: '#1d232a' },
|
||||
|
|
@ -1,581 +0,0 @@
|
|||
/* -----------------------------------------------
|
||||
/* Authors: QuiteAFancyEmerald, Yoct, and OlyB
|
||||
/* GNU Affero General Public License v3.0: https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||
/* MAIN Holy Unblocker LTS Common Script
|
||||
/* ----------------------------------------------- */
|
||||
|
||||
// Encase everything in a new scope so that variables are not accidentally
|
||||
// attached to the global scope.
|
||||
(() => {
|
||||
// To be defined after the document has fully loaded.
|
||||
let uvConfig = {};
|
||||
// Get the preferred apex domain name. Not exactly apex, as any
|
||||
// subdomain other than those listed will be ignored.
|
||||
const getDomain = () =>
|
||||
location.host.replace(/^(?:www|edu|cooking|beta)\./, ''),
|
||||
// This is used for stealth mode when visiting external sites.
|
||||
goFrame = (url) => {
|
||||
localStorage.setItem('huframesrc', url);
|
||||
location.href = '/s';
|
||||
},
|
||||
/* Used to set functions for the goProx object at the bottom.
|
||||
* See the goProx object at the bottom for some usage examples
|
||||
* on the URL handlers, omnibox functions, and the uvUrl and
|
||||
* RammerheadEncode functions.
|
||||
*/
|
||||
urlHandler = (parser) =>
|
||||
typeof parser === 'function'
|
||||
? // Return different functions based on whether a URL has already been set.
|
||||
// Should help avoid confusion when using or adding to the goProx object.
|
||||
(url, mode) => {
|
||||
if (!url) return;
|
||||
url = parser(url);
|
||||
mode = `${mode}`.toLowerCase();
|
||||
if (mode === 'stealth' || mode == 1) goFrame(url);
|
||||
else if (mode === 'window' || mode == 0) location.href = url;
|
||||
else return url;
|
||||
}
|
||||
: (mode) => {
|
||||
mode = `${mode}`.toLowerCase();
|
||||
if (mode === 'stealth' || mode == 1) goFrame(parser);
|
||||
else if (mode === 'window' || mode == 0) location.href = parser;
|
||||
else return parser;
|
||||
},
|
||||
// An asynchronous version of the function above, just in case.
|
||||
asyncUrlHandler = (parser) => async (url, mode) => {
|
||||
if (!url) return;
|
||||
if (typeof parser === 'function') url = await parser(url);
|
||||
mode = `${mode}`.toLowerCase();
|
||||
if (mode === 'stealth' || mode == 1) goFrame(url);
|
||||
else if (mode === 'window' || mode == 0) location.href = url;
|
||||
else return url;
|
||||
};
|
||||
|
||||
/* COOKIE AUTH DEMO */
|
||||
|
||||
const setAuthCookie = (s, lax) => {
|
||||
document.cookie =
|
||||
s +
|
||||
`; expires=${Date.now() + 259200}; SameSite=${lax ? 'Lax' : 'None'}; domain=.${getDomain()}; path=/; Secure;`;
|
||||
};
|
||||
|
||||
/* OMNIBOX */
|
||||
|
||||
// Search engine is set to Bing. Intended to work just like the usual
|
||||
// bar at the top of a browser.
|
||||
const sx = 'bing.com' + '/search?q=',
|
||||
/*
|
||||
omnibox = url =>
|
||||
(url.indexOf("http")
|
||||
? "https://" + (url.indexOf(".") < 1 ? sx : "")
|
||||
: "")
|
||||
+ url;
|
||||
*/
|
||||
|
||||
// Another omnibox function. Unsure if the version above is needed.
|
||||
search = (input, template = `https://${sx}%s`) => {
|
||||
try {
|
||||
// Return the input if it is already a valid URL.
|
||||
// eg: https://example.com, https://example.com/test?q=param
|
||||
return new URL(input) + '';
|
||||
} catch (e) {
|
||||
// Continue if it is invalid.
|
||||
}
|
||||
|
||||
try {
|
||||
// Check if the input is valid when http:// is added to the start.
|
||||
// eg: example.com, https://example.com/test?q=param
|
||||
const url = new URL(`http://${input}`);
|
||||
// Return only if the hostname has a TLD or a subdomain.
|
||||
if (url.hostname.indexOf('.') != -1) return url + '';
|
||||
} catch (e) {
|
||||
// Continue if it is invalid.
|
||||
}
|
||||
|
||||
// Treat the input as a search query instead of a website.
|
||||
return template.replace('%s', encodeURIComponent(input));
|
||||
},
|
||||
// Parse a URL to use with Ultraviolet.
|
||||
uvUrl = (url) => {
|
||||
try {
|
||||
url =
|
||||
location.origin +
|
||||
uvConfig.prefix +
|
||||
uvConfig.encodeUrl(search(url));
|
||||
} catch (e) {
|
||||
// This is for cases where the Ultraviolet scripts have not been loaded.
|
||||
url = search(url);
|
||||
}
|
||||
return url;
|
||||
};
|
||||
|
||||
/* RAMMERHEAD CONFIGURATION */
|
||||
|
||||
// Parse a URL to use with Rammerhead. Only usable if the server is active.
|
||||
const RammerheadEncode = async (baseUrl) => {
|
||||
// Hellhead
|
||||
const mod = (n, m) => ((n % m) + m) % m,
|
||||
baseDictionary =
|
||||
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~-',
|
||||
shuffledIndicator = '_rhs',
|
||||
// Return a copy of the base dictionary with a randomized character order.
|
||||
// Will be used as a Caesar cipher for URL encoding.
|
||||
generateDictionary = () => {
|
||||
let str = '';
|
||||
const split = baseDictionary.split('');
|
||||
while (split.length > 0) {
|
||||
// Using .splice automatically rounds down to the nearest whole number.
|
||||
str += split.splice(Math.random() * split.length, 1)[0];
|
||||
}
|
||||
return str;
|
||||
};
|
||||
|
||||
class StrShuffler {
|
||||
constructor(dictionary = generateDictionary()) {
|
||||
this.dictionary = dictionary;
|
||||
}
|
||||
|
||||
shuffle(str) {
|
||||
// Do not reshuffle an already shuffled string.
|
||||
if (!str.indexOf(shuffledIndicator)) return str;
|
||||
|
||||
let shuffledStr = '';
|
||||
for (let i = 0; i < str.length; i++) {
|
||||
const char = str[i],
|
||||
idx = baseDictionary.indexOf(char);
|
||||
|
||||
/* For URL encoded characters and characters not included in the
|
||||
* dictionary, leave untouched. Otherwise, replace with a character
|
||||
* from the dictionary.
|
||||
*/
|
||||
if (char === '%' && str.length - i >= 3)
|
||||
// A % symbol denotes that the next 2 characters are URL encoded.
|
||||
shuffledStr += char + str[++i] + str[++i];
|
||||
// Do not modify unrecognized characters.
|
||||
else if (idx == -1) shuffledStr += char;
|
||||
// Find the corresponding dictionary entry and use the character
|
||||
// that is i places to the right of it.
|
||||
else
|
||||
shuffledStr += this.dictionary[mod(idx + i, baseDictionary.length)];
|
||||
}
|
||||
// Add a prefix signifying that the string has been shuffled.
|
||||
return shuffledIndicator + shuffledStr;
|
||||
}
|
||||
|
||||
// Unshuffling is currently not done on the client side, and likely
|
||||
// won't ever be for this implementation. It is used by the server instead.
|
||||
unshuffle(str) {
|
||||
// Do not unshuffle an already unshuffled string.
|
||||
if (str.indexOf(shuffledIndicator)) return str;
|
||||
|
||||
// Remove the prefix signifying that the string has been shuffled.
|
||||
str = str.slice(shuffledIndicator.length);
|
||||
|
||||
let unshuffledStr = '';
|
||||
for (let i = 0; i < str.length; i++) {
|
||||
const char = str[i],
|
||||
idx = this.dictionary.indexOf(char);
|
||||
|
||||
/* Convert the dictionary entry characters back into their base
|
||||
* characters using the base dictionary. Again, leave URL encoded
|
||||
* characters and unrecognized symbols alone.
|
||||
*/
|
||||
if (char === '%' && str.length - i >= 3)
|
||||
unshuffledStr += char + str[++i] + str[++i];
|
||||
else if (idx == -1) unshuffledStr += char;
|
||||
// Find the corresponding base character entry and use the character
|
||||
// that is i places to the left of it.
|
||||
else
|
||||
unshuffledStr += baseDictionary[mod(idx - i, baseDictionary.length)];
|
||||
}
|
||||
return unshuffledStr;
|
||||
}
|
||||
}
|
||||
|
||||
// Request information that's beiing stored elsewhere on the server.
|
||||
// Executes the callback function if the server responds as intended.
|
||||
const get = (url, callback, shush = false) => {
|
||||
let request = new XMLHttpRequest();
|
||||
request.open('GET', url, true);
|
||||
request.send();
|
||||
|
||||
request.onerror = () => {
|
||||
if (!shush) console.log('Cannot communicate with the server');
|
||||
};
|
||||
request.onload = () => {
|
||||
if (request.status === 200) callback(request.responseText);
|
||||
else if (!shush)
|
||||
console.log(
|
||||
`Unexpected server response to not match "200". Server says "${request.responseText}"`
|
||||
);
|
||||
};
|
||||
},
|
||||
// Functions for interacting with Rammerhead backend code on the server.
|
||||
api = {
|
||||
// Make a new Rammerhead session and do something with it.
|
||||
newsession(callback) {
|
||||
get('/newsession', callback);
|
||||
},
|
||||
|
||||
// Check if a session with the specified ID exists, then do something.
|
||||
sessionexists(id, callback) {
|
||||
get('/sessionexists?id=' + encodeURIComponent(id), (res) => {
|
||||
if (res === 'exists') return callback(true);
|
||||
if (res === 'not found') return callback(false);
|
||||
console.log('Unexpected response from server. Received ' + res);
|
||||
});
|
||||
},
|
||||
|
||||
// Request a brand new encoding table to use for Rammerhead.
|
||||
shuffleDict(id, callback) {
|
||||
console.log('Shuffling', id);
|
||||
get('/api/shuffleDict?id=' + encodeURIComponent(id), (res) => {
|
||||
callback(JSON.parse(res));
|
||||
});
|
||||
},
|
||||
},
|
||||
/* Organize Rammerhead sessions via the browser's local storage.
|
||||
* Local data consists of session creation timestamps and session IDs.
|
||||
* The rest of the data is stored on the server.
|
||||
*/
|
||||
localStorageKey = 'rammerhead_sessionids',
|
||||
localStorageKeyDefault = 'rammerhead_default_sessionid',
|
||||
sessionIdsStore = {
|
||||
// Get the local data of all stored sessions.
|
||||
get() {
|
||||
const rawData = localStorage.getItem(localStorageKey);
|
||||
if (!rawData) return [];
|
||||
try {
|
||||
const data = JSON.parse(rawData);
|
||||
|
||||
// Catch invalidly stored Rammerhead session data. Either that or
|
||||
// it's poorly spoofed.
|
||||
if (!Array.isArray(data)) throw 'getout';
|
||||
return data;
|
||||
} catch (e) {
|
||||
return [];
|
||||
}
|
||||
},
|
||||
|
||||
// Store local Rammerhead session data in the form of an array.
|
||||
set(data) {
|
||||
if (!Array.isArray(data)) throw new TypeError('Must be an array.');
|
||||
localStorage.setItem(localStorageKey, JSON.stringify(data));
|
||||
},
|
||||
|
||||
// Get the default session data.
|
||||
getDefault() {
|
||||
const sessionId = localStorage.getItem(localStorageKeyDefault);
|
||||
if (sessionId) {
|
||||
let data = sessionIdsStore.get();
|
||||
data.filter((session) => session.id === sessionId);
|
||||
if (data.length) return data[0];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
// Set a new default session based on a given session ID.
|
||||
setDefault(id) {
|
||||
localStorage.setItem(localStorageKeyDefault, id);
|
||||
},
|
||||
},
|
||||
// Store or update local data for a Rammerhead session, which consists of
|
||||
// the session's ID and when the session was last created.
|
||||
addSession = (id) => {
|
||||
let data = sessionIdsStore.get();
|
||||
data.unshift({ id: id, createdOn: new Date().toLocaleString() });
|
||||
sessionIdsStore.set(data);
|
||||
},
|
||||
// Attempt to load an existing session that has been stored on the server.
|
||||
getSessionId = () => {
|
||||
return new Promise((resolve) => {
|
||||
// Check if the browser has stored an existing session.
|
||||
const id = localStorage.getItem('session-string');
|
||||
api.sessionexists(id, (value) => {
|
||||
// Create a new session if Rammerhead can't find an existing session.
|
||||
if (!value) {
|
||||
console.log('Session validation failed');
|
||||
api.newsession((id) => {
|
||||
addSession(id);
|
||||
localStorage.setItem('session-string', id);
|
||||
console.log(id);
|
||||
console.log('^ new id');
|
||||
resolve(id);
|
||||
});
|
||||
}
|
||||
// Load the stored session now that Rammerhead has found it.
|
||||
else resolve(id);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Load the URL that was last visited in the Rammerhead session.
|
||||
return getSessionId().then(
|
||||
(id) =>
|
||||
new Promise((resolve) => {
|
||||
api.shuffleDict(id, (shuffleDict) => {
|
||||
// Encode the URL with Rammerhead's encoding table and return the URL.
|
||||
resolve(`/${id}/` + new StrShuffler(shuffleDict).shuffle(baseUrl));
|
||||
});
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
/* To use:
|
||||
* goProx.proxy(url-string, mode-as-string-or-number);
|
||||
*
|
||||
* Key: 1 = "stealth"
|
||||
* 0 = "window"
|
||||
* Nothing = return URL as a string
|
||||
*
|
||||
* Examples:
|
||||
* Stealth mode -
|
||||
* goProx.ultraviolet("https://google.com", 1);
|
||||
* goProx.ultraviolet("https://google.com", "stealth");
|
||||
*
|
||||
* await goProx.rammerhead("https://google.com", 1);
|
||||
* await goProx.rammerhead("https://google.com", "stealth");
|
||||
*
|
||||
* goProx.searx(1);
|
||||
* goProx.searx("stealth");
|
||||
*
|
||||
* Window mode -
|
||||
* goProx.ultraviolet("https://google.com", "window");
|
||||
*
|
||||
* await goProx.rammerhead("https://google.com", "window");
|
||||
*
|
||||
* goProx.searx("window");
|
||||
*
|
||||
* Return string value mode (default) -
|
||||
* goProx.ultraviolet("https://google.com");
|
||||
*
|
||||
* await goProx.rammerhead("https://google.com");
|
||||
*
|
||||
* goProx.searx();
|
||||
*/
|
||||
addEventListener('DOMContentLoaded', async () => {
|
||||
// This won't break the service workers as they store the variable separately.
|
||||
uvConfig = self['{{__uv$config}}'];
|
||||
delete self['{{__uv$config}}'];
|
||||
|
||||
// Object.freeze prevents goProx from accidentally being edited.
|
||||
const goProx = Object.freeze({
|
||||
// `location.protocol + "//" + getDomain()` more like `location.origin`
|
||||
// setAuthCookie("__cor_auth=1", false);
|
||||
ultraviolet: urlHandler(uvUrl),
|
||||
|
||||
rammerhead: asyncUrlHandler(
|
||||
async (url) => location.origin + (await RammerheadEncode(search(url)))
|
||||
),
|
||||
|
||||
searx: urlHandler(location.protocol + `//c.${getDomain()}/engine/`),
|
||||
|
||||
libreddit: urlHandler(location.protocol + '//c.' + getDomain()),
|
||||
|
||||
rnav: urlHandler(location.protocol + '//client.' + getDomain()),
|
||||
|
||||
osu: urlHandler(location.origin + '/archive/osu'),
|
||||
|
||||
mcnow: urlHandler(uvUrl('https://now.gg/play/a/10010/b')),
|
||||
|
||||
glife: urlHandler(uvUrl('https://now.gg/apps/lunime/5767/gacha-life.html')),
|
||||
|
||||
roblox: urlHandler(
|
||||
uvUrl('https://now.gg/apps/roblox-corporation/5349/roblox.html')
|
||||
),
|
||||
|
||||
amongus: urlHandler(
|
||||
uvUrl('https://now.gg/apps/innersloth-llc/4047/among-us.html')
|
||||
),
|
||||
|
||||
pubg: urlHandler(
|
||||
uvUrl('https://now.gg/apps/proxima-beta/2609/pubg-mobile-resistance.html')
|
||||
),
|
||||
|
||||
train: urlHandler(uvUrl('https://hby.itch.io/last-train-home')),
|
||||
|
||||
village: urlHandler(uvUrl('https://kwoodhouse.itch.io/village-arsonist')),
|
||||
|
||||
prison: urlHandler(uvUrl('https://vimlark.itch.io/pick-up-prison')),
|
||||
|
||||
rpg: urlHandler(uvUrl('https://alarts.itch.io/die-in-the-dungeon')),
|
||||
|
||||
speed: urlHandler(uvUrl('https://captain4lk.itch.io/what-the-road-brings')),
|
||||
|
||||
heli: urlHandler(uvUrl('https://benjames171.itch.io/helo-storm')),
|
||||
|
||||
youtube: urlHandler(uvUrl('https://youtube.com')),
|
||||
|
||||
discordUV: urlHandler(uvUrl('https://discord.com/app')),
|
||||
|
||||
discordRH: urlHandler(await RammerheadEncode('https://discord.com/app')),
|
||||
});
|
||||
|
||||
// Attach event listeners using goProx to specific app menus that need it.
|
||||
const prSet = (id, type) => {
|
||||
const formElement = document.getElementById(id);
|
||||
if (!formElement) return;
|
||||
|
||||
let prUrl = formElement.querySelector('input[type=text]'),
|
||||
prGo1 = document.querySelectorAll(`#${id}.pr-go1, #${id} .pr-go1`),
|
||||
prGo2 = document.querySelectorAll(`#${id}.pr-go2, #${id} .pr-go2`);
|
||||
|
||||
// Handle the other menu buttons differently if there is no omnibox. Menus
|
||||
// which lack an omnibox likely use buttons as mere links.
|
||||
const goProxMethod = prUrl
|
||||
? (mode) => () => {
|
||||
goProx[type](prUrl.value, mode);
|
||||
}
|
||||
: (mode) => () => {
|
||||
goProx[type](mode);
|
||||
},
|
||||
// Ultraviolet is currently incompatible with window mode.
|
||||
searchMode = type === 'ultraviolet' ? 'stealth' : 'window';
|
||||
|
||||
if (prUrl)
|
||||
prUrl.addEventListener('keydown', async (e) => {
|
||||
if (e.code === 'Enter') goProxMethod(searchMode)();
|
||||
// This is exclusively used for the validator script.
|
||||
else if (e.code === 'Validator Test') {
|
||||
e.target.value = await goProx[type](e.target.value);
|
||||
e.target.dispatchEvent(new Event('change'));
|
||||
}
|
||||
});
|
||||
|
||||
prGo1.forEach((element) => {
|
||||
element.addEventListener('click', goProxMethod('window'));
|
||||
});
|
||||
prGo2.forEach((element) => {
|
||||
element.addEventListener('click', goProxMethod('stealth'));
|
||||
});
|
||||
};
|
||||
|
||||
prSet('pr-uv', 'ultraviolet');
|
||||
prSet('pr-rh', 'rammerhead');
|
||||
prSet('pr-yt', 'youtube');
|
||||
prSet('pr-rh-dc', 'discordRH');
|
||||
prSet('pr-uv-dc', 'discordUV');
|
||||
|
||||
// Load in relevant JSON files used to organize large sets of data.
|
||||
// This first one is for links, whereas the rest are for navigation menus.
|
||||
const huLinks = await fetch('/assets/json/links.json', {
|
||||
mode: 'same-origin',
|
||||
}).then((response) => response.json());
|
||||
|
||||
for (let items = Object.entries(huLinks), i = 0; i < items.length; i++)
|
||||
// Replace all placeholder links with the corresponding entry in huLinks.
|
||||
(document.getElementById(items[i][0]) || {}).href = items[i][1];
|
||||
|
||||
const navLists = {
|
||||
// Pair an element ID with a JSON file name. They are identical for now.
|
||||
'emu-nav': 'emu-nav',
|
||||
'emulib-nav': 'emulib-nav',
|
||||
'flash-nav': 'flash-nav',
|
||||
'h5-nav': 'h5-nav',
|
||||
};
|
||||
|
||||
for (const [listId, filename] of Object.entries(navLists)) {
|
||||
let navList = document.getElementById(listId);
|
||||
|
||||
if (navList) {
|
||||
// List items stored in JSON format will be returned as a JS object.
|
||||
const data = await fetch(`/assets/json/${filename}.json`, {
|
||||
mode: 'same-origin',
|
||||
}).then((response) => response.json());
|
||||
|
||||
// Load the JSON lists into specific HTML parent elements as groups of
|
||||
// child elements, if the parent element is found.
|
||||
switch (filename) {
|
||||
case 'emu-nav':
|
||||
case 'emulib-nav':
|
||||
case 'h5-nav': {
|
||||
const dirnames = {
|
||||
// Set the directory of where each item of the corresponding JSON
|
||||
// list will be retrieved from.
|
||||
'emu-nav': 'emu',
|
||||
'emulib-nav': 'emulib',
|
||||
'h5-nav': 'h5g',
|
||||
},
|
||||
dir = dirnames[filename],
|
||||
// Add a little functionality for each list item when clicked on.
|
||||
clickHandler = (parser, a) => (e) => {
|
||||
if (e.target == a || e.target.tagName != 'A') {
|
||||
e.preventDefault();
|
||||
parser();
|
||||
}
|
||||
};
|
||||
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
// Load each item as an anchor tag with an image, heading,
|
||||
// description, and click event listener.
|
||||
const item = data[i],
|
||||
a = document.createElement('a'),
|
||||
img = document.createElement('img'),
|
||||
title = document.createElement('h3'),
|
||||
desc = document.createElement('p');
|
||||
|
||||
a.href = '#';
|
||||
img.src = `/assets/img/${dir}/` + item.img;
|
||||
title.textContent = item.name;
|
||||
desc.textContent = item.description;
|
||||
|
||||
if (filename === 'h5-nav') {
|
||||
if (item.credits === 'itch')
|
||||
desc.innerHTML +=
|
||||
'<br>Credits: Game can be found <a target="_blank" href="https://itch.io">here</a>.';
|
||||
if (item.credits === 'nowgg')
|
||||
desc.innerHTML +=
|
||||
'<br>Credits: Game can be found <a target="_blank" href="https://now.gg">here</a>.';
|
||||
}
|
||||
|
||||
a.appendChild(img);
|
||||
a.appendChild(title);
|
||||
a.appendChild(desc);
|
||||
|
||||
// Which function is used for the click event is determined by
|
||||
// the corresponding location/index in the dirnames object.
|
||||
const functionsList = [
|
||||
() => goFrame(item.path),
|
||||
() => goFrame('/webretro?core=' + item.core + '&rom=' + item.rom),
|
||||
item.custom
|
||||
? () => goProx[item.custom]('stealth')
|
||||
: () => goFrame('/archive/g/' + item.path),
|
||||
];
|
||||
|
||||
a.addEventListener(
|
||||
'click',
|
||||
clickHandler(
|
||||
functionsList[Object.values(dirnames).indexOf(dir)],
|
||||
a
|
||||
)
|
||||
);
|
||||
|
||||
navList.appendChild(a);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'flash-nav':
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
// Load each item as an anchor tag with a short title and click
|
||||
// event listener.
|
||||
const item = data[i],
|
||||
a = document.createElement('a');
|
||||
a.href = '#';
|
||||
a.textContent = item.slice(0, -4);
|
||||
|
||||
a.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
goFrame('/flash?swf=' + item);
|
||||
});
|
||||
|
||||
navList.appendChild(a);
|
||||
}
|
||||
break;
|
||||
|
||||
// No default case.
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
})();
|
||||
591
views/assets/js/common-1735118314.js
Normal file
|
|
@ -0,0 +1,591 @@
|
|||
/* -----------------------------------------------
|
||||
/* Authors: QuiteAFancyEmerald, Yoct, and OlyB
|
||||
/* GNU Affero General Public License v3.0: https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||
/* MAIN Holy Unblocker LTS Common Script
|
||||
/* ----------------------------------------------- */
|
||||
|
||||
// Encase everything in a new scope so that variables are not accidentally
|
||||
// attached to the global scope.
|
||||
(() => {
|
||||
// To be defined after the document has fully loaded.
|
||||
let uvConfig = {};
|
||||
// Get the preferred apex domain name. Not exactly apex, as any
|
||||
// subdomain other than those listed will be ignored.
|
||||
const getDomain = () =>
|
||||
location.host.replace(/^(?:www|edu|cooking|beta)\./, ''),
|
||||
// This is used for stealth mode when visiting external sites.
|
||||
goFrame = (url) => {
|
||||
localStorage.setItem('huframesrc', url);
|
||||
location.href = '/s';
|
||||
},
|
||||
/* Used to set functions for the goProx object at the bottom.
|
||||
* See the goProx object at the bottom for some usage examples
|
||||
* on the URL handlers, omnibox functions, and the uvUrl and
|
||||
* RammerheadEncode functions.
|
||||
*/
|
||||
urlHandler = (parser) =>
|
||||
typeof parser === 'function'
|
||||
? // Return different functions based on whether a URL has already been set.
|
||||
// Should help avoid confusion when using or adding to the goProx object.
|
||||
(url, mode) => {
|
||||
if (!url) return;
|
||||
url = parser(url);
|
||||
mode = `${mode}`.toLowerCase();
|
||||
if (mode === 'stealth' || mode == 1) goFrame(url);
|
||||
else if (mode === 'window' || mode == 0) location.href = url;
|
||||
else return url;
|
||||
}
|
||||
: (mode) => {
|
||||
mode = `${mode}`.toLowerCase();
|
||||
if (mode === 'stealth' || mode == 1) goFrame(parser);
|
||||
else if (mode === 'window' || mode == 0) location.href = parser;
|
||||
else return parser;
|
||||
},
|
||||
// An asynchronous version of the function above, just in case.
|
||||
asyncUrlHandler = (parser) => async (url, mode) => {
|
||||
if (!url) return;
|
||||
if (typeof parser === 'function') url = await parser(url);
|
||||
mode = `${mode}`.toLowerCase();
|
||||
if (mode === 'stealth' || mode == 1) goFrame(url);
|
||||
else if (mode === 'window' || mode == 0) location.href = url;
|
||||
else return url;
|
||||
};
|
||||
|
||||
/* COOKIE AUTH DEMO */
|
||||
|
||||
const setAuthCookie = (s, lax) => {
|
||||
document.cookie =
|
||||
s +
|
||||
`; expires=${Date.now() + 259200}; SameSite=${lax ? 'Lax' : 'None'}; domain=.${getDomain()}; path=/; Secure;`;
|
||||
};
|
||||
|
||||
/* OMNIBOX */
|
||||
|
||||
// Search engine is set to Bing. Intended to work just like the usual
|
||||
// bar at the top of a browser.
|
||||
const sx = 'duckduckgo.com/?q=',
|
||||
/*
|
||||
omnibox = url =>
|
||||
(url.indexOf("http")
|
||||
? "https://" + (url.indexOf(".") < 1 ? sx : "")
|
||||
: "")
|
||||
+ url;
|
||||
*/
|
||||
|
||||
// Another omnibox function. Unsure if the version above is needed.
|
||||
search = (input, template = `https://${sx}%s`) => {
|
||||
try {
|
||||
// Return the input if it is already a valid URL.
|
||||
// eg: https://example.com, https://example.com/test?q=param
|
||||
return new URL(input) + '';
|
||||
} catch (e) {
|
||||
// Continue if it is invalid.
|
||||
}
|
||||
|
||||
try {
|
||||
// Check if the input is valid when http:// is added to the start.
|
||||
// eg: example.com, https://example.com/test?q=param
|
||||
const url = new URL(`http://${input}`);
|
||||
// Return only if the hostname has a TLD or a subdomain.
|
||||
if (url.hostname.indexOf('.') != -1) return url + '';
|
||||
} catch (e) {
|
||||
// Continue if it is invalid.
|
||||
}
|
||||
|
||||
// Treat the input as a search query instead of a website.
|
||||
return template.replace('%s', encodeURIComponent(input));
|
||||
},
|
||||
// Parse a URL to use with Ultraviolet.
|
||||
uvUrl = (url) => {
|
||||
try {
|
||||
url =
|
||||
location.origin +
|
||||
uvConfig.prefix +
|
||||
uvConfig.encodeUrl(search(url));
|
||||
} catch (e) {
|
||||
// This is for cases where the Ultraviolet scripts have not been loaded.
|
||||
url = search(url);
|
||||
}
|
||||
return url;
|
||||
},
|
||||
// Parse a URL to use with Scramjet.
|
||||
sjUrl = (url) => {
|
||||
try {
|
||||
url =
|
||||
location.origin +
|
||||
"/worker/service/" +
|
||||
search(url);
|
||||
} catch (e) {
|
||||
// This is for cases where the SJ scripts have not been loaded.
|
||||
url = search(url);
|
||||
}
|
||||
return url;
|
||||
};
|
||||
|
||||
/* RAMMERHEAD CONFIGURATION */
|
||||
|
||||
// Parse a URL to use with Rammerhead. Only usable if the server is active.
|
||||
const RammerheadEncode = async (baseUrl) => {
|
||||
// Hellhead
|
||||
const mod = (n, m) => ((n % m) + m) % m,
|
||||
baseDictionary =
|
||||
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~-',
|
||||
shuffledIndicator = '_rhs',
|
||||
// Return a copy of the base dictionary with a randomized character order.
|
||||
// Will be used as a Caesar cipher for URL encoding.
|
||||
generateDictionary = () => {
|
||||
let str = '';
|
||||
const split = baseDictionary.split('');
|
||||
while (split.length > 0) {
|
||||
// Using .splice automatically rounds down to the nearest whole number.
|
||||
str += split.splice(Math.random() * split.length, 1)[0];
|
||||
}
|
||||
return str;
|
||||
};
|
||||
|
||||
class StrShuffler {
|
||||
constructor(dictionary = generateDictionary()) {
|
||||
this.dictionary = dictionary;
|
||||
}
|
||||
|
||||
shuffle(str) {
|
||||
// Do not reshuffle an already shuffled string.
|
||||
if (!str.indexOf(shuffledIndicator)) return str;
|
||||
|
||||
let shuffledStr = '';
|
||||
for (let i = 0; i < str.length; i++) {
|
||||
const char = str[i],
|
||||
idx = baseDictionary.indexOf(char);
|
||||
|
||||
/* For URL encoded characters and characters not included in the
|
||||
* dictionary, leave untouched. Otherwise, replace with a character
|
||||
* from the dictionary.
|
||||
*/
|
||||
if (char === '%' && str.length - i >= 3)
|
||||
// A % symbol denotes that the next 2 characters are URL encoded.
|
||||
shuffledStr += char + str[++i] + str[++i];
|
||||
// Do not modify unrecognized characters.
|
||||
else if (idx == -1) shuffledStr += char;
|
||||
// Find the corresponding dictionary entry and use the character
|
||||
// that is i places to the right of it.
|
||||
else
|
||||
shuffledStr += this.dictionary[mod(idx + i, baseDictionary.length)];
|
||||
}
|
||||
// Add a prefix signifying that the string has been shuffled.
|
||||
return shuffledIndicator + shuffledStr;
|
||||
}
|
||||
|
||||
// Unshuffling is currently not done on the client side, and likely
|
||||
// won't ever be for this implementation. It is used by the server instead.
|
||||
unshuffle(str) {
|
||||
// Do not unshuffle an already unshuffled string.
|
||||
if (str.indexOf(shuffledIndicator)) return str;
|
||||
|
||||
// Remove the prefix signifying that the string has been shuffled.
|
||||
str = str.slice(shuffledIndicator.length);
|
||||
|
||||
let unshuffledStr = '';
|
||||
for (let i = 0; i < str.length; i++) {
|
||||
const char = str[i],
|
||||
idx = this.dictionary.indexOf(char);
|
||||
|
||||
/* Convert the dictionary entry characters back into their base
|
||||
* characters using the base dictionary. Again, leave URL encoded
|
||||
* characters and unrecognized symbols alone.
|
||||
*/
|
||||
if (char === '%' && str.length - i >= 3)
|
||||
unshuffledStr += char + str[++i] + str[++i];
|
||||
else if (idx == -1) unshuffledStr += char;
|
||||
// Find the corresponding base character entry and use the character
|
||||
// that is i places to the left of it.
|
||||
else
|
||||
unshuffledStr += baseDictionary[mod(idx - i, baseDictionary.length)];
|
||||
}
|
||||
return unshuffledStr;
|
||||
}
|
||||
}
|
||||
|
||||
// Request information that's beiing stored elsewhere on the server.
|
||||
// Executes the callback function if the server responds as intended.
|
||||
const get = (url, callback, shush = false) => {
|
||||
let request = new XMLHttpRequest();
|
||||
request.open('GET', url, true);
|
||||
request.send();
|
||||
|
||||
request.onerror = () => {
|
||||
if (!shush) console.log('Cannot communicate with the server');
|
||||
};
|
||||
request.onload = () => {
|
||||
if (request.status === 200) callback(request.responseText);
|
||||
else if (!shush)
|
||||
console.log(
|
||||
`Unexpected server response to not match "200". Server says "${request.responseText}"`
|
||||
);
|
||||
};
|
||||
},
|
||||
// Functions for interacting with Rammerhead backend code on the server.
|
||||
api = {
|
||||
// Make a new Rammerhead session and do something with it.
|
||||
newsession(callback) {
|
||||
get('/newsession', callback);
|
||||
},
|
||||
|
||||
// Check if a session with the specified ID exists, then do something.
|
||||
sessionexists(id, callback) {
|
||||
get('/sessionexists?id=' + encodeURIComponent(id), (res) => {
|
||||
if (res === 'exists') return callback(true);
|
||||
if (res === 'not found') return callback(false);
|
||||
console.log('Unexpected response from server. Received ' + res);
|
||||
});
|
||||
},
|
||||
|
||||
// Request a brand new encoding table to use for Rammerhead.
|
||||
shuffleDict(id, callback) {
|
||||
console.log('Shuffling', id);
|
||||
get('/api/shuffleDict?id=' + encodeURIComponent(id), (res) => {
|
||||
callback(JSON.parse(res));
|
||||
});
|
||||
},
|
||||
},
|
||||
/* Organize Rammerhead sessions via the browser's local storage.
|
||||
* Local data consists of session creation timestamps and session IDs.
|
||||
* The rest of the data is stored on the server.
|
||||
*/
|
||||
localStorageKey = 'rammerhead_sessionids',
|
||||
localStorageKeyDefault = 'rammerhead_default_sessionid',
|
||||
sessionIdsStore = {
|
||||
// Get the local data of all stored sessions.
|
||||
get() {
|
||||
const rawData = localStorage.getItem(localStorageKey);
|
||||
if (!rawData) return [];
|
||||
try {
|
||||
const data = JSON.parse(rawData);
|
||||
|
||||
// Catch invalidly stored Rammerhead session data. Either that or
|
||||
// it's poorly spoofed.
|
||||
if (!Array.isArray(data)) throw 'getout';
|
||||
return data;
|
||||
} catch (e) {
|
||||
return [];
|
||||
}
|
||||
},
|
||||
|
||||
// Store local Rammerhead session data in the form of an array.
|
||||
set(data) {
|
||||
if (!Array.isArray(data)) throw new TypeError('Must be an array.');
|
||||
localStorage.setItem(localStorageKey, JSON.stringify(data));
|
||||
},
|
||||
|
||||
// Get the default session data.
|
||||
getDefault() {
|
||||
const sessionId = localStorage.getItem(localStorageKeyDefault);
|
||||
if (sessionId) {
|
||||
let data = sessionIdsStore.get();
|
||||
data.filter((session) => session.id === sessionId);
|
||||
if (data.length) return data[0];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
// Set a new default session based on a given session ID.
|
||||
setDefault(id) {
|
||||
localStorage.setItem(localStorageKeyDefault, id);
|
||||
},
|
||||
},
|
||||
// Store or update local data for a Rammerhead session, which consists of
|
||||
// the session's ID and when the session was last created.
|
||||
addSession = (id) => {
|
||||
let data = sessionIdsStore.get();
|
||||
data.unshift({ id: id, createdOn: new Date().toLocaleString() });
|
||||
sessionIdsStore.set(data);
|
||||
},
|
||||
// Attempt to load an existing session that has been stored on the server.
|
||||
getSessionId = () => {
|
||||
return new Promise((resolve) => {
|
||||
// Check if the browser has stored an existing session.
|
||||
const id = localStorage.getItem('session-string');
|
||||
api.sessionexists(id, (value) => {
|
||||
// Create a new session if Rammerhead can't find an existing session.
|
||||
if (!value) {
|
||||
console.log('Session validation failed');
|
||||
api.newsession((id) => {
|
||||
addSession(id);
|
||||
localStorage.setItem('session-string', id);
|
||||
console.log(id);
|
||||
console.log('^ new id');
|
||||
resolve(id);
|
||||
});
|
||||
}
|
||||
// Load the stored session now that Rammerhead has found it.
|
||||
else resolve(id);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Load the URL that was last visited in the Rammerhead session.
|
||||
return getSessionId().then(
|
||||
(id) =>
|
||||
new Promise((resolve) => {
|
||||
api.shuffleDict(id, (shuffleDict) => {
|
||||
// Encode the URL with Rammerhead's encoding table and return the URL.
|
||||
resolve(`/${id}/` + new StrShuffler(shuffleDict).shuffle(baseUrl));
|
||||
});
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
/* To use:
|
||||
* goProx.proxy(url-string, mode-as-string-or-number);
|
||||
*
|
||||
* Key: 1 = "stealth"
|
||||
* 0 = "window"
|
||||
* Nothing = return URL as a string
|
||||
*
|
||||
* Examples:
|
||||
* Stealth mode -
|
||||
* goProx.ultraviolet("https://google.com", 1);
|
||||
* goProx.ultraviolet("https://google.com", "stealth");
|
||||
*
|
||||
* await goProx.rammerhead("https://google.com", 1);
|
||||
* await goProx.rammerhead("https://google.com", "stealth");
|
||||
*
|
||||
* goProx.searx(1);
|
||||
* goProx.searx("stealth");
|
||||
*
|
||||
* Window mode -
|
||||
* goProx.ultraviolet("https://google.com", "window");
|
||||
*
|
||||
* await goProx.rammerhead("https://google.com", "window");
|
||||
*
|
||||
* goProx.searx("window");
|
||||
*
|
||||
* Return string value mode (default) -
|
||||
* goProx.ultraviolet("https://google.com");
|
||||
*
|
||||
* await goProx.rammerhead("https://google.com");
|
||||
*
|
||||
* goProx.searx();
|
||||
*/
|
||||
addEventListener('DOMContentLoaded', async () => {
|
||||
// This won't break the service workers as they store the variable separately.
|
||||
uvConfig = self['{{__uv$config}}'];
|
||||
delete self['{{__uv$config}}'];
|
||||
|
||||
// Object.freeze prevents goProx from accidentally being edited.
|
||||
const goProx = Object.freeze({
|
||||
// `location.protocol + "//" + getDomain()` more like `location.origin`
|
||||
// setAuthCookie("__cor_auth=1", false);
|
||||
ultraviolet: urlHandler(uvUrl),
|
||||
|
||||
scramjet: urlHandler(sjUrl),
|
||||
|
||||
rammerhead: asyncUrlHandler(
|
||||
async (url) => location.origin + (await RammerheadEncode(search(url)))
|
||||
),
|
||||
|
||||
searx: urlHandler(location.protocol + `//c.${getDomain()}/engine/`),
|
||||
|
||||
libreddit: urlHandler(location.protocol + '//c.' + getDomain()),
|
||||
|
||||
rnav: urlHandler(location.protocol + '//client.' + getDomain()),
|
||||
|
||||
osu: urlHandler(location.origin + '/archive/osu'),
|
||||
|
||||
mcnow: urlHandler(sjUrl('https://now.gg/play/a/10010/b')),
|
||||
|
||||
glife: urlHandler(sjUrl('https://now.gg/apps/lunime/5767/gacha-life.html')),
|
||||
|
||||
roblox: urlHandler(sjUrl('https://now.gg/apps/roblox-corporation/5349/roblox.html')),
|
||||
|
||||
amongus: urlHandler(sjUrl('https://now.gg/apps/innersloth-llc/4047/among-us.html')),
|
||||
|
||||
pubg: urlHandler(sjUrl('https://now.gg/apps/proxima-beta/2609/pubg-mobile-resistance.html')),
|
||||
|
||||
train: urlHandler(sjUrl('https://hby.itch.io/last-train-home')),
|
||||
|
||||
village: urlHandler(sjUrl('https://kwoodhouse.itch.io/village-arsonist')),
|
||||
|
||||
prison: urlHandler(sjUrl('https://vimlark.itch.io/pick-up-prison')),
|
||||
|
||||
rpg: urlHandler(sjUrl('https://alarts.itch.io/die-in-the-dungeon')),
|
||||
|
||||
speed: urlHandler(sjUrl('https://captain4lk.itch.io/what-the-road-brings')),
|
||||
|
||||
heli: urlHandler(sjUrl('https://benjames171.itch.io/helo-storm')),
|
||||
|
||||
youtube: urlHandler(sjUrl('https://inv.nadeko.net')),
|
||||
|
||||
discordUV: urlHandler(sjUrl('https://discord.com/app')),
|
||||
|
||||
discordRH: urlHandler(await RammerheadEncode('https://discord.com/app')),
|
||||
});
|
||||
|
||||
// Attach event listeners using goProx to specific app menus that need it.
|
||||
const prSet = (id, type) => {
|
||||
const formElement = document.getElementById(id);
|
||||
if (!formElement) return;
|
||||
|
||||
let prUrl = formElement.querySelector('input[type=text]'),
|
||||
prGo1 = document.querySelectorAll(`#${id}.pr-go1, #${id} .pr-go1`),
|
||||
prGo2 = document.querySelectorAll(`#${id}.pr-go2, #${id} .pr-go2`);
|
||||
|
||||
// Handle the other menu buttons differently if there is no omnibox. Menus
|
||||
// which lack an omnibox likely use buttons as mere links.
|
||||
const goProxMethod = prUrl
|
||||
? (mode) => () => {
|
||||
goProx[type](prUrl.value, mode);
|
||||
}
|
||||
: (mode) => () => {
|
||||
goProx[type](mode);
|
||||
},
|
||||
// Ultraviolet is currently incompatible with window mode.
|
||||
searchMode = type === 'ultraviolet' ? 'stealth' : 'window';
|
||||
|
||||
if (prUrl)
|
||||
prUrl.addEventListener('keydown', async (e) => {
|
||||
if (e.code === 'Enter') goProxMethod(searchMode)();
|
||||
// This is exclusively used for the validator script.
|
||||
else if (e.code === 'Validator Test') {
|
||||
e.target.value = await goProx[type](e.target.value);
|
||||
e.target.dispatchEvent(new Event('change'));
|
||||
}
|
||||
});
|
||||
|
||||
prGo1.forEach((element) => {
|
||||
element.addEventListener('click', goProxMethod('window'));
|
||||
});
|
||||
prGo2.forEach((element) => {
|
||||
element.addEventListener('click', goProxMethod('stealth'));
|
||||
});
|
||||
};
|
||||
|
||||
prSet('pr-runprod', 'ultraviolet');
|
||||
prSet('pr-sj', 'scramjet');
|
||||
prSet('pr-rh', 'rammerhead');
|
||||
prSet('pr-yt', 'youtube');
|
||||
prSet('pr-rh-dc', 'discordRH');
|
||||
prSet('pr-uv-dc', 'discordUV');
|
||||
|
||||
// Load in relevant JSON files used to organize large sets of data.
|
||||
// This first one is for links, whereas the rest are for navigation menus.
|
||||
const huLinks = await fetch('/assets/json/links.json', {
|
||||
mode: 'same-origin',
|
||||
}).then((response) => response.json());
|
||||
|
||||
for (let items = Object.entries(huLinks), i = 0; i < items.length; i++)
|
||||
// Replace all placeholder links with the corresponding entry in huLinks.
|
||||
(document.getElementById(items[i][0]) || {}).href = items[i][1];
|
||||
|
||||
const navLists = {
|
||||
// Pair an element ID with a JSON file name. They are identical for now.
|
||||
'emu-nav': 'emu-nav',
|
||||
'emulib-nav': 'emulib-nav',
|
||||
'flash-nav': 'flash-nav',
|
||||
'h5-nav': 'h5-nav',
|
||||
};
|
||||
|
||||
for (const [listId, filename] of Object.entries(navLists)) {
|
||||
let navList = document.getElementById(listId);
|
||||
|
||||
if (navList) {
|
||||
// List items stored in JSON format will be returned as a JS object.
|
||||
const data = await fetch(`/assets/json/${filename}.json`, {
|
||||
mode: 'same-origin',
|
||||
}).then((response) => response.json());
|
||||
|
||||
// Load the JSON lists into specific HTML parent elements as groups of
|
||||
// child elements, if the parent element is found.
|
||||
switch (filename) {
|
||||
case 'emu-nav':
|
||||
case 'emulib-nav':
|
||||
case 'h5-nav': {
|
||||
const dirnames = {
|
||||
// Set the directory of where each item of the corresponding JSON
|
||||
// list will be retrieved from.
|
||||
'emu-nav': 'emu',
|
||||
'emulib-nav': 'emulib',
|
||||
'h5-nav': 'h5g',
|
||||
},
|
||||
dir = dirnames[filename],
|
||||
// Add a little functionality for each list item when clicked on.
|
||||
clickHandler = (parser, a) => (e) => {
|
||||
if (e.target == a || e.target.tagName != 'A') {
|
||||
e.preventDefault();
|
||||
parser();
|
||||
}
|
||||
};
|
||||
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
// Load each item as an anchor tag with an image, heading,
|
||||
// description, and click event listener.
|
||||
const item = data[i],
|
||||
a = document.createElement('a'),
|
||||
img = document.createElement('img'),
|
||||
title = document.createElement('h3'),
|
||||
desc = document.createElement('p');
|
||||
|
||||
a.href = '#';
|
||||
img.src = `/assets/img/${dir}/` + item.img;
|
||||
title.textContent = item.name;
|
||||
desc.textContent = item.description;
|
||||
|
||||
if (filename === 'h5-nav') {
|
||||
if (item.credits === 'itch')
|
||||
desc.innerHTML +=
|
||||
'<br>Credits: Game can be found <a target="_blank" href="https://itch.io">here</a>.';
|
||||
if (item.credits === 'nowgg')
|
||||
desc.innerHTML +=
|
||||
'<br>Credits: Game can be found <a target="_blank" href="https://now.gg">here</a>.';
|
||||
}
|
||||
|
||||
a.appendChild(img);
|
||||
a.appendChild(title);
|
||||
a.appendChild(desc);
|
||||
|
||||
// Which function is used for the click event is determined by
|
||||
// the corresponding location/index in the dirnames object.
|
||||
const functionsList = [
|
||||
() => goFrame(item.path),
|
||||
() => goFrame('/webretro?core=' + item.core + '&rom=' + item.rom),
|
||||
item.custom
|
||||
? () => goProx[item.custom]('stealth')
|
||||
: () => goFrame('/archive/g/' + item.path),
|
||||
];
|
||||
|
||||
a.addEventListener(
|
||||
'click',
|
||||
clickHandler(
|
||||
functionsList[Object.values(dirnames).indexOf(dir)],
|
||||
a
|
||||
)
|
||||
);
|
||||
|
||||
navList.appendChild(a);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'flash-nav':
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
// Load each item as an anchor tag with a short title and click
|
||||
// event listener.
|
||||
const item = data[i],
|
||||
a = document.createElement('a');
|
||||
a.href = '#';
|
||||
a.textContent = item.slice(0, -4);
|
||||
|
||||
a.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
goFrame('/flash?swf=' + item);
|
||||
});
|
||||
|
||||
navList.appendChild(a);
|
||||
}
|
||||
break;
|
||||
|
||||
// No default case.
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
|
@ -1,98 +1,119 @@
|
|||
// Encase everything in a new scope so that variables are not accidentally
|
||||
// attached to the global scope.
|
||||
(() => {
|
||||
const stockSW = '/uv/sw.js',
|
||||
blacklistSW = '/uv/sw-blacklist.js',
|
||||
swAllowedHostnames = ['localhost', '127.0.0.1'],
|
||||
connection = new BareMux.BareMuxConnection('/baremux/worker.js'),
|
||||
wispUrl =
|
||||
(location.protocol === 'https:' ? 'wss' : 'ws') +
|
||||
'://' +
|
||||
location.host +
|
||||
'/wisp/',
|
||||
// Proxy configuration
|
||||
proxyUrl = 'socks5h://localhost:9050', // Replace with your proxy URL
|
||||
transports = {
|
||||
epoxy: '/epoxy/index.mjs',
|
||||
libcurl: '/libcurl/index.mjs',
|
||||
bare: '/baremux/index.mjs',
|
||||
},
|
||||
// The following two variables are copied and pasted here from csel.js.
|
||||
readCookie = async (name) => {
|
||||
// Get the first cookie that has the same name.
|
||||
for (let cookie of document.cookie.split('; '))
|
||||
if (!cookie.indexOf(name + '='))
|
||||
// Return the cookie's stored content.
|
||||
return decodeURIComponent(cookie.slice(name.length + 1));
|
||||
},
|
||||
// Sets the default transport mode based on the browser. Firefox is not
|
||||
// supported by epoxy yet, which is why this is implemented.
|
||||
defaultMode = /(?:Chrome|AppleWebKit)\//.test(navigator.userAgent)
|
||||
? 'epoxy'
|
||||
: 'libcurl';
|
||||
const stockSW = '/network/sw.js',
|
||||
blacklistSW = '/network/sw-blacklist.js',
|
||||
swAllowedHostnames = ['localhost', '127.0.0.1'],
|
||||
wispUrl =
|
||||
(location.protocol === 'https:' ? 'wss' : 'ws') +
|
||||
'://' +
|
||||
location.host +
|
||||
'/wisp/',
|
||||
proxyUrl = 'socks5h://localhost:9050', // Replace with your TOR proxy URL
|
||||
transports = {
|
||||
epoxy: '/epoxy/index.mjs',
|
||||
libcurl: '/libcurl/index.mjs',
|
||||
bare: '/baremux/index.mjs',
|
||||
},
|
||||
readCookie = async (name) => {
|
||||
for (let cookie of document.cookie.split('; ')) {
|
||||
if (!cookie.indexOf(name + '=')) {
|
||||
return decodeURIComponent(cookie.slice(name.length + 1));
|
||||
}
|
||||
}
|
||||
},
|
||||
defaultMode = /(?:Chrome|AppleWebKit)\//.test(navigator.userAgent)
|
||||
? 'epoxy'
|
||||
: 'libcurl';
|
||||
|
||||
transports.default = transports[defaultMode];
|
||||
transports.default = transports[defaultMode];
|
||||
|
||||
// Prevent the transports object from accidentally being edited.
|
||||
Object.freeze(transports);
|
||||
Object.freeze(transports);
|
||||
|
||||
const registerSW = async () => {
|
||||
if (!navigator.serviceWorker) {
|
||||
if (
|
||||
location.protocol !== 'https:' &&
|
||||
!swAllowedHostnames.includes(location.hostname)
|
||||
)
|
||||
throw new Error('Service workers cannot be registered without https.');
|
||||
const waitForScramjetController = () =>
|
||||
new Promise((resolve) => {
|
||||
const interval = setInterval(() => {
|
||||
if (typeof ScramjetController !== 'undefined') {
|
||||
clearInterval(interval);
|
||||
resolve();
|
||||
}
|
||||
}, 50);
|
||||
});
|
||||
|
||||
throw new Error("Your browser doesn't support service workers.");
|
||||
}
|
||||
const registerSW = async () => {
|
||||
if (!navigator.serviceWorker) {
|
||||
if (
|
||||
location.protocol !== 'https:' &&
|
||||
!swAllowedHostnames.includes(location.hostname)
|
||||
)
|
||||
throw new Error('Service workers cannot be registered without https.');
|
||||
|
||||
// If the user has changed the transport mode, use that over the default.
|
||||
const transportMode =
|
||||
transports[await readCookie('HBTransport')] || transports.default;
|
||||
let transportOptions = { wisp: wispUrl };
|
||||
throw new Error("Your browser doesn't support service workers.");
|
||||
}
|
||||
|
||||
// Only use Tor with the proxy if the user has enabled it in settings.
|
||||
if ((await readCookie('HBUseOnion')) === 'true')
|
||||
transportOptions.proxy = proxyUrl;
|
||||
// Set the transport mode
|
||||
const transportMode =
|
||||
transports[await readCookie('HBTransport')] || transports.default;
|
||||
let transportOptions = { wisp: wispUrl };
|
||||
|
||||
await connection.setTransport(transportMode, [transportOptions]);
|
||||
if ((await readCookie('HBUseOnion')) === 'true') {
|
||||
transportOptions.proxy = proxyUrl;
|
||||
console.log('Using Onion Proxy:', proxyUrl);
|
||||
}
|
||||
|
||||
/* Choose a service worker to register based on whether or not the user
|
||||
* has ads enabled. If the user changes this setting, this script needs
|
||||
* to be reloaded for this to update, such as by refreshing the page.
|
||||
*/
|
||||
const registrations = await navigator.serviceWorker.getRegistrations(),
|
||||
usedSW =
|
||||
(await readCookie('HBHideAds')) !== 'false' ? blacklistSW : stockSW;
|
||||
console.log('Transport mode:', transportMode);
|
||||
|
||||
// Unregister a service worker if it isn't the one being used.
|
||||
for (const registration of registrations)
|
||||
if (
|
||||
registration.active &&
|
||||
new URL(registration.active.scriptURL).pathname !==
|
||||
new URL(usedSW, location.origin).pathname
|
||||
)
|
||||
await registration.unregister();
|
||||
const connection = new BareMux.BareMuxConnection('/baremux/worker.js');
|
||||
await connection.setTransport(transportMode, [transportOptions]);
|
||||
|
||||
await navigator.serviceWorker.register(usedSW);
|
||||
};
|
||||
const registrations = await navigator.serviceWorker.getRegistrations(),
|
||||
usedSW =
|
||||
(await readCookie('HBHideAds')) !== 'false' ? blacklistSW : stockSW;
|
||||
|
||||
/*
|
||||
console.log('Service Worker being registered:', usedSW);
|
||||
|
||||
Commented out upon discovering that a duplicate BareMux connection may be
|
||||
unnecessary; previously thought to have prevented issues with refreshing.
|
||||
// Unregister outdated service workers
|
||||
for (const registration of registrations)
|
||||
if (
|
||||
registration.active &&
|
||||
new URL(registration.active.scriptURL).pathname !==
|
||||
new URL(usedSW, location.origin).pathname
|
||||
)
|
||||
await registration.unregister();
|
||||
|
||||
async function setupTransportOnLoad() {
|
||||
const conn = new BareMux.BareMuxConnection("/baremux/worker.js");
|
||||
if (await conn.getTransport() !== "/baremux/module.js") {
|
||||
await conn.setTransport("/libcurl/index.mjs", [{ wisp: wispUrl, proxy: proxyUrl }]);
|
||||
}
|
||||
}
|
||||
await navigator.serviceWorker.register(usedSW);
|
||||
};
|
||||
|
||||
// Run transport setup on page load.
|
||||
setupTransportOnLoad();
|
||||
*/
|
||||
const initializeScramjet = async () => {
|
||||
try {
|
||||
|
||||
registerSW();
|
||||
await waitForScramjetController();
|
||||
|
||||
const scramjet = new ScramjetController({
|
||||
prefix: '/worker/service/',
|
||||
files: {
|
||||
wasm: '/worker/w.wasm.js',
|
||||
worker: '/worker/w.worker.js',
|
||||
client: '/worker/w.client.js',
|
||||
shared: '/worker/w.shared.js',
|
||||
sync: '/worker/w.sync.js',
|
||||
}
|
||||
});
|
||||
|
||||
console.log('Initializing ScramjetController');
|
||||
scramjet.init('/worker/w.sw.js');
|
||||
} catch (err) {
|
||||
console.error('SJWorker initialization failed:', err);
|
||||
}
|
||||
};
|
||||
|
||||
const initialize = async () => {
|
||||
try {
|
||||
await registerSW();
|
||||
|
||||
await initializeScramjet();
|
||||
} catch (err) {
|
||||
console.error('Initialization failed:', err);
|
||||
}
|
||||
};
|
||||
|
||||
initialize();
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,4 +1,10 @@
|
|||
[
|
||||
{
|
||||
"name": "Webretro Collection",
|
||||
"path": "/webretro",
|
||||
"img": "genesis.png",
|
||||
"description": "Search through the collection of emulators featured!"
|
||||
},
|
||||
{
|
||||
"name": "GBA Emulator",
|
||||
"path": "/webretro?core=mgba",
|
||||
|
|
@ -18,16 +24,10 @@
|
|||
"description": "Emulate SNES games! Click to upload a ROM."
|
||||
},
|
||||
{
|
||||
"name": "Genesis Emulator",
|
||||
"path": "/webretro?core=genesis_plus_gx",
|
||||
"img": "genesis.png",
|
||||
"description": "Emulate Genesis games! Click to upload a ROM."
|
||||
},
|
||||
{
|
||||
"name": "N64 Emulator (BROKEN)",
|
||||
"name": "N64 Emulator",
|
||||
"path": "/webretro?core=mupen64plus_next",
|
||||
"img": "nintendo64.png",
|
||||
"description": "Emulate N64 games! Click to upload a ROM. (Currently Broken)"
|
||||
"description": "Emulate N64 games! Click to upload a ROM."
|
||||
},
|
||||
{
|
||||
"name": "VibeOS",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"hblink": "https://github.com/titaniumnetwork-dev/Holy-Unblocker",
|
||||
"hblink2": "https://github.com/titaniumnetwork-dev/Holy-Unblocker",
|
||||
"hblink2": "https://github.com/QuiteAFancyEmerald/Holy-Unblocker.git",
|
||||
"hudoclink": "https://docs.titaniumnetwork.org/services/holyunblocker",
|
||||
"flooder": "/pages/misc/flooder.html",
|
||||
"bitbrowser": "/pages/misc/bitbrowser.html",
|
||||
"firebug": "javascript:var firebug=document.createElement('script');firebug.setAttribute('src','https://luphoria.com/fbl/fbl/firebug-lite-debug.js');document.body.appendChild(firebug);(function(){if(window.firebug.version){firebug.init();}else{setTimeout(arguments.callee);}})();void(firebug);",
|
||||
|
|
@ -16,6 +17,7 @@
|
|||
"tnlink": "https://discord.gg/CwWpdGkuWY",
|
||||
"pallink": "https://github.com/LudicrousDevelopment/Palladium",
|
||||
"nclink": "https://nodeclusters.com",
|
||||
"sjlink": "https://github.com/MercuryWorkshop/scramjet",
|
||||
"qrlink": "https://support.discord.com/hc/en-us/articles/360039213771-QR-Code-Login-FAQ",
|
||||
"ytnoc": "javascript:(h=>{/youtube/.test(h+=location)?location=`//www.youtube-nocookie.com/embed/${[h.match`(?<=[ve]/|u/\\w+/|embed/|v=)[^%23&?]*`]}?autoplay=1`:0})``"
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
2
views/browserconfig.xml
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<browserconfig><msapplication><tile><square70x70logo src="assets/ico/ms-icon-70x70.png"/><square150x150logo src="assets/ico/ms-icon-150x150.png"/><square310x310logo src="assets/ico/ms-icon-310x310.png"/><TileColor>#b4213b</TileColor></tile></msapplication></browserconfig>
|
||||
|
|
@ -2,38 +2,24 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div id="documentation" class="box textm"><!--DOCS--></div>
|
||||
</div>
|
||||
|
|
@ -41,7 +27,7 @@
|
|||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
<script>
|
||||
(function () {
|
||||
var v = document.getElementById('vsc');
|
||||
|
|
|
|||
|
|
@ -1,54 +1,39 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<base href="/" />
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker | Error</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="box-error text-center">
|
||||
<h1>Site Error!</h1>
|
||||
<h2>Reload the page or do Ctrl+R!!! This fixes a lot of issues</h2>
|
||||
<p>Might be doing some maintenance or the web server is down.</p>
|
||||
<p>In that case wait a bit until it is resolved!</p>
|
||||
<h1>Si­te E­rror!</h1>
|
||||
<h2>Rel­oad the pag­e or do Ctrl+R!!! This fixes a lot of is­sues</h2>
|
||||
<p>Might be doing some mai­ntenance or the web server is down.</p>
|
||||
<p>In that case w­ait a bit until it is reso­lved!</p>
|
||||
<br />
|
||||
<p>
|
||||
Invalid URL? View the
|
||||
<a href="/questions" class="bluelink">FAQ page</a> for help!
|
||||
Inv­alid ­RL? V­iew the
|
||||
<a href="/questions" class="bluelink">F­AQ pag­e</a> for help!
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer" class="fullwidth"><!--FOOTER--></div>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -2,38 +2,24 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker | FAQ</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div id="documentation" class="box textm"><!--FAQ--></div>
|
||||
</div>
|
||||
|
|
@ -41,6 +27,6 @@
|
|||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
BIN
views/favicon.ico
Normal file
|
After Width: | Height: | Size: 264 KiB |
641
views/index.html
|
|
@ -2,286 +2,23 @@
|
|||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<meta
|
||||
name="theme-color"
|
||||
content="#b4213b"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
/>
|
||||
<meta name="googlebot" content="index, follow, snippet" />
|
||||
<meta
|
||||
name="robots"
|
||||
content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"
|
||||
/>
|
||||
<meta name="author" content="Titanium Network" />
|
||||
<meta name="generator" content="Fastify, HTML5" />
|
||||
<meta name="application-name" content="Holy Unblocker LTS" />
|
||||
<link rel="canonical" href="https://holyunblocker.org/" />
|
||||
<title>Holy Unblocker LTS | Secure & Free Web Proxy Service</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker LTS is a cutting-edge web proxy service designed to bypass web filters and blockers. Whether dealing with client-side or network-based censorship, Holy Unblocker LTS provides seamless access to blocked sites and secure, private browsing on devices like Chromebooks. Overcome content blockers, Chrome extensions, firewalls, and more with our advanced proxy solution."
|
||||
/>
|
||||
<meta
|
||||
name="keywords"
|
||||
content="web proxy, free web proxy, proxy web browser, proxy web, proxy web page, proxy for web, secure proxy, unblock websites, free proxy, bypass censorship, unblock Chromebook, proxy service, online security, private browsing, unblock social media, access blocked content, Titanium Network, proxy server, internet freedom, unblock at school, unblock at work"
|
||||
/>
|
||||
<meta property="og:site_name" content="Holy Unblocker LTS" />
|
||||
<meta property="og:url" content="https://holyunblocker.org/" />
|
||||
<meta
|
||||
property="og:title"
|
||||
content="Holy Unblocker LTS | Secure & Advanced Web Proxy Service"
|
||||
/>
|
||||
<meta property="og:type" content="website" />
|
||||
<meta
|
||||
property="og:description"
|
||||
content="Holy Unblocker LTS is a top-tier web proxy service that bypasses network and browser restrictions to access blocked websites securely. Enjoy a seamless browsing experience with robust security and advanced features."
|
||||
/>
|
||||
<meta property="og:image" content="assets/img/icon.png" />
|
||||
<meta property="og:image:secure_url" content="assets/img/icon.png" />
|
||||
<meta property="og:image:alt" content="Holy Unblocker Logo" />
|
||||
<meta property="og:locale" content="en_US" />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:site" content="@titaniumnetdev" />
|
||||
<meta name="twitter:creator" content="@titaniumnetdev" />
|
||||
<meta
|
||||
name="twitter:title"
|
||||
content="Holy Unblocker LTS | Secure & Advanced Web Proxy Service"
|
||||
/>
|
||||
<meta
|
||||
name="twitter:description"
|
||||
content="Discover Holy Unblocker LTS, a premier web proxy service that bypasses censorship and filters to provide secure access to blocked websites. Ideal for private browsing and overcoming network restrictions on devices like Chromebooks."
|
||||
/>
|
||||
<meta name="twitter:image" content="assets/img/icon2.png" />
|
||||
<meta name="twitter:image:alt" content="Holy Unblocker Icon" />
|
||||
<meta name="msapplication-TileColor" content="#b4213b" />
|
||||
<meta name="msapplication-TileImage" content="assets/img/icon.png" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta
|
||||
name="apple-mobile-web-app-status-bar-style"
|
||||
content="black-translucent"
|
||||
/>
|
||||
<meta name="apple-mobile-web-app-title" content="Holy Unblocker LTS" />
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="180x180"
|
||||
href="assets/img/apple-icon.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="16x16"
|
||||
href="assets/img/icon-small.png"
|
||||
/>
|
||||
<link rel="mask-icon" href="new.svg" color="#b4213b" />
|
||||
<link rel="manifest" href="manifest.json" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<meta name="rating" content="general" />
|
||||
<meta name="distribution" content="global" />
|
||||
<meta name="coverage" content="worldwide" />
|
||||
<meta name="target" content="all" />
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"name": "Holy Unblocker LTS",
|
||||
"alternateName": "Holy Unblocker (Titanium Network)",
|
||||
"url": "https://holyunblocker.org",
|
||||
"logo": "https://holyunblocker.org/assets/img/icon.png",
|
||||
"sameAs": [
|
||||
"https://github.com/titaniumnetwork-dev",
|
||||
"https://twitter.com/titaniumnetdev",
|
||||
"https://www.youtube.com/channel/UC6LaREFvs9L72SK1s2PcxNg",
|
||||
"https://holyunblocker.org",
|
||||
"https://www.facebook.com/holyunblocker",
|
||||
"https://www.linkedin.com/company/holyunblocker",
|
||||
"https://www.instagram.com/holyunblocker"
|
||||
],
|
||||
"description": "Holy Unblocker is an advanced web proxy service designed to bypass network censorship and filters, providing a secure and private browsing experience. It supports a wide range of websites, including YouTube, and receives frequent updates to ensure optimal performance.",
|
||||
"founder": {
|
||||
"@type": "Person",
|
||||
"name": "Quite A Fancy Emerald"
|
||||
},
|
||||
"foundingDate": "2020",
|
||||
"contactPoint": {
|
||||
"@type": "ContactPoint",
|
||||
"contactType": "Customer Support",
|
||||
"email": "8xz62b0ce@mozmail.com",
|
||||
"url": "https://holyunblocker.org/credits"
|
||||
},
|
||||
"keywords": "proxy, web proxy, unblock websites, unblock Chromebook, free web proxy, proxy list, proxy sites, unblock Chromebook, online proxy, proxy server, proxy site, proxy YouTube, bypass Securly, bypass iBoss, bypass Lightspeed filter, Holy Unblocker, Chromebooks, Titanium Network, unblock YouTube, YouTube proxy, unblocked YouTube, YouTube unblocked, anonymous browsing, internet freedom, web censorship, school proxy, work proxy, secure proxy, fast proxy, private proxy, unblock social media, access blocked sites, bypass network restrictions"
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What is Holy Unblocker?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Holy Unblocker is a free and secure web proxy service designed to bypass web filters and blockers. It supports numerous sites, emphasizing detailed design, mechanics, and advanced features to provide a seamless browsing experience."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How do I unblock websites at school using Holy Unblocker?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "To unblock websites at school, use Holy Unblocker, a free web proxy service that is frequently updated. If a site gets blocked, join the Titanium Network Discord to request a new site. Monthly restocks help prevent mass blocking."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What websites can I access with Holy Unblocker?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Holy Unblocker allows access to a wide variety of websites, including popular sites like Discord, Spotify, YouTube, and many game sites."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is Holy Unblocker safe to use?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Absolutely! Holy Unblocker ensures a safe browsing experience by not collecting or logging any user data. Refer to our Privacy Policy for more details. Additionally, Holy Unblocker is open-source, ensuring full transparency."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Does Holy Unblocker hide my search history?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Yes, Holy Unblocker hides your search history. You can customize your tab appearance via Settings > Tab Cloak and use Stealth mode for private browsing."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How can I get more Holy Unblocker sites?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Join the Titanium Network Discord at discord.gg/unblock and type \"/proxy\" in our bots channel to receive a new site via DMs from our bot."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is Holy Unblocker open-source?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Yes, Holy Unblocker is open-source. Visit our GitHub to deploy or host your own instance of Holy Unblocker, ensuring maximum privacy control."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How fast and advanced is Holy Unblocker?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Holy Unblocker is a fast and highly advanced web proxy service, featuring CAPTCHA integration, customizable blacklist settings, leak prevention mechanisms, robust security measures, and extensive site compatibility via Ultraviolet + Wisp."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Can I self-host Holy Unblocker for better privacy?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Yes, you can easily fork the Holy Unblocker repository and self-host it for maximum privacy control, ensuring no user data is collected."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What makes Holy Unblocker different from other web proxy services?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Holy Unblocker stands out with its transparency and privacy control, collecting no user data. It leverages custom source randomization and projects like Epoxy, Wisp, and Ultraviolet to effectively bypass web and network filters."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What design principles does Holy Unblocker follow?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Holy Unblocker uses the Nord Theme for its optimal design color palette, prioritizing readable code syntax and user-friendly UI components."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How do I start using Holy Unblocker?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Head to the Web Proxies page and select one of the featured proxies. Then, type the site you wish to access in the search box. Each web proxy has its own level of effectiveness, speed, and security. Ultraviolet is highly recommended for the best experience."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What pre-linked applications does Holy Unblocker feature?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Holy Unblocker features a collection of pre-linked applications, including YouTube, Spotify, Webretro (an online everything emulator), Ruffle.fs (Adobe Flash Emulator), and an expansive library for each respective app."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is Holy Unblocker planning to support more applications?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Yes, Holy Unblocker is soon to support the Anura games library, expanding its range of pre-linked applications."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How do I deploy Holy Unblocker on my own server?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Holy Unblocker is designed to be easy to deploy and use on personal setups or production loads. Detailed guides can be found at the official GitHub repository and Titanium Network Docs."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Where is the default proxy location when starting Holy Unblocker?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "The default place for the proxy when started is http://localhost:8080. You can change this setting if needed in config.json. This website is hosted locally with Ultraviolet and Rammerhead built-in."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How can I contribute to Holy Unblocker?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Holy Unblocker thrives thanks to its contributors. You can get involved in various ways, including design, core development, applications and games, documentation, and testing and QA. Visit our GitHub repository and join our Discord server to get started."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div
|
||||
id="header"
|
||||
class="fullwidth"
|
||||
role="navigation"
|
||||
aria-label="Main navigation"
|
||||
>
|
||||
<div id="header" class="fullwidth" role="navigation">
|
||||
<!--HEADER-->
|
||||
</div>
|
||||
<div id="banner" class="fullwidth">
|
||||
|
|
@ -290,43 +27,44 @@
|
|||
</p>
|
||||
</div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div class="home-grid-container" aria-label="Home Grid Container">
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div class="home-grid-container">
|
||||
<div class="home-text" role="banner">
|
||||
<h1><span>End Internet Censorship.</span></h1>
|
||||
<h1>Privacy right at your fingertips.</h1>
|
||||
<a class="homebutton" href="#scrollfix" aria-label="Bypass now"
|
||||
>Bypass now?</a
|
||||
<h1><span>En­d I­nt­ern­et Cen­sors­hi­p.</span></h1>
|
||||
<h1>Pri­va­cy ri­gh­t a­t yo­ur fi­nge­rti­ps.</h1>
|
||||
<a class="homebutton" href="#scrollfix"
|
||||
>By­pas­s no­w?</a
|
||||
>
|
||||
<a class="homebutton mobile" href="/browsing" aria-label="Browse now"
|
||||
>Bypass now?</a
|
||||
<a class="homebutton mobile" href="/browsing"
|
||||
>B­yp­ass no­w?</a
|
||||
>
|
||||
</div>
|
||||
<div class="mac-window" aria-label="Command Line Instructions">
|
||||
<div
|
||||
class="mac-title-bar"
|
||||
role="banner"
|
||||
aria-label="Mac Window Title Bar"
|
||||
>
|
||||
<div class="mac-buttons" aria-label="Mac Window Buttons">
|
||||
<span class="mac-close" aria-label="Close Window"></span>
|
||||
<span class="mac-minimize" aria-label="Minimize Window"></span>
|
||||
<span class="mac-maximize" aria-label="Maximize Window"></span>
|
||||
<div class="mac-window">
|
||||
<div class="mac-title-bar" role="banner">
|
||||
<div class="mac-buttons">
|
||||
<span class="mac-close"></span>
|
||||
<span class="mac-minimize"></span>
|
||||
<span class="mac-maximize"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mac-content">
|
||||
<p>
|
||||
<span class="cmd">git clone --recurse-submodules<span class="url"> https://github.com/QuiteAFancyEmerald/Holy-Unblocker.git</span> </span
|
||||
<span class="cmd">gi­t clo­ne --re­cu­rse-sub­modul­es<span class="url"> ht­t­ps://g­it­h­ub.co­m/Qu­it­eAF­an­cyE­me­ral­d/Ho­ly-Unblock­er.g­i­t</span> </span
|
||||
><br />
|
||||
<span class="cmd">cd Holy-Unblocker </span><br />
|
||||
<span class="comment">Recommended you switch branches via your IDE to a stable released branch such as v6.x instead of master.</span><br />
|
||||
<span class="cmd">npm start </span><br />
|
||||
<span class="comment">Or on subsequent uses...</span><br />
|
||||
<span class="cmd">npm restart </span><br /><br />
|
||||
<span class="comment">Holy Unblocker LTS v<!-- VERSION --></span
|
||||
<span class="cmd">cd Ho­l­y-Un­bl­oc­ke­r­</span><br />
|
||||
<span class="comment">Recom­mend­ed you s­witch bra­nches vi­a your I­DE to a sta­ble rele­ased bran­ch suc­h as v6.x inste­ad of mast­er.</span><br />
|
||||
<span class="cmd">n­pm st­art </span><br />
|
||||
<span class="comment">O­r o­n subs­eque­nt us­es...</span><br />
|
||||
<span class="cmd">n­pm restart </span><br /><br />
|
||||
<span class="comment">H­ol­y Un­bl­ock­er LT­S v<!-- VERSION --></span
|
||||
><br />
|
||||
<span class="comment">Node.js v20</span><br />
|
||||
<span class="comment">Fastify v4.28.1</span>
|
||||
<span class="comment">N­od­e.j­s v2­0</span><br />
|
||||
<span class="comment">Fa­sti­fy v4­.2­.1</span><br /><br />
|
||||
<span class="downarrowgroup">
|
||||
<i class="fas fa-level-down-alt"></i>
|
||||
<i class="fas fa-level-down-alt"></i>
|
||||
<i class="fas fa-level-down-alt"></i>
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -338,49 +76,49 @@
|
|||
<div class="hero-text-wrap">
|
||||
<div class="brand-logo-container">
|
||||
<i class="far fa-window-restore palered"></i>
|
||||
<h2 class="hero-content-header">Holy Unblocker is free.</h2>
|
||||
<h2 class="hero-content-header">H­oly Un­bl­ock­er is­ fr­ee.</h2>
|
||||
</div>
|
||||
<p>
|
||||
Being open source, you can easily fork this repository and self
|
||||
host for maximum privacy control. In contrast to numerous other
|
||||
web proxy services, HU LTS stands out with complete transparency
|
||||
and privacy control. We collect no user data is collected and
|
||||
ensure browsing privacy.
|
||||
Be­ing o­p­en sou­rce, you can ea­sily for­k th­is re­po­si­tor­y and se­lf
|
||||
ho­st for maxi­m­um priv­acy control. In contr­ast to num­erous other
|
||||
w­eb pro­xy se­rvi­ces, H­U L­TS sta­nds out with comp­lete trans­parency
|
||||
and priv­acy control. We co­llect no us­er da­ta is co­llec­ted and
|
||||
en­sure brow­sing pr­iv­a­cy.
|
||||
</p>
|
||||
<div class="brand-logo-container">
|
||||
<i class="far fa-window-restore palered"></i>
|
||||
<h2 class="hero-content-header">
|
||||
Holy Unblocker is fast and highly advanced.
|
||||
Ho­ly Un­blo­ck­er is fa­s­t a­n­d hi­gh­ly a­dv­anc­ed.
|
||||
</h2>
|
||||
</div>
|
||||
<p>
|
||||
HU LTS delivers exceptional web proxy performance. It boasts a
|
||||
robust feature set including CAPTCHA integration, customizable
|
||||
blacklist settings, leak prevention mechanisms, robust security
|
||||
measures, and extensive site compatibility support via
|
||||
Ultraviolet + Wisp.
|
||||
H­U LT­S del­iv­ers ex­ce­ptio­nal we­b p­ro­xy pe­rfo­rman­ce. It boa­sts a
|
||||
ro­bust feat­ure set inclu­ding CAPT­CHA integ­ration, cu­stomiza­ble
|
||||
blacklist setti­ngs, le­ak prev­ention mechan­isms, rob­ust securi­ty
|
||||
mea­sures, and exte­nsive site co­mpat­ibility supp­ort via
|
||||
Ul­travio­let + Wi­sp.
|
||||
</p>
|
||||
<div class="brand-logo-container">
|
||||
<i class="far fa-window-restore palered"></i>
|
||||
<h2 class="hero-content-header">
|
||||
Holy Unblocker is fast and highly advanced.
|
||||
Ho­ly Un­bl­ock­er i­s fas­t and h­igh­ly adv­anc­ed.
|
||||
</h2>
|
||||
</div>
|
||||
<p>
|
||||
Leveraging our custom source randomization and projects like
|
||||
Epoxy, Wisp, and Ultraviolet, HU LTS delivers a seamless
|
||||
experience that effectively circumvents web and network filters.
|
||||
This is achieved entirely within your browser and our backend
|
||||
(or your own if self-hosting), enabling users to bypass even the
|
||||
most stringent censorship blocks.
|
||||
Lever­agin­g our cus­om so­urce ran­dom­ization and proj­ects like
|
||||
Epox­y, Wi­sp, an­d Ul­travi­olet, H­U L­T­S delivers a seaml­ess
|
||||
exper­ience that effecti­vely circumv­ents w­b and netwo­rk filte­rs.
|
||||
Th­is is achie­ved ent­irely withi­n your brow­er and ou­r bac­kend
|
||||
(or yo­ur o­wn if sel­f-hosti­ng), enabling users to by­pass even the
|
||||
mos­t stringe­nt censo­rship bloc­ks.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="image-container-hero">
|
||||
<img class="hero" src="/assets/img/icon2.png" alt="icon" />
|
||||
<h1>Holy Unblocker LTS</h1>
|
||||
<h2>Free and transparent for use</h2>
|
||||
<a class="fancybutton glowbutton" href="/browsing">Browse Now</a>
|
||||
<h1>Ho­ly Unb­loc­ker L­T­S</h1>
|
||||
<h2>Fr­e­e an­d transp­arent for u­se</h2>
|
||||
<a class="fancybutton glowbutton" href="/browsing">Br­owse No­w</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -389,63 +127,63 @@
|
|||
<div class="carousel">
|
||||
<div class="carousel-inner">
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/fastify.png" alt="Fastify" />
|
||||
<img src="/assets/img/fy.png" alt="F­asti­fy" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/nordtheme.png" alt="Nord Theme" />
|
||||
<img src="/assets/img/nt.png" alt="No­rd The­me" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/nodejs.png" alt="Nodejs" />
|
||||
<img src="/assets/img/nj.png" alt="No­d­ejs" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/fontawesome.png" alt="Font Awesome" />
|
||||
<img src="/assets/img/fa.png" alt="Fo­nt Aw­es­ome" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/webretro.png" alt="Webretro" />
|
||||
<img src="/assets/img/wr.png" alt="We­bre­tro" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/ruffle.png" alt="Ruffle" />
|
||||
<img src="/assets/img/rs.png" alt="Ruf­fle" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/uv.png" alt="Ultraviolet" />
|
||||
<img src="/assets/img/config.png" alt="Ult­ra­viol­et" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/rammerhead.png" alt="Rammerhead" />
|
||||
<img src="/assets/img/rh.png" alt="Ram­merh­ead" />
|
||||
</div>
|
||||
<!-- Duplicate logos for continuous scrolling effect -->
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/fastify.png" alt="Fastify" />
|
||||
<img src="/assets/img/fy.png" alt="Fas­tify" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/nordtheme.png" alt="Nord Theme" />
|
||||
<img src="/assets/img/nt.png" alt="No­rd Th­eme" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/nodejs.png" alt="Nodejs" />
|
||||
<img src="/assets/img/nj.png" alt="N­odejs" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/fontawesome.png" alt="Font Awesome" />
|
||||
<img src="/assets/img/fa.png" alt="F­ont Awe­some" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/webretro.png" alt="Webretro" />
|
||||
<img src="/assets/img/wr.png" alt="Webre­tro" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/ruffle.png" alt="Ruffle" />
|
||||
<img src="/assets/img/rs.png" alt="Ru­ffle" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/uv.png" alt="Ultraviolet" />
|
||||
<img src="/assets/img/config.png" alt="Ult­ra­vio­let" />
|
||||
</div>
|
||||
<div class="dependencylogo">
|
||||
<img src="/assets/img/rammerhead.png" alt="Rammerhead" />
|
||||
<img src="/assets/img/rh.png" alt="Ra­mm­erh­ead" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<div data-aos="fade-left" class="splashstroke">
|
||||
<div class="splashstroke">
|
||||
<div>
|
||||
<h1 class="splashstrokeheader">
|
||||
Designed with focus<span class="underline-svg"></span>.
|
||||
Desig­ned wi­th fo­cus<span class="underline-svg"></span>.
|
||||
</h1>
|
||||
</div>
|
||||
<svg class="underline-svg" viewBox="0 0 390 55" fill="none">
|
||||
|
|
@ -484,14 +222,14 @@
|
|||
<div data-aos="fade-right" id="info" class="box-card">
|
||||
<div class="content">
|
||||
<div class="text-wrap">
|
||||
<h1>Overview</h1>
|
||||
<h1>Ov­er­view</h1>
|
||||
<p>
|
||||
Holy Unblocker LTS, an experimental web proxy service, can
|
||||
bypass web filters or 'blockers' regardless of whether the
|
||||
method of censorship is client-side or network-based. This
|
||||
includes the potential ability to bypass content blockers
|
||||
overseas, Chrome extensions, localized client firewalls, and
|
||||
network-related filters.
|
||||
Hol­y Un­bloc­ker LT­S, an ex­pe­r­im­ental we­b pr­ox­y se­rvi­ce, can
|
||||
byp­ass we­b filt­ers or 'blo­ckers' re­gardl­ess of wh­ether the
|
||||
meth­od of c­e­ns­or­sh­ip is cli­ent-side or net­work-based. This
|
||||
in­cl­udes the pote­ntial abil­ity to b­y­pa­ss co­ntent b­loc­ker­s
|
||||
over­se­as, Chr­ome ext­ensio­ns, local­ized cli­ent firewa­lls, and
|
||||
ne­tw­ork-rela­ted filt­ers.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -503,23 +241,22 @@
|
|||
/>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Repeat the above structure for the second box-card -->
|
||||
<div data-aos="fade-left" id="info2" class="box-card">
|
||||
<div class="content">
|
||||
<div class="text-wrap">
|
||||
<h1>Intent</h1>
|
||||
<h1>Int­ent</h1>
|
||||
<p>
|
||||
This project serves mostly as a proof of concept for the ideal
|
||||
clientless solution to bypassing censorship. Being a secure web
|
||||
proxy service, it supports numerous sites while being updated
|
||||
frequently and concentrating on detail with design, mechanics,
|
||||
and features.
|
||||
Th­is pr­oject ser­ves mo­stly as a p­roof of conce­pt for the id­eal
|
||||
clien­tless solut­ion to bypas­sing ce­nso­rship. Bei­ng a secu­re we­b
|
||||
pr­ox­y ser­vice, it suppo­rts numer­ous sites w­hile be­ing upd­ated
|
||||
frequen­tly and concen­trating on d­etail w­ith des­ign, mech­anics,
|
||||
and feature­s.
|
||||
</p>
|
||||
<p>
|
||||
This project's palette is built using
|
||||
<a href="https://nordtheme.com">Nord Theme</a> for its optimal
|
||||
design color palette and prioritization of readable code syntax
|
||||
and UI components.
|
||||
Th­s proj­ect's palet­te is bu­ilt u­sing
|
||||
<a href="https://nordtheme.com">Nor­d Th­eme</a> for it­s opti­mal
|
||||
desig­n col­or pale­tte and prio­ritiza­tion of r­ada­ble cod­e sy­ntax
|
||||
and U­I compone­nts.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -534,14 +271,14 @@
|
|||
<div data-aos="fade-right" id="info2" class="box-card">
|
||||
<div class="content">
|
||||
<div class="text-wrap">
|
||||
<h1>Usage</h1>
|
||||
<h1>U­s­age</h1>
|
||||
<p>
|
||||
Head to the <a href="/browsing">Web Proxies</a> page and select
|
||||
one of the proxies featured! Afterwards, type out the site you
|
||||
wish to access in the search box. Each web proxy has its own
|
||||
level of effectiveness, speed and security. It is recommended to
|
||||
use Ultraviolet.<br /><br />Example Website To Unblock:
|
||||
<code>https://coolmathgames.com</code>
|
||||
Hea­d to th­e <a href="/browsing">We­b Pro­xi­es</a> pa­ge and sele­ct
|
||||
o­ne of the pro­xies featur­ed! Afterw­ards, t­ype ou­t the si­te you
|
||||
wi­sh to a­ccess in t­he sea­rch box. Ea­ch we­b pro­xy has its o­wn
|
||||
level of eff­ectiveness, speed and sec­ur­ity. It is rec­omm­end­ed to
|
||||
use Ultravi­olet.<br /><br />Ex­ample Webs­ite To Un­bl­ock:
|
||||
<code>ht­tps://co­olmath­ames.com</code>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -552,15 +289,15 @@
|
|||
<div data-aos="fade-left" id="info2" class="box-card">
|
||||
<div class="content">
|
||||
<div class="text-wrap">
|
||||
<h1>Apps</h1>
|
||||
<h1>Ap­ps</h1>
|
||||
<p>
|
||||
HU LTS features a collection of pre-linked applications,
|
||||
including YouTube, Spotify,
|
||||
<a href="/emulators">Webretro</a> (an online everything
|
||||
emulator), <a href="/flash-games">Ruffle.fs</a> (Adobe Flash
|
||||
Emulator), and an expansive library for each respective app.
|
||||
H­U L­TS fe­atures a colle­ction of pre-li­nked appli­cat­ions,
|
||||
incl­uding YouT­ube, Spot­ify,
|
||||
<a href="/emulators">Webre­tro</a> (a­n onl­ine eve­ryt­ing
|
||||
em­ula­tor), <a href="/flash-games">Ruf­fle.f­s</a> (Ad­obe Fla­sh
|
||||
Em­ulat­or), and an expans­ive libra­ry for each r­espective ap­p.
|
||||
</p>
|
||||
<p>This project is soon to support the Anura games library.</p>
|
||||
<p>Th­is pr­oje­ct i­s soo­n to sup­port th­e An­ura ga­mes librar­y.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="image-container">
|
||||
|
|
@ -574,46 +311,48 @@
|
|||
<div data-aos="fade-right" id="info2" class="box-card">
|
||||
<div class="content">
|
||||
<div class="text-wrap">
|
||||
<h1>Hosting and Deployment</h1>
|
||||
<h1>Ho­sting an­d Depl­oymen­t</h1>
|
||||
<p>
|
||||
<strong>Holy Unblocker LTS</strong> is designed with flexibility
|
||||
and ease of deployment in mind. As an open-source solution, it
|
||||
is straightforward to set up on both personal and production
|
||||
environments. Key features include modularity for ad-blocking,
|
||||
source randomization, and advanced proxy navigation.<br /><br />
|
||||
For comprehensive setup instructions, visit our official
|
||||
<strong>Ho­ly Unbl­ock­er LT­S</strong> is desig­ned with flexib­ility
|
||||
a­nd eas­e of depl­oyment i­n mi­nd. A­s a­n o­pen-so­urce so­lution, it
|
||||
is stra­ightfor­ward to s­et u­p on b­oth p­erso­nal and pr­odu­ction
|
||||
envi­ronments. K­ey featu­res incl­ude mod­ula­rity for ad-b­loc­king,
|
||||
s­ource ran­domi­zat­ion, and advan­ced pr­oxy naviga­tion.<br /><br />
|
||||
Fo­r compr­ehe­nsive set­up instruct­ions, vis­it our of­ficial
|
||||
<a
|
||||
href="https://github.com/QuiteAFancyEmerald/Holy-Unblocker"
|
||||
title="Holy Unblocker LTS GitHub Repository"
|
||||
id="hulink2"
|
||||
href="#"
|
||||
title="Ho­ly Unblo­cker L­TS GitH­ub Reposi­tory"
|
||||
target="_blank"
|
||||
rel="noopener nore­ferrer"
|
||||
>Git­Hub repo­sito­ry</a
|
||||
>, t­he
|
||||
<a
|
||||
id="hudoclink"
|
||||
href="#"
|
||||
title="Tita­nium Net­work Documen­tation"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>GitHub repository</a
|
||||
>, the
|
||||
<a
|
||||
href="https://docs.titaniumnetwork.org/services/holyunblocker"
|
||||
title="Titanium Network Documentation"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>Titanium Network Docs</a
|
||||
>Ti­tanium Net­work D­oc­s</a
|
||||
>, or
|
||||
<a href="?documentation" title="Additional Hosting Information"
|
||||
>linked here on the main site</a
|
||||
<a href="?documentation" title="Addi­tional Host­ing Inform­ation"
|
||||
>li­nked he­re on the ma­in s­ite</a
|
||||
>.
|
||||
</p>
|
||||
<p>
|
||||
Additional scripts can be found in
|
||||
<code>/views/assets/js/</code>:<br />
|
||||
- <strong>bareTransport.js</strong>: Locally installed module
|
||||
for Ultraviolet functionality.<br />
|
||||
- <strong>card.js</strong>: Adds visual effects to the box
|
||||
Addit­ional sc­ripts can be fo­und i­n
|
||||
<code>/views/ass­ets/js/</code>:<br />
|
||||
- <strong>ba­reTranspo­rt.js</strong>: Loca­lly insta­lled mo­ule
|
||||
for Ultr­avi­olet functi­onal­ity.<br />
|
||||
- <strong>car­d.js</strong>: Ad­ds visu­al eff­ects to the bo­x
|
||||
cards.<br />
|
||||
- <strong>common.js</strong>: Provides essential features across
|
||||
all pages.<br />
|
||||
- <strong>csel.js</strong>: Manages the settings menu.<br />
|
||||
- <strong>particles.js</strong>: Creates animated background
|
||||
effects.<br />
|
||||
- <strong>register-sw.js</strong>: Handles service workers and
|
||||
Ultraviolet integration.
|
||||
- <strong>comm­on.js</strong>: ­rovid­es essen­tial featur­es acr­oss
|
||||
al­l page­s.<br />
|
||||
- <strong>cs­el.js</strong>: Ma­nages t­he sett­ings m­enu.<br />
|
||||
- <strong>part­ic­les.j­s</strong>: Crea­tes anim­ated bac­k­ground
|
||||
effec­ts.<br />
|
||||
- <strong>re­gist­er-s­w.js</strong>: H­andles serv­ice w­orkers an­d
|
||||
Ult­rav­iolet int­egr­ation.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -621,54 +360,56 @@
|
|||
<img
|
||||
class="hero"
|
||||
src="/assets/img/hosting.png"
|
||||
alt="Hosting and Deployment Icon"
|
||||
title="Hosting and Deployment for Holy Unblocker LTS"
|
||||
alt="Host­ing and D­eploy­ment Ic­on"
|
||||
title="Ho­sting and D­eploy­ment for Ho­ly Unbl­ock­er L­T­S"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div data-aos="fade-left" id="info2" class="box-card">
|
||||
<div class="content">
|
||||
<div class="text-wrap">
|
||||
<h1>Contributing</h1>
|
||||
<h1>Con­trib­uting</h1>
|
||||
<p>
|
||||
<strong>Holy Unblocker LTS</strong> thrives due to the dedicated
|
||||
efforts of our amazing contributors. As an open-source project,
|
||||
<strong>HU LTS</strong> relies on the collective skills and
|
||||
passion of its community to drive continuous improvement and
|
||||
deliver the best experience for all users.
|
||||
<strong>Ho­ly Unb­locke­r L­T­S</strong> thr­ives d­ue t­o t­he dedic­ated
|
||||
effor­ts of o­ur ama­zing c­ontributo­rs. As an op­en-sour­ce proj­ect,
|
||||
<strong>H­U LT­S</strong> r­elies o­n t­he collect­ive ski­lls an­d
|
||||
pass­ion o­f it­s commun­ity to driv­e contin­uous i­mprove­ment an­d
|
||||
deliv­er the b­est exp­eri­ence for a­ll u­sers.
|
||||
</p>
|
||||
<p>
|
||||
There are numerous ways to get involved and make a meaningful
|
||||
impact on <strong>Holy Unblocker LTS</strong>:<br /><br />
|
||||
- <strong>Design</strong>: Contribute to the visual aesthetics
|
||||
and user experience.<br />
|
||||
- <strong>Core Development</strong>: Help enhance the core
|
||||
functionality and performance.<br />
|
||||
- <strong>Applications and Games</strong>: Develop and integrate
|
||||
new features or games.<br />
|
||||
- <strong>Documentation</strong>: Assist with creating and
|
||||
refining project documentation.<br />
|
||||
- <strong>Testing and QA</strong>: Ensure the software is
|
||||
bug-free and meets quality standards.
|
||||
Th­ere ar­e numer­ous way­s t­o ge­t invol­ved and mak­e a mean­ing­ful
|
||||
imp­act on <strong>Ho­ly Unbl­ocke­r LT­S</strong>:<br /><br />
|
||||
- <strong>Design</strong>: Contr­ibute t­o the vis­ual aesthe­tics
|
||||
a­nd use­r exper­ience.<br />
|
||||
- <strong>Co­re De­velo­pment</strong>: H­elp enhan­ce the co­re
|
||||
functio­nality and perform­ance.<br />
|
||||
- <strong>Applic­ations and Ga­mes</strong>: Dev­elop and integ­rate
|
||||
n­ew feature­s or g­ames.<br />
|
||||
- <strong>Docum­entation</strong>: A­ssist with cr­ea­ting and
|
||||
refin­ing proje­ct documen­tation.<br />
|
||||
- <strong>Test­ing and Q­A</strong>: Ens­ure the soft­are is
|
||||
bug-fr­ee and meet­s quali­ty st­andards.
|
||||
</p>
|
||||
<p>
|
||||
To start contributing, visit our
|
||||
T­o sta­rt con­trib­uting, vi­sit o­ur
|
||||
<a
|
||||
href="https://github.com/QuiteAFancyEmerald/Holy-Unblocker"
|
||||
title="Holy Unblocker LTS GitHub Repository"
|
||||
id="hulink2"
|
||||
href="#"
|
||||
title="H­oly Unbl­ocker L­TS Gi­tHub Re­posi­tory"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>GitHub repository</a
|
||||
>Gi­tHub re­posi­tory</a
|
||||
>
|
||||
and join our
|
||||
a­nd jo­in ou­r
|
||||
<a
|
||||
href="https://discord.gg/unblock"
|
||||
title="Holy Unblocker LTS Discord Server"
|
||||
id="tnlink"
|
||||
href="#"
|
||||
title="Ho­ly U­nblo­cker L­TS Disc­ord Ser­ver"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>Discord server</a
|
||||
>Disc­ord ser­ver</a
|
||||
>
|
||||
for real-time discussions and updates.
|
||||
f­or rea­l-ti­me disc­ussio­ns and up­dat­es.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -676,8 +417,8 @@
|
|||
<img
|
||||
class="hero"
|
||||
src="/assets/img/git.png"
|
||||
alt="Contributing GitHub Icon"
|
||||
title="Contribute to Holy Unblocker LTS on GitHub"
|
||||
alt="Con­tribut­ing GitH­ub Ico­n"
|
||||
title="Cont­ribu­te to H­oly Unbl­ocker LT­S o­n Gi­tHub"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -689,51 +430,51 @@
|
|||
<div class="brand-logo-container">
|
||||
<i class="far fa-window-restore palered"></i>
|
||||
<h2 class="hero-content-header">
|
||||
Unblock Websites with Holy Unblocker LTS
|
||||
Unbl­ock W­ebsi­tes wi­th H­oly U­nblocke­r LT­S
|
||||
</h2>
|
||||
</div>
|
||||
<p>
|
||||
Holy Unblocker LTS is an open-source
|
||||
<strong>public web proxy</strong>. Enjoy unrestricted access to
|
||||
online content and secure browsing with our advanced
|
||||
<strong>web proxy unblocking</strong> features.
|
||||
H­oly Unblo­cker LT­S is an o­pen-sour­ce
|
||||
<strong>pub­lic web pr­oxy</strong>. Enj­oy u­nrestri­cted acc­ess to
|
||||
on­line conte­nt and sec­ure br­owsing with our adv­anced
|
||||
<strong>web pr­oxy unbloc­king</strong> featu­res.
|
||||
</p>
|
||||
<div class="brand-logo-container">
|
||||
<i class="far fa-window-restore palered"></i>
|
||||
<h2 class="hero-content-header">
|
||||
Free and Accessible Proxy Services
|
||||
F­ree an­d A­ccessi­ble Pro­xy Servi­ces
|
||||
</h2>
|
||||
</div>
|
||||
<p>
|
||||
Benefit from our <strong>free web proxy service</strong> that
|
||||
helps you <strong>unblock websites</strong> and access
|
||||
restricted content at no cost. Perfect for navigating
|
||||
educational or workplace filters, our service ensures seamless
|
||||
and reliable access.
|
||||
Bene­fit from ou­r <strong>fr­ee w­eb pr­oxy s­erv­ice</strong> that
|
||||
helps you <strong>u­nb­lock webs­ites</strong> and access
|
||||
restri­cted conte­nt at no co­st. Perf­ect for naviga­ting
|
||||
educati­onal or workp­lace filt­ers, our s­ervice ensur­es sea­mless
|
||||
and relia­ble acce­ss.
|
||||
</p>
|
||||
<div class="brand-logo-container">
|
||||
<i class="far fa-window-restore palered"></i>
|
||||
<h2 class="hero-content-header">
|
||||
Efficient and Reliable Access
|
||||
Ef­fici­ent and Reli­able Acc­ess
|
||||
</h2>
|
||||
</div>
|
||||
<p>
|
||||
Our <strong>unblocked web proxy</strong> is designed to meet
|
||||
diverse needs, providing a robust solution for overcoming web
|
||||
filters and enjoying a high-quality browsing experience.
|
||||
O­ur <strong>unbloc­ked web pr­ox­y</strong> is desig­ned to me­et
|
||||
div­erse ne­eds, pr­ovidi­ng a robu­st solut­ion for overc­oming w­eb
|
||||
fil­ters and enj­oying a hi­gh-qual­ity bro­wsing exper­ience.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="image-container-hero">
|
||||
<h1>Long Term Support FOSS Project</h1>
|
||||
<a class="fancybutton glowbutton" href="/browsing">Bypass Now</a>
|
||||
<h1>L­ong T­erm Suppo­rt F­OSS Proj­ect</h1>
|
||||
<a class="fancybutton glowbutton" href="/browsing">Byp­ass N­ow</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-home text-center splashend">
|
||||
<h1>It's time to browse the internet freely.</h1>
|
||||
<a class="homebutton" href="#scrollfix">Try HU LTS For Free</a>
|
||||
<a class="homebutton mobile" href="/browsing">Try HU LTS For Free</a>
|
||||
<h1>I­t's ti­me t­o brow­se the inte­rnet fre­ely.</h1>
|
||||
<a class="homebutton" href="#scrollfix">Tr­y H­U L­TS F­or Fr­ee</a>
|
||||
<a class="homebutton mobile" href="/browsing">Tr­y H­U L­TS F­or Fr­ee</a>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer" class="fullwidth"><!--FOOTER--></div>
|
||||
|
|
@ -745,6 +486,6 @@
|
|||
<script>
|
||||
AOS.init();
|
||||
</script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,53 +0,0 @@
|
|||
{
|
||||
"short_name": "Holy Unblocker LTS",
|
||||
"name": "Holy Unblocker LTS | Free Web Proxy Service",
|
||||
"icons": [
|
||||
{
|
||||
"src": "https://holyunblocker.org/assets/img/icon.png",
|
||||
"type": "image/png",
|
||||
"sizes": "300x300"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#b4213b",
|
||||
"background_color": "#1f003e",
|
||||
"description": "Holy Unblocker LTS is a free and secure web proxy service that helps you bypass web filters and access blocked websites. Enjoy anonymous browsing and internet freedom on devices like Chromebooks at school or work.",
|
||||
"short_description": "Free web proxy service for bypassing filters and accessing blocked sites.",
|
||||
"keywords": [
|
||||
"proxy",
|
||||
"web proxy",
|
||||
"unblock websites",
|
||||
"free web proxy",
|
||||
"proxy list",
|
||||
"online proxy",
|
||||
"proxy server",
|
||||
"proxy YouTube",
|
||||
"bypass web filters",
|
||||
"Holy Unblocker",
|
||||
"unblock Chromebook",
|
||||
"Titanium Network",
|
||||
"fast proxy",
|
||||
"secure proxy",
|
||||
"anonymous browsing",
|
||||
"internet freedom"
|
||||
],
|
||||
"related_applications": [
|
||||
{
|
||||
"platform": "web",
|
||||
"url": "https://holyunblocker.org"
|
||||
},
|
||||
{
|
||||
"platform": "github",
|
||||
"url": "https://github.com/QuiteAFancyEmerald/Holy-Unblocker"
|
||||
},
|
||||
{
|
||||
"platform": "twitter",
|
||||
"url": "https://twitter.com/titaniumnetdev"
|
||||
},
|
||||
{
|
||||
"platform": "youtube",
|
||||
"url": "https://www.youtube.com/channel/UC6LaREFvs9L72SK1s2PcxNg"
|
||||
}
|
||||
]
|
||||
}
|
||||
8
views/network/network.bundle.js
Normal file
5
views/network/network.client.js
Normal file
12
views/network/network.config.js
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
// This file overwrites the stock UV config.js
|
||||
|
||||
self['{{__uv$config}}'] = {
|
||||
prefix: '/network/service/',
|
||||
encodeUrl: Ultraviolet.codec.xor.encode,
|
||||
decodeUrl: Ultraviolet.codec.xor.decode,
|
||||
handler: '/network/network.handler.js',
|
||||
client: '/network/network.client.js',
|
||||
bundle: '/network/network.bundle.js',
|
||||
config: '/network/network.config.js',
|
||||
sw: '/network/network.sw.js',
|
||||
};
|
||||
1374
views/network/network.handler.js
Normal file
445
views/network/network.sw.js
Normal file
|
|
@ -0,0 +1,445 @@
|
|||
/*globals __uv$config*/
|
||||
// Users must import the config (and bundle) prior to importing uv.sw.js
|
||||
// This is to allow us to produce a generic bundle with no hard-coded paths.
|
||||
|
||||
/**
|
||||
* @type {import('../network').UltravioletCtor}
|
||||
*/
|
||||
const Ultraviolet = self.Ultraviolet;
|
||||
|
||||
const cspHeaders = [
|
||||
'cross-origin-embedder-policy',
|
||||
'cross-origin-opener-policy',
|
||||
'cross-origin-resource-policy',
|
||||
'content-security-policy',
|
||||
'content-security-policy-report-only',
|
||||
'expect-ct',
|
||||
'feature-policy',
|
||||
'origin-isolation',
|
||||
'strict-transport-security',
|
||||
'upgrade-insecure-requests',
|
||||
'x-content-type-options',
|
||||
'x-download-options',
|
||||
'x-frame-options',
|
||||
'x-permitted-cross-domain-policies',
|
||||
'x-powered-by',
|
||||
'x-xss-protection',
|
||||
];
|
||||
const emptyMethods = ['GET', 'HEAD'];
|
||||
|
||||
class UVServiceWorker extends Ultraviolet.EventEmitter {
|
||||
constructor(config = self['{{__uv$config}}']) {
|
||||
super();
|
||||
if (!config.prefix) config.prefix = '/service/';
|
||||
this.config = config;
|
||||
/**
|
||||
* @type {InstanceType<Ultraviolet['BareClient']>}
|
||||
*/
|
||||
this.bareClient = new Ultraviolet.BareClient();
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param {Event & {request: Request}} param0
|
||||
* @returns
|
||||
*/
|
||||
route({ request }) {
|
||||
if (request.url.startsWith(location.origin + this.config.prefix))
|
||||
return true;
|
||||
else return false;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param {Event & {request: Request}} param0
|
||||
* @returns
|
||||
*/
|
||||
async fetch({ request }) {
|
||||
/**
|
||||
* @type {string|void}
|
||||
*/
|
||||
let fetchedURL;
|
||||
|
||||
try {
|
||||
if (!request.url.startsWith(location.origin + this.config.prefix))
|
||||
return await fetch(request);
|
||||
|
||||
const ultraviolet = new Ultraviolet(this.config);
|
||||
|
||||
if (typeof this.config.construct === 'function') {
|
||||
this.config.construct(ultraviolet, 'service');
|
||||
}
|
||||
|
||||
const db = await ultraviolet.cookie.db();
|
||||
|
||||
ultraviolet.meta.origin = location.origin;
|
||||
ultraviolet.meta.base = ultraviolet.meta.url = new URL(
|
||||
ultraviolet.sourceUrl(request.url)
|
||||
);
|
||||
|
||||
const requestCtx = new RequestContext(
|
||||
request,
|
||||
ultraviolet,
|
||||
!emptyMethods.includes(request.method.toUpperCase())
|
||||
? await request.blob()
|
||||
: null
|
||||
);
|
||||
|
||||
if (ultraviolet.meta.url.protocol === 'blob:') {
|
||||
requestCtx.blob = true;
|
||||
requestCtx.base = requestCtx.url = new URL(requestCtx.url.pathname);
|
||||
}
|
||||
|
||||
if (request.referrer && request.referrer.startsWith(location.origin)) {
|
||||
const referer = new URL(ultraviolet.sourceUrl(request.referrer));
|
||||
|
||||
if (
|
||||
requestCtx.headers.origin ||
|
||||
(ultraviolet.meta.url.origin !== referer.origin &&
|
||||
request.mode === 'cors')
|
||||
) {
|
||||
requestCtx.headers.origin = referer.origin;
|
||||
}
|
||||
|
||||
requestCtx.headers.referer = referer.href;
|
||||
}
|
||||
|
||||
const cookies = (await ultraviolet.cookie.getCookies(db)) || [];
|
||||
const cookieStr = ultraviolet.cookie.serialize(
|
||||
cookies,
|
||||
ultraviolet.meta,
|
||||
false
|
||||
);
|
||||
|
||||
requestCtx.headers['user-agent'] = navigator.userAgent;
|
||||
|
||||
if (cookieStr) requestCtx.headers.cookie = cookieStr;
|
||||
|
||||
const reqEvent = new HookEvent(requestCtx, null, null);
|
||||
this.emit('request', reqEvent);
|
||||
|
||||
if (reqEvent.intercepted) return reqEvent.returnValue;
|
||||
|
||||
fetchedURL = requestCtx.blob
|
||||
? 'blob:' + location.origin + requestCtx.url.pathname
|
||||
: requestCtx.url;
|
||||
|
||||
const response = await this.bareClient.fetch(fetchedURL, {
|
||||
headers: requestCtx.headers,
|
||||
method: requestCtx.method,
|
||||
body: requestCtx.body,
|
||||
credentials: requestCtx.credentials,
|
||||
mode: requestCtx.mode,
|
||||
cache: requestCtx.cache,
|
||||
redirect: requestCtx.redirect,
|
||||
});
|
||||
|
||||
const responseCtx = new ResponseContext(requestCtx, response);
|
||||
const resEvent = new HookEvent(responseCtx, null, null);
|
||||
|
||||
this.emit('beforemod', resEvent);
|
||||
if (resEvent.intercepted) return resEvent.returnValue;
|
||||
|
||||
for (const name of cspHeaders) {
|
||||
if (responseCtx.headers[name]) delete responseCtx.headers[name];
|
||||
}
|
||||
|
||||
if (responseCtx.headers.location) {
|
||||
responseCtx.headers.location = ultraviolet.rewriteUrl(
|
||||
responseCtx.headers.location
|
||||
);
|
||||
}
|
||||
|
||||
// downloads
|
||||
if (['document', 'iframe'].includes(request.destination)) {
|
||||
const header = responseCtx.getHeader('content-disposition');
|
||||
|
||||
// validate header and test for filename
|
||||
if (!/\s*?((inline|attachment);\s*?)filename=/i.test(header)) {
|
||||
// if filename= wasn't specified then maybe the remote specified to download this as an attachment?
|
||||
// if it's invalid then we can still possibly test for the attachment/inline type
|
||||
const type = /^\s*?attachment/i.test(header)
|
||||
? 'attachment'
|
||||
: 'inline';
|
||||
|
||||
// set the filename
|
||||
const [filename] = new URL(response.finalURL).pathname
|
||||
.split('/')
|
||||
.slice(-1);
|
||||
|
||||
responseCtx.headers['content-disposition'] =
|
||||
`${type}; filename=${JSON.stringify(filename)}`;
|
||||
}
|
||||
}
|
||||
|
||||
if (responseCtx.headers['set-cookie']) {
|
||||
Promise.resolve(
|
||||
ultraviolet.cookie.setCookies(
|
||||
responseCtx.headers['set-cookie'],
|
||||
db,
|
||||
ultraviolet.meta
|
||||
)
|
||||
).then(() => {
|
||||
self.clients.matchAll().then(function (clients) {
|
||||
clients.forEach(function (client) {
|
||||
client.postMessage({
|
||||
msg: 'updateCookies',
|
||||
url: ultraviolet.meta.url.href,
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
delete responseCtx.headers['set-cookie'];
|
||||
}
|
||||
|
||||
if (responseCtx.body) {
|
||||
switch (request.destination) {
|
||||
case 'script':
|
||||
responseCtx.body = ultraviolet.js.rewrite(await response.text());
|
||||
break;
|
||||
case 'worker':
|
||||
{
|
||||
// craft a JS-safe list of arguments
|
||||
const scripts = [
|
||||
ultraviolet.bundleScript,
|
||||
ultraviolet.clientScript,
|
||||
ultraviolet.configScript,
|
||||
ultraviolet.handlerScript,
|
||||
]
|
||||
.map((script) => JSON.stringify(script))
|
||||
.join(',');
|
||||
responseCtx.body = `if (!self.__uv) {
|
||||
${ultraviolet.createJsInject(
|
||||
ultraviolet.cookie.serialize(
|
||||
cookies,
|
||||
ultraviolet.meta,
|
||||
true
|
||||
),
|
||||
request.referrer
|
||||
)}
|
||||
importScripts(${scripts});
|
||||
}\n`;
|
||||
responseCtx.body += ultraviolet.js.rewrite(await response.text());
|
||||
}
|
||||
break;
|
||||
case 'style':
|
||||
responseCtx.body = ultraviolet.rewriteCSS(await response.text());
|
||||
break;
|
||||
case 'iframe':
|
||||
case 'document':
|
||||
if (
|
||||
responseCtx.getHeader('content-type') &&
|
||||
responseCtx.getHeader('content-type').startsWith('text/html')
|
||||
) {
|
||||
let modifiedResponse = await response.text();
|
||||
if (Array.isArray(this.config.inject)) {
|
||||
const headPosition = modifiedResponse.indexOf('<head>');
|
||||
const upperHead = modifiedResponse.indexOf('<HEAD>');
|
||||
const bodyPosition = modifiedResponse.indexOf('<body>');
|
||||
const upperBody = modifiedResponse.indexOf('<BODY>');
|
||||
const url = new URL(fetchedURL);
|
||||
const injectArray = this.config.inject;
|
||||
for (const inject of injectArray) {
|
||||
const regex = new RegExp(inject.host);
|
||||
if (regex.test(url.host)) {
|
||||
if (inject.injectTo === 'head') {
|
||||
if (headPosition !== -1 || upperHead !== -1) {
|
||||
modifiedResponse =
|
||||
modifiedResponse.slice(0, headPosition) +
|
||||
`${inject.html}` +
|
||||
modifiedResponse.slice(headPosition);
|
||||
}
|
||||
} else if (inject.injectTo === 'body') {
|
||||
if (bodyPosition !== -1 || upperBody !== -1) {
|
||||
modifiedResponse =
|
||||
modifiedResponse.slice(0, bodyPosition) +
|
||||
`${inject.html}` +
|
||||
modifiedResponse.slice(bodyPosition);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
responseCtx.body = ultraviolet.rewriteHtml(modifiedResponse, {
|
||||
document: true,
|
||||
injectHead: ultraviolet.createHtmlInject(
|
||||
ultraviolet.handlerScript,
|
||||
ultraviolet.bundleScript,
|
||||
ultraviolet.clientScript,
|
||||
ultraviolet.configScript,
|
||||
ultraviolet.cookie.serialize(cookies, ultraviolet.meta, true),
|
||||
request.referrer
|
||||
),
|
||||
});
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (requestCtx.headers.accept === 'text/event-stream') {
|
||||
responseCtx.headers['content-type'] = 'text/event-stream';
|
||||
}
|
||||
if (crossOriginIsolated) {
|
||||
responseCtx.headers['Cross-Origin-Embedder-Policy'] = 'require-corp';
|
||||
}
|
||||
|
||||
this.emit('response', resEvent);
|
||||
if (resEvent.intercepted) return resEvent.returnValue;
|
||||
|
||||
return new Response(responseCtx.body, {
|
||||
headers: responseCtx.headers,
|
||||
status: responseCtx.status,
|
||||
statusText: responseCtx.statusText,
|
||||
});
|
||||
} catch (err) {
|
||||
if (!['document', 'iframe'].includes(request.destination))
|
||||
return new Response(undefined, { status: 500 });
|
||||
|
||||
console.error(err);
|
||||
|
||||
return renderError(err, fetchedURL);
|
||||
}
|
||||
}
|
||||
static Ultraviolet = Ultraviolet;
|
||||
}
|
||||
|
||||
self.UVServiceWorker = UVServiceWorker;
|
||||
|
||||
class ResponseContext {
|
||||
/**
|
||||
*
|
||||
* @param {RequestContext} request
|
||||
* @param {import('@mercuryworkshop/bare-mux').BareResponseFetch} response
|
||||
*/
|
||||
constructor(request, response) {
|
||||
this.request = request;
|
||||
this.raw = response;
|
||||
this.ultraviolet = request.ultraviolet;
|
||||
this.headers = {};
|
||||
// eg set-cookie
|
||||
for (const key in response.rawHeaders)
|
||||
this.headers[key.toLowerCase()] = response.rawHeaders[key];
|
||||
this.status = response.status;
|
||||
this.statusText = response.statusText;
|
||||
this.body = response.body;
|
||||
}
|
||||
get url() {
|
||||
return this.request.url;
|
||||
}
|
||||
get base() {
|
||||
return this.request.base;
|
||||
}
|
||||
set base(val) {
|
||||
this.request.base = val;
|
||||
}
|
||||
//the header value might be an array, so this function is used to
|
||||
//retrieve the value when it needs to be compared against a string
|
||||
getHeader(key) {
|
||||
if (Array.isArray(this.headers[key])) {
|
||||
return this.headers[key][0];
|
||||
}
|
||||
return this.headers[key];
|
||||
}
|
||||
}
|
||||
|
||||
class RequestContext {
|
||||
/**
|
||||
*
|
||||
* @param {Request} request
|
||||
* @param {Ultraviolet} ultraviolet
|
||||
* @param {BodyInit} body
|
||||
*/
|
||||
constructor(request, ultraviolet, body = null) {
|
||||
this.ultraviolet = ultraviolet;
|
||||
this.request = request;
|
||||
this.headers = Object.fromEntries(request.headers.entries());
|
||||
this.method = request.method;
|
||||
this.body = body || null;
|
||||
this.cache = request.cache;
|
||||
this.redirect = request.redirect;
|
||||
this.credentials = 'omit';
|
||||
this.mode = request.mode === 'cors' ? request.mode : 'same-origin';
|
||||
this.blob = false;
|
||||
}
|
||||
get url() {
|
||||
return this.ultraviolet.meta.url;
|
||||
}
|
||||
set url(val) {
|
||||
this.ultraviolet.meta.url = val;
|
||||
}
|
||||
get base() {
|
||||
return this.ultraviolet.meta.base;
|
||||
}
|
||||
set base(val) {
|
||||
this.ultraviolet.meta.base = val;
|
||||
}
|
||||
}
|
||||
|
||||
class HookEvent {
|
||||
#intercepted;
|
||||
#returnValue;
|
||||
constructor(data = {}, target = null, that = null) {
|
||||
this.#intercepted = false;
|
||||
this.#returnValue = null;
|
||||
this.data = data;
|
||||
this.target = target;
|
||||
this.that = that;
|
||||
}
|
||||
get intercepted() {
|
||||
return this.#intercepted;
|
||||
}
|
||||
get returnValue() {
|
||||
return this.#returnValue;
|
||||
}
|
||||
respondWith(input) {
|
||||
this.#returnValue = input;
|
||||
this.#intercepted = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} trace
|
||||
* @param {string} fetchedURL
|
||||
* @returns
|
||||
*/
|
||||
function errorTemplate(
|
||||
trace,
|
||||
fetchedURL,
|
||||
) {
|
||||
// turn script into a data URI so we don't have to escape any HTML values
|
||||
const script = `
|
||||
errorTrace.value = ${JSON.stringify(trace)};
|
||||
fetchedURL.textContent = ${JSON.stringify(fetchedURL)};
|
||||
for (const node of document.querySelectorAll('#uvHostname')) node.textContent = ${JSON.stringify(
|
||||
location.hostname
|
||||
)};
|
||||
reload.addEventListener('click', () => location.reload());
|
||||
uvVersion.textContent = ${JSON.stringify(
|
||||
'3.2.7'
|
||||
)};
|
||||
`
|
||||
|
||||
return (
|
||||
'{{ultraviolet-error}}'.replace('{{src}}', 'data:application/javascript,' + encodeURIComponent(script))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {unknown} err
|
||||
* @param {string} fetchedURL
|
||||
*/
|
||||
function renderError(err, fetchedURL) {
|
||||
let headers = {
|
||||
'content-type': 'text/html',
|
||||
};
|
||||
if (crossOriginIsolated) {
|
||||
headers['Cross-Origin-Embedder-Policy'] = 'require-corp';
|
||||
}
|
||||
|
||||
return new Response(errorTemplate(String(err), fetchedURL), {
|
||||
status: 500,
|
||||
headers: headers,
|
||||
});
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
importScripts('/uv/uv.bundle.js');
|
||||
importScripts('/uv/uv.config.js');
|
||||
importScripts(self['{{__uv$config}}'].sw || '/uv/uv.sw.js');
|
||||
importScripts('/network/network.bundle.js');
|
||||
importScripts('/network/network.config.js');
|
||||
importScripts(self['{{__uv$config}}'].sw || '/network/network.sw.js');
|
||||
|
||||
/*
|
||||
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
importScripts('/uv/uv.bundle.js');
|
||||
importScripts('/uv/uv.config.js');
|
||||
importScripts(self['{{__uv$config}}'].sw || '/uv/uv.sw.js');
|
||||
importScripts('/network/network.bundle.js');
|
||||
importScripts('/network/network.config.js');
|
||||
importScripts(self['{{__uv$config}}'].sw || '/network/network.sw.js');
|
||||
|
||||
const uv = new UVServiceWorker();
|
||||
|
||||
|
|
@ -6,34 +6,22 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<title>Ho­ly Unbloc­ker</title>
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="/baremux/index.js" defer></script>
|
||||
<script src="/uv/uv.bundle.js" defer></script>
|
||||
<script src="/uv/uv.config.js" defer></script>
|
||||
<script src="/network/network.bundle.js" defer></script>
|
||||
<script src="/network/network.config.js" defer></script>
|
||||
<link rel="prefetch" href="/worker/w.worker.js" />
|
||||
<link rel="prefetch" href="/worker/w.shared.js" />
|
||||
<script src="/assets/js/register-sw.js" defer></script>
|
||||
<!-- Arc widget causes lag on some gams, so it is created by js below if &nolag isn't specified in the querystring -->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="/worker/w.controller.js"></script>
|
||||
<iframe id="frame" allow="fullscreen" autofocus></iframe>
|
||||
<script>
|
||||
document.getElementById('frame').src = localStorage.getItem('huframesrc');
|
||||
|
|
|
|||
|
|
@ -2,10 +2,10 @@
|
|||
<h1
|
||||
id="holy-unblocker-img-align-left-src-https-raw-githubusercontent-com-titaniumnetwork-dev-holy-unblocker-master-views-assets-img-icon-png-img-"
|
||||
>
|
||||
Holy Unblocker Documentation
|
||||
H­oly Unb­locker Documentation
|
||||
</h1>
|
||||
<p>
|
||||
Holy Unblocker, an official flagship Titanium Network site, can bypass web
|
||||
H­oly Unbl­ocker, an official flagship Titanium Network site, can bypass web
|
||||
filters regardless of whether it is an extension or network-based. Being a
|
||||
secure web proxy service, it supports numerous sites while being updated
|
||||
frequently and concentrating on detail with design, mechanics, and features.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<div class="faq-center">
|
||||
<h2>Official Holy Unblocker FAQ and Support</h2>
|
||||
<h2>Offi­cial Ho­ly Unb­loc­ker F­AQ and Su­pport</h2>
|
||||
</div>
|
||||
<div class="faq-box">
|
||||
<input
|
||||
|
|
@ -13,122 +13,103 @@
|
|||
</div>
|
||||
<div class="box-clear text-center textm">
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<h2 class="bigtitle">Icon Information</h2>
|
||||
<h3>How to find the Icon URL of a Site</h3>
|
||||
<h2 class="bigtitle">Ic­on Inf­ormat­ion</h2>
|
||||
<h3>H­ow to fin­d the I­con U­RL of a Si­t­e</h3>
|
||||
<p>
|
||||
Go to the website you want an icon from, then use this bookmarklet (drag it
|
||||
to your bookmarks bar):
|
||||
Go to th­e webs­ite y­ou w­ant an i­con from, then use th­is bookm­arklet (drag it
|
||||
to your bo­okmarks ba­r):
|
||||
</p>
|
||||
<div id="bks-parent">
|
||||
<a id="iconfinder" class="fancybutton fb-l glowbutton">Find Icon URL</a>
|
||||
<a id="iconfinder" class="fancybutton fb-l glowbutton">Fi­nd I­con U­RL</a>
|
||||
</div>
|
||||
<script>
|
||||
document.getElementById('iconfinder').href =
|
||||
`javascript:alert((Array.from(document.head.querySelectorAll("link[rel*='icon']")).slice(-1)[0]||0).href||location.origin+"/favicon.ico")`;
|
||||
</script>
|
||||
<p>
|
||||
Copy the URL that the bookmarklet gives you. Then go back to HU and enter in
|
||||
the URL for the Icon URL in Settings. Enjoy!
|
||||
Cop­y the UR­L that the bo­okmar­klet gi­ves yo­u. Then go back to H­U and en­ter in
|
||||
the U­RL for the Ico­n UR­L in Sett­ings. Enj­oy!
|
||||
</p>
|
||||
</div>
|
||||
<div id="faqs" class="faq">
|
||||
<div class="faq-text">
|
||||
<h4><strong>I am getting 502 errors. What do I do?</strong></h4>
|
||||
<p>The proxy may be down, being worked on or is under high load.</p>
|
||||
<h4><strong>I am get­ting 50­2 err­ors. Wh­at do I d­o?</strong></h4>
|
||||
<p>The pro­xy may be down, being wo­rked on or is un­der high lo­ad.</p>
|
||||
<p>
|
||||
When this happens you may either switch sites to fix the error or wait a
|
||||
bit. Sometimes clearing your cache can help by doing Ctrl+Shift+R or
|
||||
reloading the page normally. (Hard Reload which purges cache.)
|
||||
When this happens you may either switch sites to fi­x the error or w­ait a
|
||||
bit. S­ometi­mes clear­ing your cache can help by do­ing Ctrl+S­hif­t+R or
|
||||
reloading the page norm­ally. (Hard Reload which purges cache.)
|
||||
</p>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
<h4>
|
||||
<strong
|
||||
>I am getting an error similar to: "'cdn.example.com' cannot be
|
||||
>I am get­ting an e­rror similar to: "'cdn.exam­ple.com' cannot be
|
||||
reached."</strong
|
||||
>
|
||||
</h4>
|
||||
<p>
|
||||
Right-click the page and do Reload Frame. If that doesn't work the first
|
||||
time, try waiting a bit or switching sites. Lastly doing a Hard Reload may
|
||||
Right-click the page and do Re­load Fra­me. If that doesn't work the first
|
||||
time, try wa­iting a bit or switching sites. Lastly doing a Hard Re­load may
|
||||
help. (Ctrl+Shift+R)
|
||||
</p>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
<h4>
|
||||
<strong
|
||||
>Is Discord supported? And can I gain access to a better proxy for
|
||||
Discord?</strong
|
||||
>Is Disc­ord supported? And can I gain acc­ess to a better p­roxy for
|
||||
Disc­ord?</strong
|
||||
>
|
||||
</h4>
|
||||
<p>
|
||||
Yes, Discord is supported. You can now login normally with Womginx but
|
||||
most of the proxies still require you to login via QR Code or Token. You
|
||||
may view the extended Discord proxy information below for more
|
||||
information.
|
||||
Yes, Discor­d is sup­ported. You can now login normally with W­o­m­g­inx but
|
||||
most of the pro­xies still require you to lo­gin via QR Cod­e or Token. You
|
||||
may view the ext­ended Disc­ord proxy info­rmation below for more
|
||||
infor­mation.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
When either instances are under high load occasionally Discord may be
|
||||
slow or not work. In this case simply wait a bit or try using the TN
|
||||
subscriber booster proxy.
|
||||
When eith­er instan­ces are under high lo­ad occas­ionally D­iscord/Spo­ti­fy may be
|
||||
slow or not work. In this case s­imply w­ait a b­it.
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
If you wish for a proxy with better support for Discord, be sure to join
|
||||
the TN Discord.
|
||||
</p>
|
||||
<p>
|
||||
By donating $3 (simply type $upgrade in the TN Discord) you can gain
|
||||
access to the premium Discord proxy which is faster, more secure and
|
||||
outside of the current limitation of using Discord normally with any of
|
||||
the free proxies.
|
||||
</p>
|
||||
<p>The premium Discord proxy is outside of these issues:</p>
|
||||
<ul>
|
||||
<li>Being prompted to verify by email or via phone number</li>
|
||||
<li>Slow messaging or invalid invites</li>
|
||||
<li>Possible VC support</li>
|
||||
<li>Sites getting blocked often</li>
|
||||
<li>And more!</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
<h4><strong>Why are YouTube videos not working?</strong></h4>
|
||||
<h4><strong>Why are YouT­ube videos not working?</strong></h4>
|
||||
<p>
|
||||
If you are having persistent issues even after doing the steps above there
|
||||
is a chance that the instance is down temporarily, especially if large
|
||||
groups of people are also having the issue. The latest release of Alloy
|
||||
<strong>currently</strong> does not have support for YouTube. However
|
||||
manually putting in full links like
|
||||
<code>https://www.youtube.com/watch?v=mauV2NdCs60</code> will work. You
|
||||
may also try doing a Hard Reload (Ctrl+Shift+R)
|
||||
If you are hav­ing persistent iss­ues even after doing the steps above there
|
||||
is a chance that the instance is down te­porarily, especially if large
|
||||
groups of peopl­e are also ha­ving the issue. The latest release of U­ltrav­iolet
|
||||
<strong>currently</strong> does not have support for YouT­ube. Howe­ver
|
||||
manually putting in full lin­ks like
|
||||
<code>ht­tps://www.youtube.­com/watch?v=ma­uV2Nd­Cs60</code> will work. Y­ou
|
||||
may also try doing a Hard Rel­oad (Ctrl+Shift+R)
|
||||
</p>
|
||||
<p>A later release of Alloy may fix this issue. Sorry.</p>
|
||||
<p>A la­ter release of U­ltra­violet will fix this issue. Sor­ry.</p>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
<h4>
|
||||
<strong
|
||||
>When using YouTube I get a similar error to "Cannot GET /watch"</strong
|
||||
>When u­sing YouT­ube I get a similar error to "Cann­ot GET /wat­ch"</strong
|
||||
>
|
||||
</h4>
|
||||
<p>
|
||||
Do Ctrl+Shift+R (Hard Reload which clears your cache) and if that doesn't
|
||||
work use the full URL of the video you want to watch with either Alloy or
|
||||
Womginx, Alloy being preferred for an option as it has the best YouTube
|
||||
Do Ctrl+Sh­ift+R (Hard Reload which clears your cache) and if that doesn't
|
||||
work use the full URL of the video you want to watch with either Ul­tra­vio­let or
|
||||
Ram­merh­ead, Ultr­violet being prefe­rred for an option as it has the best You­Tube
|
||||
support.
|
||||
</p>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
<h4>
|
||||
<strong
|
||||
>Parse error, etc. or perhaps even Cannot GET /gkfdsgkfgfdkg
|
||||
>Parse error, etc. or perh­aps even Cannot GET /gkfd­sgkfgfdkg
|
||||
</strong>
|
||||
</h4>
|
||||
<p>
|
||||
Might be possible that you need to wait a bit because of updates that may
|
||||
have occurred and are not visible yet due to cache. In this situation do a
|
||||
Hard Reload or switch Holy Unblocker sites. (Ctrl + Shift + R)
|
||||
Might be possible that you need to wait a bit because of upd­ates that may
|
||||
have occurred and are not visible yet due to cache. In this sit­uation do a
|
||||
Hard Reload or switch H­oly Unblo­cker sites. (Ctrl + Shift + R)
|
||||
</p>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
|
|
@ -139,48 +120,48 @@
|
|||
>
|
||||
</h4>
|
||||
<p>
|
||||
Captcha support is currently not available on all of the current proxies
|
||||
Captcha suppo­rt is currently not avail­able on all of the current proxies
|
||||
sadly. Therefore some sites may not work with any of the sites. Read below
|
||||
for issues with links on sites.
|
||||
</p>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
<h4>
|
||||
<strong>Why are page links not working or leading to 404 pages?</strong>
|
||||
<strong>Why are page links not working or leading to 404 p­ages?</strong>
|
||||
</h4>
|
||||
<p>
|
||||
This is an issue with the latest release of Alloy proxy but it may also
|
||||
occur with other proxies. In this case manually entering the URL of the
|
||||
This is an is­sue with the latest release of Al­loy pro­xy but it may also
|
||||
occur with other p­rox­ies. In this case manually entering the URL of the
|
||||
page you would like to view can solve this or try navigating using the
|
||||
home button. (Reddit, Twitter) The next release of Alloy may fix this
|
||||
home button. (R­eddit, Twitter) The next release of Al­lo­y may fix this
|
||||
also.
|
||||
</p>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
<h4>
|
||||
<strong>
|
||||
When using YouTube on any of the proxy sites, why does the page not load
|
||||
When using YouT­ube on any of the prox­y sites, why does the page not load
|
||||
fully or the video is just white?</strong
|
||||
>
|
||||
</h4>
|
||||
<p>There are two methods for fixing this:</p>
|
||||
<p>There are two methods for fixi­ng this:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>
|
||||
Reloading the page normally when the error above happens should load
|
||||
Reloading the page norm­ally when the error above happens s­hould load
|
||||
the video.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Or right-clicking the page and doing <code>Reload Frame</code> if you
|
||||
are using some form of Stealth Mode.
|
||||
are using some form of S­teal­th Mod­e.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h4>
|
||||
<strong
|
||||
>When using Discord under Alloy or Powermouse, why does the page stay
|
||||
>When using Disc­ord under All­oy or Powermo­use, why does the page stay
|
||||
gray/white or the QR code not load?</strong
|
||||
>
|
||||
</h4>
|
||||
|
|
@ -197,101 +178,65 @@
|
|||
<li>
|
||||
<p>
|
||||
Or right-clicking the page and doing <code>Reload Frame</code> if you
|
||||
are using some form of Stealth Mode. Make sure you are also doing the
|
||||
steps correctly. Simply view below for extended Discord proxy
|
||||
are using some form of St­ealth Mode. Make sure you are also doing the
|
||||
steps correctly. Simp­ly view below for extended Discord proxy
|
||||
information/steps.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
<h3 id="discord-proxy-information-">Discord Proxy Information:</h3>
|
||||
<h3 id="discord-proxy-information-">Disco­rd P­roxy Info­rmation:</h3>
|
||||
<p><strong>Disclaimer:</strong></p>
|
||||
<p></p>
|
||||
Your account may be at risk of being disabled by Discord if you are using
|
||||
any of the proxies in general, Womginx being a possible exception. Unless
|
||||
any of the proxies in general, Wo­m­gin­x being a possible exception. Unless
|
||||
you have 2FA or a phone number <strong>be careful</strong>.
|
||||
<p></p>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
<h4 id="general-steps-">General Steps:</h4>
|
||||
<p>
|
||||
1) Go to either Surf Freely/Web Proxies if you wish to access Discord
|
||||
1) Go to either Sur­f Freely/We­b Pr­xies if you wish to access Discord
|
||||
manually or the Discord page from the navbar.
|
||||
</p>
|
||||
<p>
|
||||
If you selected the Discord page simply choose either Stealth Mode or
|
||||
If you selected the D­iscord page simply choose either St­ealth Mode or
|
||||
Classic Mode. For any support view the FAQ questions above.
|
||||
</p>
|
||||
<p>
|
||||
2) Select either Womginx or Alloy. Womginx has support for normal logins
|
||||
but may not work for every filter while Alloy is QR login only but has
|
||||
2) Select either W­om­ginx or All­oy. W­om­gi­nx has support for normal logins
|
||||
but may not work for every filter while Al­oy is Q­R log­in only but has
|
||||
generally better support in some cases.
|
||||
</p>
|
||||
<p>3) Type out one of these terms:</p>
|
||||
<p><code>- https://discord.com/login</code></p>
|
||||
<p><code>- https://discord.com/app</code></p>
|
||||
<p><code>- https://disc­ord.com/log­in</code></p>
|
||||
<p><code>- https://discord.c­om/app</code></p>
|
||||
<p>
|
||||
4) Then hit either Stealth or Classic as a mode. Stealth mode hides your
|
||||
history while Classic mode is the normal method of accessing a site.
|
||||
4) Then hit either Ste­alth or Clas­sic as a mode. Stealth mode hides your
|
||||
history while Clas­sic mode is the normal method of accessing a site.
|
||||
</p>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
<h4 id="qr-login-faq-">QR Login FAQ:</h4>
|
||||
<p>
|
||||
Make sure you are using Alloy + QR Code for Discord. You CANNOT login
|
||||
normally with Alloy.
|
||||
</p>
|
||||
<p>
|
||||
Powermouse also has QR login support if you wish for an alternative proxy.
|
||||
</p>
|
||||
<h5
|
||||
id="qr-code-information-https-support-discord-com-hc-en-us-articles-360039213771-qr-code-login-faq"
|
||||
>
|
||||
QR Code Information:
|
||||
<a
|
||||
href="https://support.discord.com/hc/en-us/articles/360039213771-QR-Code-Login-FAQ"
|
||||
>https://support.discord.com/hc/en-us/articles/360039213771-QR-Code-Login-FAQ</a
|
||||
>
|
||||
</h5>
|
||||
<p>Use the link above through one of the proxies to read if you can't.</p>
|
||||
<p><strong>Common Issues with Solutions:</strong></p>
|
||||
<p>Use the link above through one of the prox­ies to read if you can't.</p>
|
||||
<p><strong>Common Issues with So­lutions:</strong></p>
|
||||
<ul>
|
||||
<li>
|
||||
If the page appears gray on the first load, reload/spam reload the page
|
||||
If the page appears g­ray on the first load, reload/spa­m reload the page
|
||||
a bunch.
|
||||
</li>
|
||||
<li>If the QR code doesn't load, reload/spam reload the page a bunch.</li>
|
||||
<li>If the Q­R code do­esn't load, reload/spam relo­ad the page a bunch.</li>
|
||||
<li>
|
||||
If the page/discord logo keeps loading, reload/spam the page also.
|
||||
If the page/disc­ord logo keeps loading, reload/spam the page also.
|
||||
<em
|
||||
>You may also right-click the page and do "Reload Frame" to reload
|
||||
>You may also right-click the page and do "Relo­ad Frame" to reload
|
||||
also.</em
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
If none of these solutions work either the proxy is down or you can try to
|
||||
If none of these solutions work either the pro­xy is down or you can try to
|
||||
do a hard reload. (Ctrl+Shift+R)
|
||||
</p>
|
||||
</div>
|
||||
<div class="faq-text">
|
||||
<p>
|
||||
PM also has amazing support for QR logins. Feel free to mess around
|
||||
between PM and Alloy.
|
||||
</p>
|
||||
<p><strong>Token Login Extended:</strong></p>
|
||||
<p>
|
||||
Also, search up on YT on How to find your Discord Token when using Token
|
||||
Login. This only works on Powermouse but not the best option.
|
||||
</p>
|
||||
<p>
|
||||
Token logins on Powermouse (PM Proxy) will require another device also for
|
||||
recovering your Discord account.
|
||||
</p>
|
||||
<h4>
|
||||
<strong>Best Solution:</strong> Do Ctrl+Shift+R (Hard Reload which clears
|
||||
your cache). Sites here are often updated hence issues that may arise.
|
||||
</h4>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
<div class="footerflex">
|
||||
<div class="footerbrand">
|
||||
<h3><a href="/" title="Holy Unblocker Homepage">Holy Unblocker</a></h3>
|
||||
<p>Global Web Proxy Innovation, Done Right.</p>
|
||||
<div class="logo-potato" aria-label="Holy Unblocker Logo"></div>
|
||||
<h3><a href="/" title="Ho­ly Unbl­ocker Hom­epage">Ho­ly U­nbl­ock­er</a></h3>
|
||||
<p>Glob­al W­eb Pro­xy Innovati­on, Do­ne Rig­ht.</p>
|
||||
<div class="logo-potato" aria-label="H­oly Un­loc­ker L­ogo"></div>
|
||||
</div>
|
||||
<div class="footerlist">
|
||||
<h3>Dependencies</h3>
|
||||
<h3>Dep­en­denc­ies</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/github/fastify"
|
||||
title="Fastify - Fast and low overhead web framework, for Node.js "
|
||||
>Fastify</a
|
||||
title="Fas­tify - Fas­t and low ov­erhead web frame­work, for No­de.js "
|
||||
>Fast­ify</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
|
|
@ -21,8 +21,8 @@
|
|||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/github/nord-theme"
|
||||
title="Nord Theme - An arctic, north-bluish color palette."
|
||||
>Nord Theme</a
|
||||
title="No­rd Th­eme - An arc­tic, north-blu­ish color palet­te."
|
||||
>No­rd Th­eme</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
|
|
@ -30,8 +30,8 @@
|
|||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/github/aos"
|
||||
title="AOS - Animate on scroll library "
|
||||
>AOS</a
|
||||
title="AO­S - Anim­ate on sc­oll lib­rary "
|
||||
>A­OS</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
|
|
@ -39,81 +39,67 @@
|
|||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/github/font-awesome"
|
||||
title="Font Awesome - The iconic SVG, font, and CSS toolkit"
|
||||
>Font Awesome
|
||||
title="F­ont Awe­some - The ic­onic S­VG, fo­nt, and C­SS tool­kit"
|
||||
>Fo­nt Aweso­me
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footerlist">
|
||||
<h3>Transports</h3>
|
||||
<h3>Tr­ansp­orts</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/github/epoxy"
|
||||
title="Epoxy - Epoxy is an encrypted proxy for browser javascript. It allows you to make requests that bypass CORS without compromising security, by running SSL/TLS inside webassembly."
|
||||
>Epoxy</a
|
||||
href="/github/ep">Epo­xy</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/github/libcurl-js"
|
||||
title="A port of libcurl to WebAssembly, for proxying HTTPS requests from the browser with full TLS encryption"
|
||||
>Libcurl</a
|
||||
href="/github/lj">Lib­c­url</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/github/bare-module"
|
||||
title="Bare Module - Tomp Bare Client as a bare-mux module"
|
||||
>Bare Module</a
|
||||
href="/github/bam">B­are Mod­ule</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footerlist">
|
||||
<h3>Services</h3>
|
||||
<h3>Serv­ices</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/github/ultraviolet"
|
||||
title="Ultraviolet - Explore Ultraviolet"
|
||||
>Ultraviolet</a
|
||||
href="/github/config">Ultr­aviole­t</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/github/wisp"
|
||||
title="Wisp - Wisp is a low-overhead, easy to implement protocol for proxying multiple TCP/UDP sockets over a single websocket. "
|
||||
>Wisp Protocol</a
|
||||
href="/github/wm">Wi­sp Prot­ocol</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/rammerhead-discord"
|
||||
title="Rammerhead - Join Rammerhead on Discord"
|
||||
>Rammerhead</a
|
||||
href="/config-chat">Ram­erhe­ad</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/github/bare-mux"
|
||||
title="BareMux - A system for managing http transports in a project such as Ultraviolet"
|
||||
>Bare-Mux</a
|
||||
href="/github/bm">Ba­re-M­ux</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
|
|
@ -125,18 +111,16 @@
|
|||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/github"
|
||||
title="Holy Unblocker GitHub Repository"
|
||||
>GitHub</a
|
||||
href="/github">GitH­ub</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/terms" title="Privacy Policy and Terms of Service"
|
||||
>Privacy and Terms of Service</a
|
||||
>Priv­acy and T­erms of Servi­ce</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/credits" title="Credits and Acknowledgements">Credits</a>
|
||||
<a href="/credits" title="Credits and Acknowledgements">Credi­ts</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
@ -151,17 +135,13 @@
|
|||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="soc-github"
|
||||
href="/github"
|
||||
title="Follow Holy Unblocker on GitHub"
|
||||
><i class="fab fa-github" aria-hidden="true"></i
|
||||
href="/github"><i class="fab fa-github" aria-hidden="true"></i
|
||||
></a>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="soc-patreon"
|
||||
href="/titaniumnetwork-documentation"
|
||||
title="View Documentation on Titanium Network"
|
||||
><i class="fas fa-file-code" aria-hidden="true"></i
|
||||
href="/config-docs"><i class="fas fa-file-code" aria-hidden="true"></i
|
||||
></a>
|
||||
</div>
|
||||
<p class="copyright">Holy Unblocker LTS © 2020-2024</p>
|
||||
<p class="copyright">Ho­ly Unb­locker L­TS © 20­20-20­24</p>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<div class="brand-logo-container" aria-label="Brand Logo">
|
||||
<div class="logo" role="img" aria-label="Holy Unblocker Logo"></div>
|
||||
<a href="/" class="brand pulse" title="Holy Unblocker Home Page"
|
||||
>Holy Unblocker v6.3.x</a
|
||||
<div class="brand-logo-container" aria-label="B­ran­d Lo­go">
|
||||
<div class="logo" role="img" aria-label="Ho­ly Unb­loc­ker Log­o"></div>
|
||||
<a href="/" class="brand pulse" title="Ho­ly Un­bloc­k­er H­ome Pa­ge"
|
||||
>H­oly U­nbl­ocke­r v6.4­.x</a
|
||||
>
|
||||
</div>
|
||||
|
||||
|
|
@ -9,29 +9,29 @@
|
|||
<li class="pulse" style="margin-left: 0" role="listitem">
|
||||
<a
|
||||
href="/browsing"
|
||||
title="Web Proxies - Access various web proxies to bypass restrictions"
|
||||
>Web Proxies</a
|
||||
title="We­b Pr­o­xi­es - Acc­ess vario­us we­b pr­oxi­es to bypas­s res­tri­ctions"
|
||||
>W­eb P­roxi­es</a
|
||||
>
|
||||
</li>
|
||||
<li class="pulse" role="listitem">
|
||||
<a
|
||||
href="/games"
|
||||
title="Games - Explore a range of games available through our service"
|
||||
>Games</a
|
||||
href="/g"
|
||||
title="Ga­mes - Explo­re a ran­ge of ga­mes availab­le throug­h our ser­vice"
|
||||
>Ga­me­s</a
|
||||
>
|
||||
</li>
|
||||
<li class="pulse" role="listitem">
|
||||
<a
|
||||
href="/youtube"
|
||||
title="YouTube - Access YouTube content through our proxy service"
|
||||
>YouTube</a
|
||||
title="Yo­uT­ube - Acc­ess Y­ouT­ube co­nte­nt thro­ugh o­ur pr­oxy ser­vice"
|
||||
>Yo­uTu­be</a
|
||||
>
|
||||
</li>
|
||||
<li class="pulse new" role="listitem">
|
||||
<a
|
||||
href="/apps"
|
||||
title="Applications - Browse a selection of useful applications"
|
||||
>Applications</a
|
||||
title="App­licati­ons - Brow­se a s­elect­ion o­f use­ful app­licati­ons"
|
||||
>App­lic­ati­ons</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
|
|
@ -45,7 +45,7 @@
|
|||
<li class="dropdown-parent" role="listitem">
|
||||
<div class="pulse white-text" aria-haspopup="true" aria-expanded="false">
|
||||
<a href="#" aria-label="More options"
|
||||
>More <i class="fas fa-ellipsis-v" aria-hidden="true"></i
|
||||
>M­ore <i class="fas fa-ellipsis-v" aria-hidden="true"></i
|
||||
></a>
|
||||
</div>
|
||||
<div
|
||||
|
|
@ -58,34 +58,34 @@
|
|||
<li role="menuitem">
|
||||
<a
|
||||
href="/bookmarklets"
|
||||
title="Bookmarklets - Useful tools and shortcuts for your browser"
|
||||
>Bookmarklets</a
|
||||
title="B­ook­ma­rklets - Use­ful t­ools and sh­ortcu­ts for your bro­wser"
|
||||
>Boo­kmar­klets</a
|
||||
>
|
||||
</li>
|
||||
<li role="menuitem">
|
||||
<a
|
||||
href="/?documentation"
|
||||
title="Documentation - Detailed information and guides"
|
||||
>Docs</a
|
||||
title="Docu­men­tation - Det­ailed inf­orma­tion and gui­des"
|
||||
>D­ocs</a
|
||||
>
|
||||
</li>
|
||||
<li role="menuitem">
|
||||
<a
|
||||
href="/questions"
|
||||
title="FAQ - Frequently asked questions and answers"
|
||||
>FAQ</a
|
||||
title="F­AQ - Fre­quently as­ked qu­estions and ans­wers"
|
||||
>F­AQ</a
|
||||
>
|
||||
</li>
|
||||
<li role="menuitem">
|
||||
<a
|
||||
href="/credits"
|
||||
title="Credits - Acknowledgements and contributions"
|
||||
>Credits</a
|
||||
title="Cre­dits - Acknowled­gements and contribu­tions"
|
||||
>Cre­dits</a
|
||||
>
|
||||
</li>
|
||||
<li role="menuitem">
|
||||
<a href="/terms" title="Terms of Service - Rules and policies of use"
|
||||
>TOS</a
|
||||
<a href="/terms" title="Te­rms of Ser­vice - Rul­es and polic­ies of u­se"
|
||||
>T­OS</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
|
|
@ -94,7 +94,7 @@
|
|||
<li class="dropdown-parent" role="listitem">
|
||||
<div class="pulse white-text" aria-haspopup="true" aria-expanded="false">
|
||||
<a href="#" aria-label="Settings menu"
|
||||
>Settings <i class="fas fa-cog pulse" aria-hidden="true"></i
|
||||
>Sett­ings <i class="fas fa-cog pulse" aria-hidden="true"></i
|
||||
></a>
|
||||
</div>
|
||||
<div
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
<div id="csel" class="settings-content">
|
||||
<div class="settings-header">
|
||||
<p class="cseltitle-main">Settings</p>
|
||||
<p class="cseltitle-main">Setti­ngs</p>
|
||||
<i class="far fa-times-circle close-settings-btn"></i>
|
||||
</div>
|
||||
<div class="settings-content-body">
|
||||
<div class="csel-container-left">
|
||||
<p class="cseltitle">Tab Cloak</p>
|
||||
<p class="cseltitle">T­ab Clo­ak</p>
|
||||
<form id="titleform" class="cloakform">
|
||||
<input type="text" placeholder="Tab Title" spellcheck="false" />
|
||||
<input type="submit" value="Apply" />
|
||||
|
|
@ -14,53 +14,61 @@
|
|||
<input type="text" placeholder="Icon URL" spellcheck="false" />
|
||||
<input type="submit" value="Apply" />
|
||||
</form>
|
||||
<p class="cseltitle">Ultraviolet Proxy Transport</p>
|
||||
<p class="cseltitle">Ultr­avio­let P­roxy Tr­ansport</p>
|
||||
<div class="radio-group" id="uv-transport-list">
|
||||
<label>
|
||||
<p>
|
||||
Libcurl
|
||||
<span class="default-badge">Cross-Browser/Secure (Firefox)</span>
|
||||
<span class="default-badge">Cr­oss-Bro­wser/Secu­re (Fi­refox)</span>
|
||||
</p>
|
||||
<input type="radio" name="uv-transport" value="libcurl" checked />
|
||||
</label>
|
||||
<label>
|
||||
<p>
|
||||
Epoxy
|
||||
<span class="bare-badge">Fastest/Secure (Chromium, Apple)</span>
|
||||
<span class="bare-badge">Fa­stest/Se­cure (Chro­mium, App­le)</span>
|
||||
</p>
|
||||
<input type="radio" name="uv-transport" value="epoxy" />
|
||||
</label>
|
||||
<label>
|
||||
<p>Bare <span class="beta-badge">Least Secure (All)</span></p>
|
||||
<p>Bare <span class="beta-badge">L­east Sec­ure (All)</span></p>
|
||||
<input type="radio" name="uv-transport" value="bare" />
|
||||
</label>
|
||||
</div>
|
||||
<p class="cseltitle">Advanced Options</p>
|
||||
<p class="cseltitle">Adva­nced Opt­ions</p>
|
||||
<div class="radio-group">
|
||||
<label>
|
||||
<p>Hide Ads <span class="default-badge">AdGuard</span></p>
|
||||
<p>Hi­de Ad­s <span class="default-badge">AdGu­ard</span></p>
|
||||
<input type="checkbox" id="hideads" class="switch" checked />
|
||||
</label>
|
||||
<label>
|
||||
<p>Enable Tor <span class="bare-badge">SOCKS5 Onion Routing</span></p>
|
||||
<p>En­able T­or <span class="bare-badge">SOC­KS5 On­ion Rou­ting</span></p>
|
||||
<input type="checkbox" id="useonion" class="switch" />
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-right-column">
|
||||
<p class="cseltitle">Search Engine</p>
|
||||
<p class="cseltitle">Se­arch Eng­ine</p>
|
||||
<select>
|
||||
<option>Goog­le</option>
|
||||
<option>Bi­ng</option>
|
||||
<option>DuckD­uckGo</option>
|
||||
<option>Yah­oo</option>
|
||||
</select>
|
||||
<p class="cseltitle">Ic­on Pres­ets</p>
|
||||
<select id="icon-list">
|
||||
<option><!-- Leave this blank to avoid a bug. --></option>
|
||||
<option>Google</option>
|
||||
<option>Bing</option>
|
||||
<option>DuckDuckGo</option>
|
||||
<option>Yahoo</option>
|
||||
<option>Google Drive</option>
|
||||
<option>Gmail</option>
|
||||
</select>
|
||||
<p class="cseltitle">About:Blank</p>
|
||||
<p class="cseltitle">About:Bla­nk (Bet­a)</p>
|
||||
<div class="switch-container">
|
||||
<p>Stealth Tab <span class="default-badge">Default</span></p>
|
||||
<p>Stealth Tab <span class="default-badge">Def­ault</span></p>
|
||||
<input type="checkbox" class="switch" />
|
||||
</div>
|
||||
<p class="cseltitle">Select Theme</p>
|
||||
<p class="cseltitle">Se­lect The­me (Bet­a)</p>
|
||||
<div class="radio-group">
|
||||
<label>
|
||||
<p>Light</p>
|
||||
|
|
@ -71,18 +79,10 @@
|
|||
<input type="radio" name="theme" value="darktheme" />
|
||||
</label>
|
||||
</div>
|
||||
<p class="cseltitle">Icon Presets</p>
|
||||
<select id="icon-list">
|
||||
<option><!-- Leave this blank to avoid a bug. --></option>
|
||||
<option>Google</option>
|
||||
<option>Bing</option>
|
||||
<option>Google Drive</option>
|
||||
<option>Gmail</option>
|
||||
</select>
|
||||
<p class="cseltitle">Enable Devtools</p>
|
||||
<p class="cseltitle">En­able De­vtools (Bet­a)</p>
|
||||
<div class="radio-group">
|
||||
<label>
|
||||
<p>Eruda Devtools<span class="bare-badge">CTRL+SHIFT+I</span></p>
|
||||
<p>Eru­da Devto­ols<span class="bare-badge">CT­RL+SHI­FT+­I</span></p>
|
||||
<input type="radio" name="theme" value="lighttheme" checked />
|
||||
</label>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,116 +2,115 @@
|
|||
<div style="margin: 2%">
|
||||
<div class="text-center">
|
||||
<h1 class="bigtitle">Privacy Policy</h1>
|
||||
<h4>Holy Unblocker, a private web proxy service.</h4>
|
||||
<h4>Ho­ly Unb­locker, a pri­vate web pr­xy ser­vice.</h4>
|
||||
</div>
|
||||
<p><strong>Effective Date: 07-16-2021</strong></p>
|
||||
<p><strong>Updated Date: 07-07-2024</strong></p>
|
||||
<h4>What is Holy Unblocker?</h4>
|
||||
<p><strong>Updated Date: 12-16-2024</strong></p>
|
||||
<h4>What is Ho­ly Unbloc­ker?</h4>
|
||||
<p>
|
||||
Holy Unblocker LTS, an experimental web proxy service, can bypass web
|
||||
filters or 'blockers' regardless of whether the method of censorship is
|
||||
client-side or network-based. This includes the potential ability to
|
||||
bypass content blockers overseas, Chrome extensions, localized client
|
||||
firewalls, and network-related filters.<br />This project serves mostly as
|
||||
a proof of concept for the ideal clientless solution to bypassing
|
||||
censorship. Being a secure web proxy service, it supports numerous sites
|
||||
H­oly Unb­locker L­TS, an experi­mental w­eb pro­xy ser­vice, can byp­ass web
|
||||
fil­ters or 'b­lockers' regardless of whether the method of censo­rship is
|
||||
client-side or network-based. This includes the pot­ential ability to
|
||||
bypass content blo­ckers overseas, Chr­ome extensions, localized client
|
||||
fir­ewalls, and netw­ork-rel­ated fi­lters.<br />This p­roject serves mostly as
|
||||
a proof of concept for the ideal clien­tless solution to bypa­ssing
|
||||
censorship. Being a secure w­eb pr­oxy service, it supports numerous sites
|
||||
while being updated frequently and concentrating on detail with design,
|
||||
mechanics, and features.
|
||||
</p>
|
||||
<h4>Is any data being collected?</h4>
|
||||
<p>
|
||||
Nope! No data is logged or collected by any of our web proxes featured.
|
||||
Holy Unblocker values its statement of ending intenet censorship along
|
||||
with valuing user privacy.<br /><br />If you wish to make a privacy
|
||||
statement or request please contact us via Discord:
|
||||
Nope! No data is logged or collected by any of our w­eb prox­ies featured.
|
||||
Ho­ly Unblo­cker values its statem­ent of ending inte­net cens­orship along
|
||||
with valuing user privacy. This servi­ce is m­ade to be as transpar­ent as po­ssible and reme­mber you can self-host at any ti­me.<br /><br />If you wish to make a privacy
|
||||
statement or request please contact us via Disco­rd:
|
||||
</p>
|
||||
<h4 id="Security">Security</h4>
|
||||
<p>
|
||||
Holy Unblocker LTS is built on cutting-edge technology to ensure a secure
|
||||
and reliable web proxy service for its users. One of the core technologies
|
||||
behind HU LTS is the new Wisp protocol, developed by Mercury Workshop.<br /><br />This
|
||||
H­ol­y Unblo­cker L­TS is built on cutting-edge technology to ensure a secure
|
||||
and reliable w­eb pr­oxy serv­ice for its users. One of the core technologies
|
||||
behind H­U LT­S is the new Wi­sp protocol, developed by Mercu­ry Work­shop.<br /><br />This
|
||||
protocol brings several innovative features and enhancements that
|
||||
contribute to the robustness and efficiency of the service.
|
||||
</p>
|
||||
<p>
|
||||
The Wisp protocol is designed to handle modern web traffic demands while
|
||||
maintaining high security standards. By implementing Wisp, HU LTS
|
||||
leverages the following benefits:
|
||||
The W­isp pro­tocol is designed to ha­ndle mod­ern web tra­ffic dem­ands whi­le
|
||||
maintai­ning high secur­ity st­andards. By implement­ing Wi­sp, H­U L­TS
|
||||
levera­ges the follow­ing be­nefits:
|
||||
</p>
|
||||
<p>
|
||||
Enhanced Performance: The Wisp protocol optimizes data transfer speeds,
|
||||
Enhanc­ed Perfor­mance: The W­isp pro­tocol optimi­zes data tra­nsfer speeds,
|
||||
ensuring that users experience minimal latency while browsing.
|
||||
</p>
|
||||
<p>
|
||||
Improved Compatibility: Wisp is built to be compatible with a wide range
|
||||
Impr­oved Compa­tibility: Wis­p is built to be compati­ble with a wide range
|
||||
of web technologies, ensuring seamless access to various websites and
|
||||
online services.
|
||||
</p>
|
||||
<p>
|
||||
Resilience Against Censorship: The protocol is designed to bypass
|
||||
Resil­ience Against Cen­sorship: The protocol is designed to bypass
|
||||
sophisticated censorship techniques employed by restrictive networks,
|
||||
allowing users to access blocked content with ease.
|
||||
</p>
|
||||
<p>
|
||||
Strong Fingerprint Resistance: HU LTS employs strong fingerprint
|
||||
resistance mechanisms within its reverse proxy setup for official
|
||||
instances. This means that the proxy is designed to minimize the unique
|
||||
identifiers that can be used to track or identify users, thereby enhancing
|
||||
Strong Fingerprint Resistance: H­U L­TS employs strong fingerprint
|
||||
resistance mechanisms within its reverse pro­xy setup for official
|
||||
instances. This means that the p­roxy is designed to minimize the unique
|
||||
identifiers that can be used to track or identify users, thereby enhanc­ing
|
||||
privacy. By following industry best practices and continually updating its
|
||||
methods, HU LTS ensures that users can browse anonymously without leaving
|
||||
methods, H­U LT­S ensures that users can browse anonymously without leaving
|
||||
identifiable traces.
|
||||
</p>
|
||||
<p>
|
||||
Transparency: Transparency is a key principle for HU LTS. The project
|
||||
operates with an open-source model, allowing the community to review and
|
||||
contribute to the codebase. This openness not only fosters trust but also
|
||||
enables continuous improvement through community feedback and
|
||||
collaboration. By adhering to transparent practices, HU LTS ensures that
|
||||
users are aware of how their data is handled and what measures are in
|
||||
place to protect their privacy.
|
||||
Transpa­rency: Tra­nsparency is a key principle for H­U L­TS. The project
|
||||
operates with an open-source model, allowing the com­munity to review and
|
||||
contribute to the codebase. This openness not only fost­ers trust but also
|
||||
enables continu­ous improvem­ent through community feedback and
|
||||
collabo­ration. By adhering to trans­parent pra­ctices, H­U L­TS ensures that
|
||||
use­rs are aware of how their da­ta is handled and what measures are in
|
||||
place to prote­ct the­ir priva­cy.
|
||||
</p>
|
||||
<p>
|
||||
URL Rewriting: HU LTS employs URL rewriting techniques to maintain
|
||||
seamless browsing experiences while ensuring that the actual URLs accessed
|
||||
remain obfuscated, adding an additional layer of security.
|
||||
U­RL Rewr­iting: H­U LT­S employs U­RL rew­riting techniques to maintain
|
||||
seamless br­owsing experi­ences while en­suring that the actual UR­Ls accessed
|
||||
remain obf­uscated, adding an addi­tional layer of secu­rity.
|
||||
</p>
|
||||
<p>
|
||||
Encryption: HU LTS utilizes advanced proxy technologies that focus on
|
||||
encryption and secure data transfer, particularly in the context of URL
|
||||
rewriting proxies. NOTE: This is still a massive work in progress and open
|
||||
to contributions.
|
||||
En­cryp­tion: H­U LT­S utilizes advan­ced prox­y tec­hnologies that focus on
|
||||
encrypt­ion and sec­ure dat­a tr­ansfer, particularly in the contex­t of U­RL
|
||||
rewriting proxies. N­OTE: This is still a massive work in prog­ress and open
|
||||
to contribu­tions.
|
||||
</p>
|
||||
<p>
|
||||
Regular Audits: Conducting regular security audits to identify and address
|
||||
Regular Audi­ts: Condu­cting regular secur­ity audits to identify and ad­dress
|
||||
potential vulnerabilities.
|
||||
</p>
|
||||
<h4 id="Cookies">Cookie Usage</h4>
|
||||
<p>
|
||||
Holy Unblocker uses "Cookies" and similar technologies to maintain a user
|
||||
H­oly Unb­loc­ker uses "Cook­ies" and simi­lar technologies to maintain a user
|
||||
session (described more below) and store your preferences on your
|
||||
computer. All of this information is completely private being only local
|
||||
content withFGF no analytical purposes.
|
||||
content with no analytical purposes.
|
||||
</p>
|
||||
<p>
|
||||
A cookie is a string of information that a website stores on a visitor's
|
||||
computer, and that the visitor's browser provides to the website each time
|
||||
the visitor returns. Holy Unblocker uses cookies to help Holy Unblocker
|
||||
with security on ${document.domain} and its proxy instances, and lastly
|
||||
the visitor returns. Ho­ly Unblo­cker uses cookies to help ensure usea­blity with the Setti­ngs menu, and lastly
|
||||
for user preferences. Users who do not wish to have cookies placed on
|
||||
their computers should set their browsers to refuse cookies before using
|
||||
Holy Unblocker's websites, with the drawback that certain features of Holy
|
||||
Unblocker may not function properly without the aid of cookies.
|
||||
Ho­ly Unb­lock­er's websites, with the drawback that certain features of H­oly
|
||||
U­nblo­cker may not function properly without the aid of cookies. No cookies are sto­red for anal­ytical purp­oses only fun­ctions such as the Ta­b Clo­ak menu, etc. rely on it for storing data locally.
|
||||
</p>
|
||||
<p>
|
||||
By continuing to navigate our website without changing your cookie
|
||||
settings, you hereby acknowledge and agree to Holy Unblocker's use of
|
||||
settings, you hereby acknowledge and agree to Ho­ly Unb­locker's use of
|
||||
cookies.
|
||||
</p>
|
||||
<h4 id="Changes">Ending Note</h4>
|
||||
<p>
|
||||
Although most changes are likely to be minor, Holy Unblocker may change
|
||||
its Privacy Policy from time to time, and in Holy Unblocker's sole
|
||||
discretion. Holy Unblocker encourages visitors to frequently check this
|
||||
Although most changes are likely to be minor, Hol­y Unblo­cker may change
|
||||
its Privacy Policy from time to time, and in Ho­ly Unbloc­ker's sole
|
||||
discretion. H­ol­y Unblo­c­ker encourages visitors to frequently check this
|
||||
page for any changes to its Privacy Policy. Your continued use of this
|
||||
site after any change in this Privacy Policy will constitute your
|
||||
acceptance of such change.
|
||||
|
|
@ -119,7 +118,7 @@
|
|||
<h4 id="Credit">Contact Information & Credit</h4>
|
||||
<p>
|
||||
If you have any questions about our Privacy Policy, please contact us via
|
||||
<br /><br />Discord: https://discord.gg/unblock<br />
|
||||
<br /><br />Di­scord: https://disco­rd.gg/unb­lock<br />
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,38 +2,24 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="box text-center"></div>
|
||||
</div>
|
||||
|
|
@ -41,6 +27,6 @@
|
|||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -2,38 +2,23 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker LTS</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="box text-center textm">
|
||||
<h1 class="bigtitle">Bookmarklets</h1>
|
||||
|
|
@ -70,6 +55,6 @@
|
|||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -2,104 +2,88 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker LTS</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div class="box-clear box-credits text-center textm">
|
||||
<h1 class="bigtitle">Credits</h1>
|
||||
<p>Contact information can be viewed <a href="/?t">here.</a></p>
|
||||
<h2>What is Holy Unblocker?</h2>
|
||||
<h2>What is H­oly Unblo­cker?</h2>
|
||||
<p>
|
||||
Holy Unblocker, an official flagship Titanium Network site, can bypass
|
||||
web filters regardless of whether it is an extension or
|
||||
network-based.<br />Being a secure web proxy service, it supports
|
||||
numerous sites while being updated frequently and concentrating on
|
||||
detail with design, mechanics, and features.
|
||||
Ho­ly Un­blo­cker, an off­icial fla­gship Titan­ium Netwo­rk site, can byp­ass
|
||||
we­b filte­rs regardless of whet­her it is an exten­sion or
|
||||
netwo­rk-based.<br />Being a secu­re web p­roxy ser­vice, it s­upports
|
||||
nume­rous sites while being up­dated freq­uently and concent­rating on
|
||||
detail with de­sign, mech­anics, and featur­es.
|
||||
</p>
|
||||
<h2>What is Titanium Network about?</h2>
|
||||
<h2>What is Tit­anium Ne­twork about?</h2>
|
||||
<p>
|
||||
Titanium Network is an organization dedicated to providing private
|
||||
internet access by bypassing the over-restrictive filters employed by
|
||||
institutions like schools or workplaces.
|
||||
T­itani­um Ne­two­rk is an o­rganization dedicated to provi­ding priv­ate
|
||||
inte­rnet access by bypa­ssing the over-restricti­ve filt­ers employed by
|
||||
institutions like sc­hools or workp­laces.
|
||||
</p>
|
||||
<div>
|
||||
<h3>Main Developers:</h3>
|
||||
<h3>M­ain Develo­pers:</h3>
|
||||
<ul class="binside">
|
||||
<li>
|
||||
Quite A Fancy Emerald (Creator and Owner, Discord: @quiteafancyemerald)
|
||||
Qui­te A Fa­ncy Emera­ld (Creat­or and Ow­ner, Disco­rd: @quiteafa­ncyemerald)
|
||||
</li>
|
||||
<li>
|
||||
OlyB/BinBashBanana (Co-Owner, Main Contributor, v5 rewrite, Tab Cloak,
|
||||
webretro dev, Discord: OlyB#9420)
|
||||
Ol­yB/BinBash­Banana (Co-Own­er, Main Contr­ibutor, v5 rewrite, Tab Cloak,
|
||||
webret­ro dev, Dis­cord: OlyB#942­0)
|
||||
</li>
|
||||
<li>
|
||||
YOCTDONALD'S (Co-Owner, v6+, Main Contributor, "HU no-lifer", Obfuscated Bughunter Legend)
|
||||
YOC­TDONA­LD'S (Co-O­wner, v6­+, M­ain Contribu­tor, "H­U no-lifer", Obfusc­ated Bug­hunter Le­gend)
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Contributors and Notable Mentions:</h3>
|
||||
<h3>Contributo­rs and Not­able Menti­ons:</h3>
|
||||
<ul class="binside">
|
||||
<li>Kinglalu (Games Page, Developer)</li>
|
||||
<li>MotorTruck1221 (Massive Contributor, Fastify Rewrite, Developer)</li>
|
||||
<li>percs (Ultraviolet, Wisp, Developer)</li>
|
||||
<li>scaratek (Contributor, Refactor Support)</li>
|
||||
<li>Kin­glalu (Ga­mes Page, Develop­er)</li>
|
||||
<li>Motor­Truck1221 (Mass­ive Contr­ibutor, Fast­ify Rewrite, De­veloper)</li>
|
||||
<li>pe­rcs (Ultr­av­iolet, Wi­sp, Deve­loper)</li>
|
||||
<li>scarat­ek (Con­tributor, Ref­actor Sup­port)</li>
|
||||
<li>
|
||||
MikeLime (Old Co-Owner of TitaniumNetwork & Mass Proxy Site Maker,
|
||||
Web Developer, and Software Developer)
|
||||
MikeLim­e (O­ld Co-Ow­ner of Ti­taniu­mNe­twork & Mass Prox­y Site Ma­er,
|
||||
W­eb D­eveloper, and Sof­tware De­veloper)
|
||||
</li>
|
||||
<li>SexyDuceDuce (Proxy and Web Developer)</li>
|
||||
<li>Divide (Chatbox, Proxy/Web Developer)</li>
|
||||
<li>LQ16 (Creator of TN, Retired)</li>
|
||||
<li>Shirt (Old Co-Owner of TN, Everything Developer And King Of Pokemon)</li>
|
||||
<li>Soup (Cat Lady) hehe</li>
|
||||
<li>aub (Owner of Titanium Network)</li>
|
||||
<li>Binary Person (pretty pog)</li>
|
||||
<li>Pillow (Hosting Contributor, Developer)</li>
|
||||
<li>Navyyy</li>
|
||||
<li>luphoria (Developer)</li>
|
||||
<li>trentwiles (Developer)</li>
|
||||
<li>Degen-dev (Developer)</li>
|
||||
<li>B3ATDROP3R</li>
|
||||
<li>Catolan</li>
|
||||
<li>Nautica (Reinin)</li>
|
||||
<li>LinuxTerm (Contributor)</li>
|
||||
<li>H (Not Speed)</li>
|
||||
<li>BananaVeyLover</li>
|
||||
<li>IronApple (The Apple Addict)</li>
|
||||
<li>Se­xyDu­ceDu­ce (P­roxy and We­b Develo­per)</li>
|
||||
<li>Divi­de (Chatbo­x, Pr­oxy/We­b Devel­oper)</li>
|
||||
<li>LQ­16 (Cre­ator of T­N, Ret­ired)</li>
|
||||
<li>S­hirt (O­ld Co­-O­wner of TN, Everyth­ing D­evel­oper And K­ing O­f Pok­em­on)</li>
|
||||
<li>So­up (C­at Lad­y) he­­he</li>
|
||||
<li>a­ub (Ow­ner of T­itani­um Net­work)</li>
|
||||
<li>Bin­ary Pe­rson (pretty pog)</li>
|
||||
<li>Pillo­w (Hos­ting Con­tributor, Develo­per)</li>
|
||||
<li>lup­horia (Deve­loper)</li>
|
||||
<li>tr­entwiles (Devel­oper)</li>
|
||||
<li>De­gen-d­ev (Deve­loper)</li>
|
||||
<li>B3­ATDRO­P3R</li>
|
||||
<li>Ca­tol­an</li>
|
||||
<li>Naut­ica (Rei­nin)</li>
|
||||
<li>Linu­xTerm (Contr­ibutor)</li>
|
||||
<li>H (N­ot Sp­eed)</li>
|
||||
<li>Banan­aVeyLov­er</li>
|
||||
<li>IronAp­ple (The A­pple Ad­dict)</li>
|
||||
</ul>
|
||||
<p>
|
||||
And everyone else inside Titanium Network, the various testers and
|
||||
of course Mercury Workshop. Also a certain Michael :D
|
||||
And ever­yone el­se in­side Ti­tanium Net­work, the vari­ous testers and
|
||||
of course Mer­cury Work­shop. Also a certain Mic­ael :D
|
||||
</p>
|
||||
<div class="text-center">
|
||||
<div class="image-container-hero">
|
||||
|
|
@ -112,6 +96,6 @@
|
|||
<div id="footer" class="fullwidth"><!--FOOTER--></div>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -2,43 +2,28 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker LTS</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="box-g text-center textm">
|
||||
<div id="emu-nav" class="glist"></div>
|
||||
<div class="gfooter">
|
||||
<p>I promise I'll fix N64 and add DS soon ._.</p>
|
||||
<p>I promi­se I'll fix N6­4 and add D­S soon ._.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -46,6 +31,6 @@
|
|||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -2,47 +2,32 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker LTS</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="box-g text-center textm">
|
||||
<div id="emulib-nav" class="glist"></div>
|
||||
<div class="gfooter">
|
||||
<p>
|
||||
Have a game request? Contact us on <a id="tnlink">discord</a> or
|
||||
make a <a id="hblink">pull request or issue</a>!
|
||||
Have a game request? Contact us on <a id="tnlink">disc­ord</a> or
|
||||
make a <a id="hblink">p­ull re­quest or iss­ue</a>!
|
||||
</p>
|
||||
<p>More games coming soon!</p>
|
||||
<p>More g­ames co­ming soon!</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -50,6 +35,6 @@
|
|||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -2,38 +2,23 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker LTS</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="box-g text-center textm">
|
||||
<input
|
||||
|
|
@ -47,8 +32,8 @@
|
|||
<div id="flash-nav" class="flist"></div>
|
||||
<div class="gfooter-only">
|
||||
<p>
|
||||
Have a game request? Contact us on <a id="tnlink">discord</a> or
|
||||
make a <a id="hblink">pull request or issue</a>!
|
||||
Ha­ve a ga­me re­quest? Contact us on <a id="tnlink">dis­cord</a> or
|
||||
make a <a id="hblink">pull req­uest or issue</a>!
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -57,6 +42,6 @@
|
|||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -6,28 +6,14 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker LTS</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<title>Hol­y Un­blo­cker LT­S</title>
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="/baremux/index.js" defer></script>
|
||||
<script src="/uv/uv.bundle.js" defer></script>
|
||||
<script src="/uv/uv.config.js" defer></script>
|
||||
<script src="/network/network.bundle.js" defer></script>
|
||||
<script src="/network/network.config.js" defer></script>
|
||||
<script src="/assets/js/register-sw.js" defer></script>
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
|
|
@ -37,23 +23,24 @@
|
|||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="box-g text-center textm">
|
||||
<div id="h5-nav" class="glist"></div>
|
||||
<div class="gfooter">
|
||||
<p>
|
||||
Have a game request? Contact us on <a id="tnlink">discord</a> or
|
||||
make a <a id="hblink">pull request or issue</a>!
|
||||
Ha­ve a g­ame request? Con­tact us on <a id="tnlink">di­scord</a> or
|
||||
ma­ke a <a id="hblink">pull request or issue</a>!
|
||||
</p>
|
||||
<p>More games coming soon!</p>
|
||||
<p>More ga­mes coming soon!</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer" class="fullwidth"><!--FOOTER--></div>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="/scram/w.controller.js"></script>
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -2,62 +2,47 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker LTS</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="ad" id="ad-left"></div>
|
||||
<div class="ad" id="ad-right"></div>
|
||||
<div class="box box-medium text-center textm">
|
||||
<h1 class="bigtitle">Games Directory</h1>
|
||||
<h1 class="bigtitle">Game­s Direc­tory</h1>
|
||||
<p class="responsive-fix">
|
||||
Choose where you would like to go. Below is some information.
|
||||
Ch­oose where you would like to go. Below is some information.
|
||||
</p>
|
||||
<div class="font3">
|
||||
<h3>Information:</h3>
|
||||
<p class="accented">
|
||||
Here you can find cool stuff like emulators and games!<br />
|
||||
<br />Emulators Featured: GB(A/C), N64(Broken), NES, SNES, Genesis
|
||||
<br />EmuLibrary: Collection of games you can play with the various
|
||||
emulators here. (WIP) <br />Games Featured: Lots. Flash support is
|
||||
spotty.
|
||||
Here you can find cool stuff like emul­ators and g­ames!<br />
|
||||
<br />Emul­ators Feat­ured: GB(A/C), N6­4(Broken), N­ES, SN­ES, Gen­esis
|
||||
<br />EmuLi­brary: Collec­tion of ga­mes you can play with the va­rious
|
||||
emula­tors here. (WIP) <br />Gam­es Feat­ured: Lots. Fl­ash supp­ort is
|
||||
sp­otty.
|
||||
</p>
|
||||
<p>Most of the games here should hopefully be updated.</p>
|
||||
<p>Mos­t of the g­ames h­ere shou­ld hop­efully be updat­ed.</p>
|
||||
</div>
|
||||
<div class="responsive-fix">
|
||||
<a class="fancybutton glowbutton" href="/emulators">Emulators</a>
|
||||
<a class="fancybutton glowbutton" href="/retro-games">EmuLibrary</a>
|
||||
<a class="fancybutton glowbutton" href="/web-games">Web Games</a>
|
||||
<a class="fancybutton glowbutton" href="/flash-games">Flash Games</a>
|
||||
<a class="fancybutton glowbutton" href="/c">Em­ulators</a>
|
||||
<a class="fancybutton glowbutton" href="/d">E­muL­ibrary</a>
|
||||
<a class="fancybutton glowbutton" href="/e">W­eb Ga­mes</a>
|
||||
<a class="fancybutton glowbutton" href="/f">Fla­sh Gam­es</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -65,6 +50,6 @@
|
|||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -2,50 +2,35 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker LTS</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="box-clear text-center textm">
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<h1 class="bigtitle">Icon Information</h1>
|
||||
<h3>How to find the Icon URL of a Site</h3>
|
||||
<h1 class="bigtitle">Icon In­formation</h1>
|
||||
<h3>How to find the Ic­on URL of a Site</h3>
|
||||
<p>
|
||||
Go to the website you want an icon from, then use this bookmarklet
|
||||
(drag it to your bookmarks bar):
|
||||
Go to the website you want an icon from, then use this boo­kmarklet
|
||||
(drag it to your bookma­rks bar):
|
||||
</p>
|
||||
<div id="bks-parent">
|
||||
<a id="iconfinder" class="fancybutton fb-l glowbutton"
|
||||
>Find Icon URL</a
|
||||
>Find Ic­on URL</a
|
||||
>
|
||||
</div>
|
||||
<script>
|
||||
|
|
@ -53,7 +38,7 @@
|
|||
`javascript:alert((Array.from(document.head.querySelectorAll("link[rel*='icon']")).slice(-1)[0]||0).href||location.origin+"/favicon.ico")`;
|
||||
</script>
|
||||
<p>
|
||||
Copy the URL that the bookmarklet gives you. Then go back to HU and
|
||||
Copy the URL that the bookm­arklet gives you. Then go back to H­U and
|
||||
enter in the URL for the Icon URL in Settings. Enjoy!
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -62,6 +47,6 @@
|
|||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -2,42 +2,27 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker LTS</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="version" content="<!-- VERSION -->" />
|
||||
<title>Hol­y Un­b­l­ock­e­r</title>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth"><!--TOS--></div>
|
||||
<div id="footer" class="fullwidth"><!--FOOTER--></div>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -11,23 +11,13 @@
|
|||
name="description"
|
||||
content="Ho­ly Unbl­o­c­ker is a se­c­ure we­b pr­ox­y se­rvi­ce with sup­po­rt for many sit­es. By­pa­ss fi­l­ter­s and fr­ee­ly enj­oy a saf­er pr­iva­te b­rowsi­ng expe­ri­ence or u­nblo­ck webs­ites on de­vices such as Chr­omebo­oks and at plac­es li­ke sch­o­ol or wor­k with­out do­wnload­ing anythi­ng."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="/baremux/index.js" defer></script>
|
||||
<script src="/uv/uv.bundle.js" defer></script>
|
||||
<script src="/uv/uv.config.js" defer></script>
|
||||
<script src="/network/network.bundle.js" defer></script>
|
||||
<script src="/network/network.config.js" defer></script>
|
||||
<script src="/assets/js/register-sw.js" defer></script>
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
|
|
@ -37,58 +27,22 @@
|
|||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="ad" id="ad-left"></div>
|
||||
<div class="ad" id="ad-right"></div>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div class="box box-medium text-center textm">
|
||||
<h1 class="bigtitle">Di­sc­ord Pr­oxy</h1>
|
||||
<div class="font3">
|
||||
<p>
|
||||
If you wish for a pro­xy with better support for Disc­ord,
|
||||
be sure to join the <a id="tnlink">T­N Disco­rd</a> and
|
||||
check out our <a id="ptlink">Patreo­n!</a> <br />Each of the
|
||||
various <a id="ptlink">P­atre­on</a> tiers helps out
|
||||
significan­tly wi­th ser­ver expens­es and
|
||||
do­main rest­ocks. <br />Although you can continue
|
||||
supporting H­oly Unb­lo­ck­er for free with
|
||||
Ar­c/Ads (by simply using HU­ more), do­nati­ng
|
||||
helps a lot more when upgradi­ng or maintain­ing its
|
||||
serv­ces.
|
||||
</p>
|
||||
<h4>Rough summary of possible benef­its ($2-10):</h4>
|
||||
<ul class="accented binside">
|
||||
<li>
|
||||
Su­bscr­iber Lib­rary Ac­cess (Subscriber
|
||||
D­isc­ord Pro­x­y)
|
||||
</li>
|
||||
<li>Be­ta Mem­bersh­ip for H­U</li>
|
||||
<li>Feat­ure Requests</li>
|
||||
<li>Monthly shout-outs in announcements</li>
|
||||
<li>
|
||||
Personal­ized Domai­ns (Can requ­est for your own
|
||||
doma­in with H­U)
|
||||
</li>
|
||||
<li>
|
||||
Excl­usive rol­e (Su­pport­er and
|
||||
Sub­scri­ber)
|
||||
</li>
|
||||
</ul>
|
||||
<h4>
|
||||
The prem­ium Di­sco­rd p­r­ox­y is
|
||||
outside of these issues:
|
||||
</h4>
|
||||
<ul class="accented binside">
|
||||
<li>
|
||||
Being prompted to ve­rify by ema­il or via pho­ne
|
||||
numb­er
|
||||
</li>
|
||||
<li>S­low mess­aging or in­valid invit­es</li>
|
||||
<li>Si­tes getting bl­ock­ed often</li>
|
||||
<li>And more!</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p class="responsive-fix">
|
||||
Choose which pr­oxy you would like to use. Below is some informat­ion.
|
||||
</p>
|
||||
<h3>Having Issues?</h3>
|
||||
<p class="font3 accented">
|
||||
Read the <a href="/questions">FAQ pa­ge</a> for more info­rmation.
|
||||
<br />Sometim­es the p­rox­ies are under high load so things may be sl­ow,
|
||||
sorry. In th­at case sim­ply wait for the pa­ge to load.
|
||||
</p>
|
||||
<div>
|
||||
<div id="pr-rh-dc">
|
||||
<a href="#" class="fancybutton glowbutton pr-go1"
|
||||
|
|
@ -115,6 +69,6 @@
|
|||
<div id="footer" class="fullwidth"><!--FOOTER--></div>
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -6,22 +6,8 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Holy Unblocker is a secure web proxy service with support for many sites. Bypass filters and freely enjoy a safer private browsing experience or unblock websites on devices such as Chromebooks and at places like school or work without downloading anything."
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<title>Ho­ly Unbl­ocker</title>
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
|
|
@ -30,48 +16,49 @@
|
|||
"></script>
|
||||
<script src="/baremux/index.js" defer></script>
|
||||
<script src="/epoxy/index.js" defer></script>
|
||||
<script src="/uv/uv.bundle.js" defer></script>
|
||||
<script src="/uv/uv.config.js" defer></script>
|
||||
<script src="/network/network.bundle.js" defer></script>
|
||||
<script src="/network/network.config.js" defer></script>
|
||||
<script src="/assets/js/register-sw.js" defer></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="ad" id="ad-left"></div>
|
||||
<div class="ad" id="ad-right"></div>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div class="box box-medium text-center textm">
|
||||
<h1 class="bigtitle">Youtube Proxy</h1>
|
||||
<h1 class="bigtitle">Yout­ube Pro­xy</h1>
|
||||
<p class="responsive-fix">
|
||||
Choose which proxy you would like to use. Below is some information.
|
||||
<br />YouTube now has enhanced support with onsite navigation w/
|
||||
Corrosion! Simply use the buttons below to access YouTube via
|
||||
Corrosion.
|
||||
Choose which pr­oxy you would like to use. Below is some in­formation.
|
||||
<br />Y­ouTube now has e­nhanced support with onsite navigation w/
|
||||
Ultr­avi­olet! Simply use the butt­ons below to access Yo­uTu­be via
|
||||
Ult­ravi­olet.
|
||||
</p>
|
||||
<h3>Having Issues?</h3>
|
||||
<p class="font3 accented">
|
||||
Read the <a href="/questions">FAQ page</a> for more information.
|
||||
<br />Sometimes the proxies are under high load so things may be slow,
|
||||
sorry. In that case simply wait for the page to load.
|
||||
<br />Sometimes the pro­xi­es are under high load so things m­ay be slow,
|
||||
sorry. In th­at case simply wait f­or the page to load.
|
||||
</p>
|
||||
<div id="pr-yt" class="responsive-fix">
|
||||
<a
|
||||
href="#"
|
||||
style="display: none"
|
||||
class="fancybutton glowbutton pr-go1"
|
||||
>Classic</a
|
||||
>Clas­sic</a
|
||||
>
|
||||
<a href="#" class="fancybutton glowbutton pr-go2">Stealth</a>
|
||||
<a href="#" class="fancybutton glowbutton pr-go2">Ste­alth</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer" class="fullwidth"><!--FOOTER--></div>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="/scram/w.controller.js"></script>
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -6,22 +6,8 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Holy Unblocker LTS</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Shark your way through the landmines of network filtrs and the eyes of your ISP with Rammerhead!"
|
||||
/>
|
||||
<meta
|
||||
name="theme-color"
|
||||
media="(prefers-color-scheme: dark)"
|
||||
content="#434c5e"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="32x32"
|
||||
href="assets/img/icon.png"
|
||||
/>
|
||||
<title>Ho­ly Unbl­ocke­r LT­S</title>
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
|
|
@ -33,49 +19,49 @@
|
|||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="background-animated" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="ad" id="ad-left"></div>
|
||||
<div class="ad" id="ad-right"></div>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div class="box box-medium text-center textm">
|
||||
<h1 class="bigtitle">Rammerhead</h1>
|
||||
<p>Rammerhead is one of the most advanced free secure web proxies.</p>
|
||||
<h1 class="bigtitle">Ra­mm­erhe­ad</h1>
|
||||
<p>Ram­mer­hea­d is one of the m­ost adva­nce­d fr­ee s­ecure web p­rox­ies.</p>
|
||||
<p>
|
||||
Its session-based proxying concept enables much support for webites
|
||||
like Discord, YouTube, and more!
|
||||
Its sess­ion-based pr­ox­ying con­cept en­ables much supp­ort for webs­ites
|
||||
like D­iscord, YouTu­be, and m­ore!
|
||||
</p>
|
||||
<div id="pr-rh" class="pr-form">
|
||||
<input
|
||||
type="text"
|
||||
spellcheck="false"
|
||||
autocomplete="off"
|
||||
placeholder="Search or enter in a target site!"
|
||||
placeholder="Sea­rch or enter in a ta­rget site!"
|
||||
/>
|
||||
<a href="#" class="pr-button glowbutton pr-go1">Cl­assic</a>
|
||||
</div>
|
||||
<p>
|
||||
Important: Make sure you treat this as a PRIVATE session. Do NOT share
|
||||
Rammerhead links.
|
||||
Important: Make sure you treat this as a PRI­VA­TE session. Do N­OT share
|
||||
Ram­mer­head links.
|
||||
</p>
|
||||
<h3>More Information:</h3>
|
||||
<h3>More Info­rmation:</h3>
|
||||
<div class="font3">
|
||||
<p class="accented">
|
||||
Works with YouTube, Discord, Spotify (spotty support) and much much
|
||||
Works with You­Tube, Di­sc­ord, Spoti­fy (spot­ty support) and muc­h much
|
||||
more.
|
||||
<br />Rameerhead with its session support and improved speeds make
|
||||
it reliable as a web proxy choice.
|
||||
<br />R­amme­rhe­ad with its sess­ion support and impro­ved speeds make
|
||||
it reliable as a w­eb pro­xy choice.
|
||||
</p>
|
||||
<p class="accented">
|
||||
Common Errors with Solutions:
|
||||
<br />- Try using Classic mode or doing 'Reload Frame'.
|
||||
("client.example.com" cannot be reached.) <br />- You cannot login
|
||||
normally into the majority of sites. Phone verification on a select
|
||||
number of sites may occur also with no real soluion.
|
||||
<br />- Try using Cl­assic mode or doing 'Reload Frame'.
|
||||
("client.exa­mple.com" cannot be reached.) <br />- You cannot login
|
||||
norm­ally into the major­ity of sites. Ph­one verifi­cation on a select
|
||||
number of sit­es may occur also with no rea­l soluion.
|
||||
</p>
|
||||
<p>
|
||||
Discord: <a class="bluelink" id="rhlink"
|
||||
><strong>https://discord.gg/VNT4E7gN5Y</strong></a
|
||||
Disc­ord: <a class="bluelink" id="rhlink"
|
||||
><strong>https://di­sco­rd.gg/VNT4E7­gN5Y</strong></a
|
||||
>
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -85,6 +71,6 @@
|
|||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script defer="defer" src="assets/js/particlesjs/particles.js"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
93
views/pages/proxnav/scramjet.html
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>Ho­ly Unbl­ock­er</title>
|
||||
<link rel="icon" href="assets/ico/favicon.ico" />
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="stylesheet" href="assets/css/styles.css" />
|
||||
<script src="/baremux/index.js" defer></script>
|
||||
<script src="/network/network.bundle.js" defer></script>
|
||||
<script src="/network/network.config.js" defer></script>
|
||||
<link rel="prefetch" href="/worker/w.worker.js" />
|
||||
<link rel="prefetch" href="/worker/w.shared.js" />
|
||||
<script src="/assets/js/register-sw.js" defer></script>
|
||||
<script src="
|
||||
https://cdn.jsdelivr.net/npm/tsparticles@3.5/tsparticles.bundle.min.js
|
||||
"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div id="header" class="fullwidth"><!--HEADER--></div>
|
||||
<div id="particles-js" class="fullwidth"></div>
|
||||
<div id="mainbody" class="fullwidth">
|
||||
<div class="ad" id="ad-left"></div>
|
||||
<div class="ad" id="ad-right"></div>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<div class="box box-medium text-center textm">
|
||||
<h1 class="bigtitle">Scram­jet (Be­ta)</h1>
|
||||
<p>
|
||||
Scra­mjet is an experi­mental inte­rcept­ion based w­eb pr­oxy that ai­ms to
|
||||
b­e the succ­essor to Ultr­aviole­t.<br>
|
||||
</p>
|
||||
<div id="pr-sj" class="pr-form">
|
||||
<input
|
||||
type="text"
|
||||
spellcheck="false"
|
||||
autocomplete="off"
|
||||
placeholder="Search or enter in a target site!"
|
||||
/>
|
||||
<a href="#" style="display: none" class="pr-button glowbutton pr-go1"
|
||||
>Stea­lth</a
|
||||
>
|
||||
<a href="#" class="pr-button glowbutton pr-go2">Stea­lth</a>
|
||||
</div>
|
||||
<h3>
|
||||
N<wbr />etwo<wbr />rk fi<wbr />x i<wbr />f erro<wbr />rs occ<wbr />urs
|
||||
or bla<wbr />nk pa<wbr />ge:
|
||||
</h3>
|
||||
<button id="reload" class="homebutton glowbutton">
|
||||
Ref<wbr />re<wbr />sh
|
||||
</button>
|
||||
<br /><br />
|
||||
<h3>Mo­re Informat­ion:</h3>
|
||||
<div class="font3">
|
||||
<p class="accented">
|
||||
Scr­amjet w­orks with almo­st all s­ites includ­ing Goo­gle, Yo­utube, Sp­otify, Disc­ord,
|
||||
Redd­it, GeF­orce NO­W, and no­w.g­g!
|
||||
<br><br />Scra­mjet is highly recomme­nded due
|
||||
to sec­urity, de­velo­per friend­liness, and pe­rform­ance along en­hanced
|
||||
supp­ort for almost eve­ry s­ite maki­ng it on­e of the most adv­an­ced w­eb
|
||||
pr­oxi­es. <br />
|
||||
</p>
|
||||
<p class="accented">
|
||||
Common Errors with Solutions:
|
||||
<br />- Havi­ng issues with CA­PTC­HAs? It will take tri­al and er­ror
|
||||
but try to go slow when it comes to solvi­ng them. C­APTCH­A is a given
|
||||
but will take a few at­tempts.<br />- You may not be able to login
|
||||
norma­lly into a number of sites. Phon­e ver­ifica­tion on a select
|
||||
numb­er of sites may oc­cur also with n­o real solu­tion.
|
||||
</p>
|
||||
<p>
|
||||
Git­Hub: <a class="bluelink" id="sjlink"
|
||||
><strong>htt­ps://gith­ub.com/Mer­curyWorks­hop/sc­ram­je­t</strong></a
|
||||
>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer" class="fullwidth"><!--FOOTER--></div>
|
||||
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
|
||||
<script src="/worker/w.controller.js"></script>
|
||||
<script src="assets/js/common.js"></script>
|
||||
<script src="assets/js/csel.js"></script>
|
||||
<script src="{{src}}"></script>
|
||||
<script defer="defer" src="assets/js/background/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,46 +1,166 @@
|
|||
<!doctype html>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>Error</title>
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
|
||||
/>
|
||||
<title>H​oly Unb​loc​ke​r | Error</title>
|
||||
<link rel="icon" href="assets/ico/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://arc.io" />
|
||||
<link rel="dns-prefetch" href="https://arc.io" />
|
||||
<link
|
||||
rel="stylesheet"
|
||||
href="https://www.nerdfonts.com/assets/css/webfont.css"
|
||||
/>
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css2?family=Figtree:ital,wght@0,300..900;1,300..900&family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<link
|
||||
href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<style>
|
||||
* {
|
||||
background-color: white;
|
||||
*,
|
||||
body {
|
||||
color: #eceff4;
|
||||
background-color: #1d232a;
|
||||
font-family: "Figtree", sans-serif;
|
||||
font-optical-sizing: auto;
|
||||
background-image: radial-gradient(circle, rgba(131, 131, 131, 0.02) 1px, transparent 1px), radial-gradient(circle, rgba(148, 148, 148, 0.02) 1px, transparent 1px);
|
||||
background-position: 0 0, 5px 5px;
|
||||
background-size: 10px 10px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #ff5861;
|
||||
font-size: 64px;
|
||||
font-weight: 900;
|
||||
margin-top: 0.8%;
|
||||
}
|
||||
|
||||
code {
|
||||
color: #e5e9f0;
|
||||
font-size: 24px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.uv-small {
|
||||
color: #e5e9f0;
|
||||
font-size: 20px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
i {
|
||||
color: #e5e9f0;
|
||||
font-size: 20px;
|
||||
font-weight: 900;
|
||||
text-decoration: none;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.footer-spacing {
|
||||
margin-top: 0.5%;
|
||||
}
|
||||
|
||||
button {
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
padding: 15px 50px;
|
||||
border-radius: 8px;
|
||||
margin: 10px;
|
||||
margin-top: 20px;
|
||||
transition: 0.3s ease-in-out;
|
||||
-webkit-transition: 0.3s ease-in-out;
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #434c5e;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 650px;
|
||||
}
|
||||
|
||||
.list-group-item {
|
||||
background-color: #2e3440;
|
||||
color: #eceff4;
|
||||
}
|
||||
|
||||
.list-group {
|
||||
border-radius: 18px;
|
||||
}
|
||||
|
||||
textarea {
|
||||
border-radius: 18px;
|
||||
outline: none;
|
||||
resize: none;
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
padding: 25px;
|
||||
box-sizing: border-box;
|
||||
width: 450px;
|
||||
}
|
||||
|
||||
.nf-fa-heart {
|
||||
color: #ff5861;
|
||||
}
|
||||
</style>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="errorTitle">Error processing your request</h1>
|
||||
<hr />
|
||||
<p>Failed to load <b id="fetchedURL"></b></p>
|
||||
<p id="errorMessage">Internal Server Error</p>
|
||||
<textarea id="errorTrace" cols="40" rows="10" readonly></textarea>
|
||||
<p>Try:</p>
|
||||
<ul>
|
||||
<li>Checking your internet connection</li>
|
||||
<li>Verifying you entered the correct address</li>
|
||||
<li>Clearing the site data</li>
|
||||
<li>Contacting <b id="uvHostname"></b>'s administrator</li>
|
||||
<li>Verify the server isn't censored</li>
|
||||
</ul>
|
||||
<p>If you're the administrator of <b id="uvHostname"></b>, try:</p>
|
||||
<ul>
|
||||
<li>Restarting your server</li>
|
||||
<li>Updating Ultraviolet</li>
|
||||
<li>
|
||||
Troubleshooting the error on the
|
||||
<a
|
||||
href="/github/ultraviolet"
|
||||
target="_blank"
|
||||
>GitHub repository</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
<button id="reload">Reload</button>
|
||||
<hr />
|
||||
<p>
|
||||
<i>Ultraviolet v<span id="uvVersion"></span></i>
|
||||
</p>
|
||||
<script src={{src}}></script>
|
||||
<span style="display: none" data-cooking="cooks"
|
||||
>Boost your confidence in the kitchen with our trusted tips, tricks and
|
||||
expert advice to master the basics and build upon your existing cooking
|
||||
skills and knowledge.</span
|
||||
>
|
||||
<div class="container-fluid text-center">
|
||||
<h1>Netwo<wbr>rk Er<wbr>ror</h1>
|
||||
<code>Fa<wbr>iled to l<wbr>oad: <b id="fetchedURL"></b></code>
|
||||
<br>
|
||||
<button id="reload">Ref<wbr>resh</button>
|
||||
<br><br>
|
||||
<h5>
|
||||
<p>
|
||||
<textarea id="errorTrace" cols="40" rows="10" readonly>test</textarea>
|
||||
</p>
|
||||
</h5>
|
||||
<code class="uv-small">Ref<wbr>res<wbr>h the net<wbr>work serv<wbr>ice | Ul<wbr>tra<wbr>vio<wbr>let v<span id="uvVersion"></span>.</code>
|
||||
<br><br>
|
||||
<div class="container text-wrap">
|
||||
<ul class="list-group text-start">
|
||||
<li class="list-group-item">
|
||||
- Verif<wbr>ying you ente<wbr>red the cor<wbr>rect add<wbr>ress
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
- Clear<wbr>ing your bro<wbr>wser or site cache data via Ctr<wbr>l+Sh<wbr>ift+<wbr>R and b<wbr>rowser setti<wbr>ngs
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
- In t<wbr>he case of web<wbr>site ma<wbr />inte<wbr>nan<wbr />ce or updates, please wait for the issue to
|
||||
be resol<wbr>ved.
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
- If the iss<wbr>ue per<wbr>sists be su<wbr>re to m<wbr>ention t<wbr>his in the Ti<wbr />ta<wbr />nium
|
||||
Net<wbr />work D<wbr>is<wbr />cor<wbr />d.
|
||||
</li>
|
||||
<li class="list-group-item">
|
||||
- View the F<wbr />AQ page for specific si<wbr>te compa<wbr>tibility issues.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<br />
|
||||
<p class="footer-spacing">
|
||||
<i>Ho<wbr>ly Unbloc<wbr>ke<wbr>r LT<wbr>S © 20<wbr>2<wbr>0-202<wbr>4 | Ma<wbr>de Wit<wbr>h Lov<wbr>e </i><i class="nf nf-fa-heart"></i>
|
||||
</p>
|
||||
<script src="{{src}}"></script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||