diff --git a/README.md b/README.md index 37a9d6f..851e72e 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,25 @@ # Zoraxy -General purpose request (reverse) proxy and forwarding tool for low power devices. Now written in Go! +General purpose request (reverse) proxy and forwarding tool for networking noobs. Now written in Go! + +*Zoraxy v3 HTTP proxy config is not compatible with the older v2. If you are looking for the legacy version of Zoraxy, take a look at the [v2 branch](https://github.com/tobychui/zoraxy/tree/v2)* ### Features - Simple to use interface with detail in-system instructions - Reverse Proxy - - Subdomain Reverse Proxy - - Virtual Directory Reverse Proxy + - Virtual Directory + - Basic Auth + - Custom Headers - Redirection Rules - TLS / SSL setup and deploy -- Blacklist by country or IP address (single IP, CIDR or wildcard for beginners) + - ACME features like auto-renew to serve your sites in http**s** + - SNI support (one certificate contains multiple host names) + +- Blacklist / Whitelist by country or IP address (single IP, CIDR or wildcard for beginners) - Global Area Network Controller Web UI (ZeroTier not included) +- TCP Tunneling / Proxy - Integrated Up-time Monitor - Web-SSH Terminal - Utilities @@ -83,8 +90,6 @@ Usage of zoraxy: Disable authentication for management interface -port string Management web interface listening port (default ":8000") - -rpt string - Reserved -sshlb Allow loopback web ssh connection (DANGER) -version @@ -109,45 +114,12 @@ If you already have an upstream reverse proxy server in place with permission ma *Note: For security reaons, you should only enable no-auth if you are running Zoraxy in a trusted environment or with another authentication management proxy in front.* -#### Use with ArozOS - -The [ArozOS](https://arozos.com) subservice is a built-in, permission-managed, reverse proxy server. To use Zoraxy with ArozOS, connect to your ArozOS host via SSH and use the following command to install Zoraxy: - -```bash -# cd into your ArozOS subservice folder. Sometimes it is under ~/arozos/src/subservice. -cd ~/arozos/subservices -mkdir zoraxy -cd ./zoraxy - -# Download the release binary from Github release. -wget {binary executable link from release page} - -# Set permission. Change this if required. -sudo chmod 775 -R ./ - -# Start zoraxy to see if the downloaded arch is correct. -./zoraxy - -# After unzipping, press Ctrl + C to kill it. -# Rename it to validate the ArozOS subservice binary format. -mv ./zoraxy zoraxy_linux_amd64 - -# If you are using SBCs with a different CPU arch, use the following names: -# mv ./zoraxy zoraxy_linux_arm -# mv ./zoraxy zoraxy_linux_arm64 - -# Restart ArozOS -sudo systemctl restart arozos -``` - -To start the module, go to System Settings > Modules > Subservice and enable it in the menu. You should be able to see a new module named "Zoraxy" pop up in the start menu. - ## Screenshots -![](img/screenshots/0_1.png) - ![](img/screenshots/1.png) +![](img/screenshots/2.png) + More screenshots on the wikipage [Screenshots](https://github.com/tobychui/zoraxy/wiki/Screenshots)! ## FAQ @@ -194,5 +166,5 @@ If you like the project and want to support us, please consider a donation. You ## License -This project is open-sourced under AGPL. I open-sourced this project so everyone can check for security issues and benefit all users. **If you plan to use this project in a commercial environment (which violate the AGPL terms), please contact toby@imuslab.com for an alternative commercial license.** +This project is open-sourced under AGPL. I open-sourced this project so everyone can check for security issues and benefit all users. **If you plan to use this project in a commercial environment (which violate the AGPL terms), please contact toby@imuslab.com for an alternative license.** diff --git a/docker/Dockerfile b/docker/Dockerfile index eb2b15b..8ffd402 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -3,8 +3,6 @@ FROM docker.io/golang:alpine ARG VERSION RUN apk add --no-cache bash netcat-openbsd sudo -# Alternatives for security -RUN apk add --no-cache openssl=3.1.4-r1 RUN mkdir -p /opt/zoraxy/source/ &&\ mkdir -p /opt/zoraxy/config/ &&\ diff --git a/img/screenshots/0_1.png b/img/screenshots/0_1.png deleted file mode 100644 index d01f12f..0000000 Binary files a/img/screenshots/0_1.png and /dev/null differ diff --git a/img/screenshots/0_2.png b/img/screenshots/0_2.png deleted file mode 100644 index 072d3bc..0000000 Binary files a/img/screenshots/0_2.png and /dev/null differ diff --git a/img/screenshots/1.png b/img/screenshots/1.png index 4704cb1..f12e238 100644 Binary files a/img/screenshots/1.png and b/img/screenshots/1.png differ diff --git a/img/screenshots/10_1.png b/img/screenshots/10_1.png deleted file mode 100644 index 97509c8..0000000 Binary files a/img/screenshots/10_1.png and /dev/null differ diff --git a/img/screenshots/10_2.png b/img/screenshots/10_2.png deleted file mode 100644 index 6945614..0000000 Binary files a/img/screenshots/10_2.png and /dev/null differ diff --git a/img/screenshots/2.png b/img/screenshots/2.png index 2f50df3..06a03ef 100644 Binary files a/img/screenshots/2.png and b/img/screenshots/2.png differ diff --git a/img/screenshots/3.png b/img/screenshots/3.png deleted file mode 100644 index aadf70d..0000000 Binary files a/img/screenshots/3.png and /dev/null differ diff --git a/img/screenshots/4.png b/img/screenshots/4.png deleted file mode 100644 index 08ea14e..0000000 Binary files a/img/screenshots/4.png and /dev/null differ diff --git a/img/screenshots/5.png b/img/screenshots/5.png deleted file mode 100644 index 5ae638c..0000000 Binary files a/img/screenshots/5.png and /dev/null differ diff --git a/img/screenshots/6.png b/img/screenshots/6.png deleted file mode 100644 index 6cb5290..0000000 Binary files a/img/screenshots/6.png and /dev/null differ diff --git a/img/screenshots/7.png b/img/screenshots/7.png deleted file mode 100644 index 8a1f9cf..0000000 Binary files a/img/screenshots/7.png and /dev/null differ diff --git a/img/screenshots/8.png b/img/screenshots/8.png deleted file mode 100644 index 21b8b6c..0000000 Binary files a/img/screenshots/8.png and /dev/null differ diff --git a/img/screenshots/9.png b/img/screenshots/9.png deleted file mode 100644 index 26a8158..0000000 Binary files a/img/screenshots/9.png and /dev/null differ diff --git a/src/accesslist.go b/src/accesslist.go index dc26fb4..a52d878 100644 --- a/src/accesslist.go +++ b/src/accesslist.go @@ -4,6 +4,8 @@ import ( "encoding/json" "net/http" + strip "github.com/grokify/html-strip-tags-go" + "imuslab.com/zoraxy/mod/geodb" "imuslab.com/zoraxy/mod/utils" ) @@ -115,7 +117,7 @@ func handleListWhitelisted(w http.ResponseWriter, r *http.Request) { bltype = "country" } - resulst := []string{} + resulst := []*geodb.WhitelistEntry{} if bltype == "country" { resulst = geodbStore.GetAllWhitelistedCountryCode() } else if bltype == "ip" { @@ -134,7 +136,10 @@ func handleCountryWhitelistAdd(w http.ResponseWriter, r *http.Request) { return } - geodbStore.AddCountryCodeToWhitelist(countryCode) + comment, _ := utils.PostPara(r, "comment") + comment = strip.StripTags(comment) + + geodbStore.AddCountryCodeToWhitelist(countryCode, comment) utils.SendOK(w) } @@ -158,7 +163,10 @@ func handleIpWhitelistAdd(w http.ResponseWriter, r *http.Request) { return } - geodbStore.AddIPToWhiteList(ipAddr) + comment, _ := utils.PostPara(r, "comment") + comment = strip.StripTags(comment) + + geodbStore.AddIPToWhiteList(ipAddr, comment) } func handleIpWhitelistRemove(w http.ResponseWriter, r *http.Request) { diff --git a/src/acme.go b/src/acme.go index cdd04dc..fb328b8 100644 --- a/src/acme.go +++ b/src/acme.go @@ -103,6 +103,9 @@ func AcmeCheckAndHandleRenewCertificate(w http.ResponseWriter, r *http.Request) utils.SendErrorResponse(w, "ACME renew only support web server listening on port 80 (http) or 443 (https)") } + //Add a 3 second delay to make sure everything is settle down + time.Sleep(3 * time.Second) + // Pass over to the acmeHandler to deal with the communication acmeHandler.HandleRenewCertificate(w, r) diff --git a/src/api.go b/src/api.go index 5831564..14df881 100644 --- a/src/api.go +++ b/src/api.go @@ -56,9 +56,16 @@ func initAPIs() { authRouter.HandleFunc("/api/proxy/useHttpsRedirect", HandleUpdateHttpsRedirect) authRouter.HandleFunc("/api/proxy/listenPort80", HandleUpdatePort80Listener) authRouter.HandleFunc("/api/proxy/requestIsProxied", HandleManagementProxyCheck) - //Reverse proxy root related APIs - authRouter.HandleFunc("/api/proxy/root/listOptions", HandleRootRouteOptionList) - authRouter.HandleFunc("/api/proxy/root/updateOptions", HandleRootRouteOptionsUpdate) + authRouter.HandleFunc("/api/proxy/developmentMode", HandleDevelopmentModeChange) + //Reverse proxy virtual directory APIs + authRouter.HandleFunc("/api/proxy/vdir/list", ReverseProxyListVdir) + authRouter.HandleFunc("/api/proxy/vdir/add", ReverseProxyAddVdir) + authRouter.HandleFunc("/api/proxy/vdir/del", ReverseProxyDeleteVdir) + authRouter.HandleFunc("/api/proxy/vdir/edit", ReverseProxyEditVdir) + //Reverse proxy user define header apis + authRouter.HandleFunc("/api/proxy/header/list", HandleCustomHeaderList) + authRouter.HandleFunc("/api/proxy/header/add", HandleCustomHeaderAdd) + authRouter.HandleFunc("/api/proxy/header/remove", HandleCustomHeaderRemove) //Reverse proxy auth related APIs authRouter.HandleFunc("/api/proxy/auth/exceptions/list", ListProxyBasicAuthExceptionPaths) authRouter.HandleFunc("/api/proxy/auth/exceptions/add", AddProxyBasicAuthExceptionPaths) @@ -115,6 +122,8 @@ func initAPIs() { authRouter.HandleFunc("/api/gan/network/name", ganManager.HandleNetworkNaming) //authRouter.HandleFunc("/api/gan/network/detail", ganManager.HandleNetworkDetails) authRouter.HandleFunc("/api/gan/network/setRange", ganManager.HandleSetRanges) + authRouter.HandleFunc("/api/gan/network/join", ganManager.HandleServerJoinNetwork) + authRouter.HandleFunc("/api/gan/network/leave", ganManager.HandleServerLeaveNetwork) authRouter.HandleFunc("/api/gan/members/list", ganManager.HandleMemberList) authRouter.HandleFunc("/api/gan/members/ip", ganManager.HandleMemberIP) authRouter.HandleFunc("/api/gan/members/name", ganManager.HandleMemberNaming) @@ -175,7 +184,7 @@ func initAPIs() { authRouter.HandleFunc("/api/webserv/status", staticWebServer.HandleGetStatus) authRouter.HandleFunc("/api/webserv/start", staticWebServer.HandleStartServer) authRouter.HandleFunc("/api/webserv/stop", staticWebServer.HandleStopServer) - authRouter.HandleFunc("/api/webserv/setPort", staticWebServer.HandlePortChange) + authRouter.HandleFunc("/api/webserv/setPort", HandleStaticWebServerPortChange) authRouter.HandleFunc("/api/webserv/setDirList", staticWebServer.SetEnableDirectoryListing) if *allowWebFileManager { //Web Directory Manager file operation functions diff --git a/src/cert.go b/src/cert.go index 567fd7c..2f70825 100644 --- a/src/cert.go +++ b/src/cert.go @@ -51,7 +51,7 @@ func handleListCertificate(w http.ResponseWriter, r *http.Request) { results := []*CertInfo{} for _, filename := range filenames { - certFilepath := filepath.Join(tlsCertManager.CertStore, filename+".crt") + certFilepath := filepath.Join(tlsCertManager.CertStore, filename+".pem") //keyFilepath := filepath.Join(tlsCertManager.CertStore, filename+".key") fileInfo, err := os.Stat(certFilepath) if err != nil { @@ -248,7 +248,7 @@ func handleCertUpload(w http.ResponseWriter, r *http.Request) { } if keytype == "pub" { - overWriteFilename = domain + ".crt" + overWriteFilename = domain + ".pem" } else if keytype == "pri" { overWriteFilename = domain + ".key" } else { @@ -287,6 +287,9 @@ func handleCertUpload(w http.ResponseWriter, r *http.Request) { return } + //Update cert list + tlsCertManager.UpdateLoadedCertList() + // send response fmt.Fprintln(w, "File upload successful!") } diff --git a/src/config.go b/src/config.go index c012467..5978769 100644 --- a/src/config.go +++ b/src/config.go @@ -3,6 +3,7 @@ package main import ( "archive/zip" "encoding/json" + "errors" "fmt" "io" "net/http" @@ -35,97 +36,118 @@ type Record struct { BasicAuthExceptionRules []*dynamicproxy.BasicAuthExceptionRule } -// Save a reverse proxy config record to file -func SaveReverseProxyConfigToFile(proxyConfigRecord *Record) error { - //TODO: Make this accept new def types - os.MkdirAll("./conf/proxy/", 0775) - filename := getFilenameFromRootName(proxyConfigRecord.Rootname) - - //Generate record - thisRecord := proxyConfigRecord - - //Write to file - js, _ := json.MarshalIndent(thisRecord, "", " ") - return os.WriteFile(filepath.Join("./conf/proxy/", filename), js, 0775) -} - -// Save a running reverse proxy endpoint to file (with automatic endpoint to record conversion) -func SaveReverseProxyEndpointToFile(proxyEndpoint *dynamicproxy.ProxyEndpoint) error { - recordToSave, err := ConvertProxyEndpointToRecord(proxyEndpoint) +/* +Load Reverse Proxy Config from file and append it to current runtime proxy router +*/ +func LoadReverseProxyConfig(configFilepath string) error { + //Load the config file from disk + endpointConfig, err := os.ReadFile(configFilepath) if err != nil { return err } - return SaveReverseProxyConfigToFile(recordToSave) -} -func RemoveReverseProxyConfigFile(rootname string) error { - filename := getFilenameFromRootName(rootname) - removePendingFile := strings.ReplaceAll(filepath.Join("./conf/proxy/", filename), "\\", "/") - SystemWideLogger.Println("Config Removed: ", removePendingFile) - if utils.FileExists(removePendingFile) { - err := os.Remove(removePendingFile) - if err != nil { - SystemWideLogger.PrintAndLog("Proxy", "Unabel to remove config file", err) - return err - } + //Parse it into dynamic proxy endpoint + thisConfigEndpoint := dynamicproxy.ProxyEndpoint{} + err = json.Unmarshal(endpointConfig, &thisConfigEndpoint) + if err != nil { + return err } - //File already gone + //Matching domain not set. Assume root + if thisConfigEndpoint.RootOrMatchingDomain == "" { + thisConfigEndpoint.RootOrMatchingDomain = "/" + } + + if thisConfigEndpoint.ProxyType == dynamicproxy.ProxyType_Root { + //This is a root config file + rootProxyEndpoint, err := dynamicProxyRouter.PrepareProxyRoute(&thisConfigEndpoint) + if err != nil { + return err + } + + dynamicProxyRouter.SetProxyRouteAsRoot(rootProxyEndpoint) + + } else if thisConfigEndpoint.ProxyType == dynamicproxy.ProxyType_Host { + //This is a host config file + readyProxyEndpoint, err := dynamicProxyRouter.PrepareProxyRoute(&thisConfigEndpoint) + if err != nil { + return err + } + + dynamicProxyRouter.AddProxyRouteToRuntime(readyProxyEndpoint) + } else { + return errors.New("not supported proxy type") + } + + SystemWideLogger.PrintAndLog("Proxy", thisConfigEndpoint.RootOrMatchingDomain+" -> "+thisConfigEndpoint.Domain+" routing rule loaded", nil) return nil } -// Return ptype, rootname and proxyTarget, error if any -func LoadReverseProxyConfig(filename string) (*Record, error) { - thisRecord := Record{ - ProxyType: "", - Rootname: "", - ProxyTarget: "", - UseTLS: false, +func filterProxyConfigFilename(filename string) string { + //Filter out wildcard characters + filename = strings.ReplaceAll(filename, "*", "(ST)") + filename = strings.ReplaceAll(filename, "?", "(QM)") + filename = strings.ReplaceAll(filename, "[", "(OB)") + filename = strings.ReplaceAll(filename, "]", "(CB)") + filename = strings.ReplaceAll(filename, "#", "(HT)") + return filepath.ToSlash(filename) +} + +func SaveReverseProxyConfig(endpoint *dynamicproxy.ProxyEndpoint) error { + //Get filename for saving + filename := filepath.Join("./conf/proxy/", endpoint.RootOrMatchingDomain+".config") + if endpoint.ProxyType == dynamicproxy.ProxyType_Root { + filename = "./conf/proxy/root.config" + } + + filename = filterProxyConfigFilename(filename) + + //Save config to file + js, err := json.MarshalIndent(endpoint, "", " ") + if err != nil { + return err + } + + return os.WriteFile(filename, js, 0775) +} + +func RemoveReverseProxyConfig(endpoint string) error { + filename := filepath.Join("./conf/proxy/", endpoint+".config") + if endpoint == "/" { + filename = "./conf/proxy/root.config" + } + + filename = filterProxyConfigFilename(filename) + + if !utils.FileExists(filename) { + return errors.New("target endpoint not exists") + } + return os.Remove(filename) +} + +// Get the default root config that point to the internal static web server +// this will be used if root config is not found (new deployment / missing root.config file) +func GetDefaultRootConfig() (*dynamicproxy.ProxyEndpoint, error) { + //Default settings + rootProxyEndpoint, err := dynamicProxyRouter.PrepareProxyRoute(&dynamicproxy.ProxyEndpoint{ + ProxyType: dynamicproxy.ProxyType_Root, + RootOrMatchingDomain: "/", + Domain: "127.0.0.1:" + staticWebServer.GetListeningPort(), + RequireTLS: false, BypassGlobalTLS: false, - SkipTlsValidation: false, + SkipCertValidations: false, + VirtualDirectories: []*dynamicproxy.VirtualDirectoryEndpoint{}, RequireBasicAuth: false, BasicAuthCredentials: []*dynamicproxy.BasicAuthCredentials{}, BasicAuthExceptionRules: []*dynamicproxy.BasicAuthExceptionRule{}, - } - - configContent, err := os.ReadFile(filename) + DefaultSiteOption: dynamicproxy.DefaultSite_InternalStaticWebServer, + DefaultSiteValue: "", + }) if err != nil { - return &thisRecord, err + return nil, err } - //Unmarshal the content into config - err = json.Unmarshal(configContent, &thisRecord) - if err != nil { - return &thisRecord, err - } - - //Return it - return &thisRecord, nil -} - -// Convert a running proxy endpoint object into a save-able record struct -func ConvertProxyEndpointToRecord(targetProxyEndpoint *dynamicproxy.ProxyEndpoint) (*Record, error) { - thisProxyConfigRecord := Record{ - ProxyType: targetProxyEndpoint.GetProxyTypeString(), - Rootname: targetProxyEndpoint.RootOrMatchingDomain, - ProxyTarget: targetProxyEndpoint.Domain, - UseTLS: targetProxyEndpoint.RequireTLS, - BypassGlobalTLS: targetProxyEndpoint.BypassGlobalTLS, - SkipTlsValidation: targetProxyEndpoint.SkipCertValidations, - RequireBasicAuth: targetProxyEndpoint.RequireBasicAuth, - BasicAuthCredentials: targetProxyEndpoint.BasicAuthCredentials, - BasicAuthExceptionRules: targetProxyEndpoint.BasicAuthExceptionRules, - } - - return &thisProxyConfigRecord, nil -} - -func getFilenameFromRootName(rootname string) string { - //Generate a filename for this rootname - filename := strings.ReplaceAll(rootname, ".", "_") - filename = strings.ReplaceAll(filename, "/", "-") - filename = filename + ".config" - return filename + return rootProxyEndpoint, nil } /* diff --git a/src/go.mod b/src/go.mod index ad9214f..ce1c3b7 100644 --- a/src/go.mod +++ b/src/go.mod @@ -10,9 +10,11 @@ require ( github.com/gorilla/sessions v1.2.1 github.com/gorilla/websocket v1.5.0 github.com/grandcat/zeroconf v1.0.0 + github.com/grokify/html-strip-tags-go v0.1.0 github.com/likexian/whois v1.15.1 github.com/microcosm-cc/bluemonday v1.0.25 golang.org/x/net v0.14.0 golang.org/x/sys v0.11.0 + golang.org/x/text v0.12.0 golang.org/x/tools v0.12.0 // indirect ) diff --git a/src/go.sum b/src/go.sum index e984002..cad7eab 100644 --- a/src/go.sum +++ b/src/go.sum @@ -740,6 +740,8 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grandcat/zeroconf v1.0.0 h1:uHhahLBKqwWBV6WZUDAT71044vwOTL+McW0mBJvo6kE= github.com/grandcat/zeroconf v1.0.0/go.mod h1:lTKmG1zh86XyCoUeIHSA4FJMBwCJiQmGfcP2PdzytEs= +github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= +github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= diff --git a/src/main.go b/src/main.go index ae49a91..d8be86f 100644 --- a/src/main.go +++ b/src/main.go @@ -13,7 +13,6 @@ import ( "github.com/google/uuid" "imuslab.com/zoraxy/mod/acme" - "imuslab.com/zoraxy/mod/aroz" "imuslab.com/zoraxy/mod/auth" "imuslab.com/zoraxy/mod/database" "imuslab.com/zoraxy/mod/dynamicproxy/redirection" @@ -35,6 +34,7 @@ import ( ) // General flags +var webUIPort = flag.String("port", ":8000", "Management web interface listening port") var noauth = flag.Bool("noauth", false, "Disable authentication for management interface") var showver = flag.Bool("version", false, "Show version of this server") var allowSshLoopback = flag.Bool("sshlb", false, "Allow loopback web ssh connection (DANGER)") @@ -49,7 +49,7 @@ var logOutputToFile = flag.Bool("log", true, "Log terminal output to file") var ( name = "Zoraxy" - version = "2.6.8" + version = "3.0.0" nodeUUID = "generic" development = false //Set this to false to use embedded web fs bootTime = time.Now().Unix() @@ -63,7 +63,6 @@ var ( /* Handler Modules */ - handler *aroz.ArozHandler //Handle arozos managed permission system sysdb *database.Database //System database authAgent *auth.AuthAgent //Authentication agent tlsCertManager *tlscert.Manager //TLS / SSL management @@ -128,20 +127,8 @@ func ShutdownSeq() { } func main() { - //Start the aoModule pipeline (which will parse the flags as well). Pass in the module launch information - handler = aroz.HandleFlagParse(aroz.ServiceInfo{ - Name: name, - Desc: "Dynamic Reverse Proxy Server", - Group: "Network", - IconPath: "zoraxy/img/small_icon.png", - Version: version, - StartDir: "zoraxy/index.html", - SupportFW: true, - LaunchFWDir: "zoraxy/index.html", - SupportEmb: false, - InitFWSize: []int{1080, 580}, - }) - + //Parse startup flags + flag.Parse() if *showver { fmt.Println(name + " - Version " + version) os.Exit(0) @@ -166,7 +153,7 @@ func main() { startupSequence() //Initiate management interface APIs - requireAuth = !(*noauth || handler.IsUsingExternalPermissionManager()) + requireAuth = !(*noauth) initAPIs() //Start the reverse proxy server in go routine @@ -179,8 +166,8 @@ func main() { //Start the finalize sequences finalSequence() - SystemWideLogger.Println("Zoraxy started. Visit control panel at http://localhost" + handler.Port) - err = http.ListenAndServe(handler.Port, nil) + SystemWideLogger.Println("Zoraxy started. Visit control panel at http://localhost" + *webUIPort) + err = http.ListenAndServe(*webUIPort, nil) if err != nil { log.Fatal(err) diff --git a/src/mod/acme/acme.go b/src/mod/acme/acme.go index efbd325..665541c 100644 --- a/src/mod/acme/acme.go +++ b/src/mod/acme/acme.go @@ -163,7 +163,7 @@ func (a *ACMEHandler) ObtainCert(domains []string, certificateName string, email // Each certificate comes back with the cert bytes, the bytes of the client's // private key, and a certificate URL. - err = os.WriteFile("./conf/certs/"+certificateName+".crt", certificates.Certificate, 0777) + err = os.WriteFile("./conf/certs/"+certificateName+".pem", certificates.Certificate, 0777) if err != nil { log.Println(err) return false, err diff --git a/src/mod/dynamicproxy/Server.go b/src/mod/dynamicproxy/Server.go index c446277..7676210 100644 --- a/src/mod/dynamicproxy/Server.go +++ b/src/mod/dynamicproxy/Server.go @@ -1,9 +1,6 @@ package dynamicproxy import ( - _ "embed" - "errors" - "log" "net/http" "net/url" "os" @@ -26,11 +23,6 @@ import ( - Vitrual Directory Routing */ -var ( - //go:embed tld.json - rawTldMap []byte -) - func (h *ProxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { /* Special Routing Rules, bypass most of the limitations @@ -53,10 +45,12 @@ func (h *ProxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + //Inject headers + w.Header().Set("x-proxy-by", "zoraxy/"+h.Parent.Option.HostVersion) + /* General Access Check */ - respWritten := h.handleAccessRouting(w, r) if respWritten { return @@ -80,38 +74,45 @@ func (h *ProxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } /* - Subdomain Routing + Host Routing */ - if strings.Contains(r.Host, ".") { - //This might be a subdomain. See if there are any subdomain proxy router for this - sep := h.Parent.getSubdomainProxyEndpointFromHostname(domainOnly) - if sep != nil { - if sep.RequireBasicAuth { - err := h.handleBasicAuthRouting(w, r, sep) - if err != nil { - return - } - } - h.subdomainRequest(w, r, sep) - return - } - } - /* - Virtual Directory Routing - */ - //Clean up the request URI - proxyingPath := strings.TrimSpace(r.RequestURI) - targetProxyEndpoint := h.Parent.getTargetProxyEndpointFromRequestURI(proxyingPath) - if targetProxyEndpoint != nil { - if targetProxyEndpoint.RequireBasicAuth { - err := h.handleBasicAuthRouting(w, r, targetProxyEndpoint) + sep := h.Parent.getProxyEndpointFromHostname(domainOnly) + if sep != nil && !sep.Disabled { + if sep.RequireBasicAuth { + err := h.handleBasicAuthRouting(w, r, sep) if err != nil { return } } - h.proxyRequest(w, r, targetProxyEndpoint) - } else if !strings.HasSuffix(proxyingPath, "/") { + + //Check if any virtual directory rules matches + proxyingPath := strings.TrimSpace(r.RequestURI) + targetProxyEndpoint := sep.GetVirtualDirectoryHandlerFromRequestURI(proxyingPath) + if targetProxyEndpoint != nil && !targetProxyEndpoint.Disabled { + //Virtual directory routing rule found. Route via vdir mode + h.vdirRequest(w, r, targetProxyEndpoint) + return + } else if !strings.HasSuffix(proxyingPath, "/") && sep.ProxyType != ProxyType_Root { + potentialProxtEndpoint := sep.GetVirtualDirectoryHandlerFromRequestURI(proxyingPath + "/") + if potentialProxtEndpoint != nil && !targetProxyEndpoint.Disabled { + //Missing tailing slash. Redirect to target proxy endpoint + http.Redirect(w, r, r.RequestURI+"/", http.StatusTemporaryRedirect) + return + } + } + + //Fallback to handle by the host proxy forwarder + h.hostRequest(w, r, sep) + return + } + + /* + Root Router Handling + */ + //Clean up the request URI + proxyingPath := strings.TrimSpace(r.RequestURI) + if !strings.HasSuffix(proxyingPath, "/") { potentialProxtEndpoint := h.Parent.getTargetProxyEndpointFromRequestURI(proxyingPath + "/") if potentialProxtEndpoint != nil { //Missing tailing slash. Redirect to target proxy endpoint @@ -136,52 +137,63 @@ Once entered this routing segment, the root routing options will take over for the routing logic. */ func (h *ProxyHandler) handleRootRouting(w http.ResponseWriter, r *http.Request) { + domainOnly := r.Host if strings.Contains(r.Host, ":") { hostPath := strings.Split(r.Host, ":") domainOnly = hostPath[0] } - if h.Parent.RootRoutingOptions.EnableRedirectForUnsetRules { - //Route to custom domain - if h.Parent.RootRoutingOptions.UnsetRuleRedirectTarget == "" { - //Not set. Redirect to first level of domain redirectable - fld, err := h.getTopLevelRedirectableDomain(domainOnly) - if err != nil { - //Redirect to proxy root - h.proxyRequest(w, r, h.Parent.Root) - } else { - log.Println("[Router] Redirecting request from " + domainOnly + " to " + fld) - h.logRequest(r, false, 307, "root-redirect", domainOnly) - http.Redirect(w, r, fld, http.StatusTemporaryRedirect) - } + //Get the proxy root config + proot := h.Parent.Root + switch proot.DefaultSiteOption { + case DefaultSite_InternalStaticWebServer: + fallthrough + case DefaultSite_ReverseProxy: + //They both share the same behavior + + //Check if any virtual directory rules matches + proxyingPath := strings.TrimSpace(r.RequestURI) + targetProxyEndpoint := proot.GetVirtualDirectoryHandlerFromRequestURI(proxyingPath) + if targetProxyEndpoint != nil && !targetProxyEndpoint.Disabled { + //Virtual directory routing rule found. Route via vdir mode + h.vdirRequest(w, r, targetProxyEndpoint) return - } else if h.isTopLevelRedirectableDomain(domainOnly) { - //This is requesting a top level private domain that should be serving root - h.proxyRequest(w, r, h.Parent.Root) - } else { - //Validate the redirection target URL - parsedURL, err := url.Parse(h.Parent.RootRoutingOptions.UnsetRuleRedirectTarget) - if err != nil { - //Error when parsing target. Send to root - h.proxyRequest(w, r, h.Parent.Root) + } else if !strings.HasSuffix(proxyingPath, "/") && proot.ProxyType != ProxyType_Root { + potentialProxtEndpoint := proot.GetVirtualDirectoryHandlerFromRequestURI(proxyingPath + "/") + if potentialProxtEndpoint != nil && !targetProxyEndpoint.Disabled { + //Missing tailing slash. Redirect to target proxy endpoint + http.Redirect(w, r, r.RequestURI+"/", http.StatusTemporaryRedirect) return } - hostname := parsedURL.Hostname() - if domainOnly != hostname { - //Redirect to target - h.logRequest(r, false, 307, "root-redirect", domainOnly) - http.Redirect(w, r, h.Parent.RootRoutingOptions.UnsetRuleRedirectTarget, http.StatusTemporaryRedirect) - return - } else { - //Loopback request due to bad settings (Shd leave it empty) - //Forward it to root proxy - h.proxyRequest(w, r, h.Parent.Root) - } } - } else { - //Route to root - h.proxyRequest(w, r, h.Parent.Root) + + //No vdir match. Route via root router + h.hostRequest(w, r, h.Parent.Root) + case DefaultSite_Redirect: + redirectTarget := strings.TrimSpace(proot.DefaultSiteValue) + if redirectTarget == "" { + redirectTarget = "about:blank" + } + + //Check if it is an infinite loopback redirect + parsedURL, err := url.Parse(proot.DefaultSiteValue) + if err != nil { + //Error when parsing target. Send to root + h.hostRequest(w, r, h.Parent.Root) + return + } + hostname := parsedURL.Hostname() + if hostname == domainOnly { + h.logRequest(r, false, 500, "root-redirect", domainOnly) + http.Error(w, "Loopback redirects due to invalid settings", 500) + return + } + + h.logRequest(r, false, 307, "root-redirect", domainOnly) + http.Redirect(w, r, redirectTarget, http.StatusTemporaryRedirect) + case DefaultSite_NotFoundPage: + http.NotFound(w, r) } } @@ -219,44 +231,3 @@ func (h *ProxyHandler) handleAccessRouting(w http.ResponseWriter, r *http.Reques return false } - -// Return if the given host is already topped (e.g. example.com or example.co.uk) instead of -// a host with subdomain (e.g. test.example.com) -func (h *ProxyHandler) isTopLevelRedirectableDomain(requestHost string) bool { - parts := strings.Split(requestHost, ".") - if len(parts) > 2 { - //Cases where strange tld is used like .co.uk or .com.hk - _, ok := h.Parent.tldMap[strings.Join(parts[1:], ".")] - if ok { - //Already topped - return true - } - } else { - //Already topped - return true - } - - return false -} - -// GetTopLevelRedirectableDomain returns the toppest level of domain -// that is redirectable. E.g. a.b.c.example.co.uk will return example.co.uk -func (h *ProxyHandler) getTopLevelRedirectableDomain(unsetSubdomainHost string) (string, error) { - parts := strings.Split(unsetSubdomainHost, ".") - if h.isTopLevelRedirectableDomain(unsetSubdomainHost) { - //Already topped - return "", errors.New("already at top level domain") - } - - for i := 0; i < len(parts); i++ { - possibleTld := parts[i:] - _, ok := h.Parent.tldMap[strings.Join(possibleTld, ".")] - if ok { - //This is tld length - tld := strings.Join(parts[i-1:], ".") - return "//" + tld, nil - } - } - - return "", errors.New("unsupported top level domain given") -} diff --git a/src/mod/dynamicproxy/basicAuth.go b/src/mod/dynamicproxy/basicAuth.go index 8c8b5c3..d4dab2a 100644 --- a/src/mod/dynamicproxy/basicAuth.go +++ b/src/mod/dynamicproxy/basicAuth.go @@ -26,10 +26,6 @@ func (h *ProxyHandler) handleBasicAuthRouting(w http.ResponseWriter, r *http.Req } } - proxyType := "vdir-auth" - if pe.ProxyType == ProxyType_Subdomain { - proxyType = "subd-auth" - } u, p, ok := r.BasicAuth() if !ok { w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"`) @@ -48,7 +44,7 @@ func (h *ProxyHandler) handleBasicAuthRouting(w http.ResponseWriter, r *http.Req } if !matchingFound { - h.logRequest(r, false, 401, proxyType, pe.Domain) + h.logRequest(r, false, 401, "host", pe.Domain) w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"`) w.WriteHeader(401) return errors.New("unauthorized") diff --git a/src/mod/dynamicproxy/dpcore/dpcore.go b/src/mod/dynamicproxy/dpcore/dpcore.go index 1b1b11a..321f031 100644 --- a/src/mod/dynamicproxy/dpcore/dpcore.go +++ b/src/mod/dynamicproxy/dpcore/dpcore.go @@ -60,6 +60,7 @@ type ResponseRewriteRuleSet struct { ProxyDomain string OriginalHost string UseTLS bool + NoCache bool PathPrefix string //Vdir prefix for root, / will be rewrite to this } @@ -243,7 +244,7 @@ func (p *ReverseProxy) logf(format string, args ...interface{}) { } } -func removeHeaders(header http.Header) { +func removeHeaders(header http.Header, noCache bool) { // Remove hop-by-hop headers listed in the "Connection" header. if c := header.Get("Connection"); c != "" { for _, f := range strings.Split(c, ",") { @@ -260,9 +261,16 @@ func removeHeaders(header http.Header) { } } - if header.Get("A-Upgrade") != "" { - header.Set("Upgrade", header.Get("A-Upgrade")) - header.Del("A-Upgrade") + //Restore the Upgrade header if any + if header.Get("Zr-Origin-Upgrade") != "" { + header.Set("Upgrade", header.Get("Zr-Origin-Upgrade")) + header.Del("Zr-Origin-Upgrade") + } + + //Disable cache if nocache is set + if noCache { + header.Del("Cache-Control") + header.Set("Cache-Control", "no-store") } } @@ -281,6 +289,11 @@ func addXForwardedForHeader(req *http.Request) { req.Header.Set("X-Forwarded-Proto", "http") } + if req.Header.Get("X-Real-Ip") == "" { + //Not exists. Fill it in with client IP + req.Header.Set("X-Real-Ip", clientIP) + } + } } @@ -323,7 +336,7 @@ func (p *ReverseProxy) ProxyHTTP(rw http.ResponseWriter, req *http.Request, rrr copyHeader(outreq.Header, req.Header) // Remove hop-by-hop headers listed in the "Connection" header, Remove hop-by-hop headers. - removeHeaders(outreq.Header) + removeHeaders(outreq.Header, rrr.NoCache) // Add X-Forwarded-For Header. addXForwardedForHeader(outreq) @@ -339,7 +352,7 @@ func (p *ReverseProxy) ProxyHTTP(rw http.ResponseWriter, req *http.Request, rrr } // Remove hop-by-hop headers listed in the "Connection" header of the response, Remove hop-by-hop headers. - removeHeaders(res.Header) + removeHeaders(res.Header, rrr.NoCache) if p.ModifyResponse != nil { if err := p.ModifyResponse(res); err != nil { diff --git a/src/mod/dynamicproxy/dynamicproxy.go b/src/mod/dynamicproxy/dynamicproxy.go index d5f5d07..07b4347 100644 --- a/src/mod/dynamicproxy/dynamicproxy.go +++ b/src/mod/dynamicproxy/dynamicproxy.go @@ -22,27 +22,19 @@ import ( func NewDynamicProxy(option RouterOption) (*Router, error) { proxyMap := sync.Map{} - domainMap := sync.Map{} thisRouter := Router{ - Option: &option, - ProxyEndpoints: &proxyMap, - SubdomainEndpoint: &domainMap, - Running: false, - server: nil, - routingRules: []*RoutingRule{}, - tldMap: map[string]int{}, + Option: &option, + ProxyEndpoints: &proxyMap, + Running: false, + server: nil, + routingRules: []*RoutingRule{}, + tldMap: map[string]int{}, } thisRouter.mux = &ProxyHandler{ Parent: &thisRouter, } - //Prase the tld map for tld redirection in main router - //See Server.go declarations - if len(rawTldMap) > 0 { - json.Unmarshal(rawTldMap, &thisRouter.tldMap) - } - return &thisRouter, nil } @@ -76,21 +68,14 @@ func (router *Router) UpdateHttpToHttpsRedirectSetting(useRedirect bool) { func (router *Router) StartProxyService() error { //Create a new server object if router.server != nil { - return errors.New("Reverse proxy server already running") + return errors.New("reverse proxy server already running") } //Check if root route is set if router.Root == nil { - return errors.New("Reverse proxy router root not set") + return errors.New("reverse proxy router root not set") } - //Load root options from file - loadedRootOption, err := loadRootRoutingOptionsFromFile() - if err != nil { - return err - } - router.RootRoutingOptions = loadedRootOption - minVersion := tls.VersionTLS10 if router.Option.ForceTLSLatest { minVersion = tls.VersionTLS12 @@ -101,16 +86,6 @@ func (router *Router) StartProxyService() error { } if router.Option.UseTls { - /* - //Serve with TLS mode - ln, err := tls.Listen("tcp", ":"+strconv.Itoa(router.Option.Port), config) - if err != nil { - log.Println(err) - router.Running = false - return err - } - router.tlsListener = ln - */ router.server = &http.Server{ Addr: ":" + strconv.Itoa(router.Option.Port), Handler: router.mux, @@ -129,7 +104,7 @@ func (router *Router) StartProxyService() error { hostPath := strings.Split(r.Host, ":") domainOnly = hostPath[0] } - sep := router.getSubdomainProxyEndpointFromHostname(domainOnly) + sep := router.getProxyEndpointFromHostname(domainOnly) if sep != nil && sep.BypassGlobalTLS { //Allow routing via non-TLS handler originalHostHeader := r.Host @@ -140,7 +115,7 @@ func (router *Router) StartProxyService() error { r.URL, _ = url.Parse(originalHostHeader) } - sep.Proxy.ServeHTTP(w, r, &dpcore.ResponseRewriteRuleSet{ + sep.proxy.ServeHTTP(w, r, &dpcore.ResponseRewriteRuleSet{ ProxyDomain: sep.Domain, OriginalHost: originalHostHeader, UseTLS: sep.RequireTLS, @@ -225,7 +200,7 @@ func (router *Router) StartProxyService() error { func (router *Router) StopProxyService() error { if router.server == nil { - return errors.New("Reverse proxy server already stopped") + return errors.New("reverse proxy server already stopped") } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -253,13 +228,13 @@ func (router *Router) StopProxyService() error { // Restart the current router if it is running. func (router *Router) Restart() error { //Stop the router if it is already running - var err error = nil if router.Running { err := router.StopProxyService() if err != nil { return err } + time.Sleep(300 * time.Millisecond) // Start the server err = router.StartProxyService() if err != nil { @@ -267,7 +242,7 @@ func (router *Router) Restart() error { } } - return err + return nil } /* @@ -280,128 +255,17 @@ func (router *Router) IsProxiedSubdomain(r *http.Request) bool { hostname = r.Host } hostname = strings.Split(hostname, ":")[0] - subdEndpoint := router.getSubdomainProxyEndpointFromHostname(hostname) + subdEndpoint := router.getProxyEndpointFromHostname(hostname) return subdEndpoint != nil } -/* -Add an URL into a custom proxy services -*/ -func (router *Router) AddVirtualDirectoryProxyService(options *VdirOptions) error { - domain := options.Domain - if domain[len(domain)-1:] == "/" { - domain = domain[:len(domain)-1] - } - - /* - if rootname[len(rootname)-1:] == "/" { - rootname = rootname[:len(rootname)-1] - } - */ - - webProxyEndpoint := domain - if options.RequireTLS { - webProxyEndpoint = "https://" + webProxyEndpoint - } else { - webProxyEndpoint = "http://" + webProxyEndpoint - } - //Create a new proxy agent for this root - path, err := url.Parse(webProxyEndpoint) - if err != nil { - return err - } - - proxy := dpcore.NewDynamicProxyCore(path, options.RootName, options.SkipCertValidations) - - endpointObject := ProxyEndpoint{ - ProxyType: ProxyType_Vdir, - RootOrMatchingDomain: options.RootName, - Domain: domain, - RequireTLS: options.RequireTLS, - SkipCertValidations: options.SkipCertValidations, - RequireBasicAuth: options.RequireBasicAuth, - BasicAuthCredentials: options.BasicAuthCredentials, - BasicAuthExceptionRules: options.BasicAuthExceptionRules, - Proxy: proxy, - } - - router.ProxyEndpoints.Store(options.RootName, &endpointObject) - - log.Println("Registered Proxy Rule: ", options.RootName+" to "+domain) - return nil -} - /* Load routing from RP */ -func (router *Router) LoadProxy(ptype string, key string) (*ProxyEndpoint, error) { - if ptype == "vdir" { - proxy, ok := router.ProxyEndpoints.Load(key) - if !ok { - return nil, errors.New("target proxy not found") - } - - targetProxy := proxy.(*ProxyEndpoint) - targetProxy.parent = router - return targetProxy, nil - } else if ptype == "subd" { - proxy, ok := router.SubdomainEndpoint.Load(key) - if !ok { - return nil, errors.New("target proxy not found") - } - - targetProxy := proxy.(*ProxyEndpoint) - targetProxy.parent = router - return targetProxy, nil - } - - return nil, errors.New("unsupported ptype") -} - -/* -Add an default router for the proxy server -*/ -func (router *Router) SetRootProxy(options *RootOptions) error { - proxyLocation := options.ProxyLocation - if proxyLocation[len(proxyLocation)-1:] == "/" { - proxyLocation = proxyLocation[:len(proxyLocation)-1] - } - - webProxyEndpoint := proxyLocation - if options.RequireTLS { - webProxyEndpoint = "https://" + webProxyEndpoint - } else { - webProxyEndpoint = "http://" + webProxyEndpoint - } - //Create a new proxy agent for this root - path, err := url.Parse(webProxyEndpoint) - if err != nil { - return err - } - - proxy := dpcore.NewDynamicProxyCore(path, "", options.SkipCertValidations) - - rootEndpoint := ProxyEndpoint{ - ProxyType: ProxyType_Vdir, - RootOrMatchingDomain: "/", - Domain: proxyLocation, - RequireTLS: options.RequireTLS, - SkipCertValidations: options.SkipCertValidations, - RequireBasicAuth: options.RequireBasicAuth, - BasicAuthCredentials: options.BasicAuthCredentials, - BasicAuthExceptionRules: options.BasicAuthExceptionRules, - Proxy: proxy, - } - - router.Root = &rootEndpoint - return nil -} - -// Helpers to export the syncmap for easier processing -func (r *Router) GetSDProxyEndpointsAsMap() map[string]*ProxyEndpoint { - m := make(map[string]*ProxyEndpoint) - r.SubdomainEndpoint.Range(func(key, value interface{}) bool { - k, ok := key.(string) +func (router *Router) LoadProxy(matchingDomain string) (*ProxyEndpoint, error) { + var targetProxyEndpoint *ProxyEndpoint + router.ProxyEndpoints.Range(func(key, value interface{}) bool { + key, ok := key.(string) if !ok { return true } @@ -409,13 +273,32 @@ func (r *Router) GetSDProxyEndpointsAsMap() map[string]*ProxyEndpoint { if !ok { return true } - m[k] = v + + if key == matchingDomain { + targetProxyEndpoint = v + } return true }) - return m + + if targetProxyEndpoint == nil { + return nil, errors.New("target routing rule not found") + } + + return targetProxyEndpoint, nil } -func (r *Router) GetVDProxyEndpointsAsMap() map[string]*ProxyEndpoint { +// Deep copy a proxy endpoint, excluding runtime paramters +func CopyEndpoint(endpoint *ProxyEndpoint) *ProxyEndpoint { + js, _ := json.Marshal(endpoint) + newProxyEndpoint := ProxyEndpoint{} + err := json.Unmarshal(js, &newProxyEndpoint) + if err != nil { + return nil + } + return &newProxyEndpoint +} + +func (r *Router) GetProxyEndpointsAsMap() map[string]*ProxyEndpoint { m := make(map[string]*ProxyEndpoint) r.ProxyEndpoints.Range(func(key, value interface{}) bool { k, ok := key.(string) diff --git a/src/mod/dynamicproxy/endpoints.go b/src/mod/dynamicproxy/endpoints.go new file mode 100644 index 0000000..a0f80fb --- /dev/null +++ b/src/mod/dynamicproxy/endpoints.go @@ -0,0 +1,158 @@ +package dynamicproxy + +import ( + "encoding/json" + "errors" + "strings" + + "golang.org/x/text/cases" + "golang.org/x/text/language" +) + +/* + endpoint.go + author: tobychui + + This script handle the proxy endpoint object actions + so proxyEndpoint can be handled like a proper oop object + + Most of the functions are implemented in dynamicproxy.go +*/ + +/* + User Defined Header Functions +*/ + +// Check if a user define header exists in this endpoint, ignore case +func (ep *ProxyEndpoint) UserDefinedHeaderExists(key string) bool { + for _, header := range ep.UserDefinedHeaders { + if strings.EqualFold(header.Key, key) { + return true + } + } + + return false +} + +// Remvoe a user defined header from the list +func (ep *ProxyEndpoint) RemoveUserDefinedHeader(key string) error { + newHeaderList := []*UserDefinedHeader{} + for _, header := range ep.UserDefinedHeaders { + if !strings.EqualFold(header.Key, key) { + newHeaderList = append(newHeaderList, header) + } + } + + ep.UserDefinedHeaders = newHeaderList + + return nil +} + +// Add a user defined header to the list, duplicates will be automatically removed +func (ep *ProxyEndpoint) AddUserDefinedHeader(key string, value string) error { + if ep.UserDefinedHeaderExists(key) { + ep.RemoveUserDefinedHeader(key) + } + + ep.UserDefinedHeaders = append(ep.UserDefinedHeaders, &UserDefinedHeader{ + Key: cases.Title(language.Und, cases.NoLower).String(key), //e.g. x-proxy-by -> X-Proxy-By + Value: value, + }) + + return nil +} + +/* + Virtual Directory Functions +*/ + +// Get virtual directory handler from given URI +func (ep *ProxyEndpoint) GetVirtualDirectoryHandlerFromRequestURI(requestURI string) *VirtualDirectoryEndpoint { + for _, vdir := range ep.VirtualDirectories { + if strings.HasPrefix(requestURI, vdir.MatchingPath) { + return vdir + } + } + return nil +} + +// Get virtual directory handler by matching path (exact match required) +func (ep *ProxyEndpoint) GetVirtualDirectoryRuleByMatchingPath(matchingPath string) *VirtualDirectoryEndpoint { + for _, vdir := range ep.VirtualDirectories { + if vdir.MatchingPath == matchingPath { + return vdir + } + } + return nil +} + +// Delete a vdir rule by its matching path +func (ep *ProxyEndpoint) RemoveVirtualDirectoryRuleByMatchingPath(matchingPath string) error { + entryFound := false + newVirtualDirectoryList := []*VirtualDirectoryEndpoint{} + for _, vdir := range ep.VirtualDirectories { + if vdir.MatchingPath == matchingPath { + entryFound = true + } else { + newVirtualDirectoryList = append(newVirtualDirectoryList, vdir) + } + } + + if entryFound { + //Update the list of vdirs + ep.VirtualDirectories = newVirtualDirectoryList + return nil + } + return errors.New("target virtual directory routing rule not found") +} + +// Delete a vdir rule by its matching path +func (ep *ProxyEndpoint) AddVirtualDirectoryRule(vdir *VirtualDirectoryEndpoint) (*ProxyEndpoint, error) { + //Check for matching path duplicate + if ep.GetVirtualDirectoryRuleByMatchingPath(vdir.MatchingPath) != nil { + return nil, errors.New("rule with same matching path already exists") + } + + //Append it to the list of virtual directory + ep.VirtualDirectories = append(ep.VirtualDirectories, vdir) + + //Prepare to replace the current routing rule + parentRouter := ep.parent + readyRoutingRule, err := parentRouter.PrepareProxyRoute(ep) + if err != nil { + return nil, err + } + + if ep.ProxyType == ProxyType_Root { + parentRouter.Root = readyRoutingRule + } else if ep.ProxyType == ProxyType_Host { + ep.Remove() + parentRouter.AddProxyRouteToRuntime(readyRoutingRule) + } else { + return nil, errors.New("unsupported proxy type") + } + + return readyRoutingRule, nil +} + +// Create a deep clone object of the proxy endpoint +// Note the returned object is not activated. Call to prepare function before pushing into runtime +func (ep *ProxyEndpoint) Clone() *ProxyEndpoint { + clonedProxyEndpoint := ProxyEndpoint{} + js, _ := json.Marshal(ep) + json.Unmarshal(js, &clonedProxyEndpoint) + return &clonedProxyEndpoint +} + +// Remove this proxy endpoint from running proxy endpoint list +func (ep *ProxyEndpoint) Remove() error { + ep.parent.ProxyEndpoints.Delete(ep.RootOrMatchingDomain) + return nil +} + +// Write changes to runtime without respawning the proxy handler +// use prepare -> remove -> add if you change anything in the endpoint +// that effects the proxy routing src / dest +func (ep *ProxyEndpoint) UpdateToRuntime() { + ep.parent.ProxyEndpoints.Store(ep.RootOrMatchingDomain, ep) +} diff --git a/src/mod/dynamicproxy/proxyEndpoint.go b/src/mod/dynamicproxy/proxyEndpoint.go deleted file mode 100644 index 42a7de1..0000000 --- a/src/mod/dynamicproxy/proxyEndpoint.go +++ /dev/null @@ -1,68 +0,0 @@ -package dynamicproxy - -import "errors" - -/* - ProxyEndpoint.go - author: tobychui - - This script handle the proxy endpoint object actions - so proxyEndpoint can be handled like a proper oop object - - Most of the functions are implemented in dynamicproxy.go -*/ - -//Get the string version of proxy type -func (ep *ProxyEndpoint) GetProxyTypeString() string { - if ep.ProxyType == ProxyType_Subdomain { - return "subd" - } else if ep.ProxyType == ProxyType_Vdir { - return "vdir" - } - - return "unknown" -} - -//Update change in the current running proxy endpoint config -func (ep *ProxyEndpoint) UpdateToRuntime() { - if ep.IsVdir() { - ep.parent.ProxyEndpoints.Store(ep.RootOrMatchingDomain, ep) - - } else if ep.IsSubDomain() { - ep.parent.SubdomainEndpoint.Store(ep.RootOrMatchingDomain, ep) - } -} - -//Return true if the endpoint type is virtual directory -func (ep *ProxyEndpoint) IsVdir() bool { - return ep.ProxyType == ProxyType_Vdir -} - -//Return true if the endpoint type is subdomain -func (ep *ProxyEndpoint) IsSubDomain() bool { - return ep.ProxyType == ProxyType_Subdomain -} - -//Remove this proxy endpoint from running proxy endpoint list -func (ep *ProxyEndpoint) Remove() error { - //fmt.Println(ptype, key) - if ep.IsVdir() { - ep.parent.ProxyEndpoints.Delete(ep.RootOrMatchingDomain) - return nil - } else if ep.IsSubDomain() { - ep.parent.SubdomainEndpoint.Delete(ep.RootOrMatchingDomain) - return nil - } - return errors.New("invalid or unsupported type") - -} - -//ProxyEndpoint remove provide global access by key -func (router *Router) RemoveProxyEndpointByRootname(proxyType string, rootnameOrMatchingDomain string) error { - targetEpt, err := router.LoadProxy(proxyType, rootnameOrMatchingDomain) - if err != nil { - return err - } - - return targetEpt.Remove() -} diff --git a/src/mod/dynamicproxy/proxyRequestHandler.go b/src/mod/dynamicproxy/proxyRequestHandler.go index 01d2858..d1e5bfc 100644 --- a/src/mod/dynamicproxy/proxyRequestHandler.go +++ b/src/mod/dynamicproxy/proxyRequestHandler.go @@ -6,6 +6,8 @@ import ( "net" "net/http" "net/url" + "path/filepath" + "sort" "strings" "imuslab.com/zoraxy/mod/dynamicproxy/dpcore" @@ -28,13 +30,41 @@ func (router *Router) getTargetProxyEndpointFromRequestURI(requestURI string) *P return targetProxyEndpoint } -func (router *Router) getSubdomainProxyEndpointFromHostname(hostname string) *ProxyEndpoint { +func (router *Router) getProxyEndpointFromHostname(hostname string) *ProxyEndpoint { var targetSubdomainEndpoint *ProxyEndpoint = nil - ep, ok := router.SubdomainEndpoint.Load(hostname) + ep, ok := router.ProxyEndpoints.Load(hostname) if ok { targetSubdomainEndpoint = ep.(*ProxyEndpoint) } + //No hit. Try with wildcard + matchProxyEndpoints := []*ProxyEndpoint{} + router.ProxyEndpoints.Range(func(k, v interface{}) bool { + ep := v.(*ProxyEndpoint) + match, err := filepath.Match(ep.RootOrMatchingDomain, hostname) + if err != nil { + //Continue + return true + } + if match { + //targetSubdomainEndpoint = ep + matchProxyEndpoints = append(matchProxyEndpoints, ep) + return true + } + return true + }) + + if len(matchProxyEndpoints) == 1 { + //Only 1 match + return matchProxyEndpoints[0] + } else if len(matchProxyEndpoints) > 1 { + //More than one match. Get the best match one + sort.Slice(matchProxyEndpoints, func(i, j int) bool { + return matchProxyEndpoints[i].RootOrMatchingDomain < matchProxyEndpoints[j].RootOrMatchingDomain + }) + return matchProxyEndpoints[0] + } + return targetSubdomainEndpoint } @@ -54,14 +84,22 @@ func (router *Router) rewriteURL(rooturl string, requestURL string) string { return rewrittenURL } -// Handle subdomain request -func (h *ProxyHandler) subdomainRequest(w http.ResponseWriter, r *http.Request, target *ProxyEndpoint) { +// Handle host request +func (h *ProxyHandler) hostRequest(w http.ResponseWriter, r *http.Request, target *ProxyEndpoint) { r.Header.Set("X-Forwarded-Host", r.Host) r.Header.Set("X-Forwarded-Server", "zoraxy-"+h.Parent.Option.HostUUID) + + //Inject custom headers + if len(target.UserDefinedHeaders) > 0 { + for _, customHeader := range target.UserDefinedHeaders { + r.Header.Set(customHeader.Key, customHeader.Value) + } + } + requestURL := r.URL.String() if r.Header["Upgrade"] != nil && strings.ToLower(r.Header["Upgrade"][0]) == "websocket" { //Handle WebSocket request. Forward the custom Upgrade header and rewrite origin - r.Header.Set("A-Upgrade", "websocket") + r.Header.Set("Zr-Origin-Upgrade", "websocket") wsRedirectionEndpoint := target.Domain if wsRedirectionEndpoint[len(wsRedirectionEndpoint)-1:] != "/" { //Append / to the end of the redirection endpoint if not exists @@ -89,10 +127,11 @@ func (h *ProxyHandler) subdomainRequest(w http.ResponseWriter, r *http.Request, r.URL, _ = url.Parse(originalHostHeader) } - err := target.Proxy.ServeHTTP(w, r, &dpcore.ResponseRewriteRuleSet{ + err := target.proxy.ServeHTTP(w, r, &dpcore.ResponseRewriteRuleSet{ ProxyDomain: target.Domain, OriginalHost: originalHostHeader, UseTLS: target.RequireTLS, + NoCache: h.Parent.Option.NoCache, PathPrefix: "", }) @@ -113,15 +152,23 @@ func (h *ProxyHandler) subdomainRequest(w http.ResponseWriter, r *http.Request, } // Handle vdir type request -func (h *ProxyHandler) proxyRequest(w http.ResponseWriter, r *http.Request, target *ProxyEndpoint) { - rewriteURL := h.Parent.rewriteURL(target.RootOrMatchingDomain, r.RequestURI) +func (h *ProxyHandler) vdirRequest(w http.ResponseWriter, r *http.Request, target *VirtualDirectoryEndpoint) { + rewriteURL := h.Parent.rewriteURL(target.MatchingPath, r.RequestURI) r.URL, _ = url.Parse(rewriteURL) r.Header.Set("X-Forwarded-Host", r.Host) r.Header.Set("X-Forwarded-Server", "zoraxy-"+h.Parent.Option.HostUUID) + + //Inject custom headers + if len(target.parent.UserDefinedHeaders) > 0 { + for _, customHeader := range target.parent.UserDefinedHeaders { + r.Header.Set(customHeader.Key, customHeader.Value) + } + } + if r.Header["Upgrade"] != nil && strings.ToLower(r.Header["Upgrade"][0]) == "websocket" { //Handle WebSocket request. Forward the custom Upgrade header and rewrite origin - r.Header.Set("A-Upgrade", "websocket") + r.Header.Set("Zr-Origin-Upgrade", "websocket") wsRedirectionEndpoint := target.Domain if wsRedirectionEndpoint[len(wsRedirectionEndpoint)-1:] != "/" { wsRedirectionEndpoint = wsRedirectionEndpoint + "/" @@ -144,11 +191,11 @@ func (h *ProxyHandler) proxyRequest(w http.ResponseWriter, r *http.Request, targ r.URL, _ = url.Parse(originalHostHeader) } - err := target.Proxy.ServeHTTP(w, r, &dpcore.ResponseRewriteRuleSet{ + err := target.proxy.ServeHTTP(w, r, &dpcore.ResponseRewriteRuleSet{ ProxyDomain: target.Domain, OriginalHost: originalHostHeader, UseTLS: target.RequireTLS, - PathPrefix: target.RootOrMatchingDomain, + PathPrefix: target.MatchingPath, }) var dnsError *net.DNSError diff --git a/src/mod/dynamicproxy/rootRoute.go b/src/mod/dynamicproxy/rootRoute.go deleted file mode 100644 index 7ec8daa..0000000 --- a/src/mod/dynamicproxy/rootRoute.go +++ /dev/null @@ -1,51 +0,0 @@ -package dynamicproxy - -import ( - "encoding/json" - "errors" - "log" - "os" - - "imuslab.com/zoraxy/mod/utils" -) - -/* - rootRoute.go - - This script handle special case in routing where the root proxy - entity is involved. This also include its setting object - RootRoutingOptions -*/ - -var rootConfigFilepath string = "conf/root_config.json" - -func loadRootRoutingOptionsFromFile() (*RootRoutingOptions, error) { - if !utils.FileExists(rootConfigFilepath) { - //Not found. Create a root option - js, _ := json.MarshalIndent(RootRoutingOptions{}, "", " ") - err := os.WriteFile(rootConfigFilepath, js, 0775) - if err != nil { - return nil, errors.New("Unable to write root config to file: " + err.Error()) - } - } - newRootOption := RootRoutingOptions{} - rootOptionsBytes, err := os.ReadFile(rootConfigFilepath) - if err != nil { - log.Println("[Error] Unable to read root config file at " + rootConfigFilepath + ": " + err.Error()) - return nil, err - } - err = json.Unmarshal(rootOptionsBytes, &newRootOption) - if err != nil { - log.Println("[Error] Unable to parse root config file: " + err.Error()) - return nil, err - } - - return &newRootOption, nil -} - -// Save the new config to file. Note that this will not overwrite the runtime one -func (opt *RootRoutingOptions) SaveToFile() error { - js, _ := json.MarshalIndent(opt, "", " ") - err := os.WriteFile(rootConfigFilepath, js, 0775) - return err -} diff --git a/src/mod/dynamicproxy/router.go b/src/mod/dynamicproxy/router.go new file mode 100644 index 0000000..5f8c741 --- /dev/null +++ b/src/mod/dynamicproxy/router.go @@ -0,0 +1,110 @@ +package dynamicproxy + +import ( + "errors" + "net/url" + "strings" + + "imuslab.com/zoraxy/mod/dynamicproxy/dpcore" +) + +/* + Dynamic Proxy Router Functions + + This script handle the proxy rules router spawning + and preparation +*/ + +// Prepare proxy route generate a proxy handler service object for your endpoint +func (router *Router) PrepareProxyRoute(endpoint *ProxyEndpoint) (*ProxyEndpoint, error) { + //Filter the tailing slash if any + domain := endpoint.Domain + if domain[len(domain)-1:] == "/" { + domain = domain[:len(domain)-1] + } + endpoint.Domain = domain + + //Parse the web proxy endpoint + webProxyEndpoint := domain + if !strings.HasPrefix("http://", domain) && !strings.HasPrefix("https://", domain) { + //TLS is not hardcoded in proxy target domain + if endpoint.RequireTLS { + webProxyEndpoint = "https://" + webProxyEndpoint + } else { + webProxyEndpoint = "http://" + webProxyEndpoint + } + } + + //Create a new proxy agent for this root + path, err := url.Parse(webProxyEndpoint) + if err != nil { + return nil, err + } + + //Create the proxy routing handler + proxy := dpcore.NewDynamicProxyCore(path, "", endpoint.SkipCertValidations) + endpoint.proxy = proxy + endpoint.parent = router + + //Prepare proxy routing hjandler for each of the virtual directories + for _, vdir := range endpoint.VirtualDirectories { + domain := vdir.Domain + if domain[len(domain)-1:] == "/" { + domain = domain[:len(domain)-1] + } + + //Parse the web proxy endpoint + webProxyEndpoint = domain + if !strings.HasPrefix("http://", domain) && !strings.HasPrefix("https://", domain) { + //TLS is not hardcoded in proxy target domain + if vdir.RequireTLS { + webProxyEndpoint = "https://" + webProxyEndpoint + } else { + webProxyEndpoint = "http://" + webProxyEndpoint + } + } + + path, err := url.Parse(webProxyEndpoint) + if err != nil { + return nil, err + } + + proxy := dpcore.NewDynamicProxyCore(path, vdir.MatchingPath, vdir.SkipCertValidations) + vdir.proxy = proxy + vdir.parent = endpoint + } + + return endpoint, nil +} + +// Add Proxy Route to current runtime. Call to PrepareProxyRoute before adding to runtime +func (router *Router) AddProxyRouteToRuntime(endpoint *ProxyEndpoint) error { + if endpoint.proxy == nil { + //This endpoint is not prepared + return errors.New("proxy endpoint not ready. Use PrepareProxyRoute before adding to runtime") + } + // Push record into running subdomain endpoints + router.ProxyEndpoints.Store(endpoint.RootOrMatchingDomain, endpoint) + return nil +} + +// Set given Proxy Route as Root. Call to PrepareProxyRoute before adding to runtime +func (router *Router) SetProxyRouteAsRoot(endpoint *ProxyEndpoint) error { + if endpoint.proxy == nil { + //This endpoint is not prepared + return errors.New("proxy endpoint not ready. Use PrepareProxyRoute before adding to runtime") + } + // Push record into running root endpoints + router.Root = endpoint + return nil +} + +// ProxyEndpoint remove provide global access by key +func (router *Router) RemoveProxyEndpointByRootname(rootnameOrMatchingDomain string) error { + targetEpt, err := router.LoadProxy(rootnameOrMatchingDomain) + if err != nil { + return err + } + + return targetEpt.Remove() +} diff --git a/src/mod/dynamicproxy/subdomain.go b/src/mod/dynamicproxy/subdomain.go deleted file mode 100644 index f01e541..0000000 --- a/src/mod/dynamicproxy/subdomain.go +++ /dev/null @@ -1,50 +0,0 @@ -package dynamicproxy - -import ( - "log" - "net/url" - - "imuslab.com/zoraxy/mod/dynamicproxy/dpcore" -) - -/* - Add an URL intoa custom subdomain service - -*/ - -func (router *Router) AddSubdomainRoutingService(options *SubdOptions) error { - domain := options.Domain - if domain[len(domain)-1:] == "/" { - domain = domain[:len(domain)-1] - } - - webProxyEndpoint := domain - if options.RequireTLS { - webProxyEndpoint = "https://" + webProxyEndpoint - } else { - webProxyEndpoint = "http://" + webProxyEndpoint - } - - //Create a new proxy agent for this root - path, err := url.Parse(webProxyEndpoint) - if err != nil { - return err - } - - proxy := dpcore.NewDynamicProxyCore(path, "", options.SkipCertValidations) - - router.SubdomainEndpoint.Store(options.MatchingDomain, &ProxyEndpoint{ - RootOrMatchingDomain: options.MatchingDomain, - Domain: domain, - RequireTLS: options.RequireTLS, - Proxy: proxy, - BypassGlobalTLS: options.BypassGlobalTLS, - SkipCertValidations: options.SkipCertValidations, - RequireBasicAuth: options.RequireBasicAuth, - BasicAuthCredentials: options.BasicAuthCredentials, - BasicAuthExceptionRules: options.BasicAuthExceptionRules, - }) - - log.Println("Adding Subdomain Rule: ", options.MatchingDomain+" to "+domain) - return nil -} diff --git a/src/mod/dynamicproxy/tld.json b/src/mod/dynamicproxy/tld.json deleted file mode 100644 index 346b471..0000000 --- a/src/mod/dynamicproxy/tld.json +++ /dev/null @@ -1,9106 +0,0 @@ -{ - "!city.kawasaki.jp": 1, - "!city.kitakyushu.jp": 1, - "!city.kobe.jp": 1, - "!city.nagoya.jp": 1, - "!city.sapporo.jp": 1, - "!city.sendai.jp": 1, - "!city.yokohama.jp": 1, - "!www.ck": 1, - "*.0emm.com": 1, - "*.advisor.ws": 1, - "*.alces.network": 1, - "*.awdev.ca": 1, - "*.azurecontainer.io": 1, - "*.backyards.banzaicloud.io": 1, - "*.banzai.cloud": 1, - "*.bd": 1, - "*.beget.app": 1, - "*.build.run": 1, - "*.builder.code.com": 1, - "*.bzz.dapps.earth": 1, - "*.ck": 1, - "*.cloud.metacentrum.cz": 1, - "*.cloudera.site": 1, - "*.cns.joyent.com": 1, - "*.code.run": 1, - "*.compute-1.amazonaws.com": 1, - "*.compute.amazonaws.com": 1, - "*.compute.amazonaws.com.cn": 1, - "*.compute.estate": 1, - "*.cryptonomic.net": 1, - "*.customer-oci.com": 1, - "*.dapps.earth": 1, - "*.database.run": 1, - "*.dev-builder.code.com": 1, - "*.dev.adobeaemcloud.com": 1, - "*.devcdnaccesso.com": 1, - "*.developer.app": 1, - "*.digitaloceanspaces.com": 1, - "*.diher.solutions": 1, - "*.dweb.link": 1, - "*.elb.amazonaws.com": 1, - "*.elb.amazonaws.com.cn": 1, - "*.er": 1, - "*.ex.futurecms.at": 1, - "*.ex.ortsinfo.at": 1, - "*.firenet.ch": 1, - "*.fk": 1, - "*.frusky.de": 1, - "*.futurecms.at": 1, - "*.gateway.dev": 1, - "*.hosting.myjino.ru": 1, - "*.hosting.ovh.net": 1, - "*.in.futurecms.at": 1, - "*.jm": 1, - "*.kawasaki.jp": 1, - "*.kh": 1, - "*.kitakyushu.jp": 1, - "*.kobe.jp": 1, - "*.kunden.ortsinfo.at": 1, - "*.landing.myjino.ru": 1, - "*.lcl.dev": 1, - "*.lclstage.dev": 1, - "*.linodeobjects.com": 1, - "*.magentosite.cloud": 1, - "*.migration.run": 1, - "*.mm": 1, - "*.moonscale.io": 1, - "*.nagoya.jp": 1, - "*.nodebalancer.linode.com": 1, - "*.nom.br": 1, - "*.northflank.app": 1, - "*.np": 1, - "*.oci.customer-oci.com": 1, - "*.ocp.customer-oci.com": 1, - "*.ocs.customer-oci.com": 1, - "*.on-acorn.io": 1, - "*.on-k3s.io": 1, - "*.on-rancher.cloud": 1, - "*.on-rio.io": 1, - "*.otap.co": 1, - "*.owo.codes": 1, - "*.paywhirl.com": 1, - "*.pg": 1, - "*.platformsh.site": 1, - "*.quipelements.com": 1, - "*.r.appspot.com": 1, - "*.rss.my.id": 1, - "*.s5y.io": 1, - "*.sapporo.jp": 1, - "*.sch.uk": 1, - "*.sendai.jp": 1, - "*.sensiosite.cloud": 1, - "*.spectrum.myjino.ru": 1, - "*.statics.cloud": 1, - "*.stg-builder.code.com": 1, - "*.stg.dev": 1, - "*.stgstage.dev": 1, - "*.stolos.io": 1, - "*.svc.firenet.ch": 1, - "*.sys.qcx.io": 1, - "*.telebit.xyz": 1, - "*.transurl.be": 1, - "*.transurl.eu": 1, - "*.transurl.nl": 1, - "*.triton.zone": 1, - "*.tst.site": 1, - "*.uberspace.de": 1, - "*.user.fm": 1, - "*.user.localcert.dev": 1, - "*.usercontent.goog": 1, - "*.vps.myjino.ru": 1, - "*.vultrobjects.com": 1, - "*.webhare.dev": 1, - "*.webpaas.ovh.net": 1, - "*.yokohama.jp": 1, - "0.bg": 1, - "001www.com": 1, - "0e.vc": 1, - "1.azurestaticapps.net": 1, - "1.bg": 1, - "123hjemmeside.dk": 1, - "123hjemmeside.no": 1, - "123homepage.it": 1, - "123kotisivu.fi": 1, - "123minsida.se": 1, - "123miweb.es": 1, - "123paginaweb.pt": 1, - "123sait.ru": 1, - "123siteweb.fr": 1, - "123webseite.at": 1, - "123webseite.de": 1, - "123website.be": 1, - "123website.ch": 1, - "123website.lu": 1, - "123website.nl": 1, - "12hp.at": 1, - "12hp.ch": 1, - "12hp.de": 1, - "1337.pictures": 1, - "16-b.it": 1, - "180r.com": 1, - "1kapp.com": 1, - "2-d.jp": 1, - "2.azurestaticapps.net": 1, - "2.bg": 1, - "2000.hu": 1, - "2038.io": 1, - "2ix.at": 1, - "2ix.ch": 1, - "2ix.de": 1, - "3.azurestaticapps.net": 1, - "3.bg": 1, - "32-b.it": 1, - "3utilities.com": 1, - "4.bg": 1, - "4lima.at": 1, - "4lima.ch": 1, - "4lima.de": 1, - "4u.com": 1, - "5.bg": 1, - "5g.in": 1, - "6.bg": 1, - "611.to": 1, - "64-b.it": 1, - "6g.in": 1, - "7.bg": 1, - "8.bg": 1, - "9.bg": 1, - "9guacu.br": 1, - "a.bg": 1, - "a.prod.fastly.net": 1, - "a.run.app": 1, - "a.se": 1, - "a.ssl.fastly.net": 1, - "aa.no": 1, - "aaa": 1, - "aaa.pro": 1, - "aarborte.no": 1, - "aarp": 1, - "ab.ca": 1, - "abashiri.hokkaido.jp": 1, - "abb": 1, - "abbott": 1, - "abbvie": 1, - "abc": 1, - "abc.br": 1, - "abeno.osaka.jp": 1, - "abiko.chiba.jp": 1, - "abira.hokkaido.jp": 1, - "abkhazia.su": 1, - "able": 1, - "abo.pa": 1, - "abogado": 1, - "abr.it": 1, - "abruzzo.it": 1, - "abu.yamaguchi.jp": 1, - "abudhabi": 1, - "ac": 1, - "ac.ae": 1, - "ac.at": 1, - "ac.be": 1, - "ac.ci": 1, - "ac.cn": 1, - "ac.cr": 1, - "ac.cy": 1, - "ac.fj": 1, - "ac.gn": 1, - "ac.gov.br": 1, - "ac.id": 1, - "ac.il": 1, - "ac.im": 1, - "ac.in": 1, - "ac.ir": 1, - "ac.jp": 1, - "ac.ke": 1, - "ac.kr": 1, - "ac.leg.br": 1, - "ac.lk": 1, - "ac.ls": 1, - "ac.ma": 1, - "ac.me": 1, - "ac.mu": 1, - "ac.mw": 1, - "ac.mz": 1, - "ac.ni": 1, - "ac.nz": 1, - "ac.pa": 1, - "ac.pr": 1, - "ac.rs": 1, - "ac.ru": 1, - "ac.rw": 1, - "ac.se": 1, - "ac.sz": 1, - "ac.th": 1, - "ac.tj": 1, - "ac.tz": 1, - "ac.ug": 1, - "ac.uk": 1, - "ac.vn": 1, - "ac.za": 1, - "ac.zm": 1, - "ac.zw": 1, - "aca.pro": 1, - "academia.bo": 1, - "academy": 1, - "accenture": 1, - "accesscam.org": 1, - "accident-investigation.aero": 1, - "accident-prevention.aero": 1, - "accountant": 1, - "accountants": 1, - "acct.pro": 1, - "achi.nagano.jp": 1, - "aco": 1, - "act.au": 1, - "act.edu.au": 1, - "activetrail.biz": 1, - "actor": 1, - "ad": 1, - "ad.jp": 1, - "adachi.tokyo.jp": 1, - "adimo.co.uk": 1, - "adm.br": 1, - "adobeaemcloud.com": 1, - "adobeaemcloud.net": 1, - "adobeio-static.net": 1, - "adobeioruntime.net": 1, - "ads": 1, - "adult": 1, - "adult.ht": 1, - "adv.br": 1, - "adv.mz": 1, - "adygeya.ru": 1, - "adygeya.su": 1, - "ae": 1, - "ae.org": 1, - "aeg": 1, - "aejrie.no": 1, - "aero": 1, - "aero.mv": 1, - "aero.tt": 1, - "aerobatic.aero": 1, - "aeroclub.aero": 1, - "aerodrome.aero": 1, - "aeroport.fr": 1, - "aetna": 1, - "af": 1, - "affinitylottery.org.uk": 1, - "afjord.no": 1, - "afl": 1, - "africa": 1, - "africa.bj": 1, - "africa.com": 1, - "ag": 1, - "ag.it": 1, - "aga.niigata.jp": 1, - "agakhan": 1, - "agano.niigata.jp": 1, - "agdenes.no": 1, - "agematsu.nagano.jp": 1, - "agency": 1, - "agents.aero": 1, - "agr.br": 1, - "agrar.hu": 1, - "agric.za": 1, - "agrigento.it": 1, - "agro.bj": 1, - "agro.bo": 1, - "agro.pl": 1, - "aguni.okinawa.jp": 1, - "ah.cn": 1, - "ah.no": 1, - "ai": 1, - "ai.in": 1, - "ai.vn": 1, - "aibetsu.hokkaido.jp": 1, - "aichi.jp": 1, - "aid.pl": 1, - "aig": 1, - "aikawa.kanagawa.jp": 1, - "ainan.ehime.jp": 1, - "aioi.hyogo.jp": 1, - "aip.ee": 1, - "air-surveillance.aero": 1, - "air-traffic-control.aero": 1, - "airbus": 1, - "aircraft.aero": 1, - "airforce": 1, - "airkitapps-au.com": 1, - "airkitapps.com": 1, - "airkitapps.eu": 1, - "airline.aero": 1, - "airport.aero": 1, - "airtel": 1, - "airtraffic.aero": 1, - "aisai.aichi.jp": 1, - "aisho.shiga.jp": 1, - "aivencloud.com": 1, - "aizubange.fukushima.jp": 1, - "aizumi.tokushima.jp": 1, - "aizumisato.fukushima.jp": 1, - "aizuwakamatsu.fukushima.jp": 1, - "aju.br": 1, - "ak.us": 1, - "akabira.hokkaido.jp": 1, - "akadns.net": 1, - "akagi.shimane.jp": 1, - "akaiwa.okayama.jp": 1, - "akamai-staging.net": 1, - "akamai.net": 1, - "akamaiedge-staging.net": 1, - "akamaiedge.net": 1, - "akamaihd-staging.net": 1, - "akamaihd.net": 1, - "akamaiorigin-staging.net": 1, - "akamaiorigin.net": 1, - "akamaized-staging.net": 1, - "akamaized.net": 1, - "akashi.hyogo.jp": 1, - "akdn": 1, - "aki.kochi.jp": 1, - "akiruno.tokyo.jp": 1, - "akishima.tokyo.jp": 1, - "akita.akita.jp": 1, - "akita.jp": 1, - "akkeshi.hokkaido.jp": 1, - "aknoluokta.no": 1, - "ako.hyogo.jp": 1, - "akrehamn.no": 1, - "aktyubinsk.su": 1, - "akune.kagoshima.jp": 1, - "al": 1, - "al.eu.org": 1, - "al.gov.br": 1, - "al.it": 1, - "al.leg.br": 1, - "al.no": 1, - "al.us": 1, - "alaheadju.no": 1, - "aland.fi": 1, - "alessandria.it": 1, - "alesund.no": 1, - "algard.no": 1, - "alibaba": 1, - "alipay": 1, - "allfinanz": 1, - "allstate": 1, - "ally": 1, - "alp1.ae.flow.ch": 1, - "alpha-myqnapcloud.com": 1, - "alpha.bounty-full.com": 1, - "alsace": 1, - "alstahaug.no": 1, - "alstom": 1, - "alt.za": 1, - "alta.no": 1, - "altervista.org": 1, - "alto-adige.it": 1, - "altoadige.it": 1, - "alvdal.no": 1, - "alwaysdata.net": 1, - "am": 1, - "am.br": 1, - "am.gov.br": 1, - "am.in": 1, - "am.leg.br": 1, - "ama.aichi.jp": 1, - "ama.shimane.jp": 1, - "amagasaki.hyogo.jp": 1, - "amakusa.kumamoto.jp": 1, - "amami.kagoshima.jp": 1, - "amazon": 1, - "ambulance.aero": 1, - "americanexpress": 1, - "americanfamily": 1, - "amex": 1, - "amfam": 1, - "ami.ibaraki.jp": 1, - "amica": 1, - "amli.no": 1, - "amot.no": 1, - "amscompute.com": 1, - "amsterdam": 1, - "amusement.aero": 1, - "an.it": 1, - "analytics": 1, - "analytics-gateway.ap-northeast-1.amazonaws.com": 1, - "analytics-gateway.eu-west-1.amazonaws.com": 1, - "analytics-gateway.us-east-1.amazonaws.com": 1, - "analytics-gateway.us-east-2.amazonaws.com": 1, - "analytics-gateway.us-west-2.amazonaws.com": 1, - "anamizu.ishikawa.jp": 1, - "anan.nagano.jp": 1, - "anan.tokushima.jp": 1, - "anani.br": 1, - "ancona.it": 1, - "andasuolo.no": 1, - "andebu.no": 1, - "ando.nara.jp": 1, - "andoy.no": 1, - "andria-barletta-trani.it": 1, - "andria-trani-barletta.it": 1, - "andriabarlettatrani.it": 1, - "andriatranibarletta.it": 1, - "android": 1, - "andøy.no": 1, - "angiang.vn": 1, - "angry.jp": 1, - "anjo.aichi.jp": 1, - "ann-arbor.mi.us": 1, - "annaka.gunma.jp": 1, - "anpachi.gifu.jp": 1, - "anquan": 1, - "anz": 1, - "ao": 1, - "ao.it": 1, - "aogaki.hyogo.jp": 1, - "aogashima.tokyo.jp": 1, - "aoki.nagano.jp": 1, - "aol": 1, - "aomori.aomori.jp": 1, - "aomori.jp": 1, - "aosta-valley.it": 1, - "aosta.it": 1, - "aostavalley.it": 1, - "aoste.it": 1, - "ap-northeast-1.elasticbeanstalk.com": 1, - "ap-northeast-2.elasticbeanstalk.com": 1, - "ap-northeast-3.elasticbeanstalk.com": 1, - "ap-south-1.elasticbeanstalk.com": 1, - "ap-southeast-1.elasticbeanstalk.com": 1, - "ap-southeast-2.elasticbeanstalk.com": 1, - "ap.gov.br": 1, - "ap.gov.pl": 1, - "ap.it": 1, - "ap.leg.br": 1, - "ap.ngrok.io": 1, - "aparecida.br": 1, - "apartments": 1, - "api.gov.uk": 1, - "api.stdlib.com": 1, - "apigee.io": 1, - "app": 1, - "app.banzaicloud.io": 1, - "app.br": 1, - "app.gp": 1, - "app.lmpm.com": 1, - "app.os.fedoraproject.org": 1, - "app.os.stg.fedoraproject.org": 1, - "app.render.com": 1, - "appchizi.com": 1, - "appengine.flow.ch": 1, - "apple": 1, - "applinzi.com": 1, - "apps.fbsbx.com": 1, - "apps.lair.io": 1, - "appspacehosted.com": 1, - "appspaceusercontent.com": 1, - "appspot.com": 1, - "appudo.net": 1, - "aq": 1, - "aq.it": 1, - "aquarelle": 1, - "aquila.it": 1, - "ar": 1, - "ar.com": 1, - "ar.it": 1, - "ar.us": 1, - "arab": 1, - "arai.shizuoka.jp": 1, - "arakawa.saitama.jp": 1, - "arakawa.tokyo.jp": 1, - "aramco": 1, - "arao.kumamoto.jp": 1, - "archi": 1, - "architectes.bj": 1, - "ardal.no": 1, - "aremark.no": 1, - "arendal.no": 1, - "arezzo.it": 1, - "ariake.saga.jp": 1, - "arida.wakayama.jp": 1, - "aridagawa.wakayama.jp": 1, - "arita.saga.jp": 1, - "arkhangelsk.su": 1, - "armenia.su": 1, - "army": 1, - "arna.no": 1, - "arpa": 1, - "arq.br": 1, - "art": 1, - "art.br": 1, - "art.do": 1, - "art.dz": 1, - "art.ht": 1, - "art.pl": 1, - "art.sn": 1, - "arte": 1, - "arte.bo": 1, - "arts.co": 1, - "arts.nf": 1, - "arts.ro": 1, - "arts.ve": 1, - "arvo.network": 1, - "as": 1, - "as.us": 1, - "asago.hyogo.jp": 1, - "asahi.chiba.jp": 1, - "asahi.ibaraki.jp": 1, - "asahi.mie.jp": 1, - "asahi.nagano.jp": 1, - "asahi.toyama.jp": 1, - "asahi.yamagata.jp": 1, - "asahikawa.hokkaido.jp": 1, - "asaka.saitama.jp": 1, - "asakawa.fukushima.jp": 1, - "asakuchi.okayama.jp": 1, - "asaminami.hiroshima.jp": 1, - "ascoli-piceno.it": 1, - "ascolipiceno.it": 1, - "asda": 1, - "aseral.no": 1, - "ashgabad.su": 1, - "ashibetsu.hokkaido.jp": 1, - "ashikaga.tochigi.jp": 1, - "ashiya.fukuoka.jp": 1, - "ashiya.hyogo.jp": 1, - "ashoro.hokkaido.jp": 1, - "asia": 1, - "asker.no": 1, - "askim.no": 1, - "askoy.no": 1, - "askvoll.no": 1, - "askøy.no": 1, - "asn.au": 1, - "asn.lv": 1, - "asnes.no": 1, - "aso.kumamoto.jp": 1, - "ass.km": 1, - "assabu.hokkaido.jp": 1, - "assn.lk": 1, - "asso.ci": 1, - "asso.dz": 1, - "asso.eu.org": 1, - "asso.fr": 1, - "asso.gp": 1, - "asso.ht": 1, - "asso.km": 1, - "asso.mc": 1, - "asso.nc": 1, - "asso.re": 1, - "associates": 1, - "association.aero": 1, - "assur.bj": 1, - "asti.it": 1, - "asuke.aichi.jp": 1, - "at": 1, - "at-band-camp.net": 1, - "at.eu.org": 1, - "at.it": 1, - "at.md": 1, - "at.vg": 1, - "atami.shizuoka.jp": 1, - "ath.cx": 1, - "athleta": 1, - "atl.jelastic.vps-host.net": 1, - "atm.pl": 1, - "ato.br": 1, - "atsugi.kanagawa.jp": 1, - "atsuma.hokkaido.jp": 1, - "attorney": 1, - "au": 1, - "au.eu.org": 1, - "au.ngrok.io": 1, - "auction": 1, - "audi": 1, - "audible": 1, - "audio": 1, - "audnedaln.no": 1, - "augustow.pl": 1, - "aukra.no": 1, - "aure.no": 1, - "aurland.no": 1, - "aurskog-holand.no": 1, - "aurskog-høland.no": 1, - "aus.basketball": 1, - "auspost": 1, - "austevoll.no": 1, - "austrheim.no": 1, - "authgear-staging.com": 1, - "authgearapps.com": 1, - "author": 1, - "author.aero": 1, - "auto": 1, - "auto.pl": 1, - "autocode.dev": 1, - "autos": 1, - "av.it": 1, - "av.tr": 1, - "avellino.it": 1, - "averoy.no": 1, - "averøy.no": 1, - "avianca": 1, - "avocat.fr": 1, - "avocat.pro": 1, - "avocats.bj": 1, - "avoues.fr": 1, - "aw": 1, - "awaji.hyogo.jp": 1, - "aws": 1, - "awsglobalaccelerator.com": 1, - "awsmppl.com": 1, - "ax": 1, - "axa": 1, - "aya.miyazaki.jp": 1, - "ayabe.kyoto.jp": 1, - "ayagawa.kagawa.jp": 1, - "ayase.kanagawa.jp": 1, - "az": 1, - "az.us": 1, - "azerbaijan.su": 1, - "azimuth.network": 1, - "azumino.nagano.jp": 1, - "azure": 1, - "azure-mobile.net": 1, - "azurestaticapps.net": 1, - "azurewebsites.net": 1, - "aéroport.ci": 1, - "b-data.io": 1, - "b.bg": 1, - "b.br": 1, - "b.se": 1, - "b.ssl.fastly.net": 1, - "ba": 1, - "ba.gov.br": 1, - "ba.it": 1, - "ba.leg.br": 1, - "babia-gora.pl": 1, - "baby": 1, - "babyblue.jp": 1, - "babymilk.jp": 1, - "bacgiang.vn": 1, - "backan.vn": 1, - "backdrop.jp": 1, - "backplaneapp.io": 1, - "baclieu.vn": 1, - "bacninh.vn": 1, - "badaddja.no": 1, - "bahcavuotna.no": 1, - "bahccavuotna.no": 1, - "baidar.no": 1, - "baidu": 1, - "bajddar.no": 1, - "balashov.su": 1, - "balat.no": 1, - "balena-devices.com": 1, - "balestrand.no": 1, - "ballangen.no": 1, - "ballooning.aero": 1, - "balsan-sudtirol.it": 1, - "balsan-suedtirol.it": 1, - "balsan-südtirol.it": 1, - "balsan.it": 1, - "balsfjord.no": 1, - "bambina.jp": 1, - "bamble.no": 1, - "banamex": 1, - "bananarepublic": 1, - "band": 1, - "bandai.fukushima.jp": 1, - "bando.ibaraki.jp": 1, - "bank": 1, - "bar": 1, - "bar.pro": 1, - "bar0.net": 1, - "bar1.net": 1, - "bar2.net": 1, - "barcelona": 1, - "barclaycard": 1, - "barclays": 1, - "bardu.no": 1, - "barefoot": 1, - "bargains": 1, - "bari.it": 1, - "baria-vungtau.vn": 1, - "barletta-trani-andria.it": 1, - "barlettatraniandria.it": 1, - "barrel-of-knowledge.info": 1, - "barrell-of-knowledge.info": 1, - "barsy.bg": 1, - "barsy.ca": 1, - "barsy.club": 1, - "barsy.co.uk": 1, - "barsy.de": 1, - "barsy.eu": 1, - "barsy.in": 1, - "barsy.info": 1, - "barsy.io": 1, - "barsy.me": 1, - "barsy.menu": 1, - "barsy.mobi": 1, - "barsy.net": 1, - "barsy.online": 1, - "barsy.org": 1, - "barsy.pro": 1, - "barsy.pub": 1, - "barsy.ro": 1, - "barsy.shop": 1, - "barsy.site": 1, - "barsy.support": 1, - "barsy.uk": 1, - "barsycenter.com": 1, - "barsyonline.co.uk": 1, - "barsyonline.com": 1, - "barueri.br": 1, - "barum.no": 1, - "bas.it": 1, - "base.ec": 1, - "base.shop": 1, - "baseball": 1, - "bashkiria.ru": 1, - "bashkiria.su": 1, - "basicserver.io": 1, - "basilicata.it": 1, - "basketball": 1, - "bato.tochigi.jp": 1, - "batsfjord.no": 1, - "bauhaus": 1, - "bayern": 1, - "bb": 1, - "bbc": 1, - "bbs.tr": 1, - "bbt": 1, - "bbva": 1, - "bc.ca": 1, - "bc.platform.sh": 1, - "bcg": 1, - "bci.dnstrace.pro": 1, - "bcn": 1, - "bd.se": 1, - "be": 1, - "be.ax": 1, - "be.eu.org": 1, - "be.gy": 1, - "beagleboard.io": 1, - "bearalvahki.no": 1, - "bearalváhki.no": 1, - "beardu.no": 1, - "beats": 1, - "beauty": 1, - "bedzin.pl": 1, - "beep.pl": 1, - "beer": 1, - "beiarn.no": 1, - "bel.tr": 1, - "belau.pw": 1, - "belem.br": 1, - "belluno.it": 1, - "benevento.it": 1, - "bentley": 1, - "bentre.vn": 1, - "beppu.oita.jp": 1, - "berg.no": 1, - "bergamo.it": 1, - "bergen.no": 1, - "berlevag.no": 1, - "berlevåg.no": 1, - "berlin": 1, - "beskidy.pl": 1, - "best": 1, - "bestbuy": 1, - "bet": 1, - "bet.ar": 1, - "beta.bounty-full.com": 1, - "beta.tailscale.net": 1, - "betainabox.com": 1, - "better-than.tv": 1, - "bf": 1, - "bg": 1, - "bg.eu.org": 1, - "bg.it": 1, - "bh": 1, - "bharti": 1, - "bhz.br": 1, - "bi": 1, - "bi.it": 1, - "bialowieza.pl": 1, - "bialystok.pl": 1, - "bib.br": 1, - "bib.ve": 1, - "bibai.hokkaido.jp": 1, - "bible": 1, - "bid": 1, - "biei.hokkaido.jp": 1, - "bielawa.pl": 1, - "biella.it": 1, - "bieszczady.pl": 1, - "bievat.no": 1, - "bievát.no": 1, - "bifuka.hokkaido.jp": 1, - "bihar.in": 1, - "bihoro.hokkaido.jp": 1, - "bike": 1, - "bindal.no": 1, - "bing": 1, - "bingo": 1, - "binhdinh.vn": 1, - "binhduong.vn": 1, - "binhphuoc.vn": 1, - "binhthuan.vn": 1, - "bio": 1, - "bio.br": 1, - "bip.sh": 1, - "bir.ru": 1, - "biratori.hokkaido.jp": 1, - "birkenes.no": 1, - "bitbridge.net": 1, - "bitbucket.io": 1, - "bitter.jp": 1, - "biz": 1, - "biz.at": 1, - "biz.az": 1, - "biz.bb": 1, - "biz.cy": 1, - "biz.dk": 1, - "biz.et": 1, - "biz.fj": 1, - "biz.gl": 1, - "biz.id": 1, - "biz.in": 1, - "biz.ki": 1, - "biz.ls": 1, - "biz.mv": 1, - "biz.mw": 1, - "biz.my": 1, - "biz.ni": 1, - "biz.nr": 1, - "biz.pk": 1, - "biz.pl": 1, - "biz.pr": 1, - "biz.ss": 1, - "biz.tj": 1, - "biz.tr": 1, - "biz.tt": 1, - "biz.ua": 1, - "biz.vn": 1, - "biz.wf": 1, - "biz.zm": 1, - "bizen.okayama.jp": 1, - "bj": 1, - "bj.cn": 1, - "bjarkoy.no": 1, - "bjarkøy.no": 1, - "bjerkreim.no": 1, - "bjugn.no": 1, - "bl.it": 1, - "black": 1, - "blackbaudcdn.net": 1, - "blackfriday": 1, - "blockbuster": 1, - "blog": 1, - "blog.bo": 1, - "blog.br": 1, - "blog.gt": 1, - "blog.kg": 1, - "blog.vu": 1, - "blogdns.com": 1, - "blogdns.net": 1, - "blogdns.org": 1, - "blogsite.org": 1, - "blogsite.xyz": 1, - "blogspot.ae": 1, - "blogspot.al": 1, - "blogspot.am": 1, - "blogspot.ba": 1, - "blogspot.be": 1, - "blogspot.bg": 1, - "blogspot.bj": 1, - "blogspot.ca": 1, - "blogspot.cf": 1, - "blogspot.ch": 1, - "blogspot.cl": 1, - "blogspot.co.at": 1, - "blogspot.co.id": 1, - "blogspot.co.il": 1, - "blogspot.co.ke": 1, - "blogspot.co.nz": 1, - "blogspot.co.uk": 1, - "blogspot.co.za": 1, - "blogspot.com": 1, - "blogspot.com.ar": 1, - "blogspot.com.au": 1, - "blogspot.com.br": 1, - "blogspot.com.by": 1, - "blogspot.com.co": 1, - "blogspot.com.cy": 1, - "blogspot.com.ee": 1, - "blogspot.com.eg": 1, - "blogspot.com.es": 1, - "blogspot.com.mt": 1, - "blogspot.com.ng": 1, - "blogspot.com.tr": 1, - "blogspot.com.uy": 1, - "blogspot.cv": 1, - "blogspot.cz": 1, - "blogspot.de": 1, - "blogspot.dk": 1, - "blogspot.fi": 1, - "blogspot.fr": 1, - "blogspot.gr": 1, - "blogspot.hk": 1, - "blogspot.hr": 1, - "blogspot.hu": 1, - "blogspot.ie": 1, - "blogspot.in": 1, - "blogspot.is": 1, - "blogspot.it": 1, - "blogspot.jp": 1, - "blogspot.kr": 1, - "blogspot.li": 1, - "blogspot.lt": 1, - "blogspot.lu": 1, - "blogspot.md": 1, - "blogspot.mk": 1, - "blogspot.mr": 1, - "blogspot.mx": 1, - "blogspot.my": 1, - "blogspot.nl": 1, - "blogspot.no": 1, - "blogspot.pe": 1, - "blogspot.pt": 1, - "blogspot.qa": 1, - "blogspot.re": 1, - "blogspot.ro": 1, - "blogspot.rs": 1, - "blogspot.ru": 1, - "blogspot.se": 1, - "blogspot.sg": 1, - "blogspot.si": 1, - "blogspot.sk": 1, - "blogspot.sn": 1, - "blogspot.td": 1, - "blogspot.tw": 1, - "blogspot.ug": 1, - "blogspot.vn": 1, - "blogsyte.com": 1, - "bloomberg": 1, - "bloxcms.com": 1, - "blue": 1, - "bluebite.io": 1, - "blush.jp": 1, - "bm": 1, - "bmd.br": 1, - "bmoattachments.org": 1, - "bms": 1, - "bmw": 1, - "bn": 1, - "bn.it": 1, - "bnpparibas": 1, - "bnr.la": 1, - "bo": 1, - "bo.it": 1, - "bo.nordland.no": 1, - "bo.telemark.no": 1, - "boats": 1, - "boavista.br": 1, - "bodo.no": 1, - "bodø.no": 1, - "boehringer": 1, - "bofa": 1, - "bokn.no": 1, - "boldlygoingnowhere.org": 1, - "boleslawiec.pl": 1, - "bolivia.bo": 1, - "bologna.it": 1, - "bolt.hu": 1, - "bolzano-altoadige.it": 1, - "bolzano.it": 1, - "bom": 1, - "bomlo.no": 1, - "bona.jp": 1, - "bond": 1, - "boo": 1, - "boo.jp": 1, - "book": 1, - "booking": 1, - "bookonline.app": 1, - "boomla.net": 1, - "bosch": 1, - "bostik": 1, - "boston": 1, - "bot": 1, - "bounceme.net": 1, - "bounty-full.com": 1, - "boutique": 1, - "boutir.com": 1, - "box": 1, - "boxfuse.io": 1, - "boy.jp": 1, - "boyfriend.jp": 1, - "bozen-sudtirol.it": 1, - "bozen-suedtirol.it": 1, - "bozen-südtirol.it": 1, - "bozen.it": 1, - "bplaced.com": 1, - "bplaced.de": 1, - "bplaced.net": 1, - "br": 1, - "br.com": 1, - "br.it": 1, - "bradesco": 1, - "brand.se": 1, - "brasilia.me": 1, - "bremanger.no": 1, - "brescia.it": 1, - "bridgestone": 1, - "brindisi.it": 1, - "broadway": 1, - "broke-it.net": 1, - "broker": 1, - "broker.aero": 1, - "bronnoy.no": 1, - "bronnoysund.no": 1, - "brother": 1, - "browsersafetymark.io": 1, - "brumunddal.no": 1, - "brussels": 1, - "bryansk.su": 1, - "bryne.no": 1, - "brønnøy.no": 1, - "brønnøysund.no": 1, - "bs": 1, - "bs.it": 1, - "bsb.br": 1, - "bss.design": 1, - "bt": 1, - "bt.it": 1, - "bu.no": 1, - "budejju.no": 1, - "build": 1, - "builders": 1, - "builtwithdark.com": 1, - "bukhara.su": 1, - "bulsan-sudtirol.it": 1, - "bulsan-suedtirol.it": 1, - "bulsan-südtirol.it": 1, - "bulsan.it": 1, - "bungoono.oita.jp": 1, - "bungotakada.oita.jp": 1, - "bunkyo.tokyo.jp": 1, - "busan.kr": 1, - "business": 1, - "business.in": 1, - "but.jp": 1, - "buy": 1, - "buyshop.jp": 1, - "buyshouses.net": 1, - "buzen.fukuoka.jp": 1, - "buzz": 1, - "bv": 1, - "bw": 1, - "by": 1, - "bydgoszcz.pl": 1, - "byen.site": 1, - "bygland.no": 1, - "bykle.no": 1, - "bytom.pl": 1, - "bz": 1, - "bz.it": 1, - "bzh": 1, - "báhcavuotna.no": 1, - "báhccavuotna.no": 1, - "báidár.no": 1, - "bájddar.no": 1, - "bálát.no": 1, - "bådåddjå.no": 1, - "båtsfjord.no": 1, - "bærum.no": 1, - "bø.nordland.no": 1, - "bø.telemark.no": 1, - "bømlo.no": 1, - "c.bg": 1, - "c.cdn77.org": 1, - "c.la": 1, - "c.se": 1, - "c66.me": 1, - "ca": 1, - "ca-central-1.elasticbeanstalk.com": 1, - "ca.eu.org": 1, - "ca.in": 1, - "ca.it": 1, - "ca.na": 1, - "ca.reclaim.cloud": 1, - "ca.us": 1, - "caa.aero": 1, - "caa.li": 1, - "cab": 1, - "cable-modem.org": 1, - "cafe": 1, - "cafjs.com": 1, - "cagliari.it": 1, - "cahcesuolo.no": 1, - "cal": 1, - "cal.it": 1, - "calabria.it": 1, - "call": 1, - "caltanissetta.it": 1, - "calvinklein": 1, - "cam": 1, - "cam.it": 1, - "camau.vn": 1, - "camdvr.org": 1, - "camera": 1, - "camp": 1, - "campaign.gov.uk": 1, - "campania.it": 1, - "campidano-medio.it": 1, - "campidanomedio.it": 1, - "campinagrande.br": 1, - "campinas.br": 1, - "campobasso.it": 1, - "candypop.jp": 1, - "canon": 1, - "cantho.vn": 1, - "canva-apps.cn": 1, - "canva-apps.com": 1, - "caobang.vn": 1, - "capetown": 1, - "capital": 1, - "capitalone": 1, - "capoo.jp": 1, - "car": 1, - "caracal.mythic-beasts.com": 1, - "caravan": 1, - "carbonia-iglesias.it": 1, - "carboniaiglesias.it": 1, - "cards": 1, - "care": 1, - "career": 1, - "careers": 1, - "cargo.aero": 1, - "carrara-massa.it": 1, - "carraramassa.it": 1, - "carrd.co": 1, - "cars": 1, - "casa": 1, - "casacam.net": 1, - "case": 1, - "caserta.it": 1, - "cash": 1, - "casino": 1, - "casino.hu": 1, - "cat": 1, - "cat.ax": 1, - "catania.it": 1, - "catanzaro.it": 1, - "catering": 1, - "catering.aero": 1, - "catfood.jp": 1, - "catholic": 1, - "catholic.edu.au": 1, - "caxias.br": 1, - "cb.it": 1, - "cba": 1, - "cbg.ru": 1, - "cbn": 1, - "cbre": 1, - "cbs": 1, - "cc": 1, - "cc.ak.us": 1, - "cc.al.us": 1, - "cc.ar.us": 1, - "cc.as.us": 1, - "cc.az.us": 1, - "cc.ca.us": 1, - "cc.co.us": 1, - "cc.ct.us": 1, - "cc.dc.us": 1, - "cc.de.us": 1, - "cc.fl.us": 1, - "cc.ga.us": 1, - "cc.gu.us": 1, - "cc.hi.us": 1, - "cc.hn": 1, - "cc.ia.us": 1, - "cc.id.us": 1, - "cc.il.us": 1, - "cc.in.us": 1, - "cc.ks.us": 1, - "cc.ky.us": 1, - "cc.la.us": 1, - "cc.ma.us": 1, - "cc.md.us": 1, - "cc.me.us": 1, - "cc.mi.us": 1, - "cc.mn.us": 1, - "cc.mo.us": 1, - "cc.ms.us": 1, - "cc.mt.us": 1, - "cc.na": 1, - "cc.nc.us": 1, - "cc.nd.us": 1, - "cc.ne.us": 1, - "cc.nh.us": 1, - "cc.nj.us": 1, - "cc.nm.us": 1, - "cc.nv.us": 1, - "cc.ny.us": 1, - "cc.oh.us": 1, - "cc.ok.us": 1, - "cc.or.us": 1, - "cc.pa.us": 1, - "cc.pr.us": 1, - "cc.ri.us": 1, - "cc.sc.us": 1, - "cc.sd.us": 1, - "cc.tn.us": 1, - "cc.tx.us": 1, - "cc.ua": 1, - "cc.ut.us": 1, - "cc.va.us": 1, - "cc.vi.us": 1, - "cc.vt.us": 1, - "cc.wa.us": 1, - "cc.wi.us": 1, - "cc.wv.us": 1, - "cc.wy.us": 1, - "cci.fr": 1, - "cd": 1, - "cd.eu.org": 1, - "cdn-edges.net": 1, - "cdn.prod.atlassian-dev.net": 1, - "cdn77-ssl.net": 1, - "ce.gov.br": 1, - "ce.it": 1, - "ce.leg.br": 1, - "cechire.com": 1, - "center": 1, - "centralus.azurestaticapps.net": 1, - "ceo": 1, - "cern": 1, - "certification.aero": 1, - "certmgr.org": 1, - "cesena-forli.it": 1, - "cesena-forlì.it": 1, - "cesenaforli.it": 1, - "cesenaforlì.it": 1, - "cf": 1, - "cf-ipfs.com": 1, - "cfa": 1, - "cfd": 1, - "cg": 1, - "ch": 1, - "ch.eu.org": 1, - "ch.it": 1, - "ch.tc": 1, - "ch.trendhosting.cloud": 1, - "chambagri.fr": 1, - "championship.aero": 1, - "chanel": 1, - "channel": 1, - "channelsdvr.net": 1, - "charity": 1, - "charter.aero": 1, - "chase": 1, - "chat": 1, - "cheap": 1, - "cheap.jp": 1, - "cherkassy.ua": 1, - "cherkasy.ua": 1, - "chernigov.ua": 1, - "chernihiv.ua": 1, - "chernivtsi.ua": 1, - "chernovtsy.ua": 1, - "chiba.jp": 1, - "chicappa.jp": 1, - "chichibu.saitama.jp": 1, - "chieti.it": 1, - "chigasaki.kanagawa.jp": 1, - "chihayaakasaka.osaka.jp": 1, - "chijiwa.nagasaki.jp": 1, - "chikugo.fukuoka.jp": 1, - "chikuho.fukuoka.jp": 1, - "chikuhoku.nagano.jp": 1, - "chikujo.fukuoka.jp": 1, - "chikuma.nagano.jp": 1, - "chikusei.ibaraki.jp": 1, - "chikushino.fukuoka.jp": 1, - "chikuzen.fukuoka.jp": 1, - "chillout.jp": 1, - "chimkent.su": 1, - "chino.nagano.jp": 1, - "chintai": 1, - "chippubetsu.hokkaido.jp": 1, - "chips.jp": 1, - "chirurgiens-dentistes-en-france.fr": 1, - "chirurgiens-dentistes.fr": 1, - "chiryu.aichi.jp": 1, - "chita.aichi.jp": 1, - "chitose.hokkaido.jp": 1, - "chiyoda.gunma.jp": 1, - "chiyoda.tokyo.jp": 1, - "chizu.tottori.jp": 1, - "chofu.tokyo.jp": 1, - "chonan.chiba.jp": 1, - "chosei.chiba.jp": 1, - "choshi.chiba.jp": 1, - "chowder.jp": 1, - "choyo.kumamoto.jp": 1, - "christmas": 1, - "chrome": 1, - "chtr.k12.ma.us": 1, - "chu.jp": 1, - "chungbuk.kr": 1, - "chungnam.kr": 1, - "chuo.chiba.jp": 1, - "chuo.fukuoka.jp": 1, - "chuo.osaka.jp": 1, - "chuo.tokyo.jp": 1, - "chuo.yamanashi.jp": 1, - "church": 1, - "ci": 1, - "ci.it": 1, - "ciao.jp": 1, - "ciencia.bo": 1, - "cieszyn.pl": 1, - "cim.br": 1, - "cipriani": 1, - "circle": 1, - "cisco": 1, - "ciscofreak.com": 1, - "cistron.nl": 1, - "citadel": 1, - "citi": 1, - "citic": 1, - "city": 1, - "city.hu": 1, - "cityeats": 1, - "civilaviation.aero": 1, - "ck.ua": 1, - "cl": 1, - "cl.it": 1, - "claims": 1, - "clan.rip": 1, - "cleaning": 1, - "clerk.app": 1, - "clerkstage.app": 1, - "cleverapps.io": 1, - "click": 1, - "clickrising.net": 1, - "clinic": 1, - "clinique": 1, - "clothing": 1, - "cloud": 1, - "cloud-fr1.unispace.io": 1, - "cloud.fedoraproject.org": 1, - "cloud.goog": 1, - "cloud.interhostsolutions.be": 1, - "cloud.jelastic.open.tim.it": 1, - "cloud.nospamproxy.com": 1, - "cloud66.ws": 1, - "cloud66.zone": 1, - "cloudaccess.host": 1, - "cloudaccess.net": 1, - "cloudapp.net": 1, - "cloudapps.digital": 1, - "cloudcontrolapp.com": 1, - "cloudcontrolled.com": 1, - "cloudflare-ipfs.com": 1, - "cloudfront.net": 1, - "cloudfunctions.net": 1, - "cloudjiffy.net": 1, - "cloudns.asia": 1, - "cloudns.biz": 1, - "cloudns.cc": 1, - "cloudns.club": 1, - "cloudns.eu": 1, - "cloudns.in": 1, - "cloudns.info": 1, - "cloudns.org": 1, - "cloudns.pro": 1, - "cloudns.pw": 1, - "cloudns.us": 1, - "cloudsite.builders": 1, - "cloudycluster.net": 1, - "club": 1, - "club.aero": 1, - "club.tw": 1, - "clubmed": 1, - "cm": 1, - "cn": 1, - "cn-north-1.eb.amazonaws.com.cn": 1, - "cn-northwest-1.eb.amazonaws.com.cn": 1, - "cn.com": 1, - "cn.eu.org": 1, - "cn.in": 1, - "cn.it": 1, - "cn.ua": 1, - "cn.vu": 1, - "cng.br": 1, - "cnpy.gdn": 1, - "cnt.br": 1, - "co": 1, - "co.ae": 1, - "co.ag": 1, - "co.am": 1, - "co.ao": 1, - "co.at": 1, - "co.bb": 1, - "co.bi": 1, - "co.bj": 1, - "co.bn": 1, - "co.business": 1, - "co.bw": 1, - "co.ca": 1, - "co.ci": 1, - "co.cl": 1, - "co.cm": 1, - "co.com": 1, - "co.cr": 1, - "co.cz": 1, - "co.dk": 1, - "co.education": 1, - "co.events": 1, - "co.financial": 1, - "co.gg": 1, - "co.gl": 1, - "co.gy": 1, - "co.hu": 1, - "co.id": 1, - "co.il": 1, - "co.im": 1, - "co.in": 1, - "co.ir": 1, - "co.it": 1, - "co.je": 1, - "co.jp": 1, - "co.ke": 1, - "co.kr": 1, - "co.krd": 1, - "co.lc": 1, - "co.ls": 1, - "co.ma": 1, - "co.me": 1, - "co.mg": 1, - "co.mu": 1, - "co.mw": 1, - "co.mz": 1, - "co.na": 1, - "co.network": 1, - "co.ni": 1, - "co.nl": 1, - "co.no": 1, - "co.nz": 1, - "co.om": 1, - "co.pl": 1, - "co.place": 1, - "co.pn": 1, - "co.pw": 1, - "co.ro": 1, - "co.rs": 1, - "co.rw": 1, - "co.st": 1, - "co.sz": 1, - "co.technology": 1, - "co.th": 1, - "co.tj": 1, - "co.tm": 1, - "co.tt": 1, - "co.tz": 1, - "co.ua": 1, - "co.ug": 1, - "co.uk": 1, - "co.us": 1, - "co.uz": 1, - "co.ve": 1, - "co.vi": 1, - "co.za": 1, - "co.zm": 1, - "co.zw": 1, - "coach": 1, - "cocotte.jp": 1, - "codeberg.page": 1, - "codes": 1, - "codespot.com": 1, - "coffee": 1, - "cog.mi.us": 1, - "col.ng": 1, - "college": 1, - "collegefan.org": 1, - "cologne": 1, - "com": 1, - "com.ac": 1, - "com.af": 1, - "com.ag": 1, - "com.ai": 1, - "com.al": 1, - "com.am": 1, - "com.ar": 1, - "com.au": 1, - "com.aw": 1, - "com.az": 1, - "com.ba": 1, - "com.bb": 1, - "com.bh": 1, - "com.bi": 1, - "com.bj": 1, - "com.bm": 1, - "com.bn": 1, - "com.bo": 1, - "com.br": 1, - "com.bs": 1, - "com.bt": 1, - "com.by": 1, - "com.bz": 1, - "com.ci": 1, - "com.cm": 1, - "com.cn": 1, - "com.co": 1, - "com.cu": 1, - "com.cv": 1, - "com.cw": 1, - "com.cy": 1, - "com.de": 1, - "com.dm": 1, - "com.do": 1, - "com.dz": 1, - "com.ec": 1, - "com.ee": 1, - "com.eg": 1, - "com.es": 1, - "com.et": 1, - "com.fj": 1, - "com.fm": 1, - "com.fr": 1, - "com.ge": 1, - "com.gh": 1, - "com.gi": 1, - "com.gl": 1, - "com.gn": 1, - "com.gp": 1, - "com.gr": 1, - "com.gt": 1, - "com.gu": 1, - "com.gy": 1, - "com.hk": 1, - "com.hn": 1, - "com.hr": 1, - "com.ht": 1, - "com.im": 1, - "com.in": 1, - "com.io": 1, - "com.iq": 1, - "com.is": 1, - "com.jo": 1, - "com.kg": 1, - "com.ki": 1, - "com.km": 1, - "com.kp": 1, - "com.kw": 1, - "com.ky": 1, - "com.kz": 1, - "com.la": 1, - "com.lb": 1, - "com.lc": 1, - "com.lk": 1, - "com.lr": 1, - "com.lv": 1, - "com.ly": 1, - "com.mg": 1, - "com.mk": 1, - "com.ml": 1, - "com.mo": 1, - "com.ms": 1, - "com.mt": 1, - "com.mu": 1, - "com.mv": 1, - "com.mw": 1, - "com.mx": 1, - "com.my": 1, - "com.na": 1, - "com.nf": 1, - "com.ng": 1, - "com.ni": 1, - "com.nr": 1, - "com.om": 1, - "com.pa": 1, - "com.pe": 1, - "com.pf": 1, - "com.ph": 1, - "com.pk": 1, - "com.pl": 1, - "com.pr": 1, - "com.ps": 1, - "com.pt": 1, - "com.py": 1, - "com.qa": 1, - "com.re": 1, - "com.ro": 1, - "com.ru": 1, - "com.sa": 1, - "com.sb": 1, - "com.sc": 1, - "com.sd": 1, - "com.se": 1, - "com.sg": 1, - "com.sh": 1, - "com.sl": 1, - "com.sn": 1, - "com.so": 1, - "com.ss": 1, - "com.st": 1, - "com.sv": 1, - "com.sy": 1, - "com.tj": 1, - "com.tm": 1, - "com.tn": 1, - "com.to": 1, - "com.tr": 1, - "com.tt": 1, - "com.tw": 1, - "com.ua": 1, - "com.ug": 1, - "com.uy": 1, - "com.uz": 1, - "com.vc": 1, - "com.ve": 1, - "com.vi": 1, - "com.vn": 1, - "com.vu": 1, - "com.ws": 1, - "com.ye": 1, - "com.zm": 1, - "comcast": 1, - "commbank": 1, - "commune.am": 1, - "community": 1, - "community-pro.de": 1, - "community-pro.net": 1, - "como.it": 1, - "company": 1, - "compare": 1, - "computer": 1, - "comsec": 1, - "condos": 1, - "conf.au": 1, - "conf.lv": 1, - "conf.se": 1, - "conference.aero": 1, - "conn.uk": 1, - "construction": 1, - "consulado.st": 1, - "consultant.aero": 1, - "consulting": 1, - "consulting.aero": 1, - "contact": 1, - "contagem.br": 1, - "contractors": 1, - "control.aero": 1, - "cooking": 1, - "cool": 1, - "coolblog.jp": 1, - "coop": 1, - "coop.ar": 1, - "coop.br": 1, - "coop.ht": 1, - "coop.in": 1, - "coop.km": 1, - "coop.mv": 1, - "coop.mw": 1, - "coop.py": 1, - "coop.rw": 1, - "coop.tt": 1, - "cooperativa.bo": 1, - "copro.uk": 1, - "corsica": 1, - "cosenza.it": 1, - "couchpotatofries.org": 1, - "council.aero": 1, - "country": 1, - "coupon": 1, - "coupons": 1, - "courses": 1, - "coz.br": 1, - "cpa": 1, - "cpa.pro": 1, - "cq.cn": 1, - "cr": 1, - "cr.it": 1, - "cr.ua": 1, - "crafting.xyz": 1, - "cranky.jp": 1, - "crap.jp": 1, - "crd.co": 1, - "credit": 1, - "creditcard": 1, - "creditunion": 1, - "cremona.it": 1, - "crew.aero": 1, - "cri.br": 1, - "cri.nz": 1, - "cricket": 1, - "crimea.ua": 1, - "crotone.it": 1, - "crown": 1, - "crs": 1, - "cruise": 1, - "cruises": 1, - "cs.in": 1, - "cs.it": 1, - "cs.keliweb.cloud": 1, - "csx.cc": 1, - "ct.it": 1, - "ct.us": 1, - "cu": 1, - "cuiaba.br": 1, - "cuisinella": 1, - "cuneo.it": 1, - "cupcake.is": 1, - "curitiba.br": 1, - "curv.dev": 1, - "cust.dev.thingdust.io": 1, - "cust.disrec.thingdust.io": 1, - "cust.prod.thingdust.io": 1, - "cust.retrosnub.co.uk": 1, - "cust.testing.thingdust.io": 1, - "custom.metacentrum.cz": 1, - "customer.mythic-beasts.com": 1, - "customer.speedpartner.de": 1, - "cutegirl.jp": 1, - "cv": 1, - "cv.ua": 1, - "cw": 1, - "cx": 1, - "cx.ua": 1, - "cy": 1, - "cy.eu.org": 1, - "cya.gg": 1, - "cymru": 1, - "cyon.link": 1, - "cyon.site": 1, - "cyou": 1, - "cz": 1, - "cz.eu.org": 1, - "cz.it": 1, - "czeladz.pl": 1, - "czest.pl": 1, - "d.bg": 1, - "d.gv.vc": 1, - "d.se": 1, - "daa.jp": 1, - "dabur": 1, - "dad": 1, - "daegu.kr": 1, - "daejeon.kr": 1, - "daemon.panel.gg": 1, - "dagestan.ru": 1, - "dagestan.su": 1, - "daigo.ibaraki.jp": 1, - "daisen.akita.jp": 1, - "daito.osaka.jp": 1, - "daiwa.hiroshima.jp": 1, - "daklak.vn": 1, - "daknong.vn": 1, - "damnserver.com": 1, - "danang.vn": 1, - "dance": 1, - "daplie.me": 1, - "data": 1, - "date": 1, - "date.fukushima.jp": 1, - "date.hokkaido.jp": 1, - "dating": 1, - "datsun": 1, - "dattolocal.com": 1, - "dattolocal.net": 1, - "dattorelay.com": 1, - "dattoweb.com": 1, - "davvenjarga.no": 1, - "davvenjárga.no": 1, - "davvesiida.no": 1, - "day": 1, - "daynight.jp": 1, - "dazaifu.fukuoka.jp": 1, - "dc.us": 1, - "dclk": 1, - "dd-dns.de": 1, - "ddns.me": 1, - "ddns.net": 1, - "ddns5.com": 1, - "ddnsfree.com": 1, - "ddnsgeek.com": 1, - "ddnsking.com": 1, - "ddnslive.com": 1, - "ddnss.de": 1, - "ddnss.org": 1, - "dds": 1, - "de": 1, - "de.com": 1, - "de.cool": 1, - "de.eu.org": 1, - "de.gt": 1, - "de.ls": 1, - "de.md": 1, - "de.trendhosting.cloud": 1, - "de.us": 1, - "deal": 1, - "dealer": 1, - "deals": 1, - "deatnu.no": 1, - "debian.net": 1, - "deca.jp": 1, - "deci.jp": 1, - "dedibox.fr": 1, - "dedyn.io": 1, - "def.br": 1, - "definima.io": 1, - "definima.net": 1, - "degree": 1, - "delhi.in": 1, - "delivery": 1, - "dell": 1, - "dell-ogliastra.it": 1, - "dellogliastra.it": 1, - "deloitte": 1, - "delta": 1, - "demo.datacenter.fi": 1, - "demo.datadetect.com": 1, - "demo.jelastic.com": 1, - "democracia.bo": 1, - "democrat": 1, - "demon.nl": 1, - "deno-staging.dev": 1, - "deno.dev": 1, - "dental": 1, - "dentist": 1, - "dep.no": 1, - "deporte.bo": 1, - "des.br": 1, - "desa.id": 1, - "desi": 1, - "design": 1, - "design.aero": 1, - "det.br": 1, - "deta.app": 1, - "deta.dev": 1, - "dev": 1, - "dev-myqnapcloud.com": 1, - "dev.br": 1, - "dev.static.land": 1, - "dev.vu": 1, - "development.run": 1, - "devices.resinstaging.io": 1, - "df.gov.br": 1, - "df.leg.br": 1, - "dgca.aero": 1, - "dh.bytemark.co.uk": 1, - "dhl": 1, - "diadem.cloud": 1, - "diamonds": 1, - "dielddanuorri.no": 1, - "dienbien.vn": 1, - "diet": 1, - "digick.jp": 1, - "digital": 1, - "direct": 1, - "direct.quickconnect.cn": 1, - "direct.quickconnect.to": 1, - "directory": 1, - "discordsays.com": 1, - "discordsez.com": 1, - "discount": 1, - "discourse.group": 1, - "discourse.team": 1, - "discover": 1, - "dish": 1, - "diskstation.eu": 1, - "diskstation.me": 1, - "diskstation.org": 1, - "diskussionsbereich.de": 1, - "ditchyourip.com": 1, - "divtasvuodna.no": 1, - "divttasvuotna.no": 1, - "diy": 1, - "dj": 1, - "dk": 1, - "dk.eu.org": 1, - "dlugoleka.pl": 1, - "dm": 1, - "dn.ua": 1, - "dnepropetrovsk.ua": 1, - "dni.us": 1, - "dnipropetrovsk.ua": 1, - "dnp": 1, - "dnsalias.com": 1, - "dnsalias.net": 1, - "dnsalias.org": 1, - "dnsdojo.com": 1, - "dnsdojo.net": 1, - "dnsdojo.org": 1, - "dnsfor.me": 1, - "dnshome.de": 1, - "dnsiskinky.com": 1, - "dnsking.ch": 1, - "dnsup.net": 1, - "dnsupdate.info": 1, - "dnsupdater.de": 1, - "do": 1, - "docs": 1, - "doctor": 1, - "does-it.net": 1, - "doesntexist.com": 1, - "doesntexist.org": 1, - "dog": 1, - "dojin.com": 1, - "domains": 1, - "donetsk.ua": 1, - "dongnai.vn": 1, - "dongthap.vn": 1, - "donna.no": 1, - "dontexist.com": 1, - "dontexist.net": 1, - "dontexist.org": 1, - "doomdns.com": 1, - "doomdns.org": 1, - "dopaas.com": 1, - "doshi.yamanashi.jp": 1, - "dot": 1, - "dovre.no": 1, - "download": 1, - "dp.ua": 1, - "dr.in": 1, - "dr.na": 1, - "dr.tr": 1, - "drammen.no": 1, - "drangedal.no": 1, - "dray-dns.de": 1, - "drayddns.com": 1, - "draydns.de": 1, - "dreamhosters.com": 1, - "drive": 1, - "drobak.no": 1, - "drr.ac": 1, - "drud.io": 1, - "drud.us": 1, - "drøbak.no": 1, - "dscloud.biz": 1, - "dscloud.me": 1, - "dscloud.mobi": 1, - "dsmynas.com": 1, - "dsmynas.net": 1, - "dsmynas.org": 1, - "dst.mi.us": 1, - "dtv": 1, - "dubai": 1, - "duckdns.org": 1, - "dunlop": 1, - "dupont": 1, - "durban": 1, - "dvag": 1, - "dvr": 1, - "dvrcam.info": 1, - "dvrdns.org": 1, - "dy.fi": 1, - "dyn-berlin.de": 1, - "dyn-ip24.de": 1, - "dyn-o-saur.com": 1, - "dyn-vpn.de": 1, - "dyn.cosidns.de": 1, - "dyn.ddnss.de": 1, - "dyn.home-webserver.de": 1, - "dyn53.io": 1, - "dynalias.com": 1, - "dynalias.net": 1, - "dynalias.org": 1, - "dynamic-dns.info": 1, - "dynamisches-dns.de": 1, - "dynathome.net": 1, - "dyndns-at-home.com": 1, - "dyndns-at-work.com": 1, - "dyndns-blog.com": 1, - "dyndns-free.com": 1, - "dyndns-home.com": 1, - "dyndns-ip.com": 1, - "dyndns-mail.com": 1, - "dyndns-office.com": 1, - "dyndns-pics.com": 1, - "dyndns-remote.com": 1, - "dyndns-server.com": 1, - "dyndns-web.com": 1, - "dyndns-wiki.com": 1, - "dyndns-work.com": 1, - "dyndns.biz": 1, - "dyndns.dappnode.io": 1, - "dyndns.ddnss.de": 1, - "dyndns.info": 1, - "dyndns.org": 1, - "dyndns.tv": 1, - "dyndns.ws": 1, - "dyndns1.de": 1, - "dynns.com": 1, - "dynserv.org": 1, - "dynu.net": 1, - "dynv6.net": 1, - "dynvpn.de": 1, - "dyroy.no": 1, - "dyrøy.no": 1, - "dz": 1, - "dønna.no": 1, - "e.bg": 1, - "e.se": 1, - "e12.ve": 1, - "e164.arpa": 1, - "e4.cz": 1, - "earth": 1, - "east-kazakhstan.su": 1, - "eastasia.azurestaticapps.net": 1, - "eastus2.azurestaticapps.net": 1, - "easypanel.app": 1, - "easypanel.host": 1, - "eat": 1, - "eating-organic.net": 1, - "eaton.mi.us": 1, - "ebetsu.hokkaido.jp": 1, - "ebina.kanagawa.jp": 1, - "ebino.miyazaki.jp": 1, - "ebiz.tw": 1, - "ec": 1, - "echizen.fukui.jp": 1, - "ecn.br": 1, - "eco": 1, - "eco.bj": 1, - "eco.br": 1, - "ecologia.bo": 1, - "ecommerce-shop.pl": 1, - "econo.bj": 1, - "economia.bo": 1, - "ed.ao": 1, - "ed.ci": 1, - "ed.cr": 1, - "ed.jp": 1, - "ed.pw": 1, - "edeka": 1, - "edgeapp.net": 1, - "edgecompute.app": 1, - "edgekey-staging.net": 1, - "edgekey.net": 1, - "edgestack.me": 1, - "edgesuite-staging.net": 1, - "edgesuite.net": 1, - "editorx.io": 1, - "edogawa.tokyo.jp": 1, - "edu": 1, - "edu.ac": 1, - "edu.af": 1, - "edu.al": 1, - "edu.ar": 1, - "edu.au": 1, - "edu.az": 1, - "edu.ba": 1, - "edu.bb": 1, - "edu.bh": 1, - "edu.bi": 1, - "edu.bj": 1, - "edu.bm": 1, - "edu.bn": 1, - "edu.bo": 1, - "edu.br": 1, - "edu.bs": 1, - "edu.bt": 1, - "edu.bz": 1, - "edu.ci": 1, - "edu.cn": 1, - "edu.co": 1, - "edu.cu": 1, - "edu.cv": 1, - "edu.cw": 1, - "edu.dm": 1, - "edu.do": 1, - "edu.dz": 1, - "edu.ec": 1, - "edu.ee": 1, - "edu.eg": 1, - "edu.es": 1, - "edu.et": 1, - "edu.eu.org": 1, - "edu.fm": 1, - "edu.gd": 1, - "edu.ge": 1, - "edu.gh": 1, - "edu.gi": 1, - "edu.gl": 1, - "edu.gn": 1, - "edu.gp": 1, - "edu.gr": 1, - "edu.gt": 1, - "edu.gu": 1, - "edu.gy": 1, - "edu.hk": 1, - "edu.hn": 1, - "edu.ht": 1, - "edu.in": 1, - "edu.iq": 1, - "edu.is": 1, - "edu.it": 1, - "edu.jo": 1, - "edu.kg": 1, - "edu.ki": 1, - "edu.km": 1, - "edu.kn": 1, - "edu.kp": 1, - "edu.krd": 1, - "edu.kw": 1, - "edu.ky": 1, - "edu.kz": 1, - "edu.la": 1, - "edu.lb": 1, - "edu.lc": 1, - "edu.lk": 1, - "edu.lr": 1, - "edu.ls": 1, - "edu.lv": 1, - "edu.ly": 1, - "edu.me": 1, - "edu.mg": 1, - "edu.mk": 1, - "edu.ml": 1, - "edu.mn": 1, - "edu.mo": 1, - "edu.ms": 1, - "edu.mt": 1, - "edu.mv": 1, - "edu.mw": 1, - "edu.mx": 1, - "edu.my": 1, - "edu.mz": 1, - "edu.ng": 1, - "edu.ni": 1, - "edu.nr": 1, - "edu.om": 1, - "edu.pa": 1, - "edu.pe": 1, - "edu.pf": 1, - "edu.ph": 1, - "edu.pk": 1, - "edu.pl": 1, - "edu.pn": 1, - "edu.pr": 1, - "edu.ps": 1, - "edu.pt": 1, - "edu.py": 1, - "edu.qa": 1, - "edu.rs": 1, - "edu.ru": 1, - "edu.sa": 1, - "edu.sb": 1, - "edu.sc": 1, - "edu.scot": 1, - "edu.sd": 1, - "edu.sg": 1, - "edu.sl": 1, - "edu.sn": 1, - "edu.so": 1, - "edu.ss": 1, - "edu.st": 1, - "edu.sv": 1, - "edu.sy": 1, - "edu.tj": 1, - "edu.tm": 1, - "edu.to": 1, - "edu.tr": 1, - "edu.tt": 1, - "edu.tw": 1, - "edu.ua": 1, - "edu.uy": 1, - "edu.vc": 1, - "edu.ve": 1, - "edu.vn": 1, - "edu.vu": 1, - "edu.ws": 1, - "edu.ye": 1, - "edu.za": 1, - "edu.zm": 1, - "education": 1, - "educator.aero": 1, - "edugit.io": 1, - "ee": 1, - "ee.eu.org": 1, - "eek.jp": 1, - "eero-stage.online": 1, - "eero.online": 1, - "eg": 1, - "egersund.no": 1, - "egoism.jp": 1, - "ehime.jp": 1, - "eid.no": 1, - "eidfjord.no": 1, - "eidsberg.no": 1, - "eidskog.no": 1, - "eidsvoll.no": 1, - "eigersund.no": 1, - "eiheiji.fukui.jp": 1, - "ekloges.cy": 1, - "elasticbeanstalk.com": 1, - "elblag.pl": 1, - "elementor.cloud": 1, - "elementor.cool": 1, - "elk.pl": 1, - "elverum.no": 1, - "email": 1, - "emb.kw": 1, - "embaixada.st": 1, - "embetsu.hokkaido.jp": 1, - "emerck": 1, - "emergency.aero": 1, - "emilia-romagna.it": 1, - "emiliaromagna.it": 1, - "emp.br": 1, - "empresa.bo": 1, - "emr.it": 1, - "en-root.fr": 1, - "en.it": 1, - "ena.gifu.jp": 1, - "encoreapi.com": 1, - "encr.app": 1, - "endofinternet.net": 1, - "endofinternet.org": 1, - "endoftheinternet.org": 1, - "enebakk.no": 1, - "energy": 1, - "enf.br": 1, - "eng.br": 1, - "eng.pro": 1, - "engerdal.no": 1, - "engine.aero": 1, - "engineer": 1, - "engineer.aero": 1, - "engineering": 1, - "eniwa.hokkaido.jp": 1, - "enna.it": 1, - "ens.tn": 1, - "enscaled.sg": 1, - "ent.platform.sh": 1, - "enterprisecloud.nu": 1, - "enterprises": 1, - "entertainment.aero": 1, - "epson": 1, - "equipment": 1, - "equipment.aero": 1, - "er.in": 1, - "ericsson": 1, - "erimo.hokkaido.jp": 1, - "erni": 1, - "erotica.hu": 1, - "erotika.hu": 1, - "es": 1, - "es-1.axarnet.cloud": 1, - "es.ax": 1, - "es.eu.org": 1, - "es.gov.br": 1, - "es.kr": 1, - "es.leg.br": 1, - "esan.hokkaido.jp": 1, - "esashi.hokkaido.jp": 1, - "esp.br": 1, - "esq": 1, - "est-a-la-maison.com": 1, - "est-a-la-masion.com": 1, - "est-le-patron.com": 1, - "est-mon-blogueur.com": 1, - "est.pr": 1, - "estate": 1, - "et": 1, - "etajima.hiroshima.jp": 1, - "etc.br": 1, - "eti.br": 1, - "etisalat": 1, - "etne.no": 1, - "etnedal.no": 1, - "eu": 1, - "eu-1.evennode.com": 1, - "eu-2.evennode.com": 1, - "eu-3.evennode.com": 1, - "eu-4.evennode.com": 1, - "eu-central-1.elasticbeanstalk.com": 1, - "eu-west-1.elasticbeanstalk.com": 1, - "eu-west-2.elasticbeanstalk.com": 1, - "eu-west-3.elasticbeanstalk.com": 1, - "eu.ax": 1, - "eu.com": 1, - "eu.encoway.cloud": 1, - "eu.int": 1, - "eu.meteorapp.com": 1, - "eu.ngrok.io": 1, - "eu.org": 1, - "eu.platform.sh": 1, - "eu.pythonanywhere.com": 1, - "eun.eg": 1, - "eurodir.ru": 1, - "eurovision": 1, - "eus": 1, - "evenassi.no": 1, - "evenes.no": 1, - "events": 1, - "evenášši.no": 1, - "evje-og-hornnes.no": 1, - "exchange": 1, - "exchange.aero": 1, - "exnet.su": 1, - "expert": 1, - "experts-comptables.fr": 1, - "exposed": 1, - "express": 1, - "express.aero": 1, - "extraspace": 1, - "ezproxy.kuleuven.be": 1, - "f.bg": 1, - "f.se": 1, - "fage": 1, - "fail": 1, - "fairwinds": 1, - "faith": 1, - "fakefur.jp": 1, - "fam.pk": 1, - "family": 1, - "familyds.com": 1, - "familyds.net": 1, - "familyds.org": 1, - "fan": 1, - "fans": 1, - "fantasyleague.cc": 1, - "far.br": 1, - "farm": 1, - "farmers": 1, - "farsund.no": 1, - "fashion": 1, - "fashionstore.jp": 1, - "fast": 1, - "fastly-edge.com": 1, - "fastly-terrarium.com": 1, - "fastlylb.net": 1, - "faststacks.net": 1, - "fastvps-server.com": 1, - "fastvps.host": 1, - "fastvps.site": 1, - "fauske.no": 1, - "fbx-os.fr": 1, - "fbxos.fr": 1, - "fc.it": 1, - "fe.it": 1, - "fed.us": 1, - "federation.aero": 1, - "fedex": 1, - "fedje.no": 1, - "fedorainfracloud.org": 1, - "fedorapeople.org": 1, - "feedback": 1, - "feira.br": 1, - "fem.jp": 1, - "fentiger.mythic-beasts.com": 1, - "fermo.it": 1, - "ferrara.it": 1, - "ferrari": 1, - "ferrero": 1, - "feste-ip.net": 1, - "fet.no": 1, - "fetsund.no": 1, - "fg.it": 1, - "fh-muenster.io": 1, - "fh.se": 1, - "fhs.no": 1, - "fhsk.se": 1, - "fhv.se": 1, - "fi": 1, - "fi.cloudplatform.fi": 1, - "fi.cr": 1, - "fi.eu.org": 1, - "fi.it": 1, - "fidelity": 1, - "fido": 1, - "fie.ee": 1, - "filegear-au.me": 1, - "filegear-de.me": 1, - "filegear-gb.me": 1, - "filegear-ie.me": 1, - "filegear-jp.me": 1, - "filegear-sg.me": 1, - "filegear.me": 1, - "film": 1, - "film.hu": 1, - "fin.ci": 1, - "fin.ec": 1, - "fin.tn": 1, - "final": 1, - "finance": 1, - "financial": 1, - "finnoy.no": 1, - "finnøy.no": 1, - "fire": 1, - "firebaseapp.com": 1, - "firenze.it": 1, - "firestone": 1, - "firewall-gateway.com": 1, - "firewall-gateway.de": 1, - "firewall-gateway.net": 1, - "firewalledreplit.co": 1, - "fireweb.app": 1, - "firm.co": 1, - "firm.dk": 1, - "firm.ht": 1, - "firm.in": 1, - "firm.nf": 1, - "firm.ng": 1, - "firm.ro": 1, - "firm.ve": 1, - "firmdale": 1, - "fish": 1, - "fishing": 1, - "fit": 1, - "fitjar.no": 1, - "fitness": 1, - "fj": 1, - "fj.cn": 1, - "fjaler.no": 1, - "fjell.no": 1, - "fl.us": 1, - "fla.no": 1, - "flakstad.no": 1, - "flap.id": 1, - "flatanger.no": 1, - "fldrv.com": 1, - "flekkefjord.no": 1, - "flesberg.no": 1, - "flickr": 1, - "flier.jp": 1, - "flight.aero": 1, - "flights": 1, - "flir": 1, - "flog.br": 1, - "flop.jp": 1, - "floppy.jp": 1, - "flora.no": 1, - "florence.it": 1, - "floripa.br": 1, - "florist": 1, - "floro.no": 1, - "florø.no": 1, - "flowers": 1, - "flt.cloud.muni.cz": 1, - "fly": 1, - "fly.dev": 1, - "flynnhosting.net": 1, - "flå.no": 1, - "fm": 1, - "fm.br": 1, - "fm.it": 1, - "fm.no": 1, - "fnc.fr-par.scw.cloud": 1, - "fnd.br": 1, - "fnwk.site": 1, - "fo": 1, - "foggia.it": 1, - "folionetwork.site": 1, - "folkebibl.no": 1, - "folldal.no": 1, - "foo": 1, - "food": 1, - "fool.jp": 1, - "football": 1, - "for-better.biz": 1, - "for-more.biz": 1, - "for-our.info": 1, - "for-some.biz": 1, - "for-the.biz": 1, - "ford": 1, - "forde.no": 1, - "forex": 1, - "forgeblocks.com": 1, - "forgot.her.name": 1, - "forgot.his.name": 1, - "forli-cesena.it": 1, - "forlicesena.it": 1, - "forlì-cesena.it": 1, - "forlìcesena.it": 1, - "forsale": 1, - "forsand.no": 1, - "fortal.br": 1, - "forte.id": 1, - "forum": 1, - "forum.hu": 1, - "forumz.info": 1, - "fosnes.no": 1, - "fot.br": 1, - "foundation": 1, - "fox": 1, - "foz.br": 1, - "fr": 1, - "fr-1.paas.massivegrid.net": 1, - "fr-par-1.baremetal.scw.cloud": 1, - "fr-par-2.baremetal.scw.cloud": 1, - "fr.eu.org": 1, - "fr.it": 1, - "fra1-de.cloudjiffy.net": 1, - "framer.app": 1, - "framer.media": 1, - "framer.photos": 1, - "framer.website": 1, - "framer.wiki": 1, - "framercanvas.com": 1, - "frana.no": 1, - "fredrikstad.no": 1, - "free": 1, - "free.hr": 1, - "freebox-os.com": 1, - "freebox-os.fr": 1, - "freeboxos.com": 1, - "freeboxos.fr": 1, - "freeddns.org": 1, - "freeddns.us": 1, - "freedesktop.org": 1, - "freemyip.com": 1, - "freesite.host": 1, - "freetls.fastly.net": 1, - "frei.no": 1, - "frenchkiss.jp": 1, - "fresenius": 1, - "friuli-v-giulia.it": 1, - "friuli-ve-giulia.it": 1, - "friuli-vegiulia.it": 1, - "friuli-venezia-giulia.it": 1, - "friuli-veneziagiulia.it": 1, - "friuli-vgiulia.it": 1, - "friuliv-giulia.it": 1, - "friulive-giulia.it": 1, - "friulivegiulia.it": 1, - "friulivenezia-giulia.it": 1, - "friuliveneziagiulia.it": 1, - "friulivgiulia.it": 1, - "frl": 1, - "frogans": 1, - "frogn.no": 1, - "froland.no": 1, - "from-ak.com": 1, - "from-al.com": 1, - "from-ar.com": 1, - "from-az.net": 1, - "from-ca.com": 1, - "from-co.net": 1, - "from-ct.com": 1, - "from-dc.com": 1, - "from-de.com": 1, - "from-fl.com": 1, - "from-ga.com": 1, - "from-hi.com": 1, - "from-ia.com": 1, - "from-id.com": 1, - "from-il.com": 1, - "from-in.com": 1, - "from-ks.com": 1, - "from-ky.com": 1, - "from-la.net": 1, - "from-ma.com": 1, - "from-md.com": 1, - "from-me.org": 1, - "from-mi.com": 1, - "from-mn.com": 1, - "from-mo.com": 1, - "from-ms.com": 1, - "from-mt.com": 1, - "from-nc.com": 1, - "from-nd.com": 1, - "from-ne.com": 1, - "from-nh.com": 1, - "from-nj.com": 1, - "from-nm.com": 1, - "from-nv.com": 1, - "from-ny.net": 1, - "from-oh.com": 1, - "from-ok.com": 1, - "from-or.com": 1, - "from-pa.com": 1, - "from-pr.com": 1, - "from-ri.com": 1, - "from-sc.com": 1, - "from-sd.com": 1, - "from-tn.com": 1, - "from-tx.com": 1, - "from-ut.com": 1, - "from-va.com": 1, - "from-vt.com": 1, - "from-wa.com": 1, - "from-wi.com": 1, - "from-wv.com": 1, - "from-wy.com": 1, - "from.hr": 1, - "from.tv": 1, - "frontdoor": 1, - "frontier": 1, - "frosinone.it": 1, - "frosta.no": 1, - "froya.no": 1, - "fræna.no": 1, - "frøya.no": 1, - "fst.br": 1, - "ftpaccess.cc": 1, - "ftr": 1, - "fuchu.hiroshima.jp": 1, - "fuchu.tokyo.jp": 1, - "fuchu.toyama.jp": 1, - "fudai.iwate.jp": 1, - "fuefuki.yamanashi.jp": 1, - "fuel.aero": 1, - "fuettertdasnetz.de": 1, - "fuji.shizuoka.jp": 1, - "fujieda.shizuoka.jp": 1, - "fujiidera.osaka.jp": 1, - "fujikawa.shizuoka.jp": 1, - "fujikawa.yamanashi.jp": 1, - "fujikawaguchiko.yamanashi.jp": 1, - "fujimi.nagano.jp": 1, - "fujimi.saitama.jp": 1, - "fujimino.saitama.jp": 1, - "fujinomiya.shizuoka.jp": 1, - "fujioka.gunma.jp": 1, - "fujisato.akita.jp": 1, - "fujisawa.iwate.jp": 1, - "fujisawa.kanagawa.jp": 1, - "fujishiro.ibaraki.jp": 1, - "fujitsu": 1, - "fujiyoshida.yamanashi.jp": 1, - "fukagawa.hokkaido.jp": 1, - "fukaya.saitama.jp": 1, - "fukuchi.fukuoka.jp": 1, - "fukuchiyama.kyoto.jp": 1, - "fukudomi.saga.jp": 1, - "fukui.fukui.jp": 1, - "fukui.jp": 1, - "fukumitsu.toyama.jp": 1, - "fukuoka.jp": 1, - "fukuroi.shizuoka.jp": 1, - "fukusaki.hyogo.jp": 1, - "fukushima.fukushima.jp": 1, - "fukushima.hokkaido.jp": 1, - "fukushima.jp": 1, - "fukuyama.hiroshima.jp": 1, - "fun": 1, - "funabashi.chiba.jp": 1, - "funagata.yamagata.jp": 1, - "funahashi.toyama.jp": 1, - "functions.fnc.fr-par.scw.cloud": 1, - "fund": 1, - "fuoisku.no": 1, - "fuossko.no": 1, - "furano.hokkaido.jp": 1, - "furniture": 1, - "furubira.hokkaido.jp": 1, - "furudono.fukushima.jp": 1, - "furukawa.miyagi.jp": 1, - "fusa.no": 1, - "fuso.aichi.jp": 1, - "fussa.tokyo.jp": 1, - "futaba.fukushima.jp": 1, - "futbol": 1, - "futsu.nagasaki.jp": 1, - "futtsu.chiba.jp": 1, - "futurehosting.at": 1, - "futuremailing.at": 1, - "fvg.it": 1, - "fyi": 1, - "fylkesbibl.no": 1, - "fyresdal.no": 1, - "førde.no": 1, - "g.bg": 1, - "g.se": 1, - "g.vbrplsbx.io": 1, - "g12.br": 1, - "ga": 1, - "ga.us": 1, - "gaivuotna.no": 1, - "gal": 1, - "gallery": 1, - "gallo": 1, - "gallup": 1, - "galsa.no": 1, - "gamagori.aichi.jp": 1, - "game": 1, - "game-host.org": 1, - "game-server.cc": 1, - "game.tw": 1, - "games": 1, - "games.hu": 1, - "gamo.shiga.jp": 1, - "gamvik.no": 1, - "gangaviika.no": 1, - "gangwon.kr": 1, - "gap": 1, - "garden": 1, - "gaular.no": 1, - "gausdal.no": 1, - "gay": 1, - "gb": 1, - "gb.net": 1, - "gbiz": 1, - "gc.ca": 1, - "gd": 1, - "gd.cn": 1, - "gda.pl": 1, - "gdansk.pl": 1, - "gdn": 1, - "gdynia.pl": 1, - "ge": 1, - "ge.it": 1, - "gea": 1, - "geek.nz": 1, - "geekgalaxy.com": 1, - "gehirn.ne.jp": 1, - "geisei.kochi.jp": 1, - "gen.in": 1, - "gen.mi.us": 1, - "gen.ng": 1, - "gen.nz": 1, - "gen.tr": 1, - "genkai.saga.jp": 1, - "genoa.it": 1, - "genova.it": 1, - "gent": 1, - "gentapps.com": 1, - "genting": 1, - "gentlentapis.com": 1, - "geo.br": 1, - "geometre-expert.fr": 1, - "george": 1, - "georgia.su": 1, - "getmyip.com": 1, - "gets-it.net": 1, - "gf": 1, - "gg": 1, - "gg.ax": 1, - "ggee": 1, - "ggf.br": 1, - "gh": 1, - "ghost.io": 1, - "gi": 1, - "gialai.vn": 1, - "giehtavuoatna.no": 1, - "gift": 1, - "gifts": 1, - "gifu.gifu.jp": 1, - "gifu.jp": 1, - "giize.com": 1, - "gildeskal.no": 1, - "gildeskål.no": 1, - "ginan.gifu.jp": 1, - "ginowan.okinawa.jp": 1, - "ginoza.okinawa.jp": 1, - "girlfriend.jp": 1, - "girly.jp": 1, - "giske.no": 1, - "git-pages.rit.edu": 1, - "git-repos.de": 1, - "gitapp.si": 1, - "github.io": 1, - "githubpreview.dev": 1, - "githubusercontent.com": 1, - "gitlab.io": 1, - "gitpage.si": 1, - "gives": 1, - "giving": 1, - "gjemnes.no": 1, - "gjerdrum.no": 1, - "gjerstad.no": 1, - "gjesdal.no": 1, - "gjovik.no": 1, - "gjøvik.no": 1, - "gl": 1, - "glass": 1, - "gle": 1, - "gleeze.com": 1, - "gliding.aero": 1, - "glitch.me": 1, - "gliwice.pl": 1, - "global": 1, - "global.prod.fastly.net": 1, - "global.ssl.fastly.net": 1, - "globo": 1, - "glogow.pl": 1, - "gloomy.jp": 1, - "gloppen.no": 1, - "glug.org.uk": 1, - "gm": 1, - "gmail": 1, - "gmbh": 1, - "gmina.pl": 1, - "gmo": 1, - "gmx": 1, - "gn": 1, - "gniezno.pl": 1, - "go.ci": 1, - "go.cr": 1, - "go.dyndns.org": 1, - "go.gov.br": 1, - "go.id": 1, - "go.it": 1, - "go.jp": 1, - "go.ke": 1, - "go.kr": 1, - "go.leg.br": 1, - "go.pw": 1, - "go.th": 1, - "go.tj": 1, - "go.tz": 1, - "go.ug": 1, - "gob.ar": 1, - "gob.bo": 1, - "gob.cl": 1, - "gob.do": 1, - "gob.ec": 1, - "gob.es": 1, - "gob.gt": 1, - "gob.hn": 1, - "gob.mx": 1, - "gob.ni": 1, - "gob.pa": 1, - "gob.pe": 1, - "gob.pk": 1, - "gob.sv": 1, - "gob.ve": 1, - "gobo.wakayama.jp": 1, - "godaddy": 1, - "godo.gifu.jp": 1, - "goiania.br": 1, - "goip.de": 1, - "gojome.akita.jp": 1, - "gok.pk": 1, - "gokase.miyazaki.jp": 1, - "gol.no": 1, - "gold": 1, - "goldpoint": 1, - "golf": 1, - "golffan.us": 1, - "gon.pk": 1, - "gonna.jp": 1, - "gonohe.aomori.jp": 1, - "goo": 1, - "goodyear": 1, - "goog": 1, - "google": 1, - "googleapis.com": 1, - "googlecode.com": 1, - "gop": 1, - "gop.pk": 1, - "gorizia.it": 1, - "gorlice.pl": 1, - "gos.pk": 1, - "gose.nara.jp": 1, - "gosen.niigata.jp": 1, - "goshiki.hyogo.jp": 1, - "got": 1, - "gotdns.ch": 1, - "gotdns.com": 1, - "gotdns.org": 1, - "gotemba.shizuoka.jp": 1, - "goto.nagasaki.jp": 1, - "gotpantheon.com": 1, - "gotsu.shimane.jp": 1, - "goupile.fr": 1, - "gouv.ci": 1, - "gouv.fr": 1, - "gouv.ht": 1, - "gouv.km": 1, - "gouv.ml": 1, - "gouv.sn": 1, - "gov": 1, - "gov.ac": 1, - "gov.ae": 1, - "gov.af": 1, - "gov.al": 1, - "gov.ar": 1, - "gov.as": 1, - "gov.au": 1, - "gov.az": 1, - "gov.ba": 1, - "gov.bb": 1, - "gov.bf": 1, - "gov.bh": 1, - "gov.bm": 1, - "gov.bn": 1, - "gov.br": 1, - "gov.bs": 1, - "gov.bt": 1, - "gov.by": 1, - "gov.bz": 1, - "gov.cd": 1, - "gov.cl": 1, - "gov.cm": 1, - "gov.cn": 1, - "gov.co": 1, - "gov.cu": 1, - "gov.cx": 1, - "gov.cy": 1, - "gov.dm": 1, - "gov.do": 1, - "gov.dz": 1, - "gov.ec": 1, - "gov.ee": 1, - "gov.eg": 1, - "gov.et": 1, - "gov.fj": 1, - "gov.gd": 1, - "gov.ge": 1, - "gov.gh": 1, - "gov.gi": 1, - "gov.gn": 1, - "gov.gr": 1, - "gov.gu": 1, - "gov.gy": 1, - "gov.hk": 1, - "gov.ie": 1, - "gov.il": 1, - "gov.in": 1, - "gov.iq": 1, - "gov.ir": 1, - "gov.is": 1, - "gov.it": 1, - "gov.jo": 1, - "gov.kg": 1, - "gov.ki": 1, - "gov.km": 1, - "gov.kn": 1, - "gov.kp": 1, - "gov.kw": 1, - "gov.kz": 1, - "gov.la": 1, - "gov.lb": 1, - "gov.lc": 1, - "gov.lk": 1, - "gov.lr": 1, - "gov.ls": 1, - "gov.lt": 1, - "gov.lv": 1, - "gov.ly": 1, - "gov.ma": 1, - "gov.me": 1, - "gov.mg": 1, - "gov.mk": 1, - "gov.ml": 1, - "gov.mn": 1, - "gov.mo": 1, - "gov.mr": 1, - "gov.ms": 1, - "gov.mu": 1, - "gov.mv": 1, - "gov.mw": 1, - "gov.my": 1, - "gov.mz": 1, - "gov.nc.tr": 1, - "gov.ng": 1, - "gov.nl": 1, - "gov.nr": 1, - "gov.om": 1, - "gov.ph": 1, - "gov.pk": 1, - "gov.pl": 1, - "gov.pn": 1, - "gov.pr": 1, - "gov.ps": 1, - "gov.pt": 1, - "gov.py": 1, - "gov.qa": 1, - "gov.rs": 1, - "gov.ru": 1, - "gov.rw": 1, - "gov.sa": 1, - "gov.sb": 1, - "gov.sc": 1, - "gov.scot": 1, - "gov.sd": 1, - "gov.sg": 1, - "gov.sh": 1, - "gov.sl": 1, - "gov.so": 1, - "gov.ss": 1, - "gov.sx": 1, - "gov.sy": 1, - "gov.tj": 1, - "gov.tl": 1, - "gov.tm": 1, - "gov.tn": 1, - "gov.to": 1, - "gov.tr": 1, - "gov.tt": 1, - "gov.tw": 1, - "gov.ua": 1, - "gov.uk": 1, - "gov.vc": 1, - "gov.ve": 1, - "gov.vn": 1, - "gov.ws": 1, - "gov.ye": 1, - "gov.za": 1, - "gov.zm": 1, - "gov.zw": 1, - "government.aero": 1, - "govt.nz": 1, - "gp": 1, - "gq": 1, - "gr": 1, - "gr.com": 1, - "gr.eu.org": 1, - "gr.it": 1, - "gr.jp": 1, - "grainger": 1, - "grajewo.pl": 1, - "gran.no": 1, - "grane.no": 1, - "granvin.no": 1, - "graphics": 1, - "graphox.us": 1, - "gratangen.no": 1, - "gratis": 1, - "greater.jp": 1, - "green": 1, - "greta.fr": 1, - "grimstad.no": 1, - "gripe": 1, - "griw.gov.pl": 1, - "grocery": 1, - "groks-the.info": 1, - "groks-this.info": 1, - "grondar.za": 1, - "grong.no": 1, - "grosseto.it": 1, - "groundhandling.aero": 1, - "group": 1, - "group.aero": 1, - "grozny.ru": 1, - "grozny.su": 1, - "grp.lk": 1, - "gru.br": 1, - "grue.no": 1, - "gs": 1, - "gs.aa.no": 1, - "gs.ah.no": 1, - "gs.bu.no": 1, - "gs.cn": 1, - "gs.fm.no": 1, - "gs.hl.no": 1, - "gs.hm.no": 1, - "gs.jan-mayen.no": 1, - "gs.mr.no": 1, - "gs.nl.no": 1, - "gs.nt.no": 1, - "gs.of.no": 1, - "gs.ol.no": 1, - "gs.oslo.no": 1, - "gs.rl.no": 1, - "gs.sf.no": 1, - "gs.st.no": 1, - "gs.svalbard.no": 1, - "gs.tm.no": 1, - "gs.tr.no": 1, - "gs.va.no": 1, - "gs.vf.no": 1, - "gsj.bz": 1, - "gsm.pl": 1, - "gt": 1, - "gu": 1, - "gu.us": 1, - "guam.gu": 1, - "guardian": 1, - "gub.uy": 1, - "gucci": 1, - "guge": 1, - "guide": 1, - "guitars": 1, - "gujarat.in": 1, - "gujo.gifu.jp": 1, - "gulen.no": 1, - "gunma.jp": 1, - "guovdageaidnu.no": 1, - "guru": 1, - "gushikami.okinawa.jp": 1, - "gv.ao": 1, - "gv.at": 1, - "gv.vc": 1, - "gw": 1, - "gwangju.kr": 1, - "gx.cn": 1, - "gy": 1, - "gyeongbuk.kr": 1, - "gyeonggi.kr": 1, - "gyeongnam.kr": 1, - "gyokuto.kumamoto.jp": 1, - "gz.cn": 1, - "gáivuotna.no": 1, - "gálsá.no": 1, - "gáŋgaviika.no": 1, - "günstigbestellen.de": 1, - "günstigliefern.de": 1, - "h.bg": 1, - "h.se": 1, - "ha.cn": 1, - "ha.no": 1, - "habikino.osaka.jp": 1, - "habmer.no": 1, - "haboro.hokkaido.jp": 1, - "hacca.jp": 1, - "hachijo.tokyo.jp": 1, - "hachinohe.aomori.jp": 1, - "hachioji.tokyo.jp": 1, - "hachirogata.akita.jp": 1, - "hadano.kanagawa.jp": 1, - "hadsel.no": 1, - "haebaru.okinawa.jp": 1, - "haga.tochigi.jp": 1, - "hagebostad.no": 1, - "hagi.yamaguchi.jp": 1, - "hagiang.vn": 1, - "haibara.shizuoka.jp": 1, - "haiduong.vn": 1, - "haiphong.vn": 1, - "hair": 1, - "hakata.fukuoka.jp": 1, - "hakodate.hokkaido.jp": 1, - "hakone.kanagawa.jp": 1, - "hakuba.nagano.jp": 1, - "hakui.ishikawa.jp": 1, - "hakusan.ishikawa.jp": 1, - "halden.no": 1, - "half.host": 1, - "halfmoon.jp": 1, - "halsa.no": 1, - "ham-radio-op.net": 1, - "hamada.shimane.jp": 1, - "hamamatsu.shizuoka.jp": 1, - "hamar.no": 1, - "hamaroy.no": 1, - "hamatama.saga.jp": 1, - "hamatonbetsu.hokkaido.jp": 1, - "hamburg": 1, - "hammarfeasta.no": 1, - "hammerfest.no": 1, - "hamura.tokyo.jp": 1, - "hanam.vn": 1, - "hanamaki.iwate.jp": 1, - "hanamigawa.chiba.jp": 1, - "hanawa.fukushima.jp": 1, - "handa.aichi.jp": 1, - "handcrafted.jp": 1, - "hanggliding.aero": 1, - "hangout": 1, - "hannan.osaka.jp": 1, - "hanno.saitama.jp": 1, - "hanoi.vn": 1, - "hanyu.saitama.jp": 1, - "hapmir.no": 1, - "happou.akita.jp": 1, - "hara.nagano.jp": 1, - "haram.no": 1, - "hareid.no": 1, - "harima.hyogo.jp": 1, - "harstad.no": 1, - "hasama.oita.jp": 1, - "hasami.nagasaki.jp": 1, - "hashbang.sh": 1, - "hashikami.aomori.jp": 1, - "hashima.gifu.jp": 1, - "hashimoto.wakayama.jp": 1, - "hasuda.saitama.jp": 1, - "hasura-app.io": 1, - "hasura.app": 1, - "hasvik.no": 1, - "hatinh.vn": 1, - "hatogaya.saitama.jp": 1, - "hatoyama.saitama.jp": 1, - "hatsukaichi.hiroshima.jp": 1, - "hattfjelldal.no": 1, - "haugesund.no": 1, - "haugiang.vn": 1, - "haus": 1, - "hayakawa.yamanashi.jp": 1, - "hayashima.okayama.jp": 1, - "hazu.aichi.jp": 1, - "hb.cldmail.ru": 1, - "hb.cn": 1, - "hbo": 1, - "hdfc": 1, - "hdfcbank": 1, - "he.cn": 1, - "health": 1, - "health-carereform.com": 1, - "health.nz": 1, - "health.vn": 1, - "healthcare": 1, - "heavy.jp": 1, - "heguri.nara.jp": 1, - "hekinan.aichi.jp": 1, - "help": 1, - "helsinki": 1, - "hemne.no": 1, - "hemnes.no": 1, - "hemsedal.no": 1, - "hepforge.org": 1, - "her.jp": 1, - "herad.no": 1, - "here": 1, - "here-for-more.info": 1, - "hermes": 1, - "herokuapp.com": 1, - "herokussl.com": 1, - "heroy.more-og-romsdal.no": 1, - "heroy.nordland.no": 1, - "herøy.møre-og-romsdal.no": 1, - "herøy.nordland.no": 1, - "heteml.net": 1, - "hi.cn": 1, - "hi.us": 1, - "hicam.net": 1, - "hichiso.gifu.jp": 1, - "hida.gifu.jp": 1, - "hidaka.hokkaido.jp": 1, - "hidaka.kochi.jp": 1, - "hidaka.saitama.jp": 1, - "hidaka.wakayama.jp": 1, - "higashi.fukuoka.jp": 1, - "higashi.fukushima.jp": 1, - "higashi.okinawa.jp": 1, - "higashiagatsuma.gunma.jp": 1, - "higashichichibu.saitama.jp": 1, - "higashihiroshima.hiroshima.jp": 1, - "higashiizu.shizuoka.jp": 1, - "higashiizumo.shimane.jp": 1, - "higashikagawa.kagawa.jp": 1, - "higashikagura.hokkaido.jp": 1, - "higashikawa.hokkaido.jp": 1, - "higashikurume.tokyo.jp": 1, - "higashimatsushima.miyagi.jp": 1, - "higashimatsuyama.saitama.jp": 1, - "higashimurayama.tokyo.jp": 1, - "higashinaruse.akita.jp": 1, - "higashine.yamagata.jp": 1, - "higashiomi.shiga.jp": 1, - "higashiosaka.osaka.jp": 1, - "higashishirakawa.gifu.jp": 1, - "higashisumiyoshi.osaka.jp": 1, - "higashitsuno.kochi.jp": 1, - "higashiura.aichi.jp": 1, - "higashiyama.kyoto.jp": 1, - "higashiyamato.tokyo.jp": 1, - "higashiyodogawa.osaka.jp": 1, - "higashiyoshino.nara.jp": 1, - "hiho.jp": 1, - "hiji.oita.jp": 1, - "hikari.yamaguchi.jp": 1, - "hikawa.shimane.jp": 1, - "hikimi.shimane.jp": 1, - "hikone.shiga.jp": 1, - "himeji.hyogo.jp": 1, - "himeshima.oita.jp": 1, - "himi.toyama.jp": 1, - "hino.tokyo.jp": 1, - "hino.tottori.jp": 1, - "hinode.tokyo.jp": 1, - "hinohara.tokyo.jp": 1, - "hioki.kagoshima.jp": 1, - "hiphop": 1, - "hippy.jp": 1, - "hirado.nagasaki.jp": 1, - "hiraizumi.iwate.jp": 1, - "hirakata.osaka.jp": 1, - "hiranai.aomori.jp": 1, - "hirara.okinawa.jp": 1, - "hirata.fukushima.jp": 1, - "hiratsuka.kanagawa.jp": 1, - "hiraya.nagano.jp": 1, - "hirogawa.wakayama.jp": 1, - "hirokawa.fukuoka.jp": 1, - "hirono.fukushima.jp": 1, - "hirono.iwate.jp": 1, - "hiroo.hokkaido.jp": 1, - "hirosaki.aomori.jp": 1, - "hiroshima.jp": 1, - "hisamitsu": 1, - "hisayama.fukuoka.jp": 1, - "hita.oita.jp": 1, - "hitachi": 1, - "hitachi.ibaraki.jp": 1, - "hitachinaka.ibaraki.jp": 1, - "hitachiomiya.ibaraki.jp": 1, - "hitachiota.ibaraki.jp": 1, - "hitra.no": 1, - "hiv": 1, - "hizen.saga.jp": 1, - "hjartdal.no": 1, - "hjelmeland.no": 1, - "hk": 1, - "hk.cn": 1, - "hk.com": 1, - "hk.org": 1, - "hkt": 1, - "hl.cn": 1, - "hl.no": 1, - "hlx.live": 1, - "hlx.page": 1, - "hlx3.page": 1, - "hm": 1, - "hm.no": 1, - "hn": 1, - "hn.cn": 1, - "hoabinh.vn": 1, - "hobby-site.com": 1, - "hobby-site.org": 1, - "hobol.no": 1, - "hobøl.no": 1, - "hockey": 1, - "hof.no": 1, - "hofu.yamaguchi.jp": 1, - "hokkaido.jp": 1, - "hokksund.no": 1, - "hokuryu.hokkaido.jp": 1, - "hokuto.hokkaido.jp": 1, - "hokuto.yamanashi.jp": 1, - "hol.no": 1, - "holdings": 1, - "hole.no": 1, - "holiday": 1, - "holmestrand.no": 1, - "holtalen.no": 1, - "holtålen.no": 1, - "holy.jp": 1, - "home-webserver.de": 1, - "home.dyndns.org": 1, - "homebuilt.aero": 1, - "homedepot": 1, - "homedns.org": 1, - "homeftp.net": 1, - "homeftp.org": 1, - "homegoods": 1, - "homeip.net": 1, - "homelink.one": 1, - "homelinux.com": 1, - "homelinux.net": 1, - "homelinux.org": 1, - "homeoffice.gov.uk": 1, - "homes": 1, - "homesecuritymac.com": 1, - "homesecuritypc.com": 1, - "homesense": 1, - "homesklep.pl": 1, - "homeunix.com": 1, - "homeunix.net": 1, - "homeunix.org": 1, - "honai.ehime.jp": 1, - "honbetsu.hokkaido.jp": 1, - "honda": 1, - "honefoss.no": 1, - "hongo.hiroshima.jp": 1, - "honjo.akita.jp": 1, - "honjo.saitama.jp": 1, - "honjyo.akita.jp": 1, - "hoplix.shop": 1, - "hopto.me": 1, - "hopto.org": 1, - "hornindal.no": 1, - "horokanai.hokkaido.jp": 1, - "horonobe.hokkaido.jp": 1, - "horse": 1, - "horten.no": 1, - "hosp.uk": 1, - "hospital": 1, - "host": 1, - "hostedpi.com": 1, - "hosting": 1, - "hosting-cluster.nl": 1, - "hostyhosting.io": 1, - "hot": 1, - "hotel.hu": 1, - "hotel.lk": 1, - "hotel.tz": 1, - "hotels": 1, - "hotelwithflight.com": 1, - "hotmail": 1, - "house": 1, - "how": 1, - "hoyanger.no": 1, - "hoylandet.no": 1, - "hr": 1, - "hr.eu.org": 1, - "hra.health": 1, - "hs.kr": 1, - "hs.run": 1, - "hs.zone": 1, - "hsbc": 1, - "ht": 1, - "httpbin.org": 1, - "hu": 1, - "hu.com": 1, - "hu.eu.org": 1, - "hu.net": 1, - "hughes": 1, - "huissier-justice.fr": 1, - "hungry.jp": 1, - "hungyen.vn": 1, - "hurdal.no": 1, - "hurum.no": 1, - "hvaler.no": 1, - "hyatt": 1, - "hyllestad.no": 1, - "hyogo.jp": 1, - "hyuga.miyazaki.jp": 1, - "hyundai": 1, - "hzc.io": 1, - "hábmer.no": 1, - "hámmárfeasta.no": 1, - "hápmir.no": 1, - "häkkinen.fi": 1, - "hå.no": 1, - "hægebostad.no": 1, - "hønefoss.no": 1, - "høyanger.no": 1, - "høylandet.no": 1, - "i.bg": 1, - "i.ng": 1, - "i.ph": 1, - "i.se": 1, - "i234.me": 1, - "ia.us": 1, - "iamallama.com": 1, - "ibara.okayama.jp": 1, - "ibaraki.ibaraki.jp": 1, - "ibaraki.jp": 1, - "ibaraki.osaka.jp": 1, - "ibestad.no": 1, - "ibigawa.gifu.jp": 1, - "ibm": 1, - "ibxos.it": 1, - "ic.gov.pl": 1, - "icbc": 1, - "ice": 1, - "ichiba.tokushima.jp": 1, - "ichihara.chiba.jp": 1, - "ichikai.tochigi.jp": 1, - "ichikawa.chiba.jp": 1, - "ichikawa.hyogo.jp": 1, - "ichikawamisato.yamanashi.jp": 1, - "ichinohe.iwate.jp": 1, - "ichinomiya.aichi.jp": 1, - "ichinomiya.chiba.jp": 1, - "ichinoseki.iwate.jp": 1, - "icu": 1, - "icurus.jp": 1, - "id": 1, - "id.au": 1, - "id.firewalledreplit.co": 1, - "id.forgerock.io": 1, - "id.ir": 1, - "id.lv": 1, - "id.ly": 1, - "id.repl.co": 1, - "id.us": 1, - "id.vn": 1, - "ide.kyoto.jp": 1, - "idf.il": 1, - "idrett.no": 1, - "idv.hk": 1, - "idv.tw": 1, - "ie": 1, - "ie.eu.org": 1, - "ie.ua": 1, - "ieee": 1, - "if.ua": 1, - "ifm": 1, - "iglesias-carbonia.it": 1, - "iglesiascarbonia.it": 1, - "iheya.okinawa.jp": 1, - "iida.nagano.jp": 1, - "iide.yamagata.jp": 1, - "iijima.nagano.jp": 1, - "iitate.fukushima.jp": 1, - "iiyama.nagano.jp": 1, - "iizuka.fukuoka.jp": 1, - "iizuna.nagano.jp": 1, - "ikano": 1, - "ikaruga.nara.jp": 1, - "ikata.ehime.jp": 1, - "ikawa.akita.jp": 1, - "ikeda.fukui.jp": 1, - "ikeda.gifu.jp": 1, - "ikeda.hokkaido.jp": 1, - "ikeda.nagano.jp": 1, - "ikeda.osaka.jp": 1, - "iki.fi": 1, - "iki.nagasaki.jp": 1, - "ikoma.nara.jp": 1, - "ikusaka.nagano.jp": 1, - "il": 1, - "il.eu.org": 1, - "il.us": 1, - "ilawa.pl": 1, - "iliadboxos.it": 1, - "ilovecollege.info": 1, - "im": 1, - "im.it": 1, - "imabari.ehime.jp": 1, - "imakane.hokkaido.jp": 1, - "imamat": 1, - "imari.saga.jp": 1, - "imb.br": 1, - "imdb": 1, - "imizu.toyama.jp": 1, - "immo": 1, - "immobilien": 1, - "imperia.it": 1, - "impertrix.com": 1, - "impertrixcdn.com": 1, - "in": 1, - "in-addr.arpa": 1, - "in-berlin.de": 1, - "in-brb.de": 1, - "in-butter.de": 1, - "in-dsl.de": 1, - "in-dsl.net": 1, - "in-dsl.org": 1, - "in-the-band.net": 1, - "in-vpn.de": 1, - "in-vpn.net": 1, - "in-vpn.org": 1, - "in.eu.org": 1, - "in.na": 1, - "in.net": 1, - "in.ngrok.io": 1, - "in.ni": 1, - "in.rs": 1, - "in.th": 1, - "in.ua": 1, - "in.us": 1, - "ina.ibaraki.jp": 1, - "ina.nagano.jp": 1, - "ina.saitama.jp": 1, - "inabe.mie.jp": 1, - "inagawa.hyogo.jp": 1, - "inagi.tokyo.jp": 1, - "inami.toyama.jp": 1, - "inami.wakayama.jp": 1, - "inashiki.ibaraki.jp": 1, - "inatsuki.fukuoka.jp": 1, - "inawashiro.fukushima.jp": 1, - "inazawa.aichi.jp": 1, - "inc": 1, - "inc.hk": 1, - "incheon.kr": 1, - "ind.br": 1, - "ind.gt": 1, - "ind.in": 1, - "ind.kw": 1, - "ind.tn": 1, - "independent-commission.uk": 1, - "independent-inquest.uk": 1, - "independent-inquiry.uk": 1, - "independent-panel.uk": 1, - "independent-review.uk": 1, - "inderoy.no": 1, - "inderøy.no": 1, - "indie.porn": 1, - "indigena.bo": 1, - "industria.bo": 1, - "industries": 1, - "ine.kyoto.jp": 1, - "inf.br": 1, - "inf.cu": 1, - "inf.mk": 1, - "inf.ua": 1, - "infiniti": 1, - "info": 1, - "info.at": 1, - "info.au": 1, - "info.az": 1, - "info.bb": 1, - "info.bj": 1, - "info.bo": 1, - "info.co": 1, - "info.cx": 1, - "info.ec": 1, - "info.et": 1, - "info.fj": 1, - "info.gu": 1, - "info.ht": 1, - "info.hu": 1, - "info.in": 1, - "info.ke": 1, - "info.ki": 1, - "info.la": 1, - "info.ls": 1, - "info.mv": 1, - "info.na": 1, - "info.nf": 1, - "info.ni": 1, - "info.nr": 1, - "info.pk": 1, - "info.pl": 1, - "info.pr": 1, - "info.ro": 1, - "info.sd": 1, - "info.tn": 1, - "info.tr": 1, - "info.tt": 1, - "info.tz": 1, - "info.ve": 1, - "info.vn": 1, - "info.zm": 1, - "ing": 1, - "ing.pa": 1, - "ingatlan.hu": 1, - "ink": 1, - "ino.kochi.jp": 1, - "instance.datadetect.com": 1, - "instances.spawn.cc": 1, - "instantcloud.cn": 1, - "institute": 1, - "insurance": 1, - "insurance.aero": 1, - "insure": 1, - "int": 1, - "int.ar": 1, - "int.az": 1, - "int.bo": 1, - "int.ci": 1, - "int.co": 1, - "int.cv": 1, - "int.eu.org": 1, - "int.in": 1, - "int.is": 1, - "int.la": 1, - "int.lk": 1, - "int.mv": 1, - "int.mw": 1, - "int.ni": 1, - "int.pt": 1, - "int.ru": 1, - "int.tj": 1, - "int.tt": 1, - "int.ve": 1, - "int.vn": 1, - "international": 1, - "internet-dns.de": 1, - "internet.in": 1, - "intl.tn": 1, - "intuit": 1, - "inuyama.aichi.jp": 1, - "investments": 1, - "inzai.chiba.jp": 1, - "io": 1, - "io.in": 1, - "io.kg": 1, - "io.vn": 1, - "iobb.net": 1, - "iopsys.se": 1, - "ip.linodeusercontent.com": 1, - "ip6.arpa": 1, - "ipifony.net": 1, - "ipiranga": 1, - "iq": 1, - "ir": 1, - "iris.arpa": 1, - "irish": 1, - "iruma.saitama.jp": 1, - "is": 1, - "is-a-anarchist.com": 1, - "is-a-blogger.com": 1, - "is-a-bookkeeper.com": 1, - "is-a-bruinsfan.org": 1, - "is-a-bulls-fan.com": 1, - "is-a-candidate.org": 1, - "is-a-caterer.com": 1, - "is-a-celticsfan.org": 1, - "is-a-chef.com": 1, - "is-a-chef.net": 1, - "is-a-chef.org": 1, - "is-a-conservative.com": 1, - "is-a-cpa.com": 1, - "is-a-cubicle-slave.com": 1, - "is-a-democrat.com": 1, - "is-a-designer.com": 1, - "is-a-doctor.com": 1, - "is-a-financialadvisor.com": 1, - "is-a-geek.com": 1, - "is-a-geek.net": 1, - "is-a-geek.org": 1, - "is-a-green.com": 1, - "is-a-guru.com": 1, - "is-a-hard-worker.com": 1, - "is-a-hunter.com": 1, - "is-a-knight.org": 1, - "is-a-landscaper.com": 1, - "is-a-lawyer.com": 1, - "is-a-liberal.com": 1, - "is-a-libertarian.com": 1, - "is-a-linux-user.org": 1, - "is-a-llama.com": 1, - "is-a-musician.com": 1, - "is-a-nascarfan.com": 1, - "is-a-nurse.com": 1, - "is-a-painter.com": 1, - "is-a-patsfan.org": 1, - "is-a-personaltrainer.com": 1, - "is-a-photographer.com": 1, - "is-a-player.com": 1, - "is-a-republican.com": 1, - "is-a-rockstar.com": 1, - "is-a-socialist.com": 1, - "is-a-soxfan.org": 1, - "is-a-student.com": 1, - "is-a-teacher.com": 1, - "is-a-techie.com": 1, - "is-a-therapist.com": 1, - "is-an-accountant.com": 1, - "is-an-actor.com": 1, - "is-an-actress.com": 1, - "is-an-anarchist.com": 1, - "is-an-artist.com": 1, - "is-an-engineer.com": 1, - "is-an-entertainer.com": 1, - "is-by.us": 1, - "is-certified.com": 1, - "is-found.org": 1, - "is-gone.com": 1, - "is-into-anime.com": 1, - "is-into-cars.com": 1, - "is-into-cartoons.com": 1, - "is-into-games.com": 1, - "is-leet.com": 1, - "is-lost.org": 1, - "is-not-certified.com": 1, - "is-saved.org": 1, - "is-slick.com": 1, - "is-uberleet.com": 1, - "is-very-bad.org": 1, - "is-very-evil.org": 1, - "is-very-good.org": 1, - "is-very-nice.org": 1, - "is-very-sweet.org": 1, - "is-with-theband.com": 1, - "is.eu.org": 1, - "is.gov.pl": 1, - "is.it": 1, - "isa-geek.com": 1, - "isa-geek.net": 1, - "isa-geek.org": 1, - "isa-hockeynut.com": 1, - "isa.kagoshima.jp": 1, - "isa.us": 1, - "isahaya.nagasaki.jp": 1, - "ise.mie.jp": 1, - "isehara.kanagawa.jp": 1, - "isen.kagoshima.jp": 1, - "isernia.it": 1, - "iserv.dev": 1, - "iservschule.de": 1, - "isesaki.gunma.jp": 1, - "ishigaki.okinawa.jp": 1, - "ishikari.hokkaido.jp": 1, - "ishikawa.fukushima.jp": 1, - "ishikawa.jp": 1, - "ishikawa.okinawa.jp": 1, - "ishinomaki.miyagi.jp": 1, - "isla.pr": 1, - "ismaili": 1, - "isshiki.aichi.jp": 1, - "issmarterthanyou.com": 1, - "ist": 1, - "istanbul": 1, - "isteingeek.de": 1, - "istmein.de": 1, - "isumi.chiba.jp": 1, - "it": 1, - "it.ao": 1, - "it.com": 1, - "it.eu.org": 1, - "it1.eur.aruba.jenv-aruba.cloud": 1, - "it1.jenv-aruba.cloud": 1, - "itabashi.tokyo.jp": 1, - "itako.ibaraki.jp": 1, - "itakura.gunma.jp": 1, - "itami.hyogo.jp": 1, - "itano.tokushima.jp": 1, - "itau": 1, - "itayanagi.aomori.jp": 1, - "itcouldbewor.se": 1, - "itigo.jp": 1, - "ito.shizuoka.jp": 1, - "itoigawa.niigata.jp": 1, - "itoman.okinawa.jp": 1, - "its.me": 1, - "itv": 1, - "ivano-frankivsk.ua": 1, - "ivanovo.su": 1, - "iveland.no": 1, - "ivgu.no": 1, - "ivory.ne.jp": 1, - "iwade.wakayama.jp": 1, - "iwafune.tochigi.jp": 1, - "iwaizumi.iwate.jp": 1, - "iwaki.fukushima.jp": 1, - "iwakuni.yamaguchi.jp": 1, - "iwakura.aichi.jp": 1, - "iwama.ibaraki.jp": 1, - "iwamizawa.hokkaido.jp": 1, - "iwanai.hokkaido.jp": 1, - "iwanuma.miyagi.jp": 1, - "iwata.shizuoka.jp": 1, - "iwate.iwate.jp": 1, - "iwate.jp": 1, - "iwatsuki.saitama.jp": 1, - "iwi.nz": 1, - "iyo.ehime.jp": 1, - "iz.hr": 1, - "izena.okinawa.jp": 1, - "izu.shizuoka.jp": 1, - "izumi.kagoshima.jp": 1, - "izumi.osaka.jp": 1, - "izumiotsu.osaka.jp": 1, - "izumisano.osaka.jp": 1, - "izumizaki.fukushima.jp": 1, - "izumo.shimane.jp": 1, - "izumozaki.niigata.jp": 1, - "izunokuni.shizuoka.jp": 1, - "j.bg": 1, - "j.layershift.co.uk": 1, - "j.scaleforce.com.cy": 1, - "j.scaleforce.net": 1, - "jab.br": 1, - "jaguar": 1, - "jambyl.su": 1, - "jampa.br": 1, - "jan-mayen.no": 1, - "java": 1, - "jaworzno.pl": 1, - "jc.neen.it": 1, - "jcb": 1, - "jcloud-ver-jpc.ik-server.com": 1, - "jcloud.ik-server.com": 1, - "jcloud.kz": 1, - "jdevcloud.com": 1, - "jdf.br": 1, - "je": 1, - "jed.wafaicloud.com": 1, - "jeep": 1, - "jeez.jp": 1, - "jeju.kr": 1, - "jelastic.dogado.eu": 1, - "jelastic.regruhosting.ru": 1, - "jelastic.saveincloud.net": 1, - "jelastic.team": 1, - "jelastic.tsukaeru.net": 1, - "jele.cloud": 1, - "jele.club": 1, - "jele.host": 1, - "jele.io": 1, - "jele.site": 1, - "jelenia-gora.pl": 1, - "jellybean.jp": 1, - "jeonbuk.kr": 1, - "jeonnam.kr": 1, - "jessheim.no": 1, - "jetzt": 1, - "jevnaker.no": 1, - "jewelry": 1, - "jgora.pl": 1, - "jinsekikogen.hiroshima.jp": 1, - "jio": 1, - "jl.cn": 1, - "jll": 1, - "jls-sto1.elastx.net": 1, - "jls-sto2.elastx.net": 1, - "jls-sto3.elastx.net": 1, - "jmp": 1, - "jnj": 1, - "jo": 1, - "joboji.iwate.jp": 1, - "jobs": 1, - "jobs.tt": 1, - "joburg": 1, - "joetsu.niigata.jp": 1, - "jogasz.hu": 1, - "johana.toyama.jp": 1, - "joinville.br": 1, - "jolster.no": 1, - "jondal.no": 1, - "jor.br": 1, - "jorpeland.no": 1, - "joso.ibaraki.jp": 1, - "jot": 1, - "jotelulu.cloud": 1, - "journal.aero": 1, - "journalist.aero": 1, - "joy": 1, - "joyo.kyoto.jp": 1, - "jozi.biz": 1, - "jp": 1, - "jp.eu.org": 1, - "jp.kg": 1, - "jp.md": 1, - "jp.net": 1, - "jp.ngrok.io": 1, - "jpmorgan": 1, - "jpn.com": 1, - "jpn.org": 1, - "jprs": 1, - "js.cn": 1, - "js.org": 1, - "js.wpenginepowered.com": 1, - "ju.mp": 1, - "juegos": 1, - "juniper": 1, - "jur.pro": 1, - "jus.br": 1, - "jx.cn": 1, - "jølster.no": 1, - "jørpeland.no": 1, - "k.bg": 1, - "k.se": 1, - "k12.ak.us": 1, - "k12.al.us": 1, - "k12.ar.us": 1, - "k12.as.us": 1, - "k12.az.us": 1, - "k12.ca.us": 1, - "k12.co.us": 1, - "k12.ct.us": 1, - "k12.dc.us": 1, - "k12.de.us": 1, - "k12.ec": 1, - "k12.fl.us": 1, - "k12.ga.us": 1, - "k12.gu.us": 1, - "k12.ia.us": 1, - "k12.id.us": 1, - "k12.il": 1, - "k12.il.us": 1, - "k12.in.us": 1, - "k12.ks.us": 1, - "k12.ky.us": 1, - "k12.la.us": 1, - "k12.ma.us": 1, - "k12.md.us": 1, - "k12.me.us": 1, - "k12.mi.us": 1, - "k12.mn.us": 1, - "k12.mo.us": 1, - "k12.ms.us": 1, - "k12.mt.us": 1, - "k12.nc.us": 1, - "k12.ne.us": 1, - "k12.nh.us": 1, - "k12.nj.us": 1, - "k12.nm.us": 1, - "k12.nv.us": 1, - "k12.ny.us": 1, - "k12.oh.us": 1, - "k12.ok.us": 1, - "k12.or.us": 1, - "k12.pa.us": 1, - "k12.pr.us": 1, - "k12.sc.us": 1, - "k12.tn.us": 1, - "k12.tr": 1, - "k12.tx.us": 1, - "k12.ut.us": 1, - "k12.va.us": 1, - "k12.vi": 1, - "k12.vi.us": 1, - "k12.vt.us": 1, - "k12.wa.us": 1, - "k12.wi.us": 1, - "k12.wy.us": 1, - "k8s.fr-par.scw.cloud": 1, - "k8s.nl-ams.scw.cloud": 1, - "k8s.pl-waw.scw.cloud": 1, - "k8s.scw.cloud": 1, - "kaas.gg": 1, - "kadena.okinawa.jp": 1, - "kadogawa.miyazaki.jp": 1, - "kadoma.osaka.jp": 1, - "kafjord.no": 1, - "kaga.ishikawa.jp": 1, - "kagami.kochi.jp": 1, - "kagamiishi.fukushima.jp": 1, - "kagamino.okayama.jp": 1, - "kagawa.jp": 1, - "kagoshima.jp": 1, - "kagoshima.kagoshima.jp": 1, - "kaho.fukuoka.jp": 1, - "kahoku.ishikawa.jp": 1, - "kahoku.yamagata.jp": 1, - "kai.yamanashi.jp": 1, - "kainan.tokushima.jp": 1, - "kainan.wakayama.jp": 1, - "kaisei.kanagawa.jp": 1, - "kaita.hiroshima.jp": 1, - "kaizuka.osaka.jp": 1, - "kakamigahara.gifu.jp": 1, - "kakegawa.shizuoka.jp": 1, - "kakinoki.shimane.jp": 1, - "kakogawa.hyogo.jp": 1, - "kakuda.miyagi.jp": 1, - "kalisz.pl": 1, - "kalmykia.ru": 1, - "kalmykia.su": 1, - "kaluga.su": 1, - "kamagaya.chiba.jp": 1, - "kamaishi.iwate.jp": 1, - "kamakura.kanagawa.jp": 1, - "kameoka.kyoto.jp": 1, - "kameyama.mie.jp": 1, - "kami.kochi.jp": 1, - "kami.miyagi.jp": 1, - "kamiamakusa.kumamoto.jp": 1, - "kamifurano.hokkaido.jp": 1, - "kamigori.hyogo.jp": 1, - "kamiichi.toyama.jp": 1, - "kamiizumi.saitama.jp": 1, - "kamijima.ehime.jp": 1, - "kamikawa.hokkaido.jp": 1, - "kamikawa.hyogo.jp": 1, - "kamikawa.saitama.jp": 1, - "kamikitayama.nara.jp": 1, - "kamikoani.akita.jp": 1, - "kamimine.saga.jp": 1, - "kaminokawa.tochigi.jp": 1, - "kaminoyama.yamagata.jp": 1, - "kamioka.akita.jp": 1, - "kamisato.saitama.jp": 1, - "kamishihoro.hokkaido.jp": 1, - "kamisu.ibaraki.jp": 1, - "kamisunagawa.hokkaido.jp": 1, - "kamitonda.wakayama.jp": 1, - "kamitsue.oita.jp": 1, - "kamo.kyoto.jp": 1, - "kamo.niigata.jp": 1, - "kamoenai.hokkaido.jp": 1, - "kamogawa.chiba.jp": 1, - "kanagawa.jp": 1, - "kanan.osaka.jp": 1, - "kanazawa.ishikawa.jp": 1, - "kanegasaki.iwate.jp": 1, - "kaneyama.fukushima.jp": 1, - "kaneyama.yamagata.jp": 1, - "kani.gifu.jp": 1, - "kanie.aichi.jp": 1, - "kanmaki.nara.jp": 1, - "kanna.gunma.jp": 1, - "kannami.shizuoka.jp": 1, - "kanonji.kagawa.jp": 1, - "kanoya.kagoshima.jp": 1, - "kanra.gunma.jp": 1, - "kanuma.tochigi.jp": 1, - "kanzaki.saga.jp": 1, - "kapsi.fi": 1, - "karacol.su": 1, - "karaganda.su": 1, - "karasjohka.no": 1, - "karasjok.no": 1, - "karasuyama.tochigi.jp": 1, - "karatsu.saga.jp": 1, - "karelia.su": 1, - "kariwa.niigata.jp": 1, - "kariya.aichi.jp": 1, - "karlsoy.no": 1, - "karmoy.no": 1, - "karmøy.no": 1, - "karpacz.pl": 1, - "kartuzy.pl": 1, - "karuizawa.nagano.jp": 1, - "karumai.iwate.jp": 1, - "kasahara.gifu.jp": 1, - "kasai.hyogo.jp": 1, - "kasama.ibaraki.jp": 1, - "kasamatsu.gifu.jp": 1, - "kasaoka.okayama.jp": 1, - "kashiba.nara.jp": 1, - "kashihara.nara.jp": 1, - "kashima.ibaraki.jp": 1, - "kashima.saga.jp": 1, - "kashiwa.chiba.jp": 1, - "kashiwara.osaka.jp": 1, - "kashiwazaki.niigata.jp": 1, - "kasserver.com": 1, - "kasuga.fukuoka.jp": 1, - "kasuga.hyogo.jp": 1, - "kasugai.aichi.jp": 1, - "kasukabe.saitama.jp": 1, - "kasumigaura.ibaraki.jp": 1, - "kasuya.fukuoka.jp": 1, - "kaszuby.pl": 1, - "katagami.akita.jp": 1, - "katano.osaka.jp": 1, - "katashina.gunma.jp": 1, - "katori.chiba.jp": 1, - "katowice.pl": 1, - "katsuragi.nara.jp": 1, - "katsuragi.wakayama.jp": 1, - "katsushika.tokyo.jp": 1, - "katsuura.chiba.jp": 1, - "katsuyama.fukui.jp": 1, - "kaufen": 1, - "kautokeino.no": 1, - "kawaba.gunma.jp": 1, - "kawachinagano.osaka.jp": 1, - "kawagoe.mie.jp": 1, - "kawagoe.saitama.jp": 1, - "kawaguchi.saitama.jp": 1, - "kawahara.tottori.jp": 1, - "kawai.iwate.jp": 1, - "kawai.nara.jp": 1, - "kawaiishop.jp": 1, - "kawajima.saitama.jp": 1, - "kawakami.nagano.jp": 1, - "kawakami.nara.jp": 1, - "kawakita.ishikawa.jp": 1, - "kawamata.fukushima.jp": 1, - "kawaminami.miyazaki.jp": 1, - "kawanabe.kagoshima.jp": 1, - "kawanehon.shizuoka.jp": 1, - "kawanishi.hyogo.jp": 1, - "kawanishi.nara.jp": 1, - "kawanishi.yamagata.jp": 1, - "kawara.fukuoka.jp": 1, - "kawasaki.miyagi.jp": 1, - "kawatana.nagasaki.jp": 1, - "kawaue.gifu.jp": 1, - "kawazu.shizuoka.jp": 1, - "kayabe.hokkaido.jp": 1, - "kazimierz-dolny.pl": 1, - "kazo.saitama.jp": 1, - "kazuno.akita.jp": 1, - "kddi": 1, - "ke": 1, - "keisen.fukuoka.jp": 1, - "keliweb.cloud": 1, - "kembuchi.hokkaido.jp": 1, - "kep.tr": 1, - "kepno.pl": 1, - "kerryhotels": 1, - "kerrylogistics": 1, - "kerryproperties": 1, - "ketrzyn.pl": 1, - "keymachine.de": 1, - "kfh": 1, - "kg": 1, - "kg.kr": 1, - "kh.ua": 1, - "khakassia.su": 1, - "khanhhoa.vn": 1, - "kharkiv.ua": 1, - "kharkov.ua": 1, - "kherson.ua": 1, - "khmelnitskiy.ua": 1, - "khmelnytskyi.ua": 1, - "khplay.nl": 1, - "ki": 1, - "kia": 1, - "kibichuo.okayama.jp": 1, - "kicks-ass.net": 1, - "kicks-ass.org": 1, - "kids": 1, - "kids.us": 1, - "kiengiang.vn": 1, - "kiev.ua": 1, - "kiho.mie.jp": 1, - "kihoku.ehime.jp": 1, - "kijo.miyazaki.jp": 1, - "kikirara.jp": 1, - "kikonai.hokkaido.jp": 1, - "kikuchi.kumamoto.jp": 1, - "kikugawa.shizuoka.jp": 1, - "kilatiron.com": 1, - "kill.jp": 1, - "kilo.jp": 1, - "kim": 1, - "kimino.wakayama.jp": 1, - "kimitsu.chiba.jp": 1, - "kimobetsu.hokkaido.jp": 1, - "kin.okinawa.jp": 1, - "kinder": 1, - "kindle": 1, - "kinghost.net": 1, - "kinko.kagoshima.jp": 1, - "kinokawa.wakayama.jp": 1, - "kira.aichi.jp": 1, - "kirara.st": 1, - "kirkenes.no": 1, - "kirovograd.ua": 1, - "kiryu.gunma.jp": 1, - "kisarazu.chiba.jp": 1, - "kishiwada.osaka.jp": 1, - "kiso.nagano.jp": 1, - "kisofukushima.nagano.jp": 1, - "kisosaki.mie.jp": 1, - "kita.kyoto.jp": 1, - "kita.osaka.jp": 1, - "kita.tokyo.jp": 1, - "kitaaiki.nagano.jp": 1, - "kitaakita.akita.jp": 1, - "kitadaito.okinawa.jp": 1, - "kitagata.gifu.jp": 1, - "kitagata.saga.jp": 1, - "kitagawa.kochi.jp": 1, - "kitagawa.miyazaki.jp": 1, - "kitahata.saga.jp": 1, - "kitahiroshima.hokkaido.jp": 1, - "kitakami.iwate.jp": 1, - "kitakata.fukushima.jp": 1, - "kitakata.miyazaki.jp": 1, - "kitami.hokkaido.jp": 1, - "kitamoto.saitama.jp": 1, - "kitanakagusuku.okinawa.jp": 1, - "kitashiobara.fukushima.jp": 1, - "kitaura.miyazaki.jp": 1, - "kitayama.wakayama.jp": 1, - "kitchen": 1, - "kiwa.mie.jp": 1, - "kiwi": 1, - "kiwi.nz": 1, - "kiyama.saga.jp": 1, - "kiyokawa.kanagawa.jp": 1, - "kiyosato.hokkaido.jp": 1, - "kiyose.tokyo.jp": 1, - "kiyosu.aichi.jp": 1, - "kizu.kyoto.jp": 1, - "klabu.no": 1, - "klepp.no": 1, - "klodzko.pl": 1, - "klæbu.no": 1, - "km": 1, - "km.ua": 1, - "kmpsp.gov.pl": 1, - "kn": 1, - "knightpoint.systems": 1, - "knowsitall.info": 1, - "knx-server.net": 1, - "kobayashi.miyazaki.jp": 1, - "kobierzyce.pl": 1, - "kochi.jp": 1, - "kochi.kochi.jp": 1, - "kodaira.tokyo.jp": 1, - "koeln": 1, - "kofu.yamanashi.jp": 1, - "koga.fukuoka.jp": 1, - "koga.ibaraki.jp": 1, - "koganei.tokyo.jp": 1, - "koge.tottori.jp": 1, - "koka.shiga.jp": 1, - "kokonoe.oita.jp": 1, - "kokubunji.tokyo.jp": 1, - "kolobrzeg.pl": 1, - "komae.tokyo.jp": 1, - "komagane.nagano.jp": 1, - "komaki.aichi.jp": 1, - "komatsu": 1, - "komatsu.ishikawa.jp": 1, - "komatsushima.tokushima.jp": 1, - "komforb.se": 1, - "kommunalforbund.se": 1, - "kommune.no": 1, - "komono.mie.jp": 1, - "komoro.nagano.jp": 1, - "komvux.se": 1, - "konan.aichi.jp": 1, - "konan.shiga.jp": 1, - "kongsberg.no": 1, - "kongsvinger.no": 1, - "konin.pl": 1, - "konskowola.pl": 1, - "konsulat.gov.pl": 1, - "kontum.vn": 1, - "konyvelo.hu": 1, - "koobin.events": 1, - "koori.fukushima.jp": 1, - "kopervik.no": 1, - "koriyama.fukushima.jp": 1, - "koryo.nara.jp": 1, - "kosai.shizuoka.jp": 1, - "kosaka.akita.jp": 1, - "kosei.shiga.jp": 1, - "kosher": 1, - "koshigaya.saitama.jp": 1, - "koshimizu.hokkaido.jp": 1, - "koshu.yamanashi.jp": 1, - "kosuge.yamanashi.jp": 1, - "kota.aichi.jp": 1, - "koto.shiga.jp": 1, - "koto.tokyo.jp": 1, - "kotohira.kagawa.jp": 1, - "kotoura.tottori.jp": 1, - "kouhoku.saga.jp": 1, - "kounosu.saitama.jp": 1, - "kouyama.kagoshima.jp": 1, - "kouzushima.tokyo.jp": 1, - "koya.wakayama.jp": 1, - "koza.wakayama.jp": 1, - "kozagawa.wakayama.jp": 1, - "kozaki.chiba.jp": 1, - "kozow.com": 1, - "kp": 1, - "kpmg": 1, - "kpn": 1, - "kppsp.gov.pl": 1, - "kr": 1, - "kr.com": 1, - "kr.eu.org": 1, - "kr.it": 1, - "kr.ua": 1, - "kraanghke.no": 1, - "kragero.no": 1, - "kragerø.no": 1, - "krakow.pl": 1, - "krasnik.pl": 1, - "krasnodar.su": 1, - "krd": 1, - "kred": 1, - "krellian.net": 1, - "kristiansand.no": 1, - "kristiansund.no": 1, - "krodsherad.no": 1, - "krokstadelva.no": 1, - "kropyvnytskyi.ua": 1, - "krym.ua": 1, - "kråanghke.no": 1, - "krødsherad.no": 1, - "ks.ua": 1, - "ks.us": 1, - "ktistory.com": 1, - "kuchinotsu.nagasaki.jp": 1, - "kudamatsu.yamaguchi.jp": 1, - "kudoyama.wakayama.jp": 1, - "kui.hiroshima.jp": 1, - "kuji.iwate.jp": 1, - "kuju.oita.jp": 1, - "kujukuri.chiba.jp": 1, - "kuki.saitama.jp": 1, - "kuleuven.cloud": 1, - "kumagaya.saitama.jp": 1, - "kumakogen.ehime.jp": 1, - "kumamoto.jp": 1, - "kumamoto.kumamoto.jp": 1, - "kumano.hiroshima.jp": 1, - "kumano.mie.jp": 1, - "kumatori.osaka.jp": 1, - "kumejima.okinawa.jp": 1, - "kumenan.okayama.jp": 1, - "kumiyama.kyoto.jp": 1, - "kunigami.okinawa.jp": 1, - "kunimi.fukushima.jp": 1, - "kunisaki.oita.jp": 1, - "kunitachi.tokyo.jp": 1, - "kunitomi.miyazaki.jp": 1, - "kunneppu.hokkaido.jp": 1, - "kunohe.iwate.jp": 1, - "kuokgroup": 1, - "kurashiki.okayama.jp": 1, - "kurate.fukuoka.jp": 1, - "kure.hiroshima.jp": 1, - "kurgan.su": 1, - "kuriyama.hokkaido.jp": 1, - "kurobe.toyama.jp": 1, - "kurogi.fukuoka.jp": 1, - "kuroishi.aomori.jp": 1, - "kuroiso.tochigi.jp": 1, - "kuromatsunai.hokkaido.jp": 1, - "kuron.jp": 1, - "kurotaki.nara.jp": 1, - "kurume.fukuoka.jp": 1, - "kusatsu.gunma.jp": 1, - "kusatsu.shiga.jp": 1, - "kushima.miyazaki.jp": 1, - "kushimoto.wakayama.jp": 1, - "kushiro.hokkaido.jp": 1, - "kustanai.ru": 1, - "kustanai.su": 1, - "kusu.oita.jp": 1, - "kutchan.hokkaido.jp": 1, - "kutno.pl": 1, - "kuwana.mie.jp": 1, - "kuzumaki.iwate.jp": 1, - "kv.ua": 1, - "kvafjord.no": 1, - "kvalsund.no": 1, - "kvam.no": 1, - "kvanangen.no": 1, - "kvinesdal.no": 1, - "kvinnherad.no": 1, - "kviteseid.no": 1, - "kvitsoy.no": 1, - "kvitsøy.no": 1, - "kvæfjord.no": 1, - "kvænangen.no": 1, - "kw": 1, - "kwp.gov.pl": 1, - "kwpsp.gov.pl": 1, - "ky": 1, - "ky.us": 1, - "kyiv.ua": 1, - "kyonan.chiba.jp": 1, - "kyotamba.kyoto.jp": 1, - "kyotanabe.kyoto.jp": 1, - "kyotango.kyoto.jp": 1, - "kyoto": 1, - "kyoto.jp": 1, - "kyowa.akita.jp": 1, - "kyowa.hokkaido.jp": 1, - "kyuragi.saga.jp": 1, - "kz": 1, - "kárášjohka.no": 1, - "kåfjord.no": 1, - "l-o-g-i-n.de": 1, - "l.bg": 1, - "l.se": 1, - "la": 1, - "la-spezia.it": 1, - "la.us": 1, - "laakesvuemie.no": 1, - "lab.ms": 1, - "lacaixa": 1, - "ladesk.com": 1, - "lahppi.no": 1, - "laichau.vn": 1, - "lakas.hu": 1, - "lamborghini": 1, - "lamdong.vn": 1, - "lamer": 1, - "lanbib.se": 1, - "lancaster": 1, - "land": 1, - "land-4-sale.us": 1, - "landrover": 1, - "langevag.no": 1, - "langevåg.no": 1, - "langson.vn": 1, - "lanxess": 1, - "laocai.vn": 1, - "lapy.pl": 1, - "laquila.it": 1, - "lardal.no": 1, - "larvik.no": 1, - "lasalle": 1, - "laspezia.it": 1, - "lat": 1, - "latina.it": 1, - "latino": 1, - "latrobe": 1, - "lavagis.no": 1, - "lavangen.no": 1, - "law": 1, - "law.pro": 1, - "law.za": 1, - "lawyer": 1, - "laz.it": 1, - "lazio.it": 1, - "lb": 1, - "lc": 1, - "lc.it": 1, - "lcube-server.de": 1, - "lds": 1, - "le.it": 1, - "leadpages.co": 1, - "leangaviika.no": 1, - "lease": 1, - "leasing.aero": 1, - "leaŋgaviika.no": 1, - "lebesby.no": 1, - "lebork.pl": 1, - "lebtimnetz.de": 1, - "lecce.it": 1, - "lecco.it": 1, - "leclerc": 1, - "leczna.pl": 1, - "lefrak": 1, - "leg.br": 1, - "legal": 1, - "legnica.pl": 1, - "lego": 1, - "leikanger.no": 1, - "leirfjord.no": 1, - "leirvik.no": 1, - "leitungsen.de": 1, - "leka.no": 1, - "leksvik.no": 1, - "lel.br": 1, - "lelux.site": 1, - "lenug.su": 1, - "lenvik.no": 1, - "lerdal.no": 1, - "lesja.no": 1, - "levanger.no": 1, - "lexus": 1, - "lezajsk.pl": 1, - "lg.jp": 1, - "lg.ua": 1, - "lgbt": 1, - "li": 1, - "li.it": 1, - "lib.ak.us": 1, - "lib.al.us": 1, - "lib.ar.us": 1, - "lib.as.us": 1, - "lib.az.us": 1, - "lib.ca.us": 1, - "lib.co.us": 1, - "lib.ct.us": 1, - "lib.dc.us": 1, - "lib.de.us": 1, - "lib.ee": 1, - "lib.fl.us": 1, - "lib.ga.us": 1, - "lib.gu.us": 1, - "lib.hi.us": 1, - "lib.ia.us": 1, - "lib.id.us": 1, - "lib.il.us": 1, - "lib.in.us": 1, - "lib.ks.us": 1, - "lib.ky.us": 1, - "lib.la.us": 1, - "lib.ma.us": 1, - "lib.md.us": 1, - "lib.me.us": 1, - "lib.mi.us": 1, - "lib.mn.us": 1, - "lib.mo.us": 1, - "lib.ms.us": 1, - "lib.mt.us": 1, - "lib.nc.us": 1, - "lib.nd.us": 1, - "lib.ne.us": 1, - "lib.nh.us": 1, - "lib.nj.us": 1, - "lib.nm.us": 1, - "lib.nv.us": 1, - "lib.ny.us": 1, - "lib.oh.us": 1, - "lib.ok.us": 1, - "lib.or.us": 1, - "lib.pa.us": 1, - "lib.pr.us": 1, - "lib.ri.us": 1, - "lib.sc.us": 1, - "lib.sd.us": 1, - "lib.tn.us": 1, - "lib.tx.us": 1, - "lib.ut.us": 1, - "lib.va.us": 1, - "lib.vi.us": 1, - "lib.vt.us": 1, - "lib.wa.us": 1, - "lib.wi.us": 1, - "lib.wy.us": 1, - "lidl": 1, - "lier.no": 1, - "lierne.no": 1, - "life": 1, - "lifeinsurance": 1, - "lifestyle": 1, - "lig.it": 1, - "lighting": 1, - "liguria.it": 1, - "like": 1, - "likes-pie.com": 1, - "likescandy.com": 1, - "lillehammer.no": 1, - "lillesand.no": 1, - "lilly": 1, - "lima-city.at": 1, - "lima-city.ch": 1, - "lima-city.de": 1, - "lima-city.rocks": 1, - "lima.zone": 1, - "limanowa.pl": 1, - "limited": 1, - "limo": 1, - "lincoln": 1, - "lindas.no": 1, - "lindesnes.no": 1, - "lindås.no": 1, - "link": 1, - "linkyard-cloud.ch": 1, - "linkyard.cloud": 1, - "lipsy": 1, - "littlestar.jp": 1, - "live": 1, - "living": 1, - "livorno.it": 1, - "lk": 1, - "lk3.ru": 1, - "llc": 1, - "llp": 1, - "ln.cn": 1, - "lo.it": 1, - "loabat.no": 1, - "loabát.no": 1, - "loan": 1, - "loans": 1, - "localhost.daplie.me": 1, - "localzone.xyz": 1, - "locker": 1, - "locus": 1, - "lodi.it": 1, - "lodingen.no": 1, - "log.br": 1, - "loginline.app": 1, - "loginline.dev": 1, - "loginline.io": 1, - "loginline.services": 1, - "loginline.site": 1, - "loginto.me": 1, - "logistics.aero": 1, - "logoip.com": 1, - "logoip.de": 1, - "lohmus.me": 1, - "loisirs.bj": 1, - "lol": 1, - "lolipop.io": 1, - "lolipopmc.jp": 1, - "lolitapunk.jp": 1, - "lom.it": 1, - "lom.no": 1, - "lombardia.it": 1, - "lombardy.it": 1, - "lomo.jp": 1, - "lomza.pl": 1, - "lon-1.paas.massivegrid.net": 1, - "lon-2.paas.massivegrid.net": 1, - "lon.wafaicloud.com": 1, - "london": 1, - "london.cloudapps.digital": 1, - "londrina.br": 1, - "longan.vn": 1, - "loppa.no": 1, - "lorenskog.no": 1, - "loseyourip.com": 1, - "loten.no": 1, - "lotte": 1, - "lotto": 1, - "love": 1, - "lovepop.jp": 1, - "lovesick.jp": 1, - "lowicz.pl": 1, - "lpages.co": 1, - "lpl": 1, - "lplfinancial": 1, - "lpusercontent.com": 1, - "lr": 1, - "ls": 1, - "lt": 1, - "lt.eu.org": 1, - "lt.it": 1, - "lt.ua": 1, - "ltd": 1, - "ltd.co.im": 1, - "ltd.cy": 1, - "ltd.gi": 1, - "ltd.hk": 1, - "ltd.lk": 1, - "ltd.ng": 1, - "ltd.ua": 1, - "ltd.uk": 1, - "ltda": 1, - "lu": 1, - "lu.eu.org": 1, - "lu.it": 1, - "lubartow.pl": 1, - "lubin.pl": 1, - "lublin.pl": 1, - "lucania.it": 1, - "lucca.it": 1, - "lug.org.uk": 1, - "lugansk.ua": 1, - "lugs.org.uk": 1, - "lukow.pl": 1, - "lund.no": 1, - "lundbeck": 1, - "lunner.no": 1, - "luroy.no": 1, - "lurøy.no": 1, - "luster.no": 1, - "lutsk.ua": 1, - "luxe": 1, - "luxury": 1, - "lv": 1, - "lv.eu.org": 1, - "lv.ua": 1, - "lviv.ua": 1, - "ly": 1, - "lyngdal.no": 1, - "lyngen.no": 1, - "lynx.mythic-beasts.com": 1, - "láhppi.no": 1, - "lærdal.no": 1, - "lødingen.no": 1, - "lørenskog.no": 1, - "løten.no": 1, - "m.bg": 1, - "m.se": 1, - "ma": 1, - "ma.gov.br": 1, - "ma.leg.br": 1, - "ma.us": 1, - "macapa.br": 1, - "maceio.br": 1, - "macerata.it": 1, - "machida.tokyo.jp": 1, - "madrid": 1, - "maebashi.gunma.jp": 1, - "magazine.aero": 1, - "magnet.page": 1, - "maibara.shiga.jp": 1, - "maif": 1, - "mail-box.ne.jp": 1, - "mail.pl": 1, - "main.jp": 1, - "maintenance.aero": 1, - "maison": 1, - "maizuru.kyoto.jp": 1, - "makeup": 1, - "makinohara.shizuoka.jp": 1, - "makurazaki.kagoshima.jp": 1, - "malatvuopmi.no": 1, - "malbork.pl": 1, - "malopolska.pl": 1, - "malselv.no": 1, - "malvik.no": 1, - "mamurogawa.yamagata.jp": 1, - "man": 1, - "management": 1, - "manaus.br": 1, - "mandal.no": 1, - "mango": 1, - "mangyshlak.su": 1, - "maniwa.okayama.jp": 1, - "manno.kagawa.jp": 1, - "mantova.it": 1, - "maori.nz": 1, - "map": 1, - "map.fastly.net": 1, - "map.fastlylb.net": 1, - "mar.it": 1, - "marche.it": 1, - "marine.ru": 1, - "maringa.br": 1, - "marker.no": 1, - "market": 1, - "marketing": 1, - "markets": 1, - "marnardal.no": 1, - "marriott": 1, - "marshalls": 1, - "marugame.kagawa.jp": 1, - "marumori.miyagi.jp": 1, - "masaki.ehime.jp": 1, - "masfjorden.no": 1, - "mashike.hokkaido.jp": 1, - "mashiki.kumamoto.jp": 1, - "mashiko.tochigi.jp": 1, - "masoy.no": 1, - "massa-carrara.it": 1, - "massacarrara.it": 1, - "masuda.shimane.jp": 1, - "mat.br": 1, - "matera.it": 1, - "matrix.jp": 1, - "matsubara.osaka.jp": 1, - "matsubushi.saitama.jp": 1, - "matsuda.kanagawa.jp": 1, - "matsudo.chiba.jp": 1, - "matsue.shimane.jp": 1, - "matsukawa.nagano.jp": 1, - "matsumae.hokkaido.jp": 1, - "matsumoto.kagoshima.jp": 1, - "matsumoto.nagano.jp": 1, - "matsuno.ehime.jp": 1, - "matsusaka.mie.jp": 1, - "matsushige.tokushima.jp": 1, - "matsushima.miyagi.jp": 1, - "matsuura.nagasaki.jp": 1, - "matsuyama.ehime.jp": 1, - "matsuzaki.shizuoka.jp": 1, - "matta-varjjat.no": 1, - "mattel": 1, - "mayfirst.info": 1, - "mayfirst.org": 1, - "mazeplay.com": 1, - "mazowsze.pl": 1, - "mazury.pl": 1, - "mb.ca": 1, - "mb.it": 1, - "mba": 1, - "mc": 1, - "mc.ax": 1, - "mc.eu.org": 1, - "mc.it": 1, - "mcdir.me": 1, - "mcdir.ru": 1, - "mckinsey": 1, - "mcpe.me": 1, - "mcpre.ru": 1, - "md": 1, - "md.ci": 1, - "md.us": 1, - "me": 1, - "me.eu.org": 1, - "me.in": 1, - "me.it": 1, - "me.ke": 1, - "me.so": 1, - "me.ss": 1, - "me.tc": 1, - "me.tz": 1, - "me.uk": 1, - "me.us": 1, - "me.vu": 1, - "med": 1, - "med.br": 1, - "med.ec": 1, - "med.ee": 1, - "med.ht": 1, - "med.ly": 1, - "med.om": 1, - "med.pa": 1, - "med.pl": 1, - "med.pro": 1, - "med.sa": 1, - "med.sd": 1, - "medecin.fr": 1, - "medecin.km": 1, - "media": 1, - "media.aero": 1, - "media.hu": 1, - "media.pl": 1, - "mediatech.by": 1, - "mediatech.dev": 1, - "medicina.bo": 1, - "medio-campidano.it": 1, - "mediocampidano.it": 1, - "meet": 1, - "meguro.tokyo.jp": 1, - "mein-iserv.de": 1, - "mein-vigor.de": 1, - "meinforum.net": 1, - "meiwa.gunma.jp": 1, - "meiwa.mie.jp": 1, - "mel.cloudlets.com.au": 1, - "meland.no": 1, - "melbourne": 1, - "meldal.no": 1, - "melhus.no": 1, - "meloy.no": 1, - "meløy.no": 1, - "members.linode.com": 1, - "meme": 1, - "memorial": 1, - "memset.net": 1, - "men": 1, - "menu": 1, - "meraker.no": 1, - "merckmsd": 1, - "merseine.nu": 1, - "meråker.no": 1, - "messerli.app": 1, - "messina.it": 1, - "messwithdns.com": 1, - "meteorapp.com": 1, - "mex.com": 1, - "mg": 1, - "mg.gov.br": 1, - "mg.leg.br": 1, - "mh": 1, - "mi.it": 1, - "mi.th": 1, - "mi.us": 1, - "miami": 1, - "miasa.nagano.jp": 1, - "miasta.pl": 1, - "mibu.tochigi.jp": 1, - "microlight.aero": 1, - "microsoft": 1, - "midori.chiba.jp": 1, - "midori.gunma.jp": 1, - "midsund.no": 1, - "midtre-gauldal.no": 1, - "mie.jp": 1, - "mielec.pl": 1, - "mielno.pl": 1, - "mifune.kumamoto.jp": 1, - "mihama.aichi.jp": 1, - "mihama.chiba.jp": 1, - "mihama.fukui.jp": 1, - "mihama.mie.jp": 1, - "mihama.wakayama.jp": 1, - "mihara.hiroshima.jp": 1, - "mihara.kochi.jp": 1, - "miharu.fukushima.jp": 1, - "miho.ibaraki.jp": 1, - "mikasa.hokkaido.jp": 1, - "mikawa.yamagata.jp": 1, - "miki.hyogo.jp": 1, - "mil": 1, - "mil.ac": 1, - "mil.ae": 1, - "mil.al": 1, - "mil.ar": 1, - "mil.az": 1, - "mil.ba": 1, - "mil.bo": 1, - "mil.br": 1, - "mil.by": 1, - "mil.cl": 1, - "mil.cn": 1, - "mil.co": 1, - "mil.cy": 1, - "mil.do": 1, - "mil.ec": 1, - "mil.eg": 1, - "mil.fj": 1, - "mil.ge": 1, - "mil.gh": 1, - "mil.gt": 1, - "mil.hn": 1, - "mil.id": 1, - "mil.in": 1, - "mil.iq": 1, - "mil.jo": 1, - "mil.kg": 1, - "mil.km": 1, - "mil.kr": 1, - "mil.kz": 1, - "mil.lv": 1, - "mil.mg": 1, - "mil.mv": 1, - "mil.my": 1, - "mil.mz": 1, - "mil.ng": 1, - "mil.ni": 1, - "mil.no": 1, - "mil.nz": 1, - "mil.pe": 1, - "mil.ph": 1, - "mil.pl": 1, - "mil.py": 1, - "mil.qa": 1, - "mil.ru": 1, - "mil.rw": 1, - "mil.sh": 1, - "mil.st": 1, - "mil.sy": 1, - "mil.tj": 1, - "mil.tm": 1, - "mil.to": 1, - "mil.tr": 1, - "mil.tw": 1, - "mil.tz": 1, - "mil.uy": 1, - "mil.vc": 1, - "mil.ve": 1, - "mil.ye": 1, - "mil.za": 1, - "mil.zm": 1, - "mil.zw": 1, - "milan.it": 1, - "milano.it": 1, - "mima.tokushima.jp": 1, - "mimata.miyazaki.jp": 1, - "mimoza.jp": 1, - "minakami.gunma.jp": 1, - "minamata.kumamoto.jp": 1, - "minami-alps.yamanashi.jp": 1, - "minami.fukuoka.jp": 1, - "minami.kyoto.jp": 1, - "minami.tokushima.jp": 1, - "minamiaiki.nagano.jp": 1, - "minamiashigara.kanagawa.jp": 1, - "minamiawaji.hyogo.jp": 1, - "minamiboso.chiba.jp": 1, - "minamidaito.okinawa.jp": 1, - "minamiechizen.fukui.jp": 1, - "minamifurano.hokkaido.jp": 1, - "minamiise.mie.jp": 1, - "minamiizu.shizuoka.jp": 1, - "minamimaki.nagano.jp": 1, - "minamiminowa.nagano.jp": 1, - "minamioguni.kumamoto.jp": 1, - "minamisanriku.miyagi.jp": 1, - "minamitane.kagoshima.jp": 1, - "minamiuonuma.niigata.jp": 1, - "minamiyamashiro.kyoto.jp": 1, - "minano.saitama.jp": 1, - "minato.osaka.jp": 1, - "minato.tokyo.jp": 1, - "mincom.tn": 1, - "mine.nu": 1, - "mini": 1, - "miniserver.com": 1, - "minisite.ms": 1, - "mino.gifu.jp": 1, - "minobu.yamanashi.jp": 1, - "minoh.osaka.jp": 1, - "minokamo.gifu.jp": 1, - "minowa.nagano.jp": 1, - "mint": 1, - "mintere.site": 1, - "mints.ne.jp": 1, - "mircloud.host": 1, - "mircloud.ru": 1, - "mircloud.us": 1, - "misaki.okayama.jp": 1, - "misaki.osaka.jp": 1, - "misasa.tottori.jp": 1, - "misato.akita.jp": 1, - "misato.miyagi.jp": 1, - "misato.saitama.jp": 1, - "misato.shimane.jp": 1, - "misato.wakayama.jp": 1, - "misawa.aomori.jp": 1, - "misconfused.org": 1, - "mishima.fukushima.jp": 1, - "mishima.shizuoka.jp": 1, - "misugi.mie.jp": 1, - "mit": 1, - "mitaka.tokyo.jp": 1, - "mitake.gifu.jp": 1, - "mitane.akita.jp": 1, - "mito.ibaraki.jp": 1, - "mitou.yamaguchi.jp": 1, - "mitoyo.kagawa.jp": 1, - "mitsubishi": 1, - "mitsue.nara.jp": 1, - "mitsuke.niigata.jp": 1, - "miura.kanagawa.jp": 1, - "miyada.nagano.jp": 1, - "miyagi.jp": 1, - "miyake.nara.jp": 1, - "miyako.fukuoka.jp": 1, - "miyako.iwate.jp": 1, - "miyakonojo.miyazaki.jp": 1, - "miyama.fukuoka.jp": 1, - "miyama.mie.jp": 1, - "miyashiro.saitama.jp": 1, - "miyawaka.fukuoka.jp": 1, - "miyazaki.jp": 1, - "miyazaki.miyazaki.jp": 1, - "miyazu.kyoto.jp": 1, - "miyoshi.aichi.jp": 1, - "miyoshi.hiroshima.jp": 1, - "miyoshi.saitama.jp": 1, - "miyoshi.tokushima.jp": 1, - "miyota.nagano.jp": 1, - "mizuho.tokyo.jp": 1, - "mizumaki.fukuoka.jp": 1, - "mizunami.gifu.jp": 1, - "mizusawa.iwate.jp": 1, - "mjondalen.no": 1, - "mjøndalen.no": 1, - "mk": 1, - "mk.eu.org": 1, - "mk.ua": 1, - "ml": 1, - "mlb": 1, - "mlbfan.org": 1, - "mls": 1, - "mma": 1, - "mmafan.biz": 1, - "mn": 1, - "mn.it": 1, - "mn.us": 1, - "mo": 1, - "mo-i-rana.no": 1, - "mo-siemens.io": 1, - "mo.cn": 1, - "mo.it": 1, - "mo.us": 1, - "moareke.no": 1, - "mobara.chiba.jp": 1, - "mobi": 1, - "mobi.gp": 1, - "mobi.ke": 1, - "mobi.na": 1, - "mobi.ng": 1, - "mobi.tt": 1, - "mobi.tz": 1, - "mobile": 1, - "mochizuki.nagano.jp": 1, - "mock.pstmn.io": 1, - "mod.gi": 1, - "moda": 1, - "modalen.no": 1, - "modelling.aero": 1, - "modena.it": 1, - "mods.jp": 1, - "modum.no": 1, - "moe": 1, - "moi": 1, - "moka.tochigi.jp": 1, - "mokuren.ne.jp": 1, - "mol.it": 1, - "molde.no": 1, - "molise.it": 1, - "mom": 1, - "mombetsu.hokkaido.jp": 1, - "monash": 1, - "mond.jp": 1, - "money": 1, - "money.bj": 1, - "mongolian.jp": 1, - "monster": 1, - "monza-brianza.it": 1, - "monza-e-della-brianza.it": 1, - "monza.it": 1, - "monzabrianza.it": 1, - "monzaebrianza.it": 1, - "monzaedellabrianza.it": 1, - "moo.jp": 1, - "moonscale.net": 1, - "mordovia.ru": 1, - "mordovia.su": 1, - "morena.br": 1, - "moriguchi.osaka.jp": 1, - "morimachi.shizuoka.jp": 1, - "morioka.iwate.jp": 1, - "moriya.ibaraki.jp": 1, - "moriyama.shiga.jp": 1, - "moriyoshi.akita.jp": 1, - "mormon": 1, - "morotsuka.miyazaki.jp": 1, - "moroyama.saitama.jp": 1, - "mortgage": 1, - "moscow": 1, - "moseushi.hokkaido.jp": 1, - "mosjoen.no": 1, - "mosjøen.no": 1, - "moskenes.no": 1, - "moss.no": 1, - "mosvik.no": 1, - "motegi.tochigi.jp": 1, - "moto": 1, - "motobu.okinawa.jp": 1, - "motorcycles": 1, - "motosu.gifu.jp": 1, - "motoyama.kochi.jp": 1, - "mov": 1, - "movie": 1, - "movimiento.bo": 1, - "mozilla-iot.org": 1, - "moåreke.no": 1, - "mp": 1, - "mp.br": 1, - "mq": 1, - "mr": 1, - "mr.no": 1, - "mragowo.pl": 1, - "ms": 1, - "ms.gov.br": 1, - "ms.it": 1, - "ms.kr": 1, - "ms.leg.br": 1, - "ms.us": 1, - "msd": 1, - "msk.ru": 1, - "msk.su": 1, - "mt": 1, - "mt.eu.org": 1, - "mt.gov.br": 1, - "mt.it": 1, - "mt.leg.br": 1, - "mt.us": 1, - "mtn": 1, - "mtr": 1, - "mu": 1, - "mugi.tokushima.jp": 1, - "muika.niigata.jp": 1, - "mukawa.hokkaido.jp": 1, - "muko.kyoto.jp": 1, - "munakata.fukuoka.jp": 1, - "muni.il": 1, - "muosat.no": 1, - "muosát.no": 1, - "mup.gov.pl": 1, - "murakami.niigata.jp": 1, - "murata.miyagi.jp": 1, - "murayama.yamagata.jp": 1, - "murmansk.su": 1, - "muroran.hokkaido.jp": 1, - "muroto.kochi.jp": 1, - "mus.br": 1, - "mus.mi.us": 1, - "musashimurayama.tokyo.jp": 1, - "musashino.tokyo.jp": 1, - "museum": 1, - "museum.mv": 1, - "museum.mw": 1, - "museum.no": 1, - "museum.om": 1, - "museum.tt": 1, - "music": 1, - "musica.ar": 1, - "musica.bo": 1, - "musician.io": 1, - "mutsu.aomori.jp": 1, - "mutsuzawa.chiba.jp": 1, - "mutual.ar": 1, - "mv": 1, - "mw": 1, - "mw.gov.pl": 1, - "mx": 1, - "mx.na": 1, - "my": 1, - "my-firewall.org": 1, - "my-gateway.de": 1, - "my-router.de": 1, - "my-vigor.de": 1, - "my-wan.de": 1, - "my.eu.org": 1, - "my.id": 1, - "myactivedirectory.com": 1, - "myamaze.net": 1, - "myasustor.com": 1, - "mycd.eu": 1, - "mycloud.by": 1, - "mydatto.com": 1, - "mydatto.net": 1, - "myddns.rocks": 1, - "mydissent.net": 1, - "mydobiss.com": 1, - "mydrobo.com": 1, - "myds.me": 1, - "myeffect.net": 1, - "myfast.host": 1, - "myfast.space": 1, - "myfirewall.org": 1, - "myforum.community": 1, - "myfritz.net": 1, - "myftp.biz": 1, - "myftp.org": 1, - "myhome-server.de": 1, - "myiphost.com": 1, - "myjino.ru": 1, - "mykolaiv.ua": 1, - "mymailer.com.tw": 1, - "mymediapc.net": 1, - "myoko.niigata.jp": 1, - "mypep.link": 1, - "mypets.ws": 1, - "myphotos.cc": 1, - "mypi.co": 1, - "mypsx.net": 1, - "myqnapcloud.com": 1, - "mysecuritycamera.com": 1, - "mysecuritycamera.net": 1, - "mysecuritycamera.org": 1, - "myshopblocks.com": 1, - "myshopify.com": 1, - "myspreadshop.at": 1, - "myspreadshop.be": 1, - "myspreadshop.ca": 1, - "myspreadshop.ch": 1, - "myspreadshop.co.uk": 1, - "myspreadshop.com": 1, - "myspreadshop.com.au": 1, - "myspreadshop.de": 1, - "myspreadshop.dk": 1, - "myspreadshop.es": 1, - "myspreadshop.fi": 1, - "myspreadshop.fr": 1, - "myspreadshop.ie": 1, - "myspreadshop.it": 1, - "myspreadshop.net": 1, - "myspreadshop.nl": 1, - "myspreadshop.no": 1, - "myspreadshop.pl": 1, - "myspreadshop.se": 1, - "mytabit.co.il": 1, - "mytabit.com": 1, - "mytis.ru": 1, - "mytuleap.com": 1, - "myvnc.com": 1, - "mywire.org": 1, - "mz": 1, - "málatvuopmi.no": 1, - "mátta-várjjat.no": 1, - "målselv.no": 1, - "måsøy.no": 1, - "māori.nz": 1, - "n.bg": 1, - "n.se": 1, - "n4t.co": 1, - "na": 1, - "na.it": 1, - "na4u.ru": 1, - "naamesjevuemie.no": 1, - "nab": 1, - "nabari.mie.jp": 1, - "nachikatsuura.wakayama.jp": 1, - "nagahama.shiga.jp": 1, - "nagai.yamagata.jp": 1, - "nagano.jp": 1, - "nagano.nagano.jp": 1, - "naganohara.gunma.jp": 1, - "nagaoka.niigata.jp": 1, - "nagaokakyo.kyoto.jp": 1, - "nagara.chiba.jp": 1, - "nagareyama.chiba.jp": 1, - "nagasaki.jp": 1, - "nagasaki.nagasaki.jp": 1, - "nagasu.kumamoto.jp": 1, - "nagato.yamaguchi.jp": 1, - "nagatoro.saitama.jp": 1, - "nagawa.nagano.jp": 1, - "nagi.okayama.jp": 1, - "nagiso.nagano.jp": 1, - "nago.okinawa.jp": 1, - "nagoya": 1, - "naha.okinawa.jp": 1, - "nahari.kochi.jp": 1, - "naie.hokkaido.jp": 1, - "naka.hiroshima.jp": 1, - "naka.ibaraki.jp": 1, - "nakadomari.aomori.jp": 1, - "nakagawa.fukuoka.jp": 1, - "nakagawa.hokkaido.jp": 1, - "nakagawa.nagano.jp": 1, - "nakagawa.tokushima.jp": 1, - "nakagusuku.okinawa.jp": 1, - "nakagyo.kyoto.jp": 1, - "nakai.kanagawa.jp": 1, - "nakama.fukuoka.jp": 1, - "nakamichi.yamanashi.jp": 1, - "nakamura.kochi.jp": 1, - "nakaniikawa.toyama.jp": 1, - "nakano.nagano.jp": 1, - "nakano.tokyo.jp": 1, - "nakanojo.gunma.jp": 1, - "nakanoto.ishikawa.jp": 1, - "nakasatsunai.hokkaido.jp": 1, - "nakatane.kagoshima.jp": 1, - "nakatombetsu.hokkaido.jp": 1, - "nakatsugawa.gifu.jp": 1, - "nakayama.yamagata.jp": 1, - "nakijin.okinawa.jp": 1, - "naklo.pl": 1, - "nalchik.ru": 1, - "nalchik.su": 1, - "namaste.jp": 1, - "namdalseid.no": 1, - "namdinh.vn": 1, - "name": 1, - "name.az": 1, - "name.eg": 1, - "name.et": 1, - "name.fj": 1, - "name.hr": 1, - "name.jo": 1, - "name.mk": 1, - "name.mv": 1, - "name.my": 1, - "name.na": 1, - "name.ng": 1, - "name.pm": 1, - "name.pr": 1, - "name.qa": 1, - "name.tj": 1, - "name.tr": 1, - "name.tt": 1, - "name.vn": 1, - "namegata.ibaraki.jp": 1, - "namegawa.saitama.jp": 1, - "namerikawa.toyama.jp": 1, - "namie.fukushima.jp": 1, - "namikata.ehime.jp": 1, - "namsos.no": 1, - "namsskogan.no": 1, - "nanae.hokkaido.jp": 1, - "nanao.ishikawa.jp": 1, - "nanbu.tottori.jp": 1, - "nanbu.yamanashi.jp": 1, - "nango.fukushima.jp": 1, - "nanjo.okinawa.jp": 1, - "nankoku.kochi.jp": 1, - "nanmoku.gunma.jp": 1, - "nannestad.no": 1, - "nanporo.hokkaido.jp": 1, - "nantan.kyoto.jp": 1, - "nanto.toyama.jp": 1, - "nanyo.yamagata.jp": 1, - "naoshima.kagawa.jp": 1, - "naples.it": 1, - "napoli.it": 1, - "nara.jp": 1, - "nara.nara.jp": 1, - "narashino.chiba.jp": 1, - "narita.chiba.jp": 1, - "naroy.no": 1, - "narusawa.yamanashi.jp": 1, - "naruto.tokushima.jp": 1, - "narviika.no": 1, - "narvik.no": 1, - "nasu.tochigi.jp": 1, - "nasushiobara.tochigi.jp": 1, - "nat.tn": 1, - "natal.br": 1, - "natori.miyagi.jp": 1, - "natura": 1, - "natural.bo": 1, - "naturbruksgymn.se": 1, - "naustdal.no": 1, - "navigation.aero": 1, - "navoi.su": 1, - "navuotna.no": 1, - "navy": 1, - "nayoro.hokkaido.jp": 1, - "nb.ca": 1, - "nba": 1, - "nc": 1, - "nc.tr": 1, - "nc.us": 1, - "nd.us": 1, - "ne": 1, - "ne.jp": 1, - "ne.ke": 1, - "ne.kr": 1, - "ne.pw": 1, - "ne.tz": 1, - "ne.ug": 1, - "ne.us": 1, - "neat-url.com": 1, - "nec": 1, - "nedre-eiker.no": 1, - "neko.am": 1, - "nemuro.hokkaido.jp": 1, - "nerdpol.ovh": 1, - "nerima.tokyo.jp": 1, - "nes.akershus.no": 1, - "nes.buskerud.no": 1, - "nesna.no": 1, - "nesodden.no": 1, - "nesoddtangen.no": 1, - "nesseby.no": 1, - "nesset.no": 1, - "net": 1, - "net-freaks.com": 1, - "net.ac": 1, - "net.ae": 1, - "net.af": 1, - "net.ag": 1, - "net.ai": 1, - "net.al": 1, - "net.am": 1, - "net.ar": 1, - "net.au": 1, - "net.az": 1, - "net.ba": 1, - "net.bb": 1, - "net.bh": 1, - "net.bj": 1, - "net.bm": 1, - "net.bn": 1, - "net.bo": 1, - "net.br": 1, - "net.bs": 1, - "net.bt": 1, - "net.bz": 1, - "net.ci": 1, - "net.cm": 1, - "net.cn": 1, - "net.co": 1, - "net.cu": 1, - "net.cw": 1, - "net.cy": 1, - "net.dm": 1, - "net.do": 1, - "net.dz": 1, - "net.ec": 1, - "net.eg": 1, - "net.et": 1, - "net.eu.org": 1, - "net.fj": 1, - "net.fm": 1, - "net.ge": 1, - "net.gg": 1, - "net.gl": 1, - "net.gn": 1, - "net.gp": 1, - "net.gr": 1, - "net.gt": 1, - "net.gu": 1, - "net.gy": 1, - "net.hk": 1, - "net.hn": 1, - "net.ht": 1, - "net.id": 1, - "net.il": 1, - "net.im": 1, - "net.in": 1, - "net.iq": 1, - "net.ir": 1, - "net.is": 1, - "net.je": 1, - "net.jo": 1, - "net.kg": 1, - "net.ki": 1, - "net.kn": 1, - "net.kw": 1, - "net.ky": 1, - "net.kz": 1, - "net.la": 1, - "net.lb": 1, - "net.lc": 1, - "net.lk": 1, - "net.lr": 1, - "net.ls": 1, - "net.lv": 1, - "net.ly": 1, - "net.ma": 1, - "net.me": 1, - "net.mk": 1, - "net.ml": 1, - "net.mo": 1, - "net.ms": 1, - "net.mt": 1, - "net.mu": 1, - "net.mv": 1, - "net.mw": 1, - "net.mx": 1, - "net.my": 1, - "net.mz": 1, - "net.nf": 1, - "net.ng": 1, - "net.ni": 1, - "net.nr": 1, - "net.nz": 1, - "net.om": 1, - "net.pa": 1, - "net.pe": 1, - "net.ph": 1, - "net.pk": 1, - "net.pl": 1, - "net.pn": 1, - "net.pr": 1, - "net.ps": 1, - "net.pt": 1, - "net.py": 1, - "net.qa": 1, - "net.ru": 1, - "net.rw": 1, - "net.sa": 1, - "net.sb": 1, - "net.sc": 1, - "net.sd": 1, - "net.sg": 1, - "net.sh": 1, - "net.sl": 1, - "net.so": 1, - "net.ss": 1, - "net.st": 1, - "net.sy": 1, - "net.th": 1, - "net.tj": 1, - "net.tm": 1, - "net.tn": 1, - "net.to": 1, - "net.tr": 1, - "net.tt": 1, - "net.tw": 1, - "net.ua": 1, - "net.uk": 1, - "net.uy": 1, - "net.uz": 1, - "net.vc": 1, - "net.ve": 1, - "net.vi": 1, - "net.vn": 1, - "net.vu": 1, - "net.ws": 1, - "net.ye": 1, - "net.za": 1, - "net.zm": 1, - "netbank": 1, - "netflix": 1, - "netgamers.jp": 1, - "netlify.app": 1, - "network": 1, - "neustar": 1, - "new": 1, - "news": 1, - "news.hu": 1, - "next": 1, - "nextdirect": 1, - "nexus": 1, - "neyagawa.osaka.jp": 1, - "nf": 1, - "nf.ca": 1, - "nfl": 1, - "nflfan.org": 1, - "nfshost.com": 1, - "ng": 1, - "ng.eu.org": 1, - "nghean.vn": 1, - "ngo": 1, - "ngo.lk": 1, - "ngo.ng": 1, - "ngo.ph": 1, - "ngo.za": 1, - "ngrok-free.app": 1, - "ngrok-free.dev": 1, - "ngrok.app": 1, - "ngrok.dev": 1, - "ngrok.io": 1, - "ngrok.pizza": 1, - "nh-serv.co.uk": 1, - "nh.us": 1, - "nhk": 1, - "nhlfan.net": 1, - "nhs.uk": 1, - "ni": 1, - "nic.in": 1, - "nic.tj": 1, - "nic.za": 1, - "nichinan.miyazaki.jp": 1, - "nichinan.tottori.jp": 1, - "nico": 1, - "nid.io": 1, - "nieruchomosci.pl": 1, - "niigata.jp": 1, - "niigata.niigata.jp": 1, - "niihama.ehime.jp": 1, - "niikappu.hokkaido.jp": 1, - "niimi.okayama.jp": 1, - "niiza.saitama.jp": 1, - "nikaho.akita.jp": 1, - "nike": 1, - "niki.hokkaido.jp": 1, - "nikita.jp": 1, - "nikko.tochigi.jp": 1, - "nikolaev.ua": 1, - "nikon": 1, - "ninhbinh.vn": 1, - "ninhthuan.vn": 1, - "ninja": 1, - "ninohe.iwate.jp": 1, - "ninomiya.kanagawa.jp": 1, - "nirasaki.yamanashi.jp": 1, - "nis.za": 1, - "nishi.fukuoka.jp": 1, - "nishi.osaka.jp": 1, - "nishiaizu.fukushima.jp": 1, - "nishiarita.saga.jp": 1, - "nishiawakura.okayama.jp": 1, - "nishiazai.shiga.jp": 1, - "nishigo.fukushima.jp": 1, - "nishihara.kumamoto.jp": 1, - "nishihara.okinawa.jp": 1, - "nishiizu.shizuoka.jp": 1, - "nishikata.tochigi.jp": 1, - "nishikatsura.yamanashi.jp": 1, - "nishikawa.yamagata.jp": 1, - "nishimera.miyazaki.jp": 1, - "nishinomiya.hyogo.jp": 1, - "nishinoomote.kagoshima.jp": 1, - "nishinoshima.shimane.jp": 1, - "nishio.aichi.jp": 1, - "nishiokoppe.hokkaido.jp": 1, - "nishitosa.kochi.jp": 1, - "nishiwaki.hyogo.jp": 1, - "nissan": 1, - "nissay": 1, - "nissedal.no": 1, - "nisshin.aichi.jp": 1, - "niteroi.br": 1, - "nittedal.no": 1, - "niyodogawa.kochi.jp": 1, - "nj.us": 1, - "njs.jelastic.vps-host.net": 1, - "nl": 1, - "nl-ams-1.baremetal.scw.cloud": 1, - "nl.ca": 1, - "nl.ci": 1, - "nl.eu.org": 1, - "nl.no": 1, - "nm.cn": 1, - "nm.us": 1, - "no": 1, - "no-ip.biz": 1, - "no-ip.ca": 1, - "no-ip.co.uk": 1, - "no-ip.info": 1, - "no-ip.net": 1, - "no-ip.org": 1, - "no.com": 1, - "no.eu.org": 1, - "no.it": 1, - "nobeoka.miyazaki.jp": 1, - "noboribetsu.hokkaido.jp": 1, - "nobushi.jp": 1, - "noda.chiba.jp": 1, - "noda.iwate.jp": 1, - "nodes.k8s.fr-par.scw.cloud": 1, - "nodes.k8s.nl-ams.scw.cloud": 1, - "nodes.k8s.pl-waw.scw.cloud": 1, - "nog.community": 1, - "nogata.fukuoka.jp": 1, - "nogi.tochigi.jp": 1, - "noheji.aomori.jp": 1, - "noho.st": 1, - "nohost.me": 1, - "noip.me": 1, - "noip.us": 1, - "nokia": 1, - "nom.ad": 1, - "nom.ag": 1, - "nom.co": 1, - "nom.es": 1, - "nom.fr": 1, - "nom.km": 1, - "nom.mg": 1, - "nom.nc": 1, - "nom.ni": 1, - "nom.pa": 1, - "nom.pe": 1, - "nom.pl": 1, - "nom.re": 1, - "nom.ro": 1, - "nom.tm": 1, - "nom.ve": 1, - "nom.za": 1, - "nombre.bo": 1, - "nome.cv": 1, - "nome.pt": 1, - "nomi.ishikawa.jp": 1, - "nonoichi.ishikawa.jp": 1, - "noop.app": 1, - "noor.jp": 1, - "nord-aurdal.no": 1, - "nord-fron.no": 1, - "nord-odal.no": 1, - "norddal.no": 1, - "nordeste-idc.saveincloud.net": 1, - "nordkapp.no": 1, - "nordre-land.no": 1, - "nordreisa.no": 1, - "nore-og-uvdal.no": 1, - "north-kazakhstan.su": 1, - "norton": 1, - "nose.osaka.jp": 1, - "nosegawa.nara.jp": 1, - "noshiro.akita.jp": 1, - "not.br": 1, - "notaires.fr": 1, - "notaires.km": 1, - "noticeable.news": 1, - "noticias.bo": 1, - "noto.ishikawa.jp": 1, - "notodden.no": 1, - "notogawa.shiga.jp": 1, - "notteroy.no": 1, - "nov.ru": 1, - "nov.su": 1, - "novara.it": 1, - "novecore.site": 1, - "now": 1, - "now-dns.net": 1, - "now-dns.org": 1, - "now-dns.top": 1, - "now.sh": 1, - "nowaruda.pl": 1, - "nowruz": 1, - "nowtv": 1, - "nozawaonsen.nagano.jp": 1, - "nr": 1, - "nra": 1, - "nrw": 1, - "ns.ca": 1, - "nsn.us": 1, - "nsupdate.info": 1, - "nsw.au": 1, - "nsw.edu.au": 1, - "nt.au": 1, - "nt.ca": 1, - "nt.edu.au": 1, - "nt.no": 1, - "nt.ro": 1, - "ntdll.top": 1, - "ntr.br": 1, - "ntt": 1, - "nu": 1, - "nu.ca": 1, - "nu.it": 1, - "numata.gunma.jp": 1, - "numata.hokkaido.jp": 1, - "numazu.shizuoka.jp": 1, - "nuoro.it": 1, - "nv.us": 1, - "nx.cn": 1, - "ny-1.paas.massivegrid.net": 1, - "ny-2.paas.massivegrid.net": 1, - "ny.us": 1, - "nyaa.am": 1, - "nyan.to": 1, - "nyanta.jp": 1, - "nyc": 1, - "nyc.mn": 1, - "nysa.pl": 1, - "nyuzen.toyama.jp": 1, - "nz": 1, - "nz.basketball": 1, - "nz.eu.org": 1, - "návuotna.no": 1, - "nååmesjevuemie.no": 1, - "nærøy.no": 1, - "nøtterøy.no": 1, - "o.bg": 1, - "o.se": 1, - "o0o0.jp": 1, - "oamishirasato.chiba.jp": 1, - "oarai.ibaraki.jp": 1, - "obama.fukui.jp": 1, - "obama.nagasaki.jp": 1, - "obanazawa.yamagata.jp": 1, - "obi": 1, - "obihiro.hokkaido.jp": 1, - "obira.hokkaido.jp": 1, - "obninsk.su": 1, - "observer": 1, - "obu.aichi.jp": 1, - "obuse.nagano.jp": 1, - "ocelot.mythic-beasts.com": 1, - "ochi.kochi.jp": 1, - "od.ua": 1, - "odate.akita.jp": 1, - "odawara.kanagawa.jp": 1, - "odda.no": 1, - "odesa.ua": 1, - "odessa.ua": 1, - "odo.br": 1, - "oe.yamagata.jp": 1, - "of.by": 1, - "of.je": 1, - "of.no": 1, - "off.ai": 1, - "office": 1, - "office-on-the.net": 1, - "official.academy": 1, - "official.ec": 1, - "ofunato.iwate.jp": 1, - "og.ao": 1, - "og.it": 1, - "oga.akita.jp": 1, - "ogaki.gifu.jp": 1, - "ogano.saitama.jp": 1, - "ogasawara.tokyo.jp": 1, - "ogata.akita.jp": 1, - "ogawa.ibaraki.jp": 1, - "ogawa.nagano.jp": 1, - "ogawa.saitama.jp": 1, - "ogawara.miyagi.jp": 1, - "ogi.saga.jp": 1, - "ogimi.okinawa.jp": 1, - "ogliastra.it": 1, - "ogori.fukuoka.jp": 1, - "ogose.saitama.jp": 1, - "oguchi.aichi.jp": 1, - "oguni.kumamoto.jp": 1, - "oguni.yamagata.jp": 1, - "oh.us": 1, - "oharu.aichi.jp": 1, - "ohda.shimane.jp": 1, - "ohi.fukui.jp": 1, - "ohira.miyagi.jp": 1, - "ohira.tochigi.jp": 1, - "ohkura.yamagata.jp": 1, - "ohtawara.tochigi.jp": 1, - "oi.kanagawa.jp": 1, - "oia.gov.pl": 1, - "oirase.aomori.jp": 1, - "oirm.gov.pl": 1, - "oishida.yamagata.jp": 1, - "oiso.kanagawa.jp": 1, - "oita.jp": 1, - "oita.oita.jp": 1, - "oizumi.gunma.jp": 1, - "oji.nara.jp": 1, - "ojiya.niigata.jp": 1, - "ok.us": 1, - "okagaki.fukuoka.jp": 1, - "okawa.fukuoka.jp": 1, - "okawa.kochi.jp": 1, - "okaya.nagano.jp": 1, - "okayama.jp": 1, - "okayama.okayama.jp": 1, - "okazaki.aichi.jp": 1, - "oke.gov.pl": 1, - "okegawa.saitama.jp": 1, - "oketo.hokkaido.jp": 1, - "oki.fukuoka.jp": 1, - "okinawa": 1, - "okinawa.jp": 1, - "okinawa.okinawa.jp": 1, - "okinoshima.shimane.jp": 1, - "okoppe.hokkaido.jp": 1, - "oksnes.no": 1, - "okuizumo.shimane.jp": 1, - "okuma.fukushima.jp": 1, - "okutama.tokyo.jp": 1, - "ol.no": 1, - "olawa.pl": 1, - "olayan": 1, - "olayangroup": 1, - "olbia-tempio.it": 1, - "olbiatempio.it": 1, - "oldnavy": 1, - "olecko.pl": 1, - "olkusz.pl": 1, - "ollo": 1, - "olsztyn.pl": 1, - "om": 1, - "omachi.nagano.jp": 1, - "omachi.saga.jp": 1, - "omaezaki.shizuoka.jp": 1, - "omasvuotna.no": 1, - "ome.tokyo.jp": 1, - "omega": 1, - "omg.lol": 1, - "omi.nagano.jp": 1, - "omi.niigata.jp": 1, - "omigawa.chiba.jp": 1, - "omihachiman.shiga.jp": 1, - "omitama.ibaraki.jp": 1, - "omiya.saitama.jp": 1, - "omniwe.site": 1, - "omotego.fukushima.jp": 1, - "omura.nagasaki.jp": 1, - "omuta.fukuoka.jp": 1, - "on-aptible.com": 1, - "on-the-web.tv": 1, - "on-web.fr": 1, - "on.ca": 1, - "onagawa.miyagi.jp": 1, - "onavstack.net": 1, - "oncilla.mythic-beasts.com": 1, - "ondigitalocean.app": 1, - "one": 1, - "onfabrica.com": 1, - "onflashdrive.app": 1, - "ong": 1, - "ong.br": 1, - "onga.fukuoka.jp": 1, - "onion": 1, - "onjuku.chiba.jp": 1, - "onl": 1, - "online": 1, - "online.th": 1, - "onna.okinawa.jp": 1, - "ono.fukui.jp": 1, - "ono.fukushima.jp": 1, - "ono.hyogo.jp": 1, - "onojo.fukuoka.jp": 1, - "onomichi.hiroshima.jp": 1, - "onporter.run": 1, - "onred.one": 1, - "onrender.com": 1, - "onthewifi.com": 1, - "onza.mythic-beasts.com": 1, - "ooguy.com": 1, - "ookuwa.nagano.jp": 1, - "ooo": 1, - "oops.jp": 1, - "ooshika.nagano.jp": 1, - "oow.gov.pl": 1, - "opal.ne.jp": 1, - "open": 1, - "opencraft.hosting": 1, - "opensocial.site": 1, - "operaunite.com": 1, - "opoczno.pl": 1, - "opole.pl": 1, - "oppdal.no": 1, - "oppegard.no": 1, - "oppegård.no": 1, - "or.at": 1, - "or.bi": 1, - "or.ci": 1, - "or.cr": 1, - "or.id": 1, - "or.it": 1, - "or.jp": 1, - "or.ke": 1, - "or.kr": 1, - "or.mu": 1, - "or.na": 1, - "or.pw": 1, - "or.th": 1, - "or.tz": 1, - "or.ug": 1, - "or.us": 1, - "ora.gunma.jp": 1, - "oracle": 1, - "orange": 1, - "orangecloud.tn": 1, - "org": 1, - "org.ac": 1, - "org.ae": 1, - "org.af": 1, - "org.ag": 1, - "org.ai": 1, - "org.al": 1, - "org.am": 1, - "org.ar": 1, - "org.au": 1, - "org.az": 1, - "org.ba": 1, - "org.bb": 1, - "org.bh": 1, - "org.bi": 1, - "org.bj": 1, - "org.bm": 1, - "org.bn": 1, - "org.bo": 1, - "org.br": 1, - "org.bs": 1, - "org.bt": 1, - "org.bw": 1, - "org.bz": 1, - "org.ci": 1, - "org.cn": 1, - "org.co": 1, - "org.cu": 1, - "org.cv": 1, - "org.cw": 1, - "org.cy": 1, - "org.dm": 1, - "org.do": 1, - "org.dz": 1, - "org.ec": 1, - "org.ee": 1, - "org.eg": 1, - "org.es": 1, - "org.et": 1, - "org.fj": 1, - "org.fm": 1, - "org.ge": 1, - "org.gg": 1, - "org.gh": 1, - "org.gi": 1, - "org.gl": 1, - "org.gn": 1, - "org.gp": 1, - "org.gr": 1, - "org.gt": 1, - "org.gu": 1, - "org.gy": 1, - "org.hk": 1, - "org.hn": 1, - "org.ht": 1, - "org.hu": 1, - "org.il": 1, - "org.im": 1, - "org.in": 1, - "org.iq": 1, - "org.ir": 1, - "org.is": 1, - "org.je": 1, - "org.jo": 1, - "org.kg": 1, - "org.ki": 1, - "org.km": 1, - "org.kn": 1, - "org.kp": 1, - "org.kw": 1, - "org.ky": 1, - "org.kz": 1, - "org.la": 1, - "org.lb": 1, - "org.lc": 1, - "org.lk": 1, - "org.lr": 1, - "org.ls": 1, - "org.lv": 1, - "org.ly": 1, - "org.ma": 1, - "org.me": 1, - "org.mg": 1, - "org.mk": 1, - "org.ml": 1, - "org.mn": 1, - "org.mo": 1, - "org.ms": 1, - "org.mt": 1, - "org.mu": 1, - "org.mv": 1, - "org.mw": 1, - "org.mx": 1, - "org.my": 1, - "org.mz": 1, - "org.na": 1, - "org.ng": 1, - "org.ni": 1, - "org.nr": 1, - "org.nz": 1, - "org.om": 1, - "org.pa": 1, - "org.pe": 1, - "org.pf": 1, - "org.ph": 1, - "org.pk": 1, - "org.pl": 1, - "org.pn": 1, - "org.pr": 1, - "org.ps": 1, - "org.pt": 1, - "org.py": 1, - "org.qa": 1, - "org.ro": 1, - "org.rs": 1, - "org.ru": 1, - "org.rw": 1, - "org.sa": 1, - "org.sb": 1, - "org.sc": 1, - "org.sd": 1, - "org.se": 1, - "org.sg": 1, - "org.sh": 1, - "org.sl": 1, - "org.sn": 1, - "org.so": 1, - "org.ss": 1, - "org.st": 1, - "org.sv": 1, - "org.sy": 1, - "org.sz": 1, - "org.tj": 1, - "org.tm": 1, - "org.tn": 1, - "org.to": 1, - "org.tr": 1, - "org.tt": 1, - "org.tw": 1, - "org.ua": 1, - "org.ug": 1, - "org.uk": 1, - "org.uy": 1, - "org.uz": 1, - "org.vc": 1, - "org.ve": 1, - "org.vi": 1, - "org.vn": 1, - "org.vu": 1, - "org.ws": 1, - "org.ye": 1, - "org.yt": 1, - "org.za": 1, - "org.zm": 1, - "org.zw": 1, - "organic": 1, - "origins": 1, - "oristano.it": 1, - "orkanger.no": 1, - "orkdal.no": 1, - "orland.no": 1, - "orsites.com": 1, - "orskog.no": 1, - "orsta.no": 1, - "orx.biz": 1, - "os.hedmark.no": 1, - "os.hordaland.no": 1, - "osaka": 1, - "osaka.jp": 1, - "osakasayama.osaka.jp": 1, - "osaki.miyagi.jp": 1, - "osakikamijima.hiroshima.jp": 1, - "osasco.br": 1, - "oschr.gov.pl": 1, - "osen.no": 1, - "oseto.nagasaki.jp": 1, - "oshima.tokyo.jp": 1, - "oshima.yamaguchi.jp": 1, - "oshino.yamanashi.jp": 1, - "oshu.iwate.jp": 1, - "oslo.no": 1, - "osoyro.no": 1, - "osteroy.no": 1, - "osterøy.no": 1, - "ostre-toten.no": 1, - "ostroda.pl": 1, - "ostroleka.pl": 1, - "ostrowiec.pl": 1, - "ostrowwlkp.pl": 1, - "osøyro.no": 1, - "ot.it": 1, - "ota.gunma.jp": 1, - "ota.tokyo.jp": 1, - "otake.hiroshima.jp": 1, - "otaki.chiba.jp": 1, - "otaki.nagano.jp": 1, - "otaki.saitama.jp": 1, - "otama.fukushima.jp": 1, - "otari.nagano.jp": 1, - "otaru.hokkaido.jp": 1, - "ote.bj": 1, - "other.nf": 1, - "oto.fukuoka.jp": 1, - "otobe.hokkaido.jp": 1, - "otofuke.hokkaido.jp": 1, - "otoineppu.hokkaido.jp": 1, - "otoyo.kochi.jp": 1, - "otsu.shiga.jp": 1, - "otsuchi.iwate.jp": 1, - "otsuka": 1, - "otsuki.kochi.jp": 1, - "otsuki.yamanashi.jp": 1, - "ott": 1, - "ouchi.saga.jp": 1, - "ouda.nara.jp": 1, - "oum.gov.pl": 1, - "oumu.hokkaido.jp": 1, - "outsystemscloud.com": 1, - "overhalla.no": 1, - "ovh": 1, - "ovre-eiker.no": 1, - "owani.aomori.jp": 1, - "owariasahi.aichi.jp": 1, - "own.pm": 1, - "ownip.net": 1, - "ownprovider.com": 1, - "ox.rs": 1, - "oxa.cloud": 1, - "oy.lc": 1, - "oya.to": 1, - "oyabe.toyama.jp": 1, - "oyama.tochigi.jp": 1, - "oyamazaki.kyoto.jp": 1, - "oyer.no": 1, - "oygarden.no": 1, - "oyodo.nara.jp": 1, - "oystre-slidre.no": 1, - "oz.au": 1, - "ozora.hokkaido.jp": 1, - "ozu.ehime.jp": 1, - "ozu.kumamoto.jp": 1, - "p.bg": 1, - "p.se": 1, - "pa": 1, - "pa.gov.br": 1, - "pa.gov.pl": 1, - "pa.it": 1, - "pa.leg.br": 1, - "pa.us": 1, - "paas.beebyte.io": 1, - "paas.datacenter.fi": 1, - "paas.hosted-by-previder.com": 1, - "paas.massivegrid.com": 1, - "padova.it": 1, - "padua.it": 1, - "page": 1, - "pagefrontapp.com": 1, - "pages.dev": 1, - "pages.it.hs-heilbronn.de": 1, - "pages.torproject.net": 1, - "pages.wiardweb.com": 1, - "pagespeedmobilizer.com": 1, - "pagexl.com": 1, - "palermo.it": 1, - "palmas.br": 1, - "panasonic": 1, - "panel.gg": 1, - "pantheonsite.io": 1, - "parachuting.aero": 1, - "paragliding.aero": 1, - "parallel.jp": 1, - "parasite.jp": 1, - "paris": 1, - "paris.eu.org": 1, - "parliament.nz": 1, - "parma.it": 1, - "paroch.k12.ma.us": 1, - "pars": 1, - "parti.se": 1, - "partners": 1, - "parts": 1, - "party": 1, - "passenger-association.aero": 1, - "patria.bo": 1, - "pavia.it": 1, - "pay": 1, - "pb.ao": 1, - "pb.gov.br": 1, - "pb.leg.br": 1, - "pc.it": 1, - "pc.pl": 1, - "pccw": 1, - "pcloud.host": 1, - "pd.it": 1, - "pdns.page": 1, - "pe": 1, - "pe.ca": 1, - "pe.gov.br": 1, - "pe.it": 1, - "pe.kr": 1, - "pe.leg.br": 1, - "pecori.jp": 1, - "peewee.jp": 1, - "penne.jp": 1, - "penza.su": 1, - "pepper.jp": 1, - "per.la": 1, - "per.nf": 1, - "per.sg": 1, - "perma.jp": 1, - "perso.ht": 1, - "perso.sn": 1, - "perso.tn": 1, - "perspecta.cloud": 1, - "perugia.it": 1, - "pesaro-urbino.it": 1, - "pesarourbino.it": 1, - "pescara.it": 1, - "pet": 1, - "pf": 1, - "pfizer": 1, - "pg.in": 1, - "pg.it": 1, - "pgafan.net": 1, - "pgfog.com": 1, - "ph": 1, - "pharmacien.fr": 1, - "pharmaciens.km": 1, - "pharmacy": 1, - "phd": 1, - "philips": 1, - "phone": 1, - "photo": 1, - "photography": 1, - "photos": 1, - "phutho.vn": 1, - "phuyen.vn": 1, - "phx.enscaled.us": 1, - "physio": 1, - "pi.gov.br": 1, - "pi.it": 1, - "pi.leg.br": 1, - "piacenza.it": 1, - "pics": 1, - "pictet": 1, - "pictures": 1, - "pid": 1, - "piedmont.it": 1, - "piemonte.it": 1, - "pigboat.jp": 1, - "pila.pl": 1, - "pilot.aero": 1, - "pimienta.org": 1, - "pin": 1, - "pinb.gov.pl": 1, - "ping": 1, - "pink": 1, - "pinoko.jp": 1, - "pioneer": 1, - "pippu.hokkaido.jp": 1, - "pisa.it": 1, - "pistoia.it": 1, - "pisz.pl": 1, - "piw.gov.pl": 1, - "pixolino.com": 1, - "pizza": 1, - "pk": 1, - "pl": 1, - "pl.eu.org": 1, - "pl.ua": 1, - "place": 1, - "platform0.app": 1, - "platter-app.com": 1, - "platter-app.dev": 1, - "platterp.us": 1, - "play": 1, - "playstation": 1, - "playstation-cloud.com": 1, - "plc.co.im": 1, - "plc.ly": 1, - "plc.uk": 1, - "plesk.page": 1, - "pleskns.com": 1, - "plo.ps": 1, - "plumbing": 1, - "plurinacional.bo": 1, - "plus": 1, - "pm": 1, - "pmn.it": 1, - "pn": 1, - "pn.it": 1, - "pnc": 1, - "po.gov.pl": 1, - "po.it": 1, - "poa.br": 1, - "podhale.pl": 1, - "podlasie.pl": 1, - "podzone.net": 1, - "podzone.org": 1, - "pohl": 1, - "point2this.com": 1, - "pointto.us": 1, - "poivron.org": 1, - "poker": 1, - "pokrovsk.su": 1, - "pol.dz": 1, - "pol.ht": 1, - "pol.tr": 1, - "police.uk": 1, - "politica.bo": 1, - "politie": 1, - "polkowice.pl": 1, - "poltava.ua": 1, - "pomorskie.pl": 1, - "pomorze.pl": 1, - "poniatowa.pl": 1, - "ponpes.id": 1, - "pordenone.it": 1, - "porn": 1, - "porsanger.no": 1, - "porsangu.no": 1, - "porsgrunn.no": 1, - "porsáŋgu.no": 1, - "port.fr": 1, - "post": 1, - "post.in": 1, - "postman-echo.com": 1, - "potager.org": 1, - "potenza.it": 1, - "powiat.pl": 1, - "poznan.pl": 1, - "pp.az": 1, - "pp.ru": 1, - "pp.se": 1, - "pp.ua": 1, - "ppg.br": 1, - "pr": 1, - "pr.gov.br": 1, - "pr.gov.pl": 1, - "pr.it": 1, - "pr.leg.br": 1, - "pr.us": 1, - "pramerica": 1, - "prato.it": 1, - "praxi": 1, - "prd.fr": 1, - "prd.km": 1, - "prd.mg": 1, - "prequalifyme.today": 1, - "press": 1, - "press.aero": 1, - "press.cy": 1, - "press.ma": 1, - "press.se": 1, - "presse.ci": 1, - "presse.km": 1, - "presse.ml": 1, - "pri.ee": 1, - "prime": 1, - "primetel.cloud": 1, - "principe.st": 1, - "priv.at": 1, - "priv.hu": 1, - "priv.instances.scw.cloud": 1, - "priv.me": 1, - "priv.no": 1, - "priv.pl": 1, - "privatelink.snowflake.app": 1, - "privatizehealthinsurance.net": 1, - "pro": 1, - "pro.az": 1, - "pro.br": 1, - "pro.cy": 1, - "pro.ec": 1, - "pro.fj": 1, - "pro.ht": 1, - "pro.in": 1, - "pro.mv": 1, - "pro.na": 1, - "pro.om": 1, - "pro.pr": 1, - "pro.tt": 1, - "pro.typeform.com": 1, - "pro.vn": 1, - "prochowice.pl": 1, - "prod": 1, - "production.aero": 1, - "productions": 1, - "prof": 1, - "prof.pr": 1, - "profesional.bo": 1, - "progressive": 1, - "promo": 1, - "properties": 1, - "property": 1, - "protection": 1, - "protonet.io": 1, - "pru": 1, - "prudential": 1, - "pruszkow.pl": 1, - "prvcy.page": 1, - "przeworsk.pl": 1, - "ps": 1, - "psc.br": 1, - "psi.br": 1, - "psp.gov.pl": 1, - "psse.gov.pl": 1, - "pstmn.io": 1, - "pt": 1, - "pt.eu.org": 1, - "pt.it": 1, - "pu.it": 1, - "pub": 1, - "pub.instances.scw.cloud": 1, - "pub.sa": 1, - "publ.pt": 1, - "public-inquiry.uk": 1, - "publishproxy.com": 1, - "pubtls.org": 1, - "pueblo.bo": 1, - "pug.it": 1, - "puglia.it": 1, - "pulawy.pl": 1, - "punyu.jp": 1, - "pup.gov.pl": 1, - "pupu.jp": 1, - "pussycat.jp": 1, - "pv.it": 1, - "pvh.br": 1, - "pvt.ge": 1, - "pvt.k12.ma.us": 1, - "pw": 1, - "pwc": 1, - "py": 1, - "pya.jp": 1, - "pyatigorsk.ru": 1, - "pymnt.uk": 1, - "pythonanywhere.com": 1, - "pz.it": 1, - "q-a.eu.org": 1, - "q.bg": 1, - "qa": 1, - "qa2.com": 1, - "qbuser.com": 1, - "qc.ca": 1, - "qc.com": 1, - "qcx.io": 1, - "qh.cn": 1, - "qld.au": 1, - "qld.edu.au": 1, - "qld.gov.au": 1, - "qoto.io": 1, - "qpon": 1, - "qsl.br": 1, - "qualifioapp.com": 1, - "quangbinh.vn": 1, - "quangnam.vn": 1, - "quangngai.vn": 1, - "quangninh.vn": 1, - "quangtri.vn": 1, - "quebec": 1, - "quest": 1, - "quicksytes.com": 1, - "r.bg": 1, - "r.cdn77.net": 1, - "r.se": 1, - "r2.dev": 1, - "ra.it": 1, - "racing": 1, - "rackmaze.com": 1, - "rackmaze.net": 1, - "rade.no": 1, - "radio": 1, - "radio.am": 1, - "radio.br": 1, - "radio.fm": 1, - "radom.pl": 1, - "radoy.no": 1, - "radøy.no": 1, - "raffleentry.org.uk": 1, - "rag-cloud-ch.hosteur.com": 1, - "rag-cloud.hosteur.com": 1, - "ragusa.it": 1, - "rahkkeravju.no": 1, - "raholt.no": 1, - "raindrop.jp": 1, - "raisa.no": 1, - "rakkestad.no": 1, - "ralingen.no": 1, - "rana.no": 1, - "randaberg.no": 1, - "rankoshi.hokkaido.jp": 1, - "ranzan.saitama.jp": 1, - "rar.ve": 1, - "ras.ru": 1, - "rauma.no": 1, - "ravendb.cloud": 1, - "ravendb.community": 1, - "ravendb.me": 1, - "ravendb.run": 1, - "ravenna.it": 1, - "ravpage.co.il": 1, - "rawa-maz.pl": 1, - "rc.it": 1, - "rdv.to": 1, - "rdy.jp": 1, - "re": 1, - "re.it": 1, - "re.kr": 1, - "read": 1, - "read-books.org": 1, - "readmyblog.org": 1, - "readthedocs.io": 1, - "readymade.jp": 1, - "realestate": 1, - "realestate.pl": 1, - "realm.cz": 1, - "realtor": 1, - "realty": 1, - "rebun.hokkaido.jp": 1, - "rec.br": 1, - "rec.co": 1, - "rec.nf": 1, - "rec.ro": 1, - "rec.ve": 1, - "recht.pro": 1, - "recife.br": 1, - "recipes": 1, - "recreation.aero": 1, - "red": 1, - "red.sv": 1, - "redirectme.net": 1, - "redstone": 1, - "redumbrella": 1, - "reg.dk": 1, - "reggio-calabria.it": 1, - "reggio-emilia.it": 1, - "reggiocalabria.it": 1, - "reggioemilia.it": 1, - "rehab": 1, - "reise": 1, - "reisen": 1, - "reit": 1, - "reklam.hu": 1, - "rel.ht": 1, - "rel.pl": 1, - "reliance": 1, - "remotewd.com": 1, - "ren": 1, - "rendalen.no": 1, - "rennebu.no": 1, - "rennesoy.no": 1, - "rennesøy.no": 1, - "rent": 1, - "rentals": 1, - "rep.br": 1, - "rep.kp": 1, - "repair": 1, - "repbody.aero": 1, - "repl.co": 1, - "repl.run": 1, - "report": 1, - "republican": 1, - "res.aero": 1, - "res.in": 1, - "research.aero": 1, - "reservd.com": 1, - "reservd.dev.thingdust.io": 1, - "reservd.disrec.thingdust.io": 1, - "reservd.testing.thingdust.io": 1, - "reserve-online.com": 1, - "reserve-online.net": 1, - "resindevice.io": 1, - "rest": 1, - "restaurant": 1, - "restaurant.bj": 1, - "resto.bj": 1, - "review": 1, - "reviews": 1, - "revista.bo": 1, - "rexroth": 1, - "rg.it": 1, - "rgr.jp": 1, - "rhcloud.com": 1, - "ri.it": 1, - "ri.us": 1, - "ribeirao.br": 1, - "ric.jelastic.vps-host.net": 1, - "rich": 1, - "richardli": 1, - "ricoh": 1, - "rieti.it": 1, - "rifu.miyagi.jp": 1, - "riik.ee": 1, - "rikubetsu.hokkaido.jp": 1, - "rikuzentakata.iwate.jp": 1, - "ril": 1, - "rimini.it": 1, - "rindal.no": 1, - "ringebu.no": 1, - "ringerike.no": 1, - "ringsaker.no": 1, - "rio": 1, - "rio.br": 1, - "riobranco.br": 1, - "riopreto.br": 1, - "rip": 1, - "rishiri.hokkaido.jp": 1, - "rishirifuji.hokkaido.jp": 1, - "risor.no": 1, - "rissa.no": 1, - "risør.no": 1, - "ritto.shiga.jp": 1, - "rivne.ua": 1, - "rj.gov.br": 1, - "rj.leg.br": 1, - "rl.no": 1, - "rm.it": 1, - "rn.gov.br": 1, - "rn.it": 1, - "rn.leg.br": 1, - "ro": 1, - "ro.eu.org": 1, - "ro.gov.br": 1, - "ro.im": 1, - "ro.it": 1, - "ro.leg.br": 1, - "roan.no": 1, - "rocher": 1, - "rocks": 1, - "rocky.page": 1, - "rodeo": 1, - "rodoy.no": 1, - "rogers": 1, - "rokunohe.aomori.jp": 1, - "rollag.no": 1, - "roma.it": 1, - "rome.it": 1, - "romsa.no": 1, - "romskog.no": 1, - "room": 1, - "roros.no": 1, - "rost.no": 1, - "rotorcraft.aero": 1, - "router.management": 1, - "rovigo.it": 1, - "rovno.ua": 1, - "royal-commission.uk": 1, - "royken.no": 1, - "royrvik.no": 1, - "rr.gov.br": 1, - "rr.leg.br": 1, - "rs": 1, - "rs.ba": 1, - "rs.gov.br": 1, - "rs.leg.br": 1, - "rs.webaccel.jp": 1, - "rsc.cdn77.org": 1, - "rsvp": 1, - "ru": 1, - "ru.com": 1, - "ru.eu.org": 1, - "ru.net": 1, - "rugby": 1, - "ruhr": 1, - "rulez.jp": 1, - "run": 1, - "run.app": 1, - "ruovat.no": 1, - "rv.ua": 1, - "rw": 1, - "rwe": 1, - "rybnik.pl": 1, - "ryd.wafaicloud.com": 1, - "rygge.no": 1, - "ryokami.saitama.jp": 1, - "ryugasaki.ibaraki.jp": 1, - "ryukyu": 1, - "ryuoh.shiga.jp": 1, - "rzeszow.pl": 1, - "rzgw.gov.pl": 1, - "ráhkkerávju.no": 1, - "ráisa.no": 1, - "råde.no": 1, - "råholt.no": 1, - "rælingen.no": 1, - "rødøy.no": 1, - "rømskog.no": 1, - "røros.no": 1, - "røst.no": 1, - "røyken.no": 1, - "røyrvik.no": 1, - "s.bg": 1, - "s.se": 1, - "s3-ap-northeast-1.amazonaws.com": 1, - "s3-ap-northeast-2.amazonaws.com": 1, - "s3-ap-south-1.amazonaws.com": 1, - "s3-ap-southeast-1.amazonaws.com": 1, - "s3-ap-southeast-2.amazonaws.com": 1, - "s3-ca-central-1.amazonaws.com": 1, - "s3-eu-central-1.amazonaws.com": 1, - "s3-eu-west-1.amazonaws.com": 1, - "s3-eu-west-2.amazonaws.com": 1, - "s3-eu-west-3.amazonaws.com": 1, - "s3-external-1.amazonaws.com": 1, - "s3-fips-us-gov-west-1.amazonaws.com": 1, - "s3-sa-east-1.amazonaws.com": 1, - "s3-us-east-2.amazonaws.com": 1, - "s3-us-gov-west-1.amazonaws.com": 1, - "s3-us-west-1.amazonaws.com": 1, - "s3-us-west-2.amazonaws.com": 1, - "s3-website-ap-northeast-1.amazonaws.com": 1, - "s3-website-ap-southeast-1.amazonaws.com": 1, - "s3-website-ap-southeast-2.amazonaws.com": 1, - "s3-website-eu-west-1.amazonaws.com": 1, - "s3-website-sa-east-1.amazonaws.com": 1, - "s3-website-us-east-1.amazonaws.com": 1, - "s3-website-us-west-1.amazonaws.com": 1, - "s3-website-us-west-2.amazonaws.com": 1, - "s3-website.ap-northeast-2.amazonaws.com": 1, - "s3-website.ap-south-1.amazonaws.com": 1, - "s3-website.ca-central-1.amazonaws.com": 1, - "s3-website.eu-central-1.amazonaws.com": 1, - "s3-website.eu-west-2.amazonaws.com": 1, - "s3-website.eu-west-3.amazonaws.com": 1, - "s3-website.fr-par.scw.cloud": 1, - "s3-website.nl-ams.scw.cloud": 1, - "s3-website.pl-waw.scw.cloud": 1, - "s3-website.us-east-2.amazonaws.com": 1, - "s3.amazonaws.com": 1, - "s3.ap-northeast-2.amazonaws.com": 1, - "s3.ap-south-1.amazonaws.com": 1, - "s3.ca-central-1.amazonaws.com": 1, - "s3.cn-north-1.amazonaws.com.cn": 1, - "s3.dualstack.ap-northeast-1.amazonaws.com": 1, - "s3.dualstack.ap-northeast-2.amazonaws.com": 1, - "s3.dualstack.ap-south-1.amazonaws.com": 1, - "s3.dualstack.ap-southeast-1.amazonaws.com": 1, - "s3.dualstack.ap-southeast-2.amazonaws.com": 1, - "s3.dualstack.ca-central-1.amazonaws.com": 1, - "s3.dualstack.eu-central-1.amazonaws.com": 1, - "s3.dualstack.eu-west-1.amazonaws.com": 1, - "s3.dualstack.eu-west-2.amazonaws.com": 1, - "s3.dualstack.eu-west-3.amazonaws.com": 1, - "s3.dualstack.sa-east-1.amazonaws.com": 1, - "s3.dualstack.us-east-1.amazonaws.com": 1, - "s3.dualstack.us-east-2.amazonaws.com": 1, - "s3.eu-central-1.amazonaws.com": 1, - "s3.eu-west-2.amazonaws.com": 1, - "s3.eu-west-3.amazonaws.com": 1, - "s3.fr-par.scw.cloud": 1, - "s3.isk01.sakurastorage.jp": 1, - "s3.isk02.sakurastorage.jp": 1, - "s3.nl-ams.scw.cloud": 1, - "s3.pl-waw.scw.cloud": 1, - "s3.teckids.org": 1, - "s3.us-east-2.amazonaws.com": 1, - "sa": 1, - "sa-east-1.elasticbeanstalk.com": 1, - "sa.au": 1, - "sa.com": 1, - "sa.cr": 1, - "sa.edu.au": 1, - "sa.gov.au": 1, - "sa.gov.pl": 1, - "sa.it": 1, - "sa.ngrok.io": 1, - "saarland": 1, - "sabae.fukui.jp": 1, - "sadist.jp": 1, - "sado.niigata.jp": 1, - "safe": 1, - "safety": 1, - "safety.aero": 1, - "saga.jp": 1, - "saga.saga.jp": 1, - "sagae.yamagata.jp": 1, - "sagamihara.kanagawa.jp": 1, - "saigawa.fukuoka.jp": 1, - "saijo.ehime.jp": 1, - "saikai.nagasaki.jp": 1, - "saiki.oita.jp": 1, - "saitama.jp": 1, - "saitama.saitama.jp": 1, - "saito.miyazaki.jp": 1, - "saka.hiroshima.jp": 1, - "sakado.saitama.jp": 1, - "sakae.chiba.jp": 1, - "sakae.nagano.jp": 1, - "sakahogi.gifu.jp": 1, - "sakai.fukui.jp": 1, - "sakai.ibaraki.jp": 1, - "sakai.osaka.jp": 1, - "sakaiminato.tottori.jp": 1, - "sakaki.nagano.jp": 1, - "sakata.yamagata.jp": 1, - "sakawa.kochi.jp": 1, - "sakegawa.yamagata.jp": 1, - "saku.nagano.jp": 1, - "sakuho.nagano.jp": 1, - "sakura": 1, - "sakura.chiba.jp": 1, - "sakura.ne.jp": 1, - "sakura.tochigi.jp": 1, - "sakura.tv": 1, - "sakuragawa.ibaraki.jp": 1, - "sakurai.nara.jp": 1, - "sakuratan.com": 1, - "sakuraweb.com": 1, - "sakyo.kyoto.jp": 1, - "salangen.no": 1, - "salat.no": 1, - "sale": 1, - "salerno.it": 1, - "salon": 1, - "saloon.jp": 1, - "saltdal.no": 1, - "salud.bo": 1, - "salvador.br": 1, - "samegawa.fukushima.jp": 1, - "samnanger.no": 1, - "sampa.br": 1, - "samsclub": 1, - "samsung": 1, - "samukawa.kanagawa.jp": 1, - "sanagochi.tokushima.jp": 1, - "sanda.hyogo.jp": 1, - "sandcats.io": 1, - "sande.more-og-romsdal.no": 1, - "sande.møre-og-romsdal.no": 1, - "sande.vestfold.no": 1, - "sandefjord.no": 1, - "sandnes.no": 1, - "sandnessjoen.no": 1, - "sandnessjøen.no": 1, - "sandoy.no": 1, - "sandvik": 1, - "sandvikcoromant": 1, - "sandøy.no": 1, - "sango.nara.jp": 1, - "sanjo.niigata.jp": 1, - "sannan.hyogo.jp": 1, - "sannohe.aomori.jp": 1, - "sano.tochigi.jp": 1, - "sanofi": 1, - "sanok.pl": 1, - "santamaria.br": 1, - "santoandre.br": 1, - "sanuki.kagawa.jp": 1, - "saobernardo.br": 1, - "saogonca.br": 1, - "saotome.st": 1, - "sap": 1, - "sar.it": 1, - "sardegna.it": 1, - "sardinia.it": 1, - "sarl": 1, - "saroma.hokkaido.jp": 1, - "sarpsborg.no": 1, - "sarufutsu.hokkaido.jp": 1, - "sas": 1, - "sasaguri.fukuoka.jp": 1, - "sasayama.hyogo.jp": 1, - "sasebo.nagasaki.jp": 1, - "sassari.it": 1, - "satosho.okayama.jp": 1, - "satsumasendai.kagoshima.jp": 1, - "satte.saitama.jp": 1, - "sauda.no": 1, - "sauherad.no": 1, - "save": 1, - "saves-the-whales.com": 1, - "savona.it": 1, - "saxo": 1, - "sayama.osaka.jp": 1, - "sayama.saitama.jp": 1, - "sayo.hyogo.jp": 1, - "sb": 1, - "sb.ua": 1, - "sbi": 1, - "sblo.jp": 1, - "sbs": 1, - "sc": 1, - "sc.cn": 1, - "sc.gov.br": 1, - "sc.ke": 1, - "sc.kr": 1, - "sc.leg.br": 1, - "sc.ls": 1, - "sc.tz": 1, - "sc.ug": 1, - "sc.us": 1, - "sca": 1, - "scalebook.scw.cloud": 1, - "scb": 1, - "sch.ae": 1, - "sch.id": 1, - "sch.ir": 1, - "sch.jo": 1, - "sch.lk": 1, - "sch.ly": 1, - "sch.ng": 1, - "sch.qa": 1, - "sch.sa": 1, - "sch.so": 1, - "sch.ss": 1, - "sch.tf": 1, - "sch.wf": 1, - "sch.zm": 1, - "schaeffler": 1, - "schmidt": 1, - "schokokeks.net": 1, - "scholarships": 1, - "school": 1, - "school.na": 1, - "school.nz": 1, - "school.za": 1, - "schoolbus.jp": 1, - "schools.nsw.edu.au": 1, - "schule": 1, - "schulplattform.de": 1, - "schulserver.de": 1, - "schwarz": 1, - "sci.eg": 1, - "science": 1, - "scientist.aero": 1, - "scot": 1, - "scrapper-site.net": 1, - "scrapping.cc": 1, - "scrysec.com": 1, - "sd": 1, - "sd.cn": 1, - "sd.us": 1, - "sdn.gov.pl": 1, - "sdscloud.pl": 1, - "se": 1, - "se.eu.org": 1, - "se.gov.br": 1, - "se.leg.br": 1, - "se.net": 1, - "search": 1, - "seat": 1, - "sebastopol.ua": 1, - "sec.ps": 1, - "secaas.hk": 1, - "secret.jp": 1, - "secure": 1, - "security": 1, - "securitytactics.com": 1, - "seek": 1, - "seg.br": 1, - "seidat.net": 1, - "seihi.nagasaki.jp": 1, - "seika.kyoto.jp": 1, - "seiro.niigata.jp": 1, - "seirou.niigata.jp": 1, - "seiyo.ehime.jp": 1, - "sejny.pl": 1, - "sekd1.beebyteapp.io": 1, - "seki.gifu.jp": 1, - "sekigahara.gifu.jp": 1, - "sekikawa.niigata.jp": 1, - "sel.no": 1, - "selbu.no": 1, - "select": 1, - "selfip.biz": 1, - "selfip.com": 1, - "selfip.info": 1, - "selfip.net": 1, - "selfip.org": 1, - "selje.no": 1, - "seljord.no": 1, - "sellfy.store": 1, - "sells-for-less.com": 1, - "sells-for-u.com": 1, - "sells-it.net": 1, - "sellsyourhome.org": 1, - "semboku.akita.jp": 1, - "semine.miyagi.jp": 1, - "senasa.ar": 1, - "sener": 1, - "sennan.osaka.jp": 1, - "senseering.net": 1, - "seoul.kr": 1, - "sera.hiroshima.jp": 1, - "seranishi.hiroshima.jp": 1, - "servebbs.com": 1, - "servebbs.net": 1, - "servebbs.org": 1, - "servebeer.com": 1, - "serveblog.net": 1, - "servecounterstrike.com": 1, - "serveexchange.com": 1, - "serveftp.com": 1, - "serveftp.net": 1, - "serveftp.org": 1, - "servegame.com": 1, - "servegame.org": 1, - "servehalflife.com": 1, - "servehttp.com": 1, - "servehumour.com": 1, - "serveirc.com": 1, - "serveminecraft.net": 1, - "servemp3.com": 1, - "servep2p.com": 1, - "servepics.com": 1, - "servequake.com": 1, - "servers.run": 1, - "servesarcasm.com": 1, - "service.gov.scot": 1, - "service.gov.uk": 1, - "service.one": 1, - "services": 1, - "services.aero": 1, - "setagaya.tokyo.jp": 1, - "seto.aichi.jp": 1, - "setouchi.okayama.jp": 1, - "settsu.osaka.jp": 1, - "sevastopol.ua": 1, - "seven": 1, - "sew": 1, - "sex": 1, - "sex.hu": 1, - "sex.pl": 1, - "sexy": 1, - "sf.no": 1, - "sfr": 1, - "sg": 1, - "sg-1.paas.massivegrid.net": 1, - "sh": 1, - "sh.cn": 1, - "shacknet.nu": 1, - "shakotan.hokkaido.jp": 1, - "shangrila": 1, - "shari.hokkaido.jp": 1, - "sharp": 1, - "shaw": 1, - "shell": 1, - "shia": 1, - "shibata.miyagi.jp": 1, - "shibata.niigata.jp": 1, - "shibecha.hokkaido.jp": 1, - "shibetsu.hokkaido.jp": 1, - "shibukawa.gunma.jp": 1, - "shibuya.tokyo.jp": 1, - "shichikashuku.miyagi.jp": 1, - "shichinohe.aomori.jp": 1, - "shiftcrypto.dev": 1, - "shiftcrypto.io": 1, - "shiftedit.io": 1, - "shiga.jp": 1, - "shiiba.miyazaki.jp": 1, - "shijonawate.osaka.jp": 1, - "shika.ishikawa.jp": 1, - "shikabe.hokkaido.jp": 1, - "shikama.miyagi.jp": 1, - "shikaoi.hokkaido.jp": 1, - "shikatsu.aichi.jp": 1, - "shiki.saitama.jp": 1, - "shikokuchuo.ehime.jp": 1, - "shiksha": 1, - "shima.mie.jp": 1, - "shimabara.nagasaki.jp": 1, - "shimada.shizuoka.jp": 1, - "shimamaki.hokkaido.jp": 1, - "shimamoto.osaka.jp": 1, - "shimane.jp": 1, - "shimane.shimane.jp": 1, - "shimizu.hokkaido.jp": 1, - "shimizu.shizuoka.jp": 1, - "shimoda.shizuoka.jp": 1, - "shimodate.ibaraki.jp": 1, - "shimofusa.chiba.jp": 1, - "shimogo.fukushima.jp": 1, - "shimoichi.nara.jp": 1, - "shimoji.okinawa.jp": 1, - "shimokawa.hokkaido.jp": 1, - "shimokitayama.nara.jp": 1, - "shimonita.gunma.jp": 1, - "shimonoseki.yamaguchi.jp": 1, - "shimosuwa.nagano.jp": 1, - "shimotsuke.tochigi.jp": 1, - "shimotsuma.ibaraki.jp": 1, - "shinagawa.tokyo.jp": 1, - "shinanomachi.nagano.jp": 1, - "shingo.aomori.jp": 1, - "shingu.fukuoka.jp": 1, - "shingu.hyogo.jp": 1, - "shingu.wakayama.jp": 1, - "shinichi.hiroshima.jp": 1, - "shinjo.nara.jp": 1, - "shinjo.okayama.jp": 1, - "shinjo.yamagata.jp": 1, - "shinjuku.tokyo.jp": 1, - "shinkamigoto.nagasaki.jp": 1, - "shinonsen.hyogo.jp": 1, - "shinshinotsu.hokkaido.jp": 1, - "shinshiro.aichi.jp": 1, - "shinto.gunma.jp": 1, - "shintoku.hokkaido.jp": 1, - "shintomi.miyazaki.jp": 1, - "shinyoshitomi.fukuoka.jp": 1, - "shiogama.miyagi.jp": 1, - "shiojiri.nagano.jp": 1, - "shioya.tochigi.jp": 1, - "shirahama.wakayama.jp": 1, - "shirakawa.fukushima.jp": 1, - "shirakawa.gifu.jp": 1, - "shirako.chiba.jp": 1, - "shiranuka.hokkaido.jp": 1, - "shiraoi.hokkaido.jp": 1, - "shiraoka.saitama.jp": 1, - "shirataka.yamagata.jp": 1, - "shiriuchi.hokkaido.jp": 1, - "shiroi.chiba.jp": 1, - "shiroishi.miyagi.jp": 1, - "shiroishi.saga.jp": 1, - "shirosato.ibaraki.jp": 1, - "shishikui.tokushima.jp": 1, - "shiso.hyogo.jp": 1, - "shisui.chiba.jp": 1, - "shitara.aichi.jp": 1, - "shiwa.iwate.jp": 1, - "shizukuishi.iwate.jp": 1, - "shizuoka.jp": 1, - "shizuoka.shizuoka.jp": 1, - "shobara.hiroshima.jp": 1, - "shoes": 1, - "shonai.fukuoka.jp": 1, - "shonai.yamagata.jp": 1, - "shoo.okayama.jp": 1, - "shop": 1, - "shop.brendly.rs": 1, - "shop.ht": 1, - "shop.hu": 1, - "shop.pl": 1, - "shop.ro": 1, - "shop.th": 1, - "shoparena.pl": 1, - "shopitsite.com": 1, - "shopping": 1, - "shopselect.net": 1, - "shopware.store": 1, - "shouji": 1, - "show": 1, - "show.aero": 1, - "showa.fukushima.jp": 1, - "showa.gunma.jp": 1, - "showa.yamanashi.jp": 1, - "showtime": 1, - "shunan.yamaguchi.jp": 1, - "shw.io": 1, - "si": 1, - "si.eu.org": 1, - "si.it": 1, - "sic.it": 1, - "sicilia.it": 1, - "sicily.it": 1, - "siellak.no": 1, - "siena.it": 1, - "sigdal.no": 1, - "siiites.com": 1, - "siljan.no": 1, - "silk": 1, - "simple-url.com": 1, - "simplesite.com": 1, - "simplesite.com.br": 1, - "simplesite.gr": 1, - "simplesite.pl": 1, - "sina": 1, - "sinaapp.com": 1, - "singles": 1, - "siracusa.it": 1, - "sirdal.no": 1, - "site": 1, - "site.tb-hosting.com": 1, - "site.transip.me": 1, - "siteleaf.net": 1, - "sites.static.land": 1, - "sj": 1, - "sjc.br": 1, - "sk": 1, - "sk.ca": 1, - "sk.eu.org": 1, - "skanit.no": 1, - "skanland.no": 1, - "skaun.no": 1, - "skedsmo.no": 1, - "skedsmokorset.no": 1, - "ski": 1, - "ski.no": 1, - "skien.no": 1, - "skierva.no": 1, - "skiervá.no": 1, - "skin": 1, - "skiptvet.no": 1, - "skjak.no": 1, - "skjervoy.no": 1, - "skjervøy.no": 1, - "skjåk.no": 1, - "sklep.pl": 1, - "sko.gov.pl": 1, - "skoczow.pl": 1, - "skodje.no": 1, - "skr.jp": 1, - "sky": 1, - "skydiving.aero": 1, - "skygearapp.com": 1, - "skype": 1, - "skánit.no": 1, - "skånland.no": 1, - "sl": 1, - "slask.pl": 1, - "slattum.no": 1, - "sld.do": 1, - "sld.pa": 1, - "slg.br": 1, - "sling": 1, - "slupsk.pl": 1, - "slz.br": 1, - "sm": 1, - "sm.ua": 1, - "small-web.org": 1, - "smart": 1, - "smartlabeling.scw.cloud": 1, - "smile": 1, - "smola.no": 1, - "smushcdn.com": 1, - "smøla.no": 1, - "sn": 1, - "sn.cn": 1, - "snaase.no": 1, - "snasa.no": 1, - "sncf": 1, - "snillfjord.no": 1, - "snoasa.no": 1, - "snowflake.app": 1, - "snåase.no": 1, - "snåsa.no": 1, - "so": 1, - "so.gov.pl": 1, - "so.it": 1, - "sobetsu.hokkaido.jp": 1, - "soc.dz": 1, - "soc.lk": 1, - "soc.srcf.net": 1, - "soccer": 1, - "sochi.su": 1, - "social": 1, - "soctrang.vn": 1, - "sodegaura.chiba.jp": 1, - "soeda.fukuoka.jp": 1, - "softbank": 1, - "software": 1, - "software.aero": 1, - "sogndal.no": 1, - "sogne.no": 1, - "sohu": 1, - "soja.okayama.jp": 1, - "soka.saitama.jp": 1, - "sokndal.no": 1, - "sola.no": 1, - "solar": 1, - "solund.no": 1, - "solutions": 1, - "soma.fukushima.jp": 1, - "somna.no": 1, - "sondre-land.no": 1, - "sondrio.it": 1, - "song": 1, - "songdalen.no": 1, - "soni.nara.jp": 1, - "sonla.vn": 1, - "sony": 1, - "soo.kagoshima.jp": 1, - "sopot.pl": 1, - "sor-aurdal.no": 1, - "sor-fron.no": 1, - "sor-odal.no": 1, - "sor-varanger.no": 1, - "sorfold.no": 1, - "sorocaba.br": 1, - "sorreisa.no": 1, - "sortland.no": 1, - "sorum.no": 1, - "sos.pl": 1, - "sosa.chiba.jp": 1, - "sosnowiec.pl": 1, - "soundcast.me": 1, - "sowa.ibaraki.jp": 1, - "soy": 1, - "sp.gov.br": 1, - "sp.it": 1, - "sp.leg.br": 1, - "spa": 1, - "space": 1, - "space-to-rent.com": 1, - "spacekit.io": 1, - "spb.ru": 1, - "spb.su": 1, - "spdns.de": 1, - "spdns.eu": 1, - "spdns.org": 1, - "sphinx.mythic-beasts.com": 1, - "spjelkavik.no": 1, - "sport": 1, - "sport.hu": 1, - "spot": 1, - "spydeberg.no": 1, - "square7.ch": 1, - "square7.de": 1, - "square7.net": 1, - "squares.net": 1, - "sr": 1, - "sr.gov.pl": 1, - "sr.it": 1, - "srht.site": 1, - "srl": 1, - "srv.br": 1, - "ss": 1, - "ss.it": 1, - "ssl.origin.cdn77-secure.org": 1, - "st": 1, - "st.no": 1, - "staba.jp": 1, - "stackhero-network.com": 1, - "stada": 1, - "stage.nodeart.io": 1, - "staging.onred.one": 1, - "stalowa-wola.pl": 1, - "stange.no": 1, - "staples": 1, - "star": 1, - "starachowice.pl": 1, - "stargard.pl": 1, - "starostwo.gov.pl": 1, - "stat.no": 1, - "statebank": 1, - "statefarm": 1, - "stathelle.no": 1, - "static-access.net": 1, - "static.land": 1, - "static.observableusercontent.com": 1, - "stavanger.no": 1, - "stavern.no": 1, - "stc": 1, - "stcgroup": 1, - "steigen.no": 1, - "steinkjer.no": 1, - "sth.ac.at": 1, - "stjordal.no": 1, - "stjordalshalsen.no": 1, - "stjørdal.no": 1, - "stjørdalshalsen.no": 1, - "stockholm": 1, - "stokke.no": 1, - "stor-elvdal.no": 1, - "storage": 1, - "storage.yandexcloud.net": 1, - "stord.no": 1, - "stordal.no": 1, - "store": 1, - "store.bb": 1, - "store.dk": 1, - "store.nf": 1, - "store.ro": 1, - "store.st": 1, - "store.ve": 1, - "storebase.store": 1, - "storfjord.no": 1, - "storipress.app": 1, - "storj.farm": 1, - "strand.no": 1, - "stranda.no": 1, - "stream": 1, - "streamlit.app": 1, - "streamlitapp.com": 1, - "stripper.jp": 1, - "stryn.no": 1, - "student.aero": 1, - "studio": 1, - "study": 1, - "stuff-4-sale.org": 1, - "stuff-4-sale.us": 1, - "stufftoread.com": 1, - "style": 1, - "su": 1, - "su.paba.se": 1, - "sub.jp": 1, - "sucks": 1, - "sue.fukuoka.jp": 1, - "suedtirol.it": 1, - "suginami.tokyo.jp": 1, - "sugito.saitama.jp": 1, - "suifu.ibaraki.jp": 1, - "suita.osaka.jp": 1, - "sukagawa.fukushima.jp": 1, - "sukumo.kochi.jp": 1, - "sula.no": 1, - "suldal.no": 1, - "suli.hu": 1, - "sumida.tokyo.jp": 1, - "sumita.iwate.jp": 1, - "sumomo.ne.jp": 1, - "sumoto.hyogo.jp": 1, - "sumoto.kumamoto.jp": 1, - "sumy.ua": 1, - "sunagawa.hokkaido.jp": 1, - "sund.no": 1, - "sunndal.no": 1, - "sunnyday.jp": 1, - "supabase.co": 1, - "supabase.in": 1, - "supabase.net": 1, - "supersale.jp": 1, - "supplies": 1, - "supply": 1, - "support": 1, - "surf": 1, - "surgery": 1, - "surnadal.no": 1, - "susaki.kochi.jp": 1, - "susono.shizuoka.jp": 1, - "suwa.nagano.jp": 1, - "suwalki.pl": 1, - "suzaka.nagano.jp": 1, - "suzu.ishikawa.jp": 1, - "suzuka.mie.jp": 1, - "suzuki": 1, - "sv": 1, - "sv.it": 1, - "svalbard.no": 1, - "sveio.no": 1, - "svelvik.no": 1, - "svn-repos.de": 1, - "swatch": 1, - "sweetpepper.org": 1, - "swidnica.pl": 1, - "swidnik.pl": 1, - "swiebodzin.pl": 1, - "swinoujscie.pl": 1, - "swiss": 1, - "sx": 1, - "sx.cn": 1, - "sy": 1, - "sydney": 1, - "sykkylven.no": 1, - "syncloud.it": 1, - "syno-ds.de": 1, - "synology-diskstation.de": 1, - "synology-ds.de": 1, - "synology.me": 1, - "systems": 1, - "sytes.net": 1, - "sz": 1, - "szczecin.pl": 1, - "szczytno.pl": 1, - "szex.hu": 1, - "szkola.pl": 1, - "sálat.no": 1, - "sálát.no": 1, - "søgne.no": 1, - "sømna.no": 1, - "søndre-land.no": 1, - "sør-aurdal.no": 1, - "sør-fron.no": 1, - "sør-odal.no": 1, - "sør-varanger.no": 1, - "sørfold.no": 1, - "sørreisa.no": 1, - "sørum.no": 1, - "südtirol.it": 1, - "t.bg": 1, - "t.se": 1, - "t3l3p0rt.net": 1, - "ta.it": 1, - "taa.it": 1, - "tab": 1, - "tabayama.yamanashi.jp": 1, - "tabitorder.co.il": 1, - "tabuse.yamaguchi.jp": 1, - "tachiarai.fukuoka.jp": 1, - "tachikawa.tokyo.jp": 1, - "tadaoka.osaka.jp": 1, - "tado.mie.jp": 1, - "tadotsu.kagawa.jp": 1, - "tagajo.miyagi.jp": 1, - "tagami.niigata.jp": 1, - "tagawa.fukuoka.jp": 1, - "tahara.aichi.jp": 1, - "taifun-dns.de": 1, - "taiji.wakayama.jp": 1, - "taiki.hokkaido.jp": 1, - "taiki.mie.jp": 1, - "tainai.niigata.jp": 1, - "taipei": 1, - "taira.toyama.jp": 1, - "taishi.hyogo.jp": 1, - "taishi.osaka.jp": 1, - "taishin.fukushima.jp": 1, - "taito.tokyo.jp": 1, - "taiwa.miyagi.jp": 1, - "tajimi.gifu.jp": 1, - "tajiri.osaka.jp": 1, - "taka.hyogo.jp": 1, - "takagi.nagano.jp": 1, - "takahagi.ibaraki.jp": 1, - "takahama.aichi.jp": 1, - "takahama.fukui.jp": 1, - "takaharu.miyazaki.jp": 1, - "takahashi.okayama.jp": 1, - "takahata.yamagata.jp": 1, - "takaishi.osaka.jp": 1, - "takamatsu.kagawa.jp": 1, - "takamori.kumamoto.jp": 1, - "takamori.nagano.jp": 1, - "takanabe.miyazaki.jp": 1, - "takanezawa.tochigi.jp": 1, - "takaoka.toyama.jp": 1, - "takarazuka.hyogo.jp": 1, - "takasago.hyogo.jp": 1, - "takasaki.gunma.jp": 1, - "takashima.shiga.jp": 1, - "takasu.hokkaido.jp": 1, - "takata.fukuoka.jp": 1, - "takatori.nara.jp": 1, - "takatsuki.osaka.jp": 1, - "takatsuki.shiga.jp": 1, - "takayama.gifu.jp": 1, - "takayama.gunma.jp": 1, - "takayama.nagano.jp": 1, - "takazaki.miyazaki.jp": 1, - "takehara.hiroshima.jp": 1, - "taketa.oita.jp": 1, - "taketomi.okinawa.jp": 1, - "taki.mie.jp": 1, - "takikawa.hokkaido.jp": 1, - "takino.hyogo.jp": 1, - "takinoue.hokkaido.jp": 1, - "takko.aomori.jp": 1, - "tako.chiba.jp": 1, - "taku.saga.jp": 1, - "talk": 1, - "tama.tokyo.jp": 1, - "tamakawa.fukushima.jp": 1, - "tamaki.mie.jp": 1, - "tamamura.gunma.jp": 1, - "tamano.okayama.jp": 1, - "tamatsukuri.ibaraki.jp": 1, - "tamayu.shimane.jp": 1, - "tamba.hyogo.jp": 1, - "tana.no": 1, - "tanabe.kyoto.jp": 1, - "tanabe.wakayama.jp": 1, - "tanagura.fukushima.jp": 1, - "tananger.no": 1, - "tank.jp": 1, - "tanohata.iwate.jp": 1, - "taobao": 1, - "tara.saga.jp": 1, - "tarama.okinawa.jp": 1, - "taranto.it": 1, - "target": 1, - "targi.pl": 1, - "tarnobrzeg.pl": 1, - "tarui.gifu.jp": 1, - "tarumizu.kagoshima.jp": 1, - "tas.au": 1, - "tas.edu.au": 1, - "tas.gov.au": 1, - "tashkent.su": 1, - "tatamotors": 1, - "tatar": 1, - "tatebayashi.gunma.jp": 1, - "tateshina.nagano.jp": 1, - "tateyama.chiba.jp": 1, - "tateyama.toyama.jp": 1, - "tatsuno.hyogo.jp": 1, - "tatsuno.nagano.jp": 1, - "tattoo": 1, - "tawaramoto.nara.jp": 1, - "tax": 1, - "taxi": 1, - "taxi.br": 1, - "tayninh.vn": 1, - "tc": 1, - "tc.br": 1, - "tci": 1, - "tcp4.me": 1, - "td": 1, - "tdk": 1, - "te.it": 1, - "te.ua": 1, - "teaches-yoga.com": 1, - "team": 1, - "tec.br": 1, - "tec.mi.us": 1, - "tec.ve": 1, - "tech": 1, - "tech.orange": 1, - "technology": 1, - "tecnologia.bo": 1, - "tel": 1, - "tel.tr": 1, - "tele.amune.org": 1, - "telebit.app": 1, - "telebit.io": 1, - "temasek": 1, - "temp-dns.com": 1, - "tempio-olbia.it": 1, - "tempioolbia.it": 1, - "tempurl.host": 1, - "tendo.yamagata.jp": 1, - "tenei.fukushima.jp": 1, - "tenkawa.nara.jp": 1, - "tennis": 1, - "tenri.nara.jp": 1, - "teo.br": 1, - "teramo.it": 1, - "termez.su": 1, - "terni.it": 1, - "ternopil.ua": 1, - "teshikaga.hokkaido.jp": 1, - "test-iserv.de": 1, - "test.ru": 1, - "test.tj": 1, - "teva": 1, - "tf": 1, - "tg": 1, - "tgory.pl": 1, - "th": 1, - "thaibinh.vn": 1, - "thainguyen.vn": 1, - "thanhhoa.vn": 1, - "thanhphohochiminh.vn": 1, - "thd": 1, - "the.br": 1, - "theater": 1, - "theatre": 1, - "theshop.jp": 1, - "theworkpc.com": 1, - "thick.jp": 1, - "thingdustdata.com": 1, - "thruhere.net": 1, - "thuathienhue.vn": 1, - "tiaa": 1, - "tickets": 1, - "tickets.io": 1, - "tienda": 1, - "tiengiang.vn": 1, - "time.no": 1, - "tingvoll.no": 1, - "tinn.no": 1, - "tips": 1, - "tires": 1, - "tirol": 1, - "tj": 1, - "tj.cn": 1, - "tjeldsund.no": 1, - "tjmaxx": 1, - "tjome.no": 1, - "tjx": 1, - "tjøme.no": 1, - "tk": 1, - "tkmaxx": 1, - "tksat.bo": 1, - "tl": 1, - "tlon.network": 1, - "tm": 1, - "tm.cy": 1, - "tm.dz": 1, - "tm.fr": 1, - "tm.hu": 1, - "tm.km": 1, - "tm.mc": 1, - "tm.mg": 1, - "tm.no": 1, - "tm.pl": 1, - "tm.ro": 1, - "tm.se": 1, - "tm.za": 1, - "tmall": 1, - "tmp.br": 1, - "tn": 1, - "tn.it": 1, - "tn.oxa.cloud": 1, - "tn.us": 1, - "to": 1, - "to.gov.br": 1, - "to.gt": 1, - "to.it": 1, - "to.leg.br": 1, - "to.md": 1, - "toba.mie.jp": 1, - "tobe.ehime.jp": 1, - "tobetsu.hokkaido.jp": 1, - "tobishima.aichi.jp": 1, - "tochigi.jp": 1, - "tochigi.tochigi.jp": 1, - "tochio.niigata.jp": 1, - "toda.saitama.jp": 1, - "today": 1, - "toei.aichi.jp": 1, - "toga.toyama.jp": 1, - "togakushi.nagano.jp": 1, - "togane.chiba.jp": 1, - "togitsu.nagasaki.jp": 1, - "togliatti.su": 1, - "togo.aichi.jp": 1, - "togura.nagano.jp": 1, - "tohma.hokkaido.jp": 1, - "tohnosho.chiba.jp": 1, - "toho.fukuoka.jp": 1, - "tokai.aichi.jp": 1, - "tokai.ibaraki.jp": 1, - "tokamachi.niigata.jp": 1, - "tokashiki.okinawa.jp": 1, - "toki.gifu.jp": 1, - "tokigawa.saitama.jp": 1, - "tokke.no": 1, - "tokoname.aichi.jp": 1, - "tokorozawa.saitama.jp": 1, - "tokushima.jp": 1, - "tokushima.tokushima.jp": 1, - "tokuyama.yamaguchi.jp": 1, - "tokyo": 1, - "tokyo.jp": 1, - "tolga.no": 1, - "tomakomai.hokkaido.jp": 1, - "tomari.hokkaido.jp": 1, - "tome.miyagi.jp": 1, - "tomi.nagano.jp": 1, - "tomigusuku.okinawa.jp": 1, - "tomika.gifu.jp": 1, - "tomioka.gunma.jp": 1, - "tomisato.chiba.jp": 1, - "tomiya.miyagi.jp": 1, - "tomobe.ibaraki.jp": 1, - "tonaki.okinawa.jp": 1, - "tonami.toyama.jp": 1, - "tondabayashi.osaka.jp": 1, - "tone.ibaraki.jp": 1, - "tonkotsu.jp": 1, - "tono.iwate.jp": 1, - "tonosho.kagawa.jp": 1, - "tonsberg.no": 1, - "toolforge.org": 1, - "tools": 1, - "toon.ehime.jp": 1, - "top": 1, - "topaz.ne.jp": 1, - "torahime.shiga.jp": 1, - "toray": 1, - "toride.ibaraki.jp": 1, - "torino.it": 1, - "torproject.net": 1, - "torsken.no": 1, - "tos.it": 1, - "tosa.kochi.jp": 1, - "tosashimizu.kochi.jp": 1, - "toscana.it": 1, - "toshiba": 1, - "toshima.tokyo.jp": 1, - "tosu.saga.jp": 1, - "total": 1, - "tottori.jp": 1, - "tottori.tottori.jp": 1, - "tourism.bj": 1, - "tourism.pl": 1, - "tourism.tn": 1, - "tours": 1, - "towada.aomori.jp": 1, - "town": 1, - "townnews-staging.com": 1, - "toya.hokkaido.jp": 1, - "toyako.hokkaido.jp": 1, - "toyama.jp": 1, - "toyama.toyama.jp": 1, - "toyo.kochi.jp": 1, - "toyoake.aichi.jp": 1, - "toyohashi.aichi.jp": 1, - "toyokawa.aichi.jp": 1, - "toyonaka.osaka.jp": 1, - "toyone.aichi.jp": 1, - "toyono.osaka.jp": 1, - "toyooka.hyogo.jp": 1, - "toyosato.shiga.jp": 1, - "toyota": 1, - "toyota.aichi.jp": 1, - "toyota.yamaguchi.jp": 1, - "toyotomi.hokkaido.jp": 1, - "toyotsu.fukuoka.jp": 1, - "toyoura.hokkaido.jp": 1, - "toys": 1, - "tozawa.yamagata.jp": 1, - "tozsde.hu": 1, - "tp.it": 1, - "tr": 1, - "tr.eu.org": 1, - "tr.it": 1, - "tr.no": 1, - "tra.kp": 1, - "trade": 1, - "trader.aero": 1, - "trading": 1, - "trading.aero": 1, - "traeumtgerade.de": 1, - "trafficplex.cloud": 1, - "trainer.aero": 1, - "training": 1, - "trana.no": 1, - "tranby.no": 1, - "trani-andria-barletta.it": 1, - "trani-barletta-andria.it": 1, - "traniandriabarletta.it": 1, - "tranibarlettaandria.it": 1, - "tranoy.no": 1, - "translate.goog": 1, - "translated.page": 1, - "transporte.bo": 1, - "tranøy.no": 1, - "trapani.it": 1, - "travel": 1, - "travel.in": 1, - "travel.pl": 1, - "travel.tt": 1, - "travelers": 1, - "travelersinsurance": 1, - "travinh.vn": 1, - "trd.br": 1, - "trentin-sud-tirol.it": 1, - "trentin-sudtirol.it": 1, - "trentin-sued-tirol.it": 1, - "trentin-suedtirol.it": 1, - "trentin-süd-tirol.it": 1, - "trentin-südtirol.it": 1, - "trentino-a-adige.it": 1, - "trentino-aadige.it": 1, - "trentino-alto-adige.it": 1, - "trentino-altoadige.it": 1, - "trentino-s-tirol.it": 1, - "trentino-stirol.it": 1, - "trentino-sud-tirol.it": 1, - "trentino-sudtirol.it": 1, - "trentino-sued-tirol.it": 1, - "trentino-suedtirol.it": 1, - "trentino-süd-tirol.it": 1, - "trentino-südtirol.it": 1, - "trentino.it": 1, - "trentinoa-adige.it": 1, - "trentinoaadige.it": 1, - "trentinoalto-adige.it": 1, - "trentinoaltoadige.it": 1, - "trentinos-tirol.it": 1, - "trentinostirol.it": 1, - "trentinosud-tirol.it": 1, - "trentinosudtirol.it": 1, - "trentinosued-tirol.it": 1, - "trentinosuedtirol.it": 1, - "trentinosüd-tirol.it": 1, - "trentinosüdtirol.it": 1, - "trentinsud-tirol.it": 1, - "trentinsudtirol.it": 1, - "trentinsued-tirol.it": 1, - "trentinsuedtirol.it": 1, - "trentinsüd-tirol.it": 1, - "trentinsüdtirol.it": 1, - "trento.it": 1, - "treviso.it": 1, - "trieste.it": 1, - "troandin.no": 1, - "trogstad.no": 1, - "troitsk.su": 1, - "tromsa.no": 1, - "tromso.no": 1, - "tromsø.no": 1, - "trondheim.no": 1, - "trust": 1, - "trv": 1, - "try-snowplow.com": 1, - "trycloudflare.com": 1, - "trysil.no": 1, - "træna.no": 1, - "trøgstad.no": 1, - "ts.it": 1, - "ts.net": 1, - "tselinograd.su": 1, - "tsk.tr": 1, - "tsu.mie.jp": 1, - "tsubame.niigata.jp": 1, - "tsubata.ishikawa.jp": 1, - "tsubetsu.hokkaido.jp": 1, - "tsuchiura.ibaraki.jp": 1, - "tsuga.tochigi.jp": 1, - "tsugaru.aomori.jp": 1, - "tsuiki.fukuoka.jp": 1, - "tsukigata.hokkaido.jp": 1, - "tsukiyono.gunma.jp": 1, - "tsukuba.ibaraki.jp": 1, - "tsukui.kanagawa.jp": 1, - "tsukumi.oita.jp": 1, - "tsumagoi.gunma.jp": 1, - "tsunan.niigata.jp": 1, - "tsuno.kochi.jp": 1, - "tsuno.miyazaki.jp": 1, - "tsuru.yamanashi.jp": 1, - "tsuruga.fukui.jp": 1, - "tsurugashima.saitama.jp": 1, - "tsurugi.ishikawa.jp": 1, - "tsuruoka.yamagata.jp": 1, - "tsuruta.aomori.jp": 1, - "tsushima.aichi.jp": 1, - "tsushima.nagasaki.jp": 1, - "tsuwano.shimane.jp": 1, - "tsuyama.okayama.jp": 1, - "tt": 1, - "tt.im": 1, - "tube": 1, - "tui": 1, - "tula.su": 1, - "tuleap-partners.com": 1, - "tunes": 1, - "tunk.org": 1, - "tur.ar": 1, - "tur.br": 1, - "turek.pl": 1, - "turin.it": 1, - "turystyka.pl": 1, - "tuscany.it": 1, - "tushu": 1, - "tuva.su": 1, - "tuxfamily.org": 1, - "tuyenquang.vn": 1, - "tv": 1, - "tv.bb": 1, - "tv.bo": 1, - "tv.br": 1, - "tv.im": 1, - "tv.in": 1, - "tv.it": 1, - "tv.kg": 1, - "tv.na": 1, - "tv.sd": 1, - "tv.tr": 1, - "tv.tz": 1, - "tvedestrand.no": 1, - "tvs": 1, - "tw": 1, - "tw.cn": 1, - "twmail.cc": 1, - "twmail.net": 1, - "twmail.org": 1, - "tx.us": 1, - "tychy.pl": 1, - "tydal.no": 1, - "tynset.no": 1, - "typedream.app": 1, - "tysfjord.no": 1, - "tysnes.no": 1, - "tysvar.no": 1, - "tysvær.no": 1, - "tz": 1, - "tønsberg.no": 1, - "u.bg": 1, - "u.channelsdvr.net": 1, - "u.se": 1, - "u2-local.xnbay.com": 1, - "u2.xnbay.com": 1, - "ua": 1, - "ua.rs": 1, - "ubank": 1, - "ube.yamaguchi.jp": 1, - "uber.space": 1, - "ubs": 1, - "uchihara.ibaraki.jp": 1, - "uchiko.ehime.jp": 1, - "uchinada.ishikawa.jp": 1, - "uchinomi.kagawa.jp": 1, - "ud.it": 1, - "uda.nara.jp": 1, - "udi.br": 1, - "udine.it": 1, - "udono.mie.jp": 1, - "ueda.nagano.jp": 1, - "ueno.gunma.jp": 1, - "uenohara.yamanashi.jp": 1, - "ufcfan.org": 1, - "ug": 1, - "ug.gov.pl": 1, - "ugim.gov.pl": 1, - "uh-oh.jp": 1, - "ui.nabu.casa": 1, - "uji.kyoto.jp": 1, - "ujiie.tochigi.jp": 1, - "ujitawara.kyoto.jp": 1, - "uk": 1, - "uk.com": 1, - "uk.eu.org": 1, - "uk.in": 1, - "uk.kg": 1, - "uk.net": 1, - "uk.oxa.cloud": 1, - "uk.primetel.cloud": 1, - "uk.reclaim.cloud": 1, - "uk0.bigv.io": 1, - "uki.kumamoto.jp": 1, - "ukiha.fukuoka.jp": 1, - "ullensaker.no": 1, - "ullensvang.no": 1, - "ulsan.kr": 1, - "ulvik.no": 1, - "um.gov.pl": 1, - "umaji.kochi.jp": 1, - "umb.it": 1, - "umbria.it": 1, - "umi.fukuoka.jp": 1, - "umig.gov.pl": 1, - "unazuki.toyama.jp": 1, - "under.jp": 1, - "undo.jp": 1, - "uni5.net": 1, - "unicloud.pl": 1, - "unicom": 1, - "union.aero": 1, - "univ.bj": 1, - "univ.sn": 1, - "university": 1, - "unjarga.no": 1, - "unjárga.no": 1, - "unnan.shimane.jp": 1, - "uno": 1, - "unusualperson.com": 1, - "unzen.nagasaki.jp": 1, - "uol": 1, - "uonuma.niigata.jp": 1, - "uozu.toyama.jp": 1, - "up.in": 1, - "upaas.kazteleport.kz": 1, - "upli.io": 1, - "upow.gov.pl": 1, - "upper.jp": 1, - "uppo.gov.pl": 1, - "ups": 1, - "urakawa.hokkaido.jp": 1, - "urasoe.okinawa.jp": 1, - "urausu.hokkaido.jp": 1, - "urawa.saitama.jp": 1, - "urayasu.chiba.jp": 1, - "urbino-pesaro.it": 1, - "urbinopesaro.it": 1, - "ureshino.mie.jp": 1, - "uri.arpa": 1, - "url.tw": 1, - "urn.arpa": 1, - "urown.cloud": 1, - "uruma.okinawa.jp": 1, - "uryu.hokkaido.jp": 1, - "us": 1, - "us-1.evennode.com": 1, - "us-2.evennode.com": 1, - "us-3.evennode.com": 1, - "us-4.evennode.com": 1, - "us-east-1.amazonaws.com": 1, - "us-east-1.elasticbeanstalk.com": 1, - "us-east-2.elasticbeanstalk.com": 1, - "us-gov-west-1.elasticbeanstalk.com": 1, - "us-west-1.elasticbeanstalk.com": 1, - "us-west-2.elasticbeanstalk.com": 1, - "us.ax": 1, - "us.com": 1, - "us.eu.org": 1, - "us.gov.pl": 1, - "us.in": 1, - "us.kg": 1, - "us.na": 1, - "us.ngrok.io": 1, - "us.org": 1, - "us.platform.sh": 1, - "us.reclaim.cloud": 1, - "usa.oita.jp": 1, - "user.aseinet.ne.jp": 1, - "user.party.eus": 1, - "user.srcf.net": 1, - "user.webaccel.jp": 1, - "usercontent.jp": 1, - "ushiku.ibaraki.jp": 1, - "usr.cloud.muni.cz": 1, - "ustka.pl": 1, - "usui.fukuoka.jp": 1, - "usuki.oita.jp": 1, - "ut.us": 1, - "utashinai.hokkaido.jp": 1, - "utazas.hu": 1, - "utazu.kagawa.jp": 1, - "uto.kumamoto.jp": 1, - "utsira.no": 1, - "utsunomiya.tochigi.jp": 1, - "utwente.io": 1, - "uw.gov.pl": 1, - "uwajima.ehime.jp": 1, - "uwu.ai": 1, - "uy": 1, - "uy.com": 1, - "uz": 1, - "uz.ua": 1, - "uzhgorod.ua": 1, - "uzs.gov.pl": 1, - "v-info.info": 1, - "v.bg": 1, - "v.ua": 1, - "va": 1, - "va.it": 1, - "va.no": 1, - "va.us": 1, - "vaapste.no": 1, - "vacations": 1, - "vadso.no": 1, - "vadsø.no": 1, - "vaga.no": 1, - "vagan.no": 1, - "vagsoy.no": 1, - "vaksdal.no": 1, - "val-d-aosta.it": 1, - "val-daosta.it": 1, - "vald-aosta.it": 1, - "valdaosta.it": 1, - "valer.hedmark.no": 1, - "valer.ostfold.no": 1, - "valle-aosta.it": 1, - "valle-d-aosta.it": 1, - "valle-daosta.it": 1, - "valle.no": 1, - "valleaosta.it": 1, - "valled-aosta.it": 1, - "valledaosta.it": 1, - "vallee-aoste.it": 1, - "vallee-d-aoste.it": 1, - "valleeaoste.it": 1, - "valleedaoste.it": 1, - "vallée-aoste.it": 1, - "vallée-d-aoste.it": 1, - "valléeaoste.it": 1, - "valléedaoste.it": 1, - "vana": 1, - "vang.no": 1, - "vanguard": 1, - "vanylven.no": 1, - "vao.it": 1, - "vapor.cloud": 1, - "vaporcloud.io": 1, - "vardo.no": 1, - "vardø.no": 1, - "varese.it": 1, - "varggat.no": 1, - "varoy.no": 1, - "vb.it": 1, - "vc": 1, - "vc.it": 1, - "vda.it": 1, - "ve": 1, - "ve.it": 1, - "vefsn.no": 1, - "vega.no": 1, - "vegarshei.no": 1, - "vegas": 1, - "vegårshei.no": 1, - "velvet.jp": 1, - "ven.it": 1, - "veneto.it": 1, - "venezia.it": 1, - "venice.it": 1, - "vennesla.no": 1, - "ventures": 1, - "verbania.it": 1, - "vercel.app": 1, - "vercel.dev": 1, - "vercelli.it": 1, - "verdal.no": 1, - "verisign": 1, - "vermögensberater": 1, - "vermögensberatung": 1, - "verona.it": 1, - "verran.no": 1, - "verse.jp": 1, - "versicherung": 1, - "versus.jp": 1, - "vestby.no": 1, - "vestnes.no": 1, - "vestre-slidre.no": 1, - "vestre-toten.no": 1, - "vestvagoy.no": 1, - "vestvågøy.no": 1, - "vet": 1, - "vet.br": 1, - "veterinaire.fr": 1, - "veterinaire.km": 1, - "vevelstad.no": 1, - "vf.no": 1, - "vfs.cloud9.af-south-1.amazonaws.com": 1, - "vfs.cloud9.ap-east-1.amazonaws.com": 1, - "vfs.cloud9.ap-northeast-1.amazonaws.com": 1, - "vfs.cloud9.ap-northeast-2.amazonaws.com": 1, - "vfs.cloud9.ap-northeast-3.amazonaws.com": 1, - "vfs.cloud9.ap-south-1.amazonaws.com": 1, - "vfs.cloud9.ap-southeast-1.amazonaws.com": 1, - "vfs.cloud9.ap-southeast-2.amazonaws.com": 1, - "vfs.cloud9.ca-central-1.amazonaws.com": 1, - "vfs.cloud9.eu-central-1.amazonaws.com": 1, - "vfs.cloud9.eu-north-1.amazonaws.com": 1, - "vfs.cloud9.eu-south-1.amazonaws.com": 1, - "vfs.cloud9.eu-west-1.amazonaws.com": 1, - "vfs.cloud9.eu-west-2.amazonaws.com": 1, - "vfs.cloud9.eu-west-3.amazonaws.com": 1, - "vfs.cloud9.me-south-1.amazonaws.com": 1, - "vfs.cloud9.sa-east-1.amazonaws.com": 1, - "vfs.cloud9.us-east-1.amazonaws.com": 1, - "vfs.cloud9.us-east-2.amazonaws.com": 1, - "vfs.cloud9.us-west-1.amazonaws.com": 1, - "vfs.cloud9.us-west-2.amazonaws.com": 1, - "vg": 1, - "vgs.no": 1, - "vi": 1, - "vi.it": 1, - "vi.us": 1, - "viajes": 1, - "vibo-valentia.it": 1, - "vibovalentia.it": 1, - "vic.au": 1, - "vic.edu.au": 1, - "vic.gov.au": 1, - "vicenza.it": 1, - "video": 1, - "video.hu": 1, - "vig": 1, - "vik.no": 1, - "viking": 1, - "vikna.no": 1, - "villas": 1, - "vin": 1, - "vindafjord.no": 1, - "vinhlong.vn": 1, - "vinhphuc.vn": 1, - "vinnica.ua": 1, - "vinnytsia.ua": 1, - "vip": 1, - "vip.jelastic.cloud": 1, - "vipsinaapp.com": 1, - "virgin": 1, - "virtual-user.de": 1, - "virtualserver.io": 1, - "virtualuser.de": 1, - "visa": 1, - "vision": 1, - "viterbo.it": 1, - "viva": 1, - "vivian.jp": 1, - "vivo": 1, - "vix.br": 1, - "vlaanderen": 1, - "vladikavkaz.ru": 1, - "vladikavkaz.su": 1, - "vladimir.ru": 1, - "vladimir.su": 1, - "vlog.br": 1, - "vm.bytemark.co.uk": 1, - "vn": 1, - "vn.ua": 1, - "voagat.no": 1, - "vodka": 1, - "volda.no": 1, - "volkswagen": 1, - "vologda.su": 1, - "volvo": 1, - "volyn.ua": 1, - "voorloper.cloud": 1, - "voss.no": 1, - "vossevangen.no": 1, - "vote": 1, - "voting": 1, - "voto": 1, - "voyage": 1, - "vp4.me": 1, - "vpndns.net": 1, - "vpnplus.to": 1, - "vps-host.net": 1, - "vps.mcdir.ru": 1, - "vr.it": 1, - "vs.it": 1, - "vs.mythic-beasts.com": 1, - "vt.it": 1, - "vt.us": 1, - "vu": 1, - "vv.it": 1, - "vxl.sh": 1, - "várggát.no": 1, - "vågan.no": 1, - "vågsøy.no": 1, - "vågå.no": 1, - "våler.hedmark.no": 1, - "våler.østfold.no": 1, - "værøy.no": 1, - "w.bg": 1, - "w.se": 1, - "wa.au": 1, - "wa.edu.au": 1, - "wa.gov.au": 1, - "wa.us": 1, - "wada.nagano.jp": 1, - "wafflecell.com": 1, - "wajiki.tokushima.jp": 1, - "wajima.ishikawa.jp": 1, - "wakasa.fukui.jp": 1, - "wakasa.tottori.jp": 1, - "wakayama.jp": 1, - "wakayama.wakayama.jp": 1, - "wake.okayama.jp": 1, - "wakkanai.hokkaido.jp": 1, - "wakuya.miyagi.jp": 1, - "walbrzych.pl": 1, - "wales": 1, - "walmart": 1, - "walter": 1, - "wang": 1, - "wanggou": 1, - "wanouchi.gifu.jp": 1, - "warabi.saitama.jp": 1, - "warmia.pl": 1, - "warszawa.pl": 1, - "washtenaw.mi.us": 1, - "wassamu.hokkaido.jp": 1, - "watarai.mie.jp": 1, - "watari.miyagi.jp": 1, - "watch": 1, - "watches": 1, - "watson.jp": 1, - "waw.pl": 1, - "wazuka.kyoto.jp": 1, - "we.bs": 1, - "we.tc": 1, - "weather": 1, - "weatherchannel": 1, - "web.app": 1, - "web.bo": 1, - "web.co": 1, - "web.do": 1, - "web.gu": 1, - "web.id": 1, - "web.in": 1, - "web.lk": 1, - "web.nf": 1, - "web.ni": 1, - "web.pk": 1, - "web.tj": 1, - "web.tr": 1, - "web.ve": 1, - "web.za": 1, - "webcam": 1, - "weber": 1, - "webhop.biz": 1, - "webhop.info": 1, - "webhop.me": 1, - "webhop.net": 1, - "webhop.org": 1, - "webhosting.be": 1, - "weblike.jp": 1, - "webredirect.org": 1, - "website": 1, - "website.yandexcloud.net": 1, - "websozai.jp": 1, - "webspace.rocks": 1, - "webthings.io": 1, - "webview-assets.aws-cloud9.af-south-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.ap-east-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.ap-northeast-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.ap-northeast-2.amazonaws.com": 1, - "webview-assets.aws-cloud9.ap-northeast-3.amazonaws.com": 1, - "webview-assets.aws-cloud9.ap-south-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.ap-southeast-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.ap-southeast-2.amazonaws.com": 1, - "webview-assets.aws-cloud9.ca-central-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.eu-central-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.eu-north-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.eu-south-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.eu-west-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.eu-west-2.amazonaws.com": 1, - "webview-assets.aws-cloud9.eu-west-3.amazonaws.com": 1, - "webview-assets.aws-cloud9.me-south-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.sa-east-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.us-east-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.us-east-2.amazonaws.com": 1, - "webview-assets.aws-cloud9.us-west-1.amazonaws.com": 1, - "webview-assets.aws-cloud9.us-west-2.amazonaws.com": 1, - "webview-assets.cloud9.af-south-1.amazonaws.com": 1, - "webview-assets.cloud9.ap-east-1.amazonaws.com": 1, - "webview-assets.cloud9.ap-northeast-1.amazonaws.com": 1, - "webview-assets.cloud9.ap-northeast-2.amazonaws.com": 1, - "webview-assets.cloud9.ap-northeast-3.amazonaws.com": 1, - "webview-assets.cloud9.ap-south-1.amazonaws.com": 1, - "webview-assets.cloud9.ap-southeast-1.amazonaws.com": 1, - "webview-assets.cloud9.ap-southeast-2.amazonaws.com": 1, - "webview-assets.cloud9.ca-central-1.amazonaws.com": 1, - "webview-assets.cloud9.eu-central-1.amazonaws.com": 1, - "webview-assets.cloud9.eu-north-1.amazonaws.com": 1, - "webview-assets.cloud9.eu-south-1.amazonaws.com": 1, - "webview-assets.cloud9.eu-west-1.amazonaws.com": 1, - "webview-assets.cloud9.eu-west-2.amazonaws.com": 1, - "webview-assets.cloud9.eu-west-3.amazonaws.com": 1, - "webview-assets.cloud9.me-south-1.amazonaws.com": 1, - "webview-assets.cloud9.sa-east-1.amazonaws.com": 1, - "webview-assets.cloud9.us-east-1.amazonaws.com": 1, - "webview-assets.cloud9.us-east-2.amazonaws.com": 1, - "webview-assets.cloud9.us-west-1.amazonaws.com": 1, - "webview-assets.cloud9.us-west-2.amazonaws.com": 1, - "wedding": 1, - "wedeploy.io": 1, - "wedeploy.me": 1, - "wedeploy.sh": 1, - "weeklylottery.org.uk": 1, - "wegrow.pl": 1, - "weibo": 1, - "weir": 1, - "wellbeingzone.co.uk": 1, - "wellbeingzone.eu": 1, - "west1-us.cloudjiffy.net": 1, - "westeurope.azurestaticapps.net": 1, - "westus2.azurestaticapps.net": 1, - "wf": 1, - "whitesnow.jp": 1, - "whm.fr-par.scw.cloud": 1, - "whm.nl-ams.scw.cloud": 1, - "whoswho": 1, - "wi.us": 1, - "wielun.pl": 1, - "wien": 1, - "wien.funkfeuer.at": 1, - "wif.gov.pl": 1, - "wiih.gov.pl": 1, - "wiki": 1, - "wiki.bo": 1, - "wiki.br": 1, - "williamhill": 1, - "win": 1, - "winb.gov.pl": 1, - "windows": 1, - "wine": 1, - "winners": 1, - "wios.gov.pl": 1, - "witd.gov.pl": 1, - "withgoogle.com": 1, - "withyoutube.com": 1, - "wiw.gov.pl": 1, - "wixsite.com": 1, - "wkz.gov.pl": 1, - "wlocl.pl": 1, - "wloclawek.pl": 1, - "wmcloud.org": 1, - "wme": 1, - "wmflabs.org": 1, - "wnext.app": 1, - "wodzislaw.pl": 1, - "wolomin.pl": 1, - "wolterskluwer": 1, - "woltlab-demo.com": 1, - "woodside": 1, - "work": 1, - "workers.dev": 1, - "workinggroup.aero": 1, - "workisboring.com": 1, - "works": 1, - "works.aero": 1, - "world": 1, - "worse-than.tv": 1, - "wow": 1, - "wpdevcloud.com": 1, - "wpenginepowered.com": 1, - "wphostedmail.com": 1, - "wpmucdn.com": 1, - "wpmudev.host": 1, - "writesthisblog.com": 1, - "wroc.pl": 1, - "wroclaw.pl": 1, - "ws": 1, - "ws.na": 1, - "wsa.gov.pl": 1, - "wskr.gov.pl": 1, - "wsse.gov.pl": 1, - "wtc": 1, - "wtf": 1, - "wuoz.gov.pl": 1, - "wv.us": 1, - "www.ro": 1, - "wy.us": 1, - "wzmiuw.gov.pl": 1, - "x.bg": 1, - "x.mythic-beasts.com": 1, - "x.se": 1, - "x0.com": 1, - "x0.to": 1, - "x443.pw": 1, - "xbox": 1, - "xen.prgmr.com": 1, - "xerox": 1, - "xfinity": 1, - "xihuan": 1, - "xii.jp": 1, - "xin": 1, - "xj.cn": 1, - "xnbay.com": 1, - "xs4all.space": 1, - "xx.gl": 1, - "xxx": 1, - "xy.ax": 1, - "xyz": 1, - "xz.cn": 1, - "y.bg": 1, - "y.se": 1, - "yabu.hyogo.jp": 1, - "yabuki.fukushima.jp": 1, - "yachimata.chiba.jp": 1, - "yachiyo.chiba.jp": 1, - "yachiyo.ibaraki.jp": 1, - "yachts": 1, - "yaese.okinawa.jp": 1, - "yahaba.iwate.jp": 1, - "yahiko.niigata.jp": 1, - "yahoo": 1, - "yaita.tochigi.jp": 1, - "yaizu.shizuoka.jp": 1, - "yakage.okayama.jp": 1, - "yakumo.hokkaido.jp": 1, - "yakumo.shimane.jp": 1, - "yali.mythic-beasts.com": 1, - "yalta.ua": 1, - "yamada.fukuoka.jp": 1, - "yamada.iwate.jp": 1, - "yamada.toyama.jp": 1, - "yamaga.kumamoto.jp": 1, - "yamagata.gifu.jp": 1, - "yamagata.ibaraki.jp": 1, - "yamagata.jp": 1, - "yamagata.nagano.jp": 1, - "yamagata.yamagata.jp": 1, - "yamaguchi.jp": 1, - "yamakita.kanagawa.jp": 1, - "yamamoto.miyagi.jp": 1, - "yamanakako.yamanashi.jp": 1, - "yamanashi.jp": 1, - "yamanashi.yamanashi.jp": 1, - "yamanobe.yamagata.jp": 1, - "yamanouchi.nagano.jp": 1, - "yamashina.kyoto.jp": 1, - "yamato.fukushima.jp": 1, - "yamato.kanagawa.jp": 1, - "yamato.kumamoto.jp": 1, - "yamatokoriyama.nara.jp": 1, - "yamatotakada.nara.jp": 1, - "yamatsuri.fukushima.jp": 1, - "yamaxun": 1, - "yamazoe.nara.jp": 1, - "yame.fukuoka.jp": 1, - "yanagawa.fukuoka.jp": 1, - "yanaizu.fukushima.jp": 1, - "yandex": 1, - "yandexcloud.net": 1, - "yao.osaka.jp": 1, - "yaotsu.gifu.jp": 1, - "yasaka.nagano.jp": 1, - "yashio.saitama.jp": 1, - "yashiro.hyogo.jp": 1, - "yasu.shiga.jp": 1, - "yasuda.kochi.jp": 1, - "yasugi.shimane.jp": 1, - "yasuoka.nagano.jp": 1, - "yatomi.aichi.jp": 1, - "yatsuka.shimane.jp": 1, - "yatsushiro.kumamoto.jp": 1, - "yawara.ibaraki.jp": 1, - "yawata.kyoto.jp": 1, - "yawatahama.ehime.jp": 1, - "yazu.tottori.jp": 1, - "ybo.faith": 1, - "ybo.party": 1, - "ybo.review": 1, - "ybo.science": 1, - "ybo.trade": 1, - "ye": 1, - "yenbai.vn": 1, - "yk.ca": 1, - "yn.cn": 1, - "ynh.fr": 1, - "yodobashi": 1, - "yoga": 1, - "yoichi.hokkaido.jp": 1, - "yoita.niigata.jp": 1, - "yoka.hyogo.jp": 1, - "yokaichiba.chiba.jp": 1, - "yokawa.hyogo.jp": 1, - "yokkaichi.mie.jp": 1, - "yokohama": 1, - "yokoshibahikari.chiba.jp": 1, - "yokosuka.kanagawa.jp": 1, - "yokote.akita.jp": 1, - "yokoze.saitama.jp": 1, - "yolasite.com": 1, - "yombo.me": 1, - "yomitan.okinawa.jp": 1, - "yonabaru.okinawa.jp": 1, - "yonago.tottori.jp": 1, - "yonaguni.okinawa.jp": 1, - "yonezawa.yamagata.jp": 1, - "yono.saitama.jp": 1, - "yorii.saitama.jp": 1, - "yoro.gifu.jp": 1, - "yoshida.saitama.jp": 1, - "yoshida.shizuoka.jp": 1, - "yoshikawa.saitama.jp": 1, - "yoshimi.saitama.jp": 1, - "yoshino.nara.jp": 1, - "yoshinogari.saga.jp": 1, - "yoshioka.gunma.jp": 1, - "yotsukaido.chiba.jp": 1, - "you": 1, - "youtube": 1, - "yt": 1, - "yuasa.wakayama.jp": 1, - "yufu.oita.jp": 1, - "yugawa.fukushima.jp": 1, - "yugawara.kanagawa.jp": 1, - "yuki.ibaraki.jp": 1, - "yukuhashi.fukuoka.jp": 1, - "yun": 1, - "yura.wakayama.jp": 1, - "yurihonjo.akita.jp": 1, - "yusuhara.kochi.jp": 1, - "yusui.kagoshima.jp": 1, - "yuu.yamaguchi.jp": 1, - "yuza.yamagata.jp": 1, - "yuzawa.niigata.jp": 1, - "z.bg": 1, - "z.se": 1, - "za.bz": 1, - "za.com": 1, - "za.net": 1, - "za.org": 1, - "zachpomor.pl": 1, - "zagan.pl": 1, - "zakopane.pl": 1, - "zama.kanagawa.jp": 1, - "zamami.okinawa.jp": 1, - "zao.miyagi.jp": 1, - "zaporizhzhe.ua": 1, - "zaporizhzhia.ua": 1, - "zappos": 1, - "zapto.org": 1, - "zapto.xyz": 1, - "zara": 1, - "zarow.pl": 1, - "zentsuji.kagawa.jp": 1, - "zero": 1, - "zgora.pl": 1, - "zgorzelec.pl": 1, - "zhitomir.ua": 1, - "zhytomyr.ua": 1, - "zip": 1, - "zj.cn": 1, - "zlg.br": 1, - "zm": 1, - "zombie.jp": 1, - "zone": 1, - "zp.gov.pl": 1, - "zp.ua": 1, - "zpisdn.gov.pl": 1, - "zt.ua": 1, - "zuerich": 1, - "zushi.kanagawa.jp": 1, - "zw": 1, - "ákŋoluokta.no": 1, - "álaheadju.no": 1, - "áltá.no": 1, - "åfjord.no": 1, - "åkrehamn.no": 1, - "ål.no": 1, - "ålesund.no": 1, - "ålgård.no": 1, - "åmli.no": 1, - "åmot.no": 1, - "årdal.no": 1, - "ås.no": 1, - "åseral.no": 1, - "åsnes.no": 1, - "øksnes.no": 1, - "ørland.no": 1, - "ørskog.no": 1, - "ørsta.no": 1, - "østre-toten.no": 1, - "øvre-eiker.no": 1, - "øyer.no": 1, - "øygarden.no": 1, - "øystre-slidre.no": 1, - "čáhcesuolo.no": 1, - "ελ": 1, - "ευ": 1, - "ак.срб": 1, - "бг": 1, - "бел": 1, - "биз.рус": 1, - "дети": 1, - "ею": 1, - "католик": 1, - "ком": 1, - "ком.рус": 1, - "крым.рус": 1, - "мир.рус": 1, - "мкд": 1, - "мон": 1, - "москва": 1, - "мск.рус": 1, - "обр.срб": 1, - "од.срб": 1, - "онлайн": 1, - "орг": 1, - "орг.рус": 1, - "орг.срб": 1, - "пр.срб": 1, - "рус": 1, - "рф": 1, - "сайт": 1, - "самара.рус": 1, - "сочи.рус": 1, - "спб.рус": 1, - "срб": 1, - "укр": 1, - "упр.срб": 1, - "я.рус": 1, - "қаз": 1, - "հայ": 1, - "אקדמיה.ישראל": 1, - "ישוב.ישראל": 1, - "ישראל": 1, - "ממשל.ישראל": 1, - "צהל.ישראל": 1, - "קום": 1, - "ابوظبي": 1, - "اتصالات": 1, - "ارامكو": 1, - "الاردن": 1, - "البحرين": 1, - "الجزائر": 1, - "السعودية": 1, - "السعوديه": 1, - "السعودیة": 1, - "السعودیۃ": 1, - "العليان": 1, - "المغرب": 1, - "اليمن": 1, - "امارات": 1, - "ايران": 1, - "ايران.ir": 1, - "ایران": 1, - "ایران.ir": 1, - "بارت": 1, - "بازار": 1, - "بيتك": 1, - "بھارت": 1, - "تونس": 1, - "سودان": 1, - "سوريا": 1, - "سورية": 1, - "شبكة": 1, - "عراق": 1, - "عرب": 1, - "عمان": 1, - "فلسطين": 1, - "قطر": 1, - "كاثوليك": 1, - "كوم": 1, - "مصر": 1, - "مليسيا": 1, - "موريتانيا": 1, - "موقع": 1, - "همراه": 1, - "پاكستان": 1, - "پاکستان": 1, - "ڀارت": 1, - "कॉम": 1, - "नेट": 1, - "भारत": 1, - "भारतम्": 1, - "भारोत": 1, - "संगठन": 1, - "বাংলা": 1, - "ভারত": 1, - "ভাৰত": 1, - "ਭਾਰਤ": 1, - "ભારત": 1, - "ଭାରତ": 1, - "இந்தியா": 1, - "இலங்கை": 1, - "சிங்கப்பூர்": 1, - "భారత్": 1, - "ಭಾರತ": 1, - "ഭാരതം": 1, - "ලංකා": 1, - "คอม": 1, - "ทหาร.ไทย": 1, - "ธุรกิจ.ไทย": 1, - "รัฐบาล.ไทย": 1, - "ศึกษา.ไทย": 1, - "องค์กร.ไทย": 1, - "เน็ต.ไทย": 1, - "ไทย": 1, - "ລາວ": 1, - "გე": 1, - "みんな": 1, - "アマゾン": 1, - "クラウド": 1, - "グーグル": 1, - "コム": 1, - "ストア": 1, - "セール": 1, - "ファッション": 1, - "ポイント": 1, - "三重.jp": 1, - "世界": 1, - "个人.hk": 1, - "中信": 1, - "中国": 1, - "中國": 1, - "中文网": 1, - "亚马逊": 1, - "京都.jp": 1, - "企业": 1, - "佐賀.jp": 1, - "佛山": 1, - "信息": 1, - "個人.hk": 1, - "個人.香港": 1, - "健康": 1, - "八卦": 1, - "公司": 1, - "公司.cn": 1, - "公司.hk": 1, - "公司.香港": 1, - "公益": 1, - "兵庫.jp": 1, - "北海道.jp": 1, - "千葉.jp": 1, - "台湾": 1, - "台灣": 1, - "和歌山.jp": 1, - "商城": 1, - "商店": 1, - "商标": 1, - "商業.tw": 1, - "嘉里": 1, - "嘉里大酒店": 1, - "在线": 1, - "埼玉.jp": 1, - "大分.jp": 1, - "大拿": 1, - "大阪.jp": 1, - "天主教": 1, - "奈良.jp": 1, - "娱乐": 1, - "宮城.jp": 1, - "宮崎.jp": 1, - "家電": 1, - "富山.jp": 1, - "山口.jp": 1, - "山形.jp": 1, - "山梨.jp": 1, - "岐阜.jp": 1, - "岡山.jp": 1, - "岩手.jp": 1, - "島根.jp": 1, - "广东": 1, - "広島.jp": 1, - "微博": 1, - "徳島.jp": 1, - "愛媛.jp": 1, - "愛知.jp": 1, - "慈善": 1, - "我爱你": 1, - "手机": 1, - "招聘": 1, - "政务": 1, - "政府": 1, - "政府.hk": 1, - "政府.香港": 1, - "敎育.hk": 1, - "教育.hk": 1, - "教育.香港": 1, - "新加坡": 1, - "新潟.jp": 1, - "新闻": 1, - "时尚": 1, - "書籍": 1, - "机构": 1, - "東京.jp": 1, - "栃木.jp": 1, - "沖縄.jp": 1, - "淡马锡": 1, - "游戏": 1, - "滋賀.jp": 1, - "澳門": 1, - "澳门": 1, - "点看": 1, - "熊本.jp": 1, - "石川.jp": 1, - "神奈川.jp": 1, - "福井.jp": 1, - "福岡.jp": 1, - "福島.jp": 1, - "秋田.jp": 1, - "移动": 1, - "箇人.hk": 1, - "組織.hk": 1, - "組織.tw": 1, - "組織.香港": 1, - "組织.hk": 1, - "網絡.cn": 1, - "網絡.hk": 1, - "網絡.香港": 1, - "網络.hk": 1, - "網路.tw": 1, - "组織.hk": 1, - "组织.hk": 1, - "组织机构": 1, - "网址": 1, - "网店": 1, - "网站": 1, - "网絡.hk": 1, - "网络": 1, - "网络.cn": 1, - "网络.hk": 1, - "群馬.jp": 1, - "联通": 1, - "臺灣": 1, - "茨城.jp": 1, - "谷歌": 1, - "购物": 1, - "通販": 1, - "長崎.jp": 1, - "長野.jp": 1, - "集团": 1, - "電訊盈科": 1, - "青森.jp": 1, - "静岡.jp": 1, - "飞利浦": 1, - "食品": 1, - "餐厅": 1, - "香川.jp": 1, - "香格里拉": 1, - "香港": 1, - "高知.jp": 1, - "鳥取.jp": 1, - "鹿児島.jp": 1, - "닷넷": 1, - "닷컴": 1, - "삼성": 1, - "한국": 1 -} \ No newline at end of file diff --git a/src/mod/dynamicproxy/typedef.go b/src/mod/dynamicproxy/typedef.go index 43c5fa2..0a48e33 100644 --- a/src/mod/dynamicproxy/typedef.go +++ b/src/mod/dynamicproxy/typedef.go @@ -14,8 +14,9 @@ import ( ) const ( - ProxyType_Subdomain = 0 - ProxyType_Vdir = 1 + ProxyType_Root = 0 + ProxyType_Host = 1 + ProxyType_Vdir = 2 ) type ProxyHandler struct { @@ -24,9 +25,11 @@ type ProxyHandler struct { type RouterOption struct { HostUUID string //The UUID of Zoraxy, use for heading mod + HostVersion string //The version of Zoraxy, use for heading mod Port int //Incoming port UseTls bool //Use TLS to serve incoming requsts ForceTLSLatest bool //Force TLS1.2 or above + NoCache bool //Force set Cache-Control: no-store ListenOnPort80 bool //Enable port 80 http listener ForceHttpsRedirect bool //Force redirection of http to https endpoint TlsManager *tlscert.Manager @@ -37,16 +40,14 @@ type RouterOption struct { } type Router struct { - Option *RouterOption - ProxyEndpoints *sync.Map - SubdomainEndpoint *sync.Map - Running bool - Root *ProxyEndpoint - RootRoutingOptions *RootRoutingOptions - mux http.Handler - server *http.Server - tlsListener net.Listener - routingRules []*RoutingRule + Option *RouterOption + ProxyEndpoints *sync.Map + Running bool + Root *ProxyEndpoint + mux http.Handler + server *http.Server + tlsListener net.Listener + routingRules []*RoutingRule tlsRedirectStop chan bool //Stop channel for tls redirection server tldMap map[string]int //Top level domain map, see tld.json @@ -69,63 +70,70 @@ type BasicAuthExceptionRule struct { PathPrefix string } -// A proxy endpoint record -type ProxyEndpoint struct { - ProxyType int //The type of this proxy, see const def - RootOrMatchingDomain string //Root for vdir or Matching domain for subd, also act as key - Domain string //Domain or IP to proxy to - RequireTLS bool //Target domain require TLS - BypassGlobalTLS bool //Bypass global TLS setting options if TLS Listener enabled (parent.tlsListener != nil) - SkipCertValidations bool //Set to true to accept self signed certs - RequireBasicAuth bool //Set to true to request basic auth before proxy - BasicAuthCredentials []*BasicAuthCredentials `json:"-"` //Basic auth credentials - BasicAuthExceptionRules []*BasicAuthExceptionRule //Path to exclude in a basic auth enabled proxy target - Proxy *dpcore.ReverseProxy `json:"-"` - - parent *Router +// User defined headers to add into a proxy endpoint +type UserDefinedHeader struct { + Key string + Value string } +// A Virtual Directory endpoint, provide a subset of ProxyEndpoint for better +// program structure than directly using ProxyEndpoint +type VirtualDirectoryEndpoint struct { + MatchingPath string //Matching prefix of the request path, also act as key + Domain string //Domain or IP to proxy to + RequireTLS bool //Target domain require TLS + SkipCertValidations bool //Set to true to accept self signed certs + Disabled bool //If the rule is enabled + proxy *dpcore.ReverseProxy `json:"-"` + parent *ProxyEndpoint `json:"-"` +} + +// A proxy endpoint record, a general interface for handling inbound routing +type ProxyEndpoint struct { + ProxyType int //The type of this proxy, see const def + RootOrMatchingDomain string //Matching domain for host, also act as key + Domain string //Domain or IP to proxy to + + //TLS/SSL Related + RequireTLS bool //Target domain require TLS + BypassGlobalTLS bool //Bypass global TLS setting options if TLS Listener enabled (parent.tlsListener != nil) + SkipCertValidations bool //Set to true to accept self signed certs + + //Virtual Directories + VirtualDirectories []*VirtualDirectoryEndpoint + + //Custom Headers + UserDefinedHeaders []*UserDefinedHeader //Custom headers to append when proxying requests from this endpoint + + //Authentication + RequireBasicAuth bool //Set to true to request basic auth before proxy + BasicAuthCredentials []*BasicAuthCredentials //Basic auth credentials + BasicAuthExceptionRules []*BasicAuthExceptionRule //Path to exclude in a basic auth enabled proxy target + + //Fallback routing logic + DefaultSiteOption int //Fallback routing logic options + DefaultSiteValue string //Fallback routing target, optional + + Disabled bool //If the rule is disabled + //Internal Logic Elements + parent *Router + proxy *dpcore.ReverseProxy `json:"-"` +} + +/* + Routing type specific interface + These are options that only avaible for a specific interface + when running, these are converted into "ProxyEndpoint" objects + for more generic routing logic +*/ + // Root options are those that are required for reverse proxy handler to work -type RootOptions struct { - ProxyLocation string //Proxy Root target, all unset traffic will be forward to here - RequireTLS bool //Proxy root target require TLS connection (not recommended) - BypassGlobalTLS bool //Bypass global TLS setting and make root http only (not recommended) - SkipCertValidations bool //Skip cert validation, suitable for self-signed certs, CURRENTLY NOT USED - - //Basic Auth Related - RequireBasicAuth bool //Require basic auth, CURRENTLY NOT USED - BasicAuthCredentials []*BasicAuthCredentials - BasicAuthExceptionRules []*BasicAuthExceptionRule -} - -// Additional options are here for letting router knows how to route exception cases for root -type RootRoutingOptions struct { - //Root only configs - EnableRedirectForUnsetRules bool //Force unset rules to redirect to custom domain - UnsetRuleRedirectTarget string //Custom domain to redirect to for unset rules -} - -type VdirOptions struct { - RootName string - Domain string - RequireTLS bool - BypassGlobalTLS bool - SkipCertValidations bool - RequireBasicAuth bool - BasicAuthCredentials []*BasicAuthCredentials - BasicAuthExceptionRules []*BasicAuthExceptionRule -} - -type SubdOptions struct { - MatchingDomain string - Domain string - RequireTLS bool - BypassGlobalTLS bool - SkipCertValidations bool - RequireBasicAuth bool - BasicAuthCredentials []*BasicAuthCredentials - BasicAuthExceptionRules []*BasicAuthExceptionRule -} +const ( + DefaultSite_InternalStaticWebServer = 0 + DefaultSite_ReverseProxy = 1 + DefaultSite_Redirect = 2 + DefaultSite_NotFoundPage = 3 +) /* Web Templates diff --git a/src/mod/ganserv/handlers.go b/src/mod/ganserv/handlers.go index c15ae19..faa0326 100644 --- a/src/mod/ganserv/handlers.go +++ b/src/mod/ganserv/handlers.go @@ -207,7 +207,7 @@ func (m *NetworkManager) HandleSetRanges(w http.ResponseWriter, r *http.Request) utils.SendOK(w) } -//Handle listing of network members. Set details=true for listing all details +// Handle listing of network members. Set details=true for listing all details func (m *NetworkManager) HandleMemberList(w http.ResponseWriter, r *http.Request) { netid, err := utils.GetPara(r, "netid") if err != nil { @@ -241,7 +241,7 @@ func (m *NetworkManager) HandleMemberList(w http.ResponseWriter, r *http.Request } } -//Handle Authorization of members +// Handle Authorization of members func (m *NetworkManager) HandleMemberAuthorization(w http.ResponseWriter, r *http.Request) { netid, err := utils.PostPara(r, "netid") if err != nil { @@ -281,7 +281,7 @@ func (m *NetworkManager) HandleMemberAuthorization(w http.ResponseWriter, r *htt } } -//Handle Delete or Add IP for a member in a network +// Handle Delete or Add IP for a member in a network func (m *NetworkManager) HandleMemberIP(w http.ResponseWriter, r *http.Request) { netid, err := utils.PostPara(r, "netid") if err != nil { @@ -356,7 +356,7 @@ func (m *NetworkManager) HandleMemberIP(w http.ResponseWriter, r *http.Request) } } -//Handle naming for members +// Handle naming for members func (m *NetworkManager) HandleMemberNaming(w http.ResponseWriter, r *http.Request) { netid, err := utils.PostPara(r, "netid") if err != nil { @@ -391,7 +391,7 @@ func (m *NetworkManager) HandleMemberNaming(w http.ResponseWriter, r *http.Reque } } -//Handle delete of a given memver +// Handle delete of a given memver func (m *NetworkManager) HandleMemberDelete(w http.ResponseWriter, r *http.Request) { netid, err := utils.PostPara(r, "netid") if err != nil { @@ -426,3 +426,79 @@ func (m *NetworkManager) HandleMemberDelete(w http.ResponseWriter, r *http.Reque utils.SendOK(w) } + +// Check if a given network id is a network hosted on this zoraxy node +func (m *NetworkManager) IsLocalGAN(networkId string) bool { + networks, err := m.listNetworkIds() + if err != nil { + return false + } + + for _, network := range networks { + if network == networkId { + return true + } + } + + return false +} + +// Handle server instant joining a given network +func (m *NetworkManager) HandleServerJoinNetwork(w http.ResponseWriter, r *http.Request) { + netid, err := utils.PostPara(r, "netid") + if err != nil { + utils.SendErrorResponse(w, "net id not set") + return + } + + //Check if the target network is a network hosted on this server + if !m.IsLocalGAN(netid) { + utils.SendErrorResponse(w, "given network is not a GAN hosted on this node") + return + } + + if m.memberExistsInNetwork(netid, m.ControllerID) { + utils.SendErrorResponse(w, "controller already inside network") + return + } + + //Join the network + err = m.joinNetwork(netid) + if err != nil { + utils.SendErrorResponse(w, err.Error()) + return + } + + utils.SendOK(w) +} + +// Handle server instant leaving a given network +func (m *NetworkManager) HandleServerLeaveNetwork(w http.ResponseWriter, r *http.Request) { + netid, err := utils.PostPara(r, "netid") + if err != nil { + utils.SendErrorResponse(w, "net id not set") + return + } + + //Check if the target network is a network hosted on this server + if !m.IsLocalGAN(netid) { + utils.SendErrorResponse(w, "given network is not a GAN hosted on this node") + return + } + + //Leave the network + err = m.leaveNetwork(netid) + if err != nil { + utils.SendErrorResponse(w, err.Error()) + return + } + + //Remove it from target network if it is authorized + err = m.deleteMember(netid, m.ControllerID) + if err != nil { + utils.SendErrorResponse(w, err.Error()) + return + } + + utils.SendOK(w) +} diff --git a/src/mod/ganserv/zerotier.go b/src/mod/ganserv/zerotier.go index 3016948..3fd6cbd 100644 --- a/src/mod/ganserv/zerotier.go +++ b/src/mod/ganserv/zerotier.go @@ -117,7 +117,7 @@ type MemberInfo struct { VRev int `json:"vRev"` } -//Get the zerotier node info from local service +// Get the zerotier node info from local service func getControllerInfo(token string, apiPort int) (*NodeInfo, error) { url := "http://localhost:" + strconv.Itoa(apiPort) + "/status" @@ -187,7 +187,7 @@ func (m *NetworkManager) createNetwork() (*NetworkInfo, error) { return &networkInfo, nil } -//List network details +// List network details func (m *NetworkManager) getNetworkInfoById(networkId string) (*NetworkInfo, error) { req, err := http.NewRequest("GET", os.ExpandEnv("http://localhost:"+strconv.Itoa(m.apiPort)+"/controller/network/"+networkId+"/"), nil) if err != nil { @@ -249,7 +249,7 @@ func (m *NetworkManager) setNetworkInfoByID(networkId string, newNetworkInfo *Ne return nil } -//List network IDs +// List network IDs func (m *NetworkManager) listNetworkIds() ([]string, error) { req, err := http.NewRequest("GET", "http://localhost:"+strconv.Itoa(m.apiPort)+"/controller/network/", nil) if err != nil { @@ -281,7 +281,7 @@ func (m *NetworkManager) listNetworkIds() ([]string, error) { return networkIds, nil } -//wrapper for checking if a network id exists +// wrapper for checking if a network id exists func (m *NetworkManager) networkExists(networkId string) bool { networkIds, err := m.listNetworkIds() if err != nil { @@ -297,7 +297,7 @@ func (m *NetworkManager) networkExists(networkId string) bool { return false } -//delete a network +// delete a network func (m *NetworkManager) deleteNetwork(networkID string) error { url := "http://localhost:" + strconv.Itoa(m.apiPort) + "/controller/network/" + networkID + "/" client := &http.Client{} @@ -330,8 +330,8 @@ func (m *NetworkManager) deleteNetwork(networkID string) error { return nil } -//Configure network -//Example: configureNetwork(netid, "192.168.192.1", "192.168.192.254", "192.168.192.0/24") +// Configure network +// Example: configureNetwork(netid, "192.168.192.1", "192.168.192.254", "192.168.192.0/24") func (m *NetworkManager) configureNetwork(networkID string, ipRangeStart string, ipRangeEnd string, routeTarget string) error { url := "http://localhost:" + strconv.Itoa(m.apiPort) + "/controller/network/" + networkID + "/" data := map[string]interface{}{ @@ -545,7 +545,7 @@ func (m *NetworkManager) memberExistsInNetwork(netid string, memid string) bool return false } -//Get a network memeber info by netid and memberid +// Get a network memeber info by netid and memberid func (m *NetworkManager) getNetworkMemberInfo(netid string, memberid string) (*MemberInfo, error) { req, err := http.NewRequest("GET", "http://localhost:"+strconv.Itoa(m.apiPort)+"/controller/network/"+netid+"/member/"+memberid, nil) if err != nil { @@ -573,7 +573,7 @@ func (m *NetworkManager) getNetworkMemberInfo(netid string, memberid string) (*M return thisMemeberInfo, nil } -//Set the authorization state of a member +// Set the authorization state of a member func (m *NetworkManager) AuthorizeMember(netid string, memberid string, setAuthorized bool) error { url := "http://localhost:" + strconv.Itoa(m.apiPort) + "/controller/network/" + netid + "/member/" + memberid payload := []byte(`{"authorized": true}`) @@ -600,7 +600,7 @@ func (m *NetworkManager) AuthorizeMember(netid string, memberid string, setAutho return nil } -//Delete a member from the network +// Delete a member from the network func (m *NetworkManager) deleteMember(netid string, memid string) error { req, err := http.NewRequest("DELETE", "http://localhost:"+strconv.Itoa(m.apiPort)+"/controller/network/"+netid+"/member/"+memid, nil) if err != nil { @@ -620,3 +620,45 @@ func (m *NetworkManager) deleteMember(netid string, memid string) error { return nil } + +// Make the host to join a given network +func (m *NetworkManager) joinNetwork(netid string) error { + req, err := http.NewRequest("POST", "http://localhost:"+strconv.Itoa(m.apiPort)+"/network/"+netid, nil) + if err != nil { + return err + } + req.Header.Set("X-Zt1-Auth", os.ExpandEnv(m.authToken)) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + return errors.New("network error. Status code: " + strconv.Itoa(resp.StatusCode)) + } + + return nil +} + +// Make the host to leave a given network +func (m *NetworkManager) leaveNetwork(netid string) error { + req, err := http.NewRequest("DELETE", "http://localhost:"+strconv.Itoa(m.apiPort)+"/network/"+netid, nil) + if err != nil { + return err + } + req.Header.Set("X-Zt1-Auth", os.ExpandEnv(m.authToken)) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + return errors.New("network error. Status code: " + strconv.Itoa(resp.StatusCode)) + } + + return nil +} diff --git a/src/mod/geodb/whitelist.go b/src/mod/geodb/whitelist.go index c643b60..5873b50 100644 --- a/src/mod/geodb/whitelist.go +++ b/src/mod/geodb/whitelist.go @@ -1,6 +1,9 @@ package geodb -import "strings" +import ( + "encoding/json" + "strings" +) /* Whitelist.go @@ -8,11 +11,29 @@ import "strings" This script handles whitelist related functions */ +const ( + EntryType_CountryCode int = 0 + EntryType_IP int = 1 +) + +type WhitelistEntry struct { + EntryType int //Entry type of whitelist, Country Code or IP + CC string //ISO Country Code + IP string //IP address or range + Comment string //Comment for this entry +} + //Geo Whitelist -func (s *Store) AddCountryCodeToWhitelist(countryCode string) { +func (s *Store) AddCountryCodeToWhitelist(countryCode string, comment string) { countryCode = strings.ToLower(countryCode) - s.sysdb.Write("whitelist-cn", countryCode, true) + entry := WhitelistEntry{ + EntryType: EntryType_CountryCode, + CC: countryCode, + Comment: comment, + } + + s.sysdb.Write("whitelist-cn", countryCode, entry) } func (s *Store) RemoveCountryCodeFromWhitelist(countryCode string) { @@ -22,20 +43,19 @@ func (s *Store) RemoveCountryCodeFromWhitelist(countryCode string) { func (s *Store) IsCountryCodeWhitelisted(countryCode string) bool { countryCode = strings.ToLower(countryCode) - var isWhitelisted bool = false - s.sysdb.Read("whitelist-cn", countryCode, &isWhitelisted) - return isWhitelisted + return s.sysdb.KeyExists("whitelist-cn", countryCode) } -func (s *Store) GetAllWhitelistedCountryCode() []string { - whitelistedCountryCode := []string{} +func (s *Store) GetAllWhitelistedCountryCode() []*WhitelistEntry { + whitelistedCountryCode := []*WhitelistEntry{} entries, err := s.sysdb.ListTable("whitelist-cn") if err != nil { return whitelistedCountryCode } for _, keypairs := range entries { - ip := string(keypairs[0]) - whitelistedCountryCode = append(whitelistedCountryCode, ip) + thisWhitelistEntry := WhitelistEntry{} + json.Unmarshal(keypairs[1], &thisWhitelistEntry) + whitelistedCountryCode = append(whitelistedCountryCode, &thisWhitelistEntry) } return whitelistedCountryCode @@ -43,8 +63,14 @@ func (s *Store) GetAllWhitelistedCountryCode() []string { //IP Whitelist -func (s *Store) AddIPToWhiteList(ipAddr string) { - s.sysdb.Write("whitelist-ip", ipAddr, true) +func (s *Store) AddIPToWhiteList(ipAddr string, comment string) { + thisIpEntry := WhitelistEntry{ + EntryType: EntryType_IP, + IP: ipAddr, + Comment: comment, + } + + s.sysdb.Write("whitelist-ip", ipAddr, thisIpEntry) } func (s *Store) RemoveIPFromWhiteList(ipAddr string) { @@ -52,14 +78,14 @@ func (s *Store) RemoveIPFromWhiteList(ipAddr string) { } func (s *Store) IsIPWhitelisted(ipAddr string) bool { - var isWhitelisted bool = false - s.sysdb.Read("whitelist-ip", ipAddr, &isWhitelisted) + isWhitelisted := s.sysdb.KeyExists("whitelist-ip", ipAddr) if isWhitelisted { + //single IP whitelist entry return true } //Check for IP wildcard and CIRD rules - AllWhitelistedIps := s.GetAllWhitelistedIp() + AllWhitelistedIps := s.GetAllWhitelistedIpAsStringSlice() for _, whitelistRules := range AllWhitelistedIps { wildcardMatch := MatchIpWildcard(ipAddr, whitelistRules) if wildcardMatch { @@ -75,17 +101,29 @@ func (s *Store) IsIPWhitelisted(ipAddr string) bool { return false } -func (s *Store) GetAllWhitelistedIp() []string { - whitelistedIp := []string{} +func (s *Store) GetAllWhitelistedIp() []*WhitelistEntry { + whitelistedIp := []*WhitelistEntry{} entries, err := s.sysdb.ListTable("whitelist-ip") if err != nil { return whitelistedIp } for _, keypairs := range entries { - ip := string(keypairs[0]) - whitelistedIp = append(whitelistedIp, ip) + //ip := string(keypairs[0]) + thisEntry := WhitelistEntry{} + json.Unmarshal(keypairs[1], &thisEntry) + whitelistedIp = append(whitelistedIp, &thisEntry) } return whitelistedIp } + +func (s *Store) GetAllWhitelistedIpAsStringSlice() []string { + allWhitelistedIPs := []string{} + entries := s.GetAllWhitelistedIp() + for _, entry := range entries { + allWhitelistedIPs = append(allWhitelistedIPs, entry.IP) + } + + return allWhitelistedIPs +} diff --git a/src/mod/reverseproxy/reverse.go b/src/mod/reverseproxy/reverse.go index 678287e..6ded0ae 100644 --- a/src/mod/reverseproxy/reverse.go +++ b/src/mod/reverseproxy/reverse.go @@ -211,9 +211,9 @@ func removeHeaders(header http.Header) { } } - if header.Get("A-Upgrade") != "" { - header.Set("Upgrade", header.Get("A-Upgrade")) - header.Del("A-Upgrade") + if header.Get("Zr-Origin-Upgrade") != "" { + header.Set("Upgrade", header.Get("Zr-Origin-Upgrade")) + header.Del("Zr-Origin-Upgrade") } } diff --git a/src/mod/sshprox/sshprox.go b/src/mod/sshprox/sshprox.go index 75b6874..429013c 100644 --- a/src/mod/sshprox/sshprox.go +++ b/src/mod/sshprox/sshprox.go @@ -82,7 +82,7 @@ func (m *Manager) HandleHttpByInstanceId(instanceId string, w http.ResponseWrite requestURL := r.URL.String() if r.Header["Upgrade"] != nil && strings.ToLower(r.Header["Upgrade"][0]) == "websocket" { //Handle WebSocket request. Forward the custom Upgrade header and rewrite origin - r.Header.Set("A-Upgrade", "websocket") + r.Header.Set("Zr-Origin-Upgrade", "websocket") requestURL = strings.TrimPrefix(requestURL, "/") u, _ := url.Parse("ws://127.0.0.1:" + strconv.Itoa(targetInstance.AssignedPort) + "/" + requestURL) wspHandler := websocketproxy.NewProxy(u, false) diff --git a/src/mod/tlscert/helper.go b/src/mod/tlscert/helper.go index 10c52da..a637d65 100644 --- a/src/mod/tlscert/helper.go +++ b/src/mod/tlscert/helper.go @@ -5,22 +5,22 @@ import ( "strings" ) -//This remove the certificates in the list where either the -//public key or the private key is missing +// This remove the certificates in the list where either the +// public key or the private key is missing func getCertPairs(certFiles []string) []string { - crtMap := make(map[string]bool) + pemMap := make(map[string]bool) keyMap := make(map[string]bool) for _, filename := range certFiles { - if filepath.Ext(filename) == ".crt" { - crtMap[strings.TrimSuffix(filename, ".crt")] = true + if filepath.Ext(filename) == ".pem" { + pemMap[strings.TrimSuffix(filename, ".pem")] = true } else if filepath.Ext(filename) == ".key" { keyMap[strings.TrimSuffix(filename, ".key")] = true } } var result []string - for domain := range crtMap { + for domain := range pemMap { if keyMap[domain] { result = append(result, domain) } @@ -29,7 +29,7 @@ func getCertPairs(certFiles []string) []string { return result } -//Get the cloest subdomain certificate from a list of domains +// Get the cloest subdomain certificate from a list of domains func matchClosestDomainCertificate(subdomain string, domains []string) string { var matchingDomain string = "" maxLength := 0 @@ -43,18 +43,3 @@ func matchClosestDomainCertificate(subdomain string, domains []string) string { return matchingDomain } - -//Check if a requesting domain is a subdomain of a given domain -func isSubdomain(subdomain, domain string) bool { - subdomainParts := strings.Split(subdomain, ".") - domainParts := strings.Split(domain, ".") - if len(subdomainParts) < len(domainParts) { - return false - } - for i := range domainParts { - if subdomainParts[len(subdomainParts)-1-i] != domainParts[len(domainParts)-1-i] { - return false - } - } - return true -} diff --git a/src/mod/tlscert/localhost.crt b/src/mod/tlscert/localhost.pem similarity index 100% rename from src/mod/tlscert/localhost.crt rename to src/mod/tlscert/localhost.pem diff --git a/src/mod/tlscert/tlscert.go b/src/mod/tlscert/tlscert.go index 6a739eb..fbd0a13 100644 --- a/src/mod/tlscert/tlscert.go +++ b/src/mod/tlscert/tlscert.go @@ -6,7 +6,6 @@ import ( "embed" "encoding/pem" "io" - "io/ioutil" "log" "os" "path/filepath" @@ -15,12 +14,19 @@ import ( "imuslab.com/zoraxy/mod/utils" ) -type Manager struct { - CertStore string - verbal bool +type CertCache struct { + Cert *x509.Certificate + PubKey string + PriKey string } -//go:embed localhost.crt localhost.key +type Manager struct { + CertStore string //Path where all the certs are stored + LoadedCerts []*CertCache //A list of loaded certs + verbal bool +} + +//go:embed localhost.pem localhost.key var buildinCertStore embed.FS func NewManager(certStore string, verbal bool) (*Manager, error) { @@ -28,14 +34,99 @@ func NewManager(certStore string, verbal bool) (*Manager, error) { os.MkdirAll(certStore, 0775) } + pubKey := "./tmp/localhost.pem" + priKey := "./tmp/localhost.key" + + //Check if this is initial setup + if !utils.FileExists(pubKey) { + buildInPubKey, _ := buildinCertStore.ReadFile(filepath.Base(pubKey)) + os.WriteFile(pubKey, buildInPubKey, 0775) + } + + if !utils.FileExists(priKey) { + buildInPriKey, _ := buildinCertStore.ReadFile(filepath.Base(priKey)) + os.WriteFile(priKey, buildInPriKey, 0775) + } + thisManager := Manager{ - CertStore: certStore, - verbal: verbal, + CertStore: certStore, + LoadedCerts: []*CertCache{}, + verbal: verbal, + } + + err := thisManager.UpdateLoadedCertList() + if err != nil { + return nil, err } return &thisManager, nil } +// Update domain mapping from file +func (m *Manager) UpdateLoadedCertList() error { + //Get a list of certificates from file + domainList, err := m.ListCertDomains() + if err != nil { + return err + } + + //Load each of the certificates into memory + certList := []*CertCache{} + for _, certname := range domainList { + //Read their certificate into memory + pubKey := filepath.Join(m.CertStore, certname+".pem") + priKey := filepath.Join(m.CertStore, certname+".key") + certificate, err := tls.LoadX509KeyPair(pubKey, priKey) + if err != nil { + log.Println("Certificate loaded failed: " + certname) + continue + } + + for _, thisCert := range certificate.Certificate { + loadedCert, err := x509.ParseCertificate(thisCert) + if err != nil { + //Error pasring cert, skip this byte segment + continue + } + + thisCacheEntry := CertCache{ + Cert: loadedCert, + PubKey: pubKey, + PriKey: priKey, + } + certList = append(certList, &thisCacheEntry) + } + } + + //Replace runtime cert array + m.LoadedCerts = certList + + return nil +} + +// Match cert by CN +func (m *Manager) CertMatchExists(serverName string) bool { + for _, certCacheEntry := range m.LoadedCerts { + if certCacheEntry.Cert.VerifyHostname(serverName) == nil || certCacheEntry.Cert.Issuer.CommonName == serverName { + return true + } + } + return false +} + +// Get cert entry by matching server name, return pubKey and priKey if found +// check with CertMatchExists before calling to the load function +func (m *Manager) GetCertByX509CNHostname(serverName string) (string, string) { + for _, certCacheEntry := range m.LoadedCerts { + if certCacheEntry.Cert.VerifyHostname(serverName) == nil || certCacheEntry.Cert.Issuer.CommonName == serverName { + return certCacheEntry.PubKey, certCacheEntry.PriKey + } + } + + return "", "" +} + +// Return a list of domains by filename func (m *Manager) ListCertDomains() ([]string, error) { filenames, err := m.ListCerts() if err != nil { @@ -48,8 +139,9 @@ func (m *Manager) ListCertDomains() ([]string, error) { return filenames, nil } +// Return a list of cert files (public and private keys) func (m *Manager) ListCerts() ([]string, error) { - certs, err := ioutil.ReadDir(m.CertStore) + certs, err := os.ReadDir(m.CertStore) if err != nil { return []string{}, err } @@ -64,44 +156,52 @@ func (m *Manager) ListCerts() ([]string, error) { return filenames, nil } +// Get a certificate from disk where its certificate matches with the helloinfo func (m *Manager) GetCert(helloInfo *tls.ClientHelloInfo) (*tls.Certificate, error) { //Check if the domain corrisponding cert exists - pubKey := "./tmp/localhost.crt" + pubKey := "./tmp/localhost.pem" priKey := "./tmp/localhost.key" - //Check if this is initial setup - if !utils.FileExists(pubKey) { - buildInPubKey, _ := buildinCertStore.ReadFile(filepath.Base(pubKey)) - os.WriteFile(pubKey, buildInPubKey, 0775) - } - - if !utils.FileExists(priKey) { - buildInPriKey, _ := buildinCertStore.ReadFile(filepath.Base(priKey)) - os.WriteFile(priKey, buildInPriKey, 0775) - } - - if utils.FileExists(filepath.Join(m.CertStore, helloInfo.ServerName+".crt")) && utils.FileExists(filepath.Join(m.CertStore, helloInfo.ServerName+".key")) { - pubKey = filepath.Join(m.CertStore, helloInfo.ServerName+".crt") + if utils.FileExists(filepath.Join(m.CertStore, helloInfo.ServerName+".pem")) && utils.FileExists(filepath.Join(m.CertStore, helloInfo.ServerName+".key")) { + //Direct hit + pubKey = filepath.Join(m.CertStore, helloInfo.ServerName+".pem") priKey = filepath.Join(m.CertStore, helloInfo.ServerName+".key") - + } else if m.CertMatchExists(helloInfo.ServerName) { + //Use x509 + pubKey, priKey = m.GetCertByX509CNHostname(helloInfo.ServerName) } else { - domainCerts, _ := m.ListCertDomains() - cloestDomainCert := matchClosestDomainCertificate(helloInfo.ServerName, domainCerts) - if cloestDomainCert != "" { - //There is a matching parent domain for this subdomain. Use this instead. - pubKey = filepath.Join(m.CertStore, cloestDomainCert+".crt") - priKey = filepath.Join(m.CertStore, cloestDomainCert+".key") - } else if m.DefaultCertExists() { - //Use default.crt and default.key - pubKey = filepath.Join(m.CertStore, "default.crt") + //Fallback to legacy method of matching certificates + /* + domainCerts, _ := m.ListCertDomains() + cloestDomainCert := matchClosestDomainCertificate(helloInfo.ServerName, domainCerts) + if cloestDomainCert != "" { + //There is a matching parent domain for this subdomain. Use this instead. + pubKey = filepath.Join(m.CertStore, cloestDomainCert+".pem") + priKey = filepath.Join(m.CertStore, cloestDomainCert+".key") + } else if m.DefaultCertExists() { + //Use default.pem and default.key + pubKey = filepath.Join(m.CertStore, "default.pem") + priKey = filepath.Join(m.CertStore, "default.key") + if m.verbal { + log.Println("No matching certificate found. Serving with default") + } + } else { + if m.verbal { + log.Println("Matching certificate not found. Serving with build-in certificate. Requesting server name: ", helloInfo.ServerName) + } + }*/ + + if m.DefaultCertExists() { + //Use default.pem and default.key + pubKey = filepath.Join(m.CertStore, "default.pem") priKey = filepath.Join(m.CertStore, "default.key") - if m.verbal { - log.Println("No matching certificate found. Serving with default") - } + //if m.verbal { + // log.Println("No matching certificate found. Serving with default") + //} } else { - if m.verbal { - log.Println("Matching certificate not found. Serving with build-in certificate. Requesting server name: ", helloInfo.ServerName) - } + //if m.verbal { + // log.Println("Matching certificate not found. Serving with build-in certificate. Requesting server name: ", helloInfo.ServerName) + //} } } @@ -117,17 +217,17 @@ func (m *Manager) GetCert(helloInfo *tls.ClientHelloInfo) (*tls.Certificate, err // Check if both the default cert public key and private key exists func (m *Manager) DefaultCertExists() bool { - return utils.FileExists(filepath.Join(m.CertStore, "default.crt")) && utils.FileExists(filepath.Join(m.CertStore, "default.key")) + return utils.FileExists(filepath.Join(m.CertStore, "default.pem")) && utils.FileExists(filepath.Join(m.CertStore, "default.key")) } // Check if the default cert exists returning seperate results for pubkey and prikey func (m *Manager) DefaultCertExistsSep() (bool, bool) { - return utils.FileExists(filepath.Join(m.CertStore, "default.crt")), utils.FileExists(filepath.Join(m.CertStore, "default.key")) + return utils.FileExists(filepath.Join(m.CertStore, "default.pem")), utils.FileExists(filepath.Join(m.CertStore, "default.key")) } // Delete the cert if exists func (m *Manager) RemoveCert(domain string) error { - pubKey := filepath.Join(m.CertStore, domain+".crt") + pubKey := filepath.Join(m.CertStore, domain+".pem") priKey := filepath.Join(m.CertStore, domain+".key") if utils.FileExists(pubKey) { err := os.Remove(pubKey) @@ -143,6 +243,9 @@ func (m *Manager) RemoveCert(domain string) error { } } + //Update the cert list + m.UpdateLoadedCertList() + return nil } @@ -171,15 +274,11 @@ func IsValidTLSFile(file io.Reader) bool { return false } // Check if the certificate is a valid TLS/SSL certificate - return cert.IsCA == false && cert.KeyUsage&x509.KeyUsageDigitalSignature != 0 && cert.KeyUsage&x509.KeyUsageKeyEncipherment != 0 + return !cert.IsCA && cert.KeyUsage&x509.KeyUsageDigitalSignature != 0 && cert.KeyUsage&x509.KeyUsageKeyEncipherment != 0 } else if strings.Contains(block.Type, "PRIVATE KEY") { // The file contains a private key _, err := x509.ParsePKCS1PrivateKey(block.Bytes) - if err != nil { - // Handle the error - return false - } - return true + return err == nil } else { return false } diff --git a/src/mod/uptime/uptime.go b/src/mod/uptime/uptime.go index 1308592..256b317 100644 --- a/src/mod/uptime/uptime.go +++ b/src/mod/uptime/uptime.go @@ -217,7 +217,11 @@ func getWebsiteStatusWithLatency(url string) (bool, int64, int) { } func getWebsiteStatus(url string) (int, error) { - resp, err := http.Get(url) + client := http.Client{ + Timeout: 10 * time.Second, + } + + resp, err := client.Get(url) if err != nil { //Try replace the http with https and vise versa rewriteURL := "" @@ -227,7 +231,7 @@ func getWebsiteStatus(url string) (int, error) { rewriteURL = strings.ReplaceAll(url, "http://", "https://") } - resp, err = http.Get(rewriteURL) + resp, err = client.Get(rewriteURL) if err != nil { if strings.Contains(err.Error(), "http: server gave HTTP response to HTTPS client") { //Invalid downstream reverse proxy settings, but it is online diff --git a/src/mod/webserv/handler.go b/src/mod/webserv/handler.go index 5db1837..1aa96e6 100644 --- a/src/mod/webserv/handler.go +++ b/src/mod/webserv/handler.go @@ -72,6 +72,7 @@ func (ws *WebServer) HandlePortChange(w http.ResponseWriter, r *http.Request) { utils.SendErrorResponse(w, err.Error()) return } + utils.SendOK(w) } diff --git a/src/mod/webserv/webserv.go b/src/mod/webserv/webserv.go index 9eb7ee7..d516501 100644 --- a/src/mod/webserv/webserv.go +++ b/src/mod/webserv/webserv.go @@ -89,7 +89,7 @@ func (ws *WebServer) RestorePreviousState() { ws.option.EnableDirectoryListing = enableDirList //Check the running state - webservRunning := false + webservRunning := true ws.option.Sysdb.Read("webserv", "enabled", &webservRunning) if webservRunning { ws.Start() @@ -124,6 +124,11 @@ func (ws *WebServer) ChangePort(port string) error { return nil } +// Get current using port in options +func (ws *WebServer) GetListeningPort() string { + return ws.option.Port +} + // Start starts the web server. func (ws *WebServer) Start() error { ws.mu.Lock() diff --git a/src/reverseproxy.go b/src/reverseproxy.go index f1bd381..10e06bb 100644 --- a/src/reverseproxy.go +++ b/src/reverseproxy.go @@ -21,6 +21,9 @@ var ( // Add user customizable reverse proxy func ReverseProxtInit() { + /* + Load Reverse Proxy Global Settings + */ inboundPort := 80 if sysdb.KeyExists("settings", "inbound") { sysdb.Read("settings", "inbound", &inboundPort) @@ -45,6 +48,14 @@ func ReverseProxtInit() { SystemWideLogger.Println("Force latest TLS mode disabled. Minimum TLS version is set to v1.0") } + developmentMode := false + sysdb.Read("settings", "devMode", &developmentMode) + if useTls { + SystemWideLogger.Println("Development mode enabled. Using no-store Cache Control policy") + } else { + SystemWideLogger.Println("Development mode disabled. Proxying with default Cache Control policy") + } + listenOnPort80 := false sysdb.Read("settings", "listenP80", &listenOnPort80) if listenOnPort80 { @@ -63,11 +74,19 @@ func ReverseProxtInit() { SystemWideLogger.Println("Force HTTPS mode disabled") } + /* + Create a new proxy object + The DynamicProxy is the parent of all reverse proxy handlers, + use for managemening and provide functions to access proxy handlers + */ + dprouter, err := dynamicproxy.NewDynamicProxy(dynamicproxy.RouterOption{ HostUUID: nodeUUID, + HostVersion: version, Port: inboundPort, UseTls: useTls, ForceTLSLatest: forceLatestTLSVersion, + NoCache: developmentMode, ListenOnPort80: listenOnPort80, ForceHttpsRedirect: forceHttpsRedirect, TlsManager: tlsCertManager, @@ -83,45 +102,28 @@ func ReverseProxtInit() { dynamicProxyRouter = dprouter - //Load all conf from files + /* + + Load all conf from files + + */ confs, _ := filepath.Glob("./conf/proxy/*.config") for _, conf := range confs { - record, err := LoadReverseProxyConfig(conf) + err := LoadReverseProxyConfig(conf) if err != nil { SystemWideLogger.PrintAndLog("Proxy", "Failed to load config file: "+filepath.Base(conf), err) return } + } - if record.ProxyType == "root" { - dynamicProxyRouter.SetRootProxy(&dynamicproxy.RootOptions{ - ProxyLocation: record.ProxyTarget, - RequireTLS: record.UseTLS, - }) - } else if record.ProxyType == "subd" { - dynamicProxyRouter.AddSubdomainRoutingService(&dynamicproxy.SubdOptions{ - MatchingDomain: record.Rootname, - Domain: record.ProxyTarget, - RequireTLS: record.UseTLS, - BypassGlobalTLS: record.BypassGlobalTLS, - SkipCertValidations: record.SkipTlsValidation, - RequireBasicAuth: record.RequireBasicAuth, - BasicAuthCredentials: record.BasicAuthCredentials, - BasicAuthExceptionRules: record.BasicAuthExceptionRules, - }) - } else if record.ProxyType == "vdir" { - dynamicProxyRouter.AddVirtualDirectoryProxyService(&dynamicproxy.VdirOptions{ - RootName: record.Rootname, - Domain: record.ProxyTarget, - RequireTLS: record.UseTLS, - BypassGlobalTLS: record.BypassGlobalTLS, - SkipCertValidations: record.SkipTlsValidation, - RequireBasicAuth: record.RequireBasicAuth, - BasicAuthCredentials: record.BasicAuthCredentials, - BasicAuthExceptionRules: record.BasicAuthExceptionRules, - }) - } else { - SystemWideLogger.PrintAndLog("Proxy", "Unsupported endpoint type: "+record.ProxyType+". Skipping "+filepath.Base(conf), nil) + if dynamicProxyRouter.Root == nil { + //Root config not set (new deployment?), use internal static web server as root + defaultRootRouter, err := GetDefaultRootConfig() + if err != nil { + SystemWideLogger.PrintAndLog("Proxy", "Failed to generate default root routing", err) + return } + dynamicProxyRouter.SetProxyRouteAsRoot(defaultRootRouter) } //Start Service @@ -173,7 +175,7 @@ func ReverseProxyHandleOnOff(w http.ResponseWriter, r *http.Request) { } func ReverseProxyHandleAddEndpoint(w http.ResponseWriter, r *http.Request) { - eptype, err := utils.PostPara(r, "type") //Support root, vdir and subd + eptype, err := utils.PostPara(r, "type") //Support root and host if err != nil { utils.SendErrorResponse(w, "type not defined") return @@ -241,96 +243,112 @@ func ReverseProxyHandleAddEndpoint(w http.ResponseWriter, r *http.Request) { } } - rootname := "" - if eptype == "vdir" { - vdir, err := utils.PostPara(r, "rootname") - if err != nil { - utils.SendErrorResponse(w, "vdir not defined") - return - } - - //Vdir must start with / - if !strings.HasPrefix(vdir, "/") { - vdir = "/" + vdir - } - rootname = vdir - - thisOption := dynamicproxy.VdirOptions{ - RootName: vdir, - Domain: endpoint, - RequireTLS: useTLS, - BypassGlobalTLS: useBypassGlobalTLS, - SkipCertValidations: skipTlsValidation, - RequireBasicAuth: requireBasicAuth, - BasicAuthCredentials: basicAuthCredentials, - } - dynamicProxyRouter.AddVirtualDirectoryProxyService(&thisOption) - - } else if eptype == "subd" { - subdomain, err := utils.PostPara(r, "rootname") + var proxyEndpointCreated *dynamicproxy.ProxyEndpoint + if eptype == "host" { + rootOrMatchingDomain, err := utils.PostPara(r, "rootname") if err != nil { utils.SendErrorResponse(w, "subdomain not defined") return } - rootname = subdomain - thisOption := dynamicproxy.SubdOptions{ - MatchingDomain: subdomain, + thisProxyEndpoint := dynamicproxy.ProxyEndpoint{ + //I/O + ProxyType: dynamicproxy.ProxyType_Host, + RootOrMatchingDomain: rootOrMatchingDomain, + Domain: endpoint, + //TLS + RequireTLS: useTLS, + BypassGlobalTLS: useBypassGlobalTLS, + SkipCertValidations: skipTlsValidation, + //VDir + VirtualDirectories: []*dynamicproxy.VirtualDirectoryEndpoint{}, + //Custom headers + UserDefinedHeaders: []*dynamicproxy.UserDefinedHeader{}, + //Auth + RequireBasicAuth: requireBasicAuth, + BasicAuthCredentials: basicAuthCredentials, + BasicAuthExceptionRules: []*dynamicproxy.BasicAuthExceptionRule{}, + DefaultSiteOption: 0, + DefaultSiteValue: "", + } + + preparedEndpoint, err := dynamicProxyRouter.PrepareProxyRoute(&thisProxyEndpoint) + if err != nil { + utils.SendErrorResponse(w, "unable to prepare proxy route to target endpoint: "+err.Error()) + return + } + + dynamicProxyRouter.AddProxyRouteToRuntime(preparedEndpoint) + proxyEndpointCreated = &thisProxyEndpoint + } else if eptype == "root" { + //Get the default site options and target + dsOptString, err := utils.PostPara(r, "defaultSiteOpt") + if err != nil { + utils.SendErrorResponse(w, "default site action not defined") + return + } + + var defaultSiteOption int = 1 + opt, err := strconv.Atoi(dsOptString) + if err != nil { + utils.SendErrorResponse(w, "invalid default site option") + return + } + + defaultSiteOption = opt + + dsVal, err := utils.PostPara(r, "defaultSiteVal") + if err != nil && (defaultSiteOption == 1 || defaultSiteOption == 2) { + //Reverse proxy or redirect, must require value to be set + utils.SendErrorResponse(w, "target not defined") + return + } + + //Write the root options to file + rootRoutingEndpoint := dynamicproxy.ProxyEndpoint{ + ProxyType: dynamicproxy.ProxyType_Root, + RootOrMatchingDomain: "/", Domain: endpoint, RequireTLS: useTLS, - BypassGlobalTLS: useBypassGlobalTLS, - SkipCertValidations: skipTlsValidation, - RequireBasicAuth: requireBasicAuth, - BasicAuthCredentials: basicAuthCredentials, + BypassGlobalTLS: false, + SkipCertValidations: false, + + DefaultSiteOption: defaultSiteOption, + DefaultSiteValue: dsVal, } - dynamicProxyRouter.AddSubdomainRoutingService(&thisOption) - } else if eptype == "root" { - rootname = "root" - thisOption := dynamicproxy.RootOptions{ - ProxyLocation: endpoint, - RequireTLS: useTLS, + preparedRootProxyRoute, err := dynamicProxyRouter.PrepareProxyRoute(&rootRoutingEndpoint) + if err != nil { + utils.SendErrorResponse(w, "unable to prepare root routing: "+err.Error()) + return } - dynamicProxyRouter.SetRootProxy(&thisOption) + + dynamicProxyRouter.SetProxyRouteAsRoot(preparedRootProxyRoute) + proxyEndpointCreated = &rootRoutingEndpoint } else { //Invalid eptype - utils.SendErrorResponse(w, "Invalid endpoint type") + utils.SendErrorResponse(w, "invalid endpoint type") return } - //Save it - thisProxyConfigRecord := Record{ - ProxyType: eptype, - Rootname: rootname, - ProxyTarget: endpoint, - UseTLS: useTLS, - BypassGlobalTLS: useBypassGlobalTLS, - SkipTlsValidation: skipTlsValidation, - RequireBasicAuth: requireBasicAuth, - BasicAuthCredentials: basicAuthCredentials, + //Save the config to file + err = SaveReverseProxyConfig(proxyEndpointCreated) + if err != nil { + SystemWideLogger.PrintAndLog("Proxy", "Unable to save new proxy rule to file", err) + return } - SaveReverseProxyConfigToFile(&thisProxyConfigRecord) //Update utm if exists - if uptimeMonitor != nil { - uptimeMonitor.Config.Targets = GetUptimeTargetsFromReverseProxyRules(dynamicProxyRouter) - uptimeMonitor.CleanRecords() - } + UpdateUptimeMonitorTargets() utils.SendOK(w) } /* ReverseProxyHandleEditEndpoint handles proxy endpoint edit -This endpoint do not handle -basic auth credential update. The credential -will be loaded from old config and reused +(host only, for root use Default Site page to edit) +This endpoint do not handle basic auth credential update. +The credential will be loaded from old config and reused */ func ReverseProxyHandleEditEndpoint(w http.ResponseWriter, r *http.Request) { - eptype, err := utils.PostPara(r, "type") //Support root, vdir and subd - if err != nil { - utils.SendErrorResponse(w, "type not defined") - return - } - rootNameOrMatchingDomain, err := utils.PostPara(r, "rootname") if err != nil { utils.SendErrorResponse(w, "Target proxy rule not defined") @@ -371,50 +389,31 @@ func ReverseProxyHandleEditEndpoint(w http.ResponseWriter, r *http.Request) { requireBasicAuth := (rba == "true") //Load the previous basic auth credentials from current proxy rules - targetProxyEntry, err := dynamicProxyRouter.LoadProxy(eptype, rootNameOrMatchingDomain) + targetProxyEntry, err := dynamicProxyRouter.LoadProxy(rootNameOrMatchingDomain) if err != nil { utils.SendErrorResponse(w, "Target proxy config not found or could not be loaded") return } - if eptype == "vdir" { - thisOption := dynamicproxy.VdirOptions{ - RootName: targetProxyEntry.RootOrMatchingDomain, - Domain: endpoint, - RequireTLS: useTLS, - BypassGlobalTLS: false, - SkipCertValidations: skipTlsValidation, - RequireBasicAuth: requireBasicAuth, - BasicAuthCredentials: targetProxyEntry.BasicAuthCredentials, - } - targetProxyEntry.Remove() - dynamicProxyRouter.AddVirtualDirectoryProxyService(&thisOption) + //Generate a new proxyEndpoint from the new config + newProxyEndpoint := dynamicproxy.CopyEndpoint(targetProxyEntry) + newProxyEndpoint.Domain = endpoint + newProxyEndpoint.RequireTLS = useTLS + newProxyEndpoint.BypassGlobalTLS = bypassGlobalTLS + newProxyEndpoint.SkipCertValidations = skipTlsValidation + newProxyEndpoint.RequireBasicAuth = requireBasicAuth - } else if eptype == "subd" { - thisOption := dynamicproxy.SubdOptions{ - MatchingDomain: targetProxyEntry.RootOrMatchingDomain, - Domain: endpoint, - RequireTLS: useTLS, - BypassGlobalTLS: bypassGlobalTLS, - SkipCertValidations: skipTlsValidation, - RequireBasicAuth: requireBasicAuth, - BasicAuthCredentials: targetProxyEntry.BasicAuthCredentials, - } - targetProxyEntry.Remove() - dynamicProxyRouter.AddSubdomainRoutingService(&thisOption) + //Prepare to replace the current routing rule + readyRoutingRule, err := dynamicProxyRouter.PrepareProxyRoute(newProxyEndpoint) + if err != nil { + utils.SendErrorResponse(w, err.Error()) + return } + targetProxyEntry.Remove() + dynamicProxyRouter.AddProxyRouteToRuntime(readyRoutingRule) //Save it to file - thisProxyConfigRecord := Record{ - ProxyType: eptype, - Rootname: targetProxyEntry.RootOrMatchingDomain, - ProxyTarget: endpoint, - UseTLS: useTLS, - SkipTlsValidation: skipTlsValidation, - RequireBasicAuth: requireBasicAuth, - BasicAuthCredentials: targetProxyEntry.BasicAuthCredentials, - } - SaveReverseProxyConfigToFile(&thisProxyConfigRecord) + SaveReverseProxyConfig(newProxyEndpoint) //Update uptime monitor UpdateUptimeMonitorTargets() @@ -429,21 +428,19 @@ func DeleteProxyEndpoint(w http.ResponseWriter, r *http.Request) { return } - ptype, err := utils.PostPara(r, "ptype") - if err != nil { - utils.SendErrorResponse(w, "Invalid ptype given") - return - } - //Remove the config from runtime - err = dynamicProxyRouter.RemoveProxyEndpointByRootname(ptype, ep) + err = dynamicProxyRouter.RemoveProxyEndpointByRootname(ep) if err != nil { utils.SendErrorResponse(w, err.Error()) return } //Remove the config from file - RemoveReverseProxyConfigFile(ep) + err = RemoveReverseProxyConfig(ep) + if err != nil { + utils.SendErrorResponse(w, err.Error()) + return + } //Update utm if exists if uptimeMonitor != nil { @@ -473,14 +470,8 @@ func UpdateProxyBasicAuthCredentials(w http.ResponseWriter, r *http.Request) { return } - ptype, err := utils.GetPara(r, "ptype") - if err != nil { - utils.SendErrorResponse(w, "Invalid ptype given") - return - } - //Load the target proxy object from router - targetProxy, err := dynamicProxyRouter.LoadProxy(ptype, ep) + targetProxy, err := dynamicProxyRouter.LoadProxy(ep) if err != nil { utils.SendErrorResponse(w, err.Error()) return @@ -502,17 +493,6 @@ func UpdateProxyBasicAuthCredentials(w http.ResponseWriter, r *http.Request) { return } - ptype, err := utils.PostPara(r, "ptype") - if err != nil { - utils.SendErrorResponse(w, "Invalid ptype given") - return - } - - if ptype != "vdir" && ptype != "subd" { - utils.SendErrorResponse(w, "Invalid ptype given") - return - } - creds, err := utils.PostPara(r, "creds") if err != nil { utils.SendErrorResponse(w, "Invalid ptype given") @@ -520,7 +500,7 @@ func UpdateProxyBasicAuthCredentials(w http.ResponseWriter, r *http.Request) { } //Load the target proxy object from router - targetProxy, err := dynamicProxyRouter.LoadProxy(ptype, ep) + targetProxy, err := dynamicProxyRouter.LoadProxy(ep) if err != nil { utils.SendErrorResponse(w, err.Error()) return @@ -570,7 +550,7 @@ func UpdateProxyBasicAuthCredentials(w http.ResponseWriter, r *http.Request) { targetProxy.BasicAuthCredentials = mergedCredentials //Save it to file - SaveReverseProxyEndpointToFile(targetProxy) + SaveReverseProxyConfig(targetProxy) //Replace runtime configuration targetProxy.UpdateToRuntime() @@ -593,14 +573,8 @@ func ListProxyBasicAuthExceptionPaths(w http.ResponseWriter, r *http.Request) { return } - ptype, err := utils.GetPara(r, "ptype") - if err != nil { - utils.SendErrorResponse(w, "Invalid ptype given") - return - } - //Load the target proxy object from router - targetProxy, err := dynamicProxyRouter.LoadProxy(ptype, ep) + targetProxy, err := dynamicProxyRouter.LoadProxy(ep) if err != nil { utils.SendErrorResponse(w, err.Error()) return @@ -624,12 +598,6 @@ func AddProxyBasicAuthExceptionPaths(w http.ResponseWriter, r *http.Request) { return } - ptype, err := utils.PostPara(r, "ptype") - if err != nil { - utils.SendErrorResponse(w, "Invalid ptype given") - return - } - matchingPrefix, err := utils.PostPara(r, "prefix") if err != nil { utils.SendErrorResponse(w, "Invalid matching prefix given") @@ -637,7 +605,7 @@ func AddProxyBasicAuthExceptionPaths(w http.ResponseWriter, r *http.Request) { } //Load the target proxy object from router - targetProxy, err := dynamicProxyRouter.LoadProxy(ptype, ep) + targetProxy, err := dynamicProxyRouter.LoadProxy(ep) if err != nil { utils.SendErrorResponse(w, err.Error()) return @@ -666,7 +634,7 @@ func AddProxyBasicAuthExceptionPaths(w http.ResponseWriter, r *http.Request) { //Save configs to runtime and file targetProxy.UpdateToRuntime() - SaveReverseProxyEndpointToFile(targetProxy) + SaveReverseProxyConfig(targetProxy) utils.SendOK(w) } @@ -679,12 +647,6 @@ func RemoveProxyBasicAuthExceptionPaths(w http.ResponseWriter, r *http.Request) return } - ptype, err := utils.PostPara(r, "ptype") - if err != nil { - utils.SendErrorResponse(w, "Invalid ptype given") - return - } - matchingPrefix, err := utils.PostPara(r, "prefix") if err != nil { utils.SendErrorResponse(w, "Invalid matching prefix given") @@ -692,7 +654,7 @@ func RemoveProxyBasicAuthExceptionPaths(w http.ResponseWriter, r *http.Request) } // Load the target proxy object from router - targetProxy, err := dynamicProxyRouter.LoadProxy(ptype, ep) + targetProxy, err := dynamicProxyRouter.LoadProxy(ep) if err != nil { utils.SendErrorResponse(w, err.Error()) return @@ -717,7 +679,7 @@ func RemoveProxyBasicAuthExceptionPaths(w http.ResponseWriter, r *http.Request) // Save configs to runtime and file targetProxy.UpdateToRuntime() - SaveReverseProxyEndpointToFile(targetProxy) + SaveReverseProxyConfig(targetProxy) utils.SendOK(w) } @@ -728,16 +690,28 @@ func ReverseProxyStatus(w http.ResponseWriter, r *http.Request) { } func ReverseProxyList(w http.ResponseWriter, r *http.Request) { - eptype, err := utils.PostPara(r, "type") //Support root, vdir and subd + eptype, err := utils.PostPara(r, "type") //Support root and host if err != nil { utils.SendErrorResponse(w, "type not defined") return } - if eptype == "vdir" { + if eptype == "host" { results := []*dynamicproxy.ProxyEndpoint{} dynamicProxyRouter.ProxyEndpoints.Range(func(key, value interface{}) bool { - results = append(results, value.(*dynamicproxy.ProxyEndpoint)) + thisEndpoint := dynamicproxy.CopyEndpoint(value.(*dynamicproxy.ProxyEndpoint)) + + //Clear the auth passwords before showing to front-end + cleanedCredentials := []*dynamicproxy.BasicAuthCredentials{} + for _, user := range thisEndpoint.BasicAuthCredentials { + cleanedCredentials = append(cleanedCredentials, &dynamicproxy.BasicAuthCredentials{ + Username: user.Username, + PasswordHash: "", + }) + } + + thisEndpoint.BasicAuthCredentials = cleanedCredentials + results = append(results, thisEndpoint) return true }) @@ -745,19 +719,6 @@ func ReverseProxyList(w http.ResponseWriter, r *http.Request) { return results[i].Domain < results[j].Domain }) - js, _ := json.Marshal(results) - utils.SendJSONResponse(w, string(js)) - } else if eptype == "subd" { - results := []*dynamicproxy.ProxyEndpoint{} - dynamicProxyRouter.SubdomainEndpoint.Range(func(key, value interface{}) bool { - results = append(results, value.(*dynamicproxy.ProxyEndpoint)) - return true - }) - - sort.Slice(results, func(i, j int) bool { - return results[i].RootOrMatchingDomain < results[j].RootOrMatchingDomain - }) - js, _ := json.Marshal(results) utils.SendJSONResponse(w, string(js)) } else if eptype == "root" { @@ -789,7 +750,7 @@ func HandleUpdatePort80Listener(w http.ResponseWriter, r *http.Request) { } else if enabled == "false" { sysdb.Write("settings", "listenP80", false) SystemWideLogger.Println("Disabling port 80 listener") - dynamicProxyRouter.UpdatePort80ListenerState(true) + dynamicProxyRouter.UpdatePort80ListenerState(false) } else { utils.SendErrorResponse(w, "invalid mode given: "+enabled) } @@ -837,6 +798,30 @@ func HandleManagementProxyCheck(w http.ResponseWriter, r *http.Request) { utils.SendJSONResponse(w, string(js)) } +func HandleDevelopmentModeChange(w http.ResponseWriter, r *http.Request) { + enableDevelopmentModeStr, err := utils.GetPara(r, "enable") + if err != nil { + //Load the current development mode toggle state + js, _ := json.Marshal(dynamicProxyRouter.Option.NoCache) + utils.SendJSONResponse(w, string(js)) + } else { + //Write changes to runtime + enableDevelopmentMode := false + if enableDevelopmentModeStr == "true" { + enableDevelopmentMode = true + } + + //Write changes to runtime + dynamicProxyRouter.Option.NoCache = enableDevelopmentMode + + //Write changes to database + sysdb.Write("settings", "devMode", enableDevelopmentMode) + + utils.SendOK(w) + } + +} + // Handle incoming port set. Change the current proxy incoming port func HandleIncomingPortSet(w http.ResponseWriter, r *http.Request) { newIncomingPort, err := utils.PostPara(r, "incoming") @@ -882,33 +867,138 @@ func HandleIncomingPortSet(w http.ResponseWriter, r *http.Request) { utils.SendOK(w) } -// Handle list of root route options -func HandleRootRouteOptionList(w http.ResponseWriter, r *http.Request) { - js, _ := json.Marshal(dynamicProxyRouter.RootRoutingOptions) - utils.SendJSONResponse(w, string(js)) -} +/* Handle Custom Header Rules */ +//List all the custom header defined in this proxy rule -// Handle update of the root route edge case options. See dynamicproxy/rootRoute.go -func HandleRootRouteOptionsUpdate(w http.ResponseWriter, r *http.Request) { - enableUnsetSubdomainRedirect, err := utils.PostBool(r, "unsetRedirect") +func HandleCustomHeaderList(w http.ResponseWriter, r *http.Request) { + epType, err := utils.PostPara(r, "type") if err != nil { - utils.SendErrorResponse(w, err.Error()) + utils.SendErrorResponse(w, "endpoint type not defined") return } - unsetRedirectTarget, _ := utils.PostPara(r, "unsetRedirectTarget") - - newRootOption := dynamicproxy.RootRoutingOptions{ - EnableRedirectForUnsetRules: enableUnsetSubdomainRedirect, - UnsetRuleRedirectTarget: unsetRedirectTarget, + domain, err := utils.PostPara(r, "domain") + if err != nil { + utils.SendErrorResponse(w, "domain or matching rule not defined") + return } - dynamicProxyRouter.RootRoutingOptions = &newRootOption - err = newRootOption.SaveToFile() + var targetProxyEndpoint *dynamicproxy.ProxyEndpoint + if epType == "root" { + targetProxyEndpoint = dynamicProxyRouter.Root + } else { + ep, err := dynamicProxyRouter.LoadProxy(domain) + if err != nil { + utils.SendErrorResponse(w, "target endpoint not exists") + return + } + + targetProxyEndpoint = ep + } + + //List all custom headers + customHeaderList := targetProxyEndpoint.UserDefinedHeaders + if customHeaderList == nil { + customHeaderList = []*dynamicproxy.UserDefinedHeader{} + } + js, _ := json.Marshal(customHeaderList) + utils.SendJSONResponse(w, string(js)) + +} + +// Add a new header to the target endpoint +func HandleCustomHeaderAdd(w http.ResponseWriter, r *http.Request) { + epType, err := utils.PostPara(r, "type") if err != nil { - utils.SendErrorResponse(w, err.Error()) + utils.SendErrorResponse(w, "endpoint type not defined") + return + } + + domain, err := utils.PostPara(r, "domain") + if err != nil { + utils.SendErrorResponse(w, "domain or matching rule not defined") + return + } + + name, err := utils.PostPara(r, "name") + if err != nil { + utils.SendErrorResponse(w, "HTTP header name not set") + return + } + + value, err := utils.PostPara(r, "value") + if err != nil { + utils.SendErrorResponse(w, "HTTP header value not set") + return + } + + var targetProxyEndpoint *dynamicproxy.ProxyEndpoint + if epType == "root" { + targetProxyEndpoint = dynamicProxyRouter.Root + } else { + ep, err := dynamicProxyRouter.LoadProxy(domain) + if err != nil { + utils.SendErrorResponse(w, "target endpoint not exists") + return + } + + targetProxyEndpoint = ep + } + + //Create a new custom header object + targetProxyEndpoint.AddUserDefinedHeader(name, value) + + //Save it (no need reload as header are not handled by dpcore) + err = SaveReverseProxyConfig(targetProxyEndpoint) + if err != nil { + utils.SendErrorResponse(w, "unable to save update") return } utils.SendOK(w) } + +// Remove a header from the target endpoint +func HandleCustomHeaderRemove(w http.ResponseWriter, r *http.Request) { + epType, err := utils.PostPara(r, "type") + if err != nil { + utils.SendErrorResponse(w, "endpoint type not defined") + return + } + + domain, err := utils.PostPara(r, "domain") + if err != nil { + utils.SendErrorResponse(w, "domain or matching rule not defined") + return + } + + name, err := utils.PostPara(r, "name") + if err != nil { + utils.SendErrorResponse(w, "HTTP header name not set") + return + } + + var targetProxyEndpoint *dynamicproxy.ProxyEndpoint + if epType == "root" { + targetProxyEndpoint = dynamicProxyRouter.Root + } else { + ep, err := dynamicProxyRouter.LoadProxy(domain) + if err != nil { + utils.SendErrorResponse(w, "target endpoint not exists") + return + } + + targetProxyEndpoint = ep + } + + targetProxyEndpoint.RemoveUserDefinedHeader(name) + + err = SaveReverseProxyConfig(targetProxyEndpoint) + if err != nil { + utils.SendErrorResponse(w, "unable to save update") + return + } + + utils.SendOK(w) + +} diff --git a/src/router.go b/src/router.go index d02befc..3b64237 100644 --- a/src/router.go +++ b/src/router.go @@ -15,6 +15,8 @@ import ( This script holds the static resources router for the reverse proxy service + + If you are looking for reverse proxy handler, see Server.go in mod/dynamicproxy/ */ func FSHandler(handler http.Handler) http.Handler { diff --git a/src/routingrule.go b/src/routingrule.go new file mode 100644 index 0000000..f704376 --- /dev/null +++ b/src/routingrule.go @@ -0,0 +1,35 @@ +package main + +import ( + "net/http" + "strings" + + "imuslab.com/zoraxy/mod/dynamicproxy" +) + +/* + Routing Rule + + This script handle special routing rules for some utilities functions +*/ + +// Register the system build-in routing rules into the core +func registerBuildInRoutingRules() { + //Cloudflare email decoder + //It decode the email address if you are proxying a cloudflare protected site + //[email-protected] -> real@email.com + dynamicProxyRouter.AddRoutingRules(&dynamicproxy.RoutingRule{ + ID: "cloudflare-decoder", + MatchRule: func(r *http.Request) bool { + return strings.HasSuffix(r.RequestURI, "cloudflare-static/email-decode.min.js") + }, + RoutingHandler: func(w http.ResponseWriter, r *http.Request) { + decoder := "function fixObfuscatedEmails(){let t=document.getElementsByClassName(\"__cf_email__\");for(let e=0;eWhitelist a certain IP or IP range

- - + + +
+
+ +
`); @@ -1003,6 +1010,7 @@ function addIpWhitelist(){ let targetIp = $("#ipAddressInputWhitelist").val().trim(); + let remarks = $("#ipAddressCommentsWhitelist").val().trim(); if (targetIp == ""){ alert("IP address is empty") return @@ -1016,7 +1024,7 @@ $.ajax({ url: "/api/whitelist/ip/add", type: "POST", - data: {ip: targetIp.toLowerCase()}, + data: {ip: targetIp.toLowerCase(), "comment": remarks}, success: function(response) { if (response.error !== undefined) { msgbox(response.error, false, 6000); @@ -1025,6 +1033,7 @@ } $("#ipAddressInputWhitelist").val(""); + $("#ipAddressCommentsWhitelist").val(""); $("#ipAddressInputWhitelist").parent().remvoeClass("error"); }, error: function() { diff --git a/src/web/components/cert.html b/src/web/components/cert.html index 1f2ab4c..b6d692c 100644 --- a/src/web/components/cert.html +++ b/src/web/components/cert.html @@ -15,42 +15,19 @@
-

Default Certificates

- When there are no matching certificate for the requested server name, reverse proxy router will always fallback to this one.
Note that you need both of them uploaded for it to fallback properly

- - - - - - - - - - - - - - - -
Key TypeExists
Default Public Key
Default Private Key
-

Upload Default Keypairs

-
- - -
- -
-

Sub-domain Certificates

+

Hosts Certificates

Provide certificates for multiple domains reverse proxy

+ Match the server name with your CN/DNS entry in certificate for faster resolve time
+ or .crt files in order systems
@@ -63,14 +40,33 @@ -
+
+

Tips about Server Names & SNI

+
+
+ If you have two subdomains like a.example.com and b.example.com , + for faster response speed, you might want to setup them one by one (i.e. having two seperate certificate for + a.example.com and b.example.com). +
+
+ If you have a wildcard certificate that covers *.example.com, + you can just enter example.com as server name to add a certificate. +
+
+ If you have a certificate contain multiple host, you can enter the first domain in your certificate + and Zoraxy will try to match the remaining CN/DNS for you. +
+
+
+

Current list of loaded certificates

- +
+ @@ -81,15 +77,34 @@ -
-

Sub-domain Certificates

- If you have 3rd or even 4th level subdomains like blog.example.com or en.blog.example.com , - depending on your certificates coverage, you might need to setup them one by one (i.e. having two seperate certificate for a.example.com and b.example.com).
- If you have a wildcard certificate that covers *.example.com, you can just enter example.com as server name in the form below to add a certificate. -
-

Certificate Authority (CA) and Auto Renew (ACME)

+

Fallback Certificate

+

When there are no matching certificate for the requested server name, reverse proxy router will always fallback to this one.
Note that you need both of them uploaded for it to fallback properly

+
Domain Last Update Expire AtRenew Remove
+ + + + + + + + + + + + + + +
Key TypeFound
Fallback Public Key
Fallback Private Key
+

Upload Default Keypairs

+
+ + +
+
+

Certificate Authority (CA) and Auto Renew (ACME)

Management features regarding CA and ACME

+

Prefered Certificate Authority

The default CA to use when create a new subdomain proxy endpoint with TLS certificate

@@ -112,12 +127,12 @@

Certificate Renew / Generation (ACME) Settings
-
+

- +
Disabled -
Auto-Renewer Status
+
ACME Auto-Renewer

@@ -130,6 +145,110 @@ $("#defaultCA").dropdown(); + + //Renew certificate by button press + function renewCertificate(domain, btn=undefined){ + let defaultCA = $("#defaultCA").dropdown("get value"); + if (defaultCA.trim() == ""){ + defaultCA = "Let's Encrypt"; + } + //Get a new cert using ACME + msgbox("Requesting certificate via " + defaultCA +"..."); + + //Request ACME for certificate + if (btn != undefined){ + $(btn).addClass('disabled'); + $(btn).html(``); + } + obtainCertificate(domain, defaultCA.trim(), function(succ){ + if (btn != undefined){ + $(btn).removeClass('disabled'); + if (succ){ + $(btn).html(``); + }else{ + $(btn).html(``); + } + + setTimeout(function(){ + initManagedDomainCertificateList(); + }, 3000); + } + }); + } + + /* + Obtain Certificate via ACME + */ + + // Obtain certificate from API, only support one domain + function obtainCertificate(domains, usingCa = "Let's Encrypt", callback=undefined) { + //Load the ACME email from server side + let acmeEmail = ""; + $.get("/api/acme/autoRenew/email", function(data){ + if (data != "" && data != undefined && data != null){ + acmeEmail = data; + } + + let filename = ""; + let email = acmeEmail; + if (acmeEmail == ""){ + msgbox("Unable to obtain certificate: ACME email not set", false, 8000); + if (callback != undefined){ + callback(false); + } + return; + } + if (filename.trim() == "" && !domains.includes(",")){ + //Zoraxy filename are the matching name for domains. + //Use the same as domains + filename = domains; + }else if (filename != "" && !domains.includes(",")){ + //Invalid settings. Force the filename to be same as domain + //if there are only 1 domain + filename = domains; + }else{ + msgbox("Filename cannot be empty for certs containing multiple domains.") + if (callback != undefined){ + callback(false); + } + return; + } + + $.ajax({ + url: "/api/acme/obtainCert", + method: "GET", + data: { + domains: domains, + filename: filename, + email: email, + ca: usingCa, + }, + success: function(response) { + if (response.error) { + console.log("Error:", response.error); + // Show error message + msgbox(response.error, false, 12000); + if (callback != undefined){ + callback(false); + } + } else { + console.log("Certificate installed successfully"); + // Show success message + msgbox("Certificate installed successfully"); + + if (callback != undefined){ + callback(false); + } + } + }, + error: function(error) { + console.log("Failed to install certificate:", error); + } + }); + }); + } + + //Delete the certificate by its domain function deleteCertificate(domain){ if (confirm("Confirm delete certificate for " + domain + " ?")){ @@ -154,6 +273,12 @@ //Initialize the current default CA options $.get("/api/acme/autoRenew/email", function(data){ $("#prefACMEEmail").val(data); + if (data.trim() == ""){ + //acme email is not yet set + $(".renewButton").addClass('disabled'); + }else{ + $(".renewButton").removeClass('disabled'); + } }); $.get("/api/acme/autoRenew/ca", function(data){ @@ -167,7 +292,13 @@ //Set the status of the acme enable icon function setACMEEnableStates(enabled){ $("#acmeAutoRenewerStatus").text(enabled?"Enabled":"Disabled"); - $("#acmeAutoRenewer").find("i").attr("class", enabled?"green circle icon":"red circle icon"); + if (enabled){ + $(".acmeRenewStateWrapper").addClass("enabled"); + }else{ + $(".acmeRenewStateWrapper").removeClass("enabled"); + } + + $("#acmeAutoRenewer").find("i").attr("class", enabled?"white circle check icon":"white circle times icon"); } initAcmeStatus(); @@ -187,6 +318,9 @@ success: function(data){ if (data.error != undefined){ msgbox(data.error, false); + }else{ + //Update the renew button states + $(".renewButton").removeClass('disabled'); } } }); @@ -223,13 +357,14 @@ ${entry.Domain} ${entry.LastModifiedDate} ${entry.ExpireDate} (${!isExpired?entry.RemainingDays+" days left":"Expired"}) + `); }); if (data.length == 0){ $("#certifiedDomainList").append(` - No valid keypairs found + No valid keypairs found `); } } diff --git a/src/web/components/gan.html b/src/web/components/gan.html index 6b0bd06..833b401 100644 --- a/src/web/components/gan.html +++ b/src/web/components/gan.html @@ -24,7 +24,6 @@
0
Connected Nodes
-
@@ -219,8 +218,8 @@ } - //Bind event to tab switch - tabSwitchEventBind["gan"] = function(){ + //Bind event to tab switch + tabSwitchEventBind["gan"] = function(){ //On switch over to this page, load info listGANet(); initGANetID(); diff --git a/src/web/components/gandetails.html b/src/web/components/gandetails.html index 0f9922c..857033c 100644 --- a/src/web/components/gandetails.html +++ b/src/web/components/gandetails.html @@ -61,7 +61,7 @@

Members

To join this network using command line, type sudo zerotier-cli join on your device terminal

- +
@@ -84,6 +84,11 @@
+
+

Add Controller as Member

+

Optionally you can add the network controller (ZeroTier running on the Zoraxy node) as member for cross GAN reverse proxy to bypass NAT limitations.

+ +

\ No newline at end of file diff --git a/src/web/components/redirection.html b/src/web/components/redirection.html index 66657f5..ac2df58 100644 --- a/src/web/components/redirection.html +++ b/src/web/components/redirection.html @@ -72,25 +72,10 @@ Redirection Rules Added


- -
-
-
- - Advance Options -
-
-

If you need custom header, content or status code other than basic redirects, you can use the advance path rules editor.

- -
-
-
-
\ No newline at end of file diff --git a/src/web/components/rules.html b/src/web/components/rules.html index 81f8a81..d06927b 100644 --- a/src/web/components/rules.html +++ b/src/web/components/rules.html @@ -1,119 +1,114 @@ -
+ + +
+
-
-
-

New Proxy Rule

-

You can create a proxy endpoing by subdomain or virtual directories

-
-
- - -
-
- - -
-
- - - E.g. 192.168.0.101:8000 or example.com -
-
-
- - -
-
- -
-
-
- - Advance Settings -
-
-

-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-

Enter the username and password for allowing them to access this proxy endpoint

- - - - - - - - - - - - -
UsernamePasswordRemove
No Entered Credential
-
-
- -
-
- -
-
- -
-
-
-
-
-
-
- -

+
+

New Proxy Rule

+

You can add more proxy rules to support more site via domain / subdomains

+
+
+ + + Support subdomain and wildcard, e.g. s1.mydomain.com or *.test.mydomain.com
+
+ + + E.g. 192.168.0.101:8000 or example.com +
+
+
+ + +
+
+ +
+
+
+ + Advance Settings +
+
+

+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+

Enter the username and password for allowing them to access this proxy endpoint

+ + + + + + + + + + + + +
UsernamePasswordRemove
No Entered Credential
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+ +

-
-
- Subdomain
- Example of subdomain matching keyword:
- s1.arozos.com
(Any access starting with s1.arozos.com will be proxy to the IP address below)
+
+ Domain
+ Example of domain matching keyword:
+ arozos.com
Any acess requesting arozos.com will be proxy to the IP address below
- Virtual Directory
- Example of virtual directory name:
- /s1/home/
(Any access to {this_server}/s1/home/ will be proxy to the IP address below)
- You can also ignore the tailing slash for wildcard like usage.
- /s1/room-
Any access to {this_server}/s1/classroom_* will be proxied, for example:
+ Subdomain
+ Example of subdomain matching keyword:
+ s1.arozos.com
Any request starting with s1.arozos.com will be proxy to the IP address below
+
+ Wildcard
+ Example of wildcard matching keyword:
+ *.arozos.com
Any request with a host name matching *.arozos.com will be proxy to the IP address below. Here are some examples.
-
/s1/room-101
-
/s1/room-102/
-
/s1/room-103/map.txt
-

- +
www.arozos.com
+
foo.bar.arozos.com
+

@@ -122,9 +117,9 @@ \ No newline at end of file diff --git a/src/web/components/status.html b/src/web/components/status.html index 4a22993..69f705b 100644 --- a/src/web/components/status.html +++ b/src/web/components/status.html @@ -17,7 +17,7 @@
-
+
@@ -29,7 +29,7 @@
-
+
@@ -39,32 +39,39 @@
-
+
- + Resolving GeoIP
- -
+
+ + + +
+

Network Status

+

Overall Network I/O in Current Host Server

+
+
-

Graph Render Paused

+

Graph Render Paused

-
-

Basic Settings

+
+

Global Settings

Inbound Port (Port to be proxied)

- +

@@ -89,21 +96,22 @@ Advance Settings
-

If you have no idea what are these, you can leave them as default :)


+
+ + +
+
- - -

- - + - -
-
-
+

@@ -102,12 +102,14 @@ function setWebServerRunningState(running){ if (running){ $("#webserv_enable").parent().checkbox("set checked"); - $("#webservRunningState").find("i").attr("class", "green circle icon"); + $("#webservRunningState").find("i").attr("class", "white circle check icon"); $("#webservRunningState").find(".webserv_status").text("Running"); + $(".webservRunningStateWrapper").addClass("enabled") }else{ $("#webserv_enable").parent().checkbox("set unchecked"); - $("#webservRunningState").find("i").attr("class", "red circle icon"); + $("#webservRunningState").find("i").attr("class", "white circle times icon"); $("#webservRunningState").find(".webserv_status").text("Stopped"); + $(".webservRunningStateWrapper").removeClass("enabled") } } diff --git a/src/web/img/plant.jpg b/src/web/img/plant.jpg deleted file mode 100644 index 43d8ba9..0000000 Binary files a/src/web/img/plant.jpg and /dev/null differ diff --git a/src/web/img/plant.png b/src/web/img/plant.png deleted file mode 100644 index 500cf03..0000000 Binary files a/src/web/img/plant.png and /dev/null differ diff --git a/src/web/img/public/bg.jpg b/src/web/img/public/bg.jpg deleted file mode 100644 index 0c62d55..0000000 Binary files a/src/web/img/public/bg.jpg and /dev/null differ diff --git a/src/web/img/public/bg2.jpg b/src/web/img/public/bg2.jpg deleted file mode 100644 index d23e6b4..0000000 Binary files a/src/web/img/public/bg2.jpg and /dev/null differ diff --git a/src/web/index.html b/src/web/index.html index 067b369..0556e59 100644 --- a/src/web/index.html +++ b/src/web/index.html @@ -26,9 +26,12 @@ -
- +
+
+
@@ -36,17 +39,21 @@ Status + + Default Site + + + + HTTP Proxy + Virtual Directory - - Subdomain Proxy - Create Proxy Rules - - Set Proxy Root + + TCP Proxy @@ -65,9 +72,6 @@ Service Expose Proxy - - TCP Proxy - Static Web Server @@ -97,7 +101,7 @@
-
+
@@ -235,12 +239,22 @@ $.get("/api/auth/logout", function(response) { if (response === "OK") { setTimeout(function(){ - window.location.href = "/"; + window.location.href = "/login.html"; }, 300); } }); } + function toggleTheme(){ + if ($("body").hasClass("darkTheme")){ + $("body").removeClass("darkTheme") + $("#themeColorButton").html(``); + }else{ + $("body").addClass("darkTheme"); + $("#themeColorButton").html(``); + } + } + function getTabButtonById(targetTabId){ let targetTabBtn = undefined; $("#mainmenu").find(".item").each(function(){ @@ -271,9 +285,11 @@ $(targetBtn).addClass("active"); $(".functiontab").hide(); $("#" + tabID).fadeIn('fast', function(){ - if (tabSwitchEventBind[tabID]){ - tabSwitchEventBind[tabID](); - } + setTimeout(function(){ + if (tabSwitchEventBind[tabID]){ + tabSwitchEventBind[tabID](); + } + },100) }); $('html,body').animate({scrollTop: 0}, 'fast'); window.location.hash = tabID; diff --git a/src/web/login.html b/src/web/login.html index 958cce1..96fc97b 100644 --- a/src/web/login.html +++ b/src/web/login.html @@ -7,48 +7,13 @@ Login | Zoraxy + + -
-
- +
+ + + + + + + + + + + + +
+
+

Proudly powered by Zoraxy

+
-
-
+
- - -
@@ -95,7 +164,7 @@
-
Set New Password
+
Reset Password
@@ -107,12 +176,36 @@ Resend Email
-
- Proudly powered by Zoraxy + + +
+ +
+ +
+ + + + + + + + + + + + +
+
+

Proudly powered by Zoraxy

- - - -
-
- -
-
- Special Path Rules -
Advanced customization for response on particular matching path or URL
-
-
-

Current list of special path rules.

-
- - - - - - - - - - - - - - - - - - - - - -
Matching PathStatus CodeExact MatchCase SensitiveEnabledActions
-
-
-

Add Special Path Rule

-
-
- - - Any matching prefix of the request URL will be handled by this rule, e.g. example.com/secret -
-
-
- - -
-
-

Require exactly match but not prefix match (default). Enable this if you only want to block access to a directory but not the resources inside the directory. Assume you have entered a matching URI of example.com/secret/ and set it to return 401

- example.com/secret/image.png (content of image.png)
- example.com/secret/image.png HTTP 401 -
-
-
- - - HTTP Status Code to be served by this rule -
-
-

- -
- - - \ No newline at end of file diff --git a/src/web/snippet/basicAuthEditor.html b/src/web/snippet/basicAuthEditor.html index 44ae33d..921547d 100644 --- a/src/web/snippet/basicAuthEditor.html +++ b/src/web/snippet/basicAuthEditor.html @@ -41,8 +41,7 @@
- - +
@@ -69,7 +68,7 @@ Make sure you add the tailing slash for only selecting the files / folder inside that path.

- +
@@ -99,7 +98,7 @@ let payloadHash = window.location.hash.substr(1); try{ payloadHash = JSON.parse(decodeURIComponent(payloadHash)); - loadBasicAuthCredentials(payloadHash.ept, payloadHash.ep); + loadBasicAuthCredentials(payloadHash.ep); $("#epname").text(payloadHash.ep); editingEndpoint = payloadHash; }catch(ex){ @@ -107,13 +106,12 @@ } } - function loadBasicAuthCredentials(endpointType, uuid){ + function loadBasicAuthCredentials(uuid){ $.ajax({ url: "/api/proxy/updateCredentials", method: "GET", data: { ep: uuid, - ptype: endpointType }, success: function(data){ //Push the existing account to list @@ -163,6 +161,9 @@ // Update the table body with the credentials updateEditingCredentialList(); + + //Save the table + saveCredentials(); } function addExceptionPath(){ @@ -175,7 +176,6 @@ $.ajax({ url: "/api/proxy/auth/exceptions/add", data:{ - ptype: editingEndpoint.ept, ep: editingEndpoint.ep, prefix: newExclusionPathMatchingPrefix }, @@ -197,7 +197,6 @@ $.ajax({ url: "/api/proxy/auth/exceptions/delete", data:{ - ptype: editingEndpoint.ept, ep: editingEndpoint.ep, prefix: matchingPrefix }, @@ -271,6 +270,8 @@ // Update the table body updateEditingCredentialList(); + + saveCredentials(); } function alreadyExists(username){ @@ -293,7 +294,6 @@ method: "POST", data: { ep: editingEndpoint.ep, - ptype: editingEndpoint.ept, creds: JSON.stringify(editingCredentials) }, success: function(data){ diff --git a/src/web/snippet/configTools.html b/src/web/snippet/configTools.html index 02cd143..66d361c 100644 --- a/src/web/snippet/configTools.html +++ b/src/web/snippet/configTools.html @@ -45,7 +45,7 @@

- +
The current config will be backup to ./conf_old{timestamp}. If you screw something up, you can always restore it by ssh to your host and restore the configs from the old folder.

diff --git a/src/web/snippet/customHeaders.html b/src/web/snippet/customHeaders.html new file mode 100644 index 0000000..0f094f4 --- /dev/null +++ b/src/web/snippet/customHeaders.html @@ -0,0 +1,182 @@ + + + + + + + + + +
+
+
+
+ Custom Headers +
+
+
+
+

You can define custom headers to be sent + together with the client request to the backend server in + this reverse proxy endpoint / host.

+ + + + + + + + + + + + + +
NameValueRemove
No Additonal Header
+
+

Add Custom Header

+

Add custom header(s) into this proxy target

+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+ +



+ + + + \ No newline at end of file diff --git a/src/wrappers.go b/src/wrappers.go index 9fd7531..6bb030c 100644 --- a/src/wrappers.go +++ b/src/wrappers.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" "net/http" + "strconv" "strings" "time" @@ -119,11 +120,10 @@ func UpdateUptimeMonitorTargets() { // Generate uptime monitor targets from reverse proxy rules func GetUptimeTargetsFromReverseProxyRules(dp *dynamicproxy.Router) []*uptime.Target { - subds := dp.GetSDProxyEndpointsAsMap() - vdirs := dp.GetVDProxyEndpointsAsMap() + hosts := dp.GetProxyEndpointsAsMap() UptimeTargets := []*uptime.Target{} - for subd, target := range subds { + for hostid, target := range hosts { url := "http://" + target.Domain protocol := "http" if target.RequireTLS { @@ -131,27 +131,31 @@ func GetUptimeTargetsFromReverseProxyRules(dp *dynamicproxy.Router) []*uptime.Ta protocol = "https" } + //Add the root url UptimeTargets = append(UptimeTargets, &uptime.Target{ - ID: subd, - Name: subd, + ID: hostid, + Name: hostid, URL: url, Protocol: protocol, }) - } - for vdir, target := range vdirs { - url := "http://" + target.Domain - protocol := "http" - if target.RequireTLS { - url = "https://" + target.Domain - protocol = "https" + //Add each virtual directory into the list + for _, vdir := range target.VirtualDirectories { + url := "http://" + vdir.Domain + protocol := "http" + if target.RequireTLS { + url = "https://" + vdir.Domain + protocol = "https" + } + //Add the root url + UptimeTargets = append(UptimeTargets, &uptime.Target{ + ID: hostid + vdir.MatchingPath, + Name: hostid + vdir.MatchingPath, + URL: url, + Protocol: protocol, + }) + } - UptimeTargets = append(UptimeTargets, &uptime.Target{ - ID: vdir, - Name: "*" + vdir, - URL: url, - Protocol: protocol, - }) } return UptimeTargets @@ -167,6 +171,48 @@ func HandleUptimeMonitorListing(w http.ResponseWriter, r *http.Request) { } } +/* + Static Web Server +*/ + +// Handle port change, if root router is using internal static web server +// update the root router as well +func HandleStaticWebServerPortChange(w http.ResponseWriter, r *http.Request) { + newPort, err := utils.PostInt(r, "port") + if err != nil { + utils.SendErrorResponse(w, "invalid port number given") + return + } + + if dynamicProxyRouter.Root.DefaultSiteOption == dynamicproxy.DefaultSite_InternalStaticWebServer { + //Update the root site as well + newDraftingRoot := dynamicProxyRouter.Root.Clone() + newDraftingRoot.Domain = "127.0.0.1:" + strconv.Itoa(newPort) + activatedNewRoot, err := dynamicProxyRouter.PrepareProxyRoute(newDraftingRoot) + if err != nil { + utils.SendErrorResponse(w, "unable to update root routing rule") + return + } + + //Replace the root + dynamicProxyRouter.Root = activatedNewRoot + + SaveReverseProxyConfig(newDraftingRoot) + } + + err = staticWebServer.ChangePort(strconv.Itoa(newPort)) + if err != nil { + utils.SendErrorResponse(w, err.Error()) + return + } + + utils.SendOK(w) +} + +/* + mDNS Scanning +*/ + // Handle listing current registered mdns nodes func HandleMdnsListing(w http.ResponseWriter, r *http.Request) { if mdnsScanner == nil {