diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 00000000..805eeccb
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,12 @@
+tests
+.venv
+.local
+.github
+.vscode
+.gitignore
+
+docs/
+Makefile
+Changelog.md
+
+*.md
\ No newline at end of file
diff --git a/.github/instructions/snyk_rules.instructions.md b/.github/instructions/snyk_rules.instructions.md
new file mode 100644
index 00000000..eef06341
--- /dev/null
+++ b/.github/instructions/snyk_rules.instructions.md
@@ -0,0 +1,14 @@
+---
+alwaysApply: true
+always_on: true
+trigger: always_on
+applyTo: "**"
+description: Snyk Security At Inception
+---
+
+# Project security best practices
+
+- Always run snyk_code_scan tool for new first party code that is generated in a Snyk-supported language.
+- If any security issues are found based on newly introduced or modified code or dependencies, attempt to fix the issues using the results context from Snyk.
+- Rescan the code after fixing the issues to ensure that the issues were fixed and that there are no newly introduced issues.
+- Repeat this process until no new issues are found.
diff --git a/.gitignore b/.gitignore
index 87d9689b..a118d1b4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,35 +1,54 @@
-# IDE
-.vscode/
-
-# Flask logging server logs
-flask_logging_server/logs/simplified/*
-flask_logging_server/logs/dicom_raw_logs/*
-flask_logging_server/logs/exceptions/*
-
-# DICOM server logs
-dicom_server/exceptions/*.log
-
-# API logs
-API/logs/*.log
-
-# Python cache files
-dicom_server/**/__pycache__/
-*.pyc
-
-# Environment files
-API/.env
+# IDE
+.vscode
+
+# Byte-compiled / optimized / DLL files
+__pycache__
+__pycache__/
+*.py[cod]
+*$py.class
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+*.hypothesis/
+.pytest_cache/
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# Environments
.env
-
-# Python specific generated files
-__pycache__/
-*.pyo
-*.pyd
-*.so
-
-# Node.js
-node_modules/
-
-data/
-
-
-
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# snyk things
+.github/instructions/
\ No newline at end of file
diff --git a/CITATION.cff b/CITATION.cff
new file mode 100644
index 00000000..45481802
--- /dev/null
+++ b/CITATION.cff
@@ -0,0 +1,8 @@
+cff-version: 1.2.0
+message: "DICOMHawk citation"
+authors:
+- family-names: "Vasilomanolakis"
+ given-names: "Emmanouil"
+ orcid: "https://orcid.org/0000-0001-5068-9158"
+title: "DICOMHawk"
+url: "https://github.com/honeynet/DICOMHawk"
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..e69de29b
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
deleted file mode 100644
index 9cb881e1..00000000
--- a/CONTRIBUTORS.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# Contributors
-
-## Project: DicomHawk Honeypot
-
-### Creator & Initial Developer
-- **Georgios Theodoridis** (GitHub: [@gtheodoridis](https://github.com/gtheodoridis))
- - Developed the initial version of DicomHawk
- - Designed and implemented core honeypot functionalities
- - Conducted initial research and testing
-
-### Lead Developers (Version 2.0 and Beyond)
-- **[Alexandra Babanuta]** (GitHub: [@Alexandra Babanuta](https://github.com/albab19))
- - Led development of **DicomHawk v2.0**
- - Improved honeypot detection and response mechanisms
- - Refactored and optimized core components
-
-- **[Nawras Mouala]** (GitHub: [@Nawras Mouala](https://github.com/Nawras67)))
- - Led development of **DicomHawk v2.0**
- - Improved honeypot detection and response mechanisms
- - Developed additional logging and analysis tools
-
-### Additional Contributors
-(If others contribute in the future, they can be listed here.)
-
-### Acknowledgments
-- Special thanks to Dr. Emmanouil Vasilomanolakis for guidance and support.
-- The Honeynet Project for hosting and maintaining the repository.
-
diff --git a/Changelog.md b/Changelog.md
new file mode 100644
index 00000000..06125c0a
--- /dev/null
+++ b/Changelog.md
@@ -0,0 +1,3 @@
+Dicomhawk 0.1.0 (resease 2026-01-30)
+ * Refactored application
+ * First release.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 128eba42..00000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2024 Georgios Theodoridis
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..c59dee79
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,9 @@
+.PHONY: docker
+build-docker:
+ docker build -t dicomhawk:latest -f build/docker/Dockerfile.dicomhawk
+
+run-docker:
+ docker run --rm -it -p 104:104 -p 11112:11112 --network=bridge --name dicomhawk dicomhawk:latest
+
+format:
+ black .
\ No newline at end of file
diff --git a/README.md b/README.md
index 61e786a4..486e73b9 100644
--- a/README.md
+++ b/README.md
@@ -1,542 +1,18 @@
-# DICOMHawk
+
-[](cover_images/dicomhawk_logo.png)
+
-> **A powerful and efficient honeypot for DICOM servers, designed to attract and log unauthorized access attempts and interactions in healthcare environments.**
+
-DICOMHawk is a sophisticated cybersecurity tool built using Flask and pynetdicom that offers a streamlined web interface for monitoring and managing DICOM interactions in real-time. It serves as an advanced deception technology specifically designed for medical imaging environments, helping security teams detect, analyze, and respond to potential threats targeting DICOM infrastructure.
+
-## 🚀 Key Features
+[Quick Start](docs/quick_start.md) |
+[Installation](docs/installation.md) |
+[Configuration](docs/configuration.md) |
+[Commands](docs/commands.md) |
+[Features](docs/features.md) |
+[FAQ](docs/faq.md) |
+[Contact](docs/contact.md) |
-### Core DICOM Functionality
-- **Full DICOM Protocol Support**: Enables potential attackers to perform DICOM operations on both standard DICOM information models (STUDYROOT and PATIENTROOT) through its DICOM port
-- **REST API Service**: Provides an API service enabling attackers to interact with the DICOM server content. Using the API endpoints, an attacker can search and download studies, series, patient and images data. Moreover, they can upload files to the Web API server.
-- **Real Medical Data Integration**: Stores real DICOM files that are updated periodically through "The Cancer Imaging Archive (TCIA)" API, which metadata as PHI is modified to resemble real patient data of Danish
-citizens in the Danish settings.
+
-### Advanced Security Features
-- **Comprehensive Honeytoken System**: Multiple types of honeytokens including:
- - Encapsulated PDF canary tokens
- - HoneyURLs (fake URLs seeded into DICOM datasets)
- - Credential honeytokens
- - Hidden endpoints and credentials in source code
-- **Threat Intelligence Integration**: Automatic reputation checks on each unique IP address interacting with the honeypot
-- **Kernel-Level Protection**: Optional Blackhole service for blocking known mass-scanner services at the kernel level
-
-### Data Localization
-- **Multi-Locale Patient Data**: Offers multi-locale patient data generation with configurable regional setting that support different locales for realistic patient name generation.
-
-### Monitoring & Management
-- **Centralized Security Monitoring**: Elastic Stack integration with Logstash for comprehensive attacker activity tracking
-- **Automated Log Management**: Daily rotation and compression with intelligent disk space management
-- **Interactive Configuration**: Command-line setup wizard guiding users through essential configurations
-
-## Table of Contents
-
-- [Quick Start](#quick-start)
-- [Deploying DICOMHawk Using Docker Compose](#deploying-dicomhawk-using-docker-compose)
-- [Running DICOMHawk Locally](#running-dicomhawk-locally)
-- [Configuration](#configuration)
-- [Advanced Configuration](#advanced-configuration)
-- [Usage Examples](#usage-examples)
-- [DICOMHawk Monitoring System](#dicomhawk-monitoring-system)
-- [Honeytokens](#honeytokens)
-- [Log Management](#log-management)
-
-## Quick Start
-
-Get DICOMHawk running quickly with simple installation process.
-
-### Prerequisites
-
-Before installing DICOMHawk, ensure you have:
-
-- **Docker** installed on your system (with Docker Hub access)
-- **Docker Compose** for managing multiple containers
-- **TCIA account** - free credentials from [The Cancer Imaging Archive](https://www.cancerimagingarchive.net/access-data/)
-- **Port availability** - ensure required ports are available (see [Port Requirements](#port-requirements))
-
-### Docker Daemon Check
-
-Before proceeding with installation, verify that the Docker daemon is running:
-
-**Linux/macOS:**
-```bash
-sudo systemctl status docker
-# or
-docker info
-```
-
-**Windows:**
-```powershell
-Get-Service docker
-# or
-docker info
-```
-
-**macOS (Docker Desktop):**
-```bash
-docker info
-```
-
-If Docker is not running, start it:
-
-**Linux:**
-```bash
-sudo systemctl start docker
-```
-
-**Windows:**
-```powershell
-Start-Service docker
-```
-
-**macOS:**
-Open Docker Desktop application or run:
-```bash
-open -a Docker
-```
-
-### Quick Installation
-
-1. **Clone the Repository**
- ```bash
- git clone https://github.com/honeynet/DICOMHawk.git
- cd DICOMHawk
- ```
-
-2. **Run the Automated Setup**
- ```bash
- ./install.sh
- ```
-
-3. **Follow the Interactive Wizard**
- - The script guides you through configuration
- - Accept defaults for most settings
- - Focus on essential TCIA credentials(Username & Password)
- - For detailed configuration options, see the [Configuration](#configuration) section
-
-### Access Your DICOMHawk Instance
-
-Once deployed, access your honeypot through:
-
-- **Web Dashboard**: http://localhost:5000
-- **API Service**: http://localhost:3702
-- **DICOM Server**: localhost:11112
-
-## Deploying DICOMHawk Using Docker Compose
-
-> **💡 Alternative Deployment Method**: This method can be used as an alternative to the Quick Start installation. However, you'll need to manually create your `.env` file with all required configuration settings before deployment.
-
-### Docker Daemon Check
-
-Before proceeding with deployment, ensure the Docker daemon is running:
-
-**Linux/macOS:**
-```bash
-sudo systemctl status docker
-# or
-docker info
-```
-
-**Windows:**
-```powershell
-Get-Service docker
-# or
-docker info
-```
-
-**macOS (Docker Desktop):**
-```bash
-docker info
-```
-
-If Docker is not running, start it:
-
-**Linux:**
-```bash
-sudo systemctl start docker
-```
-
-**Windows:**
-```powershell
-Start-Service docker
-```
-
-**macOS:**
-Open Docker Desktop application or run:
-```bash
-open -a Docker
-```
-
-### Port Requirements
-
-Before deployment, ensure these ports are available:
-
-| Service | Port | Purpose |
-|-------------------|------------|----------------------------------------|
-| **Web Dashboard** | 5000 | Main web interface for monitoring |
-| **API Service** | 3702 | REST API for programmatic access |
-| **DICOM Server** | 11112 | Medical imaging protocol server |
-| **Redis** | 6379 | Fast data storage (internal) |
-| **Elasticsearch** | 9200, 9300 | Search and analytics (monitoring mode) |
-| **Kibana** | 5601 | Data visualization (monitoring mode) |
-
-### Port Availability Check
-
-**Linux:**
-```bash
-netstat -tuln | grep -E '11112|5601|3702|5000|6379'
-```
-
-**Windows:**
-```powershell
-Get-NetTCPConnection | Where-Object { $_.LocalPort -eq 11112 -or $_.LocalPort -eq 3702 -or $_.LocalPort -eq 5000 -or $_.LocalPort -eq 6379 } | Format-Table
-```
-
-### Deployment Architecture
-
-
-
-### Service Profiles
-
-DICOMHawk uses Docker Compose profiles for flexible deployment:
-
-| Profile | Services Included | Use Case |
-|------------|-------------------------------------|----------------------------|
-| **main** | DICOM server, API, Redis, log server | Core honeypot functionality |
-| **monitoring** | Elasticsearch, Kibana, Logstash | Advanced monitoring stack |
-
-### Available Interfaces
-
-| Interface | URL | Purpose |
-|-----------|-----|---------|
-| **Kibana Dashboard** | http://localhost:5601/app/dashboards | Advanced monitoring and visualization |
-| **Simplified Logging Server** | http://localhost:5000 | Basic log viewing and management |
-| **Web API User Interface** | http://localhost:3000 | API interaction and testing |
-
-
-### Default Credentials of API Interface
-- **Username**: `test`
-- **Password**: `test`
-
-> **Note**: These are honey credentials designed to detect unauthorized access attempts.
-### Deployment Commands
-
-```bash
-# Clone repository (may take time due to large DICOM files)
-git clone https://github.com/honeynet/DICOMHawk.git
-cd ./DICOMHawk
-
-# Start core services only
-docker compose --profile main up -d
-
-# Start monitoring services only
-docker compose --profile monitoring up -d
-
-# Start all services
-docker compose --profile main --profile monitoring up -d
-```
-
-## Running DICOMHawk Locally
-
-> **💡 Development/Testing Deployment Method**: This method is ideal for development, testing, or when you need full control over individual services. It requires manual setup of each component and configuration management.
-
-### Prerequisites
-
-**Port availability** - ensure required ports are available (see [Port Requirements](#port-requirements))
-
-#### Redis Service
-**Ensure Redis is running on port 6379. You can start Redis using the following command if you have Redis installed:**
-
-```bash
-redis-server --port 6379
-```
-
-**If you do not have Redis installed, you can easily run a Redis instance using Docker with the following command:**
-```bash
-docker run -p 6379:6379 --name redis-db -d redis
-```
-
-#### Installing Packages
-```bash
-cd ./dicom_server
-pip install -r requirements.txt
-```
-
-### Service Startup
-
-#### DICOM Server
-```bash
-cd ./dicom_server
-python main.py # Use python3 main.py if your environment defaults to Python 3
-```
-
-#### Run the API using Node.js:
-```bash
-cd ./API
-node app.js
-```
-
-#### Flask Logging Server
-```bash
-cd ./flask_logging_server
-python logserver.py # Use python3 logserver.py if your environment defaults to Python 3
-```
-
-### Monitoring Stack
-
-To deploy the monitoring stack, navigate to the root directory and run the Docker Compose file which contains the monitoring stack's configurations.
-```bash
-cd monitoring_stack/
-docker compose --profile main up -d
-```
-
-## Configuration
-
-### Essential Configuration (Required)
-
-#### [1] TCIA Credentials
-**Required for downloading real medical images**
-
-DICOMHawk integrates with The Cancer Imaging Archive (TCIA) to provide authentic medical imaging data:
-
-- **TCIA Account Setup**: Create a free account at [TCIA](https://www.cancerimagingarchive.net/access-data/) following the [account creation guide](https://wiki.cancerimagingarchive.net/pages/viewpage.action?pageId=23691309)
-- **Automatic Updates**: Files are retrieved from publicly available repositories with licenses saved in:
- ```
- dicom_server/dicom_storage/tcia_data/modality/[StudyInstanceUID]/SeriesInstanceUID/LICENSE
- ```
-
-**Configuration Parameters:**
-- `TCIA_USER_NAME`: Username for TCIA API authentication
-- `TCIA_PASSWORD`: Password for TCIA API authentication
-- `TCIA_ACTIVATED`: Boolean (`yes`/`no`) to activate/deactivate TCIA service
-- `TCIA_PERIOD_UNIT`: Time unit (`day`, `week`, `hour`, `minutes`) for update frequency
-- `TCIA_PERIOD`: Numerical frequency value (e.g., `2` weeks = updates twice weekly)
-- `MODALITIES`: Array of modalities to retrieve (e.g., `["CT", "MR", "US", "DX"]`)
-- `MINIMUM_TCIA_FILES_IN_SERIE`: Minimum files per series
-- `MAXIMUM_TCIA_FILES_IN_SERIE`: Maximum files per series
-
-### Optional Configuration
-
-#### [2] Security Settings
-**Auto-generated for production use**
-
-JWT and session management secrets for secure authentication:
-
-- **Access Token Secret**: JWT authentication signing
-- **Refresh Token Secret**: Session refresh token signing
-- **Admin Secret**: Admin authentication signing
-- **Admin Refresh Token Secret**: Admin session refresh
-- **Session Secret**: User session management
-
-#### [3] API Settings
-**Web API configuration**
-
-- **API Port**: REST API service port (default: 3702)
-
-> **⚠️ Important**: If changing the API port, update both `docker-compose.yml` and `API/Dockerfile` accordingly.
-
-**Example**: If you change API port to 8080, update:
-
-- [`docker-compose.yml`](docker-compose.yml#L42) → `api` service: `"3702:3702"` → `"8080:8080"`
-- [`API/Dockerfile`](API/Dockerfile#L8): `EXPOSE 3702` → `EXPOSE 8080`
-
-#### [4] Threat Intelligence APIs
-**Enhanced security detection (optional)**
-
-Integrate with external threat intelligence services:
-
-- **[AbuseIPDB](https://www.abuseipdb.com/)**: IP reputation checking
-- **[IPQualityScore](https://www.ipqualityscore.com/)**: Enhanced IP analysis
-- **[VirusTotal](https://www.virustotal.com/gui/home/upload)**: Malware detection
-
-#### [5] DICOM Settings
-**Multi-port DICOM server configuration**
-
-- **DICOM Ports**: Server listening ports (default: 11112)
-- **DICOM_IMPLEMENTATION_NAME**: Server identification (default: ORTHANC)
-- **DICOM_IMPLEMENTATION_UID**: Unique server identifier
-
-> **⚠️ Important**: Port changes require updates to `docker-compose.yml` and `dicom_server/Dockerfile`.
-
-**Example**: If you change DICOM port to 104, update:
-
-- [`docker-compose.yml`](docker-compose.yml#L109) → `dicom_server` service: `"11112:11112"` → `"104:104"`
-- [`dicom_server/Dockerfile`](dicom_server/Dockerfile#L37): `EXPOSE 11112` → `EXPOSE 104`
-
-#### [6] Regional Settings
-**Patient data localization**
-
-- **Faker Locale**: Language for patient names (default: en_US)
-- **OSM Enabled**: Location services (default: true)
-- **OSM Country Code**: Country for location data (default: DK)
-- **OSM City**: Specific city (optional)
-
-#### [7] Honeypot Settings
-**Decoy configuration for intrusion detection**
-
-- **Honey URL**: Fake URL that triggers alerts when accessed
-
-## Advanced Configuration
-
-### DICOMHawk Configuration File
-
-`config.py` contains the main configuration constants and is located in the project root. These settings can be overridden via environment variables in docker compose file.
-
-### Key Configurable Parameters
-
-#### General Configuration
-- **PROD**: Environment mode (`yes`/`no`)
- - `yes`: Production mode with optimized settings
- - `no`: Development mode with debug details and system information
-
-#### Logging Configuration
-- **FLASK_ACTIVATED**: Flask server logging (`yes`/`no`)
-
-#### Integrity Checks
-- **INTEGRITY_CHECK**: Periodic DICOM file integrity verification (`yes`/`no`)
-
-#### DICOM Server and Blackhole Configuration
-- **DICOM_SERVER_HOST**: DICOM server IP address or hostname
-- **BLOCK_SCANNERS**: Mass scanner blocking (`yes`/`no`)
-
-## Usage Examples
-
-### DICOM Protocol Interaction
-
-Users can interact with the DICOM server using standard DCMTK tools:
-
-#### Connection Verification
-```bash
-echoscu localhost 11112
-```
-
-#### Patient Queries
-```bash
-findscu -v -S -k QueryRetrieveLevel=PATIENT localhost 11112
-```
-
-#### Study Queries
-```bash
-findscu -v -S -k QueryRetrieveLevel=STUDY localhost 11112
-```
-
-#### File Storage
-```bash
-storescu -v -d localhost 11112 [Path to your DICOM file]
-```
-
-### DICOM Client Applications
-
-DICOMHawk is compatible with various DICOM client applications:
-
-- **Sante DICOM Viewer**: [Download here](https://santesoft.com/win/sante-dicom-viewer-lite/sante-dicom-viewer-lite.html)
-- **Other DICOM viewers**: Any DICOM-compliant client application
-
-## DICOMHawk Monitoring System
-
-### Overview
-
-DICOMHawk implements a centralized security monitoring infrastructure designed to track and analyze attacker behavior in healthcare environments. This system enables cybersecurity teams to:
-
-- **Quick Detection**: Rapidly identify security incidents
-- **Pattern Analysis**: Understand attacker techniques and interaction patterns
-- **Forensic Capabilities**: Maintain detailed logs for comprehensive analysis
-- **Impact Assessment**: Trace the source and impact of each interaction
-
-
-
-### Monitoring Components
-
-The monitoring system provides:
-
-- **Real-time Metrics**: Summary statistics and detailed analysis
-- **Multi-format Visualizations**: Numbers, tables, pie charts, and timelines
-- **Threat Scoring**: Immediate malicious and abuse scoring for each interaction
-- **Comprehensive Logging**: Detailed tracking of DICOM sessions and API requests
-
-### Architecture
-
-The monitoring system utilizes the Elastic Stack:
-
-1. **Logstash**: Collects data from log files integrated with the honeypot
-2. **Elasticsearch**: Indexes and stores security events for analysis
-3. **Kibana**: Provides powerful data visualization and dashboard capabilities
-
-## Honeytokens
-
-Honeytokens (canary PDFs and honeyURLs) are security measures used to detect and alert on unauthorized access or potential breaches.
-
-### DICOM Server Honeytokens
-
-The DICOM server in DICOMHawk is designed to automatically update its DICOM file repository periodically, pulling new files from The Cancer Imaging Archive (TCIA). During this update process, the system injects selected DICOM files with honeytokens, specifically canary PDFs and honeyURLs, as part of its enhanced security measures.
-
-When the DICOM server periodically removes old DICOM files and retrieves new ones from TCIA, the updated canary PDF and honeyURL are automatically injected into some of these new files. This ensures that the security features are consistently refreshed and tailored to current monitoring and security needs.
-
-#### Canary PDFs
-Canary PDF files serve as monitored tokens within DICOM files.
-
-- **Location**: `dicom_server/storage/can.pdf` (maps to `/opt/dicomhawk/storage/can.pdf` in container)
-- The server uses this file as a template for generating canary PDFs injected into new DICOM files retrieved from TCIA. Make sure the updated PDF is named can.pdf to ensure it is properly recognized and utilized by the system.
-
-#### HoneyURLs
-HoneyURLs are URLs embedded within DICOM data. When accessed, they indicate potential unauthorized interactions.
-
-```bash
-HONEY_URL="https://[YOURHONEYURL]"
-```
-- Replace `[YOURHONEYURL]` with your desired honey URL
-
-- This change in the environment variable ensures that any new DICOM files automatically fetched and updated by the server will include the new honeyURL.
-
-### Web API Honeytokens
-
-The Web API has also employed four honeytoken types to detect different attack vectors.
-
-#### robots.txt and Hidden Endpoints
-- Allows an attacker to be misguided and mislead to, for example, the endpoints called: "/admin", "/admin-config", "/secure" and "/ensurance_data".
-- The purpose of this file is to make the attackers curious to explore the Web API and think of ways to get access to those protected resources. In this way, more meaningful information on attackers' actions can be collected.
-- If someone accesses the "robots.txt" file, the interaction is immediately logged and visualized within the visualization dashboard which helps identifying potential crawling or scraping activities.
-- When for example, the "/admin" endpoint is accessed a fake admin access token is generated, which is not differing in size from the original access token. This is meant to provide inspiration for the potential adversaries.
-
-#### Honey Credentials
-
-- Fake credentials appear to be "leaked" in the login page of the Web API. They are to be found in the raw html source. If these credentials are used by a potential adversary, they are taken to an "Under development" screen.
-- Moreover, in order to access the Web API from the very start, the potential adversary has to login into the system.
-- Honey credentials "test" - "test" are used.
-- The login page is continuously monitored for login attempts and therefore guessing, credential stuffing and brute force attacks can be identified.
-
-## Log Management
-
-DICOMHawk implements comprehensive automated log management through the `dicomhawkinit` service.
-
-### Features
-
-- **Daily Log Rotation**: Automatic log file rotation
-- **Compression**: Efficient storage using pigz compression
-- **Cleanup**: Automatic removal of logs older than 30 days (configurable)
-- **Organization**: Structured log storage and management
-
-DICOMHawk captures detailed information about:
-
-All logs are stored under `/data/dicomhawk/logs/`:
-
-| Directory/File | Content | Purpose |
-|----------------|---------|---------|
-| `dicom_raw_logs/` | Raw DICOM protocol messages, association requests/releases, C-FIND/C-GET/C-STORE operations, detailed packet-level communication | Deep protocol analysis and debugging |
-| `simplified/` | Clean DICOM transaction summaries, patient queries, study retrievals, association events with timestamps and IP addresses | Quick event review and monitoring |
-| `exceptions/` | Python exceptions, service errors, configuration issues, startup failures, runtime problems | Troubleshooting and system health monitoring |
-| `api_logs.log` | REST API requests/responses, authentication attempts, file uploads/downloads, user sessions, endpoint access | API usage monitoring and security analysis |
-| `reputation.log` | IP reputation scores, threat intelligence results, abuse scores, geographic data, proxy/VPN detection | Security analysis and threat assessment |
-| `scanned_ips.log` | IP scanning patterns, port scans, connection attempts, attack signatures, frequency analysis | Attack detection and pattern recognition |
-
-### Configuration
-
-Customize log retention through environment variables:
-
-```yaml
-dicomhawkinit:
- environment:
- - PERSISTENCE_CYCLES=30 # Days to retain logs
-```
diff --git a/customizer/Dockerfile b/customizer/Dockerfile
deleted file mode 100644
index c0cef02d..00000000
--- a/customizer/Dockerfile
+++ /dev/null
@@ -1,25 +0,0 @@
-FROM python:3.9-slim
-
-ARG APP_UID=2000
-ARG APP_GID=2000
-
-WORKDIR /customizer
-
-# Copy the customizer script
-COPY customizer.py /customizer/
-COPY entrypoint.sh /customizer/
-
-# Make scripts executable
-RUN chmod +x /customizer/customizer.py
-RUN chmod +x /customizer/entrypoint.sh
-
-# Install required packages
-RUN pip install --no-cache-dir colorama
-
-RUN groupadd -g ${APP_GID} dicom \
- && useradd -m -u ${APP_UID} -g ${APP_GID} -s /usr/sbin/nologin dicom \
- && chown -R ${APP_UID}:${APP_GID} /customizer
-
-USER ${APP_UID}:${APP_GID}
-
-ENTRYPOINT ["/customizer/entrypoint.sh"]
\ No newline at end of file
diff --git a/customizer/customizer.py b/customizer/customizer.py
deleted file mode 100644
index f87095e6..00000000
--- a/customizer/customizer.py
+++ /dev/null
@@ -1,239 +0,0 @@
-#!/usr/bin/env python3
-"""
-DICOMHawk Configuration Customizer
-This script prompts users for necessary configurations and generates a .env file
-for the DICOMHawk honeypot system.
-"""
-
-import os
-import sys
-import secrets
-import string
-from pathlib import Path
-
-class Colors:
- HEADER = '\033[95m'
- OKBLUE = '\033[94m'
- OKCYAN = '\033[96m'
- OKGREEN = '\033[92m'
- WARNING = '\033[93m'
- FAIL = '\033[91m'
- ENDC = '\033[0m'
- BOLD = '\033[1m'
- UNDERLINE = '\033[4m'
-
-def print_header():
- """Print the DICOMHawk header"""
- print(f"{Colors.HEADER}{Colors.BOLD}")
- print("=" * 60)
- print(" DICOMHawk Configuration Customizer")
- print("=" * 60)
- print(f"{Colors.ENDC}")
- print("This script will help you configure DICOMHawk for your environment.")
- print("Press Enter to use default values (shown in brackets).")
- print()
-
-def generate_secret(length=32):
- """Generate a random secret string"""
- # Use only alphanumeric characters to avoid Docker Compose variable interpretation issues
- alphabet = string.ascii_letters + string.digits
- return ''.join(secrets.choice(alphabet) for _ in range(length))
-
-def get_input(prompt, default="", required=False, secret=False):
- """Get user input with validation"""
- while True:
- if secret:
- import getpass
- value = getpass.getpass(f"{prompt} [{default}]: ")
- else:
- value = input(f"{prompt} [{default}]: ").strip()
-
- if not value:
- if required and not default:
- print(f"{Colors.FAIL}This field is required. Please enter a value.{Colors.ENDC}")
- continue
- value = default
-
- if required and not value:
- print(f"{Colors.FAIL}This field is required. Please enter a value.{Colors.ENDC}")
- continue
-
- return value
-
-def check_first_run():
- """Check if this is the first run"""
- env_file = Path(".env")
- if env_file.exists():
- print(f"{Colors.WARNING}Configuration file .env already exists.{Colors.ENDC}")
- response = input("Do you want to overwrite it? (y/n): ").lower().strip()
- if response not in ['y', 'yes']:
- print("Configuration cancelled.")
- sys.exit(0)
- return True
-
-def main():
- """Main configuration function"""
- print_header()
-
- if not check_first_run():
- return
-
- print(f"{Colors.OKBLUE}Step 1: Security Configuration{Colors.ENDC}")
- print("-" * 40)
-
- # Generate default secrets
- access_token_secret = generate_secret(32)
- refresh_token_secret = generate_secret(32)
- admin_secret = generate_secret(32)
- admin_refresh_token_secret = generate_secret(32)
- session_secret = generate_secret(32)
-
- # Security tokens
- ACCESS_TOKEN_SECRET = get_input(
- "Access Token Secret (for JWT authentication)",
- access_token_secret,
- required=True,
- secret=True
- )
-
- REFRESH_TOKEN_SECRET = get_input(
- "Refresh Token Secret (for JWT refresh)",
- refresh_token_secret,
- required=True,
- secret=True
- )
-
- ADMIN_SECRET = get_input(
- "Admin Secret (for admin authentication)",
- admin_secret,
- required=True,
- secret=True
- )
-
- ADMIN_REFRESH_TOKEN_SECRET = get_input(
- "Admin Refresh Token Secret",
- admin_refresh_token_secret,
- required=True,
- secret=True
- )
-
- SESSION_SECRET = get_input(
- "Session Secret (for session management)",
- session_secret,
- required=True,
- secret=True
- )
-
- print(f"\n{Colors.OKBLUE}Step 2: API Configuration{Colors.ENDC}")
- print("-" * 40)
-
- API_PORT = get_input("API Port", "3702")
-
- print(f"\n{Colors.OKBLUE}Step 3: TCIA Configuration{Colors.ENDC}")
- print("-" * 40)
- print("TCIA credentials are optional. Leave blank to use sample DICOM files (fallback is automatic).")
- print("Get free credentials: https://www.cancerimagingarchive.net/")
-
- TCIA_USER_NAME = get_input("TCIA Username (optional)")
- TCIA_PASSWORD = get_input("TCIA Password (optional)", secret=True)
- TCIA_PERIOD_UNIT = get_input("TCIA Period Unit (minutes/hours/days)", "minutes")
- TCIA_PERIOD = get_input("TCIA Period (frequency of downloads)", "1")
- # Always enable fallback mode; it will automatically be used when credentials are missing or TCIA is disabled
- TCIA_FALLBACK_MODE = "true"
-
- print(f"\n{Colors.OKBLUE}Step 4: Threat Intelligence APIs (Optional){Colors.ENDC}")
- print("-" * 40)
- print("These APIs are used for IP reputation checking. Leave empty if you don't have keys.")
-
- ABUSE_IP_API_KEY = get_input("AbuseIPDB API Key", "", secret=True)
- IP_QUALITY_SCORE_API_KEY = get_input("IPQualityScore API Key", "", secret=True)
- VIRUS_TOTAL_API_KEY = get_input("VirusTotal API Key", "", secret=True)
-
- print(f"\n{Colors.OKBLUE}Step 5: DICOM Configuration{Colors.ENDC}")
- print("-" * 40)
-
- DICOM_PORTS = get_input("DICOM Ports (comma-separated)", "11112")
- DICOM_IMPLEMENTATION_NAME = get_input("DICOM Implementation Name", "ORTHANC")
- DICOM_IMPLEMENTATION_UID = get_input("DICOM Implementation UID", "1.2.826.0.1.3680043.9.3811.2.0.1")
-
- print(f"\n{Colors.OKBLUE}Step 6: Regional Configuration{Colors.ENDC}")
- print("-" * 40)
-
- FAKER_LOCALE = get_input("Faker Locale (for generating patient names)", "en_US")
- OSM_ENABLED = get_input("Enable OpenStreetMap integration (true/false)", "true")
- OSM_COUNTRY = get_input("OSM Country Code (ISO 3166-1 alpha-2)", "DK")
- OSM_CITY = get_input("OSM City (optional)", "")
-
- print(f"\n{Colors.OKBLUE}Step 7: Honeypot Configuration{Colors.ENDC}")
- print("-" * 40)
-
- HONEY_URL = get_input("Honey URL (for honeytoken injection)", "https://example.com/honey")
-
- # Generate .env file
- env_content = f"""# DICOMHawk Configuration File
-# Generated by customizer.py
-
-# Security Tokens
-ACCESS_TOKEN_SECRET={ACCESS_TOKEN_SECRET}
-REFRESH_TOKEN_SECRET={REFRESH_TOKEN_SECRET}
-ADMIN_SECRET={ADMIN_SECRET}
-ADMIN_REFRESH_TOKEN_SECRET={ADMIN_REFRESH_TOKEN_SECRET}
-SESSION_SECRET={SESSION_SECRET}
-
-# API Configuration
-API_PORT={API_PORT}
-
-# TCIA Configuration
-TCIA_USER_NAME={TCIA_USER_NAME}
-TCIA_PASSWORD={TCIA_PASSWORD}
-TCIA_PERIOD_UNIT={TCIA_PERIOD_UNIT}
-TCIA_PERIOD={TCIA_PERIOD}
-TCIA_FALLBACK_MODE={TCIA_FALLBACK_MODE}
-
-# Threat Intelligence APIs
-ABUSE_IP_API_KEY={ABUSE_IP_API_KEY}
-IP_QUALITY_SCORE_API_KEY={IP_QUALITY_SCORE_API_KEY}
-VIRUS_TOTAL_API_KEY={VIRUS_TOTAL_API_KEY}
-
-# DICOM Configuration
-DICOM_PORTS={DICOM_PORTS}
-DICOM_IMPLEMENTATION_NAME={DICOM_IMPLEMENTATION_NAME}
-DICOM_IMPLEMENTATION_UID={DICOM_IMPLEMENTATION_UID}
-
-# Regional Configuration
-FAKER_LOCALE={FAKER_LOCALE}
-OSM_ENABLED={OSM_ENABLED}
-OSM_COUNTRY={OSM_COUNTRY}
-OSM_CITY={OSM_CITY}
-
-# Honeypot Configuration
-HONEY_URL={HONEY_URL}
-"""
-
- # Write .env file
- with open(".env", "w") as f:
- f.write(env_content)
-
- print(f"\n{Colors.OKGREEN}Configuration completed successfully!{Colors.ENDC}")
- print(f"{Colors.BOLD}Generated .env file with your configuration.{Colors.ENDC}")
- print()
- print("Next steps:")
- print("1. Review the generated .env file")
- print("2. Run: docker-compose --profile main up -d")
- print("3. Access the web interface at: http://localhost:5000")
- print("4. Access the API at: http://localhost:3702")
- print()
- print(f"{Colors.WARNING}Important:{Colors.ENDC}")
- print("- TCIA credentials are optional - the system will use sample files if not provided")
- print("- Update your TCIA credentials if they expire")
- print("- The fallback system ensures the honeypot always has realistic DICOM data")
-
-if __name__ == "__main__":
- try:
- main()
- except KeyboardInterrupt:
- print(f"\n{Colors.FAIL}Configuration cancelled by user.{Colors.ENDC}")
- sys.exit(1)
- except Exception as e:
- print(f"\n{Colors.FAIL}Error: {e}{Colors.ENDC}")
- sys.exit(1)
\ No newline at end of file
diff --git a/customizer/entrypoint.sh b/customizer/entrypoint.sh
deleted file mode 100644
index 74a811b0..00000000
--- a/customizer/entrypoint.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/bash
-
-# DICOMHawk Customizer Entrypoint
-# This script runs the customizer and ensures it only runs once
-
-set -e
-
-CONFIG_FLAG="/customizer/.configured"
-
-echo "DICOMHawk Customizer Starting..."
-
-# Check if already configured
-if [ -f "$CONFIG_FLAG" ]; then
- echo "Configuration already completed. Skipping customizer."
- exit 0
-fi
-
-# Check if .env file exists
-if [ -f "/workspace/.env" ]; then
- echo "Configuration file .env already exists."
- echo "If you want to reconfigure, remove the .env file and restart."
- exit 0
-fi
-
-# Run the customizer
-echo "Starting configuration process..."
-python3 /customizer/customizer.py
-
-# Check if configuration was successful
-if [ -f "/workspace/.env" ]; then
- echo "Configuration completed successfully!"
- touch "$CONFIG_FLAG"
- exit 0
-else
- echo "Configuration failed. Please check the output above."
- exit 1
-fi
\ No newline at end of file
diff --git a/dicom_server/Dockerfile b/dicom_server/Dockerfile
deleted file mode 100644
index 1662cb3e..00000000
--- a/dicom_server/Dockerfile
+++ /dev/null
@@ -1,44 +0,0 @@
-FROM python:3.9-slim
-USER root
-
-RUN mkdir -p /var/log/dicomhawk/dicom_raw_logs \
- /var/log/dicomhawk/simplified \
- /var/log/dicomhawk/exceptions \
- /var/log/dicomhawk/api_logs \
- /var/log/dicomhawk/reputation \
- /var/log/dicomhawk/scanned_ips \
- /opt/dicomhawk/storage/dicom_storage \
- /opt/dicomhawk/storage/c_store_files \
- /opt/dicomhawk/tcia/data \
- /opt/dicomhawk/tcia/stagger
-
-RUN touch /var/log/dicomhawk/dicom_raw_logs/dicom_raw.log \
- /var/log/dicomhawk/simplified/simplified_logger.log \
- /var/log/dicomhawk/exceptions/exceptions.log \
- /var/log/dicomhawk/api_logs/api_logs.log \
- /var/log/dicomhawk/reputation/reputation.log \
- /var/log/dicomhawk/scanned_ips/scanned_ips.log
-
-COPY . dicom_server/
-WORKDIR /dicom_server/.
-
-RUN pip install --upgrade pip \
- && pip install -r requirements.txt \
- && apt-get update \
- && apt-get -qq install -y iptables ipset
-
-COPY ./pydicom_and_pynetdicom_libs/service_class.py /usr/local/lib/python3.9/site-packages/pynetdicom/service_class.py
-COPY ./pydicom_and_pynetdicom_libs/db.py /usr/local/lib/python3.9/site-packages/pynetdicom/apps/qrscp/db.py
-COPY ./pydicom_and_pynetdicom_libs/valuerep.py /usr/local/lib/python3.9/site-packages/pydicom/valuerep.py
-
-ARG APP_UID=2000
-ARG APP_GID=2000
-RUN groupadd -g ${APP_GID} dicom \
- && useradd -m -u ${APP_UID} -g ${APP_GID} -s /usr/sbin/nologin dicom \
- && chown -R ${APP_UID}:${APP_GID} \
- /var/log/dicomhawk \
- /opt/dicomhawk
-
-EXPOSE 11112
-USER ${APP_UID}:${APP_GID}
-CMD ["python","-u","main.py"]
diff --git a/dicom_server/config.py b/dicom_server/config.py
deleted file mode 100644
index db0aa2a5..00000000
--- a/dicom_server/config.py
+++ /dev/null
@@ -1,211 +0,0 @@
-"""This module defines configuration constants and paths for the server service.
-Many values can be overridden via environment variables
-
-TCIA Serviceconstants:
----------------------
-* TCIA_USER_NAME
-* TCIA_ACTIVATED
-* TCIA_PASSWORD
-* TCIA_PERIOD_UNIT
-* TCIA_PERIOD
-* TCIA_FILES_DIRECTORY
-* MODALITIES
-* MINIMUM_TCIA_FILES_IN_SERIE
-* MAXIMUM_TCIA_FILES_IN_SERIE
-* TCIA_STUDIES_PER_MODALITY
-* FAKER_LOCALE
-
-OpenStreetMap Integration:
----------------------
-* OSM_ENABLED
-* OSM_COUNTRY
-* OSM_CITY
-* OSM_CACHE_DURATION
-* OSM_MAX_INSTITUTIONS
-* OSM_TIMEOUT
-* OSM_FALLBACK_INSTITUTIONS
-
-Logging Server:
----------------------
-* FLASK_ACTIVATED (Important to avoid logging on test environment)
-* MAIN_LOG_DIRECTORY
-* SIMPLIFIED_LOG_DIRECTORY
-* EXCEPTIONS_LOG_DIRECTORY
-
-Integrity Check:
----------------------
-* INTEGRITY_CHECK
-* HASH_STORAGE_PATH
-
-Threat Intelligence:
----------------------
-* ABUSE_IP_API_KEY
-* IP_QUALITY_SCORE_API_KEY
-* VIRUS_TOTAL_API_KEY
-
-Blackhole:
----------------------
-* BLOCK_SCANNERS
-* BLACKHOLE_FILE_PATH
-
-DICOM server:
----------------------
-* PROD (environment will be production if this constant is true and development if it is false)
-* DICOM_STORAGE_DIR
-* C_STORE_STORAGE
-* DICOM_PORTS
-* DICOM_SERVER_HOST
-* REDIS_HOST
-* DICOM_DATABASE
-* CANARY_PDF_PATH
-
-"""
-
-import os, json
-
-TRUE_LIST = ["true", "1", "t", "yes"]
-"""Envirnoment"""
-PROD = os.getenv("PROD", "False").lower() in TRUE_LIST
-
-DOCKER = os.getenv("DOCKER", "False").lower() in TRUE_LIST
-"""Flask server status"""
-FLASK_ACTIVATED = os.getenv("FLASK_ACTIVATED", "True").lower() in TRUE_LIST
-
-"""Null routing the incomming requests if belong a known mass scanner """
-BLOCK_SCANNERS = os.getenv("BLOCK_SCANNERS", "False").lower() in TRUE_LIST
-
-"""Blackhole list file"""
-BLACKHOLE_FILE_PATH = os.getenv("BLACKHOLE_FILE_PATH", "/opt/dicomhawk/storage/blackhole_list.txt" if DOCKER else "./storage/blackhole_list.txt")
-
-"""DICOM files storage"""
-
-DICOM_STORAGE_DIR = "/opt/dicomhawk/storage/dicom_storage" if DOCKER else "./storage/dicom_storage"
-
-"""DICOM files recieved through the server storage"""
-
-C_STORE_STORAGE = "/opt/dicomhawk/storage/c_store_files" if DOCKER else "./storage/c_store_files"
-
-"""DICOM server port configuration"""
-try:
- DICOM_PORTS = json.loads(os.getenv("DICOM_PORTS", "[11112]"))
-except json.JSONDecodeError:
- DICOM_PORTS = [11112]
-
-# DICOM Implementation Name
-IMPLEMENTATION_NAME = os.getenv("DICOM_IMPLEMENTATION_NAME", "ORTHANC")
-IMPLEMENTATION_UID = os.getenv("DICOM_IMPLEMENTATION_UID", "1.2.826.0.1.3680043.9.3811.2.0.1")
-
-"""DICOM server host ip configuration"""
-DICOM_SERVER_HOST = "172.29.0.3" if DOCKER else "0.0.0.0"
-
-
-"""Redis host configuration"""
-REDIS_HOST = os.getenv("REDIS_HOST", "172.29.0.4") if DOCKER else "localhost"
-
-"""Logs directories"""
-MAIN_LOG_DIRECTORY, SIMPLIFIED_LOG_DIRECTORY, EXCEPTIONS_LOG_DIRECTORY = (
- ("/var/log/dicomhawk/dicom_raw_logs", "/var/log/dicomhawk/simplified", "/var/log/dicomhawk/exceptions")
- if DOCKER
- else (
- "../flask_logging_server/logs/dicom_raw_logs",
- "../flask_logging_server/logs/simplified",
- "./exceptions",
- )
-)
-
-"""The sqlite file path"""
-DICOM_DATABASE = "/opt/dicomhawk/storage/db.db" if DOCKER else "./storage/db.db"
-
-"""TCIA username and password to use it in API calls"""
-TCIA_USER_NAME = os.getenv("TCIA_USER_NAME", "user")
-TCIA_PASSWORD = os.getenv("TCIA_PASSWORD", "pass")
-
-"""Time unit to schedule tcia files retrieval"""
-TCIA_PERIOD_UNIT = os.getenv("TCIA_PERIOD_UNIT", "week")
-
-
-"""Default update dicom files from tcia API each 1 week"""
-TCIA_PERIOD = int(os.getenv("TCIA_PERIOD", 1))
-
-"""The path where TCIA dicom files save on retrieval"""
-TCIA_FILES_DIRECTORY = "/opt/dicomhawk/tcia/data" if DOCKER else "./storage/tcia_data"
-"""Files stagger directory"""
-TCIA_FILES_STAGGER_DIRECTORY = "/opt/dicomhawk/tcia/stagger" if DOCKER else "./storage/stagger"
-""" API key Abuseipdb """
-ABUSE_IP_API_KEY = os.getenv(
- "ABUSE_IP__KEY",
- "apikey",
-)
-
-""" API key Abuseipdb """
-IP_QUALITY_SCORE_API_KEY = os.getenv(
- "IP_QUALITY_SCORE_API_KEY",
- "apikey",
-)
-
-""" API key Virus Total """
-VIRUS_TOTAL_API_KEY = os.getenv(
- "VIRUS_TOTAL_API_KEY",
- "apikey",
-)
-
-"""Canary pdf path"""
-CANARY_PDF_PATH = "/opt/dicomhawk/storage/can.pdf" if DOCKER else "./storage/can.pdf"
-
-
-"""TCIA activated"""
-TCIA_ACTIVATED = os.getenv("TCIA_ACTIVATED", "True").lower() in TRUE_LIST
-
-"""TCIA fallback mode - use sample files when TCIA is unavailable"""
-TCIA_FALLBACK_MODE = os.getenv("TCIA_FALLBACK_MODE", "True").lower() in TRUE_LIST
-
-
-""" Modalities of the studies should be retrieved from TCIA """
-MODALITIES = json.loads(os.getenv("MODALITIES", '["CT", "MR", "US", "DX"]'))
-
-"""Minimum number of files in each serie retrieved from The Cancer Imaging Archeive API"""
-MINIMUM_TCIA_FILES_IN_SERIE = int(os.getenv("MINIMUM_TCIA_FILES_IN_SERIE", 1))
-
-"""Maximum number of files in each serie retrieved from The Cancer Imaging Archeive API"""
-
-MAXIMUM_TCIA_FILES_IN_SERIE = int(os.getenv("MAXIMUM_TCIA_FILES_IN_SERIE", 3))
-
-"""Number of studies for each modality from TCIA"""
-TCIA_STUDIES_PER_MODALITY = int(os.getenv("TCIA_STUDIES_PER_MODALITY", 10))
-
-"""Honeytoken URL"""
-HONEY_URL = os.getenv("HONEY_URL","VALUE")
-
-"""Activate DICOM files integrity checks every 6 hours"""
-INTEGRITY_CHECK = os.getenv("INTEGRITY_CHECK", "True").lower() in TRUE_LIST
-
-"""Integrity checker file storage path"""
-HASH_STORAGE_PATH = "/opt/dicomhawk/storage/hash_store.json" if DOCKER else "./storage/hash_store.json"
-
-"""Faker locale for generating patient names and data"""
-FAKER_LOCALE = os.getenv("FAKER_LOCALE", "en_US")
-
-"""OpenStreetMap Integration Configuration"""
-OSM_ENABLED = os.getenv("OSM_ENABLED", "True").lower() in TRUE_LIST
-
-"""Country to search for medical institutions (ISO 3166-1 alpha-2 code)"""
-OSM_COUNTRY = os.getenv("OSM_COUNTRY", "DK")
-
-"""City to search for medical institutions (optional, searches entire country if not specified)"""
-OSM_CITY = os.getenv("OSM_CITY", "")
-
-"""Cache duration for OSM data in hours"""
-OSM_CACHE_DURATION = int(os.getenv("OSM_CACHE_DURATION", 24))
-
-"""Maximum number of institutions to fetch from OSM"""
-OSM_MAX_INSTITUTIONS = int(os.getenv("OSM_MAX_INSTITUTIONS", 50))
-
-"""Timeout for OSM API requests in seconds"""
-OSM_TIMEOUT = int(os.getenv("OSM_TIMEOUT", 30))
-
-"""Fallback institutions when OSM is disabled or fails"""
-OSM_FALLBACK_INSTITUTIONS = json.loads(os.getenv("OSM_FALLBACK_INSTITUTIONS",
- '["Københavns Sundhedscenter", "Aarhus Kliniken", "Odense Patienthus", "Nordjylland Med Institut"]'))
-
-"""OSM cache file path"""
-OSM_CACHE_FILE = "/opt/dicomhawk/storage/osm_institutions_cache.json" if DOCKER else "./storage/osm_institutions_cache.json"
\ No newline at end of file
diff --git a/dicom_server/core/app_container.py b/dicom_server/core/app_container.py
deleted file mode 100644
index f9cdbcc6..00000000
--- a/dicom_server/core/app_container.py
+++ /dev/null
@@ -1,222 +0,0 @@
-"""
-This module defines the ApplicationContext class using the Dependency Injector library to manage dependencies throughout the start of the application.
-
-The ApplicationContext class acts as a central configuration hub for all services on the server
-
-The setup includes adding the following providers:
-
- Loggers provider
- ------------------
-
- data-access agents:
- ------------------
-
- * dicom_db: Manages the DICOM database service, responsible for storing/retrieving dicom files information maintained at the storage block.
-
- * redis_handler: Implements a redis service responsible for storing of dicom sessions information, provides rapid access for external analysis/visualization middleware.
-
- TCIA providers:
- ------------------
-
- * tcia_api: Handles communication between the application and The Cancer Imaging Archive API.
-
- * tcia_manager: Handles file exchange by removing old files, organizing new ones, injectting new files with honeytokens and initializing the database.
-
- * tcia_scheduler: Schedules the retrieval of new DICOM files on a periodic basis.
-
- Threat Intelligence:
- ------------------
-
- * threat_intelligence: provides IP information from three Threat Intelligence services (AbuseIPdatabase, IPQualityScore, and VirusTotal).
-
- Files Integrity Checker:
- ------------------
- * files_checker: Verifies the integrity of the dicom files stored at the dicom storage every seven hours, detecting any unauthorized access attemp.
-
- Network Management:
- ------------------
-
- * blackhole: Null-route the requests with IP addresses that belong to one of the known mass-scanners mitigitating the potential of the heneypot been identified as a honeypot in the future
-
- * session_collector: Collects and manages data from dicom sessions in order to ensure consistency in data analysis and visualization
-
- DICOM Services:
- ------------------
-
- * dicom_handler: implements the standard dicom operations, acting as a SCP (Service Provider) on C-Echo and C-Store first part of C-Get, C-Find and C-Move (receiving and responding to requests) operations
- and as a SCU (Serive User) for the second part of C-Get, C-Find and C-Move (initiating requests) operations
-
- * dicom_application: handles the configuration, initialization of the DICOM application entity and starts the DICOM server.
-"""
-
-import sys, os
-
-from dependency_injector import containers, providers
-from sqlalchemy import create_engine
-from sqlalchemy.orm import sessionmaker
-import redis
-import config
-from loggers import Loggers
-from dicomdb import DicomDatabase
-from redis_handler import RedisClient
-from dicom_session_manager import SessionCollector
-from dicom_handlers import DICOMHandlers
-from dicom_application import DicomStarter
-from threat_intelligence_handler import ThreatIntelligence
-import logging
-from custom_units.integrity_checker import FilesChecker
-from custom_units.tcia_management import TCIAAPI
-from custom_units.tcia_management import TCIAManager
-from custom_units.tcia_management import TCIAScheduler
-from custom_units.network_manager import Blackhole
-from custom_units.osm_institutions import OSMInstitutionsService
-
-
-
-class ApplicationContainer(containers.DeclarativeContainer):
-
- # Loggers service
- loggers = providers.Singleton(
- Loggers,
- config.PROD,
- config.MAIN_LOG_DIRECTORY,
- config.SIMPLIFIED_LOG_DIRECTORY,
- config.EXCEPTIONS_LOG_DIRECTORY,
- )
-
- if config.FLASK_ACTIVATED:
- loggers()
- app_logger = providers.Singleton(logging.getLogger, "app_logger")
- exceptions_logger = providers.Singleton(logging.getLogger, "exceptions")
- simplified_logger = providers.Singleton(logging.getLogger, "simplified_logger")
-
- # DICOM database session configuration
- engine = providers.Singleton(create_engine, f"sqlite:///{config.DICOM_DATABASE}")
- session_factory = providers.Singleton(sessionmaker, bind=engine)
- session = providers.Singleton(lambda sf: sf(), session_factory)
-
- # DICOM_database provider
- dicom_db = providers.Singleton(
- DicomDatabase, app_logger, exceptions_logger, config.DICOM_STORAGE_DIR, session
- )
-
- # Redis provider
- redis_client = providers.Singleton(redis.Redis, config.REDIS_HOST, 6379)
- try:
- redis_client().client_list()
- except ConnectionError:
- print(
- f"No Redis database is running on {config.REDIS_HOST}, port 6379. Please start the Redis service.",
- )
- sys.exit(1)
-
- redis_handler = providers.Singleton(
- RedisClient, app_logger, exceptions_logger, redis_client
- )
-
- # OSM provider
- osm_service = providers.Singleton(
- OSMInstitutionsService,
- app_logger,
- exceptions_logger,
- )
-
- # TCIA providers
-
- tcia_api = providers.Factory(
- TCIAAPI,
- app_logger,
- exceptions_logger,
- config.TCIA_USER_NAME,
- config.TCIA_PASSWORD,
- config.MINIMUM_TCIA_FILES_IN_SERIE,
- config.MAXIMUM_TCIA_FILES_IN_SERIE,
- config.MODALITIES,
- config.TCIA_STUDIES_PER_MODALITY,
- )
- tcia_manager = providers.Singleton(
- TCIAManager,
- app_logger,
- exceptions_logger,
- config.HONEY_URL,
- config.DICOM_STORAGE_DIR,
- config.TCIA_FILES_DIRECTORY,
- config.TCIA_FILES_STAGGER_DIRECTORY,
- config.CANARY_PDF_PATH,
- dicom_db,
- redis_handler,
- tcia_api,
- osm_service,
- )
-
- tcia_scheduler = providers.Singleton(
- TCIAScheduler,
- app_logger,
- exceptions_logger,
- config.TCIA_PERIOD,
- config.TCIA_PERIOD_UNIT,
- tcia_manager,
- )
-
- # IP Threat Intelligence provider
- threat_intelligence = providers.Singleton(
- ThreatIntelligence,
- app_logger,
- exceptions_logger,
- config.ABUSE_IP_API_KEY,
- config.IP_QUALITY_SCORE_API_KEY,
- config.VIRUS_TOTAL_API_KEY,
- )
-
- # DICOM files integrity cheacker provider
- files_checker = providers.Singleton(
- FilesChecker,
- app_logger,
- exceptions_logger,
- config.DICOM_STORAGE_DIR,
- config.HASH_STORAGE_PATH,
- redis_handler,
- )
-
- # Blackholee service provider
- blackhole = providers.Singleton(
- Blackhole,
- app_logger,
- exceptions_logger,
- config.BLOCK_SCANNERS,
- config.BLACKHOLE_FILE_PATH,
- )
-
- # A DICOM connection comprises multiple DICOM requests. A collector service provider is added to manage session information before logging.
- session_collector = providers.Singleton(
- SessionCollector,
- app_logger,
- simplified_logger,
- exceptions_logger,
- redis_handler,
- threat_intelligence,
- )
-
- # DICOM handlers provider
- dicom_handlers = providers.Singleton(
- DICOMHandlers, app_logger, exceptions_logger, session_collector, dicom_db
- )
-
- # The DICOM application handles the application entity configuration
- dicom_application = providers.Singleton(
- DicomStarter,
- app_logger,
- exceptions_logger,
- config.DICOM_PORTS,
- config.DICOM_SERVER_HOST,
- dicom_handlers,
- )
-
- if config.TCIA_ACTIVATED:
- tcia_scheduler()
-
- if config.INTEGRITY_CHECK:
- files_checker()
-
- if config.BLOCK_SCANNERS:
- blackhole()
diff --git a/dicom_server/core/dicom_application.py b/dicom_server/core/dicom_application.py
deleted file mode 100644
index fda2b427..00000000
--- a/dicom_server/core/dicom_application.py
+++ /dev/null
@@ -1,152 +0,0 @@
-"""
-
-A `DicomStarter` class to initialize and launch the DICOM server.
-It sets up the Application Entity (AE), registers event handlers,
-and verifies port availability before starting the server
-
-"""
-
-import socket
-import time
-from pynetdicom import evt
-from pynetdicom.sop_class import (
- PatientRootQueryRetrieveInformationModelFind,
- Verification,
- StudyRootQueryRetrieveInformationModelMove,
- PatientRootQueryRetrieveInformationModelGet,
- StudyRootQueryRetrieveInformationModelFind,
- StudyRootQueryRetrieveInformationModelGet,
- PatientRootQueryRetrieveInformationModelMove,
-)
-from pynetdicom import (
- AE,
- AllStoragePresentationContexts,
- StoragePresentationContexts,
-)
-
-from config import IMPLEMENTATION_NAME, IMPLEMENTATION_UID
-
-class DicomStarter:
-
- def __init__(self, app_logger, exceptions_logger, ports, ip, handlers):
- """
-
- Constructor for DicomStarter.
- Parameters:
- ----------
- exceptions_logger : Logger
- A previously sat logger to handle exceptions.
- ports : list or int
- DICOM server ports.
- ip : str
- DICOM host IP address.
- handlers : object
- Assoc, C-FIND, C-GET, C-MOVE, Release, Abort handler methods.
-
- """
- self.logger = app_logger
- self.ports = [ports] if isinstance(ports, int) else ports
- self.ip = ip
- self.handlers = handlers
- self.exceptions_logger = exceptions_logger
-
- def register_dicom_handlers(self):
- """
- List of event-handler tuples for the DICOM server.
-
- """
- try:
- handlers = [
- (evt.EVT_ACSE_RECV, self.handlers.handle_assoc),
- (evt.EVT_RELEASED, self.handlers.handle_release),
- (evt.EVT_C_FIND, self.handlers.handle_find),
- (evt.EVT_C_STORE, self.handlers.handle_store),
- (evt.EVT_C_ECHO, self.handlers.handle_echo),
- (evt.EVT_C_MOVE, self.handlers.handle_move),
- (evt.EVT_C_GET, self.handlers.handle_get),
- (evt.EVT_ABORTED, self.handlers.handle_abort),
- ]
-
- return handlers
-
- except Exception as e:
- self.exceptions_logger.exception(
- "Unexpected error while registering the DICOM handlers"
- )
-
- def start_the_application(self):
- """
- Start the DICOM server.
- Sets up the Application Entity and registers event handlers if the ports are not already used.
-
- """
- try:
- handlers = self.register_dicom_handlers()
-
- # Start server on each port
- for port in self.ports:
- if not self.is_port_in_use(port):
- # Create a new AE instance for each port
- ae = self.initialize_application_entity()
- if ae:
- self.logger.info(f"Starting DICOM Server on port {port}")
- ae.start_server(
- (self.ip, port),
- evt_handlers=handlers,
- block=False
- )
- self.logger.info(f"Successfully started DICOM Server on port {port}")
- else:
- self.logger.warning(f"Port {port} is already in use")
-
-
- self.logger.info("All DICOM servers started successfully")
-
- while True:
- time.sleep(1)
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error starting the application"
- )
-
- def initialize_application_entity(self):
- """
- Create and configure the Application Entity (AE).
- Registers supported and requested presentation contexts
- for storage, query/retrieve, and verification services.
- """
- try:
- ae = AE()
- ae.implementation_version_name = IMPLEMENTATION_NAME
- ae.implementation_class_uid = IMPLEMENTATION_UID
- ae.supported_contexts = AllStoragePresentationContexts
- ae.requested_contexts = StoragePresentationContexts
- ae.add_supported_context(PatientRootQueryRetrieveInformationModelFind)
- ae.add_supported_context(PatientRootQueryRetrieveInformationModelGet)
- ae.add_supported_context(StudyRootQueryRetrieveInformationModelGet)
- ae.add_supported_context(StudyRootQueryRetrieveInformationModelFind)
- ae.add_supported_context(StudyRootQueryRetrieveInformationModelMove)
- ae.add_supported_context(PatientRootQueryRetrieveInformationModelMove)
- ae.add_supported_context(Verification)
- self.initialize_storage_contexts(StoragePresentationContexts)
- self.logger.debug("Application entity initialized")
- return ae
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while initializing the application entity object"
- )
-
- def initialize_storage_contexts(self, StoragePresentationContexts):
- """
- Configure the roles (SCP/SCU) for each Storage Presentation Context.
-
- """
- for context in StoragePresentationContexts:
- context._as_scp = True
- context._as_scu = True
- context.scp_role = True
- context.scu_role = True
-
- def is_port_in_use(self, port):
- with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
- return s.connect_ex((self.ip, port)) == 0
diff --git a/dicom_server/core/dicom_handlers.py b/dicom_server/core/dicom_handlers.py
deleted file mode 100644
index 2aa4f25d..00000000
--- a/dicom_server/core/dicom_handlers.py
+++ /dev/null
@@ -1,330 +0,0 @@
-"""Implementation of the DICOM handlers"""
-
-import traceback, utilities.dicom_util as dicom_util
-from dependency_injector.wiring import inject
-from services.dicom_session_service import ISessionCollector
-from services.dicom_database_service import IDicomDatabase
-from pydicom.dataset import Dataset
-import traceback
-from pydicom.pixel_data_handlers.util import apply_modality_lut
-from typing import Generator, Tuple, Optional
-from enums.dicom_session_keys import Sessionkeys as session_keys
-
-
-class DICOMHandlers:
- @inject
- def __init__(
- self,
- app_logger,
- exceptions_logger=None,
- event_collector: ISessionCollector = None,
- dicomdb: IDicomDatabase = None,
- ):
- self.event_collector = event_collector or ISessionCollector()
- self.dicomdb = dicomdb or IDicomDatabase()
- self.exceptions_logger = exceptions_logger
- self.logger = app_logger
- dicomdb.initialize_database()
-
- def handle_assoc(self, event):
- try:
- version_name = (
- str(event.assoc.requestor.implementation_version_name)
- if event.assoc.requestor.implementation_version_name
- else "N/A"
- )
- ip = str(event.assoc.requestor.address)
- port = event.assoc.requestor.port
- local_port = event.assoc.acceptor.port
- self.event_collector.collect_session_info(
- {
- session_keys.LOCAL_PORT.key: local_port,
- },
- )
- self.event_collector.session_started(ip, port, version_name)
- except Exception as e:
- self.exceptions_logger.exception(
- "Unexpected error while handling association"
- )
-
- def handle_echo(self, event):
- try:
- local_port = event.assoc.acceptor.port
- self.event_collector.collect_session_info(
- {
- session_keys.LOG_LEVEL.key: "Info",
- session_keys.REQUEST_TYPE.key: "C_ECHO",
- session_keys.SESSION_MAIN_OPERATION.key: "C_ECHO",
- session_keys.LOCAL_PORT.key: local_port,
- },
- True,
- )
- return 0x0000
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while handling ECHO operation"
- )
- return 0xC000
-
- def handle_find(
- self, event
- ) -> Generator[Tuple[int, Optional[Dataset]], None, None]:
- matches = []
-
- try:
- local_port = event.assoc.acceptor.port
- self.event_collector.collect_session_info(
- {
- session_keys.LOG_LEVEL.key: "Info",
- session_keys.REQUEST_TYPE.key: "C_FIND",
- session_keys.SESSION_MAIN_OPERATION.key: "C_FIND",
- session_keys.LOCAL_PORT.key: local_port,
- }
- )
- sop_class_uid = event.request.AffectedSOPClassUID
- identifier = event.identifier
-
- # Validate the SOPClassUID
- if dicom_util.is_sopclassuid_valid(sop_class_uid):
- self.logger.info("Request dataset has invaild model")
- yield (0xA900, None) # Identifier does not match SOP Class
- return
-
- # Validate Identifier
- if dicom_util.identifier_invalid(identifier):
- self.logger.info("Request dataset has invaild identifier")
- yield (0xC006, None) # Invalid attribute value
- return
-
- dicom_util.filter_identifier_tags(identifier)
- query_level = dicom_util.get_query_level(identifier)
- self.event_collector.collect_session_info(
- {session_keys.QUERY_LEVEL.key: query_level}
- )
-
- # Determine if it's a "all" request
- if dicom_util.all_requested(identifier):
- if query_level == "STUDY":
- matches = self.dicomdb.query_all_studies()
- elif query_level == "SERIES":
-
- # The pynetdicom ORM lacks query/retrieve model on SERIES level, that is why we filter here based on studies and not on series.
- # This add limitition in quering all series otherwise, we used the studyinstanceuid (STUDY model) as an identifier tag to then filter specific serie based on the SeriesInstanceUID tag
-
- matches = self.dicomdb.query_all_studies()
- elif query_level == "PATIENT":
- matches = self.dicomdb.query_all_patients()
- self.event_collector.collect_session_info(
- {
- session_keys.SESSION_PARAMETERS.key: "ALL " + query_level,
- session_keys.MATCHES.key: len(matches),
- },
- True,
- )
- else:
- query_parameters = dicom_util.get_query_parameters(identifier)
- self.event_collector.collect_session_info(
- {session_keys.SESSION_PARAMETERS.key: query_parameters}
- )
- # Hierarchical query level determination
- if dicom_util.is_patient_level(identifier):
- matches = self.dicomdb.query_patient_level(identifier)
- elif dicom_util.is_study_level(identifier):
- matches = self.dicomdb.query_study_level(identifier)
- elif dicom_util.is_series_level(identifier):
- matches = self.dicomdb.query_series_level(identifier)
-
- self.event_collector.collect_session_info(
- {session_keys.MATCHES.key: len(matches)}, True
- )
-
- # Send Matching Results
- for instance in matches:
- response_dataset = Dataset()
- try:
- self.dicomdb.get_response_data(
- identifier, instance, response_dataset
- )
- yield (0xFF00, response_dataset) # Pending response
- except Exception:
- self.exceptions_logger.exception(
- "Exception in building response set"
- )
- yield (0xC001, None)
-
- # Final success response
- yield (0x0000, None)
-
- except Exception:
- self.exceptions_logger.exception("Exception in handling C-FIND operation")
- yield (0xC001, None) # Unable to process
-
- def handle_get(self, event) -> Generator[Tuple[int, Optional[Dataset]], None, None]:
- try:
- local_port = event.assoc.acceptor.port
- assoc = event.assoc
- identifier = event.identifier
-
- if dicom_util.identifier_invalid(identifier):
- yield 0xC000, None
- return
- instances = dicom_util.get_instances()
- matching = []
- query_level = dicom_util.get_query_level(identifier)
- matching = self.get_matching_instances(event, instances)
- self.event_collector.collect_session_info(
- {
- session_keys.QUERY_LEVEL.key: query_level,
- session_keys.LOG_LEVEL.key: "Info",
- session_keys.SESSION_MAIN_OPERATION.key: "C_GET",
- session_keys.REQUEST_TYPE.key: "C_GET",
- session_keys.MATCHES.key: len(matching),
- session_keys.LOCAL_PORT.key: local_port,
- },
- True,
- )
- yield len(matching)
- for instance in matching:
- if event.is_cancelled:
- yield 0xFE00, None
- # Ensure the accepted contexts act as a SCP
- dicom_util.assign_runtime_contexts_support(assoc)
- if dicom_util.file_compressed(instance):
- instance.decompress()
- apply_modality_lut(instance.pixel_array, instance)
- yield 0xFF00, instance
-
- yield 0x0000, None
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while handling C-GET operation"
- )
- yield (0xC001, None)
-
- def handle_store(self, event):
- local_port = event.assoc.acceptor.port
- self.event_collector.collect_session_info(
- {
- session_keys.LOG_LEVEL.key: "Info",
- session_keys.REQUEST_TYPE.key: "C_STORE",
- session_keys.SESSION_MAIN_OPERATION.key: "C_STORE",
- session_keys.LOCAL_PORT.key: local_port,
- },
- True,
- )
- dicom_util.store_received_file(event)
- return 0x0000
-
- def handle_move(
- self, event
- ) -> Generator[Tuple[int, Optional[Dataset]], None, None]:
-
- local_port = event.assoc.acceptor.port
- addr = assoc.requestor.address
- port = assoc.requestor.port
- yield (str(addr), port)
- assoc = event.assoc
- identifier = event.identifier
-
- if dicom_util.identifier_invalid(identifier):
- yield 0xC000, None
- return
- instances = dicom_util.get_instances()
- matching = []
- query_level = dicom_util.get_query_level(identifier)
- matching = self.get_matching_instances(event, instances)
- self.event_collector.collect_session_info(
- {
- session_keys.QUERY_LEVEL.key: query_level,
- session_keys.LOG_LEVEL.key: "Info",
- session_keys.REQUEST_TYPE.key: "C_MOVE",
- session_keys.MATCHES.key: len(matching),
- session_keys.LOCAL_PORT.key: local_port,
- },
- True,
- )
- yield len(matching)
- for instance in matching:
- if event.is_cancelled:
- yield 0xFE00, None
- dicom_util.assign_runtime_contexts_support(assoc)
- if dicom_util.file_compressed(instance):
- instance.decompress()
- apply_modality_lut(instance.pixel_array, instance)
- yield 0xFF00, instance
-
- yield 0x0000, None
-
- def handle_release(self, event):
- local_port = event.assoc.acceptor.port
- self.event_collector.collect_session_info(
- {
- session_keys.LOG_LEVEL.key: "Warning",
- session_keys.REQUEST_TYPE.key: "Association Released",
- session_keys.LOCAL_PORT.key: local_port,
- },
- True,
- )
- self.event_collector.session_ended()
-
- def handle_abort(self, event):
- local_port = event.assoc.acceptor.port
- if event.assoc.requestor.implementation_version_name:
- self.event_collector.collect_session_info(
- {
- session_keys.LOG_LEVEL.key: "Warning",
- session_keys.REQUEST_TYPE.key: "Association Aborted",
- session_keys.VERSION.key: str(
- event.assoc.requestor.implementation_version_name
- ),
- session_keys.LOCAL_PORT.key: local_port,
- },
- True,
- )
- else:
- self.event_collector.collect_session_info(
- {
- session_keys.LOG_LEVEL.key: "Warning",
- session_keys.REQUEST_TYPE.key: "Association Aborted",
- session_keys.LOCAL_PORT.key: local_port,
- },
- True,
- )
-
- self.event_collector.session_ended()
-
- def get_matching_instances(self, event, instances):
- matching = []
-
- if dicom_util.is_study_level(event.identifier):
- if hasattr(event.identifier, "StudyInstanceUID"):
- study_uid = event.identifier.StudyInstanceUID
- self.event_collector.collect_session_info(
- {
- session_keys.SESSION_PARAMETERS.key: "StudyInstanceUID: "
- + str(study_uid)
- }
- )
- matching = [
- instance
- for instance in instances
- if instance.StudyInstanceUID == study_uid
- ]
-
- elif dicom_util.is_series_level(event.identifier):
- if hasattr(event.identifier, "SeriesInstanceUID"):
- series_uid = event.identifier.SeriesInstanceUID
- self.event_collector.collect_session_info(
- {
- session_keys.SESSION_PARAMETERS.key: "SeriesInstanceUID: "
- + str(series_uid)
- }
- )
-
- matching = [
- instance
- for instance in instances
- if instance.SeriesInstanceUID == series_uid
- ]
-
- return matching
diff --git a/dicom_server/core/dicom_session_manager.py b/dicom_server/core/dicom_session_manager.py
deleted file mode 100644
index a8bb9fbe..00000000
--- a/dicom_server/core/dicom_session_manager.py
+++ /dev/null
@@ -1,179 +0,0 @@
-from datetime import datetime
-from dependency_injector.wiring import inject
-from services.redis_service import IRedisService
-from services.dicom_session_service import ISessionCollector
-from services.threat_intelligence_service import IThreatIntelligence
-import time, pytz
-import utilities.dicom_util as dicom_util
-from enums.dicom_session_keys import Sessionkeys as sk
-
-
-class SessionCollector(ISessionCollector):
- @inject
- def __init__(
- self,
- app_logger,
- simp_logger,
- exceptions_logger,
- redis_handler: IRedisService = None,
- threat_intelligence: IThreatIntelligence = None,
- ):
-
- self.session_info = {key.key: key.default for key in sk}
- self.redis_data = {}
- self.redis_handler = redis_handler or IRedisService()
- self.simp_logger = simp_logger
- self.exceptions_logger = exceptions_logger
- self.threat_intelligence = threat_intelligence
- self.logger = app_logger
- self.timezone = pytz.timezone("Europe/Copenhagen")
-
- def session_started(self, ip, port, v_name):
- """
- Starting a new DICOM session
- whenever an association request recieved
-
- """
- try:
-
- if not self.session_locked():
- self.logger.warning(
- f"\033[93mDICOM session started at {datetime.now(self.timezone).strftime('%Y-%m-%dT%H:%M:%S')}\n\033[0mInitializing session info for host: \033[92m{ip}\033[0m port: \033[92m{port}\033[0m"
- )
- self.initialize_session_info(ip, port)
- self.get_session_requestor_reputation(ip)
- self.set_session_lock(1)
- else:
- self.session_info[sk.VERSION.key] = v_name
- self.logger.info(
- f"Requester DICOM client version: \033[92m{v_name}\033[0m"
- )
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while starting a DICOM session"
- )
-
- def get_session_requestor_reputation(self, ip):
- """
- Using the data-access provider "redis_handler" to populate data to redis
-
- """
- try:
- rep_dat = {}
- ip_scanned = self.redis_handler.is_ip_scanned(ip)
- if not ip_scanned:
- rep_dat = self.threat_intelligence.get_reputation_data(ip)
- self.redis_handler.add_reputation_data(rep_dat)
- self.redis_handler.add_scanned_ip(ip)
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while getting session requestor reputation data"
- )
-
- def initialize_session_info(self, ip, port):
- """
- Initializing session information by setting session keys values
-
- """
- try:
- current_time = time.time()
- known_scanner = dicom_util.is_known_scanner(ip)
- self.session_info[sk.KNOWN_SCANNER.key] = known_scanner
- self.session_info[sk.SESSION_MAIN_OPERATION.key] = "Association Requested"
- self.session_info[sk.REQUEST_TYPE.key] = "Association Requested"
- self.session_info[sk.IP.key] = str(ip)
- self.session_info[sk.PORT.key] = port
- self.session_info[sk.LOG_LEVEL.key] = "Warning"
- self.set_session_id(str(int(current_time * 1000)))
- self.collect_session_info({}, True)
- self.logger.info(
- f'Host identified as a \033[92m"Known_scanner"\033'
- if known_scanner
- else 'Host identified as a\033[91m"Non_known_scanner"\033[0m\nHost reputation data can be found on the Redis server or the visualization dashbord'
- )
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while initializing DICOM session"
- )
-
- def collect_session_info(self, params, sub_process_finished=False):
- """
- Collecting session information through the dicom_handlers provider
- If sub_process_finished is True means a dicom request in this session is elapsed then we log a simplified message
-
- """
- try:
- for key, value in params.items():
- self.session_info[key] = value
- if sub_process_finished:
-
- current_time = datetime.now(self.timezone).strftime(
- "%Y-%m-%dT%H:%M:%S.%f"
- )
- self.session_info[sk.TIMESTAMP.key] = str(current_time)
- self.simp_logger.info(self.session_info)
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while collecting DICOM session information"
- )
-
- def session_ended(self):
- """
- push session data to Redis and reset the session information object
-
- """
- try:
-
- self.redis_handler.add_request_data(self.build_redis_object())
- self.logger.info(
- f'Main operation:\033[92m"{self.session_info[sk.SESSION_MAIN_OPERATION.key]}" \033[0m Status:\033[92m"{self.session_info[sk.STATUS.key]}"\033[0m'
- )
- self.logger.warning(
- f"\033[93mDICOM session ended at {datetime.now(self.timezone).strftime('%Y-%m-%dT%H:%M:%S')}\n\033[0m"
- )
- self.reset_session()
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while ending a DICOM session"
- )
-
- def reset_session(self):
- self.session_info = {key.key: key.default for key in sk}
-
- def build_redis_object(self):
- """
- build a Redis object and filtering the not log-stash relevant keys
-
- """
-
- try:
- self.session_info[sk.STATUS.key] = (
- "Finished"
- if self.session_info[sk.REQUEST_TYPE.key] == "Association Released"
- else "Aborted"
- )
- redis_object = self.session_info.copy()
- redis_object[sk.REQUEST_TYPE.key] = self.session_info[
- sk.SESSION_MAIN_OPERATION.key
- ]
- keys_to_remove = {sk.LOCK.key, sk.SESSION_MAIN_OPERATION.key}
- for key in keys_to_remove:
- redis_object.pop(key, None)
- js_redis = dicom_util.format_log_entry(str(redis_object))
- self.logger.debug(f"Redis object formatted: {js_redis}")
- return js_redis
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while building Redis object"
- )
-
- def set_session_lock(self, value):
- self.session_info[sk.LOCK.key] = value
-
- def session_locked(self):
-
- return self.session_info[sk.LOCK.key] == 1
-
- def set_session_id(self, s_id):
- self.session_info[sk.SESSION_ID.key] = s_id
-
\ No newline at end of file
diff --git a/dicom_server/core/dicomdb.py b/dicom_server/core/dicomdb.py
deleted file mode 100644
index 988f2917..00000000
--- a/dicom_server/core/dicomdb.py
+++ /dev/null
@@ -1,294 +0,0 @@
-import os, sys
-
-sys.path.append(os.path.abspath("pydicom_and_pynetdicom_libs"))
-from pydicom import dcmread
-from sqlalchemy import String, delete
-import db
-from sqlalchemy import cast, String
-from contextlib import contextmanager
-from services.dicom_database_service import IDicomDatabase
-
-
-class DicomDatabase(IDicomDatabase):
-
- def __init__(self, app_logger, exceptions_logger, storagedirectory, session):
- try:
- self.session = session
- self.storagedirectory = storagedirectory
- self.exceptions_logger = exceptions_logger
- self.logger = app_logger
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while building DICOMDatabase instance."
- )
-
- @contextmanager
- def session_scope(self):
- try:
- yield self.session
- self.session.commit()
- except Exception:
- self.session.rollback()
- self.logger.debug(f"Session rollback!")
-
- def initialize_database(self):
- try:
- self.delete_database()
- self.fill_database_tables_from_dicom_files()
- self.logger.info("Database initialized from DICOM storage")
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while initializing the database from dicom files"
- )
-
- def fill_database_tables_from_dicom_files(self):
- with self.session_scope() as session:
- try:
- for path in os.listdir(self.storagedirectory):
- instance = dcmread(os.path.join(self.storagedirectory, path))
- db.add_instance(instance, session, path)
- session.commit()
- except Exception:
- session.rollback()
- self.exceptions_logger.exception("Exception filling database")
-
- def delete_database(self):
- with self.session_scope() as session:
- try:
- delete_statement = delete(db.Instance)
- session.execute(delete_statement)
- session.commit()
- self.logger.info("Database cleared")
- except Exception:
- session.rollback()
- self.exceptions_logger.exception("Exception clearing database")
-
- def query_all_studies(self):
-
- all_studies = []
- try:
- with self.session_scope() as session:
- studyQuery = session.query(db.Study)
- all_studies = studyQuery.all()
- return all_studies
- except Exception:
- self.exceptions_logger.exception("Exception querying all studies")
-
- def query_all_series(self):
- all_studies = []
- try:
- with self.session_scope() as session:
- studyQuery = session.query(db.Series)
- all_studies = studyQuery.all()
- return all_studies
- except Exception:
- self.exceptions_logger.exception("Exception querying all series")
-
- def query_all_patients(self):
- all_patients = []
- try:
- with self.session_scope() as session:
- studyQuery = session.query(db.Patient)
- all_patients = studyQuery.all()
- return all_patients
- except Exception:
- self.exceptions_logger.exception("Exception querying all patients")
-
- def query_study_level(self, identifier):
- matches = []
- with self.session_scope() as session:
- try:
- matchedInstances = db.search(
- "1.2.840.10008.5.1.4.1.2.2.1", identifier, session
- )
-
- unique_studies = self.get_unique_studies(matchedInstances)
- studyQuery = session.query(db.Study)
- studyQuery = studyQuery.filter(
- db.Study.study_instance_uid.in_(unique_studies)
- )
- self.logger.debug("Querying studies from the database")
- matches = studyQuery.all()
- return matches
- except Exception:
- self.exceptions_logger.exception("Exception in STUDY level query")
-
- def query_series_level(self, identifier):
-
- matched_studies = []
- with self.session_scope() as session:
- try:
- matchedInstances = db.search(
- "1.2.840.10008.5.1.4.1.2.2.1", identifier, session
- )
- uniqueSeries = self.get_uniqueSeries(matchedInstances, identifier)
- seriesQuery = session.query(db.Series)
- seriesQuery = seriesQuery.filter(
- db.Series.series_instance_uid.in_(uniqueSeries)
- )
- matched_studies = seriesQuery.all()
- return matched_studies
- except Exception:
- self.exceptions_logger.exception("Exception in SERIES level query")
-
- def query_patient_level(self, identifier):
- matches = []
- with self.session_scope() as session:
- try:
- matchedInstances = db.search(
- "1.2.840.10008.5.1.4.1.2.1.1", identifier, session
- )
- uniquePatients = self.get_unique_patients(matchedInstances)
- patientQuery = session.query(db.Patient)
- patientQuery = patientQuery.filter(
- db.Patient.patient_id.in_(uniquePatients)
- )
- matches = patientQuery.all()
- return matches
- except Exception:
- self.exceptions_logger.exception("Exception in PATIENT level query")
-
- def get_response_data(self, identifier, instance, response_dataset):
-
- if identifier.QueryRetrieveLevel == "STUDY":
- self.get_studyRoot_dataset(instance, response_dataset)
- elif identifier.QueryRetrieveLevel == "SERIES":
- self.get_seriesRoot_dataset(identifier, instance, response_dataset)
- elif identifier.QueryRetrieveLevel == "PATIENT":
- self.get_patientRoot_dataset(identifier, instance, response_dataset)
-
- def get_patientRoot_dataset(self, identifier, instance, response_dataset):
-
- response_dataset.PatientID = getattr(instance, "patient_id")
- response_dataset.PatientName = getattr(instance, "patient_name")
-
- def get_seriesRoot_dataset(self, identifier, instance, response_dataset):
- try:
- if len(identifier) == 1:
-
- response_dataset.Modality = self.get_other_levels_tags(
- "STUDY", "modality", getattr(instance, "study_instance_uid")
- )
- response_dataset.SeriesInstanceUID = self.get_other_levels_tags(
- "STUDY",
- "series_instance_uid",
- getattr(instance, "study_instance_uid"),
- )
- response_dataset.SeriesNumber = self.get_other_levels_tags(
- "STUDY", "series_number", getattr(instance, "study_instance_uid")
- )
- else:
- response_dataset.Modality = getattr(instance, "modality")
- response_dataset.SeriesInstanceUID = getattr(
- instance, "series_instance_uid"
- )
- response_dataset.SeriesNumber = getattr(instance, "series_number")
- response_dataset.PatientName = self.get_other_levels_tags(
- "SERIES", "patient_name", getattr(instance, "series_instance_uid")
- )
- response_dataset.PatientID = self.get_other_levels_tags(
- "SERIES", "patient_id", getattr(instance, "series_instance_uid")
- )
- response_dataset.NumberOfSeriesRelatedInstances = (
- self.get_other_levels_tags(
- "SERIES",
- "NumberOfSeriesRelatedInstances",
- getattr(instance, "series_instance_uid"),
- )
- )
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while getting series data sets"
- )
-
- def get_studyRoot_dataset(self, instance, response_dataset):
-
- direct_attributes = {
- "StudyInstanceUID": "study_instance_uid",
- "StudyDate": "study_date",
- "StudyTime": "study_time",
- "AccessionNumber": "accession_number",
- "StudyID": "study_id",
- }
-
- other_level_attributes = {
- "InstitutionName": "institution_name",
- "PatientBirthDate": "birth_date",
- "PatientSex": "patient_sex",
- "PatientName": "patient_name",
- "PatientID": "patient_id",
- "NumberOfStudyRelatedInstances": "NumberOfStudyRelatedInstances",
- "ModalitiesInStudy": "modality",
- }
-
- for response_attr, instance_attr in direct_attributes.items():
- setattr(response_dataset, response_attr, getattr(instance, instance_attr))
-
- study_instance_uid = getattr(instance, "study_instance_uid")
- for response_attr, tag in other_level_attributes.items():
- value = self.get_other_levels_tags("STUDY", tag, study_instance_uid)
- setattr(response_dataset, response_attr, value)
-
- def get_other_levels_tags(self, level, required_tag, query_identifier):
-
- with self.session_scope() as session:
- query = session.query(db.Instance)
-
- if level == "STUDY":
-
- query = query.filter(
- db.Instance.study_instance_uid == cast(query_identifier, String)
- )
-
- if required_tag == "NumberOfStudyRelatedInstances":
- return query.count()
-
- else:
- result = query.first()
- if result:
- return getattr(result, required_tag)
- elif level == "SERIES":
- query = query.filter(
- db.Instance.series_instance_uid == cast(query_identifier, String)
- )
- if required_tag == "NumberOfSeriesRelatedInstances":
- return query.count()
- result = query.first()
- if result:
- return getattr(result, required_tag)
- elif level == "PATIENT":
- query = query.filter(
- db.Instance.study_instance_uid == cast(query_identifier, String)
- )
- result = query.first()
- if result:
- return getattr(result, required_tag)
- return None
-
- def get_unique_studies(self, li):
- unique_st = []
- for a in li:
- sUID = getattr(a, "study_instance_uid")
- if sUID not in unique_st:
- unique_st.append(sUID)
- return unique_st
-
- def get_uniqueSeries(self, li, identifier):
- unique_st = []
- for a in li:
- serieUID = getattr(a, "series_instance_uid")
- studyUID = getattr(a, "study_instance_uid")
- if serieUID not in unique_st and studyUID == identifier.StudyInstanceUID:
- unique_st.append(serieUID)
-
- return unique_st
-
- def get_unique_patients(self, li):
- unique_st = []
- for a in li:
- sUID = getattr(a, "patient_id")
- if sUID not in unique_st:
- unique_st.append(sUID)
- # print("MatchedInstancesPatient",unique_st)
-
- return unique_st
diff --git a/dicom_server/core/loggers.py b/dicom_server/core/loggers.py
deleted file mode 100644
index bdb87a9e..00000000
--- a/dicom_server/core/loggers.py
+++ /dev/null
@@ -1,156 +0,0 @@
-import os, logging, json, sys
-from datetime import datetime
-from services.loggers_service import ILoggers
-import traceback
-
-
-class SimplifiedLogsFormatter(logging.Formatter):
- def __init__(self, is_production):
- super().__init__(style="%")
- self.is_production = is_production
-
- def format(self, record):
- msg = str(record.msg)
-
- log_object = json.loads(
- msg.replace("'", '"').replace("False", "false").replace("True", "true")
- )
-
- keys_to_remove = {"lock", "main_operation", "known_scanner", "status"}
- for key in keys_to_remove:
- log_object.pop(key, None)
- if (
- log_object["request_type"] == "Association Aborted"
- or log_object["request_type"] == "Association Released"
- ):
- # Remove none subprocess info
- log_object["session_parameters"] = "N/A"
- log_object["query_level"] = "N/A"
- log_object["matches"] = "N/A"
-
- return json.dumps(log_object, default=str)
-
-
-class ExceptionFormatter(logging.Formatter):
- def __init__(self, is_production, app_logger):
- super().__init__(style="%")
- self.is_production = is_production
- self.logger = app_logger
-
- def format(self, record):
-
- excep = (
- "Exception at "
- + datetime.now().strftime("%d-%m-%Y : %H-%M-%S")
- + "\n.............................................\n"
- )
- trace = ""
-
- if record.exc_info:
- trace = "".join(traceback.format_exception(*record.exc_info))
-
- tb = record.exc_info[2]
- while tb.tb_next:
- tb = tb.tb_next
- frame = tb.tb_frame
- excep += "In " + frame.f_globals["__name__"] + "\n"
-
- self.logger.error(
- "Exception in "
- + frame.f_globals["__name__"]
- + "\n"
- + "Message: "
- + record.msg
- + "\nSee\033[91m exceptions.log \033[0m file for more details\n.......................................\n"
- )
-
- excep += (
- "Message: "
- + str(record.msg)
- + "\n"
- + "Traceback :\n ............\n"
- + trace
- )
- return excep
-
-
-class Loggers(ILoggers):
-
- def __init__(
- self,
- is_production,
- main_logger_directory,
- simplified_log_directory,
- exception_log_directory,
- ):
-
- self.is_production = is_production
- self.app_logger = self.setup_logger("app_logger", None)
- self.main_logger = self.setup_logger(
- "pynetdicom", main_logger_directory, logging.DEBUG, None
- )
- self.simplified_logger = self.setup_logger(
- "simplified_logger",
- simplified_log_directory,
- logging.INFO,
- SimplifiedLogsFormatter(is_production),
- )
- self.exceptions_logger = self.setup_logger(
- "exceptions",
- exception_log_directory,
- logging.ERROR,
- ExceptionFormatter(is_production, self.app_logger),
- )
-
- def setup_logger(
- self,
- name,
- log_directory,
- level=logging.INFO,
- formatter=None,
- ):
- if name != "app_logger":
- if log_directory:
- os.makedirs(log_directory, exist_ok=True)
-
- file_basename = "dicom_raw" if name == "pynetdicom" else name
- handler = logging.FileHandler(
- os.path.join(log_directory, file_basename + ".log")
- )
- handler.setFormatter(formatter)
- stream_handler = logging.StreamHandler(stream=sys.stdout)
- logger = logging.getLogger(name)
- logger.setLevel(level)
- if not self.is_production:
- logger.addHandler(stream_handler)
- logger.addHandler(handler)
- self.app_logger.debug(f'Logger: {name} initialized at "{log_directory}"')
- return logger
- else:
- logger = logging.getLogger("app_logger")
- handler = logging.StreamHandler(sys.stdout)
- if self.is_production:
- logger.setLevel(logging.INFO)
- handler.setLevel(logging.INFO)
- else:
- logger.setLevel(logging.DEBUG)
- handler.setLevel(logging.DEBUG)
- formatter = logging.Formatter("%(levelname)s - %(message)s")
- handler.setFormatter(formatter)
- handler.addFilter(self.add_color)
- logger.addHandler(handler)
- return logger
-
- def add_color(self, record):
- colors = {
- "DEBUG": "\033[94m", # Blue
- "INFO": "\033[92m", # Green
- "WARNING": "\033[93m", # Yellow
- "ERROR": "\033[91m", # Red
- "CRITICAL": "\033[1;91m", # Bold Red
- }
- reset = "\033[0m"
- levelname = record.levelname
- if levelname in colors:
- record.levelname = colors[levelname] + levelname + reset
- return True
diff --git a/dicom_server/core/redis_handler.py b/dicom_server/core/redis_handler.py
deleted file mode 100644
index fcad7900..00000000
--- a/dicom_server/core/redis_handler.py
+++ /dev/null
@@ -1,90 +0,0 @@
-import json
-from services.redis_service import IRedisService
-
-
-class RedisClient(IRedisService):
-
- def __init__(self, app_logger, exceptions_logger, redis_client):
-
- self.redis_client = redis_client
- self.exceptions_logger = exceptions_logger
- self.logger = app_logger
-
- def is_ip_scanned(self, ip):
- try:
- return ip.encode() in self.redis_client.lrange("scannedIPs", 0, -1)
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while retrieving IPs list from Redis"
- )
-
- def add_scanned_ip(self, ip):
- try:
- self.redis_client.rpush("scannedIPs", ip)
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while adding a scanned IP to the scanned list"
- )
-
- def add_reputation_data(self, rep_dat):
- try:
- self.redis_client.rpush("reputation", json.dumps(rep_dat))
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while pushing repution object"
- )
-
- def add_request_data(self, redis_log_data):
- try:
- self.redis_client.rpush("requests", redis_log_data)
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while adding a request information to Redis"
- )
-
- def get_TCI_existing_studies(
- self,
- ):
- try:
- return set(self.redis_client.lrange("TCIA_studies", 0, -1))
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while checking TCIA studies"
- )
-
- def add_TCI_study(self, study_uid):
- try:
- self.redis_client.rpush("TCIA_studies", study_uid)
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while adding a TCIA studyInstanceUID"
- )
-
- def add_injected_file(self, patient_name, modality):
- try:
- self.redis_client.rpush(
- "injected_files",
- str({"patient_name": patient_name, "modality": modality}),
- )
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while adding injected file identifiers to redis"
- )
-
- def get_honey_url(
- self,
- ):
- try:
- self.redis_client.get("webhook")
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while getting webhook key"
- )
-
- def update_files_integrity_state(self, changed_files):
- try:
- self.redis_client.rpush("fileChange", json.dumps(changed_files))
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while adding integrity check identifier"
- )
diff --git a/dicom_server/core/threat_intelligence_handler.py b/dicom_server/core/threat_intelligence_handler.py
deleted file mode 100644
index d29cbae8..00000000
--- a/dicom_server/core/threat_intelligence_handler.py
+++ /dev/null
@@ -1,120 +0,0 @@
-import requests
-from datetime import datetime
-from services.threat_intelligence_service import IThreatIntelligence
-
-
-class ThreatIntelligence(IThreatIntelligence):
- def __init__(
- self,
- app_logger,
- exceptions_logger,
- abuse_ip_api_key,
- ip_quality_score_api_key,
- virus_total_api_key,
- ):
- self.abuse_ip_api_key = abuse_ip_api_key
- self.ip_quality_score_api_key = ip_quality_score_api_key
- self.virus_total_api_key = virus_total_api_key
- self.exceptions_logger = exceptions_logger
- self.logger = app_logger
-
- # Get IP security score from ABUSEIPDB
-
- def getIPSecurityScore(self, ip):
-
- api_key = self.abuse_ip_api_key
- url = "https://api.abuseipdb.com/api/v2/check"
- headers = {"Accept": "application/json", "Key": api_key}
- params = {"ipAddress": ip, "maxAgeInDays": 90}
-
- try:
- response = requests.get(url, headers=headers, params=params)
- if response.status_code == 200:
- data = response.json()["data"]
- country = data.get("countryCode", "N/A")
- isp = data.get("isp", "N/A")
- abuseIPConfidenceScore = data["abuseConfidenceScore"]
- return [isp, abuseIPConfidenceScore, country]
- else:
- self.exceptions_logger.exception(
- f" {response.status_code} - {response.json().get('errors', [{'detail': 'Unknown error'}])[0]['detail']}"
- )
- except Exception:
- self.exceptions_logger.exception(
- f'Unexpected error while getting IP security score from "abuseipdb.com"'
- )
-
- # Get IP security score from IPQUALITYSCORE
-
- def getIpqualityScore(self, ip):
- try:
- api_key = self.ip_quality_score_api_key
- url = f"https://ipqualityscore.com/api/json/ip/{api_key}/{ip}"
- response = requests.get(url)
- if response.status_code == 200:
- data = response.json()
- return [
- data.get("fraud_score", "N/A"),
- data.get("proxy", "N/A"),
- data.get("city", "N/A"),
- data.get("bot_status", "N/A"),
- data.get("vpn", "N/A"),
- data.get("latitude", "N/A"),
- data.get("longitude", "N/A"),
- ]
- return {"service": "IPQualityScore", "error": response.text}
- except Exception:
- self.exceptions_logger.exception(
- f'Unexpected error while getting IP quality score from "ipqualityscore.com"'
- )
-
- # Get IP security score from VIRUSTOTAL
-
- def getVirusTotalScore(self, ip):
- try:
- url = f"https://www.virustotal.com/api/v3/ip_addresses/{ip}"
- headers = {"x-apikey": self.virus_total_api_key}
- response = requests.get(url, headers=headers)
- if response.status_code == 200:
- data = response.json()["data"]
- # print(data)
- result_counts = {}
-
- for analysis in data["attributes"]["last_analysis_results"].values():
- result = analysis["result"]
- result_counts[result] = result_counts.get(result, 0) + 1
- return result_counts
- except Exception:
- self.exceptions_logger.exception(
- f'Unexpected error while getting IP information from "virustotal.com"'
- )
-
- # Build reputation object
-
- def get_reputation_data(self, ip):
-
- current_time = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S")
- abusedb = self.getIPSecurityScore(ip)
- abusedb_object = abusedb if abusedb else ["", "", ""]
- ip_quality = self.getIpqualityScore(ip)
- ip_quality_score = ip_quality if ip_quality else ["", "", "", "", "", "", ""]
-
- vt = self.getVirusTotalScore(ip)
- virus_total = vt if vt else {}
- try:
- rep_dat = {}
- rep_dat["timestamp"] = str(current_time)
- rep_dat["virus_total_results"] = virus_total
- rep_dat["ip"] = ip
- rep_dat["ip_quality_score"] = ip_quality_score[0]
- rep_dat["proxy"] = ip_quality_score[1]
- rep_dat["region"] = ip_quality_score[2]
- rep_dat["vpn"] = ip_quality_score[4]
- rep_dat["country"] = abusedb_object[2]
- rep_dat["ISP"] = abusedb_object[0]
- rep_dat["AbuseDBScore"] = abusedb_object[1]
- return rep_dat
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while building IP reputation object"
- )
diff --git a/dicom_server/custom_units/integrity_checker.py b/dicom_server/custom_units/integrity_checker.py
deleted file mode 100644
index 86c38511..00000000
--- a/dicom_server/custom_units/integrity_checker.py
+++ /dev/null
@@ -1,93 +0,0 @@
-import os, hashlib, threading, json, schedule, time, logging
-from dependency_injector.wiring import inject
-from services.redis_service import IRedisService
-from services.integrity_checker_service import IIntegrityChecker
-
-
-class FilesChecker(threading.Thread, IIntegrityChecker):
- @inject
- def __init__(
- self,
- app_logger,
- exceptions_logger,
- storage_directory,
- hash_store_path,
- redis_handler: IRedisService = None,
- ):
-
- super().__init__(daemon=True)
- self.storage_directory = storage_directory
- self.hash_store_path = hash_store_path
- # self.event= event
- self.redis_handler = redis_handler or IRedisService()
- self.exceptions_logger = exceptions_logger
- self.logger = app_logger
- self.start()
-
- def run(self):
- try:
- schedule.every(6).hours.do(self.check_hashes)
- self.logger.info("Checking files integrity each 6 hours")
- except Exception:
- self.exceptions_logger.exception(
- "Unable to schedule files integrity cheack"
- )
- while True:
- schedule.run_pending()
- time.sleep(10300)
-
- def hash_file(self, filename):
- hash_sha256 = hashlib.sha256()
- try:
- with open(filename, "rb") as f:
- for chunk in iter(lambda: f.read(4096), b""):
- hash_sha256.update(chunk)
- except Exception:
- self.exceptions_logger.exception(
- f"Unexpected error while generating hash value for file {filename}"
- )
- return None
- return hash_sha256.hexdigest()
-
- def check_hashes(self):
-
- self.logger.debug("Checking files integrity")
- new_hashes = {}
- changed_files = []
- try:
- with open(self.hash_store_path, "r") as f:
- old_hashes = json.load(f)
- except FileNotFoundError:
- self.exceptions_logger.exception(
- "Unexpected error while retrieving hashes from the hash storage file "
- )
- old_hashes = {}
-
- for path in os.listdir(self.storage_directory):
- full_path = os.path.join(self.storage_directory, path)
- try:
- file_hash = self.hash_file(full_path)
- if file_hash:
- new_hashes[path] = file_hash
- if path in old_hashes and old_hashes[path] != file_hash:
- changed_files.append(path)
-
- except Exception:
- self.exceptions_logger.exception(
- f"Unexpected error while proccessing hashes in {full_path}"
- )
-
- with open(self.hash_store_path, "w") as f:
- json.dump(new_hashes, f)
-
- if changed_files:
- try:
- self.redis_handler.update_files_integrity_state(changed_files)
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while populating file integrity checks to Redis"
- )
- self.logger.debug("Changed files:", changed_files)
- else:
-
- self.logger.debug("No changes detected.")
diff --git a/dicom_server/custom_units/network_manager.py b/dicom_server/custom_units/network_manager.py
deleted file mode 100644
index 4cf8c081..00000000
--- a/dicom_server/custom_units/network_manager.py
+++ /dev/null
@@ -1,122 +0,0 @@
-import subprocess
-from services.blackhole_service import IBlackhole
-
-
-class Blackhole(IBlackhole):
-
- def __init__(
- self, app_logger, exceptions_logger, mass_scanners_blocked, blackhole_file_path
- ):
- self.blackhole_file_path = blackhole_file_path
- try:
- self.logger = app_logger
- if mass_scanners_blocked:
- self.block_scanners(self.blackhole_file_path, "known_scanners")
- else:
- if self.is_scanners_blocked("known_scanners"):
- self.allow_scanners("known_scanners")
- self.exceptions_logger = exceptions_logger
- except Exception as e:
- pass
-
- def is_scanners_blocked(self, known_scanners):
- """
-
- Check if the ipset known_scanners exists
-
- """
-
- try:
- result = subprocess.run(
- ["ipset", "list", known_scanners],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- text=True,
- )
- return result.returncode == 0
- except FileNotFoundError:
- self.exceptions_logger.exception(
- "ipset command not found. Make sure ipset is installed."
- )
- return False
-
- def get_known_scanners(self, scanners_file):
- """
-
- Get the known scanners list
-
- """
- knownScanners = []
- try:
- with open(scanners_file, "r") as file:
- for line in file:
- line = line.strip()
- if line and not line.startswith("#"):
- ip_address = line.split("#")[0].strip()
- knownScanners.append(ip_address)
- except Exception as e:
- self.exceptions_logger.exception(f"Error reading file: {e}")
- return knownScanners
-
- def create_ipset(self, ipset_name):
- """
-
- Create an ipset on the kernal
-
- """
- try:
- subprocess.run(
- f" ipset create {ipset_name} hash:ip", shell=True, check=True
- )
- self.logger.debug(f"IP set '{ipset_name}' created.")
- except subprocess.CalledProcessError as e:
- self.exceptions_logger.exception(f"Failed to create IP set: {e}")
-
- def add_ip_to_ipset(self, ipset_name, ip_address):
- try:
- subprocess.run(
- f" ipset add {ipset_name} {ip_address}", shell=True, check=True
- )
- self.logger.debug(
- f"IP address {ip_address} added to IP set '{ipset_name}'."
- )
- except subprocess.CalledProcessError as e:
- self.exceptions_logger.exception(
- f"Failed to add IP {ip_address} to IP set: {e}"
- )
-
- def setup_iptables_rule(self, ipset_name):
- try:
- subprocess.run(
- f" iptables -I INPUT -m set --match-set {ipset_name} src -j DROP",
- shell=True,
- check=True,
- )
- self.logger.debug(f"iptables rule added for IP set '{ipset_name}'.")
- except subprocess.CalledProcessError as e:
- self.exceptions_logger.exception(f"Failed to add iptables rule: {e}")
-
- """Null-route the known scanners IPs"""
-
- def block_scanners(self, source_list, set_name):
- try:
- self.create_ipset(set_name)
- for ip in self.get_known_scanners(source_list):
- self.add_ip_to_ipset(set_name, ip)
-
- self.setup_iptables_rule(set_name)
- except Exception as e:
- self.exceptions_logger.exception(
- "Unexpected error while blocking mass scanners", e
- )
-
- """Allow known scanners to interact with the server"""
-
- def allow_scanners(self, set_name):
- subprocess.run(
- f" iptables -D INPUT -m set --match-set {set_name} src -j DROP",
- shell=True,
- check=True,
- )
-
- subprocess.run(" ipset destroy {set_name}", shell=True, check=True)
diff --git a/dicom_server/custom_units/osm_institutions.py b/dicom_server/custom_units/osm_institutions.py
deleted file mode 100644
index e5ec2fb9..00000000
--- a/dicom_server/custom_units/osm_institutions.py
+++ /dev/null
@@ -1,219 +0,0 @@
-"""
-This module provides functionality to fetch real medical institutions from OpenStreetMap
-and cache them for optimal performance.
-"""
-
-import json
-import os
-import random
-from datetime import datetime, timedelta
-from typing import List, Dict, Optional
-import overpy
-from services.osm_service import IOSMService
-import config
-
-
-class OSMInstitutionsService(IOSMService):
- """
- Service to fetch and manage medical institutions from OpenStreetMap.
-
- """
-
- def __init__(self, app_logger, exceptions_logger):
- self.logger = app_logger
- self.exceptions_logger = exceptions_logger
- self.api = overpy.Overpass()
- self.cache_file = config.OSM_CACHE_FILE
- self.cache_duration_hours = config.OSM_CACHE_DURATION
- self.max_institutions = config.OSM_MAX_INSTITUTIONS
- self.timeout = config.OSM_TIMEOUT
- self.country = config.OSM_COUNTRY
- self.city = config.OSM_CITY
- self.fallback_institutions = config.OSM_FALLBACK_INSTITUTIONS
- self.enabled = config.OSM_ENABLED
-
- # Medical facility tags for OSM queries
- self.medical_tags = ['amenity=hospital', 'healthcare=hospital']
-
- # Ensure cache directory exists
- os.makedirs(os.path.dirname(self.cache_file), exist_ok=True)
-
- def get_medical_institutions(self) -> List[str]:
- try:
- if not self.enabled:
- self.logger.info("OSM is disabled, using fallback institutions")
- return self.fallback_institutions
-
- # Try to get from cache first
- if self.is_cache_valid():
- institutions = self._load_from_cache()
- if institutions:
- self.logger.debug(f"Loaded {len(institutions)} institutions from cache")
- return institutions
-
- self.logger.info("Cache invalid or empty, fetching institutions from OSM")
- institutions = self._fetch_from_osm()
-
- if institutions:
- self._save_to_cache(institutions)
- self.logger.info(f"Successfully fetched {len(institutions)} institutions from OSM")
- return institutions
- else:
- self.logger.warning("No institutions found from OSM, using fallback")
- self._save_to_cache(self.fallback_institutions)
- return self.fallback_institutions
-
- except Exception as e:
- self.exceptions_logger.exception("Error getting medical institutions")
- self.logger.warning("Failed to get institutions from OSM, using fallback")
- self._save_to_cache(self.fallback_institutions)
- return self.fallback_institutions
-
- def refresh_cache(self) -> bool:
- try:
- self.logger.info("Force refreshing OSM institutions cache")
- institutions = self._fetch_from_osm()
-
- if institutions:
- self._save_to_cache(institutions)
- self.logger.info(f"Cache refreshed with {len(institutions)} institutions")
- return True
- else:
- self.logger.warning("Failed to refresh cache - no institutions found")
- return False
-
- except Exception as e:
- self.exceptions_logger.exception("Error refreshing OSM cache")
- return False
-
- def is_cache_valid(self) -> bool:
- """
- Check if the current cache is still valid.
- """
- try:
- if not os.path.exists(self.cache_file):
- return False
-
- with open(self.cache_file, 'r', encoding='utf-8') as f:
- cache_data = json.load(f)
-
- cache_time = datetime.fromisoformat(cache_data.get('timestamp', ''))
- expiry_time = cache_time + timedelta(hours=self.cache_duration_hours)
-
- return datetime.now() < expiry_time
-
- except Exception as e:
- self.exceptions_logger.exception("Error checking cache validity")
- return False
-
- def _fetch_from_osm(self) -> List[str]:
- try:
- query = self._build_osm_query()
- self.logger.debug(f"OSM Query: {query}")
-
- result = self.api.query(query)
-
- institutions = []
-
- # Process both nodes and ways
- for element in list(result.nodes) + list(result.ways):
- name = self._extract_institution_name(element.tags)
- if name:
- institutions.append(name)
-
- # Remove duplicates and limit results
- institutions = list(set(institutions))[:self.max_institutions]
-
- self.logger.info(f"Found {len(institutions)} medical institutions from OSM")
- return institutions
-
- except Exception as e:
- self.exceptions_logger.exception("Error fetching from OSM")
- raise
-
- def _build_osm_query(self) -> str:
- medical_queries = []
- for tag in self.medical_tags:
- key, value = tag.split('=')
- medical_queries.extend([
- f'node[{key}={value}](area);',
- f'way[{key}={value}](area);'
- ])
-
- medical_query_str = '\n '.join(medical_queries)
-
- # Build area query based on configuration
- if self.city and self.country:
- area_query = f"""(
- area["name"="{self.city}"]["place"~"^(city|town)$"];
- area["name:en"="{self.city}"]["admin_level"~"^(4|5|6|7|8)$"];
-) -> .area;"""
- elif self.city:
- area_query = f"""(
- area["name"="{self.city}"]["place"~"^(city|town)$"];
- area["name:en"="{self.city}"]["admin_level"];
-) -> .area;"""
- else:
- area_query = f'area["ISO3166-1"="{self.country}"]["admin_level"="2"] -> .area;'
-
- return f"""[out:json][timeout:{self.timeout}];
-{area_query}
-(
- {medical_query_str}
-);
-out tags;"""
-
- def _extract_institution_name(self, tags: Dict) -> Optional[str]:
- name_keys = ['name', 'name:en', 'official_name', 'alt_name', 'brand']
-
- for key in name_keys:
- if key in tags and tags[key].strip():
- name = tags[key].strip()
-
- if self._is_valid_institution_name(name):
- return name.title()
-
- return None
-
- def _is_valid_institution_name(self, name: str) -> bool:
- if not name or len(name) < 3 or len(name) > 100:
- return False
-
- skip_terms = ['pharmacy', 'apotek', 'dentist', 'tandlæge', 'veterinary', 'dyrlæge']
- name_lower = name.lower()
- return not any(term in name_lower for term in skip_terms)
-
- def _load_from_cache(self) -> List[str]:
- try:
- with open(self.cache_file, 'r', encoding='utf-8') as f:
- cache_data = json.load(f)
- return cache_data.get('institutions', [])
- except Exception as e:
- self.exceptions_logger.exception("Error loading from cache")
- return []
-
- def _save_to_cache(self, institutions: List[str]) -> None:
- try:
- cache_data = {
- 'timestamp': datetime.now().isoformat(),
- 'institutions': institutions
- }
-
- with open(self.cache_file, 'w', encoding='utf-8') as f:
- json.dump(cache_data, f, indent=2, ensure_ascii=False)
-
- self.logger.debug(f"Saved {len(institutions)} institutions to cache")
-
- except Exception as e:
- self.exceptions_logger.exception("Error saving to cache")
-
-
-def get_random_institution(osm_service: Optional[OSMInstitutionsService] = None) -> str:
- if osm_service and config.OSM_ENABLED:
- try:
- institutions = osm_service.get_medical_institutions()
- return random.choice(institutions)
- except Exception:
- pass
-
- return random.choice(config.OSM_FALLBACK_INSTITUTIONS)
\ No newline at end of file
diff --git a/dicom_server/custom_units/tcia_management.py b/dicom_server/custom_units/tcia_management.py
deleted file mode 100644
index 714be57c..00000000
--- a/dicom_server/custom_units/tcia_management.py
+++ /dev/null
@@ -1,404 +0,0 @@
-import threading
-from pydicom import uid
-import schedule, requests
-import json
-import utilities.tcia_util as tcia_util
-import utilities.tcia_fallback as tcia_fallback
-from services.redis_service import IRedisService
-from services.dicom_database_service import IDicomDatabase
-from services.tci_services import ITCIAAPI
-from services.tci_services import ITCIAScheduler
-from services.tci_services import ITCIAManager
-from services.osm_service import IOSMService
-from dependency_injector.wiring import inject
-import logging
-import time
-
-
-class TCIAScheduler(threading.Thread, ITCIAScheduler):
-
- @inject
- def __init__(
- self,
- app_logger,
- exceptions_logger,
- period,
- period_unit,
- tcia_manager: ITCIAManager = None,
- ):
- super().__init__(daemon=True)
- self.period = period
- self.period_unit = period_unit
- self.exceptions_logger = exceptions_logger
- self.tcia_manager = tcia_manager or ITCIAManager()
- self.logger = app_logger
- self.start()
-
- def run(self):
- self.schedule_files_retrieval()
- self.logger.info(
- f"TCIA retrieving schedule is started, DICOM files storage and database will be directly updated from The Cancer Imaging Archive each {self.period} {self.period_unit}"
- )
-
- while True:
- schedule.run_pending()
- time.sleep(10)
-
- def schedule_files_retrieval(self):
- try:
- schedule_unit = getattr(schedule.every(self.period), str(self.period_unit))
- schedule_unit.do(self.tcia_manager.change_dicom_files)
-
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while running TCIA files retrieve scheduler"
- )
-
-
-class TCIAManager(ITCIAManager):
- def __init__(
- self,
- app_logger,
- exceptions_logger,
- honeytoken_url,
- storage_directory,
- tcia_dir,
- stagger_dir,
- pdf_canary_path,
- dicomdb: IDicomDatabase = None,
- redis_handler: IRedisService = None,
- tcia_api: ITCIAAPI = None,
- osm_service: IOSMService = None,
- ):
- self.honeytoken_url = honeytoken_url
- self.tcia_dir = tcia_dir
- self.stagger_dir = stagger_dir
- self.storage_directory = storage_directory
- self.dicomdb = dicomdb or IDicomDatabase()
- self.redis_handler = redis_handler or IRedisService()
- self.osm_service = osm_service
- self.exceptions_logger = exceptions_logger
- self.logger = app_logger
-
- self.tcia_api = tcia_api
- self.pdf_canary_path = pdf_canary_path
- self.change_dicom_files_called = False
-
- def change_dicom_files(self):
- # to be used in unit testing
- self.change_dicom_files_called = True
-
- self.logger.info("Scheduled change of dicom files started")
-
- tcia_username = getattr(self.tcia_api, 'username', 'user') if self.tcia_api else 'user'
- tcia_password = getattr(self.tcia_api, 'password', 'pass') if self.tcia_api else 'pass'
-
- try:
- # Ensure storage directory exists before staging
- tcia_util.initialize_dicom_directory_if_not_exist(self.storage_directory)
-
- self.logger.debug("Stagging existing files")
- tcia_util.stage_old_files(
- self.storage_directory, self.tcia_dir, self.stagger_dir
- )
-
- if tcia_fallback.should_use_fallback(tcia_username, tcia_password):
- self.logger.info("Using fallback mode - copying sample TCIA files")
- files_copied = tcia_fallback.copy_sample_files_to_tcia_directory(self.tcia_dir)
- if files_copied == 0:
- raise Exception("Failed to copy sample files")
- else:
- self.logger.debug("Getting access token from TCIA")
- self.tcia_api.get_access_token()
-
- self.logger.debug("New files retrieval")
- exist_studies = self.redis_handler.get_TCI_existing_studies()
-
- self.tcia_api.get_new_files(exist_studies, self.tcia_dir)
-
- self.logger.debug("Organizing downloaded files")
- self.organize_downloaded_files()
-
- self.logger.debug("Cleaning up staged files")
- tcia_util.delete_staged_files(self.stagger_dir)
-
- self.logger.debug("Updating DICOM database")
- self.dicomdb.initialize_database()
-
- except Exception as e:
- self.exceptions_logger.exception(
- "Changing Dicom files failed: Rolling back changes"
- )
- # Only rollback if not in fallback mode to avoid rollback errors
- if not tcia_fallback.should_use_fallback(tcia_username, tcia_password):
- self.roll_back_changes()
- else:
- self.logger.warning("Skipping rollback in fallback mode due to error: " + str(e))
-
- def roll_back_changes(self):
- self.logger.debug("Roll-back: Deleting downloaded files")
- tcia_util.delete_downloded_files_if_exist(self.tcia_dir)
- self.logger.debug("Roll-back: restorring old files")
- tcia_util.restore_old_files(
- self.storage_directory, self.tcia_dir, self.stagger_dir
- )
-
- def organize_downloaded_files(self):
- self.logger.info("Organizing TCIA retrieved files")
- directory = tcia_util.initialize_dicom_directory_if_not_exist(
- self.storage_directory
- )
- series_files_counter = 0
- self.logger.debug("Parsing files based on modalities")
- self.logger.debug("Adding StudyInstanceUIDs to Redis")
- for modality in tcia_util.get_downloaded_modalitis(self.tcia_dir):
- for study_uid in tcia_util.get_studies_from_modality(
- modality, self.tcia_dir
- ):
- try:
-
- self.redis_handler.add_TCI_study(study_uid)
- except Exception:
- self.exceptions_logger.exception("Study addition failed:")
-
- study_files_counter = 0
- (
- patient_name,
- patient_id,
- patient_sex,
- birth_date,
- study_id,
- study_date,
- accession_number,
- ) = tcia_util.generate_patient_info()
- institution = tcia_util.get_random_institution(self.osm_service)
- for se_uid in tcia_util.get_downloaded_series_per_study(
- modality, study_uid, self.tcia_dir
- ):
- for file in tcia_util.get_files_per_serie(
- modality, study_uid, se_uid, self.tcia_dir
- ):
- study_files_counter += 1
- series_files_counter += 1
- self.process_serie_file(
- directory,
- series_files_counter,
- modality,
- study_uid,
- study_files_counter,
- patient_name,
- patient_id,
- patient_sex,
- birth_date,
- study_id,
- study_date,
- accession_number,
- institution,
- se_uid,
- file,
- )
-
- def process_serie_file(
- self,
- directory,
- series_files_counter,
- modality,
- study_uid,
- study_files_counter,
- patient_name,
- patient_id,
- patient_sex,
- birth_date,
- study_id,
- study_date,
- accession_number,
- institution,
- se_uid,
- file,
- ):
- if not tcia_util.is_licience_file(file):
-
- dataset = tcia_util.build_file_dataset(
- modality,
- study_uid,
- patient_name,
- patient_id,
- patient_sex,
- birth_date,
- study_id,
- study_date,
- accession_number,
- institution,
- se_uid,
- file,
- self.tcia_dir,
- )
- if (
- series_files_counter == 4
- or series_files_counter == 12
- or series_files_counter == 18
- or series_files_counter == 24
- ):
- # Injecting 4 retrieved dicom file with canary token and honeyURL token
- self.inject_honey_url(dataset)
-
- self.inject_pdf_canary_token(dataset)
-
- self.redis_handler.add_injected_file(patient_name, modality)
-
- tcia_util.store_retrieved_file(
- directory,
- modality,
- study_files_counter,
- patient_name,
- dataset,
- )
-
- def inject_pdf_canary_token(self, dataset):
- try:
- self.logger.debug(
- f"DICOM file for Patient: {dataset.PatientName}, modality: {dataset.Modality} injected with pdf canary token"
- )
- dataset.SOPClassUID = uid.EncapsulatedPDFStorage
- dataset.MIMETypeOfEncapsulatedDocument = "application/pdf"
- dataset.EncapsulatedDocument = self.get_canary_token()
- except Exception:
- self.exceptions_logger.exception(
- "Unexpected error while injecting canary token"
- )
-
- def inject_honey_url(self, dataset):
- try:
- dataset.RetrieveURL = (
- f"{str(self.honeytoken_url)}/{dataset.StudyInstanceUID}"
- )
- self.logger.debug(
- f"DICOM file for Patient {dataset.PatientName}, modality: {dataset.Modality} injected with honeyURL"
- )
- except Exception:
- self.exceptions_logger.exception(
- f"Unexpected error while injecting HoneyURL for Patient {dataset.PatientName}, modality: {dataset.Modality}"
- )
-
- def get_canary_token(self):
- pdf_path = self.pdf_canary_path
- try:
- with open(pdf_path, "rb") as pdf_file:
- pdf_data = pdf_file.read()
- return pdf_data
- except Exception:
- self.exceptions_logger.exception("Canary token retrieval failed:")
-
-
-class TCIAAPI(ITCIAAPI):
-
- def __init__(
- self,
- app_logger,
- exceptions_logger,
- username,
- password,
- min_series,
- max_series,
- modalities,
- studies_per_mod,
- ):
- self.username = username
- self.password = password
- self.exceptions_logger = exceptions_logger
- self.minimum_files_in_each_retrieved_serie = min_series
- self.maximum_files_in_each_retrieved_serie = max_series
- self.number_of_studies_in_each_retrieved_modality = studies_per_mod
- self.modalities = modalities
- self.logger = app_logger
-
- def get_new_files(self, existing_studies, tcia_dir):
- self.logger.debug("Calling TCIA API")
- try:
-
- _json = {}
- for mod in self.modalities:
- metadata = {}
- _json = self.get_studies_based_on_modalities(mod)
- if _json:
- study_counter = 0
- metadata = tcia_util.filter_retrieved_studies(
- existing_studies,
- _json,
- study_counter,
- self.number_of_studies_in_each_retrieved_modality,
- self.minimum_files_in_each_retrieved_serie,
- self.maximum_files_in_each_retrieved_serie,
- )
-
- for st_uid, se_uids in metadata.items():
- for se_uid_dict in se_uids:
- se_uid = se_uid_dict["se_uid"]
- mod = se_uid_dict["modality"]
- response = requests.get(
- f"https://services.cancerimagingarchive.net/nbia-api/services/v2/getImage?SeriesInstanceUID={se_uid}",
- headers={
- "Authorization": f"Bearer {self.access_token}"
- },
- )
- response.raise_for_status()
-
- tcia_util.extract_and_save_zip_data(
- mod, st_uid, se_uid, response, tcia_dir
- )
- metadata = {}
- except Exception:
- self.exceptions_logger.exception("New files retrieval failed:")
-
- def get_access_token(self):
- session = requests.Session()
- adapter = requests.adapters.HTTPAdapter(max_retries=3)
- session.mount("https://", adapter)
- try:
- res = session.post(
- "https://services.cancerimagingarchive.net/nbia-api/oauth/token",
- data={
- "username": self.username,
- "password": self.password,
- "client_id": "NBIA",
- "grant_type": "password",
- },
- timeout=10,
- )
- json_object = json.loads(res.content)
- self.access_token = json_object["access_token"]
- self.refresh_token = json_object["refresh_token"]
-
- except Exception:
- self.exceptions_logger.exception("Access token retrieval failed:")
-
- def refresh_access_token(self):
- session = requests.Session()
- adapter = requests.adapters.HTTPAdapter(max_retries=3)
- session.mount("https://", adapter)
- try:
- session.post(
- "https://services.cancerimagingarchive.net/nbia-api/oauth/token",
- data={
- "refresh_token": self.refresh_token,
- "client_id": "nbia",
- "grant_type": "refresh_token",
- },
- timeout=10,
- )
- except Exception:
- self.exceptions_logger.exception("Token refresh failed:")
-
- def get_studies_based_on_modalities(self, mod):
- session = requests.Session()
- adapter = requests.adapters.HTTPAdapter(max_retries=3)
- session.mount("https://", adapter)
- try:
- res = session.get(
- "https://services.cancerimagingarchive.net/nbia-api/services/v1/getSeries",
- params={f"Modality": {mod}},
- )
- _json = json.loads(res.content)
- except Exception:
- self.exceptions_logger.exception("Studies retrieval failed:")
- return _json
diff --git a/dicom_server/enums/dicom_session_keys.py b/dicom_server/enums/dicom_session_keys.py
deleted file mode 100644
index d2ebcc7f..00000000
--- a/dicom_server/enums/dicom_session_keys.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from aenum import Enum
-
-
-class Sessionkeys(Enum):
- _init_ = "key default"
-
- LOCK = "lock", 0
- SESSION_ID = "session_id", 0
- REQUEST_TYPE = "request_type", "N/A"
- SESSION_MAIN_OPERATION = "main_operation", "N/A"
- QUERY_LEVEL = "query_level", "N/A"
- SESSION_PARAMETERS = "session_parameters", "N/A"
- LOG_LEVEL = "log_level", "N/A"
- VERSION = "version", "N/A"
- IP = "ip", "N/A"
- PORT = "port", "N/A"
- LOCAL_PORT = "local_port", "N/A"
- KNOWN_SCANNER = "known_scanner", "N/A"
- MATCHES = "matches", "N/A"
- STATUS = "status", "N/A"
- TIMESTAMP = "timestamp", "N/A"
-
-
-class RequestType(Enum):
- ASSO_RQ = "Association Requested", 0
- ASSO_RE = "Association Released", 0
- C_ECHO = "C_ECHO", 0
- C_FIND = "C_FIND", 0
- C_GET = "C_GET", 0
- C_STORE = "C_STORE", 0
- C_MOVE = "C_MOVE"
diff --git a/dicom_server/logo.txt b/dicom_server/logo.txt
deleted file mode 100644
index c5a11e61..00000000
--- a/dicom_server/logo.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-............................................................=@@@@@@@@@@@@@@.............................................................
-.........................................................*@@@@@@@*....%@@@@@@@..........................................................
-......................................................%@@@@@@@...........-@@@@@@@.......................................................
-................+*.................................%@@@@@@*.....:@@.........:@@@@@@@-.................................*-................
-................+@@@@@#.........................@@@@@@@=........................@@@@@@@+........................:%@@@@@=................
-................=@@**#%@@@@#:...............-@@@@@@@-.........+%@@@@%#-............%@@@@@@*................=%@@@@%#**@@:................
-..........@#.....@@@@@@#**#%@@@@%-.......=@@@@@@@:........-@@@=:.:::::-%@@+...........*@@@@@@#........+@@@@@%#**#%@@@@@....:#@..........
-..........=@@@@@@#-..=%@@@@@#**#%@@@@@#@@@@@@#...........@@%+++#@@@@+@@@@@@@-............=@@@@@@@%@@@@@#***%@@@@@%=..-*@@@@@@:..........
-...........+@@@#*#%@@@@@%=..+%@@@%#**#%@@@@=....#@%.....@@*+++++=*@*+%@#.:+-:*@+...=@##+....@@@@%#***#%@@@%=..=%@@@@@%#*#@@@-...........
-..............*%@@@@@@@@@@@@@@@%=::*%@@%*%@@=...+@*....@@*#@@#=:......:--+----:@=....-=....%@@**@@@%+::+@@@@@@@@@@@@@@@@%+..............
-.............@@@@*====**+.##@*..%@@@@=*@%*%@@*........=@@@*........-*#%@@@%#%@-##.........@@@**@@.@@@@@...@##--##++===#@@@@.............
-..............#@@+-=@@...:@@@@.:@@@@@@@=*#*%@@*.......@@*..........+@@@@@=....@@....:....@@@**%-@@@@@@@#.=@%@+...@@%=-*@@*..............
-.............@@@@@@@@.@@@@%.@@@%%@@@@#*@@@%*#@@*.....#@=@-......+@%@@@@@+.....:#........@@@**@@@@*%@@@@#@@@#:@@@@%.@@@@@@@@.............
-..............#@@@@@@@@@@@@@@%%%%%%%%%%%%%%#+#@@#....@@@..=......+@@=@@@@+............:@@@**%%%%%%%%%%%%%%%@@@@@@@@@@@@@@*..............
-.................@@@@@@@@@@@@@@@@@@@@@@@@@@@@**@@@...*@@@.......%@.+@@@@@@@@#........@@@%*@@@@@@@@@@@@@@@@@@@@@@@@@@@@%.................
-................@@@@@....................+++@@@*%@@@.@@%.......:..@@@==+@@@@@@@%...@@@@*#@@+++-....................@@@@%................
-.................=@@@+.%@@@@*-@@@@@@@@@@@+#@@=::**#@@@@##........@@++%**.+++++@@@@@@%*#-::@@@+%@@@@@@@@@@-%@@@@@%.%@@@-.................
-....................+@@@@@@@::*@@@@@@@@@@@@@@@@@@@@@@@@@........@@%:#@+.==++++++@@@@@@@@@@@@@@@%@@@@@@@@+::@@@@@@@@-....................
-.......................-@@@@@@@@@@@-.@@@@@@@@@@@@@@=@@@.........@@%:*@==+..=+*##%@@@@@@@@@@@@@@@@@+.%@@@@@@@@@@@........................
-.......................-@@@@@@......:@@...@@#..@@@*+@@#.........@@@:-@@+++++++*###@@@@@#.:@@@=..@@*:.....:@@@@@@........................
-.......................-@@@@:..@@@-----=@@@@*..@@@*#@@..........@@@#:*@#+#++++*#@%#%@@@+..+..-@#-----+@@@..+@@@@........................
-.......................-@@@@..@@.%@@@@@@#:=..@@@@-@@@@.@=.......*:@@*:#@*+@++*##%@%%@@@@@@=..*:@@@@@@@+-@@..@@@@........................
-.......................-@@@@...%@@=..@@@@@+.-@@@@-#@@@.@@.........=@@#-#@#%@%####@@@%@@@@@*..@@@@@=..*@@=:..@@@@........................
-.......................-@@@@*%@@@-*@@@*--------@@++@@@@@@@..+......:@@@-+@@@@%#%%%@@@@@@@-------=@@@@-*@@@*#@@@@........................
-.......................-@@@@@@@:.%@@*-@@@@@@@@@@@@=#@@@@:@@:+@..-..-+@@@++@@@@%%@@@@@@@@@@@@@@@@@@.@@@+.*@@@@@@@........................
-.......................-@@@@@@@@@@+=@@:::::::::-@@@+%@@@.-@@%@@..**.#@@@@%+*@@@@%@@@@@@@@@%::::::*@@.%@@@@@@@@@@........................
-.......................-@@@@@@..:+@@:%@@@@@@@@@@@@@@+#@@@#=@@@@@..%@=@@@@@@#+*@@@@@@@@@@@@@@@@@@@@-+@@.:.=@@@@@@........................
-.......................=@@@@@@*:@@:%@@-...........@@@#+@@@@@@@@@@.=@@@@@@@@@@%+*@@@@@@@@@@@@@....%@@=-@#:%@@@@@@........................
-................=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:................
-................+@@@@:::::-#@@@@-:+@@@@=..:#@@@@@#:...#@@@@=::@@@@@::=@@+:-@@@@::%@@@@#::=@@@-:=@@@@@@%::%@-:*@@*::@@@@-................
-................+@@@@...+=...=@@..:@@...:+...@@@...=*...+@@....+@+....@@-..@@@%..#@@@@....%@@*..@@@@@@:..@@..=@...@@@@@-................
-................+@@@@...@@@...@@..:@@..+@@@@@@@:..@@@@...@@...-...=...@@-..@@@%..#@@@:..+..@@@...@*:@%..*@@.....-@@@@@@-................
-................+@@@@...@@@...@@..:@@..+@@@@@@@:..@@@@...@@...@*.*@...@@-........#@@#..@@..-@@#..@...-..@@@.....@@@@@@@-................
-................+@@@@...@@@...@@..:@@..+@@@@@@@:..@@@@...@@...@@@@@:..@@-..@@@%..#@@........#@@........+@@@...=..@@@@@@-................
-................+@@@@...@@:..*@@:.-@@:.......@@@........@@@:.:@@@@@:.:@@-..@@@%..#@=..@@@@..:@@%...@..:@@@@..=@+..@@@@@-................
-................+@@@@......+@@@@##%@@@@%-.=@@@@@@@+..+@@@@@%#%@@@@@%#%@@%##@@@@##@@##%@@@@@**@@@*+@@%+%@@@@..=@@*..#@@@-................
-................+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*#@@@@@@@@@@@@@@@@@@@:+@@@@@@@@@@@@@@@@@@@=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-................
\ No newline at end of file
diff --git a/dicom_server/main.py b/dicom_server/main.py
deleted file mode 100644
index 4cd4d556..00000000
--- a/dicom_server/main.py
+++ /dev/null
@@ -1,10 +0,0 @@
-import sys, os
-
-with open("logo.txt", "r") as f:
- print("\033[92m", f.read())
-sys.path.append(os.path.abspath("./core/"))
-from app_container import ApplicationContainer
-
-
-app = ApplicationContainer()
-app.dicom_application().start_the_application()
diff --git a/dicom_server/pydicom_and_pynetdicom_libs/db.py b/dicom_server/pydicom_and_pynetdicom_libs/db.py
deleted file mode 100644
index 935e1651..00000000
--- a/dicom_server/pydicom_and_pynetdicom_libs/db.py
+++ /dev/null
@@ -1,838 +0,0 @@
-"""
-The original implementation of this module can be found at "https://github.com/pydicom/pynetdicom/blob/c22be4b79a20eea0f176340629b37c6e30dd10b2/pynetdicom/apps/qrscp/db.py#L4"
-"""
-
-"""Database interface for the qrscp application.
-
-Unique Keys
------------
-* At each level one attribute is unique
-* A unique key shall uniquely identify a single instance at a given level
-* Unique keys **may** be in a C-FIND request's Identifier
-* Unique keys **shall** be in a C-MOVE or C-GET request's Identifier
-* C-FIND, C-GET and C-MOVE shall support existence and matching of all
-* unique keys. All instances managed shall have specific non-zero length
- unique key values
-
-Required Keys
--------------
-* Multiple instances may have the same value for required keys.
-* Required keys may be in a C-FIND request's Identifier
-* Required keys shall not be in a C-GET or C-MOVE request's Identifier
-
-Honeypot Adjustments
---------------------
-* Added `PatientSex`, `InstitutionName`, and `PatientBirthDate` to the attribute
- list at the STUDY level, allowing queries to filter by these fields.
-* Changed `InstitutionName` VR from `LO` to `DA`.
-* Changed `InstanceNumber` VR from `IS` to `UI`.
-
-"""
-
-from collections import OrderedDict
-import sys
-
-try:
- from sqlalchemy import create_engine, Column, ForeignKey, Integer, String
-except ImportError:
- sys.exit("qrscp requires the sqlalchemy package")
-
-from sqlalchemy.orm import declarative_base
-
-from pydicom.dataset import Dataset
-
-from pynetdicom import build_context
-from pynetdicom.sop_class import (
- PatientRootQueryRetrieveInformationModelFind,
- PatientRootQueryRetrieveInformationModelMove,
- PatientRootQueryRetrieveInformationModelGet,
- StudyRootQueryRetrieveInformationModelFind,
- StudyRootQueryRetrieveInformationModelMove,
- StudyRootQueryRetrieveInformationModelGet,
-)
-
-
-class InvalidIdentifier(Exception):
- pass
-
-
-# C.2.2.2: The total length of the attribute may be larger than given in Part 5
-# C.2.2.2: The VM may be larger than the VM from Part 6, depending
-# on the matching type
-
-# VRs for supported elements - Part 5
-# CS - 16 bytes maximum - str
-# DA - 8 bytes fixed, format YYYYMMDD - str
-# IS - 12 bytes maximum, range - int
-# LO - 64 characters maximum - str
-# PN - 64 characters maximum per component group (5 components per group) - str
-# SH - 16 characters maximum - str
-# TM - 14 bytes maximum, format HHMMSS.FFFFFF - str
-# UI - 64 bytes maximum - str
-
-
-# Translate from the element keyword to the db attribute
-_TRANSLATION = {
- "PatientID": "patient_id", # PATIENT | Unique | VM 1 | LO
- "PatientSex": "patient_sex",
- "InstitutionName": "institution_name",
- "PatientBirthDate": "birth_date",
- "PatientName": "patient_name", # PATIENT | Required | VM 1 | PN
- "StudyInstanceUID": "study_instance_uid", # STUDY | Unique | VM 1 | UI
- "StudyDate": "study_date", # STUDY | Required | VM 1 | DA
- "StudyTime": "study_time", # STUDY | Required | VM 1 | TM
- "AccessionNumber": "accession_number", # STUDY | Required | VM 1 | SH
- "StudyID": "study_id", # STUDY | Required | VM 1 | SH
- "SeriesInstanceUID": "series_instance_uid", # SERIES | Unique | VM 1 | UI
- "Modality": "modality", # SERIES | Required | VM 1 | CS
- "SeriesNumber": "series_number", # SERIES | Required | VM 1 | IS
- "SOPInstanceUID": "sop_instance_uid", # IMAGE | Unique | VM 1 | UI
- "InstanceNumber": "instance_number", # IMAGE | Required | VM 1 | IS
-}
-
-# Unique and required keys and their level, VR and VM for Patient Root
-# Study Root is the same but includes the PATIENT attributes
-_ATTRIBUTES = {
- "PatientID": ("PATIENT", "U", "LO", 1),
- "PatientName": ("PATIENT", "R", "PN", 1),
- "InstitutionName": ("STUDY", "R", "DA", 1),
- "PatientBirthDate": ("STUDY", "R", "DA", 1),
- "StudyInstanceUID": ("STUDY", "U", "UI", 1),
- "PatientSex": ("PATIENT", "R", "PN", 1),
- "StudyDate": ("STUDY", "R", "DA", 1),
- "StudyTime": ("STUDY", "R", "TM", 1),
- "AccessionNumber": ("STUDY", "R", "SH", 1),
- "StudyID": ("STUDY", "R", "SH", 1),
- "SeriesInstanceUID": ("SERIES", "U", "UI", 1),
- "Modality": ("SERIES", "R", "VS", 1),
- "SeriesNumber": ("SERIES", "R", "IS", 1),
- "SOPInstanceUID": ("IMAGE", "U", "UI", 1),
- "InstanceNumber": ("IMAGE", "R", "UI", 1),
-}
-_PATIENT_ROOT_ATTRIBUTES = OrderedDict(
- {
- "PATIENT": ["PatientID", "PatientName"],
- "STUDY": [
- "StudyInstanceUID",
- "StudyDate",
- "StudyTime",
- "AccessionNumber",
- "StudyID",
- ],
- "SERIES": ["SeriesInstanceUID", "Modality", "SeriesNumber"],
- "IMAGE": ["SOPInstanceUID", "InstanceNumber"],
- }
-)
-_STUDY_ROOT_ATTRIBUTES = OrderedDict(
- {
- "STUDY": [
- "StudyInstanceUID",
- "StudyDate",
- "StudyTime",
- "AccessionNumber",
- "StudyID",
- "PatientID",
- "PatientName",
- "PatientSex",
- "PatientBirthDate",
- "InstitutionName",
- ],
- "SERIES": ["SeriesInstanceUID", "Modality", "SeriesNumber"],
- "IMAGE": ["SOPInstanceUID", "InstanceNumber"],
- }
-)
-
-# Supported Information Models
-_C_FIND = [
- PatientRootQueryRetrieveInformationModelFind,
- StudyRootQueryRetrieveInformationModelFind,
-]
-_C_GET = [
- PatientRootQueryRetrieveInformationModelGet,
- StudyRootQueryRetrieveInformationModelGet,
-]
-_C_MOVE = [
- PatientRootQueryRetrieveInformationModelMove,
- StudyRootQueryRetrieveInformationModelMove,
-]
-
-_PATIENT_ROOT = {
- PatientRootQueryRetrieveInformationModelFind: _PATIENT_ROOT_ATTRIBUTES,
- PatientRootQueryRetrieveInformationModelGet: _PATIENT_ROOT_ATTRIBUTES,
- PatientRootQueryRetrieveInformationModelMove: _PATIENT_ROOT_ATTRIBUTES,
-}
-_STUDY_ROOT = {
- StudyRootQueryRetrieveInformationModelFind: _STUDY_ROOT_ATTRIBUTES,
- StudyRootQueryRetrieveInformationModelGet: _STUDY_ROOT_ATTRIBUTES,
- StudyRootQueryRetrieveInformationModelMove: _STUDY_ROOT_ATTRIBUTES,
-}
-
-
-def add_instance(ds, session, fpath=None):
- """Add a SOP Instance to the database or update existing instance.
-
- Parameters
- ----------
- ds : pydicom.dataset.Dataset
- The SOP Instance to be added to the database.
- session : sqlalchemy.orm.session.Session
- The session we are using to query the database.
- fpath : str, optional
- The path to where the SOP Instance is stored, taken relative
- to the database file.
- """
- # Check if instance is already in the database
- result = (
- session.query(Instance)
- .filter(Instance.sop_instance_uid == ds.SOPInstanceUID)
- .all()
- )
- if result:
- instance = result[0]
- else:
- instance = Instance()
-
- # Unique or Required attributes
- required = [
- # (Instance attribute, DICOM keyword, max length, req'd)
- ("patient_id", "PatientID", 64, True),
- ("patient_name", "PatientName", 64, False),
- ("study_instance_uid", "StudyInstanceUID", 64, True),
- ("study_date", "StudyDate", 8, False),
- ("study_time", "StudyTime", 14, False),
- ("accession_number", "AccessionNumber", 16, False),
- ("study_id", "StudyID", 16, False),
- ("series_instance_uid", "SeriesInstanceUID", 64, True),
- ("modality", "Modality", 16, False),
- ("series_number", "SeriesNumber", None, False),
- ("sop_instance_uid", "SOPInstanceUID", 64, True),
- ("instance_number", "InstanceNumber", None, False),
- ("patient_sex", "PatientSex", 64, False),
- ("institution_name", "InstitutionName", 64, False),
- ("birth_date", "PatientBirthDate", 64, False),
- ]
-
- # Unique and Required attributes
- for attr, keyword, max_len, unique in required:
- if not unique and keyword not in ds:
- value = None
- else:
- elem = ds[keyword]
- value = elem.value
-
- if value is not None:
- # All supported attributes have VM 1
- # assert elem.VM == 1
- if max_len:
- if elem.VR == "PN":
- value = str(value)
-
- assert len(value) <= max_len
- else:
- assert -(2**31) <= value <= 2**31 - 1
-
- setattr(instance, attr, value)
-
- instance.filename = fpath
-
- # Transfer Syntax UID
- try:
- tsyntax = ds.file_meta.TransferSyntaxUID
- if tsyntax:
- assert len(tsyntax) < 64
- instance.transfer_syntax_uid = tsyntax
- except (AttributeError, AssertionError):
- pass
-
- # SOP Class UID
- try:
- uid = ds.SOPClassUID
- if uid:
- assert len(uid) < 64
- instance.sop_class_uid = uid
- except (AttributeError, AssertionError):
- pass
-
- session.add(instance)
- session.commit()
-
-
-def build_query(identifier, session, query=None):
- """Perform a query against the database.
-
- Parameters
- ----------
- identifier : pydicom.dataset.Dataset
- The request's *Identifier* dataset containing the query attributes.
- session : sqlalchemy.orm.session.Session
- The session we are using to query the database.
- query : sqlalchemy.orm.query.Query, optional
- If not used then start a new query, otherwise extend the existing
- `query`.
-
- Returns
- -------
- sqlalchemy.orm.query.Query
- The resulting query.
- """
- # VRs for Single Value Matching and Wild Card Matching
- _text_vr = ["AE", "CS", "LO", "LT", "PN", "SH", "ST", "UC", "UR", "UT"]
- for elem in [e for e in identifier if e.keyword in _ATTRIBUTES]:
- vr = elem.VR
- val = elem.value
- # Convert PersonName3 to str
- if vr == "PN" and val:
- val = str(val)
-
- # Part 4, C.2.2.2.1 Single Value Matching
- if vr != "SQ" and val is not None:
- if vr in _text_vr and ("*" in val or "?" in val):
- pass
- elif vr in ["DA", "TM", "DT"] and "-" in val:
- pass
- else:
- # print('Performing single value matching...')
- query = _search_single_value(elem, session, query)
- continue
-
- # Part 4, C.2.2.2.3 Universal Matching
- if val is None:
- # print('Performing universal matching...')
- query = _search_universal(elem, session, query)
- continue
-
- # Part 4, C.2.2.2.2 List of UID Matching
- if vr == "UI":
- # print('Performing list of UID matching...')
- query = _search_uid_list(elem, session, query)
- continue
-
- # Part 4, C.2.2.2.4 Wild Card Matching
- if vr in _text_vr and ("*" in val or "?" in val):
- # print('Performing wildcard matching...')
- query = _search_wildcard(elem, session, query)
- continue
-
- # Part 4, C.2.2.2.5 Range Matching
- if vr in ["DT", "TM", "DA"] and "-" in val:
- query = _search_range(elem, session, query)
- continue
-
- # Part 4, C.2.2.2.6 Sequence Matching
- # No supported attributes are sequences
-
- return query
-
-
-def _check_identifier(identifier, model):
- """Check that the C-FIND, C-GET or C-MOVE `identifier` is valid.
-
- Parameters
- ----------
- identifier : pydicom.dataset.Dataset
- The *Identifier* dataset to check.
- model : pydicom.uid.UID
- The Query/Retrieve Information Model.
-
- Raises
- ------
- InvalidIdentifier
- If the Identifier is invalid.
- """
- # Part 4, C.4.1.1.3.1, C.4.2.1.4 and C.4.3.1.3.1:
- # (0008,0052) Query Retrieve Level is required in the Identifier
- if "QueryRetrieveLevel" not in identifier:
- raise InvalidIdentifier(
- "The Identifier contains no Query Retrieve Level element"
- )
-
- if model in _PATIENT_ROOT:
- attr = _PATIENT_ROOT[model]
- else:
- attr = _STUDY_ROOT[model]
-
- levels = list(attr.keys())
- if identifier.QueryRetrieveLevel not in levels:
- raise InvalidIdentifier(
- "The Identifier's Query Retrieve Level value is invalid"
- )
-
- if len(identifier) == 1:
- raise InvalidIdentifier("The Identifier contains no keys")
-
- for ii, level in enumerate(levels):
- if level == identifier.QueryRetrieveLevel:
- # Check if identifier has elements below current level
- for sublevel in levels[ii + 1 :]:
- if any([kw in identifier for kw in attr[sublevel]]):
- raise InvalidIdentifier(
- "The Identifier contains keys below the level "
- "specified by the Query Retrieve Level"
- )
-
- # The level is the same as that in the identifier so we're OK
- return
-
- # The level is above that in the identifier so make sure the unique
- # keyword is present
- if attr[level][0] not in identifier:
- raise InvalidIdentifier(
- f"The Identifier is missing a unique key for " f"the '{level}' level"
- )
-
-
-def clear(session):
- """Delete all entries from the database.
-
- Parameters
- ----------
- session : sqlalchemy.orm.session.Session
- The session we are using to clear the database.
- """
- for instance in session.query(Instance).all():
- session.delete(instance)
-
- session.commit()
-
-
-def create(db_location, echo=False):
- """Create a new database at `db_location` if one doesn't already exist.
-
- Parameters
- ----------
- db_location : str
- The location of the database.
- echo : bool, optional
- Turn the sqlalchemy logging on (default ``False``).
- """
- engine = create_engine(db_location, echo=echo)
-
- # Create the tables (won't recreate tables already present)
- Base.metadata.create_all(engine)
-
- return engine
-
-
-def remove_instance(instance_uid, session):
- """Remove a SOP Instance from the database.
-
- Parameters
- ----------
- instance_uid : pydicom.uid.UID
- The (0008,0018) *SOP Instance UID* of the SOP Instance to be removed
- from the database.
- session : sqlalchemy.orm.session.Session
- The session to use when querying the database for the instance.
- """
- matches = (
- session.query(Instance).filter(Instance.sop_instance_uid == instance_uid).all()
- )
- if matches:
- session.delete(matches[0])
- session.commit()
-
-
-def search(model, identifier, session):
- """Search the database.
-
- Optional keys are not supported.
-
- Parameters
- ----------
- model : pydicom.uid.UID
- The Query/Retrieve Information Model. Supported models are:
-
- - *Patient Root Query Retrieve Information Model* for C-FIND, C-GET
- and C-MOVE
- - *Study Root Query Retrieve Information Model* for C-FIND, C-GET and
- C-MOVE
- identifier : pydicom.dataset.Dataset
- The Query/Retrieve request's *Identifier* dataset.
- session : sqlalchemy.orm.session.Session
- The session we are using to query the database.
-
- Returns
- -------
- list of Instance
- The matching database Instances.
-
- Raises
- ------
- ValueError
- If the `identifier` is invalid.
- """
- if model not in _STUDY_ROOT and model not in _PATIENT_ROOT:
- raise ValueError(f"Unknown information model '{model.name}'")
-
- # Remove all optional keys, after this only unique/required will remain
- for elem in identifier:
- kw = elem.keyword
- if kw != "QueryRetrieveLevel" and kw not in _ATTRIBUTES:
- delattr(identifier, kw)
-
- if model in _C_GET or model in _C_MOVE:
- # Part 4, C.2.2.1.2: remove required keys from C-GET/C-MOVE
- for kw, value in _ATTRIBUTES.items():
- if value[1] == "R" and kw in identifier:
- delattr(identifier, kw)
-
- return _search_qr(model, identifier, session)
-
-
-def _search_qr(model, identifier, session):
- """Search the database using a Query/Retrieve *Identifier* query.
-
- Parameters
- ----------
- model : pydicom.uid.UID
- Either *Patient Root Query Retrieve Information Model* or *Study Root
- Query Retrieve Information Model* for C-FIND, C-GET or C-MOVE.
- identifier : pydicom.dataset.Dataset
- The request's *Identifier* dataset.
- session : sqlalchemy.orm.session.Session
- The session we are using to query the database.
-
- Returns
- -------
- list of db.Instance
- The Instances that match the query.
- """
- # Will raise InvalidIdentifier if check failed
- _check_identifier(identifier, model)
-
- if model in _PATIENT_ROOT:
- attr = _PATIENT_ROOT[model]
- else:
- attr = _STUDY_ROOT[model]
-
- # Hierarchical search method: C.4.1.3.1.1
- query = None
- for level, keywords in attr.items():
- # Keywords at current level that are in the identifier
- keywords = [kw for kw in keywords if kw in identifier]
- # Create query dataset for only the current level and run it
- ds = Dataset()
- [setattr(ds, kw, getattr(identifier, kw)) for kw in keywords]
- query = build_query(ds, session, query)
-
- if level == identifier.QueryRetrieveLevel:
- break
-
- return query.all()
-
-
-def _search_range(elem, session, query=None):
- """Perform a range search for DA, DT and TM elements with '-' in them.
-
- Parameters
- ----------
- elem : pydicom.dataelem.DataElement
- The attribute to perform the search with.
- session : sqlalchemy.orm.session.Session
- The session we are using to query the database.
- query : sqlalchemy.orm.query.Query, optional
- An existing query within which this search should be performed. If
- not used then all the Instances in the database will be searched
- (default).
-
- Returns
- -------
- sqlalchemy.orm.query.Query
- The resulting query.
- """
- # range matching
- # - : matches any date within the range, inclusive
- # - : match all dates prior to and including
- # -: match all dates after and including
- # : if Timezone Offset From UTC included, values are in specified
- # date: 20060705-20060707 + time: 1000-1800 matches July 5, 10 am to
- # July 7, 6 pm.
- start, end = elem.value.split("-")
- attr = getattr(Instance, _TRANSLATION[elem.keyword])
- if not query:
- query = session.query(Instance)
-
- if start and end:
- return query.filter(attr >= start, attr <= end)
- elif start and not end:
- return query.filter(attr >= start)
- elif not start and end:
- return query.filter(attr <= end)
-
- raise ValueError("Invalid attribute value for range matching")
-
-
-def _search_single_value(elem, session, query=None):
- """Perform a search using single value matching.
-
- Single value matching shall be performed if the value of an Attribute is
- non-zero length and the VR is not SQ and:
-
- * the VR is AE, CS, LO, LT, PN, SH, ST, UC, UR or UT and contains no wild
- card characters, or
- * the VR is DA, TM or DT and contains a single value with no "-", or
- * any other VR
-
- Parameters
- ----------
- elem : pydicom.dataelem.DataElement
- The attribute to perform the search with.
- session : sqlalchemy.orm.session.Session
- The session we are using to query the database.
- query : sqlalchemy.orm.query.Query, optional
- An existing query within which this search should be performed. If
- not used then all the Instances in the database will be searched
- (default).
-
- Returns
- -------
- sqlalchemy.orm.query.Query
- The resulting query.
- """
- attr = getattr(Instance, _TRANSLATION[elem.keyword])
- if elem.VR == "PN":
- value = str(elem.value)
- else:
- value = elem.value
-
- if not query:
- query = session.query(Instance)
-
- return query.filter(attr == value)
-
-
-def _search_uid_list(elem, session, query=None):
- """Search using an element containing a list of UIDs.
-
- A match against any of the UIDs is considered a positive result.
-
- Parameters
- ----------
- elem : pydicom.dataelem.DataElement
- The attribute to perform the search with.
- session : sqlalchemy.orm.session.Session
- The session we are using to query the database.
- query : sqlalchemy.orm.query.Query, optional
- An existing query within which this search should be performed. If
- not used then all the Instances in the database will be searched
- (default).
-
- Returns
- -------
- sqlalchemy.orm.query.Query
- The resulting query.
- """
- if not elem.value:
- return _search_universal(elem, session, query)
-
- attr = getattr(Instance, _TRANSLATION[elem.keyword])
- if not query:
- query = session.query(Instance)
-
- if elem.VM == 1:
- return query.filter(attr == elem.value)
-
- return query.filter(attr.in_(elem.value))
-
-
-def _search_universal(elem, session, query=None):
- """Perform a universal search for empty elements.
-
- Parameters
- ----------
- elem : pydicom.dataelem.DataElement
- The attribute to perform the search with.
- session : sqlalchemy.orm.session.Session
- The session we are using to query the database.
- query : sqlalchemy.orm.query.Query, optional
- An existing query within which this search should be performed. If
- not used then all the Instances in the database will be searched
- (default).
-
- Returns
- -------
- sqlalchemy.orm.query.Query
- The resulting query.
- """
- # If the value is zero length then all entities shall match
- if not query:
- query = session.query(Instance)
-
- return query
-
-
-def _search_wildcard(elem, session, query=None):
- """Perform a wildcard search.
-
- Parameters
- ----------
- elem : pydicom.dataelem.DataElement
- The attribute to perform the search with.
- session : sqlalchemy.orm.session.Session
- The session we are using to query the database.
- query : sqlalchemy.orm.query.Query, optional
- An existing query within which this search should be performed. If
- not used then all the Instances in the database will be searched
- (default).
-
- Returns
- -------
- sqlalchemy.orm.query.Query
- The resulting query.
- """
- # Contains '*' or '?', case-sensitive if not PN
- # '*' shall match any sequence of characters (incl. zero length)
- # '?' shall match any single character
- attr = getattr(Instance, _TRANSLATION[elem.keyword])
- if elem.VR == "PN":
- value = str(elem.value)
- else:
- value = elem.value
-
- if value is None or value == "":
- value = "*"
-
- value = value.replace("*", "%")
- value = value.replace("?", "_")
-
- if not query:
- query = session.query(Instance)
-
- return query.filter(attr.like(value))
-
-
-# Database table setup stuff
-Base = declarative_base()
-
-
-class Image(Base):
- __tablename__ = "image"
- # (0008,0018) SOP Instance UID | VR UI, VM 1, U
- sop_instance_uid = Column(String(64), primary_key=True)
- # (0020,0013) Instance Number | VR IS, VM 1, R
- instance_number = Column(Integer)
-
-
-class Instance(Base):
- __tablename__ = "instance"
-
- # Absolute path to the stored SOP Instance
- filename = Column(String)
- # Transfer Syntax UID of the SOP Instance
- transfer_syntax_uid = Column(String(64))
- sop_class_uid = Column(String(64))
- patient_sex = Column(String(64))
- institution_name = Column(String(64))
- birth_date = Column(String(64))
- patient_id = Column(String, ForeignKey("patient.patient_id"))
- patient_name = Column(String, ForeignKey("patient.patient_name"))
-
- study_instance_uid = Column(String, ForeignKey("study.study_instance_uid"))
- study_date = Column(String, ForeignKey("study.study_date"))
- study_time = Column(String, ForeignKey("study.study_time"))
- accession_number = Column(String, ForeignKey("study.accession_number"))
- study_id = Column(String, ForeignKey("study.study_id"))
-
- series_instance_uid = Column(String, ForeignKey("series.series_instance_uid"))
- modality = Column(String, ForeignKey("series.modality"))
- series_number = Column(String, ForeignKey("series.series_number"))
-
- sop_instance_uid = Column(
- String,
- ForeignKey("image.sop_instance_uid"),
- primary_key=True,
- )
- instance_number = Column(String, ForeignKey("image.instance_number"))
-
- def as_identifier(self, identifier, model):
- """Return an Identifier dataset matching the elements from a query.
-
- Parameters
- ----------
- identifier : pydicom.dataset.Dataset
- The C-FIND, C-GET or C-MOVE request's *Identifier* dataset.
- model : pydicom.uid.UID
- The Query/Retrieve Information Model.
-
- Returns
- -------
- pydicom.dataset.Dataset
- The response *Identifier*.
- """
- ds = Dataset()
- ds.QueryRetrieveLevel = identifier.QueryRetrieveLevel
-
- if model in _PATIENT_ROOT:
- attr = _PATIENT_ROOT[model]
- else:
- attr = _STUDY_ROOT[model]
-
- all_keywords = []
- for level, keywords in attr.items():
- all_keywords.extend(keywords)
- if level == identifier.QueryRetrieveLevel:
- break
-
- for kw in [kw for kw in all_keywords if kw in identifier]:
- try:
- attribute = _TRANSLATION[kw]
- except KeyError:
- continue
-
- setattr(ds, kw, getattr(self, attribute, None))
-
- return ds
-
- @property
- def context(self):
- """Return a presentation context for the Instance.
-
- Returns
- -------
- pynetdicom.presentation.PresentationContext
-
- Raises
- ------
- ValueError
- If either of the *SOP Class UID* or *Transfer Syntax UID* is not
- available for the Instance.
- """
- if None in [self.sop_class_uid, self.transfer_syntax_uid]:
- raise ValueError(
- "Cannot determine which presentation context is required for "
- "for the SOP Instance"
- )
-
- return build_context(self.sop_class_uid, self.transfer_syntax_uid)
-
-
-class Patient(Base):
- __tablename__ = "patient"
- # (0010,0020) Patient ID | VR LO, VM 1, U
- patient_id = Column(String(64), primary_key=True)
- # (0010,0010) Patient's Name | VR PN, VM 1, R
- patient_name = Column(String(400))
-
-
-class Series(Base):
- __tablename__ = "series"
- # (0020,000E) Series Instance UID | VR UI, VM 1, U
- series_instance_uid = Column(String(64), primary_key=True)
- # (0008,0060) Modality | VR CS, VM 1, R
- modality = Column(String(16))
- # (0020,0011) Series Number | VR IS, VM 1, R
- series_number = Column(Integer)
-
-
-class Study(Base):
- __tablename__ = "study"
- # (0020,000D) Study Instance UID | VR UI, VM 1, U
- study_instance_uid = Column(String(64), primary_key=True)
- # (0008,0020) Study Date | VR DA, VM 1, R
- study_date = Column(String(8))
- # (0008,0030) Study Time | VR TM, VM 1, R
- study_time = Column(String(14))
- # (0008,0050) Accession Number | VR SH, VM 1, R
- accession_number = Column(String(16))
- # (0020,0010) Study ID | VR SH, VM 1, R
- study_id = Column(String(16))
diff --git a/dicom_server/pydicom_and_pynetdicom_libs/service_class.py b/dicom_server/pydicom_and_pynetdicom_libs/service_class.py
deleted file mode 100644
index 944f4cbb..00000000
--- a/dicom_server/pydicom_and_pynetdicom_libs/service_class.py
+++ /dev/null
@@ -1,2611 +0,0 @@
-""" The original implementation of this module can be found at "https://github.com/pydicom/pynetdicom/blob/main/pynetdicom/service_class.py"""
-
-"""Implements the supported Service Classes."""
-
-""" This module was orginally provided by """
-from io import BytesIO
-import logging
-import os
-import sys
-import traceback
-from types import TracebackType
-from typing import (
- TYPE_CHECKING,
- Optional,
- Type,
- cast,
- Union,
- Tuple,
- Any,
- TypeVar,
- Iterator,
- Sequence,
- Dict,
-)
-
-from pydicom.dataset import Dataset
-from pydicom.tag import Tag
-
-from pynetdicom import evt, _config
-from pynetdicom.dsutils import decode, encode, pretty_dataset
-from pynetdicom.dimse_primitives import (
- C_STORE,
- C_ECHO,
- C_MOVE,
- C_GET,
- C_FIND,
- N_ACTION,
- N_CREATE,
- N_DELETE,
- N_EVENT_REPORT,
- N_GET,
- N_SET,
- DimseServiceType,
- DIMSEPrimitive,
-)
-from pynetdicom._globals import (
- STATUS_FAILURE,
- STATUS_SUCCESS,
- STATUS_WARNING,
- STATUS_PENDING,
- STATUS_CANCEL,
-)
-from pynetdicom.status import (
- StatusDictType,
- GENERAL_STATUS,
- QR_FIND_SERVICE_CLASS_STATUS,
- QR_GET_SERVICE_CLASS_STATUS,
- QR_MOVE_SERVICE_CLASS_STATUS,
- NON_PATIENT_SERVICE_CLASS_STATUS,
- RELEVANT_PATIENT_SERVICE_CLASS_STATUS,
- SUBSTANCE_ADMINISTRATION_SERVICE_CLASS_STATUS,
- STORAGE_SERVICE_CLASS_STATUS,
- VERIFICATION_SERVICE_CLASS_STATUS,
-)
-
-if TYPE_CHECKING: # pragma: no cover
- from pynetdicom.ae import ApplicationEntity
- from pynetdicom.association import Association
- from pynetdicom.dimse import DIMSEServiceProvider
- from pynetdicom.presentation import PresentationContext
- from pynetdicom.transport import AssociationSocket
-
- _QR = Union[C_FIND, C_MOVE, C_GET]
-
-
-StatusType = Union[int, Dataset]
-DatasetType = Optional[Dataset]
-UserReturnType = Tuple[StatusType, DatasetType]
-_T = TypeVar("_T", bound=DIMSEPrimitive)
-_ExcInfoType = Union[
- Tuple[None, None, None], Tuple[Type[BaseException], BaseException, TracebackType]
-]
-DestinationType = Union[Tuple[str, int], Tuple[str, int, Dict[str, Any]]]
-
-
-LOGGER = logging.getLogger("pynetdicom.service-c")
-
-
-class attempt:
- """Context manager for sending replies when an exception is raised.
-
- The code within the context is executed, and if an exception is raised
- then it's logged and a DIMSE message is sent to the peer using the
- set error message and status code.
- """
-
- def __init__(
- self, rsp: "DimseServiceType", dimse: "DIMSEServiceProvider", cx_id: int
- ) -> None:
- self._success = True
- # Should be customised within the context
- self.error_msg = "Exception occurred"
- self.error_status = 0xC000
- # Set by init
- self._rsp = rsp
- self._dimse = dimse
- self._cx_id = cx_id
-
- def __enter__(self) -> "attempt":
- return self
-
- def __exit__(
- self,
- exc_type: Optional[Type[BaseException]],
- exc_val: Optional[BaseException],
- exc_tb: Optional[TracebackType],
- ) -> Optional[bool]:
- if exc_type is None:
- # No exceptions raised
- return None
-
- # Exception raised within the context
- LOGGER.error(self.error_msg)
- LOGGER.exception(exc_val)
- self._rsp.Status = self.error_status
- self._dimse.send_msg(self._rsp, self._cx_id)
- self._success = False
-
- # Suppress any exceptions
- return True
-
- @property
- def success(self) -> bool:
- """Return ``True`` if the code within the context executed without
- raising an exception, ``False`` otherwise.
- """
- return self._success
-
-
-class ServiceClass:
- """The base class for all the service classes.
-
- Attributes
- ----------
- assoc : association.Association
- The association instance offering the service.
- """
-
- statuses = GENERAL_STATUS
-
- def __init__(self, assoc: "Association") -> None:
- """Create a new ServiceClass."""
- self.assoc = assoc
-
- @property
- def ae(self) -> "ApplicationEntity":
- """Return the AE."""
- return self.assoc.ae
-
- def _c_find_scp(self, req: C_FIND, context: "PresentationContext") -> None:
- """Implementation of the DIMSE C-FIND service.
-
- Parameters
- ----------
- req : dimse_primitives.C_FIND
- The C-FIND request primitive received from the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
-
- See Also
- --------
- pynetdicom.association.Association.send_c_find()
-
- Notes
- -----
- **C-FIND Request**
-
- *Parameters*
-
- | (M) Message ID
- | (M) Affected SOP Class UID
- | (M) Priority
- | (M) Identifier
-
- **C-FIND Response**
-
- *Parameters*
-
- | (U) Message ID
- | (M) Message ID Being Responded To
- | (U) Affected SOP Class UID
- | (C) Identifier
- | (M) Status
-
- *Status*
-
- Success
- | ``0x0000`` Success
-
- Pending
- | ``0xFF00`` Matches are continuing, current match supplied
- | ``0xFF01`` Matches are continuing, warning
-
- Cancel
- | ``0xFE00`` Cancel
-
- Failure
- | ``0x0122`` SOP class not supported
- | ``0xA700`` Out of resources
- | ``0xA900`` Identifier does not match SOP class
- | ``0xC000`` to ``0xCFFF`` Unable to process
-
- References
- ----------
-
- * DICOM Standard, Part 4, :dcm:`Annex C`
- * DICOM Standard, Part 4, :dcm:`Annex K`
- * DICOM Standard, Part 4, :dcm:`Annex Q`
- * DICOM Standard, Part 4, :dcm:`Annex U`
- * DICOM Standard, Part 4, :dcm:`Annex V`
- * DICOM Standard, Part 4, :dcm:`Annex X`
- * DICOM Standard, Part 4, :dcm:`Annex BB`
- * DICOM Standard, Part 4, :dcm:`Annex CC`
- * DICOM Standard, Part 4, :dcm:`Annex HH`
- * DICOM Standard, Part 4, :dcm:`Annex II`
- * DICOM Standard, Part 7, Sections
- :dcm:`9.1.2`,
- :dcm:`9.3.2` and
- :dcm:`Annex C`
- """
- cx_id = cast(int, context.context_id)
- transfer_syntax = context.transfer_syntax[0]
-
- # Build C-FIND response primitive
- rsp = C_FIND()
- rsp.MessageID = req.MessageID
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPClassUID = req.AffectedSOPClassUID
-
- # Decode and log Identifier
- if _config.LOG_REQUEST_IDENTIFIERS:
- try:
- identifier = decode(
- cast(BytesIO, req.Identifier),
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
- LOGGER.info("Find SCP Request Identifier:")
- LOGGER.info("")
- LOGGER.info("# DICOM Dataset")
- for line in pretty_dataset(identifier):
- LOGGER.info(line)
- LOGGER.info("")
- except Exception:
- # The user should deal with decoding failures
- pass
-
- # Try and trigger EVT_C_FIND
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = "Exception in handler bound to 'evt.EVT_C_FIND'"
- ctx.error_status = 0xC311
- generator = evt.trigger(
- self.assoc,
- evt.EVT_C_FIND,
- {
- "request": req,
- "context": context.as_tuple,
- "_is_cancelled": self.is_cancelled,
- },
- )
-
- # Exception in context or handler aborted/released
- if not ctx.success or not self.assoc.is_established:
- return
-
- # No matches and no yields
- if generator is None:
- generator = iter([(0x0000, None)])
-
- ii = -1 # So if there are no results, log below doesn't break
- # Iterate through the results
- for ii, (result, exc) in enumerate(self._wrap_handler(generator)):
- # Reset the response Identifier
- rsp.Identifier = None
- dataset: Optional[Dataset]
- rsp_status: StatusType
-
- # Exception raised by user's generator
- if exc:
- LOGGER.error("Exception in handler bound to 'evt.EVT_C_FIND'")
- LOGGER.error(
- "\nTraceback (most recent call last):\n"
- + "".join(traceback.format_tb(exc[2]))
- + f"{exc[0].__name__}: {str(exc[1])}" # type: ignore
- )
- rsp_status = 0xC311
- dataset = None
- else:
- (rsp_status, dataset) = cast(UserReturnType, result)
-
- # Event handler has aborted or released
- if not self.assoc.is_established:
- return
-
- # Validate rsp_status and set rsp.Status accordingly
- rsp = self.validate_status(rsp_status, rsp)
-
- if rsp.Status in self.statuses:
- status = self.statuses[rsp.Status]
- else:
- # Unknown status
- self.dimse.send_msg(rsp, cx_id)
- return
-
- if status[0] == STATUS_CANCEL:
- # If cancel, then dataset is None
- LOGGER.info("Received C-CANCEL-FIND RQ from peer")
- LOGGER.info(f"Find SCP Response {ii + 1}: 0x{rsp.Status:04X} (Cancel)")
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] == STATUS_FAILURE:
- # If failed, then dataset is None
- LOGGER.info(
- f"Find SCP Response {ii + 1}: 0x{rsp.Status:04X} "
- f"(Failure - {status[1]})"
- )
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] == STATUS_SUCCESS:
- # User isn't supposed to send these, but handle anyway
- # If success, then dataset is None
- LOGGER.info(f"Find SCP Response {ii + 1}: 0x0000 (Success)")
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] == STATUS_PENDING:
- # If pending, `dataset` is the Identifier
- dataset = cast(Dataset, dataset)
- enc = encode(
- dataset,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
- bytestream = BytesIO(cast(bytes, enc))
-
- if bytestream.getvalue() == b"":
- LOGGER.error("Failed encoding the response 'Identifier' dataset")
- # Failure: Unable to Process - Can't decode dataset
- # returned by handler
- rsp.Status = 0xC312
- self.dimse.send_msg(rsp, cx_id)
- return
-
- rsp.Identifier = bytestream
-
- LOGGER.info(f"Find SCP Response {ii + 1}: 0x{rsp.Status:04X} (Pending)")
- if _config.LOG_RESPONSE_IDENTIFIERS:
- LOGGER.debug("Find SCP Response Identifier:")
- LOGGER.debug("")
- LOGGER.debug("# DICOM Dataset")
- for line in pretty_dataset(dataset):
- LOGGER.debug(line)
- LOGGER.debug("")
-
- self.dimse.send_msg(rsp, cx_id)
-
- # Event handler has aborted or released
- if not self.assoc.is_established:
- return
-
- # Send final success response - make sure the identifier isn't present
- rsp.Identifier = None
- rsp.Status = 0x0000
- LOGGER.info(f"Find SCP Response {ii + 2}: 0x0000 (Success)")
- self.dimse.send_msg(rsp, cx_id)
-
- @property
- def dimse(self) -> "DIMSEServiceProvider":
- """Return the DIMSE service provider."""
- return self.assoc.dimse
-
- def is_cancelled(self, msg_id: int) -> bool:
- """Return True if a C-CANCEL message with `msg_id` has been received.
-
- .. versionadded:: 1.2
-
- Parameters
- ----------
- msg_id : int
- The (0000,0120) *Message ID Being Responded To* value to use to
- match against.
-
- Returns
- -------
- bool
- ``True`` if a C-CANCEL message has been received with a *Message ID
- Being Responded To* corresponding to `msg_id`, ``False`` otherwise.
- """
- if msg_id in self.dimse.cancel_req.keys():
- del self.dimse.cancel_req[msg_id]
- return True
-
- return False
-
- def is_valid_status(self, status: int) -> bool:
- """Return ``True`` if `status` is valid for the service class.
-
- Parameters
- ----------
- status : int
- The Status value to check for validity.
-
- Returns
- -------
- bool
- ``True`` if the status is valid, ``False`` otherwise.
- """
- if status in self.statuses:
- return True
-
- return False
-
- def _n_action_scp(self, req: N_ACTION, context: "PresentationContext") -> None:
- """Implementation of the DIMSE N-ACTION service.
-
- Parameters
- ----------
- req : dimse_primitives.N_ACTION
- The N-ACTION request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
-
- Notes
- -----
-
- **Service Classes**
-
- * *Print Management*
- * *Storage Commitment*
- * *Application Event Logging*
- * *Media Creation Management*
- * *Unified Procedure Step*
- * *RT Machine Verification*
-
- **N-ACTION Request**
-
- *Parameters*
-
- | (M) Message ID
- | (M) Requested SOP Class UID
- | (M) Requested SOP Instance UID
- | (M) Action Type ID
- | (U) Action Information
-
- **N-ACTION Response**
-
- *Parameters*
-
- | (M) Message ID Being Responded To
- | (C=) Action Type ID
- | (U) Affected SOP Class UID
- | (U) Affected SOP Instance UID
- | (C) Action Reply
- | (M) Status
-
- *Status*
-
- Success
- | ``0x0000`` - Success
-
- Failure
- | ``0x0112`` - No such SOP Instance
- | ``0x0114`` - No such argument
- | ``0x0115`` - Invalid argument value
- | ``0x0117`` - Invalid object instance
- | ``0x0118`` - No such SOP Class
- | ``0x0119`` - Class-Instance conflict
- | ``0x0123`` - No such action
- | ``0x0124`` - Refused: not authorised
- | ``0x0210`` - Duplicate invocation
- | ``0x0211`` - Unrecognised operation
- | ``0x0212`` - Mistyped argument
- | ``0x0213`` - Resource limitation
- | ``0xC101`` - Procedural Logging not available for specified Study
- Instance UID
- | ``0xC102`` - Event Information does not match Template
- | ``0xC103`` - Cannot match event to a current study
- | ``0xC104`` - IDs inconsistent in matching a current study; Event
- not logged
- | ``0xC10E`` - Operator not authorised to add entry to Medication
- Administration Record
- | ``0xC110`` - Patient cannot be identified from Patient ID
- (0010,0020) or Admission ID (0038,0010)
- | ``0xC111`` - Update of Medication Administration Record failed
- | ``0xC112`` - Machine Verification requested instance not found
- | ``0xC300`` - The UPS may no longer be updated
- | ``0xC301`` - The correct Transaction UID was not provided
- | ``0xC302`` - The UPS is already IN PROGRESS
- | ``0xC303`` - The UPS may only become SCHEDULED via N-CREATE, not
- N-SET or N-ACTION
- | ``0xC304`` - The UPS has not met final state requirements for the
- requested state change
- | ``0xC307`` - Specified SOP Instance UID does not exist or is not a
- UPS Instance managed by this SCP
- | ``0xC308`` - Receiving AE-TITLE is Unknown to this SCP
- | ``0xC310`` - The UPS is not yet in the IN PROGRESS state
- | ``0xC311`` - The UPS is already COMPLETED
- | ``0xC312`` - The performer cannot be contacted
- | ``0xC313`` - Performer chooses not to cancel
- | ``0xC314`` - Specified action not appropriate for specified
- instance
- | ``0xC315`` - SCP does not support Event Reports
- | ``0xC600`` - Film Session SOP Instance hierarchy does not contain
- Film Box SOP Instances
- | ``0xC601`` - Unable to create Print Job SOP Instance; print queue
- is full
- | ``0xC602`` - Unable to create Print Job SOP Instance; print queue
- is full
- | ``0xC603`` - Image size is larger than image box size
- | ``0xC613`` - Combined Print Image size is larger than Image Box
- size
-
- Warning
- | ``0xB101`` - Specified Synchronisation Frame of Reference UID does
- not match SOP Synchronisation Frame of Reference
- | ``0xB102`` - Study Instance UID coercion; Event logged under a
- different Study Instance UID
- | ``0xB104`` - IDs inconsistent in matching a current study; Event
- logged
- | ``0xB301`` - Deletion Lock not granted
- | ``0xB304`` - The UPS is already in the requested state of CANCELED
- | ``0xB306`` - The UPS is already in the requested state of COMPLETED
- | ``0xB601`` - Film session printing (collation) is not supported
- | ``0xB602`` - Film Session SOP Instance hierarchy does not contain
- Image Box SOP Instances (empty page)
- | ``0xB603`` - Film Box SOP Instance hierarchy does not contain Image
- Box SOP Instances (empty page)
- | ``0xB604`` - Image size is larger than Image Box size, the image
- has been demagnified
- | ``0xB609`` - Image size is larger than Image Box size, the image
- has been cropped to fit.
- | ``0xB60A`` - Image size or Combined Print Image size is larger than
- the Image Box size. Image or Combined Print Image has been
- decimated to fit.
-
- References
- ----------
-
- * DICOM Standard, Part 4, :dcm:`Annex H`
- * DICOM Standard, Part 4, :dcm:`Annex J`
- * DICOM Standard, Part 4, :dcm:`Annex P`
- * DICOM Standard, Part 4, :dcm:`Annex S`
- * DICOM Standard, Part 4, :dcm:`Annex CC`
- * DICOM Standard, Part 4, :dcm:`Annex DD`
- * DICOM Standard, Part 7, Sections
- :dcm:`10.1.4`,
- :dcm:`10.3.4` and
- :dcm:`Annex C`
- """
- cx_id = cast(int, context.context_id)
-
- # Build N-CREATE response primitive
- rsp = N_ACTION()
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPClassUID = req.RequestedSOPClassUID
- rsp.AffectedSOPInstanceUID = req.RequestedSOPInstanceUID
- rsp.ActionTypeID = req.ActionTypeID
-
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = "Exception in the handler bound to 'evt.EVT_N_ACTION"
- ctx.error_status = 0x0110
- user_response = evt.trigger(
- self.assoc,
- evt.EVT_N_ACTION,
- {"request": req, "context": context.as_tuple},
- )
-
- # Exception in context or handler aborted/released
- if not ctx.success or not self.assoc.is_established:
- return
-
- usr_status, ds = cast(UserReturnType, user_response)
-
- # Check Status validity
- # Validate rsp_status and set rsp.Status accordingly
- rsp = self.validate_status(usr_status, rsp)
-
- if rsp.Status in self.statuses:
- status = self.statuses[rsp.Status]
- else:
- # Unknown status
- self.dimse.send_msg(rsp, cx_id)
- return
-
- if status[0] in (STATUS_SUCCESS, STATUS_WARNING) and ds:
- # If Success or Warning then there **may** be a dataset
- transfer_syntax = context.transfer_syntax[0]
- # If encode() fails then returns `None`
- bytestream = encode(
- ds,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
-
- if bytestream is None:
- LOGGER.error("Failed encoding the response 'Action Reply' dataset")
- # Processing failure
- rsp.Status = 0x0110
- else:
- rsp.ActionReply = BytesIO(bytestream)
-
- # Send response primitive
- self.dimse.send_msg(rsp, cx_id)
-
- def _n_create_scp(self, req: N_CREATE, context: "PresentationContext") -> None:
- """Implementation of the DIMSE N-CREATE service.
-
- Parameters
- ----------
- req : dimse_primitives.N_CREATE
- The N-CREATE request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
-
- Notes
- -----
-
- **Service Classes**
-
- * *Procedure Step*
- * *Print Management*
- * *Instance Availability Notification*
- * *Media Creation Management*
- * *Unified Procedure Step*
- * *RT Machine Verification*
-
- **N-CREATE Request**
-
- *Parameters*
-
- | (M) Message ID
- | (M) Affected SOP Class UID
- | (U) Affected SOP Instance UID
- | (U) Attribute List
-
- **N-CREATE Response**
-
- *Parameters*
-
- | (M) Message ID Being Responded To
- | (U=) Affected SOP Class UID
- | (C) Affected SOP Instance UID
- | (U) Attribute List
- | (M) Status
-
- *Status*
-
- Success
- | ``0x0000`` - Success
-
- Failure
- | ``0x0105`` - No such attribute
- | ``0x0106`` - Invalid attribute value
- | ``0x0107`` - Attribute list error
- | ``0x0110`` - Processing failure
- | ``0x0111`` - Duplicate SOP Instance
- | ``0x0116`` - Attribute value out of range
- | ``0x0117`` - Invalid object instance
- | ``0x0118`` - No such SOP Class
- | ``0x0120`` - Missing attribute
- | ``0x0121`` - Missing attribute value
- | ``0x0124`` - Refused: not authorised
- | ``0x0210`` - Duplicate invocation
- | ``0x0211`` - Unrecognised operation
- | ``0x0212`` - Mistyped argument
- | ``0x0213`` - Resource limitation
- | ``0xA510`` - Failed: an initiate media creation action has already
- been received for this SOP Instance
- | ``0xC221`` - The Referenced Fraction Group Number does not exist in
- the referenced plan
- | ``0xC222`` - No beams exist within the referenced fraction group
- | ``0xC223`` - SCU already verifying and cannot currently process
- this request
- | ``0xC227`` - No such object instance - Referenced RT Plan not found
- | ``0xC309`` - The provided value of UPS State was not 'SCHEDULED'
- | ``0xC616`` - There is an existing Film Box that has not been
- printed and N-ACTION at the Film Session level is not supported.
- A new Film Box will not be created when a previous Film Box has
- not been printed
-
- Warning
- | ``0xB300`` - THE UPS was created with modifications
- | ``0xB600`` - Memory allocation not supported
- | ``0xB605`` - Requested Min Density or Max Density outside of
- printer's operating range. The printer will use its respective
- minimum or maximum density value instead
-
- References
- ----------
-
- * DICOM Standard, Part 4, :dcm:`Annex F`
- * DICOM Standard, Part 4, :dcm:`Annex H`
- * DICOM Standard, Part 4, :dcm:`Annex R`
- * DICOM Standard, Part 4, :dcm:`Annex S`
- * DICOM Standard, Part 4, :dcm:`Annex CC`
- * DICOM Standard, Part 4, :dcm:`Annex DD`
- * DICOM Standard, Part 7, Sections
- :dcm:`10.1.5`,
- :dcm:`10.3.5`
- and :dcm:`Annex C`
- """
- cx_id = cast(int, context.context_id)
-
- # Build N-CREATE response primitive
- rsp = N_CREATE()
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPClassUID = req.AffectedSOPClassUID
- rsp.AffectedSOPInstanceUID = req.AffectedSOPInstanceUID
-
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = "Exception in the handler bound to 'evt.EVT_N_CREATE"
- ctx.error_status = 0x0110
- user_response = evt.trigger(
- self.assoc,
- evt.EVT_N_CREATE,
- {"request": req, "context": context.as_tuple},
- )
-
- # Exception in context or handler aborted/released
- if not ctx.success or not self.assoc.is_established:
- return
-
- usr_status, ds = cast(UserReturnType, user_response)
-
- # Check Status validity
- # Validate rsp_status and set rsp.Status accordingly
- rsp = self.validate_status(usr_status, rsp)
-
- if rsp.Status in self.statuses:
- status = self.statuses[rsp.Status]
- else:
- # Unknown status
- self.dimse.send_msg(rsp, cx_id)
- return
-
- if status[0] in (STATUS_SUCCESS, STATUS_WARNING) and ds:
- # If Success or Warning then there **may** be a dataset
- transfer_syntax = context.transfer_syntax[0]
- # If encode() fails then returns `None`
- bytestream = encode(
- ds,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
-
- if bytestream is None:
- LOGGER.error("Failed encoding the response 'Attribute List' dataset")
- # Processing failure
- rsp.Status = 0x0110
- else:
- rsp.AttributeList = BytesIO(bytestream)
-
- # Send response primitive
- self.dimse.send_msg(rsp, cx_id)
-
- def _n_delete_scp(self, req: N_DELETE, context: "PresentationContext") -> None:
- """Implementation of the DIMSE N-DELETE service.
-
- Parameters
- ----------
- req : dimse_primitives.N_DELETE
- The N-DELETE request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
-
- Notes
- -----
-
- **Service Classes**
-
- * *Print Management*
- * *RT Machine Verification*
-
- **N-DELETE Request**
-
- *Parameters*
-
- | (M) Message ID
- | (M) Requested SOP Class UID
- | (M) Requested SOP Instance UID
-
- **N-DELETE Response**
-
- *Parameters*
-
- | (M) Message ID Being Responded To
- | (U) Affected SOP Class UID
- | (U) Affected SOP Instance UID
- | (M) Status
-
- *Status*
-
- Success
- | ``0x0000`` - Success
-
- Failure
- | ``0x0110`` - Processing failure
- | ``0x0112`` - No such SOP Instance
- | ``0x0117`` - Invalid object Instance
- | ``0x0118`` - Not such SOP Class
- | ``0x0119`` - Class-Instance conflict
- | ``0x0124`` - Not authorised
- | ``0x0210`` - Duplicate invocation
- | ``0x0211`` - Unrecognised operation
- | ``0x0212`` - Mistyped argument
- | ``0x0213`` - Resource limitation
-
- References
- ----------
-
- * DICOM Standard, Part 4, :dcm:`Annex H `
- * DICOM Standard, Part 4, :dcm:`Annex DD `
- * DICOM Standard, Part 7, Sections
- :dcm:`10.1.6`,
- :dcm:`10.3.6`
- and :dcm:`Annex C`
- """
- cx_id = cast(int, context.context_id)
-
- # Build N-DELETE response primitive
- rsp = N_DELETE()
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPClassUID = req.RequestedSOPClassUID
- rsp.AffectedSOPInstanceUID = req.RequestedSOPInstanceUID
-
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = "Exception in the handler bound to 'evt.EVT_N_DELETE"
- ctx.error_status = 0x0110
- status = evt.trigger(
- self.assoc,
- evt.EVT_N_DELETE,
- {"request": req, "context": context.as_tuple},
- )
-
- # Exception in context or handler aborted/released
- if not ctx.success or not self.assoc.is_established:
- return
-
- # Check Status validity
- # Validate 'status' and set 'rsp.Status' accordingly
- rsp = self.validate_status(cast(StatusType, status), rsp)
-
- # Send response primitive
- self.dimse.send_msg(rsp, cx_id)
-
- def _n_event_report_scp(
- self, req: N_EVENT_REPORT, context: "PresentationContext"
- ) -> None:
- """Implementation of the DIMSE N-EVENT-REPORT service.
-
- Parameters
- ----------
- req : dimse_primitives.N_EVENT_REPORT
- The N-EVENT-REPORT request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
-
- Notes
- -----
-
- **Service Classes**
-
- * *Procedure Step*
- * *Print Management*
- * *Storage Commitment*
- * *Unified Procedure Step*
- * *RT Machine Verification*
-
- **N-EVENT-REPORT Request**
-
- *Parameters*
-
- | (M) Message ID
- | (M) Affected SOP Class UID
- | (M) Affected SOP Instance UID
- | (M) Event Type ID
- | (U) Event Information
-
- **N-EVENT-REPORT Response**
-
- *Parameters*
-
- | (M) Message ID Being Responded To
- | (U=) Affected SOP Class UID
- | (U=) Affected SOP Instance UID
- | (C=) Event Type ID
- | (C) Event Reply
- | (M) Status
-
- *Status*
-
- Success
- | ``0x0000`` - Success
-
- Failure
- | ``0x0110`` - Processing failure
- | ``0x0112`` - No such SOP Instance
- | ``0x0113`` - No such event type
- | ``0x0114`` - No such argument
- | ``0x0115`` - Invalid argument value
- | ``0x0117`` - Invalid object Instance
- | ``0x0118`` - No such SOP Class
- | ``0x0119`` - Class-Instance conflict
- | ``0x0210`` - Duplicate invocation
- | ``0x0211`` - Unrecognised operation
- | ``0x0212`` - Mistyped argument
- | ``0x0213`` - Resource limitation
-
- References
- ----------
-
- * DICOM Standard, Part 4, :dcm:`Annex F `
- * DICOM Standard, Part 4, :dcm:`Annex H `
- * DICOM Standard, Part 4, :dcm:`Annex J `
- * DICOM Standard, Part 4, :dcm:`Annex CC `
- * DICOM Standard, Part 4, :dcm:`Annex DD `
- * DICOM Standard, Part 7, Sections
- :dcm:`10.1.1 `,
- :dcm:`10.3.1 `
- and :dcm:`Annex C `
- """
- cx_id = cast(int, context.context_id)
-
- # Build N-EVENT-REPLY response primitive
- rsp = N_EVENT_REPORT()
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPClassUID = req.AffectedSOPClassUID
- rsp.AffectedSOPInstanceUID = req.AffectedSOPInstanceUID
- rsp.EventTypeID = req.EventTypeID
-
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = "Exception in the handler bound to 'evt.EVT_N_EVENT_REPORT"
- ctx.error_status = 0x0110
- user_response = evt.trigger(
- self.assoc,
- evt.EVT_N_EVENT_REPORT,
- {"request": req, "context": context.as_tuple},
- )
-
- # Exception in context or handler aborted/released
- if not ctx.success or not self.assoc.is_established:
- return
-
- usr_status, ds = cast(UserReturnType, user_response)
-
- # Check Status validity
- # Validate rsp_status and set rsp.Status accordingly
- rsp = self.validate_status(usr_status, rsp)
-
- if rsp.Status in self.statuses:
- status = self.statuses[rsp.Status]
- else:
- # Unknown status
- self.dimse.send_msg(rsp, cx_id)
- return
-
- if status[0] in (STATUS_SUCCESS, STATUS_WARNING) and ds:
- # If Success or Warning then there **may** be a dataset
- transfer_syntax = context.transfer_syntax[0]
- # If encode() fails then returns `None`
- bytestream = encode(
- ds,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
-
- if bytestream is None:
- LOGGER.error("Failed encoding the response 'Event Reply' dataset")
- # Processing failure
- rsp.Status = 0x0110
- else:
- rsp.EventReply = BytesIO(bytestream)
-
- # Send response primitive
- self.dimse.send_msg(rsp, cx_id)
-
- def _n_get_scp(self, req: N_GET, context: "PresentationContext") -> None:
- """Implementation of the DIMSE N-GET service.
-
- Parameters
- ----------
- req : dimse_primitives.N_GET
- The N-GET request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the service is operating under.
-
- See Also
- --------
- association.Association.send_n_get
-
- Notes
- -----
-
- **Service Classes**
-
- * *Display System Management*
- * *Procedure Step*
- * *Print Management*
- * *Media Creation Management*
- * *Unified Procedure Step*
- * *RT Machine Verification*
-
- **N-GET Request**
-
- *Parameters*
-
- | (M) Message ID
- | (M) Requested SOP Class UID
- | (M) Requested SOP Instance UID
- | (U) Attribute Identifier List
-
- *Attribute Identifier List*
-
- An element with VR AT, VM 1-n, containing an attribute tag for each
- of the attributes applicable to the N-GET operation.
-
- **N-GET Response**
-
- *Parameters*
-
- | (M) Message ID Being Responded To
- | (U) Affected SOP Class UID
- | (U) Affected SOP Instance UID
- | (C) Attribute List
- | (M) Status
-
- *Attribute List*
-
- A dataset containing the values of the requested attributes.
-
- *Status*
-
- Success
- | ``0x0000`` - Success
-
- Failure
- | ``0x0107`` - Attribute list error
- | ``0x0110`` - Processing failure
- | ``0x0112`` - No such SOP Instance
- | ``0x0117`` - Invalid object Instance
- | ``0x0118`` - No such SOP Class
- | ``0x0119`` - Class-Instance conflict
- | ``0x0124`` - Not authorised
- | ``0x0210`` - Duplicate invocation
- | ``0x0211`` - Unrecognised operation
- | ``0x0212`` - Mistyped argument
- | ``0x0213`` - Resource limitation
- | ``0xC112`` - Applicable Machine Verification Instance not found
- | ``0xC307`` - Specified SOP Instance UID doesn't exist or is not
- a UPS Instance managed by this SCP
-
- Warning
- | ``0x0001`` - Requested optional Attributes are not supported
- | ``0x0107`` - Attribute list error
-
- References
- ----------
-
- * DICOM Standard, Part 4, :dcm:`Annex F `
- * DICOM Standard, Part 4, :dcm:`Annex H `
- * DICOM Standard, Part 4, :dcm:`Annex S `
- * DICOM Standard, Part 4, :dcm:`Annex CC `
- * DICOM Standard, Part 4, :dcm:`Annex DD `
- * DICOM Standard, Part 4, :dcm:`Annex EE `
- * DICOM Standard, Part 7, Sections
- :dcm:`10.1.2 `,
- :dcm:`10.3.2 `
- and :dcm:`Annex C `
- """
- cx_id = cast(int, context.context_id)
-
- # Build N-GET response primitive
- rsp = N_GET()
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPClassUID = req.RequestedSOPClassUID
- rsp.AffectedSOPInstanceUID = req.RequestedSOPInstanceUID
-
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = "Exception in the handler bound to 'evt.EVT_N_GET'"
- ctx.error_status = 0x0110
- user_response = evt.trigger(
- self.assoc, evt.EVT_N_GET, {"request": req, "context": context.as_tuple}
- )
-
- # Exception in context or handler aborted/released
- if not ctx.success or not self.assoc.is_established:
- return
-
- usr_status, ds = cast(UserReturnType, user_response)
-
- # Validate rsp_status and set rsp.Status accordingly
- rsp = self.validate_status(usr_status, rsp)
-
- if rsp.Status in self.statuses:
- status = self.statuses[rsp.Status]
- else:
- # Unknown status
- self.dimse.send_msg(rsp, cx_id)
- return
-
- if status[0] in [STATUS_SUCCESS, STATUS_WARNING] and ds:
- # If Success or Warning then there **may** be a dataset
- transfer_syntax = context.transfer_syntax[0]
- # If encode() fails then returns `None`
- bytestream = encode(
- ds,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
-
- if bytestream is None:
- LOGGER.error("Failed encoding the response 'Attribute List' dataset")
- # Processing failure - Failed to encode dataset
- rsp.Status = 0x0110
- else:
- rsp.AttributeList = BytesIO(bytestream)
-
- self.dimse.send_msg(rsp, cx_id)
-
- def _n_set_scp(self, req: N_SET, context: "PresentationContext") -> None:
- """Implementation of the DIMSE N-SET service.
-
- Parameters
- ----------
- req : dimse_primitives.N_SET
- The N-SET request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
-
- Notes
- -----
-
- **Service Classes**
-
- * *Procedure Step*
- * *Print Management*
- * *Unified Procedure Step*
- * *RT Machine Verification*
-
- **N-SET Request**
-
- *Parameters*
-
- | (M) Message ID
- | (M) Requested SOP Class UID
- | (M) Requested SOP Instance UID
- | (M) Modification List
-
- **N-SET Response**
-
- *Parameters*
-
- | (M) Message ID Being Responded To
- | (U) Attribute List
- | (U) Affected SOP Class UID
- | (U) Affected SOP Instance UID
- | (M) Status
-
- *Status*
-
- Success
- | ``0x0000`` - Success
-
- Failure
- | ``0x0105`` - No such attribute
- | ``0x0106`` - Invalid attribute value
- | ``0x0110`` - Processing failure
- | ``0x0112`` - SOP Instance not recognised
- | ``0x0116`` - Attribute value out of range
- | ``0x0117`` - Invalid object instance
- | ``0x0118`` - No such SOP Class
- | ``0x0119`` - Class-Instance conflict
- | ``0x0121`` - Missing attribute value
- | ``0x0124`` - Refused: not authorised
- | ``0x0210`` - Duplicate invocation
- | ``0x0211`` - Unrecognised operation
- | ``0x0212`` - Mistyped argument
- | ``0x0213`` - Resource limitation
- | ``0xC112`` - Applicable Machine Verification Instance not found
- | ``0xC224`` - Reference Beam Number not found within the
- referenced Fraction Group
- | ``0xC225`` - Referenced device or accessory not supported
- | ``0xC226`` - Referenced device or accessory not found with the
- referenced beam
- | ``0xC300`` - The UPS may no longer be updated
- | ``0xC301`` - The correct Transaction UID was not provided
- | ``0xC307`` - Specified SOP Instance UID does not exist or is not a
- UPS Instance managed by this SCP
- | ``0xC310`` - The UPS is not in the 'IN PROGRESS' state
- | ``0xC603`` - Image size is larger than image box size
- | ``0xC605`` - Insufficient memory in printer to store the image
- | ``0xC613`` - Combined Print Image size is larger than the Image Box
- size
- | ``0xC616`` - There is an existing Film Box that has not been
- printed and N-ACTION at the Film Session level is not supported.
- A new Film Box will not be created when a previous Film Box has
- not been printed
-
- Warning
- | ``0x0001`` - Requested optional attributes are not supported
- | ``0xB305`` - Coerced invalid values to valid values
- | ``0xB600`` - Memory allocation not supported
- | ``0xB604`` - Image size larger than image box size, the image has
- been demagnified
- | ``0xB605`` - Requested Min Density or Max Density outside of
- printer's operating range. The printer will use its respective
- minimum or maximum density value instead
- | ``0xB609`` - Image size is larger than the Image Box. The Image has
- been cropped to fit
- | ``0xB60A`` - Image size or Combined Print Image size is larger than
- the Image Box size. The Image or Combined Print Image has been
- decimated to fit
-
- References
- ----------
-
- * DICOM Standard, Part 4, :dcm:`Annex F `
- * DICOM Standard, Part 4, :dcm:`Annex H `
- * DICOM Standard, Part 4, :dcm:`Annex CC `
- * DICOM Standard, Part 4, :dcm:`Annex DD `
- * DICOM Standard, Part 7, Sections
- :dcm:`10.1.3 `,
- :dcm:`10.3.3 `
- and :dcm:`Annex C `
- """
- cx_id = cast(int, context.context_id)
-
- # Build N-CREATE response primitive
- rsp = N_SET()
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPClassUID = req.RequestedSOPClassUID
- rsp.AffectedSOPInstanceUID = req.RequestedSOPInstanceUID
-
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = "Exception in the handler bound to 'evt.EVT_N_SET'"
- ctx.error_status = 0x0110
- user_response = evt.trigger(
- self.assoc, evt.EVT_N_SET, {"request": req, "context": context.as_tuple}
- )
-
- # Exception in context or handler aborted/released
- if not ctx.success or not self.assoc.is_established:
- return
-
- usr_status, ds = cast(UserReturnType, user_response)
-
- # Validate rsp_status and set rsp.Status accordingly
- rsp = self.validate_status(usr_status, rsp)
-
- if rsp.Status in self.statuses:
- status = self.statuses[rsp.Status]
- else:
- # Unknown status
- self.dimse.send_msg(rsp, cx_id)
- return
-
- if status[0] in (STATUS_SUCCESS, STATUS_WARNING) and ds:
- # If Success or Warning then there **may** be a dataset
- transfer_syntax = context.transfer_syntax[0]
- # If encode() fails then returns `None`
- bytestream = encode(
- ds,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
-
- if bytestream is None:
- LOGGER.error("Failed encoding the response 'Attribute List' dataset")
- # Processing failure
- rsp.Status = 0x0110
- else:
- rsp.AttributeList = BytesIO(bytestream)
-
- # Send response primitive
- self.dimse.send_msg(rsp, cx_id)
-
- def SCP(self, req: Any, context: "PresentationContext") -> None:
- """The implementation of the corresponding service class.
-
- Parameters
- ----------
- req : A DIMSE message primitive
- The message request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
- """
- msg = (
- f"No service class has been implemented for the "
- f"SOP Class UID '{context.abstract_syntax}'"
- )
- raise NotImplementedError(msg)
-
- def validate_status(self, status: Union[int, Dataset], rsp: _T) -> _T:
- """Validate `status` and set `rsp.Status` accordingly.
-
- Parameters
- ----------
- status : pydicom.dataset.Dataset or int
- A Dataset containing a Status element or an int.
- rsp : dimse_primitive
- The response primitive to be sent to the peer.
-
- Returns
- -------
- rsp : dimse_primitive
- The response primitie to be sent to the peer (containing a valid
- Status parameter).
- """
- # Check the callback's returned Status dataset
- if isinstance(status, Dataset):
- # Check that the returned status dataset contains a Status element
- if "Status" in status:
- # For the elements in the status dataset, try and set the
- # corresponding response primitive attribute
- for elem in status:
- if hasattr(rsp, elem.keyword):
- setattr(rsp, elem.keyword, elem.value)
- else:
- LOGGER.warning(
- f"Status dataset returned by callback contained "
- f"an unsupported Element '{elem.keyword}'"
- )
- else:
- LOGGER.error(
- "User callback returned a `Dataset` without a Status element"
- )
- # Failure: Cannot Understand - callback returned
- # a pydicom.dataset.Dataset without a Status element
- rsp.Status = 0xC001
- elif isinstance(status, int):
- rsp.Status = status
- else:
- LOGGER.error("Invalid status returned by callback")
- # Failure: Cannot Understand - callback didn't return
- # a valid status type
- rsp.Status = 0xC002
-
- if not self.is_valid_status(cast(int, rsp.Status)):
- # Failure: Cannot Understand - Unknown status returned by the
- # callback
- LOGGER.warning(
- f"Unknown status value returned by callback - " f"0x{rsp.Status:04X}"
- )
-
- return rsp
-
- def _wrap_handler(
- self, handler: Iterator
- ) -> Iterator[Union[Tuple[None, _ExcInfoType], Tuple[UserReturnType, None]]]:
- """Wrap a generator handler to catch exceptions.
-
- Parameters
- ----------
- handler : generator
- A generator returned by a user's handler.
-
- Yields
- ------
- object or Exception, str
- The normal yields of the generator, unless an exception occurs
- within the generator in which case the exception and traceback
- are yielded instead.
- """
- try:
- for result in handler:
- # Ensure we are still associated
- if (
- self.assoc.acse.is_aborted()
- or self.assoc.acse.is_release_requested()
- ):
- LOGGER.debug(
- "A-ABORT or A-RELEASE-RQ received during Q/R sub-operations"
- )
- return
-
- yield (result, None)
- except Exception as exc:
- yield (None, sys.exc_info())
-
-
-# Service Class implementations
-class VerificationServiceClass(ServiceClass):
- """Implementation of the Verification Service Class."""
-
- statuses = VERIFICATION_SERVICE_CLASS_STATUS
-
- def SCP(self, req: C_ECHO, context: "PresentationContext") -> None:
- """The SCP implementation for the Verification Service Class.
-
- Will always return 0x0000 (Success) unless the user returns a different
- (valid) status value from the handler bound to `evt.EVT_C_ECHO`.
-
- Parameters
- ----------
- req : dimse_primitives.C_ECHO
- The C-ECHO request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
- """
- # Build C-ECHO response primitive
- rsp = C_ECHO()
- rsp.MessageID = req.MessageID
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPClassUID = req.AffectedSOPClassUID
-
- try:
- status = evt.trigger(
- self.assoc,
- evt.EVT_C_ECHO,
- {"request": req, "context": context.as_tuple},
- )
- # Event handler has aborted or released
- if not self.assoc.is_established:
- return
-
- if isinstance(status, Dataset):
- if "Status" not in status:
- raise AttributeError(
- "The 'status' dataset returned by the handler "
- "bound to 'evt.EVT_C_ECHO' must contain"
- "a (0000,0900) Status element"
- )
- for elem in status:
- if hasattr(rsp, elem.keyword):
- setattr(rsp, elem.keyword, elem.value)
- else:
- LOGGER.warning(
- f"The 'status' dataset returned by the handler "
- f"bound to 'evt.EVT_C_ECHO' contained an "
- f"unsupported Element '{elem.keyword}'"
- )
- elif isinstance(status, int):
- rsp.Status = status
- else:
- raise TypeError(
- "Invalid 'status' returned by the handler bound to "
- "'evt.EVT_C_ECHO'"
- )
-
- except Exception as ex:
- LOGGER.error(
- "Exception in the handler bound to 'evt.EVT_C_ECHO', "
- "responding with a default 'Status' value of 0x0000 "
- "(Success)"
- )
- LOGGER.exception(ex)
- rsp.Status = 0x0000
-
- # Check Status validity
- if not self.is_valid_status(cast(int, rsp.Status)):
- LOGGER.warning(
- f"Unknown 'status' value returned by the handler bound to "
- f"'evt.EVT_C_ECHO' - 0x{rsp.Status:04X}"
- )
-
- # Send primitive
- self.dimse.send_msg(rsp, cast(int, context.context_id))
-
-
-class StorageServiceClass(ServiceClass):
- """Implementation of the Storage Service Class."""
-
- uid = "1.2.840.10008.4.2"
- statuses = STORAGE_SERVICE_CLASS_STATUS
-
- def SCP(self, req: C_STORE, context: "PresentationContext") -> None:
- """The SCP implementation for the Storage Service Class.
-
- Parameters
- ----------
- req : dimse_primitives.C_STORE
- The C-STORE request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
- """
- # Build C-STORE response primitive
- rsp = C_STORE()
- rsp.MessageID = req.MessageID
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPInstanceUID = req.AffectedSOPInstanceUID
- rsp.AffectedSOPClassUID = req.AffectedSOPClassUID
-
- cx_id = cast(int, context.context_id)
-
- # Try and trigger EVT_C_STORE
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = "Exception in handler bound to 'evt.EVT_C_STORE'"
- ctx.error_status = 0xC211
- rsp_status = evt.trigger(
- self.assoc,
- evt.EVT_C_STORE,
- {"request": req, "context": context.as_tuple},
- )
- if req._dataset_file:
- req._dataset_file.close()
-
- try:
- # We passed delete=False when creating the temporary file
- os.unlink(req._dataset_file.name)
- except OSError:
- # This is best effort on e.g Windows where files may
- # not be deleted while in use.
- pass
-
- # Exception in context or handler aborted/released
- if not ctx.success or not self.assoc.is_established:
- return
-
- # Validate rsp_status and set rsp.Status accordingly
- rsp = self.validate_status(cast(StatusType, rsp_status), rsp)
- self.dimse.send_msg(rsp, cx_id)
-
-
-class QueryRetrieveServiceClass(ServiceClass):
- """Implementation of the Query/Retrieve Service Class."""
-
- statuses: StatusDictType
- # Used with Composite Instance Retrieve Without Bulk Data
- # CurveData, AudioSampleData and OverlayData are repeating group elements
- _BULK_DATA_KEYWORDS = [
- "PixelData",
- "FloatPixelData",
- "DoubleFloatPixelData",
- "PixelDataProviderURL",
- "SpectroscopyData",
- "EncapsulatedDocument",
- ]
-
- def SCP(self, req: "_QR", context: "PresentationContext") -> None:
- """The SCP implementation for the Query/Retrieve Service Class.
-
- Parameters
- ----------
- req : dimse_primitives.C_FIND or C_GET or C_MOVE
- The request primitive received from the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
- """
- _find_uids = [
- "1.2.840.10008.5.1.4.1.2.1.1",
- "1.2.840.10008.5.1.4.1.2.2.1",
- "1.2.840.10008.5.1.4.1.2.3.1",
- "1.2.840.10008.5.1.4.20.1",
- "1.2.840.10008.5.1.4.38.2",
- "1.2.840.10008.5.1.4.39.2",
- "1.2.840.10008.5.1.4.43.2",
- "1.2.840.10008.5.1.4.44.2",
- "1.2.840.10008.5.1.4.45.2",
- "1.2.840.10008.5.1.4.1.1.200.4",
- ]
- _get_uids = [
- "1.2.840.10008.5.1.4.1.2.1.3",
- "1.2.840.10008.5.1.4.1.2.2.3",
- "1.2.840.10008.5.1.4.1.2.3.3",
- "1.2.840.10008.5.1.4.1.2.4.3",
- "1.2.840.10008.5.1.4.1.2.5.3",
- "1.2.840.10008.5.1.4.20.3",
- "1.2.840.10008.5.1.4.38.4",
- "1.2.840.10008.5.1.4.39.4",
- "1.2.840.10008.5.1.4.43.4",
- "1.2.840.10008.5.1.4.44.4",
- "1.2.840.10008.5.1.4.45.4",
- "1.2.840.10008.5.1.4.1.1.200.6",
- "1.2.840.10008.5.1.4.1.1.201.4",
- "1.2.840.10008.5.1.4.1.1.1",
- ]
- _move_uids = [
- "1.2.840.10008.5.1.4.1.2.1.2",
- "1.2.840.10008.5.1.4.1.2.2.2",
- "1.2.840.10008.5.1.4.1.2.3.2",
- "1.2.840.10008.5.1.4.1.2.4.2",
- "1.2.840.10008.5.1.4.20.2",
- "1.2.840.10008.5.1.4.38.3",
- "1.2.840.10008.5.1.4.39.3",
- "1.2.840.10008.5.1.4.43.3",
- "1.2.840.10008.5.1.4.44.3",
- "1.2.840.10008.5.1.4.45.3",
- "1.2.840.10008.5.1.4.1.1.200.5",
- ]
- if isinstance(req, C_FIND) and context.abstract_syntax in _find_uids:
- self.statuses = QR_FIND_SERVICE_CLASS_STATUS
- self._c_find_scp(req, context)
- elif isinstance(req, C_GET) and context.abstract_syntax in _get_uids:
- self.statuses = QR_GET_SERVICE_CLASS_STATUS
- self._get_scp(req, context)
- elif isinstance(req, C_MOVE) and context.abstract_syntax in _move_uids:
- self.statuses = QR_MOVE_SERVICE_CLASS_STATUS
- self._move_scp(req, context)
- else:
- raise ValueError(
- "The supplied abstract syntax is not valid for use with the "
- "Query/Retrieve Service Class"
- )
-
- def _get_scp(self, req: C_GET, context: "PresentationContext") -> None:
- """The SCP implementation for Query/Retrieve - Get.
-
- Parameters
- ----------
- req : dimse_primitives.C_GET
- The C-GET request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
- """
- cx_id = cast(int, context.context_id)
- transfer_syntax = context.transfer_syntax[0]
-
- # Build C-GET response primitive
- rsp = C_GET()
- rsp.MessageID = req.MessageID
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPClassUID = req.AffectedSOPClassUID
-
- if _config.LOG_REQUEST_IDENTIFIERS:
- try:
- identifier = decode(
- cast(BytesIO, req.Identifier),
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
- LOGGER.info("Get SCP Request Identifier:")
- LOGGER.info("")
- LOGGER.info("# DICOM Dataset")
- for line in pretty_dataset(identifier):
- LOGGER.info(line)
- LOGGER.info("")
- except Exception:
- # The user should deal with decoding failures
- pass
-
- # Try and trigger EVT_C_GET
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = "Exception in handler bound to 'evt.EVT_C_GET'"
- ctx.error_status = 0xC411
- generator = evt.trigger(
- self.assoc,
- evt.EVT_C_GET,
- {
- "request": req,
- "context": context.as_tuple,
- "_is_cancelled": self.is_cancelled,
- },
- )
-
- # Exception in context or handler aborted/released - before any yields
- if not ctx.success or not self.assoc.is_established:
- return
-
- generator = cast(Iterator[Any], generator)
-
- # Try to check number of C-STORE sub-operations yield is OK
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = (
- "The C-GET request handler yielded an invalid number of "
- "sub-operations value"
- )
- ctx.error_status = 0xC413
- no_suboperations = int(next(generator))
-
- if not ctx.success:
- return
-
- if no_suboperations < 1:
- rsp.Status = 0x0000
- rsp.NumberOfRemainingSuboperations = 0
- rsp.NumberOfFailedSuboperations = 0
- rsp.NumberOfWarningSuboperations = 0
- rsp.NumberOfCompletedSuboperations = 0
- self.dimse.send_msg(rsp, cx_id)
- return
-
- # Track the sub operation results
- # [remaining, failed, warning, complete]
- store_results = [no_suboperations, 0, 0, 0]
-
- # Store the SOP Instance UIDs from any failed C-STORE sub-operations
- failed_instances = []
-
- def _add_failed_instance(ds: Dataset) -> None:
- if hasattr(ds, "SOPInstanceUID"):
- failed_instances.append(ds.SOPInstanceUID)
-
- ii = -1 # So if there are no results, log below doesn't break
- # Iterate through the results
- # C-GET Pending responses are optional!
- for ii, (result, exc) in enumerate(self._wrap_handler(generator)):
- # Reset the response Identifier
- rsp.Identifier = None
- rsp_status: StatusType
-
- # Exception raised by user's generator
- if exc:
- LOGGER.error("Exception in handler bound to 'evt.EVT_C_GET'")
- LOGGER.error(
- "\nTraceback (most recent call last):\n"
- + "".join(traceback.format_tb(exc[2]))
- + f"{exc[0].__name__}: {str(exc[1])}" # type: ignore
- )
- rsp_status = 0xC411
- dataset = None
- else:
- (rsp_status, dataset) = cast(UserReturnType, result)
-
- # Event handler has aborted or released - after any yields
- if not self.assoc.is_established:
- return
-
- # All sub-operations are complete
- if store_results[0] <= 0:
- LOGGER.warning(
- "User's C-GET generator yielded further (status, dataset) "
- "results but these will be ignored as the sub-operations "
- "are complete"
- )
- break
-
- # Validate rsp_status and set rsp.Status accordingly
- rsp = self.validate_status(rsp_status, rsp)
- if rsp.Status in self.statuses:
- status = self.statuses[rsp.Status]
- else:
- # Unknown status
- store_results[1] += 1
- self.dimse.send_msg(rsp, cx_id)
- return
-
- if status[0] == STATUS_CANCEL:
- # If cancel, dataset is a Dataset with a
- # 'FailedSOPInstanceUIDList' element
- LOGGER.info("Received C-CANCEL-GET RQ from peer")
- LOGGER.info(f"Get SCP Response {ii + 1}: 0x{rsp.Status:04X} (Cancel)")
- rsp.NumberOfRemainingSuboperations = store_results[0]
- rsp.NumberOfFailedSuboperations = store_results[1]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
-
- # In case user didn't include it
- if (
- not isinstance(dataset, Dataset)
- or "FailedSOPInstanceUIDList" not in dataset
- ):
- dataset = Dataset()
- dataset.FailedSOPInstanceUIDList = failed_instances
-
- bytestream = encode(
- dataset,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
- rsp.Identifier = BytesIO(cast(bytes, bytestream))
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] in [STATUS_FAILURE, STATUS_WARNING]:
- # If failure or warning, dataset is a Dataset with a
- # 'FailedSOPInstanceUIDList' element
- LOGGER.info(
- f"Get SCP Result {ii + 1}: 0x{rsp.Status:04X} "
- f"({status[0]} - {status[1]})"
- )
- rsp.NumberOfRemainingSuboperations = None
- rsp.NumberOfFailedSuboperations = store_results[1] + store_results[0]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
-
- # In case user didn't include it
- if (
- not isinstance(dataset, Dataset)
- or "FailedSOPInstanceUIDList" not in dataset
- ):
- dataset = Dataset()
- dataset.FailedSOPInstanceUIDList = failed_instances
-
- bytestream = encode(
- dataset,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
- rsp.Identifier = BytesIO(cast(bytes, bytestream))
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] == STATUS_SUCCESS:
- # If user yields Success, check it
- # dataset is None
- if store_results[1] or store_results[2]:
- LOGGER.info(f"Get SCP Response {ii + 1}: 0xB000 (Warning)")
- rsp.Status = 0xB000
- ds = Dataset()
- ds.FailedSOPInstanceUIDList = failed_instances
- bytestream = encode(
- ds,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
- rsp.Identifier = BytesIO(cast(bytes, bytestream))
- else:
- LOGGER.info(f"Get SCP Response {ii + 1}: 0x0000 (Success)")
- rsp.Identifier = None
-
- rsp.NumberOfRemainingSuboperations = None
- rsp.NumberOfFailedSuboperations = store_results[1]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
-
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] == STATUS_PENDING and dataset:
- # If pending, dataset is the Dataset to send
- if not isinstance(dataset, Dataset):
- LOGGER.error("Received invalid dataset from callback")
- # Count as a sub-operation failure
- store_results[1] += 1
- failed_instances.append("")
- rsp.Identifier = None
- rsp.NumberOfRemainingSuboperations = store_results[0]
- rsp.NumberOfFailedSuboperations = store_results[1]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
- self.dimse.send_msg(rsp, cx_id)
- continue
-
- LOGGER.info(f"Get SCP Response {ii + 1}: 0x{rsp.Status:04X} (Pending)")
-
- # If the Composite Instance Retrieve Without Bulk Data Service
- # is being used then we must remove the bulk data elements
- # (if present)
- if context.abstract_syntax == "1.2.840.10008.5.1.4.1.2.5.3":
- # Doesn't include WaveformData, OverlayData
- # or AudioSampleData
- _bulk_data = [
- kw for kw in self._BULK_DATA_KEYWORDS if kw in dataset
- ]
- for keyword in _bulk_data:
- delattr(dataset, keyword)
-
- # Needs to be handled separately
- if "WaveformSequence" in dataset:
- seq = cast(Sequence[Dataset], dataset.WaveformSequence)
- for item in seq:
- if "WaveformData" in item:
- del item.WaveformData
- if "WaveformData" not in _bulk_data:
- _bulk_data.append("WaveformData")
-
- # Handle repeating group bulk data elements
- repeaters = [
- (0x5000, 0x200C), # Audio Sample Data
- (0x5000, 0x3000), # Curve Data
- (0x6000, 0x3000), # Overlay Data
- ]
- for rpt in range(0, 256, 2):
- for base in repeaters:
- tag = Tag(base[0] + rpt, base[1])
- if tag in dataset:
- del dataset[tag]
-
- if _bulk_data:
- LOGGER.warning(
- f"The Query/Retrieve - Composite Instance "
- f"Retrieve Without Bulk Data service is "
- f"requested but a yielded dataset contains the "
- f"following (to be removed) bulk data "
- f"elements: {','.join(_bulk_data)}"
- )
-
- # Send `dataset` via C-STORE sub-operations over the existing
- # association and check that the response's Status exists and
- # is a known value
- try:
- # Message ID is VR 'US' and has range 0 <= n < 2**16
- msg_id = cast(int, req.MessageID) + ii + 1
- if msg_id > 65535:
- msg_id -= 65535
-
- status_ds = self.assoc.send_c_store(dataset, msg_id=msg_id)
- store_status_int = status_ds.Status
- store_status = STORAGE_SERVICE_CLASS_STATUS[store_status_int]
- except Exception as exc:
- # An exception implies a C-STORE failure
- LOGGER.warning("C-STORE sub-operation failed.")
- LOGGER.error(str(exc))
- store_status_int = None
- store_status = (STATUS_FAILURE, "Unknown")
-
- if store_status_int is not None:
- msg = (
- f"Get SCP: Received Store SCP response "
- f"0x{store_status_int:04X} ({store_status[0]})"
- )
- else:
- msg = (
- f"Get SCP: Received Store SCP response " f"({store_status[0]})"
- )
- LOGGER.info(msg)
-
- # Update the C-STORE sub-operation result tracker
- if store_status[0] == STATUS_FAILURE:
- store_results[1] += 1
- # Part 4, C.4.3.1.3.2
- _add_failed_instance(dataset)
- elif store_status[0] == STATUS_WARNING:
- store_results[2] += 1
- elif store_status[0] == STATUS_SUCCESS:
- store_results[3] += 1
-
- store_results[0] -= 1
-
- rsp.Identifier = None
- rsp.NumberOfRemainingSuboperations = store_results[0]
- rsp.NumberOfFailedSuboperations = store_results[1]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
- self.dimse.send_msg(rsp, cx_id)
-
- # Event handler has aborted or released - prevent final message
- if not self.assoc.is_established:
- return
-
- # If not already done, send the final 'Success' or 'Warning' response
- if not store_results[1] and not store_results[2]:
- # Success response - no failures or warnings
- LOGGER.info(f"Get SCP Response {ii + 2}: 0x0000 (Success)")
- rsp.Status = 0x0000
- rsp.Identifier = None
- else:
- if no_suboperations == store_results[1]:
- # Failure response - all sub-operations failed
- LOGGER.info(f"Get SCP Response {ii + 2}: 0xA702 (Failure)")
- rsp.Status = 0xA702 # Unable to perform sub-ops
- else:
- # Warning response - one or more failures or warnings
- LOGGER.info(f"Get SCP Response {ii + 2}: 0xB000 (Warning)")
- rsp.Status = 0xB000
-
- # If Failure or Warning response, need to return an Identifier with
- # (0008,0058) Failed SOP Instance UID List element
- ds = Dataset()
- ds.FailedSOPInstanceUIDList = failed_instances
- bytestream = encode(
- ds,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
- rsp.Identifier = BytesIO(cast(bytes, bytestream))
-
- rsp.NumberOfRemainingSuboperations = None
- rsp.NumberOfFailedSuboperations = store_results[1]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
-
- self.dimse.send_msg(rsp, cx_id)
-
- def _move_scp(self, req: C_MOVE, context: "PresentationContext") -> None:
- """The SCP implementation for Query/Retrieve - Move.
-
- Parameters
- ----------
- req : dimse_primitives.C_MOVE
- The C-MOVE request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
- """
- cx_id = cast(int, context.context_id)
- transfer_syntax = context.transfer_syntax[0]
-
- # Build C-MOVE response primitive
- rsp = C_MOVE()
- rsp.MessageID = req.MessageID
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPClassUID = req.AffectedSOPClassUID
-
- if _config.LOG_REQUEST_IDENTIFIERS:
- try:
- identifier = decode(
- cast(BytesIO, req.Identifier),
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
- LOGGER.info("Move SCP Request Identifier:")
- LOGGER.info("")
- LOGGER.info("# DICOM Dataset")
- for line in pretty_dataset(identifier):
- LOGGER.info(line)
- LOGGER.info("")
- except Exception:
- # The user should deal with decoding failures
- pass
-
- # Try and trigger EVT_C_MOVE
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = "Exception in handler bound to 'evt.EVT_C_MOVE'"
- ctx.error_status = 0xC511
- generator = evt.trigger(
- self.assoc,
- evt.EVT_C_MOVE,
- {
- "request": req,
- "context": context.as_tuple,
- "_is_cancelled": self.is_cancelled,
- },
- )
-
- # Exception in context or handler aborted/released - before any yields
- if not ctx.success or not self.assoc.is_established:
- return
-
- generator = cast(Iterator[Any], generator)
-
- # Try and get the first yield
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = (
- "The C-MOVE request handler must yield the (address, port) of "
- "the destination AE, then yield the number of sub-operations, "
- "then yield (status, dataset) pairs."
- )
- ctx.error_status = 0xC514
-
- destination: DestinationType = next(generator)
-
- # Exception in context or handler aborted/released - first yield
- if not ctx.success or not self.assoc.is_established:
- return
-
- # Try to check the Move Destination is OK and known
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = (
- "The handler bound to 'evt.EVT_C_MOVE' yielded an invalid "
- "destination AE (addr, port) or (addr, port, kwargs) value"
- )
- ctx.error_status = 0xC515
- if None in destination[:2]:
- LOGGER.error(f"Unknown Move Destination: {req.MoveDestination}")
- # Failure - Move destination unknown
- rsp.Status = 0xA801
- self.dimse.send_msg(rsp, cx_id)
- return
-
- if not ctx.success:
- return
-
- # Try to check number of C-STORE sub-operations yield is OK
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = (
- "The C-MOVE request handler yielded an invalid number of "
- "sub-operations value"
- )
- ctx.error_status = 0xC513
- no_suboperations = int(next(generator))
-
- # Exception in context or handler aborted/released - second yield
- if not ctx.success or not self.assoc.is_established:
- return
-
- if no_suboperations < 1:
- rsp.Status = 0x0000
- rsp.NumberOfRemainingSuboperations = 0
- rsp.NumberOfFailedSuboperations = 0
- rsp.NumberOfWarningSuboperations = 0
- rsp.NumberOfCompletedSuboperations = 0
- self.dimse.send_msg(rsp, cx_id)
- return
-
- # Try to request new association with Move Destination
- with attempt(rsp, self.dimse, cx_id) as ctx:
- ctx.error_msg = (
- "The handler bound to 'evt.EVT_C_MOVE' yielded an invalid "
- "destination AE (addr, port) or (addr, port, kwargs) value"
- )
- ctx.error_status = 0xC515
- kwargs = {"ae_title": req.MoveDestination}
- if len(destination) >= 3 and destination[2]: # type: ignore
- kwargs.update(destination[2]) # type: ignore
-
- store_assoc = self.ae.associate(
- destination[0], destination[1], **kwargs # type: ignore
- )
-
- if not ctx.success:
- return
-
- if not store_assoc.is_established:
- # Failed to associate with Move Destination AE
- LOGGER.error("Move SCP: Unable to associate with destination AE")
- rsp.Status = 0xA801
- self.dimse.send_msg(rsp, cx_id)
-
- # FIXME - shouldn't have to manually close the socket like this
- sock = cast("AssociationSocket", store_assoc.dul.socket)
- sock.close()
- return
-
- # Track the sub operation results
- # [remaining, failed, warning, complete]
- store_results = [no_suboperations, 0, 0, 0]
-
- # Store the SOP Instance UIDs from any failed C-STORE sub-operations
- failed_instances = []
-
- def _add_failed_instance(ds: Dataset) -> None:
- if hasattr(ds, "SOPInstanceUID"):
- failed_instances.append(ds.SOPInstanceUID)
-
- ii = -1 # So if there are no results, log below doesn't break
- # Iterate through the remaining callback (status, dataset) yields
- # C-MOVE Pending responses are optional!
- for ii, (result, exc) in enumerate(self._wrap_handler(generator)):
- # Reset the response Identifier
- rsp.Identifier = None
- rsp_status: StatusType
-
- # Exception raised by handler
- if exc:
- LOGGER.error("Exception in handler bound to 'evt.EVT_C_MOVE'")
- LOGGER.error(
- "\nTraceback (most recent call last):\n"
- + "".join(traceback.format_tb(exc[2]))
- + f"{exc[0].__name__}: {str(exc[1])}" # type: ignore
- )
- rsp_status = 0xC511
- dataset = None
- else:
- (rsp_status, dataset) = cast(UserReturnType, result)
-
- # Event handler has aborted or released - during any status yields
- if not self.assoc.is_established:
- store_assoc.release()
- return
-
- # All sub-operations are complete
- if store_results[0] <= 0:
- LOGGER.warning(
- "Handler bound to 'evt.EVT_C_MOVE' yielded further "
- "(status, dataset) results but these will be ignored as "
- "the sub-operations are complete"
- )
- break
-
- # Validate rsp_status and set rsp.Status accordingly
- rsp = self.validate_status(rsp_status, rsp)
- if rsp.Status in self.statuses:
- status = self.statuses[rsp.Status]
- else:
- # Unknown status
- store_assoc.release()
- self.dimse.send_msg(rsp, cx_id)
- return
-
- # If usr_status is Cancel, Failure, Warning or Success then
- # generate a final response, if Pending then do C-STORE
- # sub-operation
- if status[0] == STATUS_CANCEL:
- # If cancel, then dataset is a Dataset with a
- # 'FailedSOPInstanceUIDList' element
- LOGGER.info("Received C-CANCEL-MOVE RQ from peer")
- LOGGER.info(f"Move SCP Response {ii + 1}: 0x{rsp.Status:04X} (Cancel)")
- store_assoc.release()
-
- # In case user didn't include it
- if (
- not isinstance(dataset, Dataset)
- or "FailedSOPInstanceUIDList" not in dataset
- ):
- dataset = Dataset()
- dataset.FailedSOPInstanceUIDList = failed_instances
-
- bytestream = encode(
- dataset,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
-
- rsp.Identifier = BytesIO(cast(bytes, bytestream))
- rsp.NumberOfRemainingSuboperations = store_results[0]
- rsp.NumberOfFailedSuboperations = store_results[1]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
-
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] in [STATUS_FAILURE, STATUS_WARNING]:
- # If failed or warning, then dataset is a Dataset with a
- # 'FailedSOPInstanceUIDList' element
- LOGGER.info(
- f"Move SCP Response {ii + 1}: 0x{rsp.Status:04X} "
- f"({status[0]} - {status[1]})"
- )
- store_assoc.release()
-
- # In case user didn't include it
- if (
- not isinstance(dataset, Dataset)
- or "FailedSOPInstanceUIDList" not in dataset
- ):
- dataset = Dataset()
- dataset.FailedSOPInstanceUIDList = failed_instances
-
- bytestream = encode(
- dataset,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
-
- rsp.Identifier = BytesIO(cast(bytes, bytestream))
- rsp.NumberOfRemainingSuboperations = None
- rsp.NumberOfFailedSuboperations = store_results[1] + store_results[0]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
-
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] == STATUS_SUCCESS:
- # If Success, then dataset is None
- store_assoc.release()
-
- # If the user yields Success, check it
- if store_results[1] or store_results[2]:
- # Sub-operations contained failures/warnings
- LOGGER.info(f"Move SCP Response {ii + 1}: 0xB000 (Warning)")
-
- ds = Dataset()
- ds.FailedSOPInstanceUIDList = failed_instances
- bytestream = encode(
- ds,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
-
- rsp.Identifier = BytesIO(cast(bytes, bytestream))
- rsp.Status = 0xB000
- else:
- # No failures or warnings
- LOGGER.info(f"Move SCP Response {ii + 1}: 0x0000 (Success)")
- rsp.Identifier = None
-
- rsp.NumberOfRemainingSuboperations = None
- rsp.NumberOfFailedSuboperations = store_results[1]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
-
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] == STATUS_PENDING and dataset:
- # If pending, then dataset is the Dataset to send
- if not isinstance(dataset, Dataset):
- LOGGER.error("Received invalid dataset from callback")
- # Count as a sub-operation failure
- store_results[1] += 1
- failed_instances.append("")
- rsp.Identifier = None
- rsp.NumberOfRemainingSuboperations = store_results[0]
- rsp.NumberOfFailedSuboperations = store_results[1]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
- self.dimse.send_msg(rsp, cx_id)
- continue
-
- LOGGER.info(f"Move SCP Response {ii + 1}: 0x{rsp.Status:04X} (Pending)")
-
- # Send `dataset` via C-STORE sub-operations over the
- # association and check that the response's Status exists
- # and is a known value
- try:
- # Message ID is VR 'US' and has range 0 <= n < 2**16
- msg_id = cast(int, req.MessageID) + ii + 1
- if msg_id > 65535:
- msg_id -= 65535
-
- status_ds = store_assoc.send_c_store(
- dataset,
- msg_id=msg_id,
- originator_aet=self.ae.ae_title,
- originator_id=req.MessageID,
- )
-
- store_status_int = status_ds.Status
- store_status = STORAGE_SERVICE_CLASS_STATUS[store_status_int]
- except Exception as exc:
- # An exception implies a C-STORE failure
- LOGGER.warning("C-STORE sub-operation failed.")
- LOGGER.error(str(exc))
- store_status_int = None
- store_status = (STATUS_FAILURE, "Unknown")
-
- if store_status_int is not None:
- msg = (
- f"Move SCP: Received Store SCP response "
- f"0x{store_status_int:04X} ({store_status[0]})"
- )
- else:
- msg = (
- f"Move SCP: Received Store SCP response " f"({store_status[0]})"
- )
-
- LOGGER.info(msg)
-
- # Update the C-STORE sub-operation result tracker
- if store_status[0] == STATUS_FAILURE:
- store_results[1] += 1
- # Part 4, C.4.2.1.4.2
- _add_failed_instance(dataset)
- elif store_status[0] == STATUS_WARNING:
- store_results[2] += 1
- elif store_status[0] == STATUS_SUCCESS:
- store_results[3] += 1
-
- store_results[0] -= 1
-
- rsp.Identifier = None
- rsp.NumberOfRemainingSuboperations = store_results[0]
- rsp.NumberOfFailedSuboperations = store_results[1]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
-
- self.dimse.send_msg(rsp, cx_id)
-
- store_assoc.release()
-
- # Event handler has aborted or released - after any yields
- if not self.assoc.is_established:
- return
-
- # If not already done, send the final 'Success' or 'Warning' response
- if not store_results[1] and not store_results[2]:
- # Success response - no failures or warnings
- LOGGER.info(f"Move SCP Response {ii + 2}: 0x0000 (Success)")
- rsp.Status = 0x0000
- rsp.Identifier = None
- else:
- if no_suboperations == store_results[1]:
- # Failure response - all sub-operations failed
- LOGGER.info(f"Move SCP Response {ii + 2}: 0xA702 (Failure)")
- rsp.Status = 0xA702 # Unable to perform sub-ops
- else:
- # Warning response - one or more failures or warnings
- LOGGER.info(f"Move SCP Response {ii + 2}: 0xB000 (Warning)")
- rsp.Status = 0xB000
-
- # If Failure or Warning response, need to return an Identifier with
- # (0008, 0058) Failed SOP Instance UID List element
- ds = Dataset()
- ds.FailedSOPInstanceUIDList = failed_instances
- bytestream = encode(
- ds,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
- rsp.Identifier = BytesIO(cast(bytes, bytestream))
-
- rsp.NumberOfRemainingSuboperations = None
- rsp.NumberOfFailedSuboperations = store_results[1]
- rsp.NumberOfWarningSuboperations = store_results[2]
- rsp.NumberOfCompletedSuboperations = store_results[3]
-
- self.dimse.send_msg(rsp, cx_id)
-
-
-class BasicWorklistManagementServiceClass(QueryRetrieveServiceClass):
- """Implementation of the Basic Worklist Management Service Class."""
-
- statuses = QR_FIND_SERVICE_CLASS_STATUS
-
- def SCP(self, req: "_QR", context: "PresentationContext") -> None:
- """The SCP implementation for Basic Worklist Management.
-
- Parameters
- ----------
- req : dimse_primitives.C_FIND
- The C-FIND request primitive received from the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
- """
- if (
- isinstance(req, C_FIND)
- and context.abstract_syntax == "1.2.840.10008.5.1.4.31"
- ):
- self._c_find_scp(req, context)
- else:
- raise ValueError(
- "The supplied abstract syntax is not valid for use with the "
- "Basic Worklist Management Service Class"
- )
-
-
-class ColorPaletteQueryRetrieveServiceClass(QueryRetrieveServiceClass):
- """Implementation of the Color Palette QR Service."""
-
- pass
-
-
-class DefinedProcedureProtocolQueryRetrieveServiceClass(QueryRetrieveServiceClass):
- """Implementation of the Defined Procedure Protocol QR Service."""
-
- pass
-
-
-class HangingProtocolQueryRetrieveServiceClass(QueryRetrieveServiceClass):
- """Implementation of the Hanging Protocol QR Service."""
-
- pass
-
-
-class ImplantTemplateQueryRetrieveServiceClass(QueryRetrieveServiceClass):
- """Implementation of the Implant Template QR Service."""
-
- pass
-
-
-class NonPatientObjectStorageServiceClass(StorageServiceClass):
- """Implementation of the Non-Patient Object Storage Service"""
-
- statuses = NON_PATIENT_SERVICE_CLASS_STATUS
-
-
-class ProtocolApprovalQueryRetrieveServiceClass(QueryRetrieveServiceClass):
- """Implementation of the Protocol Approval QR Service."""
-
- pass
-
-
-class RelevantPatientInformationQueryServiceClass(ServiceClass):
- """Implementation of the Relevant Patient Information Query"""
-
- statuses = RELEVANT_PATIENT_SERVICE_CLASS_STATUS
-
- def SCP(self, req: C_FIND, context: "PresentationContext") -> None:
- """The SCP implementation for the Relevant Patient Information Query
- Service Class.
-
- Parameters
- ----------
- req : dimse_primitives.C_FIND
- The C-FIND request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
- """
- cx_id = cast(int, context.context_id)
- transfer_syntax = context.transfer_syntax[0]
-
- # Build C-FIND response primitive
- rsp = C_FIND()
- rsp.MessageID = req.MessageID
- rsp.MessageIDBeingRespondedTo = req.MessageID
- rsp.AffectedSOPClassUID = req.AffectedSOPClassUID
-
- # Decode and log Identifier
- if _config.LOG_REQUEST_IDENTIFIERS:
- try:
- identifier = decode(
- cast(BytesIO, req.Identifier),
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
- LOGGER.info("Find SCP Request Identifier:")
- LOGGER.info("")
- LOGGER.debug("# DICOM Dataset")
- for line in pretty_dataset(identifier):
- LOGGER.info(line)
- LOGGER.info("")
- except Exception:
- # The user should deal with decoding failures
- pass
-
- try:
- responses = evt.trigger(
- self.assoc,
- evt.EVT_C_FIND,
- {
- "request": req,
- "context": context.as_tuple,
- "_is_cancelled": self.is_cancelled,
- },
- )
- responses = cast(Iterator[UserReturnType], responses)
- (rsp_status, rsp_identifier) = next(responses)
- except (StopIteration, TypeError):
- # Event handler has aborted or released - before any yields
- if not self.assoc.is_established:
- return
-
- # There were no matches, so return Success
- # If success, then rsp_identifier is None
- rsp.Status = 0x0000
- LOGGER.info("Find SCP Response: 0x0000 (Success)")
- self.dimse.send_msg(rsp, cx_id)
- return
- except Exception as ex:
- LOGGER.error("Exception in handler bound to 'evt.EVT_C_FIND'")
- LOGGER.exception(ex)
- rsp.Status = 0xC311
- self.dimse.send_msg(rsp, cx_id)
- return
-
- # Event handler has aborted or released
- if not self.assoc.is_established:
- return
-
- rsp = self.validate_status(rsp_status, rsp)
-
- if rsp.Status in self.statuses:
- status = self.statuses[rsp.Status]
- else:
- # Unknown status
- self.dimse.send_msg(rsp, cx_id)
- return
-
- if status[0] == STATUS_CANCEL:
- # If cancel, then rsp_identifier is None
- LOGGER.info("Received C-CANCEL-FIND RQ from peer")
- LOGGER.info(f"Find SCP Response: 0x{rsp.Status:04X} (Cancel)")
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] == STATUS_FAILURE:
- # If failed, then rsp_identifier is None
- LOGGER.info(f"Find SCP Response: 0x{rsp.Status:04X} (Failure)")
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] == STATUS_SUCCESS:
- # User isn't supposed to send these, but handle anyway
- # If success, then rsp_identifier is None
- LOGGER.info("Find SCP Response: 0x0000 (Success)")
- self.dimse.send_msg(rsp, cx_id)
- return
- elif status[0] == STATUS_PENDING:
- # If pending, the rsp_identifier is the Identifier dataset
- rsp_identifier = cast(Dataset, rsp_identifier)
- enc = encode(
- rsp_identifier,
- transfer_syntax.is_implicit_VR,
- transfer_syntax.is_little_endian,
- transfer_syntax.is_deflated,
- )
- bytestream = BytesIO(cast(bytes, enc))
-
- if bytestream.getvalue() == b"":
- LOGGER.error("Failed encoding the response 'Identifier' dataset")
- # Failure: Unable to Process - Can't encode dataset
- # returned by handler
- rsp.Status = 0xC312
- self.dimse.send_msg(rsp, cx_id)
- return
-
- rsp.Identifier = bytestream
-
- LOGGER.info(f"Find SCP Response: 0x{rsp.Status:04X} (Pending)")
- if _config.LOG_RESPONSE_IDENTIFIERS:
- LOGGER.debug("Find SCP Response Identifier:")
- LOGGER.debug("")
- LOGGER.debug("# DICOM Dataset")
- for line in pretty_dataset(rsp_identifier):
- LOGGER.debug(line)
- LOGGER.debug("")
-
- # Send pending response
- self.dimse.send_msg(rsp, cx_id)
-
- # Send final success response
- rsp.Status = 0x0000
- LOGGER.info("Find SCP Response: 0x0000 (Success)")
- self.dimse.send_msg(rsp, cx_id)
-
-
-class SubstanceAdministrationQueryServiceClass(QueryRetrieveServiceClass):
- """Implementation of the Substance Administration Query Service"""
-
- statuses = SUBSTANCE_ADMINISTRATION_SERVICE_CLASS_STATUS
-
- def SCP(self, req: "_QR", context: "PresentationContext") -> None:
- """The SCP implementation for the Relevant Patient Information Query
- Service Class.
-
- Parameters
- ----------
- req : dimse_primitives.C_FIND
- The C-FIND request primitive sent by the peer.
- context : presentation.PresentationContext
- The presentation context that the SCP is operating under.
- """
- uids = ["1.2.840.10008.5.1.4.41", "1.2.840.10008.5.1.4.42"]
- if isinstance(req, C_FIND) and context.abstract_syntax in uids:
- self._c_find_scp(req, context)
- else:
- raise ValueError(
- "The supplied abstract syntax is not valid for use with the "
- "Substance Administration Query Service Class"
- )
diff --git a/dicom_server/pydicom_and_pynetdicom_libs/valuerep.py b/dicom_server/pydicom_and_pynetdicom_libs/valuerep.py
deleted file mode 100644
index 59e14898..00000000
--- a/dicom_server/pydicom_and_pynetdicom_libs/valuerep.py
+++ /dev/null
@@ -1,2167 +0,0 @@
-"""The original implementation of this module can be found at "https://github.com/pydicom/legacy_code/blob/master/pydicom/valuerep.py"""
-
-# Copyright 2008-2021 pydicom authors. See LICENSE file for details.
-"""Special classes for DICOM value representations (VR)"""
-
-import datetime
-from decimal import Decimal
-from enum import Enum, unique
-import re
-import sys
-from math import floor, isfinite, log10
-from typing import (
- TypeVar,
- Type,
- Tuple,
- Optional,
- List,
- Dict,
- Union,
- Any,
- Callable,
- MutableSequence,
- Sequence,
- cast,
- Iterator,
-)
-import warnings
-
-# don't import datetime_conversion directly
-from pydicom import config
-from pydicom.multival import MultiValue
-
-
-# can't import from charset or get circular import
-default_encoding = "iso8859"
-
-# Delimiters for text strings and person name that reset the encoding.
-# See PS3.5, Section 6.1.2.5.3
-# Note: We use character codes for Python 3
-# because those are the types yielded if iterating over a byte string.
-
-# Characters/Character codes for text VR delimiters: LF, CR, TAB, FF
-TEXT_VR_DELIMS = {0x0D, 0x0A, 0x09, 0x0C}
-
-# Character/Character code for PN delimiter: name part separator '^'
-# (the component separator '=' is handled separately)
-PN_DELIMS = {0x5E}
-
-# maximum allowed value length for string VRs
-# VRs with a maximum length of 2^32 (UR and UT) are not checked
-MAX_VALUE_LEN = {
- "AE": 16,
- "CS": 16,
- "DS": 16,
- "IS": 12,
- "LO": 64,
- "LT": 10240,
- "SH": 16,
- "ST": 1024,
- "UI": 64,
-}
-
-
-def _range_regex(regex: str) -> str:
- """Compose a regex that allows ranges of the given regex,
- as defined for VRs DA, DT and TM in PS 3.4, C.2.2.2.5.
- """
- return rf"^{regex}$|^\-{regex} ?$|^{regex}\- ?$|^{regex}\-{regex} ?$"
-
-
-# regular expressions to match valid values for some VRs
-VR_REGEXES = {
- "AE": r"^[\x20-\x7e]*$",
- "AS": r"^\d\d\d[DWMY]$",
- "CS": r"^[A-Z0-9 _]*$",
- "DS": r"^ *[+\-]?(\d+|\d+\.\d*|\.\d+)([eE][+\-]?\d+)? *$",
- "IS": r"^ *[+\-]?\d+ *$",
- "DA": _range_regex(r"\d{4}(0[1-9]|1[0-2])([0-2]\d|3[01])"),
- "DT": _range_regex(
- r"\d{4}((0[1-9]|1[0-2])(([0-2]\d|3[01])(([01]\d|2[0-3])"
- r"([0-5]\d((60|[0-5]\d)(\.\d{1,6} ?)?)?)?)?)?)?([+-][01]\d\d\d)?"
- ),
- "TM": _range_regex(r"([01]\d|2[0-3])([0-5]\d((60|[0-5]\d)(\.\d{1,6} ?)?)?)?"),
- "UI": r"^(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))*$",
- "UR": r"^[A-Za-z_\d:/?#\[\]@!$&'()*+,;=%\-.~]* *$",
-}
-
-STR_VR_REGEXES = {vr: re.compile(regex) for (vr, regex) in VR_REGEXES.items()}
-BYTE_VR_REGEXES = {vr: re.compile(regex.encode()) for (vr, regex) in VR_REGEXES.items()}
-
-
-def validate_type(
- vr: str, value: Any, types: Union[Type, Tuple[Type, Type]]
-) -> Tuple[bool, str]:
- """Checks for valid types for a given VR.
-
- Parameters
- ----------
- vr : str
- The value representation to validate against.
- value : Any
- The value to validate.
- types: Type or Tuple[Type]
- The type or tuple of types supported for the given VR.
-
- Returns
- -------
- A tuple of a boolean validation result and the error message.
- """
- if value is not None and not isinstance(value, types):
- return False, (
- f"A value of type '{type(value).__name__}' cannot be "
- f"assigned to a tag with VR {vr}."
- )
- return True, ""
-
-
-def validate_vr_length(vr: str, value: Any) -> Tuple[bool, str]:
- """Validate the value length for a given VR.
-
- Parameters
- ----------
- vr : str
- The value representation to validate against.
- value : Any
- The value to validate.
-
- Returns
- -------
- A tuple of a boolean validation result and the error message.
- """
- max_length = MAX_VALUE_LEN.get(vr, 0)
- if max_length > 0:
- value_length = len(value)
- if value_length > max_length:
- return False, (
- f"The value length ({value_length}) exceeds the "
- f"maximum length of {max_length} allowed for VR {vr}."
- )
- return True, ""
-
-
-def validate_type_and_length(vr: str, value: Any) -> Tuple[bool, str]:
- """Validate the correct type and the value length for a given VR.
-
- Parameters
- ----------
- vr : str
- The value representation to validate against.
- value : Any
- The value to validate.
-
- Returns
- -------
- A tuple of a boolean validation result and the error message.
- """
- valid, msg = validate_type(vr, value, (str, bytes))
- if not valid:
- return valid, msg
- return validate_vr_length(vr, value)
-
-
-def validate_regex(vr: str, value: Any) -> Tuple[bool, str]:
- """Validate the value for a given VR for allowed characters
- using a regular expression.
-
- Parameters
- ----------
- vr : str
- The value representation to validate against.
- value : Any
- The value to validate.
-
- Returns
- -------
- A tuple of a boolean validation result and the error message.
- """
- if value:
- regex: Any
- newline: Union[str, int]
- if isinstance(value, str):
- regex = STR_VR_REGEXES[vr]
- newline = "\n"
- else:
- regex = BYTE_VR_REGEXES[vr]
- newline = 10 # newline character
- if not re.match(regex, value) or value and value[-1] == newline:
- return False, f"Invalid value for VR {vr}: {value!r}."
- return True, ""
-
-
-def validate_type_and_regex(vr: str, value: Any) -> Tuple[bool, str]:
- """Validate that the value is of type :class:`str` or :class:`bytes`
- and that the value matches the VR-specific regular expression.
-
- Parameters
- ----------
- vr : str
- The value representation to validate against.
- value : Any
- The value to validate.
-
- Returns
- -------
- A tuple of a boolean validation result and the error message.
- """
- valid, msg = validate_type(vr, value, (str, bytes))
- if not valid:
- return valid, msg
- return validate_regex(vr, value)
-
-
-def validate_date_time(vr: str, value: Any, date_time_type: Type) -> Tuple[bool, str]:
- """Checks for valid values for date/time related VRs.
-
- Parameters
- ----------
- vr : str
- The value representation to validate against.
- value : Any
- The value to validate.
- date_time_type: type
- The specific type supported for the given VR (additional to str/bytes).
-
- Returns
- -------
- A tuple of a boolean validation result and the error message.
- """
-
- if value and isinstance(value, date_time_type):
- return True, ""
- return validate_type_and_regex(vr, value)
-
-
-def validate_length_and_type_and_regex(vr: str, value: Any) -> Tuple[bool, str]:
- """Validate the value for a given VR for maximum length, for the correct
- value type, and for allowed characters using a regular expression.
-
- Parameters
- ----------
- vr : str
- The value representation to validate against.
- value : Any
- The value to validate.
-
- Returns
- -------
- A tuple of a boolean validation result and the error message.
- """
- valid, msg = validate_type(vr, value, (str, bytes))
- if not valid:
- return valid, msg
- is_valid_len, msg1 = validate_vr_length(vr, value)
- is_valid_expr, msg2 = validate_regex(vr, value)
- msg = " ".join([msg1, msg2]).strip()
- if msg:
- msg += (
- " Please see for allowed values for each VR."
- )
- return is_valid_len and is_valid_expr, msg
-
-
-def validate_pn_component_length(vr: str, value: Any) -> Tuple[bool, str]:
- """Validate the PN component value for the maximum length.
-
- Parameters
- ----------
- vr : str
- Ignored.
- value : str
- The value to validate.
-
- Returns
- -------
- A tuple of a boolean validation result and the error message.
- """
- if len(value) > 64:
- return False, (
- f"The PN component length ({len(value)}) exceeds the "
- f"maximum allowed length of 64."
- )
- return True, ""
-
-
-def validate_pn(vr: str, value: Any) -> Tuple[bool, str]:
- """Validate the value for VR PN for the maximum number of components
- and for the maximum length of each component.
-
- Parameters
- ----------
- vr : str
- Ignored.
- value : str
- The value to validate.
-
- Returns
- -------
- A tuple of a boolean validation result and the error message.
- """
- if not value or isinstance(value, PersonName):
- return True, ""
- valid, msg = validate_type(vr, value, (str, bytes))
- if not valid:
- return valid, msg
- components: Sequence[Union[str, bytes]]
- if isinstance(value, bytes):
- components = value.split(b"=")
- else:
- components = value.split("=")
- if len(components) > 3:
- return False, (
- f"The number of PN components length ({len(components)}) exceeds "
- f"the maximum allowed number of 3."
- )
- for comp in components:
- valid, msg = validate_pn_component_length("PN", comp)
- if not valid:
- return False, msg
- return True, ""
-
-
-def validate_pn_component(value: Union[str, bytes]) -> None:
- """Validate the value of a single component of VR PN for maximum length.
-
- Parameters
- ----------
- value : str or bytes
- The component value to validate.
-
- Raises
- ------
- ValueError
- If the validation fails and the validation mode is set to
- `RAISE`.
- """
- validate_value(
- "PN",
- value,
- config.settings.writing_validation_mode,
- validate_pn_component_length,
- )
-
-
-VALUE_LENGTH = {"US": 2, "SS": 2, "UL": 4, "SL": 4, "UV": 8, "SV": 8, "FL": 4, "FD": 8}
-
-
-def validate_number(
- vr: str, value: Any, min_value: int, max_value: int
-) -> Tuple[bool, str]:
- """Validate the value for a numerical VR for type and allowed range.
-
- Parameters
- ----------
- vr : str
- The value representation to validate against.
- value : Any
- The value to validate.
- min_value : int
- The minimum allowed value.
- max_value : int
- The maximum allowed value.
-
- Returns
- -------
- A tuple of a boolean validation result and the error message.
- """
- valid, msg = validate_type(vr, value, (int, bytes))
- if not valid:
- return valid, msg
- if isinstance(value, int):
- if value < min_value or value > max_value:
- return False, (
- f"Invalid value: a value for a tag with VR {vr} must be "
- f"between {min_value} and {max_value}."
- )
- elif len(value) % VALUE_LENGTH[vr]:
- return False, (
- f"Invalid value length {len(value)}: the value length for a tag "
- f"with VR {vr} must be a multiple of {VALUE_LENGTH[vr]}."
- )
- return True, ""
-
-
-VALIDATORS = {
- "AE": validate_length_and_type_and_regex,
- "AS": validate_type_and_regex,
- "CS": validate_length_and_type_and_regex,
- "DA": lambda vr, value: validate_date_time(vr, value, datetime.date),
- "DS": validate_length_and_type_and_regex,
- "DT": lambda vr, value: validate_date_time(vr, value, datetime.datetime),
- "FD": lambda vr, value: validate_type(vr, value, (float, int)),
- "FL": lambda vr, value: validate_type(vr, value, (float, int)),
- "IS": validate_length_and_type_and_regex,
- "LO": validate_type_and_length,
- "LT": validate_type_and_length,
- "PN": validate_pn,
- "SH": validate_type_and_length,
- "SL": lambda vr, value: validate_number(vr, value, -0x80000000, 0x7FFFFFFF),
- "SS": lambda vr, value: validate_number(vr, value, -0x8000, 0x7FFF),
- "ST": validate_type_and_length,
- "SV": lambda vr, value: validate_number(
- vr, value, -0x8000000000000000, 0x7FFFFFFFFFFFFFFF
- ),
- "TM": lambda vr, value: validate_date_time(vr, value, datetime.time),
- "UI": validate_length_and_type_and_regex,
- "UL": lambda vr, value: validate_number(vr, value, 0, 0xFFFFFFFF),
- "US": lambda vr, value: validate_number(vr, value, 0, 0xFFFF),
- "UR": validate_type_and_regex,
- "UV": lambda vr, value: validate_number(vr, value, 0, 0xFFFFFFFFFFFFFFFF),
-}
-
-
-def validate_value(
- vr: str,
- value: Any,
- validation_mode: int,
- validator: Optional[Callable[[str, Any], Tuple[bool, str]]] = None,
-) -> None:
- """Validate the given value against the DICOM standard.
-
- Parameters
- ----------
- vr : str
- The VR of the tag the value is added to.
- value : Any
- The value to be validated.
- validation_mode : int
- Defines if values are validated and how validation errors are
- handled.
- validator : Callable or None
- Function that does the actual validation. If not given,
- the validator is taken from the VR-specific validator table instead.
-
- Raises
- ------
- ValueError
- If the validation fails and the validation mode is set to
- `RAISE`.
- """
- if validation_mode == config.IGNORE:
- return
-
- if value is not None:
- validator = validator or VALIDATORS.get(vr)
- if validator is not None:
- is_valid, msg = validator(vr, value)
- # if not is_valid:
- # if validation_mode == config.RAISE:
- # raise ValueError(msg)
- # warnings.warn(msg)
-
-
-@unique
-class VR(str, Enum):
- """DICOM Data Element's Value Representation (VR)"""
-
- # Standard VRs from Table 6.2-1 in Part 5
- AE = "AE"
- AS = "AS"
- AT = "AT"
- CS = "CS"
- DA = "DA"
- DS = "DS"
- DT = "DT"
- FD = "FD"
- FL = "FL"
- IS = "IS"
- LO = "LO"
- LT = "LT"
- OB = "OB"
- OD = "OD"
- OF = "OF"
- OL = "OL"
- OW = "OW"
- OV = "OV"
- PN = "PN"
- SH = "SH"
- SL = "SL"
- SQ = "SQ"
- SS = "SS"
- ST = "ST"
- SV = "SV"
- TM = "TM"
- UC = "UC"
- UI = "UI"
- UL = "UL"
- UN = "UN"
- UR = "UR"
- US = "US"
- UT = "UT"
- UV = "UV"
- # Ambiguous VRs from Tables 6-1, 7-1 and 8-1 in Part 6
- US_SS_OW = "US or SS or OW"
- US_SS = "US or SS"
- US_OW = "US or OW"
- OB_OW = "OB or OW"
-
-
-# Standard VRs from Table 6.2-1 in Part 5
-STANDARD_VR = {
- VR.AE,
- VR.AS,
- VR.AT,
- VR.CS,
- VR.DA,
- VR.DS,
- VR.DT,
- VR.FD,
- VR.FL,
- VR.IS,
- VR.LO,
- VR.LT,
- VR.OB,
- VR.OD,
- VR.OF,
- VR.OL,
- VR.OW,
- VR.OV,
- VR.PN,
- VR.SH,
- VR.SL,
- VR.SQ,
- VR.SS,
- VR.ST,
- VR.SV,
- VR.TM,
- VR.UC,
- VR.UI,
- VR.UL,
- VR.UN,
- VR.UR,
- VR.US,
- VR.UT,
- VR.UV,
-}
-# Ambiguous VRs from Tables 6-1, 7-1 and 8-1 in Part 6
-AMBIGUOUS_VR = {VR.US_SS_OW, VR.US_SS, VR.US_OW, VR.OB_OW}
-
-# Character Repertoire for VRs
-# Allowed character repertoire for str-like VRs, based off of the information
-# in Section 6.1.2 and Table 6.2-1 in Part 5
-# Basic G0 set of ISO 646 (ISO-IR 6) only
-DEFAULT_CHARSET_VR = {
- VR.AE,
- VR.AS,
- VR.CS,
- VR.DA,
- VR.DS,
- VR.DT,
- VR.IS,
- VR.TM,
- VR.UI,
- VR.UR,
-}
-# Basic G0 set of ISO 646 or extensible/replaceable by
-# (0008,0005) *Specific Character Set*
-CUSTOMIZABLE_CHARSET_VR = {VR.LO, VR.LT, VR.PN, VR.SH, VR.ST, VR.UC, VR.UT}
-
-# Corresponding Python built-in for each VR
-# For some VRs this is more a "fallback" class-like behavioural definition
-# than actual, and note that some VRs such as IS and DS are present in
-# multiple sets
-BYTES_VR = {VR.OB, VR.OD, VR.OF, VR.OL, VR.OV, VR.OW, VR.UN}
-FLOAT_VR = {VR.DS, VR.FD, VR.FL}
-INT_VR = {VR.AT, VR.IS, VR.SL, VR.SS, VR.SV, VR.UL, VR.US, VR.UV}
-LIST_VR = {VR.SQ}
-STR_VR = DEFAULT_CHARSET_VR | CUSTOMIZABLE_CHARSET_VR
-
-# These VRs may have backslash characters or encoded backslashes in the
-# value based off of the information in Table 6.2-1 in Part 5
-# DataElements with ambiguous VRs may use `bytes` values and so are allowed
-# to have backslashes (except 'US or SS')
-ALLOW_BACKSLASH = {VR.LT, VR.ST, VR.UT, VR.US_SS_OW, VR.US_OW, VR.OB_OW} | BYTES_VR
-
-# VRs which may have a value more than 1024 bytes or characters long
-# Used to flag which values may need shortening during printing
-LONG_VALUE_VR = {VR.LT, VR.UC, VR.UT} | BYTES_VR | AMBIGUOUS_VR
-
-# VRs that use 2 byte length fields for Explicit VR from Table 7.1-2 in Part 5
-# All other explicit VRs and all implicit VRs use 4 byte length fields
-EXPLICIT_VR_LENGTH_16 = {
- VR.AE,
- VR.AS,
- VR.AT,
- VR.CS,
- VR.DA,
- VR.DS,
- VR.DT,
- VR.FL,
- VR.FD,
- VR.IS,
- VR.LO,
- VR.LT,
- VR.PN,
- VR.SH,
- VR.SL,
- VR.SS,
- VR.ST,
- VR.TM,
- VR.UI,
- VR.UL,
- VR.US,
-}
-EXPLICIT_VR_LENGTH_32 = STANDARD_VR - EXPLICIT_VR_LENGTH_16
-
-
-class _DateTimeBase:
- """Base class for DT, DA and TM element sub-classes."""
-
- original_string: str
-
- # Add pickling support for the mutable additions
- def __getstate__(self) -> Dict[str, Any]:
- return self.__dict__.copy()
-
- def __setstate__(self, state: Dict[str, Any]) -> None:
- self.__dict__.update(state)
-
- def __reduce_ex__(self, protocol: int) -> Tuple[Any, ...]: # type: ignore[override]
- # Python 3.8 - protocol: SupportsIndex (added in 3.8)
- # datetime.time, and datetime.datetime return Tuple[Any, ...]
- # datetime.date doesn't define __reduce_ex__
- reduce_ex = cast(Tuple[Any, ...], super().__reduce_ex__(protocol))
- return reduce_ex + (self.__getstate__(),)
-
- def __str__(self) -> str:
- if hasattr(self, "original_string"):
- return self.original_string
-
- return super().__str__()
-
- def __repr__(self) -> str:
- return f'"{str(self)}"'
-
-
-class DA(_DateTimeBase, datetime.date):
- """Store value for an element with VR **DA** as :class:`datetime.date`.
-
- Note that the :class:`datetime.date` base class is immutable.
- """
-
- def __new__( # type: ignore[misc]
- cls: Type["DA"], *args: Any, **kwargs: Any
- ) -> Optional["DA"]:
- """Create an instance of DA object.
-
- Raise an exception if the string cannot be parsed or the argument
- is otherwise incompatible.
-
- The arguments (``*args`` and ``**kwargs``) are either the ones
- inherited from :class:`datetime.date`, or the first argument is
- a string conformant to the DA definition in the DICOM Standard,
- Part 5, :dcm:`Table 6.2-1`,
- or it is a :class:`datetime.date` object, or an object of type
- :class:`~pydicom.valuerep.DA`.
- """
- if not args or args[0] is None:
- return None
-
- val = args[0]
- if isinstance(val, str):
- if val.strip() == "":
- return None # empty date
-
- if len(val) == 8:
- year = int(val[0:4])
- month = int(val[4:6])
- day = int(val[6:8])
- return super().__new__(cls, year, month, day)
-
- if len(val) == 10 and val[4] == "." and val[7] == ".":
- # ACR-NEMA Standard 300, predecessor to DICOM
- # for compatibility with a few old pydicom example files
- year = int(val[0:4])
- month = int(val[5:7])
- day = int(val[8:10])
- return super().__new__(cls, year, month, day)
-
- if isinstance(val, datetime.date):
- return super().__new__(cls, val.year, val.month, val.day)
-
- try:
- return super().__new__(cls, *args, **kwargs)
- except Exception as exc:
- raise ValueError(f"Unable to convert '{val}' to 'DA' object") from exc
-
- def __init__(self, *args: Any, **kwargs: Any) -> None:
- """Create a new **DA** element value."""
- val = args[0]
- if isinstance(val, str):
- self.original_string = val
- elif isinstance(val, DA) and hasattr(val, "original_string"):
- self.original_string = val.original_string
- elif isinstance(val, datetime.date):
- self.original_string = f"{val.year}{val.month:02}{val.day:02}"
-
-
-class DT(_DateTimeBase, datetime.datetime):
- """Store value for an element with VR **DT** as :class:`datetime.datetime`.
-
- Note that the :class:`datetime.datetime` base class is immutable.
- """
-
- _regex_dt = re.compile(r"((\d{4,14})(\.(\d{1,6}))?)([+-]\d{4})?")
-
- @staticmethod
- def _utc_offset(value: str) -> datetime.timezone:
- """Return the UTC Offset suffix as a :class:`datetime.timezone`.
-
- Parameters
- ----------
- value : str
- The value of the UTC offset suffix, such as ``'-1000'`` or
- ``'+0245'``.
-
- Returns
- -------
- datetime.timezone
- """
- # Format is &ZZXX, & = '+' or '-', ZZ is hours, XX is minutes
- hour = int(value[1:3]) * 60 # Convert hours to minutes
- minute = int(value[3:5]) # In minutes
- offset = (hour + minute) * 60 # Convert minutes to seconds
- offset = -offset if value[0] == "-" else offset
-
- return datetime.timezone(datetime.timedelta(seconds=offset), name=value)
-
- def __new__( # type: ignore[misc]
- cls: Type["DT"], *args: Any, **kwargs: Any
- ) -> Optional["DT"]:
- """Create an instance of DT object.
-
- Raise an exception if the string cannot be parsed or the argument
- is otherwise incompatible.
-
- The arguments (``*args`` and ``**kwargs``) are either the ones
- inherited from :class:`datetime.datetime`, or the first argument is
- a string conformant to the DT definition in the DICOM Standard,
- Part 5, :dcm:`Table 6.2-1`,
- or it is a :class:`datetime.datetime` object, or an object of type
- :class:`~pydicom.valuerep.DT`.
- """
- if not args or args[0] is None:
- return None
-
- val = args[0]
- if isinstance(val, str):
- if val.strip() == "":
- return None
-
- match = cls._regex_dt.match(val)
- if not match or len(val) > 26:
- raise ValueError(
- f"Unable to convert non-conformant value '{val}' to 'DT' " "object"
- )
-
- dt_match = match.group(2)
- args = (
- int(dt_match[0:4]), # year
- 1 if len(dt_match) < 6 else int(dt_match[4:6]), # month
- 1 if len(dt_match) < 8 else int(dt_match[6:8]), # day
- )
- kwargs = {
- "hour": 0 if len(dt_match) < 10 else int(dt_match[8:10]),
- "minute": 0 if len(dt_match) < 12 else int(dt_match[10:12]),
- "second": 0 if len(dt_match) < 14 else int(dt_match[12:14]),
- "microsecond": 0,
- }
- if len(dt_match) >= 14 and match.group(4):
- kwargs["microsecond"] = int(match.group(4).rstrip().ljust(6, "0"))
-
- # Timezone offset
- tz_match = match.group(5)
- kwargs["tzinfo"] = cls._utc_offset(tz_match) if tz_match else None
-
- # DT may include a leap second which isn't allowed by datetime
- if kwargs["second"] == 60:
- warnings.warn(
- "'datetime.datetime' doesn't allow a value of '60' for "
- "the seconds component, changing to '59'"
- )
- kwargs["second"] = 59
-
- return super().__new__(cls, *args, **kwargs)
-
- if isinstance(val, datetime.datetime):
- return super().__new__(
- cls, *val.timetuple()[:6], val.microsecond, val.tzinfo
- )
-
- try:
- return super().__new__(cls, *args, **kwargs)
- except Exception as exc:
- raise ValueError(f"Unable to convert '{val}' to 'DT' object") from exc
-
- def __init__(self, *args: Any, **kwargs: Any) -> None:
- """Create a new **DT** element value."""
- val = args[0]
- if isinstance(val, str):
- self.original_string = val
- elif isinstance(val, DT) and hasattr(val, "original_string"):
- self.original_string = val.original_string
- elif isinstance(val, datetime.datetime):
- self.original_string = (
- f"{val.year:04}{val.month:02}{val.day:02}"
- f"{val.hour:02}{val.minute:02}{val.second:02}"
- )
- # milliseconds are seldom used, add them only if needed
- if val.microsecond > 0:
- self.original_string += f".{val.microsecond:06}"
-
- if val.tzinfo is not None:
- # offset: Optional[datetime.timedelta]
- offset = val.tzinfo.utcoffset(val)
- if offset is not None:
- offset_min = offset.days * 24 * 60 + offset.seconds // 60
- sign = "+" if offset_min >= 0 else "-"
- offset_min = abs(offset_min)
- self.original_string += (
- f"{sign}{offset_min // 60:02}{offset_min % 60:02}"
- )
-
-
-class TM(_DateTimeBase, datetime.time):
- """Store value for an element with VR **TM** as :class:`datetime.time`.
-
- Note that the :class:`datetime.time` base class is immutable.
- """
-
- _RE_TIME = re.compile(
- r"(?P^([01][0-9]|2[0-3]))"
- r"((?P([0-5][0-9]))"
- r"((?P([0-5][0-9]|60))"
- r"(\.(?P([0-9]{1,6})?))?)?)?$"
- )
-
- def __new__( # type: ignore[misc]
- cls: Type["TM"], *args: Any, **kwargs: Any
- ) -> Optional["TM"]:
- """Create an instance of TM object from a string.
-
- Raise an exception if the string cannot be parsed or the argument
- is otherwise incompatible.
-
- The arguments (``*args`` and ``**kwargs``) are either the ones
- inherited from :class:`datetime.time`, or the first argument is
- a string conformant to the TM definition in the DICOM Standard,
- Part 5, :dcm:`Table 6.2-1`,
- or it is a :class:`datetime.time` object, or an object of type
- :class:`~pydicom.valuerep.TM`.
- """
- if not args or args[0] is None:
- return None
-
- val = args[0]
- if isinstance(val, str):
- if val.strip() == "":
- return None # empty time
-
- match = cls._RE_TIME.match(val)
- if not match:
- raise ValueError(
- f"Unable to convert non-conformant value '{val}' to 'TM' " "object"
- )
-
- hour = int(match.group("h"))
- minute = 0 if match.group("m") is None else int(match.group("m"))
- second = 0 if match.group("s") is None else int(match.group("s"))
-
- if second == 60:
- warnings.warn(
- "'datetime.time' doesn't allow a value of '60' for the "
- "seconds component, changing to '59'"
- )
- second = 59
-
- microsecond = 0
- if match.group("ms"):
- microsecond = int(match.group("ms").rstrip().ljust(6, "0"))
-
- return super().__new__(cls, hour, minute, second, microsecond)
-
- if isinstance(val, datetime.time):
- return super().__new__(
- cls, val.hour, val.minute, val.second, val.microsecond
- )
-
- try:
- return super().__new__(cls, *args, **kwargs)
- except Exception as exc:
- raise ValueError(f"Unable to convert '{val}' to 'TM' object") from exc
-
- def __init__(self, *args: Any, **kwargs: Any) -> None:
- super().__init__()
- val = args[0]
- if isinstance(val, str):
- self.original_string = val
- elif isinstance(val, TM) and hasattr(val, "original_string"):
- self.original_string = val.original_string
- elif isinstance(val, datetime.time):
- self.original_string = f"{val.hour:02}{val.minute:02}{val.second:02}"
- # milliseconds are seldom used, add them only if needed
- if val.microsecond > 0:
- self.original_string += f".{val.microsecond:06}"
-
-
-def is_valid_ds(s: str) -> bool:
- """Check whether this string is a valid decimal string.
-
- Valid decimal strings must be 16 characters or fewer, and contain only
- characters from a limited set.
-
- Parameters
- ----------
- s: str
- String to test.
-
- Returns
- -------
- bool
- True if the string is a valid decimal string. Otherwise False.
- """
- return validate_length_and_type_and_regex("DS", s)[0]
-
-
-def format_number_as_ds(val: Union[float, Decimal]) -> str:
- """Truncate a float's representation to give a valid Decimal String (DS).
-
- DICOM's decimal string (DS) representation is limited to strings with 16
- characters and a limited set of characters. This function represents a
- float that satisfies these constraints while retaining as much
- precision as possible. Some floats are represented using scientific
- notation to make more efficient use of the limited number of characters.
-
- Note that this will incur a loss of precision if the number cannot be
- represented with 16 characters. Furthermore, non-finite floats (infs and
- nans) cannot be represented as decimal strings and will cause an error to
- be raised.
-
- Parameters
- ----------
- val: Union[float, Decimal]
- The floating point value whose representation is required.
-
- Returns
- -------
- str
- String representation of the float satisfying the constraints of the
- decimal string representation.
-
- Raises
- ------
- ValueError
- If val does not represent a finite value
-
- """
- if not isinstance(val, (float, Decimal)):
- raise TypeError("'val' must be of type float or decimal.Decimal")
- if not isfinite(val):
- raise ValueError(
- "Cannot encode non-finite floats as DICOM decimal strings. " f"Got '{val}'"
- )
-
- valstr = str(val)
-
- # In the simple case, the default python string representation
- # will do
- if len(valstr) <= 16:
- return valstr
-
- # Decide whether to use scientific notation
- logval = log10(cast(Union[float, Decimal], abs(val)))
-
- # Characters needed for '-' at start
- sign_chars = 1 if val < 0.0 else 0
-
- # Numbers larger than 1e14 cannot be correctly represented by truncating
- # their string representations to 16 chars, e.g pi * 10^13 would become
- # '314159265358979.', which may not be universally understood. This limit
- # is 1e13 for negative numbers because of the minus sign.
- # For negative exponents, the point of equal precision between scientific
- # and standard notation is 1e-4 e.g. '0.00031415926535' and
- # '3.1415926535e-04' are both 16 chars
- use_scientific = logval < -4 or logval >= (14 - sign_chars)
-
- if use_scientific:
- # In principle, we could have a number where the exponent
- # needs three digits to be represented (bigger than this cannot be
- # represented by floats). Due to floating point limitations
- # this is best checked for by doing the string conversion
- remaining_chars = 10 - sign_chars
- trunc_str = f"{val:.{remaining_chars}e}"
- if len(trunc_str) > 16:
- trunc_str = f"{val:.{remaining_chars - 1}e}"
- return trunc_str
- else:
- if logval >= 1.0:
- # chars remaining for digits after sign, digits left of '.' and '.'
- remaining_chars = 14 - sign_chars - int(floor(logval))
- else:
- remaining_chars = 14 - sign_chars
- return f"{val:.{remaining_chars}f}"
-
-
-class DSfloat(float):
- """Store value for an element with VR **DS** as :class:`float`.
-
- If constructed from an empty string, return the empty string,
- not an instance of this class.
-
- Parameters
- ----------
- val: Union[str, int, float, Decimal]
- Value to store as a DS.
- auto_format: bool
- If True, automatically format the string representation of this
- number to ensure it satisfies the constraints in the DICOM standard.
- Note that this will lead to loss of precision for some numbers.
-
- """
-
- auto_format: bool
-
- def __new__( # type: ignore[misc]
- cls: Type["DSfloat"],
- val: Union[None, str, int, float, Decimal],
- auto_format: bool = False,
- validation_mode: int = None,
- ) -> Optional[Union[str, "DSfloat"]]:
- if val is None:
- return val
-
- if isinstance(val, str) and val.strip() == "":
- return val
-
- return super().__new__(cls, val)
-
- def __init__(
- self,
- val: Union[str, int, float, Decimal],
- auto_format: bool = False,
- validation_mode: int = None,
- ) -> None:
- """Store the original string if one given, for exact write-out of same
- value later.
- """
- if validation_mode is None:
- validation_mode = config.settings.reading_validation_mode
-
- # ... also if user changes a data element value, then will get
- # a different object, because float is immutable.
- has_attribute = hasattr(val, "original_string")
- pre_checked = False
- if isinstance(val, str):
- self.original_string = val.strip()
- elif isinstance(val, (DSfloat, DSdecimal)):
- if val.auto_format:
- auto_format = True # override input parameter
- pre_checked = True
- if has_attribute:
- self.original_string = val.original_string
-
- self.auto_format = auto_format
- if self.auto_format and not pre_checked:
- # If auto_format is True, keep the float value the same, but change
- # the string representation stored in original_string if necessary
- if hasattr(self, "original_string"):
- if not is_valid_ds(self.original_string):
- self.original_string = format_number_as_ds(
- float(self.original_string)
- )
- else:
- self.original_string = format_number_as_ds(self)
-
- if validation_mode == config.RAISE and not self.auto_format:
- if len(str(self)) > 16:
- raise OverflowError(
- "Values for elements with a VR of 'DS' must be <= 16 "
- "characters long, but the float provided requires > 16 "
- "characters to be accurately represented. Use a smaller "
- "string, set 'config.settings.reading_validation_mode' to "
- "'WARN' to override the length check, or "
- "explicitly construct a DS object with 'auto_format' "
- "set to True"
- )
- if not is_valid_ds(str(self)):
- # This will catch nan and inf
- raise ValueError(
- f'Value "{str(self)}" is not valid for elements with a VR ' "of DS"
- )
-
- def __eq__(self, other: Any) -> Any:
- """Override to allow string equality comparisons."""
- if isinstance(other, str):
- return str(self) == other
-
- return super().__eq__(other)
-
- def __hash__(self) -> int:
- return super().__hash__()
-
- def __ne__(self, other: Any) -> Any:
- return not self == other
-
- def __str__(self) -> str:
- if hasattr(self, "original_string") and not self.auto_format:
- return self.original_string
-
- # Issue #937 (Python 3.8 compatibility)
- return repr(self)[1:-1]
-
- def __repr__(self) -> str:
- if self.auto_format and hasattr(self, "original_string"):
- return f"'{self.original_string}'"
-
- return f"'{super().__repr__()}'"
-
-
-class DSdecimal(Decimal):
- """Store value for an element with VR **DS** as :class:`decimal.Decimal`.
-
- Parameters
- ----------
- val: Union[str, int, float, Decimal]
- Value to store as a DS.
- auto_format: bool
- If True, automatically format the string representation of this
- number to ensure it satisfies the constraints in the DICOM standard.
- Note that this will lead to loss of precision for some numbers.
-
- Notes
- -----
- If constructed from an empty string, returns the empty string, not an
- instance of this class.
-
- """
-
- auto_format: bool
-
- def __new__( # type: ignore[misc]
- cls: Type["DSdecimal"],
- val: Union[None, str, int, float, Decimal],
- auto_format: bool = False,
- validation_mode: int = None,
- ) -> Optional[Union[str, "DSdecimal"]]:
- """Create an instance of DS object, or return a blank string if one is
- passed in, e.g. from a type 2 DICOM blank value.
-
- Parameters
- ----------
- val : str or numeric
- A string or a number type which can be converted to a decimal.
- """
- if val is None:
- return val
-
- if isinstance(val, str) and val.strip() == "":
- return val
-
- if isinstance(val, float) and not config.allow_DS_float:
- raise TypeError(
- "'DS' cannot be instantiated with a float value unless "
- "'config.allow_DS_float' is set to True. You should convert "
- "the value to a string with the desired number of digits, "
- "or use 'Decimal.quantize()' and pass a 'Decimal' instance."
- )
-
- return super().__new__(cls, val)
-
- def __init__(
- self,
- val: Union[str, int, float, Decimal],
- auto_format: bool = False,
- validation_mode: int = None,
- ) -> None:
- """Store the original string if one given, for exact write-out of same
- value later. E.g. if set ``'1.23e2'``, :class:`~decimal.Decimal` would
- write ``'123'``, but :class:`DS` will use the original.
- """
- if validation_mode is None:
- validation_mode = config.settings.reading_validation_mode
-
- # ... also if user changes a data element value, then will get
- # a different Decimal, as Decimal is immutable.
- pre_checked = False
- if isinstance(val, str):
- self.original_string = val.strip()
- elif isinstance(val, (DSfloat, DSdecimal)):
- if val.auto_format:
- auto_format = True # override input parameter
- pre_checked = True
-
- if hasattr(val, "original_string"):
- self.original_string = val.original_string
-
- self.auto_format = auto_format
- if self.auto_format and not pre_checked:
- # If auto_format is True, keep the float value the same, but change
- # the string representation stored in original_string if necessary
- if hasattr(self, "original_string"):
- if not is_valid_ds(self.original_string):
- self.original_string = format_number_as_ds(
- float(self.original_string)
- )
- else:
- self.original_string = format_number_as_ds(self)
-
- if validation_mode != config.IGNORE:
- if len(repr(self).strip("'")) > 16:
- msg = (
- "Values for elements with a VR of 'DS' values must be "
- "<= 16 characters long. Use a smaller string, set "
- "'config.settings.reading_validation_mode' to "
- "'WARN' to override the length check, use "
- "'Decimal.quantize()' and initialize "
- "with a 'Decimal' instance, or explicitly construct a DS "
- "instance with 'auto_format' set to True"
- )
- if validation_mode == config.RAISE:
- raise OverflowError(msg)
- warnings.warn(msg)
- if not is_valid_ds(repr(self).strip("'")):
- # This will catch nan and inf
- msg = (
- f'Value "{str(self)}" is not valid for elements with a VR ' "of DS"
- )
- if validation_mode == config.RAISE:
- raise ValueError(msg)
- warnings.warn(msg)
-
- def __eq__(self, other: Any) -> Any:
- """Override to allow string equality comparisons."""
- if isinstance(other, str):
- return str(self) == other
-
- return super().__eq__(other)
-
- def __hash__(self) -> int:
- return super().__hash__()
-
- def __ne__(self, other: Any) -> Any:
- return not self == other
-
- def __str__(self) -> str:
- has_str = hasattr(self, "original_string")
- if has_str and len(self.original_string) <= 16:
- return self.original_string
-
- return super().__str__()
-
- def __repr__(self) -> str:
- if self.auto_format and hasattr(self, "original_string"):
- return f"'{self.original_string}'"
- return f"'{str(self)}'"
-
-
-# CHOOSE TYPE OF DS
-DSclass: Any
-if config.use_DS_decimal:
- DSclass = DSdecimal
-else:
- DSclass = DSfloat
-
-
-def DS(
- val: Union[None, str, int, float, Decimal],
- auto_format: bool = False,
- validation_mode: int = None,
-) -> Union[None, str, DSfloat, DSdecimal]:
- """Factory function for creating DS class instances.
-
- Checks for blank string; if so, returns that, else calls :class:`DSfloat`
- or :class:`DSdecimal` to create the class instance. This avoids overriding
- ``DSfloat.__new__()`` (which carries a time penalty for large arrays of
- DS).
-
- Similarly the string clean and check can be avoided and :class:`DSfloat`
- called directly if a string has already been processed.
- """
- if val is None:
- return val
-
- if validation_mode is None:
- validation_mode = config.settings.reading_validation_mode
-
- if isinstance(val, str):
- if val.strip() == "":
- return val
- validate_value("DS", val, validation_mode)
-
- if config.use_DS_decimal:
- return DSdecimal(val, auto_format, validation_mode)
-
- return DSfloat(val, auto_format, validation_mode)
-
-
-class ISfloat(float):
- """Store value for an element with VR **IS** as :class:`float`.
-
- Stores original integer string for exact rewriting of the string
- originally read or stored.
-
- Note: By the DICOM standard, IS can only be an :class:`int`,
- however, it is not uncommon to see float IS values. This class
- is used if the config settings allow non-strict reading.
-
- Generally, use :class:`~pydicom.valuerep.IS` to create IS values,
- this is returned instead if the value cannot be represented as an
- :class:`int`. See :class:`~pydicom.valuerep.IS` for details of the
- parameters and return values.
- """
-
- def __new__( # type: ignore[misc]
- cls: Type["ISfloat"],
- val: Union[str, float, Decimal],
- validation_mode: int = None,
- ) -> float:
- return super().__new__(cls, val)
-
- def __init__(
- self, val: Union[str, float, Decimal], validation_mode: int = None
- ) -> None:
- # If a string passed, then store it
- if isinstance(val, str):
- self.original_string = val.strip()
- elif isinstance(val, (IS, ISfloat)) and hasattr(val, "original_string"):
- self.original_string = val.original_string
- if validation_mode:
- msg = f'Value "{str(self)}" is not valid for elements with a VR ' "of IS"
- if validation_mode == config.WARN:
- warnings.warn(msg)
- elif validation_mode == config.RAISE:
- msg += "\nSet reading_validation_mode to WARN or IGNORE to bypass"
- raise TypeError(msg)
-
-
-class IS(int):
- """Store value for an element with VR **IS** as :class:`int`.
-
- Stores original integer string for exact rewriting of the string
- originally read or stored.
- """
-
- def __new__( # type: ignore[misc]
- cls: Type["IS"],
- val: Union[None, str, int, float, Decimal],
- validation_mode: int = None,
- ) -> Optional[Union[str, "IS", "ISfloat"]]:
- """Create instance if new integer string"""
- if val is None:
- return val
-
- if validation_mode is None:
- validation_mode = config.settings.reading_validation_mode
-
- if isinstance(val, str):
- if val.strip() == "":
- return val
- validate_value("IS", val, validation_mode)
-
- try:
- newval: Union[IS, ISfloat] = super().__new__(cls, val)
- except ValueError:
- # accept float strings when no integer loss, e.g. "1.0"
- newval = super().__new__(cls, float(val))
-
- # If a float or Decimal was passed in, check for non-integer,
- # i.e. could lose info if converted to int
- # If so, create an ISfloat instead (if allowed by settings)
- if isinstance(val, (float, Decimal, str)) and newval != float(val):
- newval = ISfloat(val, validation_mode)
-
- # Checks in case underlying int is >32 bits, DICOM does not allow this
- if not -(2**31) <= newval < 2**31 and validation_mode == config.RAISE:
- raise OverflowError(
- "Elements with a VR of IS must have a value between -2**31 "
- "and (2**31 - 1). Set "
- "'config.settings.reading_validation_mode' to "
- "'WARN' to override the value check"
- )
-
- return newval
-
- def __init__(
- self, val: Union[str, int, float, Decimal], validation_mode: int = None
- ) -> None:
- # If a string passed, then store it
- if isinstance(val, str):
- self.original_string = val.strip()
- elif isinstance(val, IS) and hasattr(val, "original_string"):
- self.original_string = val.original_string
-
- def __eq__(self, other: Any) -> Any:
- """Override to allow string equality comparisons."""
- if isinstance(other, str):
- return str(self) == other
-
- return super().__eq__(other)
-
- def __hash__(self) -> int:
- return super().__hash__()
-
- def __ne__(self, other: Any) -> Any:
- return not self == other
-
- def __str__(self) -> str:
- if hasattr(self, "original_string"):
- return self.original_string
-
- # Issue #937 (Python 3.8 compatibility)
- return repr(self)[1:-1]
-
- def __repr__(self) -> str:
- return f"'{super().__repr__()}'"
-
-
-_T = TypeVar("_T")
-
-
-def MultiString(
- val: str, valtype: Optional[Callable[[str], _T]] = None, validation_mode: int = None
-) -> Union[_T, MutableSequence[_T]]:
- """Split a string by delimiters if there are any
-
- Parameters
- ----------
- val : str
- The string to split up.
- valtype : type or callable, optional
- Default :class:`str`, but can be e.g. :class:`~pydicom.uid.UID` to
- overwrite to a specific type.
- validation_mode : int
- Defines if values are validated and how validation errors are
- handled.
-
- Returns
- -------
- valtype or MultiValue of valtype
- The split value as `valtype` or a :class:`list` of `valtype`.
- """
- if valtype is None:
- valtype = cast(Callable[[str], _T], str)
-
- # Remove trailing blank used to pad to even length
- # 2005.05.25: also check for trailing 0, error made
- # in PET files we are converting
- while val and val.endswith((" ", "\x00")):
- val = val[:-1]
-
- splitup: List[str] = val.split("\\")
- if len(splitup) == 1:
- return valtype(splitup[0])
-
- return MultiValue(valtype, splitup, validation_mode)
-
-
-def _verify_encodings(
- encodings: Optional[Union[str, Sequence[str]]]
-) -> Optional[Tuple[str, ...]]:
- """Checks the encoding to ensure proper format"""
- if encodings is None:
- return None
-
- if isinstance(encodings, str):
- return (encodings,)
-
- return tuple(encodings)
-
-
-def _decode_personname(
- components: Sequence[bytes], encodings: Sequence[str]
-) -> Tuple[str, ...]:
- """Return a list of decoded person name components.
-
- Parameters
- ----------
- components : list of bytes
- The list of the up to three encoded person name components
- encodings : list of str
- The Python encodings uses to decode `components`.
-
- Returns
- -------
- text type
- The unicode string representing the person name.
- If the decoding of some component parts is not possible using the
- given encodings, they are decoded with the first encoding using
- replacement characters for bytes that cannot be decoded.
- """
- from pydicom.charset import decode_bytes
-
- comps = [decode_bytes(c, encodings, PN_DELIMS) for c in components]
-
- # Remove empty elements from the end to avoid trailing '='
- while len(comps) and not comps[-1]:
- comps.pop()
-
- return tuple(comps)
-
-
-def _encode_personname(components: Sequence[str], encodings: Sequence[str]) -> bytes:
- """Encode a list of text string person name components.
-
- Parameters
- ----------
- components : list of str
- The list of the up to three unicode person name components
- encodings : list of str
- The Python encodings uses to encode `components`.
-
- Returns
- -------
- byte string
- The byte string that can be written as a PN DICOM tag value.
- If the encoding of some component parts is not possible using the
- given encodings, they are encoded with the first encoding using
- replacement bytes for characters that cannot be encoded.
- """
- from pydicom.charset import encode_string
-
- encoded_comps = []
- for comp in components:
- groups = [encode_string(group, encodings) for group in comp.split("^")]
- encoded_comp = b"^".join(groups)
- encoded_comps.append(encoded_comp)
-
- # Remove empty elements from the end
- while len(encoded_comps) and not encoded_comps[-1]:
- encoded_comps.pop()
- return b"=".join(encoded_comps)
-
-
-class PersonName:
- """Representation of the value for an element with VR **PN**."""
-
- def __new__( # type: ignore[misc]
- cls: Type["PersonName"], *args: Any, **kwargs: Any
- ) -> Optional["PersonName"]:
- if len(args) and args[0] is None:
- return None
-
- return super().__new__(cls)
-
- def __init__(
- self,
- val: Union[bytes, str, "PersonName"],
- encodings: Optional[Sequence[str]] = None,
- original_string: Optional[bytes] = None,
- validation_mode: int = None,
- ) -> None:
- """Create a new ``PersonName``.
-
- Parameters
- ----------
- val: str, bytes, PersonName
- The value to use for the **PN** element.
- encodings: list of str, optional
- A list of the encodings used for the value.
- original_string: bytes, optional
- When creating a ``PersonName`` using a decoded string, this is the
- original encoded value.
-
- Notes
- -----
- A :class:`PersonName` may also be constructed by specifying individual
- components using the :meth:`from_named_components` and
- :meth:`from_named_components_veterinary` class methods.
- """
- self.original_string: bytes
- self._components: Optional[Tuple[str, ...]] = None
- self.encodings: Optional[Tuple[str, ...]]
- if validation_mode is None:
- validation_mode = config.settings.reading_validation_mode
- self.validation_mode = validation_mode
-
- if isinstance(val, PersonName):
- encodings = val.encodings
- self.original_string = val.original_string
- self._components = tuple(str(val).split("="))
- elif isinstance(val, bytes):
- # this is the raw byte string - decode it on demand
- self.original_string = val
- validate_value("PN", val, validation_mode)
- self._components = None
- else:
- # val: str
- # `val` is the decoded person name value
- # `original_string` should be the original encoded value
- self.original_string = cast(bytes, original_string)
- # if we don't have the byte string at this point, we at least
- # validate the length of the string components
- validate_value(
- "PN", original_string if original_string else val, validation_mode
- )
- components = val.split("=")
- # Remove empty elements from the end to avoid trailing '='
- while len(components) and not components[-1]:
- components.pop()
- self._components = tuple(components)
-
- # if the encoding is not given, leave it as undefined (None)
- self.encodings = _verify_encodings(encodings)
-
- def _create_dict(self) -> Dict[str, str]:
- """Creates a dictionary of person name group and component names.
-
- Used exclusively for `formatted` for backwards compatibility.
- """
- parts = [
- "family_name",
- "given_name",
- "middle_name",
- "name_prefix",
- "name_suffix",
- "ideographic",
- "phonetic",
- ]
- return {c: getattr(self, c, "") for c in parts}
-
- @property
- def components(self) -> Tuple[str, ...]:
- """Returns up to three decoded person name components as a
- :class:`tuple` of :class:`str`.
-
- .. versionadded:: 1.2
-
- Returns
- -------
- Tuple[str, ...]
- The (alphabetic, ideographic, phonetic) components of the
- decoded person name. Any of the components may be absent.
- """
- if self._components is None:
- groups = self.original_string.split(b"=")
- encodings = self.encodings or [default_encoding]
- self._components = _decode_personname(groups, encodings)
-
- return self._components
-
- def _name_part(self, i: int) -> str:
- """Return the `i`th part of the name."""
- try:
- return self.components[0].split("^")[i]
- except IndexError:
- return ""
-
- @property
- def family_name(self) -> str:
- """Return the first (family name) group of the alphabetic person name
- representation as a unicode string
-
- .. versionadded:: 1.2
- """
- return self._name_part(0)
-
- @property
- def given_name(self) -> str:
- """Return the second (given name) group of the alphabetic person name
- representation as a unicode string
-
- .. versionadded:: 1.2
- """
- return self._name_part(1)
-
- @property
- def middle_name(self) -> str:
- """Return the third (middle name) group of the alphabetic person name
- representation as a unicode string
-
- .. versionadded:: 1.2
- """
- return self._name_part(2)
-
- @property
- def name_prefix(self) -> str:
- """Return the fourth (name prefix) group of the alphabetic person name
- representation as a unicode string
-
- .. versionadded:: 1.2
- """
- return self._name_part(3)
-
- @property
- def name_suffix(self) -> str:
- """Return the fifth (name suffix) group of the alphabetic person name
- representation as a unicode string
-
- .. versionadded:: 1.2
- """
- return self._name_part(4)
-
- @property
- def alphabetic(self) -> str:
- """Return the first (alphabetic) person name component as a
- unicode string
- """
- try:
- return self.components[0]
- except IndexError:
- return ""
-
- @property
- def ideographic(self) -> str:
- """Return the second (ideographic) person name component as a
- unicode string
-
- .. versionadded:: 1.2
- """
- try:
- return self.components[1]
- except IndexError:
- return ""
-
- @property
- def phonetic(self) -> str:
- """Return the third (phonetic) person name component as a
- unicode string
-
- .. versionadded:: 1.2
- """
- try:
- return self.components[2]
- except IndexError:
- return ""
-
- def __eq__(self, other: Any) -> Any:
- """Return ``True`` if `other` equals the current name."""
- return str(self) == other
-
- def __ne__(self, other: Any) -> Any:
- """Return ``True`` if `other` doesn't equal the current name."""
- return not self == other
-
- def __str__(self) -> str:
- """Return a string representation of the name."""
- return "=".join(self.components).__str__()
-
- def __iter__(self) -> Iterator[str]:
- """Iterate through the name."""
- yield from self.__str__()
-
- def __len__(self) -> int:
- """Return the length of the person name."""
- return len(self.__str__())
-
- def __contains__(self, x: Any) -> bool:
- """Return ``True`` if `x` is in the name."""
- return x in self.__str__()
-
- def __repr__(self) -> str:
- """Return a representation of the name."""
- return "=".join(self.components).__repr__()
-
- def __hash__(self) -> int:
- """Return a hash of the name."""
- return hash(self.components)
-
- def decode(self, encodings: Optional[Sequence[str]] = None) -> "PersonName":
- """Return the patient name decoded by the given `encodings`.
-
- Parameters
- ----------
- encodings : list of str, optional
- The list of encodings used for decoding the byte string. If not
- given, the initial encodings set in the object are used.
-
- Returns
- -------
- valuerep.PersonName
- A person name object that will return the decoded string with
- the given encodings on demand. If the encodings are not given,
- the current object is returned.
- """
- # in the common case (encoding did not change) we decode on demand
- if encodings is None or encodings == self.encodings:
- return self
-
- # the encoding was unknown or incorrect - create a new
- # PersonName object with the changed encoding
- encodings = _verify_encodings(encodings)
- if self.original_string is None:
- # if the original encoding was not set, we set it now
- self.original_string = _encode_personname(
- self.components, self.encodings or [default_encoding]
- )
- # now that we have the byte length, we re-validate the value
- validate_value("PN", self.original_string, self.validation_mode)
-
- return PersonName(self.original_string, encodings)
-
- def encode(self, encodings: Optional[Sequence[str]] = None) -> bytes:
- """Return the patient name decoded by the given `encodings`.
-
- Parameters
- ----------
- encodings : list of str, optional
- The list of encodings used for encoding the unicode string. If
- not given, the initial encodings set in the object are used.
-
- Returns
- -------
- bytes
- The person name encoded with the given encodings as a byte string.
- If no encoding is given, the original byte string is returned, if
- available, otherwise each group of the patient name is encoded
- with the first matching of the given encodings.
- """
- encodings = _verify_encodings(encodings) or self.encodings
-
- # if the encoding is not the original encoding, we have to return
- # a re-encoded string (without updating the original string)
- if encodings != self.encodings and self.encodings is not None:
- return _encode_personname(self.components, cast(Sequence[str], encodings))
-
- if self.original_string is None:
- # if the original encoding was not set, we set it now
- self.original_string = _encode_personname(
- self.components, encodings or [default_encoding]
- )
-
- return self.original_string
-
- def family_comma_given(self) -> str:
- """Return the name as "Family, Given"."""
- return f"{self.family_name}, {self.given_name}"
-
- def formatted(self, format_str: str) -> str:
- """Return the name as a :class:`str` formatted using `format_str`."""
- return format_str % self._create_dict()
-
- def __bool__(self) -> bool:
- """Return ``True`` if the name is not empty."""
- if not self.original_string:
- return bool(self.components) and (
- len(self.components) > 1 or bool(self.components[0])
- )
-
- return bool(self.original_string)
-
- @staticmethod
- def _encode_component_groups(
- alphabetic_group: Sequence[Union[str, bytes]],
- ideographic_group: Sequence[Union[str, bytes]],
- phonetic_group: Sequence[Union[str, bytes]],
- encodings: Optional[List[str]] = None,
- ) -> bytes:
- """Creates a byte string for a person name from lists of parts.
-
- Each of the three component groups (alphabetic, ideographic, phonetic)
- are supplied as a list of components.
-
- Parameters
- ----------
- alphabetic_group: Sequence[Union[str, bytes]]
- List of components for the alphabetic group.
- ideographic_group: Sequence[Union[str, bytes]]
- List of components for the ideographic group.
- phonetic_group: Sequence[Union[str, bytes]]
- List of components for the phonetic group.
- encodings: Optional[List[str]]
- A list of encodings used for the other input parameters.
-
- Returns
- -------
- bytes:
- Bytes string representation of the person name.
-
- Raises
- ------
- ValueError:
- If any of the input strings contain disallowed characters:
- '\\' (single backslash), '^', '='.
- """
- from pydicom.charset import encode_string, decode_bytes
-
- def enc(s: str) -> bytes:
- return encode_string(s, encodings or [default_encoding])
-
- def dec(s: bytes) -> str:
- return decode_bytes(s, encodings or [default_encoding], set())
-
- encoded_component_sep = enc("^")
- encoded_group_sep = enc("=")
-
- disallowed_chars = ["\\", "=", "^"]
-
- def standardize_encoding(val: Union[str, bytes]) -> bytes:
- # Return a byte encoded string regardless of the input type
- # This allows the user to supply a mixture of str and bytes
- # for different parts of the input
- if isinstance(val, bytes):
- val_enc = val
- val_dec = dec(val)
- else:
- val_enc = enc(val)
- val_dec = val
-
- # Check for disallowed chars in the decoded string
- for c in disallowed_chars:
- if c in val_dec:
- raise ValueError(f"Strings may not contain the {c} character")
-
- # Return the encoded string
- return val_enc
-
- def make_component_group(components: Sequence[Union[str, bytes]]) -> bytes:
- encoded_components = [standardize_encoding(c) for c in components]
- joined_components = encoded_component_sep.join(encoded_components)
- return joined_components.rstrip(encoded_component_sep)
-
- component_groups: List[bytes] = [
- make_component_group(alphabetic_group),
- make_component_group(ideographic_group),
- make_component_group(phonetic_group),
- ]
- joined_groups: bytes = encoded_group_sep.join(component_groups)
- joined_groups = joined_groups.rstrip(encoded_group_sep)
- return joined_groups
-
- @classmethod
- def from_named_components(
- cls,
- family_name: Union[str, bytes] = "",
- given_name: Union[str, bytes] = "",
- middle_name: Union[str, bytes] = "",
- name_prefix: Union[str, bytes] = "",
- name_suffix: Union[str, bytes] = "",
- family_name_ideographic: Union[str, bytes] = "",
- given_name_ideographic: Union[str, bytes] = "",
- middle_name_ideographic: Union[str, bytes] = "",
- name_prefix_ideographic: Union[str, bytes] = "",
- name_suffix_ideographic: Union[str, bytes] = "",
- family_name_phonetic: Union[str, bytes] = "",
- given_name_phonetic: Union[str, bytes] = "",
- middle_name_phonetic: Union[str, bytes] = "",
- name_prefix_phonetic: Union[str, bytes] = "",
- name_suffix_phonetic: Union[str, bytes] = "",
- encodings: Optional[List[str]] = None,
- ) -> "PersonName":
- """Construct a PersonName from explicit named components.
-
- The DICOM standard describes human names using five components:
- family name, given name, middle name, name prefix, and name suffix.
- Any component may be an empty string (the default) if not used.
- A component may contain multiple space-separated words if there
- are, for example, multiple given names, middle names, or titles.
-
- Additionally, each component may be represented in ideographic or
- phonetic form in addition to (or instead of) alphabetic form.
-
- For more information see the following parts of the DICOM standard:
- - :dcm:`Value Representations `
- - :dcm:`PN Examples `
- - :dcm:`PN Precise semantics `
-
- Example
- -------
- A case with multiple given names and suffixes (DICOM standard,
- part 5, sect 6.2.1.1):
-
- >>> pn = PersonName.from_named_components(
- family_name='Adams',
- given_name='John Robert Quincy',
- name_prefix='Rev.',
- name_suffix='B.A. M.Div.'
- )
-
- A Korean case with phonetic and ideographic representations (PS3.5-2008
- section I.2 p. 108):
-
- >>> pn = PersonName.from_named_components(
- family_name='Hong',
- given_name='Gildong',
- family_name_ideographic='洪',
- given_name_ideographic='吉洞',
- family_name_phonetic='홍',
- given_name_phonetic='길동',
- encodings=[default_encoding, 'euc_kr']
- )
-
- Parameters
- ----------
- family_name: Union[str, bytes]
- Family name in alphabetic form.
- given_name: Union[str, bytes]
- Given name in alphabetic form.
- middle_name: Union[str, bytes]
- Middle name in alphabetic form.
- name_prefix: Union[str, bytes]
- Name prefix in alphabetic form, e.g. 'Mrs.', 'Dr.', 'Sr.', 'Rev.'.
- name_suffix: Union[str, bytes]
- Name prefix in alphabetic form, e.g. 'M.D.', 'B.A., M.Div.',
- 'Chief Executive Officer'.
- family_name_ideographic: Union[str, bytes]
- Family name in ideographic form.
- given_name_ideographic: Union[str, bytes]
- Given name in ideographic form.
- middle_name_ideographic: Union[str, bytes]
- Middle name in ideographic form.
- name_prefix_ideographic: Union[str, bytes]
- Name prefix in ideographic form.
- name_suffix_ideographic: Union[str, bytes]
- Name suffix in ideographic form.
- family_name_phonetic: Union[str, bytes]
- Family name in phonetic form.
- given_name_phonetic: Union[str, bytes]
- Given name in phonetic form.
- middle_name_phonetic: Union[str, bytes]
- Middle name in phonetic form.
- name_prefix_phonetic: Union[str, bytes]
- Name prefix in phonetic form.
- name_suffix_phonetic: Union[str, bytes]
- Name suffix in phonetic form.
- encodings: Optional[List[str]]
- A list of encodings used for the other input parameters.
-
- Returns
- -------
- PersonName:
- PersonName constructed from the supplied components.
-
- Notes
- -----
- Strings may not contain the following characters: '^', '=',
- or the backslash character.
- """
- alphabetic_group: List[Union[str, bytes]] = [
- family_name,
- given_name,
- middle_name,
- name_prefix,
- name_suffix,
- ]
-
- # Ideographic component group
- ideographic_group: List[Union[str, bytes]] = [
- family_name_ideographic,
- given_name_ideographic,
- middle_name_ideographic,
- name_prefix_ideographic,
- name_suffix_ideographic,
- ]
-
- # Phonetic component group
- phonetic_group: List[Union[str, bytes]] = [
- family_name_phonetic,
- given_name_phonetic,
- middle_name_phonetic,
- name_prefix_phonetic,
- name_suffix_phonetic,
- ]
-
- encoded_value: bytes = cls._encode_component_groups(
- alphabetic_group,
- ideographic_group,
- phonetic_group,
- encodings,
- )
-
- return cls(encoded_value, encodings=encodings)
-
- @classmethod
- def from_named_components_veterinary(
- cls,
- responsible_party_name: Union[str, bytes] = "",
- patient_name: Union[str, bytes] = "",
- responsible_party_name_ideographic: Union[str, bytes] = "",
- patient_name_ideographic: Union[str, bytes] = "",
- responsible_party_name_phonetic: Union[str, bytes] = "",
- patient_name_phonetic: Union[str, bytes] = "",
- encodings: Optional[List[str]] = None,
- ) -> "PersonName":
- """Construct a PersonName from explicit named components following the
- veterinary usage convention.
-
- The DICOM standard describes names for veterinary use with two components:
- responsible party family name OR responsible party organization name,
- and patient name.
- Any component may be an empty string (the default) if not used.
- A component may contain multiple space-separated words if necessary.
-
- Additionally, each component may be represented in ideographic or
- phonetic form in addition to (or instead of) alphabetic form.
-
- For more information see the following parts of the DICOM standard:
- - :dcm:`Value Representations `
- - :dcm:`PN Examples `
- - :dcm:`PN Precise semantics `
-
- Example
- -------
-
- A horse whose responsible organization is named "ABC Farms", and whose
- name is "Running On Water"
-
- >>> pn = PersonName.from_named_components_veterinary(
- responsible_party_name='ABC Farms',
- patient_name='Running on Water'
- )
-
- Parameters
- ----------
- responsible_party_name: Union[str, bytes]
- Name of the responsible party in alphabetic form. This may be
- either the family name of the responsible party, or the
- name of the responsible organization.
- patient_name: Union[str, bytes]
- Patient name in alphabetic form.
- responsible_party_name_ideographic: Union[str, bytes]
- Name of the responsible party in ideographic form.
- patient_name_ideographic: Union[str, bytes]
- Patient name in ideographic form.
- responsible_party_name_phonetic: Union[str, bytes]
- Name of the responsible party in phonetic form.
- patient_name_phonetic: Union[str, bytes]
- Patient name in phonetic form.
- encodings: Optional[List[str]]
- A list of encodings used for the other input parameters
-
- Returns
- -------
- PersonName:
- PersonName constructed from the supplied components
-
- Notes
- -----
- Strings may not contain the following characters: '^', '=',
- or the backslash character.
- """
- alphabetic_group: List[Union[str, bytes]] = [
- responsible_party_name,
- patient_name,
- ]
-
- ideographic_group: List[Union[str, bytes]] = [
- responsible_party_name_ideographic,
- patient_name_ideographic,
- ]
-
- phonetic_group: List[Union[str, bytes]] = [
- responsible_party_name_phonetic,
- patient_name_phonetic,
- ]
-
- encoded_value: bytes = cls._encode_component_groups(
- alphabetic_group, ideographic_group, phonetic_group, encodings
- )
-
- return cls(encoded_value, encodings=encodings)
-
-
-# Alias old class names for backwards compat in user code
-def __getattr__(name: str) -> Any:
- if name == "PersonNameUnicode":
- warnings.warn(
- "'PersonNameUnicode' is deprecated and will be removed in "
- "pydicom v3.0, use 'PersonName' instead",
- DeprecationWarning,
- )
- return globals()["PersonName"]
-
- raise AttributeError(f"module {__name__} has no attribute {name}")
-
-
-if sys.version_info[:2] < (3, 7):
- PersonNameUnicode = PersonName
diff --git a/dicom_server/requirements.txt b/dicom_server/requirements.txt
deleted file mode 100644
index af9290f3..00000000
--- a/dicom_server/requirements.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-pydicom==2.4.4
-pynetdicom==2.0.1
-pylibjpeg
-pylibjpeg-libjpeg
-pylibjpeg-openjpeg
-sqlalchemy
-requests
-redis
-schedule
-faker
-jwt
-dependency-injector
-aenum
-pytest
-pytz
-overpy
\ No newline at end of file
diff --git a/dicom_server/services/blackhole_service.py b/dicom_server/services/blackhole_service.py
deleted file mode 100644
index 52f566af..00000000
--- a/dicom_server/services/blackhole_service.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from abc import ABC, abstractmethod
-
-
-class IBlackhole(ABC):
-
- @abstractmethod
- def block_scanners() -> None:
- pass
-
- @abstractmethod
- def allow_scanners() -> None:
- pass
diff --git a/dicom_server/services/dicom_database_service.py b/dicom_server/services/dicom_database_service.py
deleted file mode 100644
index 1dff85ac..00000000
--- a/dicom_server/services/dicom_database_service.py
+++ /dev/null
@@ -1,89 +0,0 @@
-from contextlib import contextmanager
-from typing import List, Any
-from pynetdicom.apps.qrscp import db
-from abc import ABC, abstractmethod
-
-
-class IDicomDatabase(ABC):
-
- def __init__(self, engine: Any, storage_directory: str, database_file: str) -> None:
- """Initialize the database."""
- pass
-
- @abstractmethod
- @contextmanager
- def session_scope(self):
- """Yields a session."""
- yield
-
- @abstractmethod
- def initialize_database(self) -> None:
- """Clears and fill the database from DICOM files."""
- pass
-
- @abstractmethod
- def fill_database_tables_from_dicom_files(self) -> None:
- """Reads DICOM files and adds data to the database."""
- pass
-
- @abstractmethod
- def delete_database(self) -> None:
- """Deletes all data from the database."""
- pass
-
- @abstractmethod
- def query_all_studies(self) -> List[db.Study]:
- """Returns all Study data."""
- pass
-
- @abstractmethod
- def query_all_series(self) -> List[db.Series]:
- """Returns all Series data."""
- pass
-
- @abstractmethod
- def query_all_patients(self) -> List[db.Patient]:
- """Returns all Patient data."""
- pass
-
- @abstractmethod
- def query_study_level(self, identifier: Any) -> List[db.Study]:
- """Returns studies matching the identifier."""
- pass
-
- @abstractmethod
- def query_series_level(self, identifier: Any) -> List[db.Series]:
- """Returns series matching the identifier."""
- pass
-
- @abstractmethod
- def query_patient_level(self, identifier: Any) -> List[db.Patient]:
- """Returns patients matching th identifier."""
- pass
-
- @abstractmethod
- def get_unique_studies(self, instances: List[db.Study]) -> List[db.Study]:
- """Returns unique study_instance_uid."""
- pass
-
- # Pynetdicom does not support retrieval on SERIES level that is why retrieving series depends on the STUDY level
- @abstractmethod
- def get_uniqueSeries(self, instances: List[db.Study], identifier: Any) -> List[str]:
- """Returns unique series_instance_uid."""
- pass
-
- @abstractmethod
- def get_unique_patients(self, instances: List[db.Patient]) -> List[str]:
- """Returns unique patient_id."""
- pass
-
- @abstractmethod
- def get_other_levels_tags(
- self, level: str, required_tag: str, query_identifier: Any
- ) -> Any:
- """
- Retrieves the value of the specified 'required_tag' while building datasets'.
-
- Return: The requested tag value, or None if not found.
- """
- pass
diff --git a/dicom_server/services/dicom_session_service.py b/dicom_server/services/dicom_session_service.py
deleted file mode 100644
index c5775396..00000000
--- a/dicom_server/services/dicom_session_service.py
+++ /dev/null
@@ -1,39 +0,0 @@
-from abc import ABC, abstractmethod
-
-
-class ISessionCollector(ABC):
-
- @abstractmethod
- def session_started(self, ip, port, version_name) -> None:
- """Start the DICOM session on association request recieved"""
- pass
-
- @abstractmethod
- def collect_session_info(self, params, sub_process_finished: bool = False) -> None:
- """Collect session information within multiple dicom requests"""
- pass
-
- @abstractmethod
- def session_ended(self) -> None:
- """Finalize a DICOM session on release or abort request"""
- pass
-
- @abstractmethod
- def reset_session(self) -> None:
- """Reset session_data object to default values"""
- pass
-
- @abstractmethod
- def set_session_lock(self, value) -> None:
- """Lock changing session info until it ends"""
- pass
-
- @abstractmethod
- def session_locked(self) -> bool:
- """Check the status of the current session"""
- pass
-
- @abstractmethod
- def set_session_id(self, session_id) -> None:
- """Set an identifier to the current session"""
- pass
diff --git a/dicom_server/services/integrity_checker_service.py b/dicom_server/services/integrity_checker_service.py
deleted file mode 100644
index b1079613..00000000
--- a/dicom_server/services/integrity_checker_service.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from abc import ABC, abstractmethod
-
-
-class IIntegrityChecker(ABC):
- @abstractmethod
- def hash_file(self, filename):
- pass
-
- @abstractmethod
- def check_hashes(self):
- pass
diff --git a/dicom_server/services/loggers_service.py b/dicom_server/services/loggers_service.py
deleted file mode 100644
index 6ee4e26e..00000000
--- a/dicom_server/services/loggers_service.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from abc import ABC, abstractmethod
-
-
-class ILoggers(ABC):
- @abstractmethod
- def setup_logger(name, log_directory, level, when, interval, formatter) -> None:
- pass
diff --git a/dicom_server/services/osm_service.py b/dicom_server/services/osm_service.py
deleted file mode 100644
index 49afb93b..00000000
--- a/dicom_server/services/osm_service.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from abc import ABC, abstractmethod
-from typing import List
-
-
-class IOSMService(ABC):
-
- @abstractmethod
- def get_medical_institutions(self) -> List[str]:
- pass
-
- @abstractmethod
- def refresh_cache(self) -> bool:
- pass
-
- @abstractmethod
- def is_cache_valid(self) -> bool:
- pass
\ No newline at end of file
diff --git a/dicom_server/services/redis_service.py b/dicom_server/services/redis_service.py
deleted file mode 100644
index 5be2f732..00000000
--- a/dicom_server/services/redis_service.py
+++ /dev/null
@@ -1,41 +0,0 @@
-from abc import ABC, abstractmethod
-from typing import Dict, Set, Any
-
-
-class IRedisService(ABC):
-
- @abstractmethod
- def is_ip_scanned(self, ip: str) -> bool:
- pass
-
- @abstractmethod
- def add_scanned_ip(self, ip: str) -> None:
- pass
-
- @abstractmethod
- def add_reputation_data(self, rep_dat: dict) -> None:
- pass
-
- @abstractmethod
- def add_request_data(self, redis_log_data: str) -> None:
- pass
-
- @abstractmethod
- def get_TCI_existing_studies(self) -> Set[str]:
- pass
-
- @abstractmethod
- def add_TCI_study(self, study_uid: str) -> None:
- pass
-
- @abstractmethod
- def add_injected_file(self, patient_name: str, modality: str) -> None:
- pass
-
- @abstractmethod
- def get_honey_url(self) -> str:
- pass
-
- @abstractmethod
- def update_files_integrity_state(self, changed_files: dict) -> None:
- pass
diff --git a/dicom_server/services/tci_services.py b/dicom_server/services/tci_services.py
deleted file mode 100644
index 3134be69..00000000
--- a/dicom_server/services/tci_services.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from abc import ABC, abstractmethod
-
-
-class ITCIAAPI(ABC):
-
- def get_studies_based_on_modalities(self, mod) -> dict:
- pass
-
- @abstractmethod
- def get_access_token(self) -> None:
- """Get Access token from TCIA API"""
- pass
-
- def refresh_access_token(self) -> None:
- pass
-
- @abstractmethod
- def get_new_files(self, existing_studies, tcia_dir) -> None:
- """call TCIA API, get new DICOM files and store them at tcia_dir"""
-
- pass
-
-
-class ITCIAScheduler(ABC):
-
- @abstractmethod
- def schedule_files_retrieval(self) -> None:
- """Schedule retrieval process"""
- pass
-
-
-class ITCIAManager(ABC):
-
- @abstractmethod
- def change_dicom_files(self, arg) -> None:
- pass
diff --git a/dicom_server/services/threat_intelligence_service.py b/dicom_server/services/threat_intelligence_service.py
deleted file mode 100644
index 48be757b..00000000
--- a/dicom_server/services/threat_intelligence_service.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from abc import ABC, abstractmethod
-
-
-class IThreatIntelligence(ABC):
- @abstractmethod
- def get_reputation_data(self, rep_dat, ip, ip_scanned) -> dict:
- pass
-
- def getVirusTotalScore(self, ip) -> dict:
- pass
-
- def getIpqualityScore(self, ip) -> dict:
- pass
-
- def getIPSecurityScore(self, ip) -> dict:
- pass
diff --git a/dicom_server/storage/blackhole_list.txt b/dicom_server/storage/blackhole_list.txt
deleted file mode 100644
index 6b4c5c33..00000000
--- a/dicom_server/storage/blackhole_list.txt
+++ /dev/null
@@ -1,17391 +0,0 @@
-
-#172.18.192.1 # test windows machine
-
-129.82.138.12 # pinger1a.netsec.colostate.edu
-129.82.138.31 # pinger1.netsec.colostate.edu
-129.82.138.32 # pinger2.netsec.colostate.edu
-129.82.138.33 # pinger3.netsec.colostate.edu
-129.82.138.34 # pinger4.netsec.colostate.edu
-129.82.138.44 # pinger6.netsec.colostate.edu
-
-128.9.63.138 # pinger-e1.ant.isi.edu
-203.178.148.18 # pinger-j1.ant.isi.edu
-128.9.29.128 # pinger-w1.ant.isi.edu
-128.9.29.129 # pinger-w2.ant.isi.edu
-128.9.29.130 # pinger-w3.ant.isi.edu
-128.9.29.131 # pinger-w4.ant.isi.edu
-
-67.21.36.100 # researchscanner100.eecs.berkeley.edu
-67.21.36.101 # researchscanner101.eecs.berkeley.edu
-67.21.36.102 # researchscanner102.eecs.berkeley.edu
-67.21.36.103 # researchscanner103.eecs.berkeley.edu
-67.21.36.104 # researchscanner104.eecs.berkeley.edu
-67.21.36.105 # researchscanner105.eecs.berkeley.edu
-67.21.36.106 # researchscanner106.eecs.berkeley.edu
-67.21.36.107 # researchscanner107.eecs.berkeley.edu
-67.21.36.108 # researchscanner108.eecs.berkeley.edu
-67.21.36.109 # researchscanner109.eecs.berkeley.edu
-67.21.36.10 # researchscanner10.eecs.berkeley.edu
-67.21.36.110 # researchscanner110.eecs.berkeley.edu
-67.21.36.111 # researchscanner111.eecs.berkeley.edu
-67.21.36.112 # researchscanner112.eecs.berkeley.edu
-67.21.36.113 # researchscanner113.eecs.berkeley.edu
-67.21.36.114 # researchscanner114.eecs.berkeley.edu
-67.21.36.115 # researchscanner115.eecs.berkeley.edu
-67.21.36.116 # researchscanner116.eecs.berkeley.edu
-67.21.36.117 # researchscanner117.eecs.berkeley.edu
-67.21.36.118 # researchscanner118.eecs.berkeley.edu
-67.21.36.119 # researchscanner119.eecs.berkeley.edu
-67.21.36.11 # researchscanner11.eecs.berkeley.edu
-67.21.36.120 # researchscanner120.eecs.berkeley.edu
-67.21.36.121 # researchscanner121.eecs.berkeley.edu
-67.21.36.122 # researchscanner122.eecs.berkeley.edu
-67.21.36.123 # researchscanner123.eecs.berkeley.edu
-67.21.36.124 # researchscanner124.eecs.berkeley.edu
-67.21.36.125 # researchscanner125.eecs.berkeley.edu
-67.21.36.126 # researchscanner126.eecs.berkeley.edu
-67.21.36.127 # researchscanner127.eecs.berkeley.edu
-67.21.36.128 # researchscanner128.eecs.berkeley.edu
-67.21.36.129 # researchscanner129.eecs.berkeley.edu
-67.21.36.12 # researchscanner12.eecs.berkeley.edu
-67.21.36.130 # researchscanner130.eecs.berkeley.edu
-67.21.36.131 # researchscanner131.eecs.berkeley.edu
-67.21.36.133 # researchscanner133.eecs.berkeley.edu
-67.21.36.134 # researchscanner134.eecs.berkeley.edu
-67.21.36.135 # researchscanner135.eecs.berkeley.edu
-67.21.36.136 # researchscanner136.eecs.berkeley.edu
-67.21.36.137 # researchscanner137.eecs.berkeley.edu
-67.21.36.138 # researchscanner138.eecs.berkeley.edu
-67.21.36.139 # researchscanner139.eecs.berkeley.edu
-67.21.36.13 # researchscanner13.eecs.berkeley.edu
-67.21.36.140 # researchscanner140.eecs.berkeley.edu
-67.21.36.141 # researchscanner141.eecs.berkeley.edu
-67.21.36.142 # researchscanner142.eecs.berkeley.edu
-67.21.36.143 # researchscanner143.eecs.berkeley.edu
-67.21.36.144 # researchscanner144.eecs.berkeley.edu
-67.21.36.145 # researchscanner145.eecs.berkeley.edu
-67.21.36.146 # researchscanner146.eecs.berkeley.edu
-67.21.36.147 # researchscanner147.eecs.berkeley.edu
-67.21.36.148 # researchscanner148.eecs.berkeley.edu
-67.21.36.149 # researchscanner149.eecs.berkeley.edu
-67.21.36.14 # researchscanner14.eecs.berkeley.edu
-67.21.36.150 # researchscanner150.eecs.berkeley.edu
-67.21.36.151 # researchscanner151.eecs.berkeley.edu
-67.21.36.152 # researchscanner152.eecs.berkeley.edu
-67.21.36.153 # researchscanner153.eecs.berkeley.edu
-67.21.36.155 # researchscanner155.eecs.berkeley.edu
-67.21.36.156 # researchscanner156.eecs.berkeley.edu
-67.21.36.157 # researchscanner157.eecs.berkeley.edu
-67.21.36.158 # researchscanner158.eecs.berkeley.edu
-67.21.36.159 # researchscanner159.eecs.berkeley.edu
-67.21.36.15 # researchscanner15.eecs.berkeley.edu
-67.21.36.160 # researchscanner160.eecs.berkeley.edu
-67.21.36.161 # researchscanner161.eecs.berkeley.edu
-67.21.36.162 # researchscanner162.eecs.berkeley.edu
-67.21.36.163 # researchscanner163.eecs.berkeley.edu
-67.21.36.164 # researchscanner164.eecs.berkeley.edu
-67.21.36.165 # researchscanner165.eecs.berkeley.edu
-67.21.36.166 # researchscanner166.eecs.berkeley.edu
-67.21.36.167 # researchscanner167.eecs.berkeley.edu
-67.21.36.16 # researchscanner16.eecs.berkeley.edu
-67.21.36.170 # researchscanner170.eecs.berkeley.edu
-67.21.36.171 # researchscanner171.eecs.berkeley.edu
-67.21.36.172 # researchscanner172.eecs.berkeley.edu
-67.21.36.173 # researchscanner173.eecs.berkeley.edu
-67.21.36.174 # researchscanner174.eecs.berkeley.edu
-67.21.36.175 # researchscanner175.eecs.berkeley.edu
-67.21.36.176 # researchscanner176.eecs.berkeley.edu
-67.21.36.177 # researchscanner177.eecs.berkeley.edu
-67.21.36.178 # researchscanner178.eecs.berkeley.edu
-67.21.36.179 # researchscanner179.eecs.berkeley.edu
-67.21.36.17 # researchscanner17.eecs.berkeley.edu
-67.21.36.180 # researchscanner180.eecs.berkeley.edu
-67.21.36.181 # researchscanner181.eecs.berkeley.edu
-67.21.36.182 # researchscanner182.eecs.berkeley.edu
-67.21.36.183 # researchscanner183.eecs.berkeley.edu
-67.21.36.184 # researchscanner184.eecs.berkeley.edu
-67.21.36.185 # researchscanner185.eecs.berkeley.edu
-67.21.36.186 # researchscanner186.eecs.berkeley.edu
-67.21.36.187 # researchscanner187.eecs.berkeley.edu
-67.21.36.188 # researchscanner188.eecs.berkeley.edu
-67.21.36.189 # researchscanner189.eecs.berkeley.edu
-67.21.36.18 # researchscanner18.eecs.berkeley.edu
-67.21.36.190 # researchscanner190.eecs.berkeley.edu
-67.21.36.192 # researchscanner192.eecs.berkeley.edu
-67.21.36.194 # researchscanner194.eecs.berkeley.edu
-67.21.36.195 # researchscanner195.eecs.berkeley.edu
-67.21.36.196 # researchscanner196.eecs.berkeley.edu
-67.21.36.197 # researchscanner197.eecs.berkeley.edu
-67.21.36.198 # researchscanner198.eecs.berkeley.edu
-67.21.36.19 # researchscanner19.eecs.berkeley.edu
-67.21.36.1 # researchscanner01.eecs.berkeley.edu
-67.21.36.200 # researchscanner200.eecs.berkeley.edu
-67.21.36.201 # researchscanner201.eecs.berkeley.edu
-67.21.36.202 # researchscanner202.eecs.berkeley.edu
-67.21.36.203 # researchscanner203.eecs.berkeley.edu
-67.21.36.204 # researchscanner204.eecs.berkeley.edu
-67.21.36.205 # researchscanner205.eecs.berkeley.edu
-67.21.36.207 # researchscanner207.eecs.berkeley.edu
-67.21.36.209 # researchscanner209.eecs.berkeley.edu
-67.21.36.20 # researchscanner20.eecs.berkeley.edu
-67.21.36.210 # researchscanner210.eecs.berkeley.edu
-67.21.36.211 # researchscanner211.eecs.berkeley.edu
-67.21.36.212 # researchscanner212.eecs.berkeley.edu
-67.21.36.213 # researchscanner213.eecs.berkeley.edu
-67.21.36.214 # researchscanner214.eecs.berkeley.edu
-67.21.36.215 # researchscanner215.eecs.berkeley.edu
-67.21.36.216 # researchscanner216.eecs.berkeley.edu
-67.21.36.217 # researchscanner217.eecs.berkeley.edu
-67.21.36.218 # researchscanner218.eecs.berkeley.edu
-67.21.36.219 # researchscanner219.eecs.berkeley.edu
-67.21.36.21 # researchscanner21.eecs.berkeley.edu
-67.21.36.220 # researchscanner220.eecs.berkeley.edu
-67.21.36.221 # researchscanner221.eecs.berkeley.edu
-67.21.36.222 # researchscanner222.eecs.berkeley.edu
-67.21.36.223 # researchscanner223.eecs.berkeley.edu
-67.21.36.224 # researchscanner224.eecs.berkeley.edu
-67.21.36.225 # researchscanner225.eecs.berkeley.edu
-67.21.36.226 # researchscanner226.eecs.berkeley.edu
-67.21.36.227 # researchscanner227.eecs.berkeley.edu
-67.21.36.228 # researchscanner228.eecs.berkeley.edu
-67.21.36.229 # researchscanner229.eecs.berkeley.edu
-67.21.36.22 # researchscanner22.eecs.berkeley.edu
-67.21.36.230 # researchscanner230.eecs.berkeley.edu
-67.21.36.232 # researchscanner232.eecs.berkeley.edu
-67.21.36.233 # researchscanner233.eecs.berkeley.edu
-67.21.36.235 # researchscanner235.eecs.berkeley.edu
-67.21.36.236 # researchscanner236.eecs.berkeley.edu
-67.21.36.237 # researchscanner237.eecs.berkeley.edu
-67.21.36.238 # researchscanner238.eecs.berkeley.edu
-67.21.36.239 # researchscanner239.eecs.berkeley.edu
-67.21.36.23 # researchscanner23.eecs.berkeley.edu
-67.21.36.240 # researchscanner240.eecs.berkeley.edu
-67.21.36.241 # researchscanner241.eecs.berkeley.edu
-67.21.36.242 # researchscanner242.eecs.berkeley.edu
-67.21.36.243 # researchscanner243.eecs.berkeley.edu
-67.21.36.244 # researchscanner244.eecs.berkeley.edu
-67.21.36.245 # researchscanner245.eecs.berkeley.edu
-67.21.36.246 # researchscanner246.eecs.berkeley.edu
-67.21.36.247 # researchscanner247.eecs.berkeley.edu
-67.21.36.248 # researchscanner248.eecs.berkeley.edu
-67.21.36.249 # researchscanner249.eecs.berkeley.edu
-67.21.36.24 # researchscanner24.eecs.berkeley.edu
-67.21.36.250 # researchscanner250.eecs.berkeley.edu
-67.21.36.253 # researchscanner.eecs.berkeley.edu
-67.21.36.25 # researchscanner25.eecs.berkeley.edu
-67.21.36.26 # researchscanner26.eecs.berkeley.edu
-67.21.36.27 # researchscanner27.eecs.berkeley.edu
-67.21.36.28 # researchscanner28.eecs.berkeley.edu
-67.21.36.29 # researchscanner29.eecs.berkeley.edu
-67.21.36.2 # researchscanner02.eecs.berkeley.edu
-67.21.36.30 # researchscanner30.eecs.berkeley.edu
-67.21.36.31 # researchscanner31.eecs.berkeley.edu
-67.21.36.32 # researchscanner32.eecs.berkeley.edu
-67.21.36.33 # researchscanner33.eecs.berkeley.edu
-67.21.36.34 # researchscanner34.eecs.berkeley.edu
-67.21.36.35 # researchscanner35.eecs.berkeley.edu
-67.21.36.36 # researchscanner36.eecs.berkeley.edu
-67.21.36.37 # researchscanner37.eecs.berkeley.edu
-67.21.36.38 # researchscanner38.eecs.berkeley.edu
-67.21.36.39 # researchscanner39.eecs.berkeley.edu
-67.21.36.3 # researchscanner03.eecs.berkeley.edu
-67.21.36.40 # researchscanner40.eecs.berkeley.edu
-67.21.36.41 # researchscanner41.eecs.berkeley.edu
-67.21.36.42 # researchscanner42.eecs.berkeley.edu
-67.21.36.43 # researchscanner43.eecs.berkeley.edu
-67.21.36.44 # researchscanner44.eecs.berkeley.edu
-67.21.36.45 # researchscanner45.eecs.berkeley.edu
-67.21.36.46 # researchscanner46.eecs.berkeley.edu
-67.21.36.47 # researchscanner47.eecs.berkeley.edu
-67.21.36.48 # researchscanner48.eecs.berkeley.edu
-67.21.36.49 # researchscanner49.eecs.berkeley.edu
-67.21.36.4 # researchscanner04.eecs.berkeley.edu
-67.21.36.50 # researchscanner50.eecs.berkeley.edu
-67.21.36.51 # researchscanner51.eecs.berkeley.edu
-67.21.36.52 # researchscanner52.eecs.berkeley.edu
-67.21.36.53 # researchscanner53.eecs.berkeley.edu
-67.21.36.54 # researchscanner54.eecs.berkeley.edu
-67.21.36.55 # researchscanner55.eecs.berkeley.edu
-67.21.36.57 # researchscanner57.eecs.berkeley.edu
-67.21.36.58 # researchscanner58.eecs.berkeley.edu
-67.21.36.59 # researchscanner59.eecs.berkeley.edu
-67.21.36.5 # researchscanner05.eecs.berkeley.edu
-67.21.36.60 # researchscanner60.eecs.berkeley.edu
-67.21.36.61 # researchscanner61.eecs.berkeley.edu
-67.21.36.62 # researchscanner62.eecs.berkeley.edu
-67.21.36.63 # researchscanner63.eecs.berkeley.edu
-67.21.36.64 # researchscanner64.eecs.berkeley.edu
-67.21.36.65 # researchscanner65.eecs.berkeley.edu
-67.21.36.66 # researchscanner66.eecs.berkeley.edu
-67.21.36.67 # researchscanner67.eecs.berkeley.edu
-67.21.36.68 # researchscanner68.eecs.berkeley.edu
-67.21.36.69 # researchscanner69.eecs.berkeley.edu
-67.21.36.6 # researchscanner06.eecs.berkeley.edu
-67.21.36.70 # researchscanner70.eecs.berkeley.edu
-67.21.36.71 # researchscanner71.eecs.berkeley.edu
-67.21.36.72 # researchscanner72.eecs.berkeley.edu
-67.21.36.73 # researchscanner73.eecs.berkeley.edu
-67.21.36.74 # researchscanner74.eecs.berkeley.edu
-67.21.36.75 # researchscanner75.eecs.berkeley.edu
-67.21.36.76 # researchscanner76.eecs.berkeley.edu
-67.21.36.77 # researchscanner77.eecs.berkeley.edu
-67.21.36.79 # researchscanner79.eecs.berkeley.edu
-67.21.36.7 # researchscanner07.eecs.berkeley.edu
-67.21.36.80 # researchscanner80.eecs.berkeley.edu
-67.21.36.81 # researchscanner81.eecs.berkeley.edu
-67.21.36.82 # researchscanner82.eecs.berkeley.edu
-67.21.36.83 # researchscanner83.eecs.berkeley.edu
-67.21.36.84 # researchscanner84.eecs.berkeley.edu
-67.21.36.85 # researchscanner85.eecs.berkeley.edu
-67.21.36.86 # researchscanner86.eecs.berkeley.edu
-67.21.36.87 # researchscanner87.eecs.berkeley.edu
-67.21.36.88 # researchscanner88.eecs.berkeley.edu
-67.21.36.89 # researchscanner89.eecs.berkeley.edu
-67.21.36.8 # researchscanner08.eecs.berkeley.edu
-67.21.36.90 # researchscanner90.eecs.berkeley.edu
-67.21.36.91 # researchscanner91.eecs.berkeley.edu
-67.21.36.92 # researchscanner92.eecs.berkeley.edu
-67.21.36.93 # researchscanner93.eecs.berkeley.edu
-67.21.36.94 # researchscanner94.eecs.berkeley.edu
-67.21.36.95 # researchscanner95.eecs.berkeley.edu
-67.21.36.96 # researchscanner96.eecs.berkeley.edu
-67.21.36.97 # researchscanner97.eecs.berkeley.edu
-67.21.36.98 # researchscanner98.eecs.berkeley.edu
-67.21.36.99 # researchscanner99.eecs.berkeley.edu
-67.21.36.9 # researchscanner09.eecs.berkeley.edu
-169.229.3.89 # researchscan-gw.eecs.berkeley.edu
-169.229.3.89 # researchscan-gw.eecs.berkeley.edu
-169.229.3.90 # researchscan0.eecs.berkeley.edu
-169.229.3.90 # researchscan0.eecs.berkeley.edu
-169.229.3.91 # researchscan1.eecs.berkeley.edu
-169.229.3.91 # researchscan1.eecs.berkeley.edu
-169.229.3.92 # researchscan2.eecs.berkeley.edu
-169.229.3.92 # researchscan2.eecs.berkeley.edu
-169.229.3.93 # researchscan3.eecs.berkeley.edu
-169.229.3.93 # researchscan3.eecs.berkeley.edu
-169.229.3.94 # researchscan4.eecs.berkeley.edu
-169.229.3.94 # researchscan4.eecs.berkeley.edu
-
-5.63.151.100 # scanners.labs.rapid7.com
-5.63.151.101 # scanners.labs.rapid7.com
-5.63.151.102 # scanners.labs.rapid7.com
-5.63.151.103 # scanners.labs.rapid7.com
-5.63.151.104 # scanners.labs.rapid7.com
-5.63.151.105 # scanners.labs.rapid7.com
-5.63.151.106 # scanners.labs.rapid7.com
-5.63.151.107 # scanners.labs.rapid7.com
-5.63.151.108 # scanners.labs.rapid7.com
-5.63.151.109 # scanners.labs.rapid7.com
-5.63.151.110 # scanners.labs.rapid7.com
-5.63.151.111 # scanners.labs.rapid7.com
-5.63.151.112 # scanners.labs.rapid7.com
-5.63.151.113 # scanners.labs.rapid7.com
-5.63.151.114 # scanners.labs.rapid7.com
-5.63.151.115 # scanners.labs.rapid7.com
-5.63.151.116 # scanners.labs.rapid7.com
-5.63.151.117 # scanners.labs.rapid7.com
-5.63.151.118 # scanners.labs.rapid7.com
-5.63.151.119 # scanners.labs.rapid7.com
-5.63.151.120 # scanners.labs.rapid7.com
-5.63.151.121 # scanners.labs.rapid7.com
-5.63.151.122 # scanners.labs.rapid7.com
-5.63.151.123 # scanners.labs.rapid7.com
-5.63.151.124 # scanners.labs.rapid7.com
-5.63.151.125 # scanners.labs.rapid7.com
-5.63.151.126 # scanners.labs.rapid7.com
-31.24.231.211 # scanner3.labs.rapid7.com
-31.24.231.223 # scanner4.labs.rapid7.com
-71.6.233.100 # scanners.labs.rapid7.com
-71.6.233.101 # scanners.labs.rapid7.com
-71.6.233.102 # scanners.labs.rapid7.com
-71.6.233.103 # scanners.labs.rapid7.com
-71.6.233.104 # scanners.labs.rapid7.com
-71.6.233.105 # scanners.labs.rapid7.com
-71.6.233.106 # scanners.labs.rapid7.com
-71.6.233.107 # scanners.labs.rapid7.com
-71.6.233.108 # scanners.labs.rapid7.com
-71.6.233.109 # scanners.labs.rapid7.com
-71.6.233.10 # scanners.labs.rapid7.com
-71.6.233.110 # scanners.labs.rapid7.com
-71.6.233.111 # scanners.labs.rapid7.com
-71.6.233.112 # scanners.labs.rapid7.com
-71.6.233.113 # scanners.labs.rapid7.com
-71.6.233.114 # scanners.labs.rapid7.com
-71.6.233.115 # scanners.labs.rapid7.com
-71.6.233.116 # scanners.labs.rapid7.com
-71.6.233.117 # scanners.labs.rapid7.com
-71.6.233.118 # scanners.labs.rapid7.com
-71.6.233.119 # scanners.labs.rapid7.com
-71.6.233.11 # scanners.labs.rapid7.com
-71.6.233.120 # scanners.labs.rapid7.com
-71.6.233.121 # scanners.labs.rapid7.com
-71.6.233.122 # scanners.labs.rapid7.com
-71.6.233.123 # scanners.labs.rapid7.com
-71.6.233.124 # scanners.labs.rapid7.com
-71.6.233.125 # scanners.labs.rapid7.com
-71.6.233.126 # scanners.labs.rapid7.com
-71.6.233.127 # scanners.labs.rapid7.com
-71.6.233.128 # scanners.labs.rapid7.com
-71.6.233.129 # scanner2.labs.rapid7.com
-71.6.233.12 # scanners.labs.rapid7.com
-71.6.233.130 # scanners.labs.rapid7.com
-71.6.233.131 # scanners.labs.rapid7.com
-71.6.233.132 # scanners.labs.rapid7.com
-71.6.233.133 # scanners.labs.rapid7.com
-71.6.233.134 # scanners.labs.rapid7.com
-71.6.233.135 # scanners.labs.rapid7.com
-71.6.233.136 # scanners.labs.rapid7.com
-71.6.233.137 # scanners.labs.rapid7.com
-71.6.233.138 # scanners.labs.rapid7.com
-71.6.233.139 # scanners.labs.rapid7.com
-71.6.233.13 # scanners.labs.rapid7.com
-71.6.233.140 # scanners.labs.rapid7.com
-71.6.233.141 # scanners.labs.rapid7.com
-71.6.233.142 # scanners.labs.rapid7.com
-71.6.233.143 # scanners.labs.rapid7.com
-71.6.233.144 # scanners.labs.rapid7.com
-71.6.233.145 # scanners.labs.rapid7.com
-71.6.233.146 # scanners.labs.rapid7.com
-71.6.233.147 # scanners.labs.rapid7.com
-71.6.233.148 # scanners.labs.rapid7.com
-71.6.233.149 # scanners.labs.rapid7.com
-71.6.233.14 # scanners.labs.rapid7.com
-71.6.233.150 # scanners.labs.rapid7.com
-71.6.233.151 # scanners.labs.rapid7.com
-71.6.233.152 # scanners.labs.rapid7.com
-71.6.233.153 # scanners.labs.rapid7.com
-71.6.233.154 # scanners.labs.rapid7.com
-71.6.233.155 # scanners.labs.rapid7.com
-71.6.233.156 # scanners.labs.rapid7.com
-71.6.233.157 # scanners.labs.rapid7.com
-71.6.233.158 # scanners.labs.rapid7.com
-71.6.233.159 # scanners.labs.rapid7.com
-71.6.233.15 # scanners.labs.rapid7.com
-71.6.233.160 # scanners.labs.rapid7.com
-71.6.233.161 # scanners.labs.rapid7.com
-71.6.233.162 # scanners.labs.rapid7.com
-71.6.233.163 # scanners.labs.rapid7.com
-71.6.233.164 # scanners.labs.rapid7.com
-71.6.233.165 # scanners.labs.rapid7.com
-71.6.233.166 # scanners.labs.rapid7.com
-71.6.233.167 # scanners.labs.rapid7.com
-71.6.233.168 # scanners.labs.rapid7.com
-71.6.233.169 # scanners.labs.rapid7.com
-71.6.233.16 # scanners.labs.rapid7.com
-71.6.233.170 # scanners.labs.rapid7.com
-71.6.233.171 # scanners.labs.rapid7.com
-71.6.233.172 # scanners.labs.rapid7.com
-71.6.233.173 # scanners.labs.rapid7.com
-71.6.233.174 # scanners.labs.rapid7.com
-71.6.233.175 # scanners.labs.rapid7.com
-71.6.233.176 # scanners.labs.rapid7.com
-71.6.233.177 # scanners.labs.rapid7.com
-71.6.233.178 # scanners.labs.rapid7.com
-71.6.233.179 # scanners.labs.rapid7.com
-71.6.233.17 # scanners.labs.rapid7.com
-71.6.233.180 # scanners.labs.rapid7.com
-71.6.233.181 # scanners.labs.rapid7.com
-71.6.233.182 # scanners.labs.rapid7.com
-71.6.233.183 # scanners.labs.rapid7.com
-71.6.233.184 # scanners.labs.rapid7.com
-71.6.233.185 # scanners.labs.rapid7.com
-71.6.233.186 # scanners.labs.rapid7.com
-71.6.233.187 # scanners.labs.rapid7.com
-71.6.233.188 # scanners.labs.rapid7.com
-71.6.233.189 # scanners.labs.rapid7.com
-71.6.233.18 # scanners.labs.rapid7.com
-71.6.233.190 # scanners.labs.rapid7.com
-71.6.233.191 # scanners.labs.rapid7.com
-71.6.233.192 # scanners.labs.rapid7.com
-71.6.233.193 # scanners.labs.rapid7.com
-71.6.233.194 # scanners.labs.rapid7.com
-71.6.233.195 # scanners.labs.rapid7.com
-71.6.233.196 # scanners.labs.rapid7.com
-71.6.233.197 # scanners.labs.rapid7.com
-71.6.233.198 # scanners.labs.rapid7.com
-71.6.233.199 # scanners.labs.rapid7.com
-71.6.233.19 # scanners.labs.rapid7.com
-71.6.233.200 # scanners.labs.rapid7.com
-71.6.233.201 # scanners.labs.rapid7.com
-71.6.233.202 # scanners.labs.rapid7.com
-71.6.233.203 # scanners.labs.rapid7.com
-71.6.233.204 # scanners.labs.rapid7.com
-71.6.233.205 # scanners.labs.rapid7.com
-71.6.233.206 # scanners.labs.rapid7.com
-71.6.233.207 # scanners.labs.rapid7.com
-71.6.233.208 # scanners.labs.rapid7.com
-71.6.233.209 # scanners.labs.rapid7.com
-71.6.233.20 # scanners.labs.rapid7.com
-71.6.233.210 # scanners.labs.rapid7.com
-71.6.233.211 # scanners.labs.rapid7.com
-71.6.233.212 # scanners.labs.rapid7.com
-71.6.233.213 # scanners.labs.rapid7.com
-71.6.233.214 # scanners.labs.rapid7.com
-71.6.233.215 # scanners.labs.rapid7.com
-71.6.233.216 # scanners.labs.rapid7.com
-71.6.233.217 # scanners.labs.rapid7.com
-71.6.233.218 # scanners.labs.rapid7.com
-71.6.233.219 # scanners.labs.rapid7.com
-71.6.233.21 # scanners.labs.rapid7.com
-71.6.233.220 # scanners.labs.rapid7.com
-71.6.233.221 # scanners.labs.rapid7.com
-71.6.233.222 # scanners.labs.rapid7.com
-71.6.233.223 # scanners.labs.rapid7.com
-71.6.233.224 # scanners.labs.rapid7.com
-71.6.233.225 # scanners.labs.rapid7.com
-71.6.233.226 # scanners.labs.rapid7.com
-71.6.233.227 # scanners.labs.rapid7.com
-71.6.233.228 # scanners.labs.rapid7.com
-71.6.233.229 # scanners.labs.rapid7.com
-71.6.233.22 # scanners.labs.rapid7.com
-71.6.233.230 # scanners.labs.rapid7.com
-71.6.233.231 # scanners.labs.rapid7.com
-71.6.233.232 # scanners.labs.rapid7.com
-71.6.233.233 # scanners.labs.rapid7.com
-71.6.233.234 # scanners.labs.rapid7.com
-71.6.233.235 # scanners.labs.rapid7.com
-71.6.233.236 # scanners.labs.rapid7.com
-71.6.233.237 # scanners.labs.rapid7.com
-71.6.233.238 # scanners.labs.rapid7.com
-71.6.233.239 # scanners.labs.rapid7.com
-71.6.233.23 # scanners.labs.rapid7.com
-71.6.233.240 # scanners.labs.rapid7.com
-71.6.233.241 # scanners.labs.rapid7.com
-71.6.233.242 # scanners.labs.rapid7.com
-71.6.233.243 # scanners.labs.rapid7.com
-71.6.233.244 # scanners.labs.rapid7.com
-71.6.233.245 # scanners.labs.rapid7.com
-71.6.233.246 # scanners.labs.rapid7.com
-71.6.233.247 # scanners.labs.rapid7.com
-71.6.233.248 # scanners.labs.rapid7.com
-71.6.233.249 # scanners.labs.rapid7.com
-71.6.233.24 # scanners.labs.rapid7.com
-71.6.233.250 # scanners.labs.rapid7.com
-71.6.233.251 # scanners.labs.rapid7.com
-71.6.233.252 # scanners.labs.rapid7.com
-71.6.233.253 # scanners.labs.rapid7.com
-71.6.233.254 # scanners.labs.rapid7.com
-71.6.233.25 # scanners.labs.rapid7.com
-71.6.233.26 # scanners.labs.rapid7.com
-71.6.233.27 # scanners.labs.rapid7.com
-71.6.233.28 # scanners.labs.rapid7.com
-71.6.233.29 # scanners.labs.rapid7.com
-71.6.233.2 # scanner1.labs.rapid7.com
-71.6.233.30 # scanners.labs.rapid7.com
-71.6.233.31 # scanners.labs.rapid7.com
-71.6.233.32 # scanners.labs.rapid7.com
-71.6.233.33 # scanners.labs.rapid7.com
-71.6.233.34 # scanners.labs.rapid7.com
-71.6.233.35 # scanners.labs.rapid7.com
-71.6.233.36 # scanners.labs.rapid7.com
-71.6.233.37 # scanners.labs.rapid7.com
-71.6.233.38 # scanners.labs.rapid7.com
-71.6.233.39 # scanners.labs.rapid7.com
-71.6.233.3 # scanners.labs.rapid7.com
-71.6.233.40 # scanners.labs.rapid7.com
-71.6.233.41 # scanners.labs.rapid7.com
-71.6.233.42 # scanners.labs.rapid7.com
-71.6.233.43 # scanners.labs.rapid7.com
-71.6.233.44 # scanners.labs.rapid7.com
-71.6.233.45 # scanners.labs.rapid7.com
-71.6.233.46 # scanners.labs.rapid7.com
-71.6.233.47 # scanners.labs.rapid7.com
-71.6.233.48 # scanners.labs.rapid7.com
-71.6.233.49 # scanners.labs.rapid7.com
-71.6.233.4 # scanners.labs.rapid7.com
-71.6.233.50 # scanners.labs.rapid7.com
-71.6.233.51 # scanners.labs.rapid7.com
-71.6.233.52 # scanners.labs.rapid7.com
-71.6.233.53 # scanners.labs.rapid7.com
-71.6.233.54 # scanners.labs.rapid7.com
-71.6.233.55 # scanners.labs.rapid7.com
-71.6.233.56 # scanners.labs.rapid7.com
-71.6.233.57 # scanners.labs.rapid7.com
-71.6.233.58 # scanners.labs.rapid7.com
-71.6.233.59 # scanners.labs.rapid7.com
-71.6.233.5 # scanners.labs.rapid7.com
-71.6.233.60 # scanners.labs.rapid7.com
-71.6.233.61 # scanners.labs.rapid7.com
-71.6.233.62 # scanners.labs.rapid7.com
-71.6.233.63 # scanners.labs.rapid7.com
-71.6.233.64 # scanners.labs.rapid7.com
-71.6.233.65 # scanners.labs.rapid7.com
-71.6.233.66 # scanners.labs.rapid7.com
-71.6.233.67 # scanners.labs.rapid7.com
-71.6.233.68 # scanners.labs.rapid7.com
-71.6.233.69 # scanners.labs.rapid7.com
-71.6.233.6 # scanners.labs.rapid7.com
-71.6.233.70 # scanners.labs.rapid7.com
-71.6.233.71 # scanners.labs.rapid7.com
-71.6.233.72 # scanners.labs.rapid7.com
-71.6.233.73 # scanners.labs.rapid7.com
-71.6.233.74 # scanners.labs.rapid7.com
-71.6.233.75 # scanners.labs.rapid7.com
-71.6.233.76 # scanners.labs.rapid7.com
-71.6.233.77 # scanners.labs.rapid7.com
-71.6.233.78 # scanners.labs.rapid7.com
-71.6.233.79 # scanners.labs.rapid7.com
-71.6.233.7 # scanners.labs.rapid7.com
-71.6.233.80 # scanners.labs.rapid7.com
-71.6.233.81 # scanners.labs.rapid7.com
-71.6.233.82 # scanners.labs.rapid7.com
-71.6.233.83 # scanners.labs.rapid7.com
-71.6.233.84 # scanners.labs.rapid7.com
-71.6.233.85 # scanners.labs.rapid7.com
-71.6.233.86 # scanners.labs.rapid7.com
-71.6.233.87 # scanners.labs.rapid7.com
-71.6.233.88 # scanners.labs.rapid7.com
-71.6.233.89 # scanners.labs.rapid7.com
-71.6.233.8 # scanners.labs.rapid7.com
-71.6.233.90 # scanners.labs.rapid7.com
-71.6.233.91 # scanners.labs.rapid7.com
-71.6.233.92 # scanners.labs.rapid7.com
-71.6.233.93 # scanners.labs.rapid7.com
-71.6.233.94 # scanners.labs.rapid7.com
-71.6.233.95 # scanners.labs.rapid7.com
-71.6.233.96 # scanners.labs.rapid7.com
-71.6.233.97 # scanners.labs.rapid7.com
-71.6.233.98 # scanners.labs.rapid7.com
-71.6.233.99 # scanners.labs.rapid7.com
-71.6.233.9 # scanners.labs.rapid7.com
-88.202.190.132 # scanners.labs.rapid7.com
-88.202.190.133 # scanners.labs.rapid7.com
-88.202.190.134 # scanners.labs.rapid7.com
-88.202.190.135 # scanners.labs.rapid7.com
-88.202.190.136 # scanners.labs.rapid7.com
-88.202.190.137 # scanners.labs.rapid7.com
-88.202.190.138 # scanners.labs.rapid7.com
-88.202.190.139 # scanners.labs.rapid7.com
-88.202.190.140 # scanners.labs.rapid7.com
-88.202.190.141 # scanners.labs.rapid7.com
-88.202.190.142 # scanners.labs.rapid7.com
-88.202.190.143 # scanners.labs.rapid7.com
-88.202.190.144 # scanners.labs.rapid7.com
-88.202.190.145 # scanners.labs.rapid7.com
-88.202.190.146 # scanners.labs.rapid7.com
-88.202.190.147 # scanners.labs.rapid7.com
-88.202.190.148 # scanners.labs.rapid7.com
-88.202.190.149 # scanners.labs.rapid7.com
-88.202.190.150 # scanners.labs.rapid7.com
-88.202.190.151 # scanners.labs.rapid7.com
-88.202.190.152 # scanners.labs.rapid7.com
-88.202.190.153 # scanners.labs.rapid7.com
-88.202.190.154 # scanners.labs.rapid7.com
-88.202.190.155 # scanners.labs.rapid7.com
-88.202.190.156 # scanners.labs.rapid7.com
-88.202.190.157 # scanners.labs.rapid7.com
-88.202.190.158 # scanners.labs.rapid7.com
-109.123.117.228 # scanners.labs.rapid7.com
-109.123.117.229 # scanners.labs.rapid7.com
-109.123.117.230 # scanners.labs.rapid7.com
-109.123.117.231 # scanners.labs.rapid7.com
-109.123.117.232 # scanners.labs.rapid7.com
-109.123.117.233 # scanners.labs.rapid7.com
-109.123.117.234 # scanners.labs.rapid7.com
-109.123.117.235 # scanners.labs.rapid7.com
-109.123.117.236 # scanners.labs.rapid7.com
-109.123.117.237 # scanners.labs.rapid7.com
-109.123.117.238 # scanners.labs.rapid7.com
-109.123.117.239 # scanners.labs.rapid7.com
-109.123.117.240 # scanners.labs.rapid7.com
-109.123.117.241 # scanners.labs.rapid7.com
-109.123.117.242 # scanners.labs.rapid7.com
-109.123.117.243 # scanners.labs.rapid7.com
-109.123.117.244 # scanners.labs.rapid7.com
-109.123.117.245 # scanners.labs.rapid7.com
-109.123.117.246 # scanners.labs.rapid7.com
-109.123.117.247 # scanners.labs.rapid7.com
-109.123.117.248 # scanners.labs.rapid7.com
-109.123.117.249 # scanners.labs.rapid7.com
-109.123.117.250 # scanners.labs.rapid7.com
-109.123.117.251 # scanners.labs.rapid7.com
-109.123.117.252 # scanners.labs.rapid7.com
-109.123.117.253 # scanners.labs.rapid7.com
-109.123.117.254 # scanners.labs.rapid7.com
-146.185.25.164 # scanners.labs.rapid7.com
-146.185.25.165 # scanners.labs.rapid7.com
-146.185.25.166 # scanners.labs.rapid7.com
-146.185.25.167 # scanners.labs.rapid7.com
-146.185.25.168 # scanners.labs.rapid7.com
-146.185.25.169 # scanners.labs.rapid7.com
-146.185.25.170 # scanners.labs.rapid7.com
-146.185.25.171 # scanners.labs.rapid7.com
-146.185.25.172 # scanners.labs.rapid7.com
-146.185.25.173 # scanners.labs.rapid7.com
-146.185.25.174 # scanners.labs.rapid7.com
-146.185.25.175 # scanners.labs.rapid7.com
-146.185.25.176 # scanners.labs.rapid7.com
-146.185.25.177 # scanners.labs.rapid7.com
-146.185.25.178 # scanners.labs.rapid7.com
-146.185.25.179 # scanners.labs.rapid7.com
-146.185.25.180 # scanners.labs.rapid7.com
-146.185.25.181 # scanners.labs.rapid7.com
-146.185.25.182 # scanners.labs.rapid7.com
-146.185.25.183 # scanners.labs.rapid7.com
-146.185.25.184 # scanners.labs.rapid7.com
-146.185.25.185 # scanners.labs.rapid7.com
-146.185.25.186 # scanners.labs.rapid7.com
-146.185.25.187 # scanners.labs.rapid7.com
-146.185.25.188 # scanners.labs.rapid7.com
-146.185.25.189 # scanners.labs.rapid7.com
-146.185.25.190 # scanners.labs.rapid7.com
-
-204.42.253.2 # openresolverproject.org
-204.42.253.130 # opensnmpproject.org
-204.42.253.131 # openntpproject.org
-204.42.253.132 # openssdpproject.org
-204.42.254.5 # openresolverproject.org
-
-141.212.121.1 # researchscan001.eecs.umich.edu
-141.212.121.2 # researchscan002.eecs.umich.edu
-141.212.121.3 # researchscan003.eecs.umich.edu
-141.212.121.4 # researchscan004.eecs.umich.edu
-141.212.121.5 # researchscan005.eecs.umich.edu
-141.212.121.6 # researchscan006.eecs.umich.edu
-141.212.121.7 # researchscan007.eecs.umich.edu
-141.212.121.8 # researchscan008.eecs.umich.edu
-141.212.121.9 # researchscan009.eecs.umich.edu
-141.212.121.11 # researchscan011.eecs.umich.edu
-141.212.121.12 # researchscan012.eecs.umich.edu
-141.212.121.13 # researchscan013.eecs.umich.edu
-141.212.121.14 # researchscan014.eecs.umich.edu
-141.212.121.15 # researchscan015.eecs.umich.edu
-141.212.121.16 # researchscan016.eecs.umich.edu
-141.212.121.17 # researchscan017.eecs.umich.edu
-141.212.121.18 # researchscan018.eecs.umich.edu
-141.212.121.19 # researchscan019.eecs.umich.edu
-141.212.121.20 # researchscan020.eecs.umich.edu
-141.212.121.21 # researchscan021.eecs.umich.edu
-141.212.121.22 # researchscan022.eecs.umich.edu
-141.212.121.23 # researchscan023.eecs.umich.edu
-141.212.121.24 # researchscan024.eecs.umich.edu
-141.212.121.25 # researchscan025.eecs.umich.edu
-141.212.121.26 # researchscan026.eecs.umich.edu
-141.212.121.27 # researchscan027.eecs.umich.edu
-141.212.121.28 # researchscan028.eecs.umich.edu
-141.212.121.29 # researchscan029.eecs.umich.edu
-141.212.121.30 # researchscan030.eecs.umich.edu
-141.212.121.31 # researchscan031.eecs.umich.edu
-141.212.121.32 # researchscan032.eecs.umich.edu
-141.212.121.33 # researchscan033.eecs.umich.edu
-141.212.121.34 # researchscan034.eecs.umich.edu
-141.212.121.35 # researchscan035.eecs.umich.edu
-141.212.121.37 # researchscan037.eecs.umich.edu
-141.212.121.38 # researchscan038.eecs.umich.edu
-141.212.121.39 # researchscan039.eecs.umich.edu
-141.212.121.40 # researchscan040.eecs.umich.edu
-141.212.121.41 # researchscan041.eecs.umich.edu
-141.212.121.42 # researchscan042.eecs.umich.edu
-141.212.121.43 # researchscan043.eecs.umich.edu
-141.212.121.44 # researchscan044.eecs.umich.edu
-141.212.121.45 # researchscan045.eecs.umich.edu
-141.212.121.46 # researchscan046.eecs.umich.edu
-141.212.121.47 # researchscan047.eecs.umich.edu
-141.212.121.48 # researchscan048.eecs.umich.edu
-141.212.121.49 # researchscan049.eecs.umich.edu
-141.212.121.50 # researchscan050.eecs.umich.edu
-141.212.121.51 # researchscan051.eecs.umich.edu
-141.212.121.52 # researchscan052.eecs.umich.edu
-141.212.121.53 # researchscan053.eecs.umich.edu
-141.212.121.54 # researchscan054.eecs.umich.edu
-141.212.121.55 # researchscan055.eecs.umich.edu
-141.212.121.56 # researchscan056.eecs.umich.edu
-141.212.121.57 # researchscan057.eecs.umich.edu
-141.212.121.58 # researchscan058.eecs.umich.edu
-141.212.121.59 # researchscan059.eecs.umich.edu
-141.212.121.60 # researchscan060.eecs.umich.edu
-141.212.121.61 # researchscan061.eecs.umich.edu
-141.212.121.62 # researchscan062.eecs.umich.edu
-141.212.121.63 # researchscan063.eecs.umich.edu
-141.212.121.64 # researchscan064.eecs.umich.edu
-141.212.121.65 # researchscan065.eecs.umich.edu
-141.212.121.66 # researchscan066.eecs.umich.edu
-141.212.121.67 # researchscan067.eecs.umich.edu
-141.212.121.68 # researchscan068.eecs.umich.edu
-141.212.121.69 # researchscan069.eecs.umich.edu
-141.212.121.70 # researchscan070.eecs.umich.edu
-141.212.121.71 # researchscan071.eecs.umich.edu
-141.212.121.72 # researchscan072.eecs.umich.edu
-141.212.121.73 # researchscan073.eecs.umich.edu
-141.212.121.74 # researchscan074.eecs.umich.edu
-141.212.121.75 # researchscan075.eecs.umich.edu
-141.212.121.76 # researchscan076.eecs.umich.edu
-141.212.121.78 # researchscan078.eecs.umich.edu
-141.212.121.79 # researchscan079.eecs.umich.edu
-141.212.121.80 # researchscan080.eecs.umich.edu
-141.212.121.81 # researchscan081.eecs.umich.edu
-141.212.121.82 # researchscan082.eecs.umich.edu
-141.212.121.83 # researchscan083.eecs.umich.edu
-141.212.121.84 # researchscan084.eecs.umich.edu
-141.212.121.85 # researchscan085.eecs.umich.edu
-141.212.121.86 # researchscan086.eecs.umich.edu
-141.212.121.87 # researchscan087.eecs.umich.edu
-141.212.121.88 # researchscan088.eecs.umich.edu
-141.212.121.89 # researchscan089.eecs.umich.edu
-141.212.121.90 # researchscan090.eecs.umich.edu
-141.212.121.91 # researchscan091.eecs.umich.edu
-141.212.121.92 # researchscan092.eecs.umich.edu
-141.212.121.93 # researchscan093.eecs.umich.edu
-141.212.121.94 # researchscan094.eecs.umich.edu
-141.212.121.95 # researchscan095.eecs.umich.edu
-141.212.121.96 # researchscan096.eecs.umich.edu
-141.212.121.97 # researchscan097.eecs.umich.edu
-141.212.121.98 # researchscan098.eecs.umich.edu
-141.212.121.99 # researchscan099.eecs.umich.edu
-141.212.121.100 # researchscan100.eecs.umich.edu
-141.212.121.101 # researchscan101.eecs.umich.edu
-141.212.121.102 # researchscan102.eecs.umich.edu
-141.212.121.103 # researchscan103.eecs.umich.edu
-141.212.121.104 # researchscan104.eecs.umich.edu
-141.212.121.105 # researchscan105.eecs.umich.edu
-141.212.121.106 # researchscan106.eecs.umich.edu
-141.212.121.107 # researchscan107.eecs.umich.edu
-141.212.121.108 # researchscan108.eecs.umich.edu
-141.212.121.109 # researchscan109.eecs.umich.edu
-141.212.121.110 # researchscan110.eecs.umich.edu
-141.212.121.111 # researchscan111.eecs.umich.edu
-141.212.121.113 # researchscan113.eecs.umich.edu
-141.212.121.114 # researchscan114.eecs.umich.edu
-141.212.121.115 # researchscan115.eecs.umich.edu
-141.212.121.116 # researchscan116.eecs.umich.edu
-141.212.121.117 # researchscan117.eecs.umich.edu
-141.212.121.118 # researchscan118.eecs.umich.edu
-141.212.121.119 # researchscan119.eecs.umich.edu
-141.212.121.120 # researchscan120.eecs.umich.edu
-141.212.121.121 # researchscan121.eecs.umich.edu
-141.212.121.122 # researchscan122.eecs.umich.edu
-141.212.121.123 # researchscan123.eecs.umich.edu
-141.212.121.124 # researchscan124.eecs.umich.edu
-141.212.121.125 # researchscan125.eecs.umich.edu
-141.212.121.126 # researchscan126.eecs.umich.edu
-141.212.121.127 # researchscan127.eecs.umich.edu
-141.212.121.128 # researchscan128.eecs.umich.edu
-141.212.121.129 # researchscan129.eecs.umich.edu
-141.212.121.130 # researchscan130.eecs.umich.edu
-141.212.121.131 # researchscan131.eecs.umich.edu
-141.212.121.132 # researchscan132.eecs.umich.edu
-141.212.121.133 # researchscan133.eecs.umich.edu
-141.212.121.134 # researchscan134.eecs.umich.edu
-141.212.121.135 # researchscan135.eecs.umich.edu
-141.212.121.136 # researchscan136.eecs.umich.edu
-141.212.121.137 # researchscan137.eecs.umich.edu
-141.212.121.138 # researchscan138.eecs.umich.edu
-141.212.121.139 # researchscan139.eecs.umich.edu
-141.212.121.140 # researchscan140.eecs.umich.edu
-141.212.121.141 # researchscan141.eecs.umich.edu
-141.212.121.142 # researchscan142.eecs.umich.edu
-141.212.121.143 # researchscan143.eecs.umich.edu
-141.212.121.144 # researchscan144.eecs.umich.edu
-141.212.121.145 # researchscan145.eecs.umich.edu
-141.212.121.146 # researchscan146.eecs.umich.edu
-141.212.121.147 # researchscan147.eecs.umich.edu
-141.212.121.148 # researchscan148.eecs.umich.edu
-141.212.121.149 # researchscan149.eecs.umich.edu
-141.212.121.150 # researchscan150.eecs.umich.edu
-141.212.121.151 # researchscan151.eecs.umich.edu
-141.212.121.152 # researchscan152.eecs.umich.edu
-141.212.121.153 # researchscan153.eecs.umich.edu
-141.212.121.154 # researchscan154.eecs.umich.edu
-141.212.121.155 # researchscan155.eecs.umich.edu
-141.212.121.156 # researchscan156.eecs.umich.edu
-141.212.121.157 # researchscan157.eecs.umich.edu
-141.212.121.158 # researchscan158.eecs.umich.edu
-141.212.121.159 # researchscan159.eecs.umich.edu
-141.212.121.160 # researchscan160.eecs.umich.edu
-141.212.121.161 # researchscan161.eecs.umich.edu
-141.212.121.162 # researchscan162.eecs.umich.edu
-141.212.121.163 # researchscan163.eecs.umich.edu
-141.212.121.164 # researchscan164.eecs.umich.edu
-141.212.121.165 # researchscan165.eecs.umich.edu
-141.212.121.166 # researchscan166.eecs.umich.edu
-141.212.121.167 # researchscan167.eecs.umich.edu
-141.212.121.168 # researchscan168.eecs.umich.edu
-141.212.121.169 # researchscan169.eecs.umich.edu
-141.212.121.170 # researchscan170.eecs.umich.edu
-141.212.121.171 # researchscan171.eecs.umich.edu
-141.212.121.172 # researchscan172.eecs.umich.edu
-141.212.121.173 # researchscan173.eecs.umich.edu
-141.212.121.174 # researchscan174.eecs.umich.edu
-141.212.121.175 # researchscan175.eecs.umich.edu
-141.212.121.177 # researchscan177.eecs.umich.edu
-141.212.121.178 # researchscan178.eecs.umich.edu
-141.212.121.179 # researchscan179.eecs.umich.edu
-141.212.121.180 # researchscan180.eecs.umich.edu
-141.212.121.181 # researchscan181.eecs.umich.edu
-141.212.121.182 # researchscan182.eecs.umich.edu
-141.212.121.183 # researchscan183.eecs.umich.edu
-141.212.121.184 # researchscan184.eecs.umich.edu
-141.212.121.185 # researchscan185.eecs.umich.edu
-141.212.121.186 # researchscan186.eecs.umich.edu
-141.212.121.187 # researchscan187.eecs.umich.edu
-141.212.121.188 # researchscan188.eecs.umich.edu
-141.212.121.189 # researchscan189.eecs.umich.edu
-141.212.121.190 # researchscan190.eecs.umich.edu
-141.212.121.191 # researchscan191.eecs.umich.edu
-141.212.121.192 # researchscan192.eecs.umich.edu
-141.212.121.193 # researchscan193.eecs.umich.edu
-141.212.121.194 # researchscan194.eecs.umich.edu
-141.212.121.196 # researchscan196.eecs.umich.edu
-141.212.121.197 # researchscan197.eecs.umich.edu
-141.212.121.198 # researchscan198.eecs.umich.edu
-141.212.121.199 # researchscan199.eecs.umich.edu
-141.212.121.200 # researchscan200.eecs.umich.edu
-141.212.121.201 # researchscan201.eecs.umich.edu
-141.212.121.202 # researchscan202.eecs.umich.edu
-141.212.121.203 # researchscan203.eecs.umich.edu
-141.212.121.204 # researchscan204.eecs.umich.edu
-141.212.121.205 # researchscan205.eecs.umich.edu
-141.212.121.206 # researchscan206.eecs.umich.edu
-141.212.121.207 # researchscan207.eecs.umich.edu
-141.212.121.208 # researchscan208.eecs.umich.edu
-141.212.121.209 # researchscan209.eecs.umich.edu
-141.212.121.210 # researchscan210.eecs.umich.edu
-141.212.121.211 # researchscan211.eecs.umich.edu
-141.212.121.212 # researchscan212.eecs.umich.edu
-141.212.121.213 # researchscan213.eecs.umich.edu
-141.212.121.214 # researchscan214.eecs.umich.edu
-141.212.121.215 # researchscan215.eecs.umich.edu
-141.212.121.216 # researchscan216.eecs.umich.edu
-141.212.121.217 # researchscan217.eecs.umich.edu
-141.212.121.218 # researchscan218.eecs.umich.edu
-141.212.121.219 # researchscan219.eecs.umich.edu
-141.212.121.220 # researchscan220.eecs.umich.edu
-141.212.121.221 # researchscan221.eecs.umich.edu
-141.212.121.222 # researchscan222.eecs.umich.edu
-141.212.121.223 # researchscan223.eecs.umich.edu
-141.212.121.224 # researchscan224.eecs.umich.edu
-141.212.121.225 # researchscan225.eecs.umich.edu
-141.212.121.226 # researchscan226.eecs.umich.edu
-141.212.121.227 # researchscan227.eecs.umich.edu
-141.212.121.228 # researchscan228.eecs.umich.edu
-141.212.121.229 # researchscan229.eecs.umich.edu
-141.212.121.230 # researchscan230.eecs.umich.edu
-141.212.121.231 # researchscan231.eecs.umich.edu
-141.212.121.232 # researchscan232.eecs.umich.edu
-141.212.121.233 # researchscan233.eecs.umich.edu
-141.212.121.234 # researchscan234.eecs.umich.edu
-141.212.121.235 # researchscan235.eecs.umich.edu
-141.212.121.236 # researchscan236.eecs.umich.edu
-141.212.121.237 # researchscan237.eecs.umich.edu
-141.212.121.238 # researchscan238.eecs.umich.edu
-141.212.121.239 # researchscan239.eecs.umich.edu
-141.212.121.240 # researchscan240.eecs.umich.edu
-141.212.121.241 # researchscan241.eecs.umich.edu
-141.212.121.242 # researchscan242.eecs.umich.edu
-141.212.121.243 # researchscan243.eecs.umich.edu
-141.212.121.244 # researchscan244.eecs.umich.edu
-141.212.121.245 # researchscan245.eecs.umich.edu
-141.212.121.246 # researchscan246.eecs.umich.edu
-141.212.121.247 # researchscan247.eecs.umich.edu
-141.212.121.248 # researchscan248.eecs.umich.edu
-141.212.121.249 # researchscan249.eecs.umich.edu
-141.212.121.250 # researchscan250.eecs.umich.edu
-141.212.121.251 # researchscan251.eecs.umich.edu
-141.212.121.252 # researchscan252.eecs.umich.edu
-141.212.121.253 # researchscan253.eecs.umich.edu
-141.212.121.254 # researchscan254.eecs.umich.edu
-141.212.122.1 # researchscan256.eecs.umich.edu
-141.212.122.2 # researchscan257.eecs.umich.edu
-141.212.122.3 # researchscan258.eecs.umich.edu
-141.212.122.4 # researchscan259.eecs.umich.edu
-141.212.122.5 # researchscan260.eecs.umich.edu
-141.212.122.6 # researchscan261.eecs.umich.edu
-141.212.122.7 # researchscan262.eecs.umich.edu
-141.212.122.8 # researchscan263.eecs.umich.edu
-141.212.122.9 # researchscan264.eecs.umich.edu
-141.212.122.10 # researchscan265.eecs.umich.edu
-141.212.122.11 # researchscan266.eecs.umich.edu
-141.212.122.12 # researchscan267.eecs.umich.edu
-141.212.122.13 # researchscan268.eecs.umich.edu
-141.212.122.14 # researchscan269.eecs.umich.edu
-141.212.122.15 # researchscan270.eecs.umich.edu
-141.212.122.16 # researchscan271.eecs.umich.edu
-141.212.122.17 # researchscan272.eecs.umich.edu
-141.212.122.18 # researchscan273.eecs.umich.edu
-141.212.122.19 # researchscan274.eecs.umich.edu
-141.212.122.20 # researchscan275.eecs.umich.edu
-141.212.122.21 # researchscan276.eecs.umich.edu
-141.212.122.22 # researchscan277.eecs.umich.edu
-141.212.122.23 # researchscan278.eecs.umich.edu
-141.212.122.24 # researchscan279.eecs.umich.edu
-141.212.122.25 # researchscan280.eecs.umich.edu
-141.212.122.26 # researchscan281.eecs.umich.edu
-141.212.122.27 # researchscan282.eecs.umich.edu
-141.212.122.28 # researchscan283.eecs.umich.edu
-141.212.122.29 # researchscan284.eecs.umich.edu
-141.212.122.30 # researchscan285.eecs.umich.edu
-141.212.122.31 # researchscan286.eecs.umich.edu
-141.212.122.32 # researchscan287.eecs.umich.edu
-141.212.122.33 # researchscan288.eecs.umich.edu
-141.212.122.34 # researchscan289.eecs.umich.edu
-141.212.122.35 # researchscan290.eecs.umich.edu
-141.212.122.36 # researchscan291.eecs.umich.edu
-141.212.122.37 # researchscan292.eecs.umich.edu
-141.212.122.38 # researchscan293.eecs.umich.edu
-141.212.122.39 # researchscan294.eecs.umich.edu
-141.212.122.40 # researchscan295.eecs.umich.edu
-141.212.122.41 # researchscan296.eecs.umich.edu
-141.212.122.42 # researchscan297.eecs.umich.edu
-141.212.122.43 # researchscan298.eecs.umich.edu
-141.212.122.44 # researchscan299.eecs.umich.edu
-141.212.122.45 # researchscan300.eecs.umich.edu
-141.212.122.46 # researchscan301.eecs.umich.edu
-141.212.122.47 # researchscan302.eecs.umich.edu
-141.212.122.48 # researchscan303.eecs.umich.edu
-141.212.122.49 # researchscan304.eecs.umich.edu
-141.212.122.50 # researchscan305.eecs.umich.edu
-141.212.122.51 # researchscan306.eecs.umich.edu
-141.212.122.52 # researchscan307.eecs.umich.edu
-141.212.122.53 # researchscan308.eecs.umich.edu
-141.212.122.54 # researchscan309.eecs.umich.edu
-141.212.122.55 # researchscan310.eecs.umich.edu
-141.212.122.56 # researchscan311.eecs.umich.edu
-141.212.122.57 # researchscan312.eecs.umich.edu
-141.212.122.58 # researchscan313.eecs.umich.edu
-141.212.122.59 # researchscan314.eecs.umich.edu
-141.212.122.60 # researchscan315.eecs.umich.edu
-141.212.122.61 # researchscan316.eecs.umich.edu
-141.212.122.62 # researchscan317.eecs.umich.edu
-141.212.122.63 # researchscan318.eecs.umich.edu
-141.212.122.64 # researchscan319.eecs.umich.edu
-141.212.122.65 # researchscan320.eecs.umich.edu
-141.212.122.66 # researchscan321.eecs.umich.edu
-141.212.122.67 # researchscan322.eecs.umich.edu
-141.212.122.68 # researchscan323.eecs.umich.edu
-141.212.122.69 # researchscan324.eecs.umich.edu
-141.212.122.70 # researchscan325.eecs.umich.edu
-141.212.122.71 # researchscan326.eecs.umich.edu
-141.212.122.72 # researchscan327.eecs.umich.edu
-141.212.122.73 # researchscan328.eecs.umich.edu
-141.212.122.74 # researchscan329.eecs.umich.edu
-141.212.122.76 # researchscan331.eecs.umich.edu
-141.212.122.77 # researchscan332.eecs.umich.edu
-141.212.122.78 # researchscan333.eecs.umich.edu
-141.212.122.79 # researchscan334.eecs.umich.edu
-141.212.122.80 # researchscan335.eecs.umich.edu
-141.212.122.81 # researchscan336.eecs.umich.edu
-141.212.122.82 # researchscan337.eecs.umich.edu
-141.212.122.83 # researchscan338.eecs.umich.edu
-141.212.122.84 # researchscan339.eecs.umich.edu
-141.212.122.85 # researchscan340.eecs.umich.edu
-141.212.122.86 # researchscan341.eecs.umich.edu
-141.212.122.87 # researchscan342.eecs.umich.edu
-141.212.122.88 # researchscan343.eecs.umich.edu
-141.212.122.89 # researchscan344.eecs.umich.edu
-141.212.122.90 # researchscan345.eecs.umich.edu
-141.212.122.91 # researchscan346.eecs.umich.edu
-141.212.122.92 # researchscan347.eecs.umich.edu
-141.212.122.93 # researchscan348.eecs.umich.edu
-141.212.122.94 # researchscan349.eecs.umich.edu
-141.212.122.95 # researchscan350.eecs.umich.edu
-141.212.122.96 # researchscan351.eecs.umich.edu
-141.212.122.97 # researchscan352.eecs.umich.edu
-141.212.122.98 # researchscan353.eecs.umich.edu
-141.212.122.99 # researchscan354.eecs.umich.edu
-141.212.122.100 # researchscan355.eecs.umich.edu
-141.212.122.101 # researchscan356.eecs.umich.edu
-141.212.122.102 # researchscan357.eecs.umich.edu
-141.212.122.103 # researchscan358.eecs.umich.edu
-141.212.122.104 # researchscan359.eecs.umich.edu
-141.212.122.105 # researchscan360.eecs.umich.edu
-141.212.122.106 # researchscan361.eecs.umich.edu
-141.212.122.107 # researchscan362.eecs.umich.edu
-141.212.122.108 # researchscan363.eecs.umich.edu
-141.212.122.109 # researchscan364.eecs.umich.edu
-141.212.122.110 # researchscan365.eecs.umich.edu
-141.212.122.111 # researchscan366.eecs.umich.edu
-141.212.122.112 # researchscan367.eecs.umich.edu
-141.212.122.113 # researchscan368.eecs.umich.edu
-141.212.122.114 # researchscan369.eecs.umich.edu
-141.212.122.115 # researchscan370.eecs.umich.edu
-141.212.122.116 # researchscan371.eecs.umich.edu
-141.212.122.117 # researchscan372.eecs.umich.edu
-141.212.122.118 # researchscan373.eecs.umich.edu
-141.212.122.119 # researchscan374.eecs.umich.edu
-141.212.122.120 # researchscan375.eecs.umich.edu
-141.212.122.121 # researchscan376.eecs.umich.edu
-141.212.122.122 # researchscan377.eecs.umich.edu
-141.212.122.123 # researchscan378.eecs.umich.edu
-141.212.122.124 # researchscan379.eecs.umich.edu
-141.212.122.125 # researchscan380.eecs.umich.edu
-141.212.122.126 # researchscan381.eecs.umich.edu
-141.212.122.127 # researchscan382.eecs.umich.edu
-141.212.122.128 # researchscan383.eecs.umich.edu
-141.212.122.129 # researchscan384.eecs.umich.edu
-141.212.122.130 # researchscan385.eecs.umich.edu
-141.212.122.131 # researchscan386.eecs.umich.edu
-141.212.122.132 # researchscan387.eecs.umich.edu
-141.212.122.133 # researchscan388.eecs.umich.edu
-141.212.122.134 # researchscan389.eecs.umich.edu
-141.212.122.135 # researchscan390.eecs.umich.edu
-141.212.122.136 # researchscan391.eecs.umich.edu
-141.212.122.137 # researchscan392.eecs.umich.edu
-141.212.122.138 # researchscan393.eecs.umich.edu
-141.212.122.139 # researchscan394.eecs.umich.edu
-141.212.122.140 # researchscan395.eecs.umich.edu
-141.212.122.141 # researchscan396.eecs.umich.edu
-141.212.122.142 # researchscan397.eecs.umich.edu
-141.212.122.143 # researchscan398.eecs.umich.edu
-141.212.122.144 # researchscan399.eecs.umich.edu
-141.212.122.145 # researchscan400.eecs.umich.edu
-141.212.122.146 # researchscan401.eecs.umich.edu
-141.212.122.147 # researchscan402.eecs.umich.edu
-141.212.122.148 # researchscan403.eecs.umich.edu
-141.212.122.149 # researchscan404.eecs.umich.edu
-141.212.122.150 # researchscan405.eecs.umich.edu
-141.212.122.151 # researchscan406.eecs.umich.edu
-141.212.122.152 # researchscan407.eecs.umich.edu
-141.212.122.153 # researchscan408.eecs.umich.edu
-141.212.122.154 # researchscan409.eecs.umich.edu
-141.212.122.155 # researchscan410.eecs.umich.edu
-141.212.122.157 # researchscan412.eecs.umich.edu
-141.212.122.158 # researchscan413.eecs.umich.edu
-141.212.122.159 # researchscan414.eecs.umich.edu
-141.212.122.160 # researchscan415.eecs.umich.edu
-141.212.122.161 # researchscan416.eecs.umich.edu
-141.212.122.162 # researchscan417.eecs.umich.edu
-141.212.122.163 # researchscan418.eecs.umich.edu
-141.212.122.164 # researchscan419.eecs.umich.edu
-141.212.122.165 # researchscan420.eecs.umich.edu
-141.212.122.167 # researchscan422.eecs.umich.edu
-141.212.122.169 # researchscan424.eecs.umich.edu
-141.212.122.170 # researchscan425.eecs.umich.edu
-141.212.122.171 # researchscan426.eecs.umich.edu
-141.212.122.172 # researchscan427.eecs.umich.edu
-141.212.122.173 # researchscan428.eecs.umich.edu
-141.212.122.174 # researchscan429.eecs.umich.edu
-141.212.122.175 # researchscan430.eecs.umich.edu
-141.212.122.176 # researchscan431.eecs.umich.edu
-141.212.122.177 # researchscan432.eecs.umich.edu
-141.212.122.178 # researchscan433.eecs.umich.edu
-141.212.122.179 # researchscan434.eecs.umich.edu
-141.212.122.180 # researchscan435.eecs.umich.edu
-141.212.122.181 # researchscan436.eecs.umich.edu
-141.212.122.182 # researchscan437.eecs.umich.edu
-141.212.122.183 # researchscan438.eecs.umich.edu
-141.212.122.184 # researchscan439.eecs.umich.edu
-141.212.122.185 # researchscan440.eecs.umich.edu
-141.212.122.186 # researchscan441.eecs.umich.edu
-141.212.122.187 # researchscan442.eecs.umich.edu
-141.212.122.188 # researchscan443.eecs.umich.edu
-141.212.122.189 # researchscan444.eecs.umich.edu
-141.212.122.190 # researchscan445.eecs.umich.edu
-141.212.122.191 # researchscan446.eecs.umich.edu
-141.212.122.192 # researchscan447.eecs.umich.edu
-141.212.122.193 # researchscan448.eecs.umich.edu
-141.212.122.194 # researchscan449.eecs.umich.edu
-141.212.122.195 # researchscan450.eecs.umich.edu
-141.212.122.196 # researchscan451.eecs.umich.edu
-141.212.122.197 # researchscan452.eecs.umich.edu
-141.212.122.198 # researchscan453.eecs.umich.edu
-141.212.122.199 # researchscan454.eecs.umich.edu
-141.212.122.200 # researchscan455.eecs.umich.edu
-141.212.122.201 # researchscan456.eecs.umich.edu
-141.212.122.202 # researchscan457.eecs.umich.edu
-141.212.122.203 # researchscan458.eecs.umich.edu
-141.212.122.205 # researchscan460.eecs.umich.edu
-141.212.122.206 # researchscan461.eecs.umich.edu
-141.212.122.207 # researchscan462.eecs.umich.edu
-141.212.122.208 # researchscan463.eecs.umich.edu
-141.212.122.209 # researchscan464.eecs.umich.edu
-141.212.122.210 # researchscan465.eecs.umich.edu
-141.212.122.211 # researchscan466.eecs.umich.edu
-141.212.122.212 # researchscan467.eecs.umich.edu
-141.212.122.213 # researchscan468.eecs.umich.edu
-141.212.122.215 # researchscan470.eecs.umich.edu
-141.212.122.216 # researchscan471.eecs.umich.edu
-141.212.122.217 # researchscan472.eecs.umich.edu
-141.212.122.218 # researchscan473.eecs.umich.edu
-141.212.122.219 # researchscan474.eecs.umich.edu
-141.212.122.220 # researchscan475.eecs.umich.edu
-141.212.122.221 # researchscan476.eecs.umich.edu
-141.212.122.222 # researchscan477.eecs.umich.edu
-141.212.122.223 # researchscan478.eecs.umich.edu
-141.212.122.224 # researchscan479.eecs.umich.edu
-141.212.122.225 # researchscan480.eecs.umich.edu
-141.212.122.226 # researchscan481.eecs.umich.edu
-141.212.122.227 # researchscan482.eecs.umich.edu
-141.212.122.228 # researchscan483.eecs.umich.edu
-141.212.122.229 # researchscan484.eecs.umich.edu
-141.212.122.230 # researchscan485.eecs.umich.edu
-141.212.122.231 # researchscan486.eecs.umich.edu
-141.212.122.232 # researchscan487.eecs.umich.edu
-141.212.122.233 # researchscan488.eecs.umich.edu
-141.212.122.234 # researchscan489.eecs.umich.edu
-141.212.122.235 # researchscan490.eecs.umich.edu
-141.212.122.236 # researchscan491.eecs.umich.edu
-141.212.122.237 # researchscan492.eecs.umich.edu
-141.212.122.238 # researchscan493.eecs.umich.edu
-141.212.122.239 # researchscan494.eecs.umich.edu
-141.212.122.240 # researchscan495.eecs.umich.edu
-141.212.122.241 # researchscan496.eecs.umich.edu
-141.212.122.242 # researchscan497.eecs.umich.edu
-141.212.122.243 # researchscan498.eecs.umich.edu
-141.212.122.244 # researchscan499.eecs.umich.edu
-141.212.122.245 # researchscan500.eecs.umich.edu
-141.212.122.246 # researchscan501.eecs.umich.edu
-141.212.122.247 # researchscan502.eecs.umich.edu
-141.212.122.248 # researchscan503.eecs.umich.edu
-141.212.122.249 # researchscan504.eecs.umich.edu
-141.212.122.250 # researchscan505.eecs.umich.edu
-141.212.122.251 # researchscan506.eecs.umich.edu
-141.212.122.252 # researchscan507.eecs.umich.edu
-141.212.122.253 # researchscan508.eecs.umich.edu
-141.212.122.254 # researchscan509.eecs.umich.edu
-141.212.123.2 # researchscan512.eecs.umich.edu
-141.212.123.3 # researchscan513.eecs.umich.edu
-141.212.123.4 # researchscan514.eecs.umich.edu
-141.212.123.5 # researchscan515.eecs.umich.edu
-141.212.123.6 # researchscan516.eecs.umich.edu
-141.212.123.7 # researchscan517.eecs.umich.edu
-141.212.123.8 # researchscan518.eecs.umich.edu
-141.212.123.9 # researchscan519.eecs.umich.edu
-141.212.123.10 # researchscan520.eecs.umich.edu
-141.212.123.11 # researchscan521.eecs.umich.edu
-141.212.123.12 # researchscan522.eecs.umich.edu
-141.212.123.13 # researchscan523.eecs.umich.edu
-141.212.123.14 # researchscan524.eecs.umich.edu
-141.212.123.15 # researchscan525.eecs.umich.edu
-141.212.123.16 # researchscan526.eecs.umich.edu
-141.212.123.17 # researchscan527.eecs.umich.edu
-141.212.123.18 # researchscan528.eecs.umich.edu
-141.212.123.19 # researchscan529.eecs.umich.edu
-141.212.123.20 # researchscan530.eecs.umich.edu
-141.212.123.21 # researchscan531.eecs.umich.edu
-141.212.123.22 # researchscan532.eecs.umich.edu
-141.212.123.23 # researchscan533.eecs.umich.edu
-141.212.123.24 # researchscan534.eecs.umich.edu
-141.212.123.25 # researchscan535.eecs.umich.edu
-141.212.123.26 # researchscan536.eecs.umich.edu
-141.212.123.27 # researchscan537.eecs.umich.edu
-141.212.123.28 # researchscan538.eecs.umich.edu
-141.212.123.29 # researchscan539.eecs.umich.edu
-141.212.123.30 # researchscan540.eecs.umich.edu
-141.212.123.31 # researchscan541.eecs.umich.edu
-141.212.123.32 # researchscan542.eecs.umich.edu
-141.212.123.33 # researchscan543.eecs.umich.edu
-141.212.123.34 # researchscan544.eecs.umich.edu
-141.212.123.35 # researchscan545.eecs.umich.edu
-141.212.123.36 # researchscan546.eecs.umich.edu
-141.212.123.37 # researchscan547.eecs.umich.edu
-141.212.123.38 # researchscan548.eecs.umich.edu
-141.212.123.39 # researchscan549.eecs.umich.edu
-141.212.123.40 # researchscan550.eecs.umich.edu
-141.212.123.41 # researchscan551.eecs.umich.edu
-141.212.123.42 # researchscan552.eecs.umich.edu
-141.212.123.43 # researchscan553.eecs.umich.edu
-141.212.123.44 # researchscan554.eecs.umich.edu
-141.212.123.45 # researchscan555.eecs.umich.edu
-141.212.123.46 # researchscan556.eecs.umich.edu
-141.212.123.47 # researchscan557.eecs.umich.edu
-141.212.123.48 # researchscan558.eecs.umich.edu
-141.212.123.49 # researchscan559.eecs.umich.edu
-141.212.123.50 # researchscan560.eecs.umich.edu
-141.212.123.51 # researchscan561.eecs.umich.edu
-141.212.123.52 # researchscan562.eecs.umich.edu
-141.212.123.53 # researchscan563.eecs.umich.edu
-141.212.123.55 # researchscan565.eecs.umich.edu
-141.212.123.56 # researchscan566.eecs.umich.edu
-141.212.123.57 # researchscan567.eecs.umich.edu
-141.212.123.58 # researchscan568.eecs.umich.edu
-141.212.123.59 # researchscan569.eecs.umich.edu
-141.212.123.60 # researchscan570.eecs.umich.edu
-141.212.123.61 # researchscan571.eecs.umich.edu
-141.212.123.62 # researchscan572.eecs.umich.edu
-141.212.123.63 # researchscan573.eecs.umich.edu
-141.212.123.64 # researchscan574.eecs.umich.edu
-141.212.123.65 # researchscan575.eecs.umich.edu
-141.212.123.67 # researchscan577.eecs.umich.edu
-141.212.123.68 # researchscan578.eecs.umich.edu
-141.212.123.69 # researchscan579.eecs.umich.edu
-141.212.123.70 # researchscan580.eecs.umich.edu
-141.212.123.71 # researchscan581.eecs.umich.edu
-141.212.123.72 # researchscan582.eecs.umich.edu
-141.212.123.73 # researchscan583.eecs.umich.edu
-141.212.123.74 # researchscan584.eecs.umich.edu
-141.212.123.75 # researchscan585.eecs.umich.edu
-141.212.123.76 # researchscan586.eecs.umich.edu
-141.212.123.77 # researchscan587.eecs.umich.edu
-141.212.123.78 # researchscan588.eecs.umich.edu
-141.212.123.79 # researchscan589.eecs.umich.edu
-141.212.123.80 # researchscan590.eecs.umich.edu
-141.212.123.81 # researchscan591.eecs.umich.edu
-141.212.123.82 # researchscan592.eecs.umich.edu
-141.212.123.83 # researchscan593.eecs.umich.edu
-141.212.123.84 # researchscan594.eecs.umich.edu
-141.212.123.85 # researchscan595.eecs.umich.edu
-141.212.123.86 # researchscan596.eecs.umich.edu
-141.212.123.87 # researchscan597.eecs.umich.edu
-141.212.123.88 # researchscan598.eecs.umich.edu
-141.212.123.89 # researchscan599.eecs.umich.edu
-141.212.123.90 # researchscan600.eecs.umich.edu
-141.212.123.91 # researchscan601.eecs.umich.edu
-141.212.123.92 # researchscan602.eecs.umich.edu
-141.212.123.93 # researchscan603.eecs.umich.edu
-141.212.123.94 # researchscan604.eecs.umich.edu
-141.212.123.95 # researchscan605.eecs.umich.edu
-141.212.123.96 # researchscan606.eecs.umich.edu
-141.212.123.97 # researchscan607.eecs.umich.edu
-141.212.123.98 # researchscan608.eecs.umich.edu
-141.212.123.99 # researchscan609.eecs.umich.edu
-141.212.123.100 # researchscan610.eecs.umich.edu
-141.212.123.101 # researchscan611.eecs.umich.edu
-141.212.123.102 # researchscan612.eecs.umich.edu
-141.212.123.103 # researchscan613.eecs.umich.edu
-141.212.123.104 # researchscan614.eecs.umich.edu
-141.212.123.105 # researchscan615.eecs.umich.edu
-141.212.123.106 # researchscan616.eecs.umich.edu
-141.212.123.107 # researchscan617.eecs.umich.edu
-141.212.123.108 # researchscan618.eecs.umich.edu
-141.212.123.109 # researchscan619.eecs.umich.edu
-141.212.123.110 # researchscan620.eecs.umich.edu
-141.212.123.111 # researchscan621.eecs.umich.edu
-141.212.123.112 # researchscan622.eecs.umich.edu
-141.212.123.113 # researchscan623.eecs.umich.edu
-141.212.123.114 # researchscan624.eecs.umich.edu
-141.212.123.115 # researchscan625.eecs.umich.edu
-141.212.123.116 # researchscan626.eecs.umich.edu
-141.212.123.117 # researchscan627.eecs.umich.edu
-141.212.123.118 # researchscan628.eecs.umich.edu
-141.212.123.119 # researchscan629.eecs.umich.edu
-141.212.123.120 # researchscan630.eecs.umich.edu
-141.212.123.121 # researchscan631.eecs.umich.edu
-141.212.123.122 # researchscan632.eecs.umich.edu
-141.212.123.123 # researchscan633.eecs.umich.edu
-141.212.123.124 # researchscan634.eecs.umich.edu
-141.212.123.125 # researchscan635.eecs.umich.edu
-141.212.123.126 # researchscan636.eecs.umich.edu
-141.212.123.127 # researchscan637.eecs.umich.edu
-141.212.123.128 # researchscan638.eecs.umich.edu
-141.212.123.129 # researchscan639.eecs.umich.edu
-141.212.123.130 # researchscan640.eecs.umich.edu
-141.212.123.131 # researchscan641.eecs.umich.edu
-141.212.123.132 # researchscan642.eecs.umich.edu
-141.212.123.133 # researchscan643.eecs.umich.edu
-141.212.123.134 # researchscan644.eecs.umich.edu
-141.212.123.135 # researchscan645.eecs.umich.edu
-141.212.123.136 # researchscan646.eecs.umich.edu
-141.212.123.137 # researchscan647.eecs.umich.edu
-141.212.123.138 # researchscan648.eecs.umich.edu
-141.212.123.139 # researchscan649.eecs.umich.edu
-141.212.123.140 # researchscan650.eecs.umich.edu
-141.212.123.141 # researchscan651.eecs.umich.edu
-141.212.123.142 # researchscan652.eecs.umich.edu
-141.212.123.143 # researchscan653.eecs.umich.edu
-141.212.123.144 # researchscan654.eecs.umich.edu
-141.212.123.145 # researchscan655.eecs.umich.edu
-141.212.123.146 # researchscan656.eecs.umich.edu
-141.212.123.147 # researchscan657.eecs.umich.edu
-141.212.123.148 # researchscan658.eecs.umich.edu
-141.212.123.149 # researchscan659.eecs.umich.edu
-141.212.123.150 # researchscan660.eecs.umich.edu
-141.212.123.151 # researchscan661.eecs.umich.edu
-141.212.123.152 # researchscan662.eecs.umich.edu
-141.212.123.153 # researchscan663.eecs.umich.edu
-141.212.123.154 # researchscan664.eecs.umich.edu
-141.212.123.155 # researchscan665.eecs.umich.edu
-141.212.123.156 # researchscan666.eecs.umich.edu
-141.212.123.157 # researchscan667.eecs.umich.edu
-141.212.123.158 # researchscan668.eecs.umich.edu
-141.212.123.159 # researchscan669.eecs.umich.edu
-141.212.123.160 # researchscan670.eecs.umich.edu
-141.212.123.161 # researchscan671.eecs.umich.edu
-141.212.123.163 # researchscan673.eecs.umich.edu
-141.212.123.164 # researchscan674.eecs.umich.edu
-141.212.123.165 # researchscan675.eecs.umich.edu
-141.212.123.166 # researchscan676.eecs.umich.edu
-141.212.123.167 # researchscan677.eecs.umich.edu
-141.212.123.168 # researchscan678.eecs.umich.edu
-141.212.123.169 # researchscan679.eecs.umich.edu
-141.212.123.170 # researchscan680.eecs.umich.edu
-141.212.123.171 # researchscan681.eecs.umich.edu
-141.212.123.172 # researchscan682.eecs.umich.edu
-141.212.123.173 # researchscan683.eecs.umich.edu
-141.212.123.174 # researchscan684.eecs.umich.edu
-141.212.123.175 # researchscan685.eecs.umich.edu
-141.212.123.176 # researchscan686.eecs.umich.edu
-141.212.123.177 # researchscan687.eecs.umich.edu
-141.212.123.178 # researchscan688.eecs.umich.edu
-141.212.123.179 # researchscan689.eecs.umich.edu
-141.212.123.180 # researchscan690.eecs.umich.edu
-141.212.123.181 # researchscan691.eecs.umich.edu
-141.212.123.182 # researchscan692.eecs.umich.edu
-141.212.123.183 # researchscan693.eecs.umich.edu
-141.212.123.184 # researchscan694.eecs.umich.edu
-141.212.123.185 # researchscan695.eecs.umich.edu
-141.212.123.186 # researchscan696.eecs.umich.edu
-141.212.123.187 # researchscan697.eecs.umich.edu
-141.212.123.188 # researchscan698.eecs.umich.edu
-141.212.123.189 # researchscan699.eecs.umich.edu
-141.212.123.190 # researchscan700.eecs.umich.edu
-141.212.123.191 # researchscan701.eecs.umich.edu
-141.212.123.192 # researchscan702.eecs.umich.edu
-141.212.123.193 # researchscan703.eecs.umich.edu
-141.212.123.194 # researchscan704.eecs.umich.edu
-141.212.123.195 # researchscan705.eecs.umich.edu
-141.212.123.197 # researchscan707.eecs.umich.edu
-141.212.123.198 # researchscan708.eecs.umich.edu
-141.212.123.199 # researchscan709.eecs.umich.edu
-141.212.123.200 # researchscan710.eecs.umich.edu
-141.212.123.201 # researchscan711.eecs.umich.edu
-141.212.123.202 # researchscan712.eecs.umich.edu
-141.212.123.203 # researchscan713.eecs.umich.edu
-141.212.123.204 # researchscan714.eecs.umich.edu
-141.212.123.205 # researchscan715.eecs.umich.edu
-141.212.123.206 # researchscan716.eecs.umich.edu
-141.212.123.207 # researchscan717.eecs.umich.edu
-141.212.123.208 # researchscan718.eecs.umich.edu
-141.212.123.209 # researchscan719.eecs.umich.edu
-141.212.123.210 # researchscan720.eecs.umich.edu
-141.212.123.211 # researchscan721.eecs.umich.edu
-141.212.123.212 # researchscan722.eecs.umich.edu
-141.212.123.213 # researchscan723.eecs.umich.edu
-141.212.123.215 # researchscan725.eecs.umich.edu
-141.212.123.216 # researchscan726.eecs.umich.edu
-141.212.123.217 # researchscan727.eecs.umich.edu
-141.212.123.218 # researchscan728.eecs.umich.edu
-141.212.123.219 # researchscan729.eecs.umich.edu
-141.212.123.220 # researchscan730.eecs.umich.edu
-141.212.123.221 # researchscan731.eecs.umich.edu
-141.212.123.222 # researchscan732.eecs.umich.edu
-141.212.123.223 # researchscan733.eecs.umich.edu
-141.212.123.224 # researchscan734.eecs.umich.edu
-141.212.123.225 # researchscan735.eecs.umich.edu
-141.212.123.226 # researchscan736.eecs.umich.edu
-141.212.123.227 # researchscan737.eecs.umich.edu
-141.212.123.228 # researchscan738.eecs.umich.edu
-141.212.123.229 # researchscan739.eecs.umich.edu
-141.212.123.230 # researchscan740.eecs.umich.edu
-141.212.123.231 # researchscan741.eecs.umich.edu
-141.212.123.232 # researchscan742.eecs.umich.edu
-141.212.123.233 # researchscan743.eecs.umich.edu
-141.212.123.234 # researchscan744.eecs.umich.edu
-141.212.123.235 # researchscan745.eecs.umich.edu
-141.212.123.236 # researchscan746.eecs.umich.edu
-141.212.123.237 # researchscan747.eecs.umich.edu
-141.212.123.238 # researchscan748.eecs.umich.edu
-141.212.123.239 # researchscan749.eecs.umich.edu
-141.212.123.240 # researchscan750.eecs.umich.edu
-141.212.123.241 # researchscan751.eecs.umich.edu
-141.212.123.242 # researchscan752.eecs.umich.edu
-141.212.123.243 # researchscan753.eecs.umich.edu
-141.212.123.244 # researchscan754.eecs.umich.edu
-141.212.123.245 # researchscan755.eecs.umich.edu
-141.212.123.246 # researchscan756.eecs.umich.edu
-141.212.123.247 # researchscan757.eecs.umich.edu
-141.212.123.248 # researchscan758.eecs.umich.edu
-141.212.123.249 # researchscan759.eecs.umich.edu
-141.212.123.250 # researchscan760.eecs.umich.edu
-141.212.123.251 # researchscan761.eecs.umich.edu
-141.212.123.252 # researchscan762.eecs.umich.edu
-141.212.123.253 # researchscan763.eecs.umich.edu
-141.212.123.254 # researchscan764.eecs.umich.edu
-
-107.150.52.82 # probe01.projectblindferret.com
-107.150.52.84 # probe02.projectblindferret.com
-107.150.52.85 # probe03.projectblindferret.com
-107.150.52.86 # probe04.projectblindferret.com
-64.227.90.185 # draft.census.shodan.io
-66.240.192.138 # census8.shodan.io
-66.240.205.34 # malware-hunter.census.shodan.io
-66.240.219.146 # burger.census.shodan.io
-66.240.219.173 # wall.census.shodan.io
-66.240.236.119 # census6.shodan.io
-71.6.135.131 # census7.shodan.io
-71.6.146.130 # refrigerator.census.shodan.io
-71.6.146.185 # pirate.census.shodan.io
-71.6.146.186 # inspire.census.shodan.io
-71.6.147.198 # board.census.shodan.io
-71.6.147.254 # tesla.census.shodan.io
-71.6.158.166 # ninja.census.shodan.io
-71.6.165.200 # census12.shodan.io
-71.6.167.142 # census9.shodan.io
-71.6.199.23 # einstein.census.shodan.io
-80.82.77.139 # dojo.census.shodan.io
-80.82.77.33 # sky.census.shodan.io
-82.221.105.6 # census10.shodan.io
-82.221.105.7 # census11.shodan.io
-85.25.103.50 # pacific.census.shodan.io
-85.25.43.94 # rim.census.shodan.io
-89.248.167.131 # mason.census.shodan.io
-89.248.172.16 # house.census.shodan.io
-93.120.27.62 # census5.shodan.io
-93.174.95.106 # battery.census.shodan.io
-94.102.49.190 # flower.census.shodan.io
-94.102.49.193 # cloud.census.shodan.io
-104.131.0.69 # hello.data.shodan.io
-165.227.55.4 # kiwi.census.shodan.io.
-165.227.62.247 # mango.census.shodan.io
-185.142.236.34 # hat.census.shodan.io
-185.142.236.35 # wine.census.shodan.io
-185.142.236.36 # green.census.shodan.io
-185.142.236.38 # shodan.io
-185.142.236.40 # blue.census.shodan.io
-185.142.236.43 # blue2.census.shodan.io
-185.142.239.16 # red2.census.shodan.io
-185.165.190.17 # purple.census.shodan.io
-185.165.190.34 # red.census.shodan.io.
-185.181.102.18 # turtle.census.shodan.io
-188.138.9.50 # atlantic.census.shodan.io
-195.144.21.56 # red3.census.shodan.io
-198.20.69.74 # census1.shodan.io
-198.20.69.98 # census2.shodan.io
-198.20.70.114 # census3.shodan.io
-198.20.87.98 # border.census.shodan.io
-198.20.99.130 # census4.shodan.io
-209.126.110.38 # atlantic.dns.shodan.io
-216.117.2.180 # shodan.io (parking)
-
-184.105.139.100 # scan-02h.shadowserver.org
-184.105.139.101 # scan-03g.shadowserver.org
-184.105.139.102 # scan-04h.shadowserver.org
-184.105.139.103 # scan-01j.shadowserver.org
-184.105.139.104 # scan-02i.shadowserver.org
-184.105.139.105 # scan-03h.shadowserver.org
-184.105.139.106 # scan-04i.shadowserver.org
-184.105.139.107 # scan-01k.shadowserver.org
-184.105.139.108 # scan-02j.shadowserver.org
-184.105.139.109 # scan-03i.shadowserver.org
-184.105.139.110 # scan-04j.shadowserver.org
-184.105.139.111 # scan-01l.shadowserver.org
-184.105.139.112 # scan-02k.shadowserver.org
-184.105.139.113 # scan-03j.shadowserver.org
-184.105.139.114 # scan-04k.shadowserver.org
-184.105.139.115 # scan-01m.shadowserver.org
-184.105.139.116 # scan-02l.shadowserver.org
-184.105.139.117 # scan-03k.shadowserver.org
-184.105.139.118 # scan-04l.shadowserver.org
-184.105.139.119 # scan-01n.shadowserver.org
-184.105.139.120 # scan-02m.shadowserver.org
-184.105.139.121 # scan-03l.shadowserver.org
-184.105.139.122 # scan-04m.shadowserver.org
-184.105.139.123 # scan-01o.shadowserver.org
-184.105.139.124 # scan-02n.shadowserver.org
-184.105.139.125 # scan-03m.shadowserver.org
-184.105.139.126 # scan-00a.shadowserver.org
-184.105.139.66 # scan-00.shadowserver.org
-184.105.139.67 # scan-01.shadowserver.org
-184.105.139.68 # scan-02.shadowserver.org
-184.105.139.69 # scan-03.shadowserver.org
-184.105.139.70 # scan-04.shadowserver.org
-184.105.139.71 # scan-01a.shadowserver.org
-184.105.139.72 # scan-02a.shadowserver.org
-184.105.139.73 # scan-03a.shadowserver.org
-184.105.139.74 # scan-04a.shadowserver.org
-184.105.139.75 # scan-01c.shadowserver.org
-184.105.139.76 # scan-02b.shadowserver.org
-184.105.139.77 # scan-03b.shadowserver.org
-184.105.139.78 # scan-04b.shadowserver.org
-184.105.139.79 # scan-01d.shadowserver.org
-184.105.139.80 # scan-02c.shadowserver.org
-184.105.139.81 # scan-03b.shadowserver.org
-184.105.139.82 # scan-04c.shadowserver.org
-184.105.139.83 # scan-01e.shadowserver.org
-184.105.139.84 # scan-02d.shadowserver.org
-184.105.139.85 # scan-03c.shadowserver.org
-184.105.139.86 # scan-04d.shadowserver.org
-184.105.139.87 # scan-01f.shadowserver.org
-184.105.139.88 # scan-02e.shadowserver.org
-184.105.139.89 # scan-03d.shadowserver.org
-184.105.139.90 # scan-04e.shadowserver.org
-184.105.139.91 # scan-01g.shadowserver.org
-184.105.139.92 # scan-02f.shadowserver.org
-184.105.139.93 # scan-03e.shadowserver.org
-184.105.139.94 # scan-04f.shadowserver.org
-184.105.139.95 # scan-01h.shadowserver.org
-184.105.139.96 # scan-02g.shadowserver.org
-184.105.139.97 # scan-03f.shadowserver.org
-184.105.139.98 # scan-04g.shadowserver.org
-184.105.139.99 # scan-01i.shadowserver.org
-184.105.143.133 # dnsscan.shadowserver.org
-184.105.247.194 # scan-13.shadowserver.org
-184.105.247.195 # scan-14.shadowserver.org
-184.105.247.196 # scan-15.shadowserver.org
-184.105.247.197 # scan-16.shadowserver.org
-184.105.247.198 # scan-13a.shadowserver.org
-184.105.247.199 # scan-14a.shadowserver.org
-184.105.247.200 # scan-15a.shadowserver.org
-184.105.247.201 # scan-16a.shadowserver.org
-184.105.247.202 # scan-13b.shadowserver.org
-184.105.247.203 # scan-14b.shadowserver.org
-184.105.247.204 # scan-15b.shadowserver.org
-184.105.247.205 # scan-16b.shadowserver.org
-184.105.247.206 # scan-13c.shadowserver.org
-184.105.247.207 # scan-14c.shadowserver.org
-184.105.247.208 # scan-15c.shadowserver.org
-184.105.247.209 # scan-16c.shadowserver.org
-184.105.247.210 # scan-13d.shadowserver.org
-184.105.247.211 # scan-14d.shadowserver.org
-184.105.247.212 # scan-15d.shadowserver.org
-184.105.247.213 # scan-16d.shadowserver.org
-184.105.247.214 # scan-13e.shadowserver.org
-184.105.247.215 # scan-14e.shadowserver.org
-184.105.247.216 # scan-15e.shadowserver.org
-184.105.247.217 # scan-16e.shadowserver.org
-184.105.247.218 # scan-13f.shadowserver.org
-184.105.247.219 # scan-14f.shadowserver.org
-184.105.247.220 # scan-15f.shadowserver.org
-184.105.247.221 # scan-16f.shadowserver.org
-184.105.247.222 # scan-13g.shadowserver.org
-184.105.247.223 # scan-14g.shadowserver.org
-184.105.247.224 # scan-15g.shadowserver.org
-184.105.247.225 # scan-16g.shadowserver.org
-184.105.247.226 # scan-13h.shadowserver.org
-184.105.247.227 # scan-14h.shadowserver.org
-184.105.247.228 # scan-15h.shadowserver.org
-184.105.247.229 # scan-16h.shadowserver.org
-184.105.247.230 # scan-13i.shadowserver.org
-184.105.247.231 # scan-14i.shadowserver.org
-184.105.247.232 # scan-15i.shadowserver.org
-184.105.247.233 # scan-16i.shadowserver.org
-184.105.247.234 # scan-13j.shadowserver.org
-184.105.247.235 # scan-14j.shadowserver.org
-184.105.247.236 # scan-15j.shadowserver.org
-184.105.247.237 # scan-16j.shadowserver.org
-184.105.247.238 # scan-13k.shadowserver.org
-184.105.247.239 # scan-14k.shadowserver.org
-184.105.247.240 # scan-15k.shadowserver.org
-184.105.247.241 # scan-16k.shadowserver.org
-184.105.247.242 # scan-13l.shadowserver.org
-184.105.247.243 # scan-14l.shadowserver.org
-184.105.247.244 # scan-15l.shadowserver.org
-184.105.247.245 # scan-16l.shadowserver.org
-184.105.247.246 # scan-13m.shadowserver.org
-184.105.247.247 # scan-14m.shadowserver.org
-184.105.247.248 # scan-15m.shadowserver.org
-184.105.247.249 # scan-16m.shadowserver.org
-184.105.247.250 # scan-13n.shadowserver.org
-184.105.247.251 # scan-14n.shadowserver.org
-184.105.247.252 # scan-15n.shadowserver.org
-184.105.247.253 # scan-16n.shadowserver.org
-184.105.247.254 # scan-13o.shadowserver.org
-216.218.206.100 # scan-07h.shadowserver.org
-216.218.206.101 # scan-08h.shadowserver.org
-216.218.206.102 # scan-05i.shadowserver.org
-216.218.206.103 # scan-06i.shadowserver.org
-216.218.206.104 # scan-07u.shadowserver.org
-216.218.206.105 # scan-08i.shadowserver.org
-216.218.206.106 # scan-05j.shadowserver.org
-216.218.206.107 # scan-06j.shadowserver.org
-216.218.206.108 # scan-07j.shadowserver.org
-216.218.206.109 # scan-08j.shadowserver.org
-216.218.206.110 # scan-05k.shadowserver.org
-216.218.206.111 # scan-06k.shadowserver.org
-216.218.206.112 # scan-07k.shadowserver.org
-216.218.206.113 # scan-08k.shadowserver.org
-216.218.206.114 # scan-05l.shadowserver.org
-216.218.206.115 # scan-06l.shadowserver.org
-216.218.206.116 # scan-07l.shadowserver.org
-216.218.206.117 # scan-08l.shadowserver.org
-216.218.206.118 # scan-05m.shadowserver.org
-216.218.206.119 # scan-06m.shadowserver.org
-216.218.206.120 # scan-07m.shadowserver.org
-216.218.206.121 # scan-08m.shadowserver.org
-216.218.206.122 # scan-05n.shadowserver.org
-216.218.206.123 # scan-06n.shadowserver.org
-216.218.206.124 # scan-07n.shadowserver.org
-216.218.206.125 # scan-08n.shadowserver.org
-216.218.206.126 # scan-05o.shadowserver.org
-216.218.206.66 # scan-05.shadowserver.org
-216.218.206.67 # scan-06.shadowserver.org
-216.218.206.68 # scan-07.shadowserver.org
-216.218.206.69 # scan-08.shadowserver.org
-216.218.206.70 # scan-05a.shadowserver.org
-216.218.206.71 # scan-06a.shadowserver.org
-216.218.206.72 # scan-07a.shadowserver.org
-216.218.206.73 # scan-08a.shadowserver.org
-216.218.206.74 # scan-05b.shadowserver.org
-216.218.206.75 # scan-06b.shadowserver.org
-216.218.206.76 # scan-07b.shadowserver.org
-216.218.206.77 # scan-08b.shadowserver.org
-216.218.206.78 # scan-05c.shadowserver.org
-216.218.206.79 # scan-06c.shadowserver.org
-216.218.206.80 # scan-07c.shadowserver.org
-216.218.206.81 # scan-08c.shadowserver.org
-216.218.206.82 # scan-05d.shadowserver.org
-216.218.206.83 # scan-06d.shadowserver.org
-216.218.206.84 # scan-07d.shadowserver.org
-216.218.206.85 # scan-08d.shadowserver.org
-216.218.206.86 # scan-05e.shadowserver.org
-216.218.206.87 # scan-06e.shadowserver.org
-216.218.206.88 # scan-07e.shadowserver.org
-216.218.206.89 # scan-08e.shadowserver.org
-216.218.206.90 # scan-05f.shadowserver.org
-216.218.206.91 # scan-06f.shadowserver.org
-216.218.206.92 # scan-07f.shadowserver.org
-216.218.206.93 # scan-08f.shadowserver.org
-216.218.206.94 # scan-05g.shadowserver.org
-216.218.206.95 # scan-06g.shadowserver.org
-216.218.206.96 # scan-07g.shadowserver.org
-216.218.206.97 # scan-08g.shadowserver.org
-216.218.206.98 # scan-05h.shadowserver.org
-216.218.206.99 # scan-06h.shadowserver.org
-65.49.20.100 # scan-19h.shadowserver.org
-65.49.20.101 # scan-20h.shadowserver.org
-65.49.20.102 # scan-17i.shadowserver.org
-65.49.20.103 # scan-18i.shadowserver.org
-65.49.20.104 # scan-19i.shadowserver.org
-65.49.20.105 # scan-20i.shadowserver.org
-65.49.20.106 # scan-17j.shadowserver.org
-65.49.20.107 # scan-18j.shadowserver.org
-65.49.20.108 # scan-19j.shadowserver.org
-65.49.20.109 # scan-20j.shadowserver.org
-65.49.20.110 # scan-17k.shadowserver.org
-65.49.20.111 # scan-18k.shadowserver.org
-65.49.20.112 # scan-19k.shadowserver.org
-65.49.20.113 # scan-20k.shadowserver.org
-65.49.20.114 # scan-17l.shadowserver.org
-65.49.20.115 # scan-18l.shadowserver.org
-65.49.20.116 # scan-19l.shadowserver.org
-65.49.20.117 # scan-20l.shadowserver.org
-65.49.20.118 # scan-17m.shadowserver.org
-65.49.20.119 # scan-18m.shadowserver.org
-65.49.20.120 # scan-19m.shadowserver.org
-65.49.20.121 # scan-20m.shadowserver.org
-65.49.20.122 # scan-17n.shadowserver.org
-65.49.20.123 # scan-18n.shadowserver.org
-65.49.20.124 # scan-19n.shadowserver.org
-65.49.20.125 # scan-20n.shadowserver.org
-65.49.20.126 # scan-17o.shadowserver.org
-65.49.20.66 # scan-17.shadowserver.org
-65.49.20.67 # scan-18.shadowserver.org
-65.49.20.68 # scan-19.shadowserver.org
-65.49.20.69 # scan-20.shadowserver.org
-65.49.20.70 # scan-17a.shadowserver.org
-65.49.20.71 # scan-18a.shadowserver.org
-65.49.20.72 # scan-19a.shadowserver.org
-65.49.20.73 # scan-20a.shadowserver.org
-65.49.20.74 # scan-17b.shadowserver.org
-65.49.20.75 # scan-18b.shadowserver.org
-65.49.20.76 # scan-19b.shadowserver.org
-65.49.20.77 # scan-20b.shadowserver.org
-65.49.20.78 # scan-17c.shadowserver.org
-65.49.20.79 # scan-18c.shadowserver.org
-65.49.20.80 # scan-19c.shadowserver.org
-65.49.20.81 # scan-20c.shadowserver.org
-65.49.20.82 # scan-17d.shadowserver.org
-65.49.20.83 # scan-18d.shadowserver.org
-65.49.20.84 # scan-19d.shadowserver.org
-65.49.20.85 # scan-20d.shadowserver.org
-65.49.20.86 # scan-17e.shadowserver.org
-65.49.20.87 # scan-18e.shadowserver.org
-65.49.20.88 # scan-19e.shadowserver.org
-65.49.20.89 # scan-20e.shadowserver.org
-65.49.20.90 # scan-17f.shadowserver.org
-65.49.20.91 # scan-18f.shadowserver.org
-65.49.20.92 # scan-19f.shadowserver.org
-65.49.20.93 # scan-20f.shadowserver.org
-65.49.20.94 # scan-17g.shadowserver.org
-65.49.20.95 # scan-18g.shadowserver.org
-65.49.20.96 # scan-19g.shadowserver.org
-65.49.20.97 # scan-20g.shadowserver.org
-65.49.20.98 # scan-17h.shadowserver.org
-65.49.20.99 # scan-18h.shadowserver.org
-74.82.47.10 # scan-09b.shadowserver.org
-74.82.47.11 # scan-10b.shadowserver.org
-74.82.47.12 # scan-11b.shadowserver.org
-74.82.47.13 # scan-12b.shadowserver.org
-74.82.47.14 # scan-09c.shadowserver.org
-74.82.47.15 # scan-10c.shadowserver.org
-74.82.47.16 # scan-11c.shadowserver.org
-74.82.47.17 # scan-12b.shadowserver.org
-74.82.47.18 # scan-09d.shadowserver.org
-74.82.47.19 # scan-10d.shadowserver.org
-74.82.47.1 # (unknown)
-74.82.47.20 # scan-11d.shadowserver.org
-74.82.47.21 # scan-12c.shadowserver.org
-74.82.47.22 # scan-09e.shadowserver.org
-74.82.47.23 # scan-10e.shadowserver.org
-74.82.47.24 # scan-11e.shadowserver.org
-74.82.47.25 # scan-12d.shadowserver.org
-74.82.47.26 # scan-09f.shadowserver.org
-74.82.47.27 # scan-10f.shadowserver.org
-74.82.47.28 # scan-11f.shadowserver.org
-74.82.47.29 # scan-12e.shadowserver.org
-74.82.47.2 # scan-09.shadowserver.org
-74.82.47.30 # scan-09g.shadowserver.org
-74.82.47.31 # scan-10g.shadowserver.org
-74.82.47.32 # scan-11g.shadowserver.org
-74.82.47.33 # scan-12f.shadowserver.org
-74.82.47.34 # scan-09h.shadowserver.org
-74.82.47.35 # scan-10h.shadowserver.org
-74.82.47.36 # scan-11h.shadowserver.org
-74.82.47.37 # scan-12g.shadowserver.org
-74.82.47.38 # scan-09i.shadowserver.org
-74.82.47.39 # scan-10i.shadowserver.org
-74.82.47.3 # scan-10.shadowserver.org
-74.82.47.40 # scan-11i.shadowserver.org
-74.82.47.41 # scan-12h.shadowserver.org
-74.82.47.42 # scan-09j.shadowserver.org
-74.82.47.43 # scan-10j.shadowserver.org
-74.82.47.44 # scan-11j.shadowserver.org
-74.82.47.45 # scan-12i.shadowserver.org
-74.82.47.46 # (unknown)
-74.82.47.47 # scan-10k.shadowserver.org
-74.82.47.48 # scan-11k.shadowserver.org
-74.82.47.49 # scan-12j.shadowserver.org
-74.82.47.4 # scan-11.shadowserver.org
-74.82.47.50 # scan-09l.shadowserver.org
-74.82.47.51 # scan-10l.shadowserver.org
-74.82.47.52 # scan-11l.shadowserver.org
-74.82.47.53 # scan-12k.shadowserver.org
-74.82.47.54 # scan-09m.shadowserver.org
-74.82.47.55 # scan-10m.shadowserver.org
-74.82.47.56 # scan-11m.shadowserver.org
-74.82.47.57 # scan-12l.shadowserver.org
-74.82.47.58 # scan-09n.shadowserver.org
-74.82.47.59 # scan-10n.shadowserver.org
-74.82.47.5 # scan-12.shadowserver.org
-74.82.47.60 # scan-11n.shadowserver.org
-74.82.47.61 # scan-12m.shadowserver.org
-74.82.47.62 # scan-09o.shadowserver.org
-74.82.47.63 # scan-10o.shadowserver.org
-74.82.47.6 # scan-09a.shadowserver.org
-74.82.47.7 # scan-10a.shadowserver.org
-74.82.47.8 # scan-11a.shadowserver.org
-74.82.47.9 # scan-12a.shadowserver.org
-
-185.35.62.0 # kudelskisecurity.com
-185.35.62.1 # kudelskisecurity.com
-185.35.62.2 # kudelskisecurity.com
-185.35.62.3 # kudelskisecurity.com
-185.35.62.4 # kudelskisecurity.com
-185.35.62.5 # kudelskisecurity.com
-185.35.62.6 # kudelskisecurity.com
-185.35.62.7 # kudelskisecurity.com
-185.35.62.8 # kudelskisecurity.com
-185.35.62.9 # kudelskisecurity.com
-185.35.62.10 # kudelskisecurity.com
-185.35.62.11 # kudelskisecurity.com
-185.35.62.12 # kudelskisecurity.com
-185.35.62.13 # kudelskisecurity.com
-185.35.62.14 # kudelskisecurity.com
-185.35.62.15 # kudelskisecurity.com
-185.35.62.16 # kudelskisecurity.com
-185.35.62.17 # kudelskisecurity.com
-185.35.62.18 # kudelskisecurity.com
-185.35.62.19 # kudelskisecurity.com
-185.35.62.20 # kudelskisecurity.com
-185.35.62.21 # kudelskisecurity.com
-185.35.62.22 # kudelskisecurity.com
-185.35.62.23 # kudelskisecurity.com
-185.35.62.24 # kudelskisecurity.com
-185.35.62.25 # kudelskisecurity.com
-185.35.62.26 # kudelskisecurity.com
-185.35.62.27 # kudelskisecurity.com
-185.35.62.28 # kudelskisecurity.com
-185.35.62.29 # kudelskisecurity.com
-185.35.62.30 # kudelskisecurity.com
-185.35.62.31 # kudelskisecurity.com
-185.35.62.32 # kudelskisecurity.com
-185.35.62.33 # kudelskisecurity.com
-185.35.62.34 # kudelskisecurity.com
-185.35.62.35 # kudelskisecurity.com
-185.35.62.36 # kudelskisecurity.com
-185.35.62.37 # kudelskisecurity.com
-185.35.62.38 # kudelskisecurity.com
-185.35.62.39 # kudelskisecurity.com
-185.35.62.40 # kudelskisecurity.com
-185.35.62.41 # kudelskisecurity.com
-185.35.62.42 # kudelskisecurity.com
-185.35.62.43 # kudelskisecurity.com
-185.35.62.44 # kudelskisecurity.com
-185.35.62.45 # kudelskisecurity.com
-185.35.62.46 # kudelskisecurity.com
-185.35.62.47 # kudelskisecurity.com
-185.35.62.48 # kudelskisecurity.com
-185.35.62.49 # kudelskisecurity.com
-185.35.62.50 # kudelskisecurity.com
-185.35.62.51 # kudelskisecurity.com
-185.35.62.52 # kudelskisecurity.com
-185.35.62.53 # kudelskisecurity.com
-185.35.62.54 # kudelskisecurity.com
-185.35.62.55 # kudelskisecurity.com
-185.35.62.56 # kudelskisecurity.com
-185.35.62.57 # kudelskisecurity.com
-185.35.62.58 # kudelskisecurity.com
-185.35.62.59 # kudelskisecurity.com
-185.35.62.60 # kudelskisecurity.com
-185.35.62.61 # kudelskisecurity.com
-185.35.62.62 # kudelskisecurity.com
-185.35.62.63 # kudelskisecurity.com
-185.35.62.64 # kudelskisecurity.com
-185.35.62.65 # kudelskisecurity.com
-185.35.62.66 # kudelskisecurity.com
-185.35.62.67 # kudelskisecurity.com
-185.35.62.68 # kudelskisecurity.com
-185.35.62.69 # kudelskisecurity.com
-185.35.62.70 # kudelskisecurity.com
-185.35.62.71 # kudelskisecurity.com
-185.35.62.72 # kudelskisecurity.com
-185.35.62.73 # kudelskisecurity.com
-185.35.62.74 # kudelskisecurity.com
-185.35.62.75 # kudelskisecurity.com
-185.35.62.76 # kudelskisecurity.com
-185.35.62.77 # kudelskisecurity.com
-185.35.62.78 # kudelskisecurity.com
-185.35.62.79 # kudelskisecurity.com
-185.35.62.80 # kudelskisecurity.com
-185.35.62.81 # kudelskisecurity.com
-185.35.62.82 # kudelskisecurity.com
-185.35.62.83 # kudelskisecurity.com
-185.35.62.84 # kudelskisecurity.com
-185.35.62.85 # kudelskisecurity.com
-185.35.62.86 # kudelskisecurity.com
-185.35.62.87 # kudelskisecurity.com
-185.35.62.88 # kudelskisecurity.com
-185.35.62.89 # kudelskisecurity.com
-185.35.62.90 # kudelskisecurity.com
-185.35.62.91 # kudelskisecurity.com
-185.35.62.92 # kudelskisecurity.com
-185.35.62.93 # kudelskisecurity.com
-185.35.62.94 # kudelskisecurity.com
-185.35.62.95 # kudelskisecurity.com
-185.35.62.96 # kudelskisecurity.com
-185.35.62.97 # kudelskisecurity.com
-185.35.62.98 # kudelskisecurity.com
-185.35.62.99 # kudelskisecurity.com
-185.35.62.100 # kudelskisecurity.com
-185.35.62.101 # kudelskisecurity.com
-185.35.62.102 # kudelskisecurity.com
-185.35.62.103 # kudelskisecurity.com
-185.35.62.104 # kudelskisecurity.com
-185.35.62.105 # kudelskisecurity.com
-185.35.62.106 # kudelskisecurity.com
-185.35.62.107 # kudelskisecurity.com
-185.35.62.108 # kudelskisecurity.com
-185.35.62.109 # kudelskisecurity.com
-185.35.62.110 # kudelskisecurity.com
-185.35.62.111 # kudelskisecurity.com
-185.35.62.112 # kudelskisecurity.com
-185.35.62.113 # kudelskisecurity.com
-185.35.62.114 # kudelskisecurity.com
-185.35.62.115 # kudelskisecurity.com
-185.35.62.116 # kudelskisecurity.com
-185.35.62.117 # kudelskisecurity.com
-185.35.62.118 # kudelskisecurity.com
-185.35.62.119 # kudelskisecurity.com
-185.35.62.120 # kudelskisecurity.com
-185.35.62.121 # kudelskisecurity.com
-185.35.62.122 # kudelskisecurity.com
-185.35.62.123 # kudelskisecurity.com
-185.35.62.124 # kudelskisecurity.com
-185.35.62.125 # kudelskisecurity.com
-185.35.62.126 # kudelskisecurity.com
-185.35.62.127 # kudelskisecurity.com
-185.35.62.128 # kudelskisecurity.com
-185.35.62.129 # kudelskisecurity.com
-185.35.62.130 # kudelskisecurity.com
-185.35.62.131 # kudelskisecurity.com
-185.35.62.132 # kudelskisecurity.com
-185.35.62.133 # kudelskisecurity.com
-185.35.62.134 # kudelskisecurity.com
-185.35.62.135 # kudelskisecurity.com
-185.35.62.136 # kudelskisecurity.com
-185.35.62.137 # kudelskisecurity.com
-185.35.62.138 # kudelskisecurity.com
-185.35.62.139 # kudelskisecurity.com
-185.35.62.140 # kudelskisecurity.com
-185.35.62.141 # kudelskisecurity.com
-185.35.62.142 # kudelskisecurity.com
-185.35.62.143 # kudelskisecurity.com
-185.35.62.144 # kudelskisecurity.com
-185.35.62.145 # kudelskisecurity.com
-185.35.62.146 # kudelskisecurity.com
-185.35.62.147 # kudelskisecurity.com
-185.35.62.148 # kudelskisecurity.com
-185.35.62.149 # kudelskisecurity.com
-185.35.62.150 # kudelskisecurity.com
-185.35.62.151 # kudelskisecurity.com
-185.35.62.152 # kudelskisecurity.com
-185.35.62.153 # kudelskisecurity.com
-185.35.62.154 # kudelskisecurity.com
-185.35.62.155 # kudelskisecurity.com
-185.35.62.156 # kudelskisecurity.com
-185.35.62.157 # kudelskisecurity.com
-185.35.62.158 # kudelskisecurity.com
-185.35.62.159 # kudelskisecurity.com
-185.35.62.160 # kudelskisecurity.com
-185.35.62.161 # kudelskisecurity.com
-185.35.62.162 # kudelskisecurity.com
-185.35.62.163 # kudelskisecurity.com
-185.35.62.164 # kudelskisecurity.com
-185.35.62.165 # kudelskisecurity.com
-185.35.62.166 # kudelskisecurity.com
-185.35.62.167 # kudelskisecurity.com
-185.35.62.168 # kudelskisecurity.com
-185.35.62.169 # kudelskisecurity.com
-185.35.62.170 # kudelskisecurity.com
-185.35.62.171 # kudelskisecurity.com
-185.35.62.172 # kudelskisecurity.com
-185.35.62.173 # kudelskisecurity.com
-185.35.62.174 # kudelskisecurity.com
-185.35.62.175 # kudelskisecurity.com
-185.35.62.176 # kudelskisecurity.com
-185.35.62.177 # kudelskisecurity.com
-185.35.62.178 # kudelskisecurity.com
-185.35.62.179 # kudelskisecurity.com
-185.35.62.180 # kudelskisecurity.com
-185.35.62.181 # kudelskisecurity.com
-185.35.62.182 # kudelskisecurity.com
-185.35.62.183 # kudelskisecurity.com
-185.35.62.184 # kudelskisecurity.com
-185.35.62.185 # kudelskisecurity.com
-185.35.62.186 # kudelskisecurity.com
-185.35.62.187 # kudelskisecurity.com
-185.35.62.188 # kudelskisecurity.com
-185.35.62.189 # kudelskisecurity.com
-185.35.62.190 # kudelskisecurity.com
-185.35.62.191 # kudelskisecurity.com
-185.35.62.192 # kudelskisecurity.com
-185.35.62.193 # kudelskisecurity.com
-185.35.62.194 # kudelskisecurity.com
-185.35.62.195 # kudelskisecurity.com
-185.35.62.196 # kudelskisecurity.com
-185.35.62.197 # kudelskisecurity.com
-185.35.62.198 # kudelskisecurity.com
-185.35.62.199 # kudelskisecurity.com
-185.35.62.200 # kudelskisecurity.com
-185.35.62.201 # kudelskisecurity.com
-185.35.62.202 # kudelskisecurity.com
-185.35.62.203 # kudelskisecurity.com
-185.35.62.204 # kudelskisecurity.com
-185.35.62.205 # kudelskisecurity.com
-185.35.62.206 # kudelskisecurity.com
-185.35.62.207 # kudelskisecurity.com
-185.35.62.208 # kudelskisecurity.com
-185.35.62.209 # kudelskisecurity.com
-185.35.62.210 # kudelskisecurity.com
-185.35.62.211 # kudelskisecurity.com
-185.35.62.212 # kudelskisecurity.com
-185.35.62.213 # kudelskisecurity.com
-185.35.62.214 # kudelskisecurity.com
-185.35.62.215 # kudelskisecurity.com
-185.35.62.216 # kudelskisecurity.com
-185.35.62.217 # kudelskisecurity.com
-185.35.62.218 # kudelskisecurity.com
-185.35.62.219 # kudelskisecurity.com
-185.35.62.220 # kudelskisecurity.com
-185.35.62.221 # kudelskisecurity.com
-185.35.62.222 # kudelskisecurity.com
-185.35.62.223 # kudelskisecurity.com
-185.35.62.224 # kudelskisecurity.com
-185.35.62.225 # kudelskisecurity.com
-185.35.62.226 # kudelskisecurity.com
-185.35.62.227 # kudelskisecurity.com
-185.35.62.228 # kudelskisecurity.com
-185.35.62.229 # kudelskisecurity.com
-185.35.62.230 # kudelskisecurity.com
-185.35.62.231 # kudelskisecurity.com
-185.35.62.232 # kudelskisecurity.com
-185.35.62.233 # kudelskisecurity.com
-185.35.62.234 # kudelskisecurity.com
-185.35.62.235 # kudelskisecurity.com
-185.35.62.236 # kudelskisecurity.com
-185.35.62.237 # kudelskisecurity.com
-185.35.62.238 # kudelskisecurity.com
-185.35.62.239 # kudelskisecurity.com
-185.35.62.240 # kudelskisecurity.com
-185.35.62.241 # kudelskisecurity.com
-185.35.62.242 # kudelskisecurity.com
-185.35.62.243 # kudelskisecurity.com
-185.35.62.244 # kudelskisecurity.com
-185.35.62.245 # kudelskisecurity.com
-185.35.62.246 # kudelskisecurity.com
-185.35.62.247 # kudelskisecurity.com
-185.35.62.248 # kudelskisecurity.com
-185.35.62.249 # kudelskisecurity.com
-185.35.62.250 # kudelskisecurity.com
-185.35.62.251 # kudelskisecurity.com
-185.35.62.252 # kudelskisecurity.com
-185.35.62.253 # kudelskisecurity.com
-185.35.62.254 # kudelskisecurity.com
-185.35.62.255 # kudelskisecurity.com
-
-64.125.239.0 # riskiq.com
-64.125.239.1 # riskiq.com
-64.125.239.2 # riskiq.com
-64.125.239.3 # riskiq.com
-64.125.239.4 # riskiq.com
-64.125.239.5 # riskiq.com
-64.125.239.6 # riskiq.com
-64.125.239.7 # riskiq.com
-64.125.239.8 # riskiq.com
-64.125.239.9 # riskiq.com
-64.125.239.10 # riskiq.com
-64.125.239.11 # riskiq.com
-64.125.239.12 # riskiq.com
-64.125.239.13 # riskiq.com
-64.125.239.14 # riskiq.com
-64.125.239.15 # riskiq.com
-64.125.239.16 # riskiq.com
-64.125.239.17 # riskiq.com
-64.125.239.18 # riskiq.com
-64.125.239.19 # riskiq.com
-64.125.239.20 # riskiq.com
-64.125.239.21 # riskiq.com
-64.125.239.22 # riskiq.com
-64.125.239.23 # riskiq.com
-64.125.239.24 # riskiq.com
-64.125.239.25 # riskiq.com
-64.125.239.26 # riskiq.com
-64.125.239.27 # riskiq.com
-64.125.239.28 # riskiq.com
-64.125.239.29 # riskiq.com
-64.125.239.30 # riskiq.com
-64.125.239.31 # riskiq.com
-64.125.239.32 # riskiq.com
-64.125.239.33 # riskiq.com
-64.125.239.34 # riskiq.com
-64.125.239.35 # riskiq.com
-64.125.239.36 # riskiq.com
-64.125.239.37 # riskiq.com
-64.125.239.38 # riskiq.com
-64.125.239.39 # riskiq.com
-64.125.239.40 # riskiq.com
-64.125.239.41 # riskiq.com
-64.125.239.42 # riskiq.com
-64.125.239.43 # riskiq.com
-64.125.239.44 # riskiq.com
-64.125.239.45 # riskiq.com
-64.125.239.46 # riskiq.com
-64.125.239.47 # riskiq.com
-64.125.239.48 # riskiq.com
-64.125.239.49 # riskiq.com
-64.125.239.50 # riskiq.com
-64.125.239.51 # riskiq.com
-64.125.239.52 # riskiq.com
-64.125.239.53 # riskiq.com
-64.125.239.54 # riskiq.com
-64.125.239.55 # riskiq.com
-64.125.239.56 # riskiq.com
-64.125.239.57 # riskiq.com
-64.125.239.58 # riskiq.com
-64.125.239.59 # riskiq.com
-64.125.239.60 # riskiq.com
-64.125.239.61 # riskiq.com
-64.125.239.62 # riskiq.com
-64.125.239.63 # riskiq.com
-64.125.239.64 # riskiq.com
-64.125.239.65 # riskiq.com
-64.125.239.66 # riskiq.com
-64.125.239.67 # riskiq.com
-64.125.239.68 # riskiq.com
-64.125.239.69 # riskiq.com
-64.125.239.70 # riskiq.com
-64.125.239.71 # riskiq.com
-64.125.239.72 # riskiq.com
-64.125.239.73 # riskiq.com
-64.125.239.74 # riskiq.com
-64.125.239.75 # riskiq.com
-64.125.239.76 # riskiq.com
-64.125.239.77 # riskiq.com
-64.125.239.78 # riskiq.com
-64.125.239.79 # riskiq.com
-64.125.239.80 # riskiq.com
-64.125.239.81 # riskiq.com
-64.125.239.82 # riskiq.com
-64.125.239.83 # riskiq.com
-64.125.239.84 # riskiq.com
-64.125.239.85 # riskiq.com
-64.125.239.86 # riskiq.com
-64.125.239.87 # riskiq.com
-64.125.239.88 # riskiq.com
-64.125.239.89 # riskiq.com
-64.125.239.90 # riskiq.com
-64.125.239.91 # riskiq.com
-64.125.239.92 # riskiq.com
-64.125.239.93 # riskiq.com
-64.125.239.94 # riskiq.com
-64.125.239.95 # riskiq.com
-64.125.239.96 # riskiq.com
-64.125.239.97 # riskiq.com
-64.125.239.98 # riskiq.com
-64.125.239.99 # riskiq.com
-64.125.239.100 # riskiq.com
-64.125.239.101 # riskiq.com
-64.125.239.102 # riskiq.com
-64.125.239.103 # riskiq.com
-64.125.239.104 # riskiq.com
-64.125.239.105 # riskiq.com
-64.125.239.106 # riskiq.com
-64.125.239.107 # riskiq.com
-64.125.239.108 # riskiq.com
-64.125.239.109 # riskiq.com
-64.125.239.110 # riskiq.com
-64.125.239.111 # riskiq.com
-64.125.239.112 # riskiq.com
-64.125.239.113 # riskiq.com
-64.125.239.114 # riskiq.com
-64.125.239.115 # riskiq.com
-64.125.239.116 # riskiq.com
-64.125.239.117 # riskiq.com
-64.125.239.118 # riskiq.com
-64.125.239.119 # riskiq.com
-64.125.239.120 # riskiq.com
-64.125.239.121 # riskiq.com
-64.125.239.122 # riskiq.com
-64.125.239.123 # riskiq.com
-64.125.239.124 # riskiq.com
-64.125.239.125 # riskiq.com
-64.125.239.126 # riskiq.com
-64.125.239.127 # riskiq.com
-64.125.239.128 # riskiq.com
-64.125.239.129 # riskiq.com
-64.125.239.130 # riskiq.com
-64.125.239.131 # riskiq.com
-64.125.239.132 # riskiq.com
-64.125.239.133 # riskiq.com
-64.125.239.134 # riskiq.com
-64.125.239.135 # riskiq.com
-64.125.239.136 # riskiq.com
-64.125.239.137 # riskiq.com
-64.125.239.138 # riskiq.com
-64.125.239.139 # riskiq.com
-64.125.239.140 # riskiq.com
-64.125.239.141 # riskiq.com
-64.125.239.142 # riskiq.com
-64.125.239.143 # riskiq.com
-64.125.239.144 # riskiq.com
-64.125.239.145 # riskiq.com
-64.125.239.146 # riskiq.com
-64.125.239.147 # riskiq.com
-64.125.239.148 # riskiq.com
-64.125.239.149 # riskiq.com
-64.125.239.150 # riskiq.com
-64.125.239.151 # riskiq.com
-64.125.239.152 # riskiq.com
-64.125.239.153 # riskiq.com
-64.125.239.154 # riskiq.com
-64.125.239.155 # riskiq.com
-64.125.239.156 # riskiq.com
-64.125.239.157 # riskiq.com
-64.125.239.158 # riskiq.com
-64.125.239.159 # riskiq.com
-64.125.239.160 # riskiq.com
-64.125.239.161 # riskiq.com
-64.125.239.162 # riskiq.com
-64.125.239.163 # riskiq.com
-64.125.239.164 # riskiq.com
-64.125.239.165 # riskiq.com
-64.125.239.166 # riskiq.com
-64.125.239.167 # riskiq.com
-64.125.239.168 # riskiq.com
-64.125.239.169 # riskiq.com
-64.125.239.170 # riskiq.com
-64.125.239.171 # riskiq.com
-64.125.239.172 # riskiq.com
-64.125.239.173 # riskiq.com
-64.125.239.174 # riskiq.com
-64.125.239.175 # riskiq.com
-64.125.239.176 # riskiq.com
-64.125.239.177 # riskiq.com
-64.125.239.178 # riskiq.com
-64.125.239.179 # riskiq.com
-64.125.239.180 # riskiq.com
-64.125.239.181 # riskiq.com
-64.125.239.182 # riskiq.com
-64.125.239.183 # riskiq.com
-64.125.239.184 # riskiq.com
-64.125.239.185 # riskiq.com
-64.125.239.186 # riskiq.com
-64.125.239.187 # riskiq.com
-64.125.239.188 # riskiq.com
-64.125.239.189 # riskiq.com
-64.125.239.190 # riskiq.com
-64.125.239.191 # riskiq.com
-64.125.239.192 # riskiq.com
-64.125.239.193 # riskiq.com
-64.125.239.194 # riskiq.com
-64.125.239.195 # riskiq.com
-64.125.239.196 # riskiq.com
-64.125.239.197 # riskiq.com
-64.125.239.198 # riskiq.com
-64.125.239.199 # riskiq.com
-64.125.239.200 # riskiq.com
-64.125.239.201 # riskiq.com
-64.125.239.202 # riskiq.com
-64.125.239.203 # riskiq.com
-64.125.239.204 # riskiq.com
-64.125.239.205 # riskiq.com
-64.125.239.206 # riskiq.com
-64.125.239.207 # riskiq.com
-64.125.239.208 # riskiq.com
-64.125.239.209 # riskiq.com
-64.125.239.210 # riskiq.com
-64.125.239.211 # riskiq.com
-64.125.239.212 # riskiq.com
-64.125.239.213 # riskiq.com
-64.125.239.214 # riskiq.com
-64.125.239.215 # riskiq.com
-64.125.239.216 # riskiq.com
-64.125.239.217 # riskiq.com
-64.125.239.218 # riskiq.com
-64.125.239.219 # riskiq.com
-64.125.239.220 # riskiq.com
-64.125.239.221 # riskiq.com
-64.125.239.222 # riskiq.com
-64.125.239.223 # riskiq.com
-64.125.239.224 # riskiq.com
-64.125.239.225 # riskiq.com
-64.125.239.226 # riskiq.com
-64.125.239.227 # riskiq.com
-64.125.239.228 # riskiq.com
-64.125.239.229 # riskiq.com
-64.125.239.230 # riskiq.com
-64.125.239.231 # riskiq.com
-64.125.239.232 # riskiq.com
-64.125.239.233 # riskiq.com
-64.125.239.234 # riskiq.com
-64.125.239.235 # riskiq.com
-64.125.239.236 # riskiq.com
-64.125.239.237 # riskiq.com
-64.125.239.238 # riskiq.com
-64.125.239.239 # riskiq.com
-64.125.239.240 # riskiq.com
-64.125.239.241 # riskiq.com
-64.125.239.242 # riskiq.com
-64.125.239.243 # riskiq.com
-64.125.239.244 # riskiq.com
-64.125.239.245 # riskiq.com
-64.125.239.246 # riskiq.com
-64.125.239.247 # riskiq.com
-64.125.239.248 # riskiq.com
-64.125.239.249 # riskiq.com
-64.125.239.250 # riskiq.com
-64.125.239.251 # riskiq.com
-64.125.239.252 # riskiq.com
-64.125.239.253 # riskiq.com
-64.125.239.254 # riskiq.com
-64.125.239.255 # riskiq.com
-
-137.226.113.10 # researchscan3.comsys.rwth-aachen.de
-137.226.113.11 # researchscan4.comsys.rwth-aachen.de
-137.226.113.12 # researchscan5.comsys.rwth-aachen.de
-137.226.113.13 # researchscan6.comsys.rwth-aachen.de
-137.226.113.14 # researchscan7.comsys.rwth-aachen.de
-137.226.113.15 # researchscan8.comsys.rwth-aachen.de
-137.226.113.16 # researchscan9.comsys.rwth-aachen.de
-137.226.113.17 # researchscan10.comsys.rwth-aachen.de
-137.226.113.18 # researchscan11.comsys.rwth-aachen.de
-137.226.113.19 # researchscan12.comsys.rwth-aachen.de
-137.226.113.20 # researchscan13.comsys.rwth-aachen.de
-137.226.113.21 # researchscan14.comsys.rwth-aachen.de
-137.226.113.22 # researchscan15.comsys.rwth-aachen.de
-137.226.113.23 # researchscan16.comsys.rwth-aachen.de
-137.226.113.24 # researchscan17.comsys.rwth-aachen.de
-137.226.113.25 # researchscan18.comsys.rwth-aachen.de
-137.226.113.26 # researchscan19.comsys.rwth-aachen.de
-137.226.113.27 # researchscan20.comsys.rwth-aachen.de
-137.226.113.28 # researchscan21.comsys.rwth-aachen.de
-137.226.113.30 # researchscan22.comsys.rwth-aachen.de
-137.226.113.31 # researchscan23.comsys.rwth-aachen.de
-137.226.113.32 # researchscan24.comsys.rwth-aachen.de
-137.226.113.33 # researchscan25.comsys.rwth-aachen.de
-137.226.113.34 # researchscan26.comsys.rwth-aachen.de
-137.226.113.35 # researchscan27.comsys.rwth-aachen.de
-137.226.113.36 # researchscan28.comsys.rwth-aachen.de
-137.226.113.37 # researchscan29.comsys.rwth-aachen.de
-137.226.113.38 # researchscan30.comsys.rwth-aachen.de
-137.226.113.39 # researchscan31.comsys.rwth-aachen.de
-137.226.113.40 # researchscan32.comsys.rwth-aachen.de
-137.226.113.41 # researchscan33.comsys.rwth-aachen.de
-137.226.113.42 # researchscan34.comsys.rwth-aachen.de
-137.226.113.43 # researchscan35.comsys.rwth-aachen.de
-137.226.113.44 # researchscan36.comsys.rwth-aachen.de
-137.226.113.45 # researchscan37.comsys.rwth-aachen.de
-137.226.113.56 # researchscan48.comsys.rwth-aachen.de
-137.226.113.8 # researchscan1.comsys.rwth-aachen.de
-137.226.113.9 # researchscan2.comsys.rwth-aachen.de
-
-
-98.189.26.18 # scan.sba-research.org
-85.13.141.164 # scanning.sba-research.org
-
-104.225.9.70 # 5thcolumn.net
-
-# Reference: https://otx.alienvault.com/pulse/59646c87b126746267e5cf22
-# Reference: https://twitter.com/bad_packets/status/1104618320882393088
-# Reference: https://github.com/stamparm/maltrail/issues/19196
-# Reference: https://pastebin.com/raw/Zc7h4vkN
-# Reference: https://www.virustotal.com/#/domain/stretchoid.com
-# Reference: https://github.com/datacenters-network/security/blob/main/stretchoid.txt
-
-104.131.128.11 # stretchoid.com
-104.131.128.12 # stretchoid.com
-104.131.128.14 # stretchoid.com
-104.131.128.15 # stretchoid.com
-104.131.128.16 # stretchoid.com
-104.131.128.17 # stretchoid.com
-104.131.128.19 # stretchoid.com
-104.131.128.21 # stretchoid.com
-104.131.128.22 # stretchoid.com
-104.131.128.24 # stretchoid.com
-104.131.128.26 # stretchoid.com
-104.131.128.33 # stretchoid.com
-104.131.128.37 # stretchoid.com
-104.131.128.38 # stretchoid.com
-104.131.128.39 # stretchoid.com
-104.131.144.10 # stretchoid.com
-104.131.144.12 # stretchoid.com
-104.131.144.16 # stretchoid.com
-104.131.144.17 # stretchoid.com
-104.131.144.19 # stretchoid.com
-104.131.144.21 # stretchoid.com
-104.131.144.22 # stretchoid.com
-104.131.144.23 # stretchoid.com
-104.131.144.24 # stretchoid.com
-104.131.144.25 # stretchoid.com
-104.131.144.26 # stretchoid.com
-104.131.144.28 # stretchoid.com
-104.131.144.29 # stretchoid.com
-104.131.144.30 # stretchoid.com
-104.131.144.31 # stretchoid.com
-104.131.144.32 # stretchoid.com
-104.131.144.34 # stretchoid.com
-104.131.144.35 # stretchoid.com
-104.131.144.37 # stretchoid.com
-104.131.144.38 # stretchoid.com
-104.131.144.39 # stretchoid.com
-104.131.144.40 # stretchoid.com
-104.131.144.41 # stretchoid.com
-104.131.144.42 # stretchoid.com
-104.131.144.7 # stretchoid.com
-104.131.144.8 # stretchoid.com
-104.131.144.9 # stretchoid.com
-104.131.151.27 # stretchoid.com
-104.236.128.10 # stretchoid.com
-104.236.128.13 # stretchoid.com
-104.236.128.14 # stretchoid.com
-104.236.128.16 # stretchoid.com
-104.236.128.17 # stretchoid.com
-104.236.128.18 # stretchoid.com
-104.236.128.19 # stretchoid.com
-104.236.128.22 # stretchoid.com
-104.236.128.26 # stretchoid.com
-104.236.128.30 # stretchoid.com
-104.236.128.33 # stretchoid.com
-104.236.128.34 # stretchoid.com
-104.236.128.35 # stretchoid.com
-104.236.128.39 # stretchoid.com
-104.236.128.46 # stretchoid.com
-104.236.128.5 # stretchoid.com
-104.236.128.7 # stretchoid.com
-104.236.128.8 # stretchoid.com
-104.236.128.9 # stretchoid.com
-107.170.192.15 # stretchoid.com
-107.170.192.16 # stretchoid.com
-107.170.192.20 # stretchoid.com
-107.170.192.22 # stretchoid.com
-107.170.192.236 # stretchoid.com
-107.170.192.25 # stretchoid.com
-107.170.192.29 # stretchoid.com
-107.170.192.30 # stretchoid.com
-107.170.192.31 # stretchoid.com
-107.170.192.32 # stretchoid.com
-107.170.192.33 # stretchoid.com
-107.170.192.5 # stretchoid.com
-107.170.192.6 # stretchoid.com
-107.170.192.8 # stretchoid.com
-107.170.192.80 # stretchoid.com
-107.170.193.203 # stretchoid.com
-107.170.193.225 # stretchoid.com
-107.170.193.63 # stretchoid.com
-107.170.194.57 # stretchoid.com
-107.170.195.201 # stretchoid.com
-107.170.195.64 # stretchoid.com
-107.170.196.169 # stretchoid.com
-107.170.197.38 # stretchoid.com
-107.170.197.82 # stretchoid.com
-107.170.198.158 # stretchoid.com
-107.170.198.19 # stretchoid.com
-107.170.198.249 # stretchoid.com
-107.170.198.53 # stretchoid.com
-107.170.199.171 # stretchoid.com
-107.170.199.22 # stretchoid.com
-107.170.199.239 # stretchoid.com
-107.170.199.82 # stretchoid.com
-107.170.201.217 # stretchoid.com
-107.170.202.101 # stretchoid.com
-107.170.202.110 # stretchoid.com
-107.170.202.131 # stretchoid.com
-107.170.202.134 # stretchoid.com
-107.170.202.45 # stretchoid.com
-107.170.202.91 # stretchoid.com
-107.170.203.209 # stretchoid.com
-107.170.203.236 # stretchoid.com
-107.170.204.26 # stretchoid.com
-107.170.204.82 # stretchoid.com
-107.170.208.11 # stretchoid.com
-107.170.208.16 # stretchoid.com
-107.170.208.18 # stretchoid.com
-107.170.208.19 # stretchoid.com
-107.170.208.22 # stretchoid.com
-107.170.208.23 # stretchoid.com
-107.170.208.25 # stretchoid.com
-107.170.208.28 # stretchoid.com
-107.170.208.29 # stretchoid.com
-107.170.208.31 # stretchoid.com
-107.170.208.32 # stretchoid.com
-107.170.208.35 # stretchoid.com
-107.170.208.36 # stretchoid.com
-107.170.208.37 # stretchoid.com
-107.170.208.38 # stretchoid.com
-107.170.208.39 # stretchoid.com
-107.170.208.4 # stretchoid.com
-107.170.208.42 # stretchoid.com
-107.170.208.5 # stretchoid.com
-107.170.208.6 # stretchoid.com
-107.170.208.7 # stretchoid.com
-107.170.208.8 # stretchoid.com
-107.170.224.10 # stretchoid.com
-107.170.224.11 # stretchoid.com
-107.170.224.12 # stretchoid.com
-107.170.224.13 # stretchoid.com
-107.170.224.14 # stretchoid.com
-107.170.224.16 # stretchoid.com
-107.170.224.17 # stretchoid.com
-107.170.224.19 # stretchoid.com
-107.170.224.20 # stretchoid.com
-107.170.224.30 # stretchoid.com
-107.170.224.33 # stretchoid.com
-107.170.224.38 # stretchoid.com
-107.170.224.58 # stretchoid.com
-107.170.224.6 # stretchoid.com
-107.170.224.62 # stretchoid.com
-107.170.224.7 # stretchoid.com
-107.170.225.12 # stretchoid.com
-107.170.225.14 # stretchoid.com
-107.170.225.15 # stretchoid.com
-107.170.225.17 # stretchoid.com
-107.170.225.18 # stretchoid.com
-107.170.225.19 # stretchoid.com
-107.170.225.22 # stretchoid.com
-107.170.225.23 # stretchoid.com
-107.170.225.25 # stretchoid.com
-107.170.225.27 # stretchoid.com
-107.170.225.4 # stretchoid.com
-107.170.225.6 # stretchoid.com
-107.170.225.7 # stretchoid.com
-107.170.226.11 # stretchoid.com
-107.170.226.13 # stretchoid.com
-107.170.226.131 # stretchoid.com
-107.170.226.15 # stretchoid.com
-107.170.226.16 # stretchoid.com
-107.170.226.17 # stretchoid.com
-107.170.226.21 # stretchoid.com
-107.170.226.22 # stretchoid.com
-107.170.226.29 # stretchoid.com
-107.170.226.30 # stretchoid.com
-107.170.226.36 # stretchoid.com
-107.170.226.6 # stretchoid.com
-107.170.226.7 # stretchoid.com
-107.170.226.8 # stretchoid.com
-107.170.226.9 # stretchoid.com
-107.170.227.10 # stretchoid.com
-107.170.227.12 # stretchoid.com
-107.170.227.14 # stretchoid.com
-107.170.227.15 # stretchoid.com
-107.170.227.16 # stretchoid.com
-107.170.227.18 # stretchoid.com
-107.170.227.19 # stretchoid.com
-107.170.227.21 # stretchoid.com
-107.170.227.23 # stretchoid.com
-107.170.227.24 # stretchoid.com
-107.170.227.25 # stretchoid.com
-107.170.227.26 # stretchoid.com
-107.170.227.28 # stretchoid.com
-107.170.227.32 # stretchoid.com
-107.170.227.33 # stretchoid.com
-107.170.227.4 # stretchoid.com
-107.170.227.9 # stretchoid.com
-107.170.228.11 # stretchoid.com
-107.170.228.12 # stretchoid.com
-107.170.228.15 # stretchoid.com
-107.170.228.16 # stretchoid.com
-107.170.228.17 # stretchoid.com
-107.170.228.18 # stretchoid.com
-107.170.228.20 # stretchoid.com
-107.170.228.21 # stretchoid.com
-107.170.228.23 # stretchoid.com
-107.170.228.27 # stretchoid.com
-107.170.228.37 # stretchoid.com
-107.170.228.41 # stretchoid.com
-107.170.228.43 # stretchoid.com
-107.170.228.45 # stretchoid.com
-107.170.228.46 # stretchoid.com
-107.170.228.50 # stretchoid.com
-107.170.228.53 # stretchoid.com
-107.170.228.9 # stretchoid.com
-107.170.229.11 # stretchoid.com
-107.170.229.14 # stretchoid.com
-107.170.229.16 # stretchoid.com
-107.170.229.17 # stretchoid.com
-107.170.229.18 # stretchoid.com
-107.170.229.26 # stretchoid.com
-107.170.229.43 # stretchoid.com
-107.170.229.45 # stretchoid.com
-107.170.229.46 # stretchoid.com
-107.170.229.48 # stretchoid.com
-107.170.229.49 # stretchoid.com
-107.170.229.5 # stretchoid.com
-107.170.229.6 # stretchoid.com
-107.170.229.62 # stretchoid.com
-107.170.229.63 # stretchoid.com
-107.170.229.7 # stretchoid.com
-107.170.229.8 # stretchoid.com
-107.170.230.11 # stretchoid.com
-107.170.230.13 # stretchoid.com
-107.170.230.16 # stretchoid.com
-107.170.230.17 # stretchoid.com
-107.170.230.21 # stretchoid.com
-107.170.230.22 # stretchoid.com
-107.170.230.25 # stretchoid.com
-107.170.230.26 # stretchoid.com
-107.170.230.27 # stretchoid.com
-107.170.230.31 # stretchoid.com
-107.170.230.33 # stretchoid.com
-107.170.230.37 # stretchoid.com
-107.170.230.38 # stretchoid.com
-107.170.230.5 # stretchoid.com
-107.170.230.6 # stretchoid.com
-107.170.230.8 # stretchoid.com
-107.170.231.10 # stretchoid.com
-107.170.231.11 # stretchoid.com
-107.170.231.12 # stretchoid.com
-107.170.231.13 # stretchoid.com
-107.170.231.14 # stretchoid.com
-107.170.231.15 # stretchoid.com
-107.170.231.18 # stretchoid.com
-107.170.231.23 # stretchoid.com
-107.170.231.30 # stretchoid.com
-107.170.231.31 # stretchoid.com
-107.170.231.38 # stretchoid.com
-107.170.231.40 # stretchoid.com
-107.170.231.41 # stretchoid.com
-107.170.231.42 # stretchoid.com
-107.170.231.44 # stretchoid.com
-107.170.231.45 # stretchoid.com
-107.170.231.47 # stretchoid.com
-107.170.231.5 # stretchoid.com
-107.170.231.6 # stretchoid.com
-107.170.231.8 # stretchoid.com
-107.170.231.9 # stretchoid.com
-107.170.232.10 # stretchoid.com
-107.170.232.12 # stretchoid.com
-107.170.232.14 # stretchoid.com
-107.170.232.15 # stretchoid.com
-107.170.232.16 # stretchoid.com
-107.170.232.19 # stretchoid.com
-107.170.232.21 # stretchoid.com
-107.170.232.38 # stretchoid.com
-107.170.232.47 # stretchoid.com
-107.170.232.49 # stretchoid.com
-107.170.232.50 # stretchoid.com
-107.170.232.53 # stretchoid.com
-107.170.232.56 # stretchoid.com
-107.170.232.57 # stretchoid.com
-107.170.232.58 # stretchoid.com
-107.170.232.59 # stretchoid.com
-107.170.232.6 # stretchoid.com
-107.170.232.8 # stretchoid.com
-107.170.232.9 # stretchoid.com
-107.170.233.10 # stretchoid.com
-107.170.233.11 # stretchoid.com
-107.170.233.12 # stretchoid.com
-107.170.233.13 # stretchoid.com
-107.170.233.14 # stretchoid.com
-107.170.233.15 # stretchoid.com
-107.170.233.16 # stretchoid.com
-107.170.233.17 # stretchoid.com
-107.170.233.19 # stretchoid.com
-107.170.233.20 # stretchoid.com
-107.170.233.21 # stretchoid.com
-107.170.233.4 # stretchoid.com
-107.170.233.41 # stretchoid.com
-107.170.233.42 # stretchoid.com
-107.170.233.8 # stretchoid.com
-107.170.233.9 # stretchoid.com
-107.170.234.10 # stretchoid.com
-107.170.234.11 # stretchoid.com
-107.170.234.12 # stretchoid.com
-107.170.234.13 # stretchoid.com
-107.170.234.14 # stretchoid.com
-107.170.234.15 # stretchoid.com
-107.170.234.16 # stretchoid.com
-107.170.234.17 # stretchoid.com
-107.170.234.18 # stretchoid.com
-107.170.234.19 # stretchoid.com
-107.170.234.20 # stretchoid.com
-107.170.234.27 # stretchoid.com
-107.170.234.29 # stretchoid.com
-107.170.234.30 # stretchoid.com
-107.170.234.40 # stretchoid.com
-107.170.234.42 # stretchoid.com
-107.170.234.43 # stretchoid.com
-107.170.234.5 # stretchoid.com
-107.170.234.6 # stretchoid.com
-107.170.234.7 # stretchoid.com
-107.170.234.8 # stretchoid.com
-107.170.234.9 # stretchoid.com
-107.170.235.10 # stretchoid.com
-107.170.235.12 # stretchoid.com
-107.170.235.13 # stretchoid.com
-107.170.235.15 # stretchoid.com
-107.170.235.17 # stretchoid.com
-107.170.235.19 # stretchoid.com
-107.170.235.23 # stretchoid.com
-107.170.235.27 # stretchoid.com
-107.170.235.34 # stretchoid.com
-107.170.235.35 # stretchoid.com
-107.170.235.37 # stretchoid.com
-107.170.235.38 # stretchoid.com
-107.170.235.4 # stretchoid.com
-107.170.235.8 # stretchoid.com
-107.170.235.9 # stretchoid.com
-107.170.236.10 # stretchoid.com
-107.170.236.11 # stretchoid.com
-107.170.236.14 # stretchoid.com
-107.170.236.15 # stretchoid.com
-107.170.236.16 # stretchoid.com
-107.170.236.18 # stretchoid.com
-107.170.236.19 # stretchoid.com
-107.170.236.20 # stretchoid.com
-107.170.236.22 # stretchoid.com
-107.170.236.26 # stretchoid.com
-107.170.236.28 # stretchoid.com
-107.170.236.29 # stretchoid.com
-107.170.236.31 # stretchoid.com
-107.170.236.32 # stretchoid.com
-107.170.236.33 # stretchoid.com
-107.170.236.35 # stretchoid.com
-107.170.236.38 # stretchoid.com
-107.170.236.41 # stretchoid.com
-107.170.236.5 # stretchoid.com
-107.170.236.6 # stretchoid.com
-107.170.237.10 # stretchoid.com
-107.170.237.113 # stretchoid.com
-107.170.237.12 # stretchoid.com
-107.170.237.13 # stretchoid.com
-107.170.237.14 # stretchoid.com
-107.170.237.15 # stretchoid.com
-107.170.237.17 # stretchoid.com
-107.170.237.18 # stretchoid.com
-107.170.237.22 # stretchoid.com
-107.170.237.23 # stretchoid.com
-107.170.237.240 # stretchoid.com
-107.170.237.32 # stretchoid.com
-107.170.237.34 # stretchoid.com
-107.170.237.37 # stretchoid.com
-107.170.237.41 # stretchoid.com
-107.170.237.48 # stretchoid.com
-107.170.237.50 # stretchoid.com
-107.170.237.54 # stretchoid.com
-107.170.237.58 # stretchoid.com
-107.170.237.59 # stretchoid.com
-107.170.237.71 # stretchoid.com
-107.170.237.73 # stretchoid.com
-107.170.237.74 # stretchoid.com
-107.170.237.75 # stretchoid.com
-107.170.237.78 # stretchoid.com
-107.170.237.8 # stretchoid.com
-107.170.238.10 # stretchoid.com
-107.170.238.11 # stretchoid.com
-107.170.238.12 # stretchoid.com
-107.170.238.14 # stretchoid.com
-107.170.238.140 # stretchoid.com
-107.170.238.15 # stretchoid.com
-107.170.238.16 # stretchoid.com
-107.170.238.18 # stretchoid.com
-107.170.238.185 # stretchoid.com
-107.170.238.19 # stretchoid.com
-107.170.238.22 # stretchoid.com
-107.170.238.24 # stretchoid.com
-107.170.238.26 # stretchoid.com
-107.170.238.27 # stretchoid.com
-107.170.238.28 # stretchoid.com
-107.170.238.38 # stretchoid.com
-107.170.238.4 # stretchoid.com
-107.170.238.40 # stretchoid.com
-107.170.238.41 # stretchoid.com
-107.170.238.43 # stretchoid.com
-107.170.238.45 # stretchoid.com
-107.170.238.46 # stretchoid.com
-107.170.238.48 # stretchoid.com
-107.170.238.49 # stretchoid.com
-107.170.238.50 # stretchoid.com
-107.170.238.7 # stretchoid.com
-107.170.238.9 # stretchoid.com
-107.170.239.10 # stretchoid.com
-107.170.239.108 # stretchoid.com
-107.170.239.11 # stretchoid.com
-107.170.239.12 # stretchoid.com
-107.170.239.15 # stretchoid.com
-107.170.239.16 # stretchoid.com
-107.170.239.17 # stretchoid.com
-107.170.239.18 # stretchoid.com
-107.170.239.20 # stretchoid.com
-107.170.239.21 # stretchoid.com
-107.170.239.28 # stretchoid.com
-107.170.239.30 # stretchoid.com
-107.170.239.33 # stretchoid.com
-107.170.239.34 # stretchoid.com
-107.170.239.38 # stretchoid.com
-107.170.239.39 # stretchoid.com
-107.170.239.4 # stretchoid.com
-107.170.239.40 # stretchoid.com
-107.170.239.48 # stretchoid.com
-107.170.239.49 # stretchoid.com
-107.170.239.9 # stretchoid.com
-107.170.240.10 # stretchoid.com
-107.170.240.12 # stretchoid.com
-107.170.240.13 # stretchoid.com
-107.170.240.14 # stretchoid.com
-107.170.240.15 # stretchoid.com
-107.170.240.16 # stretchoid.com
-107.170.240.17 # stretchoid.com
-107.170.240.20 # stretchoid.com
-107.170.240.21 # stretchoid.com
-107.170.240.23 # stretchoid.com
-107.170.240.25 # stretchoid.com
-107.170.240.26 # stretchoid.com
-107.170.240.30 # stretchoid.com
-107.170.240.31 # stretchoid.com
-107.170.240.34 # stretchoid.com
-107.170.240.35 # stretchoid.com
-107.170.240.39 # stretchoid.com
-107.170.240.4 # stretchoid.com
-107.170.240.42 # stretchoid.com
-107.170.240.44 # stretchoid.com
-107.170.240.46 # stretchoid.com
-107.170.240.49 # stretchoid.com
-107.170.240.50 # stretchoid.com
-107.170.240.57 # stretchoid.com
-107.170.240.58 # stretchoid.com
-107.170.240.59 # stretchoid.com
-107.170.240.9 # stretchoid.com
-107.170.241.11 # stretchoid.com
-107.170.241.12 # stretchoid.com
-107.170.241.13 # stretchoid.com
-107.170.241.14 # stretchoid.com
-107.170.241.17 # stretchoid.com
-107.170.241.18 # stretchoid.com
-107.170.241.19 # stretchoid.com
-107.170.241.20 # stretchoid.com
-107.170.241.22 # stretchoid.com
-107.170.241.24 # stretchoid.com
-107.170.241.25 # stretchoid.com
-107.170.241.36 # stretchoid.com
-107.170.241.38 # stretchoid.com
-107.170.241.39 # stretchoid.com
-107.170.241.46 # stretchoid.com
-107.170.241.5 # stretchoid.com
-107.170.241.6 # stretchoid.com
-107.170.241.7 # stretchoid.com
-107.170.241.8 # stretchoid.com
-107.170.241.9 # stretchoid.com
-107.170.242.10 # stretchoid.com
-107.170.242.11 # stretchoid.com
-107.170.242.12 # stretchoid.com
-107.170.242.13 # stretchoid.com
-107.170.242.14 # stretchoid.com
-107.170.242.15 # stretchoid.com
-107.170.242.19 # stretchoid.com
-107.170.242.25 # stretchoid.com
-107.170.242.5 # stretchoid.com
-107.170.242.6 # stretchoid.com
-107.170.242.7 # stretchoid.com
-107.170.242.8 # stretchoid.com
-107.170.242.9 # stretchoid.com
-107.170.243.10 # stretchoid.com
-107.170.243.11 # stretchoid.com
-107.170.243.12 # stretchoid.com
-107.170.243.13 # stretchoid.com
-107.170.243.15 # stretchoid.com
-107.170.243.17 # stretchoid.com
-107.170.243.20 # stretchoid.com
-107.170.243.21 # stretchoid.com
-107.170.243.22 # stretchoid.com
-107.170.243.24 # stretchoid.com
-107.170.243.25 # stretchoid.com
-107.170.243.26 # stretchoid.com
-107.170.243.28 # stretchoid.com
-107.170.243.29 # stretchoid.com
-107.170.243.32 # stretchoid.com
-107.170.243.33 # stretchoid.com
-107.170.243.4 # stretchoid.com
-107.170.243.44 # stretchoid.com
-107.170.243.8 # stretchoid.com
-107.170.243.9 # stretchoid.com
-107.170.244.10 # stretchoid.com
-107.170.244.11 # stretchoid.com
-107.170.244.12 # stretchoid.com
-107.170.244.13 # stretchoid.com
-107.170.244.23 # stretchoid.com
-107.170.244.25 # stretchoid.com
-107.170.244.26 # stretchoid.com
-107.170.244.27 # stretchoid.com
-107.170.244.29 # stretchoid.com
-107.170.244.30 # stretchoid.com
-107.170.244.31 # stretchoid.com
-107.170.244.32 # stretchoid.com
-107.170.244.33 # stretchoid.com
-107.170.244.34 # stretchoid.com
-107.170.244.8 # stretchoid.com
-107.170.245.10 # stretchoid.com
-107.170.245.12 # stretchoid.com
-107.170.245.13 # stretchoid.com
-107.170.245.14 # stretchoid.com
-107.170.245.15 # stretchoid.com
-107.170.245.16 # stretchoid.com
-107.170.245.18 # stretchoid.com
-107.170.245.19 # stretchoid.com
-107.170.245.20 # stretchoid.com
-107.170.245.26 # stretchoid.com
-107.170.245.28 # stretchoid.com
-107.170.245.30 # stretchoid.com
-107.170.245.32 # stretchoid.com
-107.170.245.35 # stretchoid.com
-107.170.245.37 # stretchoid.com
-107.170.245.39 # stretchoid.com
-107.170.245.4 # stretchoid.com
-107.170.245.5 # stretchoid.com
-107.170.245.7 # stretchoid.com
-107.170.245.8 # stretchoid.com
-107.170.245.9 # stretchoid.com
-107.170.246.10 # stretchoid.com
-107.170.246.12 # stretchoid.com
-107.170.246.13 # stretchoid.com
-107.170.246.14 # stretchoid.com
-107.170.246.15 # stretchoid.com
-107.170.246.16 # stretchoid.com
-107.170.246.18 # stretchoid.com
-107.170.246.19 # stretchoid.com
-107.170.246.21 # stretchoid.com
-107.170.246.22 # stretchoid.com
-107.170.246.23 # stretchoid.com
-107.170.246.24 # stretchoid.com
-107.170.246.25 # stretchoid.com
-107.170.246.29 # stretchoid.com
-107.170.246.30 # stretchoid.com
-107.170.246.35 # stretchoid.com
-107.170.246.36 # stretchoid.com
-107.170.246.40 # stretchoid.com
-107.170.246.41 # stretchoid.com
-107.170.246.42 # stretchoid.com
-107.170.246.44 # stretchoid.com
-107.170.246.45 # stretchoid.com
-107.170.246.46 # stretchoid.com
-107.170.246.5 # stretchoid.com
-107.170.246.9 # stretchoid.com
-107.170.247.10 # stretchoid.com
-107.170.247.11 # stretchoid.com
-107.170.247.13 # stretchoid.com
-107.170.247.15 # stretchoid.com
-107.170.247.16 # stretchoid.com
-107.170.247.18 # stretchoid.com
-107.170.247.19 # stretchoid.com
-107.170.247.22 # stretchoid.com
-107.170.247.28 # stretchoid.com
-107.170.247.34 # stretchoid.com
-107.170.247.35 # stretchoid.com
-107.170.247.36 # stretchoid.com
-107.170.247.37 # stretchoid.com
-107.170.247.39 # stretchoid.com
-107.170.247.40 # stretchoid.com
-107.170.247.42 # stretchoid.com
-107.170.247.43 # stretchoid.com
-107.170.247.44 # stretchoid.com
-107.170.247.45 # stretchoid.com
-107.170.247.46 # stretchoid.com
-107.170.247.47 # stretchoid.com
-107.170.247.5 # stretchoid.com
-107.170.248.10 # stretchoid.com
-107.170.248.11 # stretchoid.com
-107.170.248.12 # stretchoid.com
-107.170.248.13 # stretchoid.com
-107.170.248.15 # stretchoid.com
-107.170.248.16 # stretchoid.com
-107.170.248.21 # stretchoid.com
-107.170.248.23 # stretchoid.com
-107.170.248.34 # stretchoid.com
-107.170.248.4 # stretchoid.com
-107.170.248.42 # stretchoid.com
-107.170.248.43 # stretchoid.com
-107.170.248.44 # stretchoid.com
-107.170.248.45 # stretchoid.com
-107.170.248.46 # stretchoid.com
-107.170.248.6 # stretchoid.com
-107.170.249.12 # stretchoid.com
-107.170.249.13 # stretchoid.com
-107.170.249.14 # stretchoid.com
-107.170.249.15 # stretchoid.com
-107.170.249.16 # stretchoid.com
-107.170.249.17 # stretchoid.com
-107.170.249.187 # stretchoid.com
-107.170.249.19 # stretchoid.com
-107.170.249.24 # stretchoid.com
-107.170.249.25 # stretchoid.com
-107.170.249.26 # stretchoid.com
-107.170.249.30 # stretchoid.com
-107.170.249.34 # stretchoid.com
-107.170.249.41 # stretchoid.com
-107.170.249.7 # stretchoid.com
-107.170.249.9 # stretchoid.com
-107.170.250.10 # stretchoid.com
-107.170.250.11 # stretchoid.com
-107.170.250.13 # stretchoid.com
-107.170.250.14 # stretchoid.com
-107.170.250.15 # stretchoid.com
-107.170.250.16 # stretchoid.com
-107.170.250.18 # stretchoid.com
-107.170.250.19 # stretchoid.com
-107.170.250.20 # stretchoid.com
-107.170.250.21 # stretchoid.com
-107.170.250.29 # stretchoid.com
-107.170.250.36 # stretchoid.com
-107.170.250.38 # stretchoid.com
-107.170.250.4 # stretchoid.com
-107.170.250.6 # stretchoid.com
-107.170.250.8 # stretchoid.com
-107.170.251.10 # stretchoid.com
-107.170.251.11 # stretchoid.com
-107.170.251.12 # stretchoid.com
-107.170.251.14 # stretchoid.com
-107.170.251.15 # stretchoid.com
-107.170.251.16 # stretchoid.com
-107.170.251.18 # stretchoid.com
-107.170.251.19 # stretchoid.com
-107.170.251.21 # stretchoid.com
-107.170.251.22 # stretchoid.com
-107.170.251.23 # stretchoid.com
-107.170.251.34 # stretchoid.com
-107.170.251.38 # stretchoid.com
-107.170.251.41 # stretchoid.com
-107.170.251.42 # stretchoid.com
-107.170.251.5 # stretchoid.com
-107.170.251.7 # stretchoid.com
-107.170.252.12 # stretchoid.com
-107.170.252.14 # stretchoid.com
-107.170.252.15 # stretchoid.com
-107.170.252.16 # stretchoid.com
-107.170.252.18 # stretchoid.com
-107.170.252.23 # stretchoid.com
-107.170.252.26 # stretchoid.com
-107.170.252.35 # stretchoid.com
-107.170.252.38 # stretchoid.com
-107.170.252.41 # stretchoid.com
-107.170.252.43 # stretchoid.com
-107.170.252.44 # stretchoid.com
-107.170.252.45 # stretchoid.com
-107.170.252.46 # stretchoid.com
-107.170.252.47 # stretchoid.com
-107.170.252.49 # stretchoid.com
-107.170.252.50 # stretchoid.com
-107.170.252.53 # stretchoid.com
-107.170.252.54 # stretchoid.com
-107.170.252.55 # stretchoid.com
-107.170.252.56 # stretchoid.com
-107.170.252.58 # stretchoid.com
-107.170.252.59 # stretchoid.com
-107.170.252.6 # stretchoid.com
-107.170.252.60 # stretchoid.com
-107.170.252.61 # stretchoid.com
-107.170.252.62 # stretchoid.com
-107.170.252.63 # stretchoid.com
-107.170.252.64 # stretchoid.com
-107.170.252.67 # stretchoid.com
-107.170.252.68 # stretchoid.com
-107.170.252.8 # stretchoid.com
-107.170.252.9 # stretchoid.com
-107.170.253.10 # stretchoid.com
-107.170.253.11 # stretchoid.com
-107.170.253.14 # stretchoid.com
-107.170.253.15 # stretchoid.com
-107.170.253.18 # stretchoid.com
-107.170.253.19 # stretchoid.com
-107.170.253.20 # stretchoid.com
-107.170.253.28 # stretchoid.com
-107.170.253.35 # stretchoid.com
-107.170.253.36 # stretchoid.com
-107.170.253.37 # stretchoid.com
-107.170.253.38 # stretchoid.com
-107.170.253.7 # stretchoid.com
-107.170.253.8 # stretchoid.com
-107.170.253.9 # stretchoid.com
-107.170.254.13 # stretchoid.com
-107.170.254.14 # stretchoid.com
-107.170.254.15 # stretchoid.com
-107.170.254.16 # stretchoid.com
-107.170.254.17 # stretchoid.com
-107.170.254.18 # stretchoid.com
-107.170.254.19 # stretchoid.com
-107.170.254.20 # stretchoid.com
-107.170.254.23 # stretchoid.com
-107.170.254.24 # stretchoid.com
-107.170.254.26 # stretchoid.com
-107.170.254.27 # stretchoid.com
-107.170.254.28 # stretchoid.com
-107.170.254.29 # stretchoid.com
-107.170.254.30 # stretchoid.com
-107.170.254.31 # stretchoid.com
-107.170.254.6 # stretchoid.com
-107.170.254.8 # stretchoid.com
-107.170.254.9 # stretchoid.com
-107.170.255.11 # stretchoid.com
-107.170.255.12 # stretchoid.com
-107.170.255.16 # stretchoid.com
-107.170.255.17 # stretchoid.com
-107.170.255.20 # stretchoid.com
-107.170.255.21 # stretchoid.com
-107.170.255.24 # stretchoid.com
-107.170.255.29 # stretchoid.com
-107.170.255.30 # stretchoid.com
-107.170.255.35 # stretchoid.com
-107.170.255.4 # stretchoid.com
-107.170.255.7 # stretchoid.com
-107.170.255.9 # stretchoid.com
-138.68.208.10 # stretchoid.com
-138.68.208.11 # stretchoid.com
-138.68.208.12 # stretchoid.com
-138.68.208.13 # stretchoid.com
-138.68.208.14 # stretchoid.com
-138.68.208.16 # stretchoid.com
-138.68.208.17 # stretchoid.com
-138.68.208.29 # stretchoid.com
-138.68.208.30 # stretchoid.com
-138.68.208.32 # stretchoid.com
-138.68.208.36 # stretchoid.com
-138.68.208.37 # stretchoid.com
-138.68.208.38 # stretchoid.com
-138.68.208.40 # stretchoid.com
-138.68.208.41 # stretchoid.com
-138.68.208.42 # stretchoid.com
-138.68.208.44 # stretchoid.com
-138.68.208.45 # stretchoid.com
-138.68.208.46 # stretchoid.com
-138.68.208.47 # stretchoid.com
-138.68.208.48 # stretchoid.com
-138.68.208.50 # stretchoid.com
-138.68.208.51 # stretchoid.com
-138.68.208.6 # stretchoid.com
-138.68.208.7 # stretchoid.com
-138.68.208.8 # stretchoid.com
-138.68.208.9 # stretchoid.com
-159.203.192.10 # stretchoid.com
-159.203.192.11 # stretchoid.com
-159.203.192.13 # stretchoid.com
-159.203.192.14 # stretchoid.com
-159.203.192.15 # stretchoid.com
-159.203.192.16 # stretchoid.com
-159.203.192.17 # stretchoid.com
-159.203.192.18 # stretchoid.com
-159.203.192.19 # stretchoid.com
-159.203.192.20 # stretchoid.com
-159.203.192.21 # stretchoid.com
-159.203.192.23 # stretchoid.com
-159.203.192.33 # stretchoid.com
-159.203.192.37 # stretchoid.com
-159.203.192.38 # stretchoid.com
-159.203.192.39 # stretchoid.com
-159.203.192.4 # stretchoid.com
-159.203.192.40 # stretchoid.com
-159.203.192.41 # stretchoid.com
-159.203.192.43 # stretchoid.com
-159.203.192.45 # stretchoid.com
-159.203.192.46 # stretchoid.com
-159.203.192.47 # stretchoid.com
-159.203.192.9 # stretchoid.com
-159.203.208.10 # stretchoid.com
-159.203.208.11 # stretchoid.com
-159.203.208.12 # stretchoid.com
-159.203.208.13 # stretchoid.com
-159.203.208.14 # stretchoid.com
-159.203.208.15 # stretchoid.com
-159.203.208.16 # stretchoid.com
-159.203.208.17 # stretchoid.com
-159.203.208.18 # stretchoid.com
-159.203.208.19 # stretchoid.com
-159.203.208.23 # stretchoid.com
-159.203.208.30 # stretchoid.com
-159.203.208.34 # stretchoid.com
-159.203.208.36 # stretchoid.com
-159.203.208.38 # stretchoid.com
-159.203.208.5 # stretchoid.com
-159.203.208.7 # stretchoid.com
-159.203.208.8 # stretchoid.com
-159.203.208.9 # stretchoid.com
-159.203.224.10 # stretchoid.com
-159.203.224.11 # stretchoid.com
-159.203.224.12 # stretchoid.com
-159.203.224.14 # stretchoid.com
-159.203.224.15 # stretchoid.com
-159.203.224.19 # stretchoid.com
-159.203.224.22 # stretchoid.com
-159.203.224.26 # stretchoid.com
-159.203.224.31 # stretchoid.com
-159.203.224.33 # stretchoid.com
-159.203.224.34 # stretchoid.com
-159.203.224.35 # stretchoid.com
-159.203.224.36 # stretchoid.com
-159.203.224.37 # stretchoid.com
-159.203.224.38 # stretchoid.com
-159.203.224.39 # stretchoid.com
-159.203.224.4 # stretchoid.com
-159.203.224.40 # stretchoid.com
-159.203.224.41 # stretchoid.com
-159.203.224.42 # stretchoid.com
-159.203.224.6 # stretchoid.com
-159.203.224.7 # stretchoid.com
-159.203.224.8 # stretchoid.com
-159.203.224.9 # stretchoid.com
-159.203.240.10 # stretchoid.com
-159.203.240.11 # stretchoid.com
-159.203.240.13 # stretchoid.com
-159.203.240.14 # stretchoid.com
-159.203.240.15 # stretchoid.com
-159.203.240.16 # stretchoid.com
-159.203.240.17 # stretchoid.com
-159.203.240.18 # stretchoid.com
-159.203.240.19 # stretchoid.com
-159.203.240.20 # stretchoid.com
-159.203.240.21 # stretchoid.com
-159.203.240.5 # stretchoid.com
-159.203.240.8 # stretchoid.com
-159.203.240.9 # stretchoid.com
-162.243.128.11 # stretchoid.com
-162.243.128.12 # stretchoid.com
-162.243.128.13 # stretchoid.com
-162.243.128.14 # stretchoid.com
-162.243.128.16 # stretchoid.com
-162.243.128.17 # stretchoid.com
-162.243.128.18 # stretchoid.com
-162.243.128.21 # stretchoid.com
-162.243.128.30 # stretchoid.com
-162.243.128.39 # stretchoid.com
-162.243.128.42 # stretchoid.com
-162.243.128.43 # stretchoid.com
-162.243.128.49 # stretchoid.com
-162.243.128.5 # stretchoid.com
-162.243.128.53 # stretchoid.com
-162.243.128.55 # stretchoid.com
-162.243.128.56 # stretchoid.com
-162.243.128.6 # stretchoid.com
-162.243.128.9 # stretchoid.com
-162.243.129.10 # stretchoid.com
-162.243.129.11 # stretchoid.com
-162.243.129.13 # stretchoid.com
-162.243.129.16 # stretchoid.com
-162.243.129.27 # stretchoid.com
-162.243.129.30 # stretchoid.com
-162.243.129.36 # stretchoid.com
-162.243.129.37 # stretchoid.com
-162.243.129.38 # stretchoid.com
-162.243.129.39 # stretchoid.com
-162.243.129.43 # stretchoid.com
-162.243.129.7 # stretchoid.com
-162.243.129.8 # stretchoid.com
-162.243.129.9 # stretchoid.com
-162.243.130.10 # stretchoid.com
-162.243.130.13 # stretchoid.com
-162.243.130.19 # stretchoid.com
-162.243.130.21 # stretchoid.com
-162.243.130.22 # stretchoid.com
-162.243.130.23 # stretchoid.com
-162.243.130.25 # stretchoid.com
-162.243.130.34 # stretchoid.com
-162.243.130.36 # stretchoid.com
-162.243.130.37 # stretchoid.com
-162.243.130.39 # stretchoid.com
-162.243.130.4 # stretchoid.com
-162.243.130.5 # stretchoid.com
-162.243.130.6 # stretchoid.com
-162.243.130.9 # stretchoid.com
-162.243.131.10 # stretchoid.com
-162.243.131.14 # stretchoid.com
-162.243.131.15 # stretchoid.com
-162.243.131.16 # stretchoid.com
-162.243.131.17 # stretchoid.com
-162.243.131.18 # stretchoid.com
-162.243.131.19 # stretchoid.com
-162.243.131.20 # stretchoid.com
-162.243.131.24 # stretchoid.com
-162.243.131.25 # stretchoid.com
-162.243.131.26 # stretchoid.com
-162.243.131.27 # stretchoid.com
-162.243.131.29 # stretchoid.com
-162.243.131.30 # stretchoid.com
-162.243.131.31 # stretchoid.com
-162.243.131.32 # stretchoid.com
-162.243.131.34 # stretchoid.com
-162.243.131.38 # stretchoid.com
-162.243.131.39 # stretchoid.com
-162.243.131.41 # stretchoid.com
-162.243.131.42 # stretchoid.com
-162.243.131.5 # stretchoid.com
-162.243.131.8 # stretchoid.com
-162.243.131.9 # stretchoid.com
-162.243.132.10 # stretchoid.com
-162.243.132.11 # stretchoid.com
-162.243.132.12 # stretchoid.com
-162.243.132.15 # stretchoid.com
-162.243.132.16 # stretchoid.com
-162.243.132.18 # stretchoid.com
-162.243.132.20 # stretchoid.com
-162.243.132.32 # stretchoid.com
-162.243.132.33 # stretchoid.com
-162.243.132.34 # stretchoid.com
-162.243.132.48 # stretchoid.com
-162.243.132.49 # stretchoid.com
-162.243.132.52 # stretchoid.com
-162.243.132.53 # stretchoid.com
-162.243.132.58 # stretchoid.com
-162.243.132.7 # stretchoid.com
-162.243.133.10 # stretchoid.com
-162.243.133.12 # stretchoid.com
-162.243.133.121 # stretchoid.com
-162.243.133.13 # stretchoid.com
-162.243.133.14 # stretchoid.com
-162.243.133.15 # stretchoid.com
-162.243.133.16 # stretchoid.com
-162.243.133.19 # stretchoid.com
-162.243.133.214 # stretchoid.com
-162.243.133.23 # stretchoid.com
-162.243.133.33 # stretchoid.com
-162.243.133.35 # stretchoid.com
-162.243.133.37 # stretchoid.com
-162.243.133.38 # stretchoid.com
-162.243.133.39 # stretchoid.com
-162.243.133.40 # stretchoid.com
-162.243.133.43 # stretchoid.com
-162.243.133.44 # stretchoid.com
-162.243.133.45 # stretchoid.com
-162.243.133.46 # stretchoid.com
-162.243.133.47 # stretchoid.com
-162.243.133.48 # stretchoid.com
-162.243.133.9 # stretchoid.com
-162.243.134.10 # stretchoid.com
-162.243.134.13 # stretchoid.com
-162.243.134.14 # stretchoid.com
-162.243.134.15 # stretchoid.com
-162.243.134.16 # stretchoid.com
-162.243.134.17 # stretchoid.com
-162.243.134.19 # stretchoid.com
-162.243.134.20 # stretchoid.com
-162.243.134.28 # stretchoid.com
-162.243.134.31 # stretchoid.com
-162.243.134.4 # stretchoid.com
-162.243.134.45 # stretchoid.com
-162.243.134.47 # stretchoid.com
-162.243.134.5 # stretchoid.com
-162.243.134.57 # stretchoid.com
-162.243.134.63 # stretchoid.com
-162.243.134.64 # stretchoid.com
-162.243.134.7 # stretchoid.com
-162.243.134.9 # stretchoid.com
-162.243.135.12 # stretchoid.com
-162.243.135.13 # stretchoid.com
-162.243.135.15 # stretchoid.com
-162.243.135.16 # stretchoid.com
-162.243.135.17 # stretchoid.com
-162.243.135.19 # stretchoid.com
-162.243.135.22 # stretchoid.com
-162.243.135.24 # stretchoid.com
-162.243.135.29 # stretchoid.com
-162.243.135.31 # stretchoid.com
-162.243.135.32 # stretchoid.com
-162.243.135.36 # stretchoid.com
-162.243.135.38 # stretchoid.com
-162.243.135.4 # stretchoid.com
-162.243.135.40 # stretchoid.com
-162.243.135.43 # stretchoid.com
-162.243.135.44 # stretchoid.com
-162.243.135.5 # stretchoid.com
-162.243.135.9 # stretchoid.com
-162.243.136.10 # stretchoid.com
-162.243.136.11 # stretchoid.com
-162.243.136.12 # stretchoid.com
-162.243.136.15 # stretchoid.com
-162.243.136.18 # stretchoid.com
-162.243.136.20 # stretchoid.com
-162.243.136.21 # stretchoid.com
-162.243.136.22 # stretchoid.com
-162.243.136.32 # stretchoid.com
-162.243.136.35 # stretchoid.com
-162.243.136.41 # stretchoid.com
-162.243.136.42 # stretchoid.com
-162.243.136.51 # stretchoid.com
-162.243.136.52 # stretchoid.com
-162.243.136.53 # stretchoid.com
-162.243.136.55 # stretchoid.com
-162.243.136.56 # stretchoid.com
-162.243.136.6 # stretchoid.com
-162.243.136.62 # stretchoid.com
-162.243.136.67 # stretchoid.com
-162.243.136.68 # stretchoid.com
-162.243.136.70 # stretchoid.com
-162.243.136.71 # stretchoid.com
-162.243.136.73 # stretchoid.com
-162.243.136.75 # stretchoid.com
-162.243.136.76 # stretchoid.com
-162.243.136.79 # stretchoid.com
-162.243.136.8 # stretchoid.com
-162.243.136.9 # stretchoid.com
-162.243.137.10 # stretchoid.com
-162.243.137.14 # stretchoid.com
-162.243.137.16 # stretchoid.com
-162.243.137.17 # stretchoid.com
-162.243.137.18 # stretchoid.com
-162.243.137.20 # stretchoid.com
-162.243.137.229 # stretchoid.com
-162.243.137.24 # stretchoid.com
-162.243.137.26 # stretchoid.com
-162.243.137.27 # stretchoid.com
-162.243.137.28 # stretchoid.com
-162.243.137.32 # stretchoid.com
-162.243.137.35 # stretchoid.com
-162.243.137.4 # stretchoid.com
-162.243.137.41 # stretchoid.com
-162.243.137.5 # stretchoid.com
-162.243.137.6 # stretchoid.com
-162.243.138.10 # stretchoid.com
-162.243.138.11 # stretchoid.com
-162.243.138.15 # stretchoid.com
-162.243.138.16 # stretchoid.com
-162.243.138.17 # stretchoid.com
-162.243.138.18 # stretchoid.com
-162.243.138.37 # stretchoid.com
-162.243.138.46 # stretchoid.com
-162.243.138.49 # stretchoid.com
-162.243.138.5 # stretchoid.com
-162.243.138.50 # stretchoid.com
-162.243.138.52 # stretchoid.com
-162.243.138.54 # stretchoid.com
-162.243.138.55 # stretchoid.com
-162.243.138.56 # stretchoid.com
-162.243.138.58 # stretchoid.com
-162.243.138.59 # stretchoid.com
-162.243.138.62 # stretchoid.com
-162.243.138.63 # stretchoid.com
-162.243.138.7 # stretchoid.com
-162.243.138.9 # stretchoid.com
-162.243.139.10 # stretchoid.com
-162.243.139.14 # stretchoid.com
-162.243.139.15 # stretchoid.com
-162.243.139.18 # stretchoid.com
-162.243.139.19 # stretchoid.com
-162.243.139.20 # stretchoid.com
-162.243.139.35 # stretchoid.com
-162.243.139.36 # stretchoid.com
-162.243.139.43 # stretchoid.com
-162.243.139.7 # stretchoid.com
-162.243.139.9 # stretchoid.com
-162.243.140.11 # stretchoid.com
-162.243.140.12 # stretchoid.com
-162.243.140.13 # stretchoid.com
-162.243.140.14 # stretchoid.com
-162.243.140.147 # stretchoid.com
-162.243.140.16 # stretchoid.com
-162.243.140.17 # stretchoid.com
-162.243.140.21 # stretchoid.com
-162.243.140.27 # stretchoid.com
-162.243.140.28 # stretchoid.com
-162.243.140.29 # stretchoid.com
-162.243.140.30 # stretchoid.com
-162.243.140.36 # stretchoid.com
-162.243.140.37 # stretchoid.com
-162.243.140.38 # stretchoid.com
-162.243.140.39 # stretchoid.com
-162.243.140.41 # stretchoid.com
-162.243.140.42 # stretchoid.com
-162.243.140.47 # stretchoid.com
-162.243.140.48 # stretchoid.com
-162.243.140.49 # stretchoid.com
-162.243.140.51 # stretchoid.com
-162.243.140.52 # stretchoid.com
-162.243.140.7 # stretchoid.com
-162.243.140.9 # stretchoid.com
-162.243.141.11 # stretchoid.com
-162.243.141.12 # stretchoid.com
-162.243.141.14 # stretchoid.com
-162.243.141.15 # stretchoid.com
-162.243.141.18 # stretchoid.com
-162.243.141.19 # stretchoid.com
-162.243.141.20 # stretchoid.com
-162.243.141.21 # stretchoid.com
-162.243.141.22 # stretchoid.com
-162.243.141.23 # stretchoid.com
-162.243.141.30 # stretchoid.com
-162.243.141.38 # stretchoid.com
-162.243.141.41 # stretchoid.com
-162.243.141.42 # stretchoid.com
-162.243.141.46 # stretchoid.com
-162.243.141.48 # stretchoid.com
-162.243.141.7 # stretchoid.com
-162.243.142.10 # stretchoid.com
-162.243.142.13 # stretchoid.com
-162.243.142.15 # stretchoid.com
-162.243.142.16 # stretchoid.com
-162.243.142.17 # stretchoid.com
-162.243.142.20 # stretchoid.com
-162.243.142.21 # stretchoid.com
-162.243.142.22 # stretchoid.com
-162.243.142.23 # stretchoid.com
-162.243.142.25 # stretchoid.com
-162.243.142.29 # stretchoid.com
-162.243.142.34 # stretchoid.com
-162.243.142.35 # stretchoid.com
-162.243.142.37 # stretchoid.com
-162.243.142.41 # stretchoid.com
-162.243.142.42 # stretchoid.com
-162.243.142.43 # stretchoid.com
-162.243.142.44 # stretchoid.com
-162.243.142.47 # stretchoid.com
-162.243.142.48 # stretchoid.com
-162.243.142.5 # stretchoid.com
-162.243.142.52 # stretchoid.com
-162.243.142.57 # stretchoid.com
-162.243.142.59 # stretchoid.com
-162.243.142.6 # stretchoid.com
-162.243.142.60 # stretchoid.com
-162.243.142.61 # stretchoid.com
-162.243.142.64 # stretchoid.com
-162.243.142.68 # stretchoid.com
-162.243.142.69 # stretchoid.com
-162.243.142.7 # stretchoid.com
-162.243.142.8 # stretchoid.com
-162.243.143.11 # stretchoid.com
-162.243.143.12 # stretchoid.com
-162.243.143.14 # stretchoid.com
-162.243.143.17 # stretchoid.com
-162.243.143.18 # stretchoid.com
-162.243.143.21 # stretchoid.com
-162.243.143.22 # stretchoid.com
-162.243.143.23 # stretchoid.com
-162.243.143.24 # stretchoid.com
-162.243.143.25 # stretchoid.com
-162.243.143.26 # stretchoid.com
-162.243.143.28 # stretchoid.com
-162.243.143.29 # stretchoid.com
-162.243.143.30 # stretchoid.com
-162.243.143.39 # stretchoid.com
-162.243.143.41 # stretchoid.com
-162.243.143.42 # stretchoid.com
-162.243.143.48 # stretchoid.com
-162.243.143.49 # stretchoid.com
-162.243.143.50 # stretchoid.com
-162.243.143.51 # stretchoid.com
-162.243.143.52 # stretchoid.com
-162.243.143.53 # stretchoid.com
-162.243.143.55 # stretchoid.com
-162.243.143.56 # stretchoid.com
-162.243.143.57 # stretchoid.com
-162.243.143.6 # stretchoid.com
-162.243.143.60 # stretchoid.com
-162.243.143.61 # stretchoid.com
-162.243.144.10 # stretchoid.com
-162.243.144.11 # stretchoid.com
-162.243.144.12 # stretchoid.com
-162.243.144.13 # stretchoid.com
-162.243.144.15 # stretchoid.com
-162.243.144.16 # stretchoid.com
-162.243.144.18 # stretchoid.com
-162.243.144.22 # stretchoid.com
-162.243.144.24 # stretchoid.com
-162.243.144.27 # stretchoid.com
-162.243.144.29 # stretchoid.com
-162.243.144.31 # stretchoid.com
-162.243.144.36 # stretchoid.com
-162.243.144.38 # stretchoid.com
-162.243.144.4 # stretchoid.com
-162.243.144.6 # stretchoid.com
-162.243.144.8 # stretchoid.com
-162.243.144.9 # stretchoid.com
-162.243.145.11 # stretchoid.com
-162.243.145.12 # stretchoid.com
-162.243.145.13 # stretchoid.com
-162.243.145.14 # stretchoid.com
-162.243.145.15 # stretchoid.com
-162.243.145.16 # stretchoid.com
-162.243.145.17 # stretchoid.com
-162.243.145.19 # stretchoid.com
-162.243.145.20 # stretchoid.com
-162.243.145.22 # stretchoid.com
-162.243.145.28 # stretchoid.com
-162.243.145.40 # stretchoid.com
-162.243.145.43 # stretchoid.com
-162.243.145.44 # stretchoid.com
-162.243.145.45 # stretchoid.com
-162.243.145.46 # stretchoid.com
-162.243.145.48 # stretchoid.com
-162.243.145.50 # stretchoid.com
-162.243.145.8 # stretchoid.com
-162.243.145.9 # stretchoid.com
-162.243.145.91 # stretchoid.com
-162.243.146.10 # stretchoid.com
-162.243.146.11 # stretchoid.com
-162.243.146.13 # stretchoid.com
-162.243.146.14 # stretchoid.com
-162.243.146.15 # stretchoid.com
-162.243.146.16 # stretchoid.com
-162.243.146.17 # stretchoid.com
-162.243.146.18 # stretchoid.com
-162.243.146.20 # stretchoid.com
-162.243.146.24 # stretchoid.com
-162.243.146.27 # stretchoid.com
-162.243.146.4 # stretchoid.com
-162.243.146.47 # stretchoid.com
-162.243.146.49 # stretchoid.com
-162.243.146.50 # stretchoid.com
-162.243.146.55 # stretchoid.com
-162.243.146.58 # stretchoid.com
-162.243.146.6 # stretchoid.com
-162.243.146.62 # stretchoid.com
-162.243.146.69 # stretchoid.com
-162.243.146.70 # stretchoid.com
-162.243.146.71 # stretchoid.com
-162.243.146.72 # stretchoid.com
-162.243.147.13 # stretchoid.com
-162.243.147.14 # stretchoid.com
-162.243.147.15 # stretchoid.com
-162.243.147.16 # stretchoid.com
-162.243.147.17 # stretchoid.com
-162.243.147.18 # stretchoid.com
-162.243.147.19 # stretchoid.com
-162.243.147.21 # stretchoid.com
-162.243.147.22 # stretchoid.com
-162.243.147.23 # stretchoid.com
-162.243.147.24 # stretchoid.com
-162.243.147.25 # stretchoid.com
-162.243.147.26 # stretchoid.com
-162.243.147.27 # stretchoid.com
-162.243.147.28 # stretchoid.com
-162.243.147.31 # stretchoid.com
-162.243.147.34 # stretchoid.com
-162.243.147.4 # stretchoid.com
-162.243.147.5 # stretchoid.com
-162.243.147.7 # stretchoid.com
-162.243.148.12 # stretchoid.com
-162.243.148.13 # stretchoid.com
-162.243.148.14 # stretchoid.com
-162.243.148.16 # stretchoid.com
-162.243.148.17 # stretchoid.com
-162.243.148.18 # stretchoid.com
-162.243.148.20 # stretchoid.com
-162.243.148.21 # stretchoid.com
-162.243.148.22 # stretchoid.com
-162.243.148.23 # stretchoid.com
-162.243.148.24 # stretchoid.com
-162.243.148.37 # stretchoid.com
-162.243.148.39 # stretchoid.com
-162.243.148.4 # stretchoid.com
-162.243.148.6 # stretchoid.com
-162.243.148.7 # stretchoid.com
-162.243.148.8 # stretchoid.com
-162.243.149.10 # stretchoid.com
-162.243.149.11 # stretchoid.com
-162.243.149.12 # stretchoid.com
-162.243.149.13 # stretchoid.com
-162.243.149.16 # stretchoid.com
-162.243.149.18 # stretchoid.com
-162.243.149.26 # stretchoid.com
-162.243.149.30 # stretchoid.com
-162.243.149.36 # stretchoid.com
-162.243.149.37 # stretchoid.com
-162.243.149.4 # stretchoid.com
-162.243.149.40 # stretchoid.com
-162.243.149.6 # stretchoid.com
-162.243.149.7 # stretchoid.com
-162.243.149.8 # stretchoid.com
-162.243.149.9 # stretchoid.com
-162.243.150.10 # stretchoid.com
-162.243.150.11 # stretchoid.com
-162.243.150.12 # stretchoid.com
-162.243.150.15 # stretchoid.com
-162.243.150.16 # stretchoid.com
-162.243.150.18 # stretchoid.com
-162.243.150.19 # stretchoid.com
-162.243.150.23 # stretchoid.com
-162.243.150.36 # stretchoid.com
-162.243.150.38 # stretchoid.com
-162.243.150.39 # stretchoid.com
-162.243.150.4 # stretchoid.com
-162.243.150.40 # stretchoid.com
-162.243.150.41 # stretchoid.com
-162.243.150.43 # stretchoid.com
-162.243.150.44 # stretchoid.com
-162.243.150.45 # stretchoid.com
-162.243.150.47 # stretchoid.com
-162.243.150.48 # stretchoid.com
-162.243.150.6 # stretchoid.com
-162.243.150.8 # stretchoid.com
-162.243.150.9 # stretchoid.com
-162.243.151.12 # stretchoid.com
-162.243.151.13 # stretchoid.com
-162.243.151.17 # stretchoid.com
-162.243.151.19 # stretchoid.com
-162.243.151.20 # stretchoid.com
-162.243.151.21 # stretchoid.com
-162.243.151.22 # stretchoid.com
-162.243.151.24 # stretchoid.com
-162.243.151.30 # stretchoid.com
-162.243.151.35 # stretchoid.com
-162.243.151.36 # stretchoid.com
-162.243.151.37 # stretchoid.com
-162.243.151.39 # stretchoid.com
-162.243.151.4 # stretchoid.com
-162.243.151.41 # stretchoid.com
-162.243.151.42 # stretchoid.com
-162.243.151.43 # stretchoid.com
-162.243.151.6 # stretchoid.com
-162.243.151.8 # stretchoid.com
-162.243.151.9 # stretchoid.com
-162.243.152.12 # stretchoid.com
-162.243.152.13 # stretchoid.com
-162.243.152.15 # stretchoid.com
-162.243.152.16 # stretchoid.com
-162.243.152.17 # stretchoid.com
-162.243.152.18 # stretchoid.com
-162.243.152.20 # stretchoid.com
-162.243.152.21 # stretchoid.com
-162.243.152.23 # stretchoid.com
-162.243.152.25 # stretchoid.com
-162.243.152.27 # stretchoid.com
-162.243.152.34 # stretchoid.com
-162.243.152.4 # stretchoid.com
-162.243.152.46 # stretchoid.com
-162.243.152.5 # stretchoid.com
-162.243.152.6 # stretchoid.com
-192.241.192.13 # stretchoid.com
-192.241.192.14 # stretchoid.com
-192.241.192.20 # stretchoid.com
-192.241.192.21 # stretchoid.com
-192.241.192.25 # stretchoid.com
-192.241.192.26 # stretchoid.com
-192.241.192.27 # stretchoid.com
-192.241.192.55 # stretchoid.com
-192.241.192.58 # stretchoid.com
-192.241.192.66 # stretchoid.com
-192.241.192.8 # stretchoid.com
-192.241.192.9 # stretchoid.com
-192.241.193.100 # stretchoid.com
-192.241.193.104 # stretchoid.com
-192.241.193.117 # stretchoid.com
-192.241.193.119 # stretchoid.com
-192.241.193.121 # stretchoid.com
-192.241.193.124 # stretchoid.com
-192.241.193.125 # stretchoid.com
-192.241.193.126 # stretchoid.com
-192.241.193.128 # stretchoid.com
-192.241.193.13 # stretchoid.com
-192.241.193.15 # stretchoid.com
-192.241.193.21 # stretchoid.com
-192.241.193.34 # stretchoid.com
-192.241.193.43 # stretchoid.com
-192.241.193.50 # stretchoid.com
-192.241.193.55 # stretchoid.com
-192.241.193.59 # stretchoid.com
-192.241.193.6 # stretchoid.com
-192.241.193.60 # stretchoid.com
-192.241.193.64 # stretchoid.com
-192.241.193.77 # stretchoid.com
-192.241.193.81 # stretchoid.com
-192.241.193.82 # stretchoid.com
-192.241.193.87 # stretchoid.com
-192.241.193.9 # stretchoid.com
-192.241.193.94 # stretchoid.com
-192.241.193.98 # stretchoid.com
-192.241.194.100 # stretchoid.com
-192.241.194.103 # stretchoid.com
-192.241.194.104 # stretchoid.com
-192.241.194.16 # stretchoid.com
-192.241.194.23 # stretchoid.com
-192.241.194.29 # stretchoid.com
-192.241.194.30 # stretchoid.com
-192.241.194.31 # stretchoid.com
-192.241.194.38 # stretchoid.com
-192.241.194.41 # stretchoid.com
-192.241.194.48 # stretchoid.com
-192.241.194.51 # stretchoid.com
-192.241.194.54 # stretchoid.com
-192.241.194.57 # stretchoid.com
-192.241.194.76 # stretchoid.com
-192.241.194.9 # stretchoid.com
-192.241.194.90 # stretchoid.com
-192.241.195.114 # stretchoid.com
-192.241.195.115 # stretchoid.com
-192.241.195.116 # stretchoid.com
-192.241.195.118 # stretchoid.com
-192.241.195.12 # stretchoid.com
-192.241.195.141 # stretchoid.com
-192.241.195.15 # stretchoid.com
-192.241.195.22 # stretchoid.com
-192.241.195.226 # stretchoid.com
-192.241.195.28 # stretchoid.com
-192.241.195.34 # stretchoid.com
-192.241.195.37 # stretchoid.com
-192.241.195.38 # stretchoid.com
-192.241.195.40 # stretchoid.com
-192.241.195.46 # stretchoid.com
-192.241.195.48 # stretchoid.com
-192.241.195.49 # stretchoid.com
-192.241.195.5 # stretchoid.com
-192.241.195.51 # stretchoid.com
-192.241.195.6 # stretchoid.com
-192.241.195.64 # stretchoid.com
-192.241.195.65 # stretchoid.com
-192.241.195.71 # stretchoid.com
-192.241.195.77 # stretchoid.com
-192.241.195.83 # stretchoid.com
-192.241.195.90 # stretchoid.com
-192.241.195.91 # stretchoid.com
-192.241.195.99 # stretchoid.com
-192.241.196.100 # stretchoid.com
-192.241.196.106 # stretchoid.com
-192.241.196.108 # stretchoid.com
-192.241.196.109 # stretchoid.com
-192.241.196.112 # stretchoid.com
-192.241.196.118 # stretchoid.com
-192.241.196.119 # stretchoid.com
-192.241.196.120 # stretchoid.com
-192.241.196.121 # stretchoid.com
-192.241.196.123 # stretchoid.com
-192.241.196.124 # stretchoid.com
-192.241.196.126 # stretchoid.com
-192.241.196.33 # stretchoid.com
-192.241.196.34 # stretchoid.com
-192.241.196.4 # stretchoid.com
-192.241.196.48 # stretchoid.com
-192.241.196.5 # stretchoid.com
-192.241.196.56 # stretchoid.com
-192.241.196.59 # stretchoid.com
-192.241.196.60 # stretchoid.com
-192.241.196.75 # stretchoid.com
-192.241.196.79 # stretchoid.com
-192.241.196.8 # stretchoid.com
-192.241.196.80 # stretchoid.com
-192.241.196.89 # stretchoid.com
-192.241.196.95 # stretchoid.com
-192.241.196.96 # stretchoid.com
-192.241.197.11 # stretchoid.com
-192.241.197.13 # stretchoid.com
-192.241.197.141 # stretchoid.com
-192.241.197.16 # stretchoid.com
-192.241.197.17 # stretchoid.com
-192.241.197.18 # stretchoid.com
-192.241.197.21 # stretchoid.com
-192.241.197.22 # stretchoid.com
-192.241.197.25 # stretchoid.com
-192.241.197.26 # stretchoid.com
-192.241.197.31 # stretchoid.com
-192.241.197.33 # stretchoid.com
-192.241.197.39 # stretchoid.com
-192.241.197.4 # stretchoid.com
-192.241.197.40 # stretchoid.com
-192.241.197.42 # stretchoid.com
-192.241.197.43 # stretchoid.com
-192.241.197.44 # stretchoid.com
-192.241.197.5 # stretchoid.com
-192.241.197.50 # stretchoid.com
-192.241.197.51 # stretchoid.com
-192.241.197.6 # stretchoid.com
-192.241.197.61 # stretchoid.com
-192.241.197.8 # stretchoid.com
-192.241.198.11 # stretchoid.com
-192.241.198.16 # stretchoid.com
-192.241.198.23 # stretchoid.com
-192.241.198.31 # stretchoid.com
-192.241.198.33 # stretchoid.com
-192.241.198.37 # stretchoid.com
-192.241.198.38 # stretchoid.com
-192.241.198.39 # stretchoid.com
-192.241.198.41 # stretchoid.com
-192.241.198.55 # stretchoid.com
-192.241.198.73 # stretchoid.com
-192.241.198.8 # stretchoid.com
-192.241.198.9 # stretchoid.com
-192.241.199.18 # stretchoid.com
-192.241.199.19 # stretchoid.com
-192.241.199.24 # stretchoid.com
-192.241.199.29 # stretchoid.com
-192.241.199.30 # stretchoid.com
-192.241.199.32 # stretchoid.com
-192.241.199.4 # stretchoid.com
-192.241.199.47 # stretchoid.com
-192.241.199.51 # stretchoid.com
-192.241.199.52 # stretchoid.com
-192.241.199.53 # stretchoid.com
-192.241.199.70 # stretchoid.com
-192.241.199.75 # stretchoid.com
-192.241.199.78 # stretchoid.com
-192.241.199.8 # stretchoid.com
-192.241.199.82 # stretchoid.com
-192.241.199.83 # stretchoid.com
-192.241.199.87 # stretchoid.com
-192.241.199.95 # stretchoid.com
-192.241.199.96 # stretchoid.com
-192.241.200.103 # stretchoid.com
-192.241.200.13 # stretchoid.com
-192.241.200.14 # stretchoid.com
-192.241.200.18 # stretchoid.com
-192.241.200.24 # stretchoid.com
-192.241.200.25 # stretchoid.com
-192.241.200.29 # stretchoid.com
-192.241.200.30 # stretchoid.com
-192.241.200.31 # stretchoid.com
-192.241.200.33 # stretchoid.com
-192.241.200.4 # stretchoid.com
-192.241.200.48 # stretchoid.com
-192.241.200.65 # stretchoid.com
-192.241.200.68 # stretchoid.com
-192.241.200.70 # stretchoid.com
-192.241.200.71 # stretchoid.com
-192.241.200.73 # stretchoid.com
-192.241.200.74 # stretchoid.com
-192.241.200.76 # stretchoid.com
-192.241.200.78 # stretchoid.com
-192.241.200.80 # stretchoid.com
-192.241.201.11 # stretchoid.com
-192.241.201.126 # stretchoid.com
-192.241.201.146 # stretchoid.com
-192.241.201.16 # stretchoid.com
-192.241.201.18 # stretchoid.com
-192.241.201.30 # stretchoid.com
-192.241.201.31 # stretchoid.com
-192.241.201.6 # stretchoid.com
-192.241.201.68 # stretchoid.com
-192.241.201.69 # stretchoid.com
-192.241.201.73 # stretchoid.com
-192.241.201.79 # stretchoid.com
-192.241.201.8 # stretchoid.com
-192.241.201.80 # stretchoid.com
-192.241.201.85 # stretchoid.com
-192.241.201.86 # stretchoid.com
-192.241.201.87 # stretchoid.com
-192.241.201.89 # stretchoid.com
-192.241.201.91 # stretchoid.com
-192.241.202.13 # stretchoid.com
-192.241.202.14 # stretchoid.com
-192.241.202.20 # stretchoid.com
-192.241.202.21 # stretchoid.com
-192.241.202.239 # stretchoid.com
-192.241.202.24 # stretchoid.com
-192.241.202.27 # stretchoid.com
-192.241.202.29 # stretchoid.com
-192.241.202.30 # stretchoid.com
-192.241.202.37 # stretchoid.com
-192.241.202.48 # stretchoid.com
-192.241.202.53 # stretchoid.com
-192.241.202.56 # stretchoid.com
-192.241.202.68 # stretchoid.com
-192.241.202.71 # stretchoid.com
-192.241.202.77 # stretchoid.com
-192.241.202.78 # stretchoid.com
-192.241.202.81 # stretchoid.com
-192.241.202.82 # stretchoid.com
-192.241.202.85 # stretchoid.com
-192.241.202.88 # stretchoid.com
-192.241.202.89 # stretchoid.com
-192.241.203.125 # stretchoid.com
-192.241.203.13 # stretchoid.com
-192.241.203.14 # stretchoid.com
-192.241.203.17 # stretchoid.com
-192.241.203.18 # stretchoid.com
-192.241.203.202 # stretchoid.com
-192.241.203.215 # stretchoid.com
-192.241.203.27 # stretchoid.com
-192.241.203.28 # stretchoid.com
-192.241.203.31 # stretchoid.com
-192.241.203.32 # stretchoid.com
-192.241.203.37 # stretchoid.com
-192.241.203.4 # stretchoid.com
-192.241.203.43 # stretchoid.com
-192.241.203.44 # stretchoid.com
-192.241.203.5 # stretchoid.com
-192.241.203.52 # stretchoid.com
-192.241.203.59 # stretchoid.com
-192.241.203.6 # stretchoid.com
-192.241.203.65 # stretchoid.com
-192.241.203.69 # stretchoid.com
-192.241.203.76 # stretchoid.com
-192.241.203.8 # stretchoid.com
-192.241.204.113 # stretchoid.com
-192.241.204.16 # stretchoid.com
-192.241.204.171 # stretchoid.com
-192.241.204.26 # stretchoid.com
-192.241.204.28 # stretchoid.com
-192.241.204.31 # stretchoid.com
-192.241.204.35 # stretchoid.com
-192.241.204.38 # stretchoid.com
-192.241.204.39 # stretchoid.com
-192.241.204.4 # stretchoid.com
-192.241.204.48 # stretchoid.com
-192.241.204.54 # stretchoid.com
-192.241.204.56 # stretchoid.com
-192.241.204.59 # stretchoid.com
-192.241.204.63 # stretchoid.com
-192.241.204.66 # stretchoid.com
-192.241.204.72 # stretchoid.com
-192.241.204.75 # stretchoid.com
-192.241.204.79 # stretchoid.com
-192.241.204.81 # stretchoid.com
-192.241.204.82 # stretchoid.com
-192.241.205.10 # stretchoid.com
-192.241.205.11 # stretchoid.com
-192.241.205.12 # stretchoid.com
-192.241.205.14 # stretchoid.com
-192.241.205.18 # stretchoid.com
-192.241.205.20 # stretchoid.com
-192.241.205.21 # stretchoid.com
-192.241.205.242 # stretchoid.com
-192.241.205.27 # stretchoid.com
-192.241.205.54 # stretchoid.com
-192.241.205.67 # stretchoid.com
-192.241.206.10 # stretchoid.com
-192.241.206.104 # stretchoid.com
-192.241.206.11 # stretchoid.com
-192.241.206.14 # stretchoid.com
-192.241.206.15 # stretchoid.com
-192.241.206.16 # stretchoid.com
-192.241.206.18 # stretchoid.com
-192.241.206.228 # stretchoid.com
-192.241.206.30 # stretchoid.com
-192.241.206.31 # stretchoid.com
-192.241.206.34 # stretchoid.com
-192.241.206.6 # stretchoid.com
-192.241.206.91 # stretchoid.com
-192.241.207.100 # stretchoid.com
-192.241.207.101 # stretchoid.com
-192.241.207.104 # stretchoid.com
-192.241.207.106 # stretchoid.com
-192.241.207.109 # stretchoid.com
-192.241.207.111 # stretchoid.com
-192.241.207.124 # stretchoid.com
-192.241.207.16 # stretchoid.com
-192.241.207.34 # stretchoid.com
-192.241.207.4 # stretchoid.com
-192.241.207.42 # stretchoid.com
-192.241.207.44 # stretchoid.com
-192.241.207.46 # stretchoid.com
-192.241.207.47 # stretchoid.com
-192.241.207.53 # stretchoid.com
-192.241.207.54 # stretchoid.com
-192.241.207.57 # stretchoid.com
-192.241.207.60 # stretchoid.com
-192.241.207.62 # stretchoid.com
-192.241.207.66 # stretchoid.com
-192.241.207.72 # stretchoid.com
-192.241.207.74 # stretchoid.com
-192.241.207.77 # stretchoid.com
-192.241.207.78 # stretchoid.com
-192.241.207.79 # stretchoid.com
-192.241.207.8 # stretchoid.com
-192.241.207.81 # stretchoid.com
-192.241.207.85 # stretchoid.com
-192.241.207.87 # stretchoid.com
-192.241.207.88 # stretchoid.com
-192.241.207.93 # stretchoid.com
-192.241.207.94 # stretchoid.com
-192.241.207.96 # stretchoid.com
-192.241.207.98 # stretchoid.com
-192.241.207.99 # stretchoid.com
-192.241.208.106 # stretchoid.com
-192.241.208.135 # stretchoid.com
-192.241.208.18 # stretchoid.com
-192.241.208.20 # stretchoid.com
-192.241.208.230 # stretchoid.com
-192.241.208.233 # stretchoid.com
-192.241.208.243 # stretchoid.com
-192.241.208.246 # stretchoid.com
-192.241.208.40 # stretchoid.com
-192.241.208.49 # stretchoid.com
-192.241.208.5 # stretchoid.com
-192.241.208.50 # stretchoid.com
-192.241.208.60 # stretchoid.com
-192.241.208.62 # stretchoid.com
-192.241.208.64 # stretchoid.com
-192.241.208.65 # stretchoid.com
-192.241.208.66 # stretchoid.com
-192.241.208.67 # stretchoid.com
-192.241.208.68 # stretchoid.com
-192.241.208.69 # stretchoid.com
-192.241.208.7 # stretchoid.com
-192.241.208.70 # stretchoid.com
-192.241.208.74 # stretchoid.com
-192.241.208.75 # stretchoid.com
-192.241.208.76 # stretchoid.com
-192.241.208.77 # stretchoid.com
-192.241.208.78 # stretchoid.com
-192.241.208.79 # stretchoid.com
-192.241.209.112 # stretchoid.com
-192.241.209.118 # stretchoid.com
-192.241.209.125 # stretchoid.com
-192.241.209.135 # stretchoid.com
-192.241.209.14 # stretchoid.com
-192.241.209.153 # stretchoid.com
-192.241.209.154 # stretchoid.com
-192.241.209.158 # stretchoid.com
-192.241.209.20 # stretchoid.com
-192.241.209.21 # stretchoid.com
-192.241.209.24 # stretchoid.com
-192.241.209.25 # stretchoid.com
-192.241.209.26 # stretchoid.com
-192.241.209.29 # stretchoid.com
-192.241.209.34 # stretchoid.com
-192.241.209.4 # stretchoid.com
-192.241.209.7 # stretchoid.com
-192.241.210.11 # stretchoid.com
-192.241.210.19 # stretchoid.com
-192.241.210.20 # stretchoid.com
-192.241.210.21 # stretchoid.com
-192.241.210.23 # stretchoid.com
-192.241.210.24 # stretchoid.com
-192.241.210.25 # stretchoid.com
-192.241.210.26 # stretchoid.com
-192.241.210.27 # stretchoid.com
-192.241.210.29 # stretchoid.com
-192.241.210.30 # stretchoid.com
-192.241.210.31 # stretchoid.com
-192.241.210.35 # stretchoid.com
-192.241.210.38 # stretchoid.com
-192.241.210.46 # stretchoid.com
-192.241.210.51 # stretchoid.com
-192.241.210.59 # stretchoid.com
-192.241.210.64 # stretchoid.com
-192.241.210.7 # stretchoid.com
-192.241.210.75 # stretchoid.com
-192.241.210.77 # stretchoid.com
-192.241.210.81 # stretchoid.com
-192.241.210.82 # stretchoid.com
-192.241.211.11 # stretchoid.com
-192.241.211.12 # stretchoid.com
-192.241.211.13 # stretchoid.com
-192.241.211.15 # stretchoid.com
-192.241.211.22 # stretchoid.com
-192.241.211.23 # stretchoid.com
-192.241.211.25 # stretchoid.com
-192.241.211.31 # stretchoid.com
-192.241.211.32 # stretchoid.com
-192.241.211.35 # stretchoid.com
-192.241.211.40 # stretchoid.com
-192.241.211.44 # stretchoid.com
-192.241.211.45 # stretchoid.com
-192.241.211.48 # stretchoid.com
-192.241.211.49 # stretchoid.com
-192.241.211.5 # stretchoid.com
-192.241.211.53 # stretchoid.com
-192.241.211.54 # stretchoid.com
-192.241.211.57 # stretchoid.com
-192.241.211.58 # stretchoid.com
-192.241.211.59 # stretchoid.com
-192.241.211.8 # stretchoid.com
-192.241.212.112 # stretchoid.com
-192.241.212.169 # stretchoid.com
-192.241.212.179 # stretchoid.com
-192.241.212.18 # stretchoid.com
-192.241.212.23 # stretchoid.com
-192.241.212.244 # stretchoid.com
-192.241.212.26 # stretchoid.com
-192.241.212.28 # stretchoid.com
-192.241.212.29 # stretchoid.com
-192.241.212.30 # stretchoid.com
-192.241.212.31 # stretchoid.com
-192.241.212.32 # stretchoid.com
-192.241.212.33 # stretchoid.com
-192.241.212.36 # stretchoid.com
-192.241.212.39 # stretchoid.com
-192.241.212.43 # stretchoid.com
-192.241.212.44 # stretchoid.com
-192.241.212.45 # stretchoid.com
-192.241.212.48 # stretchoid.com
-192.241.212.50 # stretchoid.com
-192.241.212.52 # stretchoid.com
-192.241.212.60 # stretchoid.com
-192.241.212.9 # stretchoid.com
-192.241.212.99 # stretchoid.com
-192.241.213.11 # stretchoid.com
-192.241.213.12 # stretchoid.com
-192.241.213.27 # stretchoid.com
-192.241.213.36 # stretchoid.com
-192.241.213.37 # stretchoid.com
-192.241.213.38 # stretchoid.com
-192.241.213.41 # stretchoid.com
-192.241.213.42 # stretchoid.com
-192.241.213.43 # stretchoid.com
-192.241.213.46 # stretchoid.com
-192.241.213.49 # stretchoid.com
-192.241.213.5 # stretchoid.com
-192.241.213.58 # stretchoid.com
-192.241.213.65 # stretchoid.com
-192.241.213.66 # stretchoid.com
-192.241.213.72 # stretchoid.com
-192.241.213.75 # stretchoid.com
-192.241.213.77 # stretchoid.com
-192.241.213.79 # stretchoid.com
-192.241.214.10 # stretchoid.com
-192.241.214.12 # stretchoid.com
-192.241.214.13 # stretchoid.com
-192.241.214.15 # stretchoid.com
-192.241.214.16 # stretchoid.com
-192.241.214.17 # stretchoid.com
-192.241.214.19 # stretchoid.com
-192.241.214.20 # stretchoid.com
-192.241.214.21 # stretchoid.com
-192.241.214.22 # stretchoid.com
-192.241.214.25 # stretchoid.com
-192.241.214.26 # stretchoid.com
-192.241.214.4 # stretchoid.com
-192.241.214.40 # stretchoid.com
-192.241.214.46 # stretchoid.com
-192.241.214.5 # stretchoid.com
-192.241.214.9 # stretchoid.com
-192.241.215.10 # stretchoid.com
-192.241.215.11 # stretchoid.com
-192.241.215.14 # stretchoid.com
-192.241.215.17 # stretchoid.com
-192.241.215.18 # stretchoid.com
-192.241.215.24 # stretchoid.com
-192.241.215.27 # stretchoid.com
-192.241.215.29 # stretchoid.com
-192.241.215.35 # stretchoid.com
-192.241.215.38 # stretchoid.com
-192.241.215.42 # stretchoid.com
-192.241.215.48 # stretchoid.com
-192.241.215.49 # stretchoid.com
-192.241.215.51 # stretchoid.com
-192.241.215.53 # stretchoid.com
-192.241.215.54 # stretchoid.com
-192.241.216.10 # stretchoid.com
-192.241.216.11 # stretchoid.com
-192.241.216.12 # stretchoid.com
-192.241.216.13 # stretchoid.com
-192.241.216.14 # stretchoid.com
-192.241.216.15 # stretchoid.com
-192.241.216.16 # stretchoid.com
-192.241.216.19 # stretchoid.com
-192.241.216.23 # stretchoid.com
-192.241.216.24 # stretchoid.com
-192.241.216.29 # stretchoid.com
-192.241.216.30 # stretchoid.com
-192.241.216.31 # stretchoid.com
-192.241.216.39 # stretchoid.com
-192.241.216.41 # stretchoid.com
-192.241.216.43 # stretchoid.com
-192.241.216.44 # stretchoid.com
-192.241.216.45 # stretchoid.com
-192.241.216.46 # stretchoid.com
-192.241.216.48 # stretchoid.com
-192.241.216.5 # stretchoid.com
-192.241.216.50 # stretchoid.com
-192.241.216.8 # stretchoid.com
-192.241.217.10 # stretchoid.com
-192.241.217.12 # stretchoid.com
-192.241.217.13 # stretchoid.com
-192.241.217.15 # stretchoid.com
-192.241.217.16 # stretchoid.com
-192.241.217.35 # stretchoid.com
-192.241.217.36 # stretchoid.com
-192.241.217.37 # stretchoid.com
-192.241.217.39 # stretchoid.com
-192.241.217.6 # stretchoid.com
-192.241.217.60 # stretchoid.com
-192.241.217.7 # stretchoid.com
-192.241.217.9 # stretchoid.com
-192.241.218.12 # stretchoid.com
-192.241.218.14 # stretchoid.com
-192.241.218.15 # stretchoid.com
-192.241.218.16 # stretchoid.com
-192.241.218.17 # stretchoid.com
-192.241.218.18 # stretchoid.com
-192.241.218.19 # stretchoid.com
-192.241.218.20 # stretchoid.com
-192.241.218.21 # stretchoid.com
-192.241.218.22 # stretchoid.com
-192.241.218.24 # stretchoid.com
-192.241.218.25 # stretchoid.com
-192.241.218.28 # stretchoid.com
-192.241.218.37 # stretchoid.com
-192.241.218.38 # stretchoid.com
-192.241.218.40 # stretchoid.com
-192.241.218.41 # stretchoid.com
-192.241.218.42 # stretchoid.com
-192.241.218.44 # stretchoid.com
-192.241.218.52 # stretchoid.com
-192.241.218.53 # stretchoid.com
-192.241.218.58 # stretchoid.com
-192.241.218.6 # stretchoid.com
-192.241.218.63 # stretchoid.com
-192.241.218.67 # stretchoid.com
-192.241.219.17 # stretchoid.com
-192.241.219.19 # stretchoid.com
-192.241.219.20 # stretchoid.com
-192.241.219.26 # stretchoid.com
-192.241.219.29 # stretchoid.com
-192.241.219.31 # stretchoid.com
-192.241.219.34 # stretchoid.com
-192.241.219.35 # stretchoid.com
-192.241.219.37 # stretchoid.com
-192.241.219.38 # stretchoid.com
-192.241.219.39 # stretchoid.com
-192.241.219.44 # stretchoid.com
-192.241.219.45 # stretchoid.com
-192.241.219.48 # stretchoid.com
-192.241.219.50 # stretchoid.com
-192.241.219.51 # stretchoid.com
-192.241.219.52 # stretchoid.com
-192.241.219.53 # stretchoid.com
-192.241.219.54 # stretchoid.com
-192.241.219.55 # stretchoid.com
-192.241.219.56 # stretchoid.com
-192.241.219.57 # stretchoid.com
-192.241.219.58 # stretchoid.com
-192.241.219.59 # stretchoid.com
-192.241.219.60 # stretchoid.com
-192.241.219.61 # stretchoid.com
-192.241.220.10 # stretchoid.com
-192.241.220.12 # stretchoid.com
-192.241.220.13 # stretchoid.com
-192.241.220.16 # stretchoid.com
-192.241.220.23 # stretchoid.com
-192.241.220.24 # stretchoid.com
-192.241.220.35 # stretchoid.com
-192.241.220.39 # stretchoid.com
-192.241.220.43 # stretchoid.com
-192.241.220.44 # stretchoid.com
-192.241.220.47 # stretchoid.com
-192.241.220.52 # stretchoid.com
-192.241.221.11 # stretchoid.com
-192.241.221.12 # stretchoid.com
-192.241.221.13 # stretchoid.com
-192.241.221.14 # stretchoid.com
-192.241.221.15 # stretchoid.com
-192.241.221.16 # stretchoid.com
-192.241.221.18 # stretchoid.com
-192.241.221.19 # stretchoid.com
-192.241.221.29 # stretchoid.com
-192.241.221.34 # stretchoid.com
-192.241.221.41 # stretchoid.com
-192.241.221.43 # stretchoid.com
-192.241.221.5 # stretchoid.com
-192.241.221.54 # stretchoid.com
-192.241.221.6 # stretchoid.com
-192.241.221.64 # stretchoid.com
-192.241.221.66 # stretchoid.com
-192.241.221.69 # stretchoid.com
-192.241.221.9 # stretchoid.com
-192.241.222.20 # stretchoid.com
-192.241.222.21 # stretchoid.com
-192.241.222.24 # stretchoid.com
-192.241.222.25 # stretchoid.com
-192.241.222.26 # stretchoid.com
-192.241.222.28 # stretchoid.com
-192.241.222.31 # stretchoid.com
-192.241.222.34 # stretchoid.com
-192.241.222.36 # stretchoid.com
-192.241.222.40 # stretchoid.com
-192.241.222.57 # stretchoid.com
-192.241.222.59 # stretchoid.com
-192.241.222.61 # stretchoid.com
-192.241.222.66 # stretchoid.com
-192.241.222.67 # stretchoid.com
-192.241.222.7 # stretchoid.com
-192.241.222.70 # stretchoid.com
-192.241.222.73 # stretchoid.com
-192.241.222.76 # stretchoid.com
-192.241.222.77 # stretchoid.com
-192.241.222.91 # stretchoid.com
-192.241.222.92 # stretchoid.com
-192.241.222.93 # stretchoid.com
-192.241.222.97 # stretchoid.com
-192.241.222.99 # stretchoid.com
-192.241.223.11 # stretchoid.com
-192.241.223.12 # stretchoid.com
-192.241.223.13 # stretchoid.com
-192.241.223.14 # stretchoid.com
-192.241.223.18 # stretchoid.com
-192.241.223.20 # stretchoid.com
-192.241.223.21 # stretchoid.com
-192.241.223.25 # stretchoid.com
-192.241.223.27 # stretchoid.com
-192.241.223.28 # stretchoid.com
-192.241.223.29 # stretchoid.com
-192.241.223.31 # stretchoid.com
-192.241.223.32 # stretchoid.com
-192.241.223.35 # stretchoid.com
-192.241.223.39 # stretchoid.com
-192.241.223.4 # stretchoid.com
-192.241.223.43 # stretchoid.com
-192.241.223.55 # stretchoid.com
-192.241.223.57 # stretchoid.com
-192.241.223.60 # stretchoid.com
-192.241.223.62 # stretchoid.com
-192.241.223.63 # stretchoid.com
-192.241.223.66 # stretchoid.com
-192.241.223.7 # stretchoid.com
-192.241.223.79 # stretchoid.com
-192.241.223.80 # stretchoid.com
-192.241.223.81 # stretchoid.com
-192.241.223.85 # stretchoid.com
-192.241.223.89 # stretchoid.com
-192.241.223.9 # stretchoid.com
-192.241.224.10 # stretchoid.com
-192.241.224.12 # stretchoid.com
-192.241.224.13 # stretchoid.com
-192.241.224.14 # stretchoid.com
-192.241.224.15 # stretchoid.com
-192.241.224.16 # stretchoid.com
-192.241.224.18 # stretchoid.com
-192.241.224.19 # stretchoid.com
-192.241.224.20 # stretchoid.com
-192.241.224.22 # stretchoid.com
-192.241.224.23 # stretchoid.com
-192.241.224.25 # stretchoid.com
-192.241.224.28 # stretchoid.com
-192.241.224.37 # stretchoid.com
-192.241.224.38 # stretchoid.com
-192.241.224.39 # stretchoid.com
-192.241.224.42 # stretchoid.com
-192.241.224.44 # stretchoid.com
-192.241.224.50 # stretchoid.com
-192.241.224.9 # stretchoid.com
-192.241.225.11 # stretchoid.com
-192.241.225.12 # stretchoid.com
-192.241.225.14 # stretchoid.com
-192.241.225.15 # stretchoid.com
-192.241.225.16 # stretchoid.com
-192.241.225.17 # stretchoid.com
-192.241.225.18 # stretchoid.com
-192.241.225.20 # stretchoid.com
-192.241.225.21 # stretchoid.com
-192.241.225.22 # stretchoid.com
-192.241.225.23 # stretchoid.com
-192.241.225.24 # stretchoid.com
-192.241.225.25 # stretchoid.com
-192.241.225.26 # stretchoid.com
-192.241.225.27 # stretchoid.com
-192.241.225.31 # stretchoid.com
-192.241.225.32 # stretchoid.com
-192.241.225.56 # stretchoid.com
-192.241.225.57 # stretchoid.com
-192.241.225.6 # stretchoid.com
-192.241.225.66 # stretchoid.com
-192.241.225.67 # stretchoid.com
-192.241.225.71 # stretchoid.com
-192.241.225.72 # stretchoid.com
-192.241.225.73 # stretchoid.com
-192.241.225.74 # stretchoid.com
-192.241.225.75 # stretchoid.com
-192.241.225.76 # stretchoid.com
-192.241.225.78 # stretchoid.com
-192.241.225.82 # stretchoid.com
-192.241.225.83 # stretchoid.com
-192.241.225.84 # stretchoid.com
-192.241.225.85 # stretchoid.com
-192.241.226.14 # stretchoid.com
-192.241.226.16 # stretchoid.com
-192.241.226.19 # stretchoid.com
-192.241.226.20 # stretchoid.com
-192.241.226.22 # stretchoid.com
-192.241.226.24 # stretchoid.com
-192.241.226.25 # stretchoid.com
-192.241.226.26 # stretchoid.com
-192.241.226.27 # stretchoid.com
-192.241.226.28 # stretchoid.com
-192.241.226.30 # stretchoid.com
-192.241.226.31 # stretchoid.com
-192.241.226.33 # stretchoid.com
-192.241.226.34 # stretchoid.com
-192.241.226.35 # stretchoid.com
-192.241.226.36 # stretchoid.com
-192.241.226.40 # stretchoid.com
-192.241.226.41 # stretchoid.com
-192.241.226.43 # stretchoid.com
-192.241.226.46 # stretchoid.com
-192.241.226.52 # stretchoid.com
-192.241.226.53 # stretchoid.com
-192.241.226.54 # stretchoid.com
-192.241.226.55 # stretchoid.com
-192.241.226.56 # stretchoid.com
-192.241.226.6 # stretchoid.com
-192.241.227.11 # stretchoid.com
-192.241.227.12 # stretchoid.com
-192.241.227.15 # stretchoid.com
-192.241.227.16 # stretchoid.com
-192.241.227.26 # stretchoid.com
-192.241.227.27 # stretchoid.com
-192.241.227.28 # stretchoid.com
-192.241.227.29 # stretchoid.com
-192.241.227.30 # stretchoid.com
-192.241.227.31 # stretchoid.com
-192.241.227.37 # stretchoid.com
-192.241.227.47 # stretchoid.com
-192.241.227.49 # stretchoid.com
-192.241.227.54 # stretchoid.com
-192.241.227.55 # stretchoid.com
-192.241.227.57 # stretchoid.com
-192.241.227.61 # stretchoid.com
-192.241.227.62 # stretchoid.com
-192.241.227.63 # stretchoid.com
-192.241.227.9 # stretchoid.com
-192.241.228.14 # stretchoid.com
-192.241.228.17 # stretchoid.com
-192.241.228.21 # stretchoid.com
-192.241.228.22 # stretchoid.com
-192.241.228.23 # stretchoid.com
-192.241.228.37 # stretchoid.com
-192.241.228.39 # stretchoid.com
-192.241.228.40 # stretchoid.com
-192.241.228.8 # stretchoid.com
-192.241.228.9 # stretchoid.com
-192.241.229.16 # stretchoid.com
-192.241.229.18 # stretchoid.com
-192.241.229.19 # stretchoid.com
-192.241.229.22 # stretchoid.com
-192.241.229.23 # stretchoid.com
-192.241.229.24 # stretchoid.com
-192.241.229.240 # stretchoid.com
-192.241.229.25 # stretchoid.com
-192.241.229.32 # stretchoid.com
-192.241.229.34 # stretchoid.com
-192.241.229.40 # stretchoid.com
-192.241.229.42 # stretchoid.com
-192.241.229.44 # stretchoid.com
-192.241.229.45 # stretchoid.com
-192.241.229.51 # stretchoid.com
-192.241.229.52 # stretchoid.com
-192.241.229.53 # stretchoid.com
-192.241.229.6 # stretchoid.com
-192.241.230.12 # stretchoid.com
-192.241.230.17 # stretchoid.com
-192.241.230.18 # stretchoid.com
-192.241.230.19 # stretchoid.com
-192.241.230.20 # stretchoid.com
-192.241.230.21 # stretchoid.com
-192.241.230.22 # stretchoid.com
-192.241.230.29 # stretchoid.com
-192.241.230.31 # stretchoid.com
-192.241.230.40 # stretchoid.com
-192.241.230.41 # stretchoid.com
-192.241.230.44 # stretchoid.com
-192.241.230.45 # stretchoid.com
-192.241.230.46 # stretchoid.com
-192.241.230.47 # stretchoid.com
-192.241.230.49 # stretchoid.com
-192.241.230.5 # stretchoid.com
-192.241.230.50 # stretchoid.com
-192.241.230.51 # stretchoid.com
-192.241.230.52 # stretchoid.com
-192.241.230.53 # stretchoid.com
-192.241.230.54 # stretchoid.com
-192.241.230.57 # stretchoid.com
-192.241.230.62 # stretchoid.com
-192.241.230.63 # stretchoid.com
-192.241.230.64 # stretchoid.com
-192.241.230.65 # stretchoid.com
-192.241.230.7 # stretchoid.com
-192.241.230.9 # stretchoid.com
-192.241.231.10 # stretchoid.com
-192.241.231.12 # stretchoid.com
-192.241.231.14 # stretchoid.com
-192.241.231.15 # stretchoid.com
-192.241.231.20 # stretchoid.com
-192.241.231.27 # stretchoid.com
-192.241.231.28 # stretchoid.com
-192.241.231.32 # stretchoid.com
-192.241.231.4 # stretchoid.com
-192.241.231.41 # stretchoid.com
-192.241.231.42 # stretchoid.com
-192.241.231.44 # stretchoid.com
-192.241.231.46 # stretchoid.com
-192.241.231.47 # stretchoid.com
-192.241.231.48 # stretchoid.com
-192.241.231.49 # stretchoid.com
-192.241.231.50 # stretchoid.com
-192.241.231.51 # stretchoid.com
-192.241.231.52 # stretchoid.com
-192.241.231.7 # stretchoid.com
-192.241.231.9 # stretchoid.com
-192.241.232.10 # stretchoid.com
-192.241.232.11 # stretchoid.com
-192.241.232.12 # stretchoid.com
-192.241.232.13 # stretchoid.com
-192.241.232.14 # stretchoid.com
-192.241.232.15 # stretchoid.com
-192.241.232.20 # stretchoid.com
-192.241.232.21 # stretchoid.com
-192.241.232.25 # stretchoid.com
-192.241.232.26 # stretchoid.com
-192.241.232.27 # stretchoid.com
-192.241.232.28 # stretchoid.com
-192.241.232.29 # stretchoid.com
-192.241.232.30 # stretchoid.com
-192.241.232.31 # stretchoid.com
-192.241.232.33 # stretchoid.com
-192.241.232.36 # stretchoid.com
-192.241.232.38 # stretchoid.com
-192.241.232.40 # stretchoid.com
-192.241.232.45 # stretchoid.com
-192.241.232.48 # stretchoid.com
-192.241.232.54 # stretchoid.com
-192.241.232.55 # stretchoid.com
-192.241.232.8 # stretchoid.com
-192.241.233.11 # stretchoid.com
-192.241.233.12 # stretchoid.com
-192.241.233.14 # stretchoid.com
-192.241.233.21 # stretchoid.com
-192.241.233.29 # stretchoid.com
-192.241.233.31 # stretchoid.com
-192.241.233.35 # stretchoid.com
-192.241.233.36 # stretchoid.com
-192.241.233.37 # stretchoid.com
-192.241.233.38 # stretchoid.com
-192.241.233.4 # stretchoid.com
-192.241.233.40 # stretchoid.com
-192.241.233.41 # stretchoid.com
-192.241.233.46 # stretchoid.com
-192.241.233.50 # stretchoid.com
-192.241.233.53 # stretchoid.com
-192.241.233.6 # stretchoid.com
-192.241.233.7 # stretchoid.com
-192.241.234.10 # stretchoid.com
-192.241.234.11 # stretchoid.com
-192.241.234.19 # stretchoid.com
-192.241.234.43 # stretchoid.com
-192.241.234.45 # stretchoid.com
-192.241.234.47 # stretchoid.com
-192.241.234.9 # stretchoid.com
-192.241.235.11 # stretchoid.com
-192.241.235.13 # stretchoid.com
-192.241.235.15 # stretchoid.com
-192.241.235.17 # stretchoid.com
-192.241.235.19 # stretchoid.com
-192.241.235.20 # stretchoid.com
-192.241.235.21 # stretchoid.com
-192.241.235.22 # stretchoid.com
-192.241.235.23 # stretchoid.com
-192.241.235.25 # stretchoid.com
-192.241.235.26 # stretchoid.com
-192.241.235.27 # stretchoid.com
-192.241.235.28 # stretchoid.com
-192.241.235.30 # stretchoid.com
-192.241.235.31 # stretchoid.com
-192.241.235.32 # stretchoid.com
-192.241.235.33 # stretchoid.com
-192.241.235.34 # stretchoid.com
-192.241.235.35 # stretchoid.com
-192.241.235.36 # stretchoid.com
-192.241.235.38 # stretchoid.com
-192.241.235.39 # stretchoid.com
-192.241.235.9 # stretchoid.com
-192.241.236.10 # stretchoid.com
-192.241.236.11 # stretchoid.com
-192.241.236.14 # stretchoid.com
-192.241.236.20 # stretchoid.com
-192.241.236.23 # stretchoid.com
-192.241.236.28 # stretchoid.com
-192.241.236.31 # stretchoid.com
-192.241.236.32 # stretchoid.com
-192.241.236.33 # stretchoid.com
-192.241.236.34 # stretchoid.com
-192.241.236.35 # stretchoid.com
-192.241.236.37 # stretchoid.com
-192.241.236.38 # stretchoid.com
-192.241.236.39 # stretchoid.com
-192.241.236.40 # stretchoid.com
-192.241.236.42 # stretchoid.com
-192.241.236.44 # stretchoid.com
-192.241.236.48 # stretchoid.com
-192.241.236.50 # stretchoid.com
-192.241.236.51 # stretchoid.com
-192.241.236.53 # stretchoid.com
-192.241.236.59 # stretchoid.com
-192.241.236.6 # stretchoid.com
-192.241.236.69 # stretchoid.com
-192.241.236.70 # stretchoid.com
-192.241.236.71 # stretchoid.com
-192.241.236.73 # stretchoid.com
-192.241.236.81 # stretchoid.com
-192.241.236.82 # stretchoid.com
-192.241.236.85 # stretchoid.com
-192.241.236.86 # stretchoid.com
-192.241.236.87 # stretchoid.com
-192.241.237.15 # stretchoid.com
-192.241.237.16 # stretchoid.com
-192.241.237.17 # stretchoid.com
-192.241.237.19 # stretchoid.com
-192.241.237.21 # stretchoid.com
-192.241.237.22 # stretchoid.com
-192.241.237.23 # stretchoid.com
-192.241.237.25 # stretchoid.com
-192.241.237.33 # stretchoid.com
-192.241.237.34 # stretchoid.com
-192.241.237.35 # stretchoid.com
-192.241.237.38 # stretchoid.com
-192.241.237.40 # stretchoid.com
-192.241.237.41 # stretchoid.com
-192.241.237.44 # stretchoid.com
-192.241.237.45 # stretchoid.com
-192.241.237.49 # stretchoid.com
-192.241.237.50 # stretchoid.com
-192.241.237.51 # stretchoid.com
-192.241.237.52 # stretchoid.com
-192.241.238.10 # stretchoid.com
-192.241.238.11 # stretchoid.com
-192.241.238.12 # stretchoid.com
-192.241.238.14 # stretchoid.com
-192.241.238.16 # stretchoid.com
-192.241.238.17 # stretchoid.com
-192.241.238.24 # stretchoid.com
-192.241.238.27 # stretchoid.com
-192.241.238.28 # stretchoid.com
-192.241.238.32 # stretchoid.com
-192.241.238.34 # stretchoid.com
-192.241.238.36 # stretchoid.com
-192.241.238.37 # stretchoid.com
-192.241.238.38 # stretchoid.com
-192.241.238.39 # stretchoid.com
-192.241.238.4 # stretchoid.com
-192.241.238.40 # stretchoid.com
-192.241.238.43 # stretchoid.com
-192.241.238.45 # stretchoid.com
-192.241.238.7 # stretchoid.com
-192.241.239.10 # stretchoid.com
-192.241.239.13 # stretchoid.com
-192.241.239.16 # stretchoid.com
-192.241.239.18 # stretchoid.com
-192.241.239.19 # stretchoid.com
-192.241.239.21 # stretchoid.com
-192.241.239.27 # stretchoid.com
-192.241.239.28 # stretchoid.com
-192.241.239.30 # stretchoid.com
-192.241.239.32 # stretchoid.com
-192.241.239.36 # stretchoid.com
-192.241.239.4 # stretchoid.com
-192.241.239.40 # stretchoid.com
-192.241.239.41 # stretchoid.com
-192.241.239.42 # stretchoid.com
-192.241.239.43 # stretchoid.com
-198.199.100.106 # stretchoid.com
-198.199.100.109 # stretchoid.com
-198.199.100.113 # stretchoid.com
-198.199.100.116 # stretchoid.com
-198.199.100.123 # stretchoid.com
-198.199.100.124 # stretchoid.com
-198.199.100.125 # stretchoid.com
-198.199.100.126 # stretchoid.com
-198.199.100.133 # stretchoid.com
-198.199.100.137 # stretchoid.com
-198.199.100.17 # stretchoid.com
-198.199.100.40 # stretchoid.com
-198.199.100.47 # stretchoid.com
-198.199.100.51 # stretchoid.com
-198.199.100.55 # stretchoid.com
-198.199.100.61 # stretchoid.com
-198.199.100.67 # stretchoid.com
-198.199.100.69 # stretchoid.com
-198.199.100.7 # stretchoid.com
-198.199.100.87 # stretchoid.com
-198.199.101.103 # stretchoid.com
-198.199.101.105 # stretchoid.com
-198.199.101.107 # stretchoid.com
-198.199.101.111 # stretchoid.com
-198.199.101.114 # stretchoid.com
-198.199.101.115 # stretchoid.com
-198.199.101.116 # stretchoid.com
-198.199.101.120 # stretchoid.com
-198.199.101.125 # stretchoid.com
-198.199.101.149 # stretchoid.com
-198.199.101.158 # stretchoid.com
-198.199.101.162 # stretchoid.com
-198.199.101.17 # stretchoid.com
-198.199.101.175 # stretchoid.com
-198.199.101.181 # stretchoid.com
-198.199.101.20 # stretchoid.com
-198.199.101.22 # stretchoid.com
-198.199.101.225 # stretchoid.com
-198.199.101.226 # stretchoid.com
-198.199.101.23 # stretchoid.com
-198.199.101.62 # stretchoid.com
-198.199.101.64 # stretchoid.com
-198.199.101.67 # stretchoid.com
-198.199.101.68 # stretchoid.com
-198.199.101.70 # stretchoid.com
-198.199.101.72 # stretchoid.com
-198.199.101.88 # stretchoid.com
-198.199.101.89 # stretchoid.com
-198.199.101.96 # stretchoid.com
-198.199.102.108 # stretchoid.com
-198.199.102.221 # stretchoid.com
-198.199.102.227 # stretchoid.com
-198.199.102.251 # stretchoid.com
-198.199.102.29 # stretchoid.com
-198.199.102.31 # stretchoid.com
-198.199.102.36 # stretchoid.com
-198.199.102.40 # stretchoid.com
-198.199.102.48 # stretchoid.com
-198.199.102.49 # stretchoid.com
-198.199.102.57 # stretchoid.com
-198.199.102.65 # stretchoid.com
-198.199.102.67 # stretchoid.com
-198.199.102.69 # stretchoid.com
-198.199.102.7 # stretchoid.com
-198.199.102.74 # stretchoid.com
-198.199.102.76 # stretchoid.com
-198.199.102.77 # stretchoid.com
-198.199.102.83 # stretchoid.com
-198.199.102.86 # stretchoid.com
-198.199.102.99 # stretchoid.com
-198.199.103.10 # stretchoid.com
-198.199.103.107 # stretchoid.com
-198.199.103.11 # stretchoid.com
-198.199.103.135 # stretchoid.com
-198.199.103.138 # stretchoid.com
-198.199.103.221 # stretchoid.com
-198.199.103.238 # stretchoid.com
-198.199.103.44 # stretchoid.com
-198.199.103.47 # stretchoid.com
-198.199.103.48 # stretchoid.com
-198.199.103.54 # stretchoid.com
-198.199.103.72 # stretchoid.com
-198.199.103.75 # stretchoid.com
-198.199.103.76 # stretchoid.com
-198.199.103.89 # stretchoid.com
-198.199.103.95 # stretchoid.com
-198.199.104.100 # stretchoid.com
-198.199.104.12 # stretchoid.com
-198.199.104.123 # stretchoid.com
-198.199.104.124 # stretchoid.com
-198.199.104.127 # stretchoid.com
-198.199.104.129 # stretchoid.com
-198.199.104.136 # stretchoid.com
-198.199.104.14 # stretchoid.com
-198.199.104.15 # stretchoid.com
-198.199.104.156 # stretchoid.com
-198.199.104.17 # stretchoid.com
-198.199.104.19 # stretchoid.com
-198.199.104.226 # stretchoid.com
-198.199.104.26 # stretchoid.com
-198.199.104.38 # stretchoid.com
-198.199.104.39 # stretchoid.com
-198.199.104.48 # stretchoid.com
-198.199.104.58 # stretchoid.com
-198.199.104.59 # stretchoid.com
-198.199.104.60 # stretchoid.com
-198.199.104.67 # stretchoid.com
-198.199.104.72 # stretchoid.com
-198.199.104.76 # stretchoid.com
-198.199.104.8 # stretchoid.com
-198.199.104.80 # stretchoid.com
-198.199.104.82 # stretchoid.com
-198.199.104.83 # stretchoid.com
-198.199.104.85 # stretchoid.com
-198.199.104.98 # stretchoid.com
-198.199.105.106 # stretchoid.com
-198.199.105.123 # stretchoid.com
-198.199.105.127 # stretchoid.com
-198.199.105.162 # stretchoid.com
-198.199.105.190 # stretchoid.com
-198.199.105.223 # stretchoid.com
-198.199.105.226 # stretchoid.com
-198.199.105.236 # stretchoid.com
-198.199.105.28 # stretchoid.com
-198.199.105.41 # stretchoid.com
-198.199.105.42 # stretchoid.com
-198.199.105.49 # stretchoid.com
-198.199.105.56 # stretchoid.com
-198.199.105.59 # stretchoid.com
-198.199.105.62 # stretchoid.com
-198.199.105.69 # stretchoid.com
-198.199.105.70 # stretchoid.com
-198.199.105.77 # stretchoid.com
-198.199.105.82 # stretchoid.com
-198.199.105.84 # stretchoid.com
-198.199.105.85 # stretchoid.com
-198.199.105.90 # stretchoid.com
-198.199.105.95 # stretchoid.com
-198.199.106.102 # stretchoid.com
-198.199.106.111 # stretchoid.com
-198.199.106.113 # stretchoid.com
-198.199.106.114 # stretchoid.com
-198.199.106.120 # stretchoid.com
-198.199.106.124 # stretchoid.com
-198.199.106.131 # stretchoid.com
-198.199.106.133 # stretchoid.com
-198.199.106.134 # stretchoid.com
-198.199.106.135 # stretchoid.com
-198.199.106.142 # stretchoid.com
-198.199.106.147 # stretchoid.com
-198.199.106.161 # stretchoid.com
-198.199.106.175 # stretchoid.com
-198.199.106.198 # stretchoid.com
-198.199.106.229 # stretchoid.com
-198.199.106.234 # stretchoid.com
-198.199.106.235 # stretchoid.com
-198.199.106.243 # stretchoid.com
-198.199.106.35 # stretchoid.com
-198.199.106.41 # stretchoid.com
-198.199.106.44 # stretchoid.com
-198.199.106.62 # stretchoid.com
-198.199.106.73 # stretchoid.com
-198.199.106.76 # stretchoid.com
-198.199.106.81 # stretchoid.com
-198.199.106.85 # stretchoid.com
-198.199.106.89 # stretchoid.com
-198.199.106.91 # stretchoid.com
-198.199.106.97 # stretchoid.com
-198.199.107.100 # stretchoid.com
-198.199.107.104 # stretchoid.com
-198.199.107.105 # stretchoid.com
-198.199.107.109 # stretchoid.com
-198.199.107.110 # stretchoid.com
-198.199.107.114 # stretchoid.com
-198.199.107.115 # stretchoid.com
-198.199.107.119 # stretchoid.com
-198.199.107.134 # stretchoid.com
-198.199.107.144 # stretchoid.com
-198.199.107.147 # stretchoid.com
-198.199.107.154 # stretchoid.com
-198.199.107.16 # stretchoid.com
-198.199.107.184 # stretchoid.com
-198.199.107.20 # stretchoid.com
-198.199.107.26 # stretchoid.com
-198.199.107.35 # stretchoid.com
-198.199.107.71 # stretchoid.com
-198.199.107.79 # stretchoid.com
-198.199.107.81 # stretchoid.com
-198.199.107.82 # stretchoid.com
-198.199.107.93 # stretchoid.com
-198.199.108.100 # stretchoid.com
-198.199.108.106 # stretchoid.com
-198.199.108.13 # stretchoid.com
-198.199.108.16 # stretchoid.com
-198.199.108.17 # stretchoid.com
-198.199.108.20 # stretchoid.com
-198.199.108.216 # stretchoid.com
-198.199.108.217 # stretchoid.com
-198.199.108.238 # stretchoid.com
-198.199.108.29 # stretchoid.com
-198.199.108.32 # stretchoid.com
-198.199.108.33 # stretchoid.com
-198.199.108.39 # stretchoid.com
-198.199.108.4 # stretchoid.com
-198.199.108.45 # stretchoid.com
-198.199.108.59 # stretchoid.com
-198.199.108.62 # stretchoid.com
-198.199.108.7 # stretchoid.com
-198.199.108.70 # stretchoid.com
-198.199.108.71 # stretchoid.com
-198.199.108.74 # stretchoid.com
-198.199.108.76 # stretchoid.com
-198.199.108.85 # stretchoid.com
-198.199.108.86 # stretchoid.com
-198.199.108.87 # stretchoid.com
-198.199.109.108 # stretchoid.com
-198.199.109.12 # stretchoid.com
-198.199.109.126 # stretchoid.com
-198.199.109.127 # stretchoid.com
-198.199.109.203 # stretchoid.com
-198.199.109.221 # stretchoid.com
-198.199.109.234 # stretchoid.com
-198.199.109.30 # stretchoid.com
-198.199.109.38 # stretchoid.com
-198.199.109.39 # stretchoid.com
-198.199.109.43 # stretchoid.com
-198.199.109.53 # stretchoid.com
-198.199.109.6 # stretchoid.com
-198.199.109.60 # stretchoid.com
-198.199.109.64 # stretchoid.com
-198.199.109.66 # stretchoid.com
-198.199.109.7 # stretchoid.com
-198.199.109.71 # stretchoid.com
-198.199.109.73 # stretchoid.com
-198.199.109.92 # stretchoid.com
-198.199.109.96 # stretchoid.com
-198.199.110.11 # stretchoid.com
-198.199.110.12 # stretchoid.com
-198.199.110.18 # stretchoid.com
-198.199.110.34 # stretchoid.com
-198.199.110.37 # stretchoid.com
-198.199.110.40 # stretchoid.com
-198.199.110.44 # stretchoid.com
-198.199.110.59 # stretchoid.com
-198.199.110.60 # stretchoid.com
-198.199.110.61 # stretchoid.com
-198.199.110.67 # stretchoid.com
-198.199.110.69 # stretchoid.com
-198.199.110.7 # stretchoid.com
-198.199.110.72 # stretchoid.com
-198.199.110.73 # stretchoid.com
-198.199.110.78 # stretchoid.com
-198.199.110.79 # stretchoid.com
-198.199.110.8 # stretchoid.com
-198.199.111.103 # stretchoid.com
-198.199.111.115 # stretchoid.com
-198.199.111.117 # stretchoid.com
-198.199.111.139 # stretchoid.com
-198.199.111.147 # stretchoid.com
-198.199.111.152 # stretchoid.com
-198.199.111.154 # stretchoid.com
-198.199.111.155 # stretchoid.com
-198.199.111.161 # stretchoid.com
-198.199.111.172 # stretchoid.com
-198.199.111.173 # stretchoid.com
-198.199.111.177 # stretchoid.com
-198.199.111.191 # stretchoid.com
-198.199.111.197 # stretchoid.com
-198.199.111.200 # stretchoid.com
-198.199.111.202 # stretchoid.com
-198.199.111.205 # stretchoid.com
-198.199.111.207 # stretchoid.com
-198.199.111.215 # stretchoid.com
-198.199.111.219 # stretchoid.com
-198.199.111.221 # stretchoid.com
-198.199.111.32 # stretchoid.com
-198.199.111.41 # stretchoid.com
-198.199.111.50 # stretchoid.com
-198.199.111.51 # stretchoid.com
-198.199.111.57 # stretchoid.com
-198.199.111.60 # stretchoid.com
-198.199.111.75 # stretchoid.com
-198.199.111.87 # stretchoid.com
-198.199.111.96 # stretchoid.com
-198.199.112.107 # stretchoid.com
-198.199.112.109 # stretchoid.com
-198.199.112.141 # stretchoid.com
-198.199.112.155 # stretchoid.com
-198.199.112.16 # stretchoid.com
-198.199.112.161 # stretchoid.com
-198.199.112.185 # stretchoid.com
-198.199.112.21 # stretchoid.com
-198.199.112.23 # stretchoid.com
-198.199.112.230 # stretchoid.com
-198.199.112.31 # stretchoid.com
-198.199.112.39 # stretchoid.com
-198.199.112.4 # stretchoid.com
-198.199.112.41 # stretchoid.com
-198.199.112.51 # stretchoid.com
-198.199.112.57 # stretchoid.com
-198.199.112.63 # stretchoid.com
-198.199.112.7 # stretchoid.com
-198.199.112.71 # stretchoid.com
-198.199.112.79 # stretchoid.com
-198.199.112.81 # stretchoid.com
-198.199.112.83 # stretchoid.com
-198.199.112.86 # stretchoid.com
-198.199.112.92 # stretchoid.com
-198.199.112.95 # stretchoid.com
-198.199.113.105 # stretchoid.com
-198.199.113.106 # stretchoid.com
-198.199.113.107 # stretchoid.com
-198.199.113.157 # stretchoid.com
-198.199.113.179 # stretchoid.com
-198.199.113.192 # stretchoid.com
-198.199.113.196 # stretchoid.com
-198.199.113.22 # stretchoid.com
-198.199.113.38 # stretchoid.com
-198.199.113.4 # stretchoid.com
-198.199.113.44 # stretchoid.com
-198.199.113.46 # stretchoid.com
-198.199.113.49 # stretchoid.com
-198.199.113.56 # stretchoid.com
-198.199.113.61 # stretchoid.com
-198.199.113.7 # stretchoid.com
-198.199.113.86 # stretchoid.com
-198.199.113.92 # stretchoid.com
-198.199.113.94 # stretchoid.com
-198.199.113.95 # stretchoid.com
-198.199.113.98 # stretchoid.com
-198.199.113.99 # stretchoid.com
-198.199.114.125 # stretchoid.com
-198.199.114.128 # stretchoid.com
-198.199.114.189 # stretchoid.com
-198.199.114.202 # stretchoid.com
-198.199.114.218 # stretchoid.com
-198.199.114.240 # stretchoid.com
-198.199.114.28 # stretchoid.com
-198.199.114.38 # stretchoid.com
-198.199.114.43 # stretchoid.com
-198.199.114.47 # stretchoid.com
-198.199.114.49 # stretchoid.com
-198.199.114.5 # stretchoid.com
-198.199.114.53 # stretchoid.com
-198.199.114.60 # stretchoid.com
-198.199.114.61 # stretchoid.com
-198.199.114.62 # stretchoid.com
-198.199.114.65 # stretchoid.com
-198.199.114.69 # stretchoid.com
-198.199.114.75 # stretchoid.com
-198.199.114.78 # stretchoid.com
-198.199.114.8 # stretchoid.com
-198.199.114.80 # stretchoid.com
-198.199.114.84 # stretchoid.com
-198.199.114.88 # stretchoid.com
-198.199.114.90 # stretchoid.com
-198.199.114.97 # stretchoid.com
-198.199.115.10 # stretchoid.com
-198.199.115.100 # stretchoid.com
-198.199.115.104 # stretchoid.com
-198.199.115.107 # stretchoid.com
-198.199.115.11 # stretchoid.com
-198.199.115.112 # stretchoid.com
-198.199.115.116 # stretchoid.com
-198.199.115.118 # stretchoid.com
-198.199.115.119 # stretchoid.com
-198.199.115.122 # stretchoid.com
-198.199.115.123 # stretchoid.com
-198.199.115.139 # stretchoid.com
-198.199.115.20 # stretchoid.com
-198.199.115.21 # stretchoid.com
-198.199.115.27 # stretchoid.com
-198.199.115.29 # stretchoid.com
-198.199.115.30 # stretchoid.com
-198.199.115.31 # stretchoid.com
-198.199.115.37 # stretchoid.com
-198.199.115.5 # stretchoid.com
-198.199.115.54 # stretchoid.com
-198.199.115.67 # stretchoid.com
-198.199.115.80 # stretchoid.com
-198.199.115.90 # stretchoid.com
-198.199.115.94 # stretchoid.com
-198.199.116.105 # stretchoid.com
-198.199.116.107 # stretchoid.com
-198.199.116.108 # stretchoid.com
-198.199.116.114 # stretchoid.com
-198.199.116.116 # stretchoid.com
-198.199.116.120 # stretchoid.com
-198.199.116.127 # stretchoid.com
-198.199.116.132 # stretchoid.com
-198.199.116.154 # stretchoid.com
-198.199.116.27 # stretchoid.com
-198.199.116.29 # stretchoid.com
-198.199.116.39 # stretchoid.com
-198.199.116.41 # stretchoid.com
-198.199.116.46 # stretchoid.com
-198.199.116.48 # stretchoid.com
-198.199.116.49 # stretchoid.com
-198.199.116.5 # stretchoid.com
-198.199.116.50 # stretchoid.com
-198.199.116.56 # stretchoid.com
-198.199.116.62 # stretchoid.com
-198.199.116.78 # stretchoid.com
-198.199.116.82 # stretchoid.com
-198.199.116.84 # stretchoid.com
-198.199.116.88 # stretchoid.com
-198.199.116.94 # stretchoid.com
-198.199.117.10 # stretchoid.com
-198.199.117.110 # stretchoid.com
-198.199.117.121 # stretchoid.com
-198.199.117.124 # stretchoid.com
-198.199.117.125 # stretchoid.com
-198.199.117.128 # stretchoid.com
-198.199.117.129 # stretchoid.com
-198.199.117.130 # stretchoid.com
-198.199.117.134 # stretchoid.com
-198.199.117.135 # stretchoid.com
-198.199.117.136 # stretchoid.com
-198.199.117.14 # stretchoid.com
-198.199.117.141 # stretchoid.com
-198.199.117.146 # stretchoid.com
-198.199.117.15 # stretchoid.com
-198.199.117.152 # stretchoid.com
-198.199.117.157 # stretchoid.com
-198.199.117.200 # stretchoid.com
-198.199.117.207 # stretchoid.com
-198.199.117.213 # stretchoid.com
-198.199.117.5 # stretchoid.com
-198.199.117.57 # stretchoid.com
-198.199.117.70 # stretchoid.com
-198.199.117.72 # stretchoid.com
-198.199.117.77 # stretchoid.com
-198.199.117.80 # stretchoid.com
-198.199.117.83 # stretchoid.com
-198.199.117.9 # stretchoid.com
-198.199.117.94 # stretchoid.com
-198.199.117.98 # stretchoid.com
-198.199.117.99 # stretchoid.com
-198.199.118.103 # stretchoid.com
-198.199.118.105 # stretchoid.com
-198.199.118.109 # stretchoid.com
-198.199.118.114 # stretchoid.com
-198.199.118.120 # stretchoid.com
-198.199.118.121 # stretchoid.com
-198.199.118.122 # stretchoid.com
-198.199.118.125 # stretchoid.com
-198.199.118.127 # stretchoid.com
-198.199.118.130 # stretchoid.com
-198.199.118.141 # stretchoid.com
-198.199.118.150 # stretchoid.com
-198.199.118.16 # stretchoid.com
-198.199.118.19 # stretchoid.com
-198.199.118.35 # stretchoid.com
-198.199.118.41 # stretchoid.com
-198.199.118.57 # stretchoid.com
-198.199.118.62 # stretchoid.com
-198.199.118.63 # stretchoid.com
-198.199.118.69 # stretchoid.com
-198.199.118.74 # stretchoid.com
-198.199.118.79 # stretchoid.com
-198.199.118.8 # stretchoid.com
-198.199.118.82 # stretchoid.com
-198.199.118.84 # stretchoid.com
-198.199.118.85 # stretchoid.com
-198.199.118.88 # stretchoid.com
-198.199.118.93 # stretchoid.com
-198.199.118.94 # stretchoid.com
-198.199.118.95 # stretchoid.com
-198.199.118.97 # stretchoid.com
-198.199.118.99 # stretchoid.com
-198.199.119.101 # stretchoid.com
-198.199.119.104 # stretchoid.com
-198.199.119.107 # stretchoid.com
-198.199.119.112 # stretchoid.com
-198.199.119.123 # stretchoid.com
-198.199.119.127 # stretchoid.com
-198.199.119.15 # stretchoid.com
-198.199.119.25 # stretchoid.com
-198.199.119.30 # stretchoid.com
-198.199.119.35 # stretchoid.com
-198.199.119.36 # stretchoid.com
-198.199.119.46 # stretchoid.com
-198.199.119.58 # stretchoid.com
-198.199.119.61 # stretchoid.com
-198.199.119.63 # stretchoid.com
-198.199.119.64 # stretchoid.com
-198.199.119.66 # stretchoid.com
-198.199.119.67 # stretchoid.com
-198.199.119.73 # stretchoid.com
-198.199.119.8 # stretchoid.com
-198.199.119.82 # stretchoid.com
-198.199.119.88 # stretchoid.com
-198.199.119.89 # stretchoid.com
-198.199.119.91 # stretchoid.com
-198.199.92.105 # stretchoid.com
-198.199.92.115 # stretchoid.com
-198.199.92.116 # stretchoid.com
-198.199.92.121 # stretchoid.com
-198.199.92.122 # stretchoid.com
-198.199.92.126 # stretchoid.com
-198.199.92.132 # stretchoid.com
-198.199.92.133 # stretchoid.com
-198.199.92.134 # stretchoid.com
-198.199.92.135 # stretchoid.com
-198.199.92.151 # stretchoid.com
-198.199.92.167 # stretchoid.com
-198.199.92.186 # stretchoid.com
-198.199.92.19 # stretchoid.com
-198.199.92.229 # stretchoid.com
-198.199.92.23 # stretchoid.com
-198.199.92.39 # stretchoid.com
-198.199.92.45 # stretchoid.com
-198.199.92.46 # stretchoid.com
-198.199.92.47 # stretchoid.com
-198.199.92.51 # stretchoid.com
-198.199.92.56 # stretchoid.com
-198.199.92.60 # stretchoid.com
-198.199.92.66 # stretchoid.com
-198.199.92.67 # stretchoid.com
-198.199.92.73 # stretchoid.com
-198.199.92.98 # stretchoid.com
-198.199.92.99 # stretchoid.com
-198.199.93.15 # stretchoid.com
-198.199.93.20 # stretchoid.com
-198.199.93.22 # stretchoid.com
-198.199.93.27 # stretchoid.com
-198.199.93.35 # stretchoid.com
-198.199.93.38 # stretchoid.com
-198.199.93.43 # stretchoid.com
-198.199.93.45 # stretchoid.com
-198.199.93.53 # stretchoid.com
-198.199.93.54 # stretchoid.com
-198.199.93.63 # stretchoid.com
-198.199.93.66 # stretchoid.com
-198.199.93.68 # stretchoid.com
-198.199.93.71 # stretchoid.com
-198.199.93.78 # stretchoid.com
-198.199.93.81 # stretchoid.com
-198.199.93.88 # stretchoid.com
-198.199.93.93 # stretchoid.com
-198.199.94.11 # stretchoid.com
-198.199.94.14 # stretchoid.com
-198.199.94.19 # stretchoid.com
-198.199.94.23 # stretchoid.com
-198.199.94.30 # stretchoid.com
-198.199.94.31 # stretchoid.com
-198.199.94.32 # stretchoid.com
-198.199.94.33 # stretchoid.com
-198.199.94.34 # stretchoid.com
-198.199.94.35 # stretchoid.com
-198.199.94.44 # stretchoid.com
-198.199.94.45 # stretchoid.com
-198.199.94.50 # stretchoid.com
-198.199.94.56 # stretchoid.com
-198.199.94.57 # stretchoid.com
-198.199.94.6 # stretchoid.com
-198.199.94.60 # stretchoid.com
-198.199.94.69 # stretchoid.com
-198.199.94.8 # stretchoid.com
-198.199.95.104 # stretchoid.com
-198.199.95.111 # stretchoid.com
-198.199.95.12 # stretchoid.com
-198.199.95.15 # stretchoid.com
-198.199.95.17 # stretchoid.com
-198.199.95.27 # stretchoid.com
-198.199.95.29 # stretchoid.com
-198.199.95.33 # stretchoid.com
-198.199.95.64 # stretchoid.com
-198.199.95.66 # stretchoid.com
-198.199.95.67 # stretchoid.com
-198.199.95.70 # stretchoid.com
-198.199.95.72 # stretchoid.com
-198.199.95.81 # stretchoid.com
-198.199.95.88 # stretchoid.com
-198.199.95.90 # stretchoid.com
-198.199.95.91 # stretchoid.com
-198.199.96.132 # stretchoid.com
-198.199.96.173 # stretchoid.com
-198.199.96.19 # stretchoid.com
-198.199.96.203 # stretchoid.com
-198.199.96.206 # stretchoid.com
-198.199.96.21 # stretchoid.com
-198.199.96.210 # stretchoid.com
-198.199.96.23 # stretchoid.com
-198.199.96.32 # stretchoid.com
-198.199.96.42 # stretchoid.com
-198.199.96.58 # stretchoid.com
-198.199.96.65 # stretchoid.com
-198.199.96.71 # stretchoid.com
-198.199.96.8 # stretchoid.com
-198.199.96.81 # stretchoid.com
-198.199.96.86 # stretchoid.com
-198.199.96.92 # stretchoid.com
-198.199.96.98 # stretchoid.com
-198.199.97.100 # stretchoid.com
-198.199.97.121 # stretchoid.com
-198.199.97.136 # stretchoid.com
-198.199.97.181 # stretchoid.com
-198.199.97.19 # stretchoid.com
-198.199.97.203 # stretchoid.com
-198.199.97.219 # stretchoid.com
-198.199.97.22 # stretchoid.com
-198.199.97.24 # stretchoid.com
-198.199.97.240 # stretchoid.com
-198.199.97.30 # stretchoid.com
-198.199.97.37 # stretchoid.com
-198.199.97.39 # stretchoid.com
-198.199.97.44 # stretchoid.com
-198.199.97.5 # stretchoid.com
-198.199.97.57 # stretchoid.com
-198.199.97.58 # stretchoid.com
-198.199.97.59 # stretchoid.com
-198.199.97.61 # stretchoid.com
-198.199.97.62 # stretchoid.com
-198.199.97.71 # stretchoid.com
-198.199.97.81 # stretchoid.com
-198.199.97.87 # stretchoid.com
-198.199.98.114 # stretchoid.com
-198.199.98.118 # stretchoid.com
-198.199.98.133 # stretchoid.com
-198.199.98.136 # stretchoid.com
-198.199.98.14 # stretchoid.com
-198.199.98.149 # stretchoid.com
-198.199.98.20 # stretchoid.com
-198.199.98.21 # stretchoid.com
-198.199.98.216 # stretchoid.com
-198.199.98.227 # stretchoid.com
-198.199.98.228 # stretchoid.com
-198.199.98.252 # stretchoid.com
-198.199.98.30 # stretchoid.com
-198.199.98.36 # stretchoid.com
-198.199.98.37 # stretchoid.com
-198.199.98.40 # stretchoid.com
-198.199.98.48 # stretchoid.com
-198.199.98.60 # stretchoid.com
-198.199.98.77 # stretchoid.com
-198.199.98.79 # stretchoid.com
-198.199.98.85 # stretchoid.com
-45.55.0.10 # stretchoid.com
-45.55.0.11 # stretchoid.com
-45.55.0.12 # stretchoid.com
-45.55.0.13 # stretchoid.com
-45.55.0.14 # stretchoid.com
-45.55.0.15 # stretchoid.com
-45.55.0.16 # stretchoid.com
-45.55.0.17 # stretchoid.com
-45.55.0.19 # stretchoid.com
-45.55.0.20 # stretchoid.com
-45.55.0.21 # stretchoid.com
-45.55.0.31 # stretchoid.com
-45.55.0.32 # stretchoid.com
-45.55.0.36 # stretchoid.com
-45.55.0.38 # stretchoid.com
-45.55.0.39 # stretchoid.com
-45.55.0.40 # stretchoid.com
-45.55.0.41 # stretchoid.com
-45.55.0.42 # stretchoid.com
-45.55.0.43 # stretchoid.com
-45.55.0.5 # stretchoid.com
-45.55.0.6 # stretchoid.com
-45.55.0.8 # stretchoid.com
-45.55.0.9 # stretchoid.com
-
-# Reference: https://github.com/stamparm/maltrail/issues/19196
-# Reference: https://github.com/datacenters-network/security/blob/main/binaryedge.txt
-
-104.131.179.187 # binaryedge.ninja
-104.131.182.98 # binaryedge.ninja
-104.131.5.198 # binaryedge.ninja
-104.131.64.92 # binaryedge.ninja
-104.131.67.94 # binaryedge.ninja
-104.200.20.135 # binaryedge.ninja
-104.236.192.45 # binaryedge.ninja
-104.236.194.248 # binaryedge.ninja
-104.236.195.138 # binaryedge.ninja
-104.236.197.172 # binaryedge.ninja
-104.236.4.103 # binaryedge.ninja
-104.236.5.128 # binaryedge.ninja
-104.236.65.74 # binaryedge.ninja
-104.236.67.138 # binaryedge.ninja
-104.236.67.151 # binaryedge.ninja
-104.236.67.205 # binaryedge.ninja
-104.237.129.46 # binaryedge.ninja
-104.237.130.17 # binaryedge.ninja
-104.237.130.18 # binaryedge.ninja
-104.237.130.188 # binaryedge.ninja
-104.237.130.217 # binaryedge.ninja
-104.237.130.35 # binaryedge.ninja
-104.237.139.122 # binaryedge.ninja
-104.237.139.135 # binaryedge.ninja
-104.237.149.162 # binaryedge.ninja
-104.237.149.22 # binaryedge.ninja
-104.237.149.25 # binaryedge.ninja
-104.237.154.46 # binaryedge.ninja
-104.237.154.57 # binaryedge.ninja
-104.237.157.147 # binaryedge.ninja
-104.237.157.71 # binaryedge.ninja
-104.237.159.189 # binaryedge.ninja
-104.248.125.165 # binaryedge.ninja
-104.248.135.29 # binaryedge.ninja
-104.248.137.169 # binaryedge.ninja
-104.248.143.201 # binaryedge.ninja
-104.248.150.126 # binaryedge.ninja
-104.248.151.63 # binaryedge.ninja
-104.248.152.208 # binaryedge.ninja
-104.248.153.86 # binaryedge.ninja
-104.248.171.151 # binaryedge.ninja
-104.248.171.228 # binaryedge.ninja
-104.248.172.9 # binaryedge.ninja
-104.248.173.178 # binaryedge.ninja
-104.248.174.190 # binaryedge.ninja
-104.248.175.50 # binaryedge.ninja
-104.248.176.248 # binaryedge.ninja
-104.248.191.58 # binaryedge.ninja
-104.248.191.60 # binaryedge.ninja
-104.248.191.86 # binaryedge.ninja
-104.248.192.201 # binaryedge.ninja
-104.248.194.121 # binaryedge.ninja
-104.248.194.172 # binaryedge.ninja
-104.248.195.39 # binaryedge.ninja
-104.248.195.62 # binaryedge.ninja
-104.248.202.40 # binaryedge.ninja
-104.248.204.217 # binaryedge.ninja
-104.248.207.100 # binaryedge.ninja
-104.248.207.233 # binaryedge.ninja
-104.248.208.74 # binaryedge.ninja
-104.248.208.95 # binaryedge.ninja
-104.248.22.162 # binaryedge.ninja
-104.248.223.168 # binaryedge.ninja
-104.248.223.173 # binaryedge.ninja
-104.248.223.178 # binaryedge.ninja
-104.248.223.200 # binaryedge.ninja
-104.248.223.209 # binaryedge.ninja
-104.248.223.69 # binaryedge.ninja
-104.248.223.83 # binaryedge.ninja
-104.248.228.147 # binaryedge.ninja
-104.248.232.71 # binaryedge.ninja
-104.248.234.247 # binaryedge.ninja
-104.248.234.41 # binaryedge.ninja
-104.248.235.180 # binaryedge.ninja
-104.248.238.149 # binaryedge.ninja
-104.248.249.100 # binaryedge.ninja
-104.248.251.39 # binaryedge.ninja
-104.248.49.186 # binaryedge.ninja
-104.248.49.26 # binaryedge.ninja
-104.248.50.26 # binaryedge.ninja
-104.248.60.11 # binaryedge.ninja
-104.248.60.83 # binaryedge.ninja
-104.248.64.250 # binaryedge.ninja
-104.248.64.41 # binaryedge.ninja
-104.248.64.59 # binaryedge.ninja
-104.248.79.137 # binaryedge.ninja
-104.248.79.22 # binaryedge.ninja
-104.248.79.23 # binaryedge.ninja
-104.248.79.33 # binaryedge.ninja
-104.248.79.37 # binaryedge.ninja
-104.248.79.38 # binaryedge.ninja
-104.248.79.40 # binaryedge.ninja
-104.248.79.58 # binaryedge.ninja
-104.248.80.209 # binaryedge.ninja
-104.248.88.215 # binaryedge.ninja
-104.248.90.102 # binaryedge.ninja
-109.237.26.92 # binaryedge.ninja
-109.74.202.145 # binaryedge.ninja
-109.74.206.41 # binaryedge.ninja
-128.199.1.215 # binaryedge.ninja
-128.199.10.254 # binaryedge.ninja
-128.199.11.153 # binaryedge.ninja
-128.199.128.57 # binaryedge.ninja
-128.199.130.26 # binaryedge.ninja
-128.199.134.214 # binaryedge.ninja
-128.199.15.113 # binaryedge.ninja
-128.199.18.232 # binaryedge.ninja
-128.199.196.79 # binaryedge.ninja
-128.199.197.25 # binaryedge.ninja
-128.199.203.31 # binaryedge.ninja
-128.199.206.169 # binaryedge.ninja
-128.199.208.250 # binaryedge.ninja
-128.199.209.221 # binaryedge.ninja
-128.199.210.189 # binaryedge.ninja
-128.199.212.11 # binaryedge.ninja
-128.199.212.181 # binaryedge.ninja
-128.199.220.112 # binaryedge.ninja
-128.199.26.14 # binaryedge.ninja
-128.199.30.14 # binaryedge.ninja
-128.199.32.248 # binaryedge.ninja
-128.199.34.132 # binaryedge.ninja
-128.199.36.225 # binaryedge.ninja
-128.199.38.137 # binaryedge.ninja
-128.199.44.98 # binaryedge.ninja
-128.199.45.62 # binaryedge.ninja
-128.199.46.128 # binaryedge.ninja
-128.199.46.232 # binaryedge.ninja
-128.199.47.62 # binaryedge.ninja
-128.199.78.207 # binaryedge.ninja
-128.199.82.59 # binaryedge.ninja
-134.122.101.15 # binaryedge.ninja
-134.122.105.143 # binaryedge.ninja
-134.122.105.154 # binaryedge.ninja
-134.122.105.196 # binaryedge.ninja
-134.122.105.220 # binaryedge.ninja
-134.122.105.23 # binaryedge.ninja
-134.122.105.234 # binaryedge.ninja
-134.122.105.75 # binaryedge.ninja
-134.122.113.48 # binaryedge.ninja
-134.122.116.27 # binaryedge.ninja
-134.122.119.237 # binaryedge.ninja
-134.122.122.118 # binaryedge.ninja
-134.122.124.155 # binaryedge.ninja
-134.122.126.210 # binaryedge.ninja
-134.122.14.136 # binaryedge.ninja
-134.122.21.169 # binaryedge.ninja
-134.122.21.73 # binaryedge.ninja
-134.122.23.206 # binaryedge.ninja
-134.122.24.76 # binaryedge.ninja
-134.122.25.178 # binaryedge.ninja
-134.122.31.195 # binaryedge.ninja
-134.122.35.128 # binaryedge.ninja
-134.122.37.136 # binaryedge.ninja
-134.122.38.137 # binaryedge.ninja
-134.122.39.131 # binaryedge.ninja
-134.122.39.203 # binaryedge.ninja
-134.122.39.205 # binaryedge.ninja
-134.122.39.206 # binaryedge.ninja
-134.122.39.219 # binaryedge.ninja
-134.122.39.221 # binaryedge.ninja
-134.122.39.230 # binaryedge.ninja
-134.122.4.16 # binaryedge.ninja
-134.122.40.26 # binaryedge.ninja
-134.122.42.100 # binaryedge.ninja
-134.122.47.178 # binaryedge.ninja
-134.122.47.190 # binaryedge.ninja
-134.122.47.217 # binaryedge.ninja
-134.122.47.218 # binaryedge.ninja
-134.122.47.225 # binaryedge.ninja
-134.122.47.226 # binaryedge.ninja
-134.122.47.227 # binaryedge.ninja
-134.122.51.143 # binaryedge.ninja
-134.122.57.128 # binaryedge.ninja
-134.122.58.136 # binaryedge.ninja
-134.122.6.157 # binaryedge.ninja
-134.122.60.56 # binaryedge.ninja
-134.122.62.66 # binaryedge.ninja
-134.122.72.177 # binaryedge.ninja
-134.122.81.42 # binaryedge.ninja
-134.122.85.155 # binaryedge.ninja
-134.122.86.38 # binaryedge.ninja
-134.122.87.154 # binaryedge.ninja
-134.122.88.230 # binaryedge.ninja
-134.209.0.184 # binaryedge.ninja
-134.209.0.242 # binaryedge.ninja
-134.209.0.77 # binaryedge.ninja
-134.209.108.29 # binaryedge.ninja
-134.209.109.223 # binaryedge.ninja
-134.209.110.137 # binaryedge.ninja
-134.209.111.250 # binaryedge.ninja
-134.209.119.223 # binaryedge.ninja
-134.209.125.167 # binaryedge.ninja
-134.209.127.79 # binaryedge.ninja
-134.209.144.193 # binaryedge.ninja
-134.209.15.24 # binaryedge.ninja
-134.209.15.41 # binaryedge.ninja
-134.209.15.43 # binaryedge.ninja
-134.209.15.45 # binaryedge.ninja
-134.209.15.48 # binaryedge.ninja
-134.209.15.49 # binaryedge.ninja
-134.209.15.50 # binaryedge.ninja
-134.209.159.134 # binaryedge.ninja
-134.209.159.196 # binaryedge.ninja
-134.209.16.200 # binaryedge.ninja
-134.209.17.94 # binaryedge.ninja
-134.209.176.238 # binaryedge.ninja
-134.209.18.194 # binaryedge.ninja
-134.209.184.105 # binaryedge.ninja
-134.209.187.79 # binaryedge.ninja
-134.209.188.84 # binaryedge.ninja
-134.209.189.83 # binaryedge.ninja
-134.209.193.135 # binaryedge.ninja
-134.209.194.55 # binaryedge.ninja
-134.209.197.234 # binaryedge.ninja
-134.209.198.189 # binaryedge.ninja
-134.209.198.197 # binaryedge.ninja
-134.209.206.215 # binaryedge.ninja
-134.209.206.36 # binaryedge.ninja
-134.209.207.227 # binaryedge.ninja
-134.209.210.221 # binaryedge.ninja
-134.209.220.55 # binaryedge.ninja
-134.209.222.172 # binaryedge.ninja
-134.209.226.118 # binaryedge.ninja
-134.209.226.60 # binaryedge.ninja
-134.209.23.134 # binaryedge.ninja
-134.209.23.192 # binaryedge.ninja
-134.209.250.51 # binaryedge.ninja
-134.209.30.235 # binaryedge.ninja
-134.209.48.112 # binaryedge.ninja
-134.209.48.124 # binaryedge.ninja
-134.209.48.153 # binaryedge.ninja
-134.209.48.31 # binaryedge.ninja
-134.209.48.76 # binaryedge.ninja
-134.209.48.90 # binaryedge.ninja
-134.209.48.95 # binaryedge.ninja
-134.209.63.15 # binaryedge.ninja
-134.209.63.33 # binaryedge.ninja
-134.209.63.41 # binaryedge.ninja
-134.209.63.48 # binaryedge.ninja
-134.209.64.162 # binaryedge.ninja
-134.209.66.249 # binaryedge.ninja
-134.209.66.252 # binaryedge.ninja
-134.209.69.149 # binaryedge.ninja
-134.209.71.237 # binaryedge.ninja
-134.209.74.236 # binaryedge.ninja
-134.209.83.101 # binaryedge.ninja
-134.209.85.163 # binaryedge.ninja
-134.209.85.79 # binaryedge.ninja
-134.209.89.157 # binaryedge.ninja
-134.209.89.209 # binaryedge.ninja
-134.209.93.104 # binaryedge.ninja
-134.209.99.211 # binaryedge.ninja
-137.184.1.190 # binaryedge.ninja
-137.184.1.229 # binaryedge.ninja
-137.184.1.77 # binaryedge.ninja
-137.184.101.233 # binaryedge.ninja
-137.184.11.124 # binaryedge.ninja
-137.184.11.226 # binaryedge.ninja
-137.184.113.102 # binaryedge.ninja
-137.184.113.165 # binaryedge.ninja
-137.184.113.233 # binaryedge.ninja
-137.184.116.222 # binaryedge.ninja
-137.184.116.91 # binaryedge.ninja
-137.184.117.20 # binaryedge.ninja
-137.184.121.187 # binaryedge.ninja
-137.184.121.98 # binaryedge.ninja
-137.184.130.4 # binaryedge.ninja
-137.184.136.24 # binaryedge.ninja
-137.184.137.219 # binaryedge.ninja
-137.184.137.237 # binaryedge.ninja
-137.184.137.83 # binaryedge.ninja
-137.184.139.136 # binaryedge.ninja
-137.184.142.87 # binaryedge.ninja
-137.184.147.142 # binaryedge.ninja
-137.184.150.103 # binaryedge.ninja
-137.184.150.177 # binaryedge.ninja
-137.184.156.179 # binaryedge.ninja
-137.184.16.90 # binaryedge.ninja
-137.184.161.5 # binaryedge.ninja
-137.184.161.6 # binaryedge.ninja
-137.184.161.9 # binaryedge.ninja
-137.184.164.192 # binaryedge.ninja
-137.184.164.224 # binaryedge.ninja
-137.184.166.18 # binaryedge.ninja
-137.184.166.20 # binaryedge.ninja
-137.184.166.23 # binaryedge.ninja
-137.184.166.42 # binaryedge.ninja
-137.184.166.45 # binaryedge.ninja
-137.184.166.5 # binaryedge.ninja
-137.184.166.55 # binaryedge.ninja
-137.184.166.59 # binaryedge.ninja
-137.184.166.6 # binaryedge.ninja
-137.184.168.145 # binaryedge.ninja
-137.184.168.96 # binaryedge.ninja
-137.184.170.69 # binaryedge.ninja
-137.184.170.84 # binaryedge.ninja
-137.184.172.203 # binaryedge.ninja
-137.184.174.123 # binaryedge.ninja
-137.184.174.92 # binaryedge.ninja
-137.184.177.82 # binaryedge.ninja
-137.184.18.205 # binaryedge.ninja
-137.184.181.41 # binaryedge.ninja
-137.184.186.146 # binaryedge.ninja
-137.184.186.4 # binaryedge.ninja
-137.184.188.218 # binaryedge.ninja
-137.184.188.43 # binaryedge.ninja
-137.184.188.57 # binaryedge.ninja
-137.184.190.181 # binaryedge.ninja
-137.184.198.224 # binaryedge.ninja
-137.184.2.73 # binaryedge.ninja
-137.184.201.109 # binaryedge.ninja
-137.184.204.80 # binaryedge.ninja
-137.184.226.1 # binaryedge.ninja
-137.184.226.32 # binaryedge.ninja
-137.184.229.128 # binaryedge.ninja
-137.184.232.121 # binaryedge.ninja
-137.184.234.148 # binaryedge.ninja
-137.184.236.130 # binaryedge.ninja
-137.184.236.210 # binaryedge.ninja
-137.184.27.154 # binaryedge.ninja
-137.184.28.14 # binaryedge.ninja
-137.184.29.246 # binaryedge.ninja
-137.184.3.190 # binaryedge.ninja
-137.184.33.45 # binaryedge.ninja
-137.184.34.153 # binaryedge.ninja
-137.184.37.23 # binaryedge.ninja
-137.184.41.130 # binaryedge.ninja
-137.184.41.247 # binaryedge.ninja
-137.184.45.99 # binaryedge.ninja
-137.184.48.243 # binaryedge.ninja
-137.184.5.112 # binaryedge.ninja
-137.184.53.173 # binaryedge.ninja
-137.184.54.48 # binaryedge.ninja
-137.184.56.6 # binaryedge.ninja
-137.184.57.116 # binaryedge.ninja
-137.184.61.241 # binaryedge.ninja
-137.184.65.9 # binaryedge.ninja
-137.184.7.44 # binaryedge.ninja
-137.184.76.54 # binaryedge.ninja
-137.184.81.152 # binaryedge.ninja
-137.184.81.92 # binaryedge.ninja
-137.184.85.28 # binaryedge.ninja
-137.184.88.159 # binaryedge.ninja
-137.184.89.153 # binaryedge.ninja
-137.184.89.22 # binaryedge.ninja
-137.184.89.240 # binaryedge.ninja
-138.197.111.54 # binaryedge.ninja
-138.197.111.56 # binaryedge.ninja
-138.197.112.192 # binaryedge.ninja
-138.197.120.183 # binaryedge.ninja
-138.197.128.102 # binaryedge.ninja
-138.197.129.239 # binaryedge.ninja
-138.197.132.197 # binaryedge.ninja
-138.197.132.74 # binaryedge.ninja
-138.197.134.202 # binaryedge.ninja
-138.197.136.101 # binaryedge.ninja
-138.197.137.202 # binaryedge.ninja
-138.197.14.41 # binaryedge.ninja
-138.197.140.194 # binaryedge.ninja
-138.197.140.201 # binaryedge.ninja
-138.197.142.29 # binaryedge.ninja
-138.197.143.136 # binaryedge.ninja
-138.197.143.9 # binaryedge.ninja
-138.197.146.140 # binaryedge.ninja
-138.197.148.158 # binaryedge.ninja
-138.197.148.17 # binaryedge.ninja
-138.197.15.27 # binaryedge.ninja
-138.197.151.176 # binaryedge.ninja
-138.197.151.253 # binaryedge.ninja
-138.197.151.73 # binaryedge.ninja
-138.197.158.177 # binaryedge.ninja
-138.197.159.224 # binaryedge.ninja
-138.197.159.76 # binaryedge.ninja
-138.197.159.8 # binaryedge.ninja
-138.197.16.199 # binaryedge.ninja
-138.197.16.71 # binaryedge.ninja
-138.197.16.94 # binaryedge.ninja
-138.197.160.10 # binaryedge.ninja
-138.197.161.8 # binaryedge.ninja
-138.197.162.193 # binaryedge.ninja
-138.197.163.214 # binaryedge.ninja
-138.197.164.65 # binaryedge.ninja
-138.197.165.251 # binaryedge.ninja
-138.197.167.176 # binaryedge.ninja
-138.197.167.84 # binaryedge.ninja
-138.197.169.37 # binaryedge.ninja
-138.197.169.60 # binaryedge.ninja
-138.197.172.215 # binaryedge.ninja
-138.197.177.180 # binaryedge.ninja
-138.197.197.107 # binaryedge.ninja
-138.197.20.166 # binaryedge.ninja
-138.197.20.202 # binaryedge.ninja
-138.197.20.219 # binaryedge.ninja
-138.197.20.253 # binaryedge.ninja
-138.197.206.193 # binaryedge.ninja
-138.197.207.111 # binaryedge.ninja
-138.197.207.206 # binaryedge.ninja
-138.197.207.236 # binaryedge.ninja
-138.197.207.37 # binaryedge.ninja
-138.197.207.66 # binaryedge.ninja
-138.197.207.71 # binaryedge.ninja
-138.197.208.154 # binaryedge.ninja
-138.197.208.180 # binaryedge.ninja
-138.197.208.218 # binaryedge.ninja
-138.197.212.0 # binaryedge.ninja
-138.197.212.13 # binaryedge.ninja
-138.197.212.16 # binaryedge.ninja
-138.197.212.55 # binaryedge.ninja
-138.197.212.9 # binaryedge.ninja
-138.197.216.23 # binaryedge.ninja
-138.197.216.249 # binaryedge.ninja
-138.197.216.40 # binaryedge.ninja
-138.197.216.42 # binaryedge.ninja
-138.197.28.127 # binaryedge.ninja
-138.197.40.80 # binaryedge.ninja
-138.197.76.86 # binaryedge.ninja
-138.197.80.117 # binaryedge.ninja
-138.197.92.8 # binaryedge.ninja
-138.68.0.169 # binaryedge.ninja
-138.68.101.186 # binaryedge.ninja
-138.68.130.92 # binaryedge.ninja
-138.68.133.252 # binaryedge.ninja
-138.68.136.220 # binaryedge.ninja
-138.68.138.157 # binaryedge.ninja
-138.68.138.57 # binaryedge.ninja
-138.68.143.107 # binaryedge.ninja
-138.68.144.161 # binaryedge.ninja
-138.68.146.62 # binaryedge.ninja
-138.68.149.167 # binaryedge.ninja
-138.68.15.211 # binaryedge.ninja
-138.68.157.202 # binaryedge.ninja
-138.68.160.199 # binaryedge.ninja
-138.68.163.14 # binaryedge.ninja
-138.68.164.31 # binaryedge.ninja
-138.68.164.52 # binaryedge.ninja
-138.68.168.169 # binaryedge.ninja
-138.68.173.35 # binaryedge.ninja
-138.68.175.214 # binaryedge.ninja
-138.68.178.218 # binaryedge.ninja
-138.68.178.27 # binaryedge.ninja
-138.68.178.41 # binaryedge.ninja
-138.68.184.212 # binaryedge.ninja
-138.68.187.100 # binaryedge.ninja
-138.68.187.102 # binaryedge.ninja
-138.68.187.242 # binaryedge.ninja
-138.68.189.243 # binaryedge.ninja
-138.68.189.50 # binaryedge.ninja
-138.68.189.81 # binaryedge.ninja
-138.68.191.121 # binaryedge.ninja
-138.68.224.126 # binaryedge.ninja
-138.68.224.159 # binaryedge.ninja
-138.68.224.161 # binaryedge.ninja
-138.68.224.185 # binaryedge.ninja
-138.68.224.5 # binaryedge.ninja
-138.68.227.190 # binaryedge.ninja
-138.68.232.128 # binaryedge.ninja
-138.68.232.70 # binaryedge.ninja
-138.68.232.99 # binaryedge.ninja
-138.68.24.53 # binaryedge.ninja
-138.68.240.204 # binaryedge.ninja
-138.68.240.234 # binaryedge.ninja
-138.68.240.34 # binaryedge.ninja
-138.68.247.167 # binaryedge.ninja
-138.68.255.106 # binaryedge.ninja
-138.68.255.4 # binaryedge.ninja
-138.68.255.43 # binaryedge.ninja
-138.68.255.89 # binaryedge.ninja
-138.68.31.108 # binaryedge.ninja
-138.68.31.87 # binaryedge.ninja
-138.68.40.52 # binaryedge.ninja
-138.68.42.166 # binaryedge.ninja
-138.68.46.22 # binaryedge.ninja
-138.68.47.119 # binaryedge.ninja
-138.68.48.43 # binaryedge.ninja
-138.68.48.91 # binaryedge.ninja
-138.68.53.222 # binaryedge.ninja
-138.68.56.107 # binaryedge.ninja
-138.68.56.111 # binaryedge.ninja
-138.68.56.122 # binaryedge.ninja
-138.68.56.221 # binaryedge.ninja
-138.68.56.68 # binaryedge.ninja
-138.68.63.146 # binaryedge.ninja
-138.68.63.220 # binaryedge.ninja
-138.68.63.59 # binaryedge.ninja
-138.68.8.20 # binaryedge.ninja
-138.68.8.41 # binaryedge.ninja
-138.68.81.150 # binaryedge.ninja
-138.68.84.152 # binaryedge.ninja
-139.144.110.113 # binaryedge.ninja
-139.144.110.118 # binaryedge.ninja
-139.144.110.125 # binaryedge.ninja
-139.144.110.128 # binaryedge.ninja
-139.144.110.130 # binaryedge.ninja
-139.144.110.133 # binaryedge.ninja
-139.144.110.140 # binaryedge.ninja
-139.144.110.146 # binaryedge.ninja
-139.144.110.161 # binaryedge.ninja
-139.144.110.163 # binaryedge.ninja
-139.144.110.170 # binaryedge.ninja
-139.144.110.176 # binaryedge.ninja
-139.144.110.190 # binaryedge.ninja
-139.144.110.59 # binaryedge.ninja
-139.144.110.70 # binaryedge.ninja
-139.144.16.137 # binaryedge.ninja
-139.144.16.189 # binaryedge.ninja
-139.144.16.207 # binaryedge.ninja
-139.144.16.215 # binaryedge.ninja
-139.144.16.22 # binaryedge.ninja
-139.144.16.45 # binaryedge.ninja
-139.144.16.5 # binaryedge.ninja
-139.144.171.91 # binaryedge.ninja
-139.144.172.4 # binaryedge.ninja
-139.144.172.97 # binaryedge.ninja
-139.144.176.109 # binaryedge.ninja
-139.144.176.169 # binaryedge.ninja
-139.144.176.211 # binaryedge.ninja
-139.144.176.233 # binaryedge.ninja
-139.144.176.247 # binaryedge.ninja
-139.144.176.56 # binaryedge.ninja
-139.144.176.74 # binaryedge.ninja
-139.144.179.10 # binaryedge.ninja
-139.144.179.96 # binaryedge.ninja
-139.144.18.126 # binaryedge.ninja
-139.144.18.190 # binaryedge.ninja
-139.144.181.60 # binaryedge.ninja
-139.144.185.104 # binaryedge.ninja
-139.144.185.207 # binaryedge.ninja
-139.144.186.108 # binaryedge.ninja
-139.144.186.111 # binaryedge.ninja
-139.144.186.172 # binaryedge.ninja
-139.144.186.191 # binaryedge.ninja
-139.144.186.192 # binaryedge.ninja
-139.144.186.218 # binaryedge.ninja
-139.144.186.241 # binaryedge.ninja
-139.144.186.245 # binaryedge.ninja
-139.144.186.30 # binaryedge.ninja
-139.144.186.48 # binaryedge.ninja
-139.144.186.60 # binaryedge.ninja
-139.144.191.144 # binaryedge.ninja
-139.144.20.244 # binaryedge.ninja
-139.144.238.108 # binaryedge.ninja
-139.144.238.153 # binaryedge.ninja
-139.144.238.195 # binaryedge.ninja
-139.144.238.218 # binaryedge.ninja
-139.144.238.232 # binaryedge.ninja
-139.144.238.66 # binaryedge.ninja
-139.144.238.8 # binaryedge.ninja
-139.144.25.135 # binaryedge.ninja
-139.144.25.56 # binaryedge.ninja
-139.144.25.61 # binaryedge.ninja
-139.144.25.88 # binaryedge.ninja
-139.144.253.117 # binaryedge.ninja
-139.144.253.167 # binaryedge.ninja
-139.144.253.181 # binaryedge.ninja
-139.144.29.130 # binaryedge.ninja
-139.144.29.131 # binaryedge.ninja
-139.144.29.135 # binaryedge.ninja
-139.144.29.191 # binaryedge.ninja
-139.144.30.142 # binaryedge.ninja
-139.144.30.75 # binaryedge.ninja
-139.144.4.114 # binaryedge.ninja
-139.144.4.187 # binaryedge.ninja
-139.144.4.206 # binaryedge.ninja
-139.144.4.215 # binaryedge.ninja
-139.144.4.22 # binaryedge.ninja
-139.144.4.252 # binaryedge.ninja
-139.144.4.6 # binaryedge.ninja
-139.144.4.92 # binaryedge.ninja
-139.144.60.11 # binaryedge.ninja
-139.144.60.16 # binaryedge.ninja
-139.144.60.40 # binaryedge.ninja
-139.144.60.49 # binaryedge.ninja
-139.144.60.50 # binaryedge.ninja
-139.144.60.59 # binaryedge.ninja
-139.144.66.209 # binaryedge.ninja
-139.144.66.90 # binaryedge.ninja
-139.144.66.98 # binaryedge.ninja
-139.144.71.245 # binaryedge.ninja
-139.144.71.249 # binaryedge.ninja
-139.144.73.111 # binaryedge.ninja
-139.144.73.112 # binaryedge.ninja
-139.144.73.153 # binaryedge.ninja
-139.144.73.250 # binaryedge.ninja
-139.144.73.49 # binaryedge.ninja
-139.162.141.118 # binaryedge.ninja
-139.162.141.38 # binaryedge.ninja
-139.162.196.191 # binaryedge.ninja
-139.162.196.82 # binaryedge.ninja
-139.162.198.18 # binaryedge.ninja
-139.162.201.13 # binaryedge.ninja
-139.162.201.200 # binaryedge.ninja
-139.162.201.209 # binaryedge.ninja
-139.162.201.89 # binaryedge.ninja
-139.162.204.168 # binaryedge.ninja
-139.162.204.214 # binaryedge.ninja
-139.162.208.215 # binaryedge.ninja
-139.162.215.40 # binaryedge.ninja
-139.162.215.63 # binaryedge.ninja
-139.162.216.157 # binaryedge.ninja
-139.162.216.190 # binaryedge.ninja
-139.162.218.15 # binaryedge.ninja
-139.162.218.211 # binaryedge.ninja
-139.162.218.225 # binaryedge.ninja
-139.162.218.48 # binaryedge.ninja
-139.162.227.212 # binaryedge.ninja
-139.162.227.226 # binaryedge.ninja
-139.162.227.242 # binaryedge.ninja
-139.162.227.42 # binaryedge.ninja
-139.162.235.124 # binaryedge.ninja
-139.162.238.112 # binaryedge.ninja
-139.162.238.42 # binaryedge.ninja
-139.162.25.229 # binaryedge.ninja
-139.162.255.161 # binaryedge.ninja
-139.162.255.24 # binaryedge.ninja
-139.162.255.246 # binaryedge.ninja
-139.162.255.50 # binaryedge.ninja
-139.162.33.97 # binaryedge.ninja
-139.162.4.101 # binaryedge.ninja
-139.162.44.69 # binaryedge.ninja
-139.162.52.105 # binaryedge.ninja
-139.162.60.11 # binaryedge.ninja
-139.162.63.90 # binaryedge.ninja
-139.162.69.222 # binaryedge.ninja
-139.162.69.224 # binaryedge.ninja
-139.162.69.87 # binaryedge.ninja
-139.177.197.123 # binaryedge.ninja
-139.177.197.133 # binaryedge.ninja
-139.177.197.163 # binaryedge.ninja
-139.177.197.182 # binaryedge.ninja
-139.177.197.197 # binaryedge.ninja
-139.177.197.202 # binaryedge.ninja
-139.177.197.206 # binaryedge.ninja
-139.177.197.33 # binaryedge.ninja
-139.177.197.6 # binaryedge.ninja
-139.177.197.95 # binaryedge.ninja
-139.177.197.97 # binaryedge.ninja
-139.177.203.138 # binaryedge.ninja
-139.177.203.147 # binaryedge.ninja
-139.177.203.182 # binaryedge.ninja
-139.177.203.85 # binaryedge.ninja
-139.177.203.9 # binaryedge.ninja
-139.177.205.248 # binaryedge.ninja
-139.59.101.65 # binaryedge.ninja
-139.59.105.198 # binaryedge.ninja
-139.59.108.176 # binaryedge.ninja
-139.59.114.126 # binaryedge.ninja
-139.59.115.48 # binaryedge.ninja
-139.59.122.150 # binaryedge.ninja
-139.59.125.218 # binaryedge.ninja
-139.59.136.25 # binaryedge.ninja
-139.59.154.21 # binaryedge.ninja
-139.59.159.67 # binaryedge.ninja
-139.59.160.220 # binaryedge.ninja
-139.59.161.183 # binaryedge.ninja
-139.59.163.229 # binaryedge.ninja
-139.59.164.71 # binaryedge.ninja
-139.59.167.202 # binaryedge.ninja
-139.59.167.254 # binaryedge.ninja
-139.59.169.117 # binaryedge.ninja
-139.59.170.127 # binaryedge.ninja
-139.59.171.148 # binaryedge.ninja
-139.59.172.129 # binaryedge.ninja
-139.59.174.1 # binaryedge.ninja
-139.59.177.48 # binaryedge.ninja
-139.59.182.222 # binaryedge.ninja
-139.59.182.29 # binaryedge.ninja
-139.59.183.113 # binaryedge.ninja
-139.59.183.51 # binaryedge.ninja
-139.59.183.83 # binaryedge.ninja
-139.59.186.20 # binaryedge.ninja
-139.59.188.100 # binaryedge.ninja
-139.59.188.29 # binaryedge.ninja
-139.59.189.161 # binaryedge.ninja
-139.59.190.169 # binaryedge.ninja
-139.59.191.151 # binaryedge.ninja
-139.59.2.211 # binaryedge.ninja
-139.59.230.130 # binaryedge.ninja
-139.59.230.133 # binaryedge.ninja
-139.59.230.94 # binaryedge.ninja
-139.59.236.4 # binaryedge.ninja
-139.59.249.162 # binaryedge.ninja
-139.59.252.182 # binaryedge.ninja
-139.59.252.199 # binaryedge.ninja
-139.59.34.83 # binaryedge.ninja
-139.59.42.133 # binaryedge.ninja
-139.59.66.219 # binaryedge.ninja
-139.59.68.252 # binaryedge.ninja
-139.59.70.185 # binaryedge.ninja
-139.59.76.230 # binaryedge.ninja
-139.59.80.201 # binaryedge.ninja
-139.59.84.236 # binaryedge.ninja
-142.93.115.126 # binaryedge.ninja
-142.93.120.49 # binaryedge.ninja
-142.93.141.149 # binaryedge.ninja
-142.93.146.11 # binaryedge.ninja
-142.93.146.130 # binaryedge.ninja
-142.93.146.59 # binaryedge.ninja
-142.93.147.173 # binaryedge.ninja
-142.93.147.58 # binaryedge.ninja
-142.93.15.122 # binaryedge.ninja
-142.93.150.210 # binaryedge.ninja
-142.93.150.46 # binaryedge.ninja
-142.93.152.58 # binaryedge.ninja
-142.93.153.125 # binaryedge.ninja
-142.93.153.199 # binaryedge.ninja
-142.93.155.12 # binaryedge.ninja
-142.93.155.58 # binaryedge.ninja
-142.93.155.60 # binaryedge.ninja
-142.93.157.130 # binaryedge.ninja
-142.93.158.139 # binaryedge.ninja
-142.93.158.149 # binaryedge.ninja
-142.93.158.175 # binaryedge.ninja
-142.93.159.55 # binaryedge.ninja
-142.93.16.103 # binaryedge.ninja
-142.93.167.240 # binaryedge.ninja
-142.93.176.135 # binaryedge.ninja
-142.93.176.18 # binaryedge.ninja
-142.93.176.58 # binaryedge.ninja
-142.93.184.231 # binaryedge.ninja
-142.93.201.217 # binaryedge.ninja
-142.93.212.78 # binaryedge.ninja
-142.93.220.132 # binaryedge.ninja
-142.93.220.177 # binaryedge.ninja
-142.93.225.126 # binaryedge.ninja
-142.93.226.169 # binaryedge.ninja
-142.93.226.220 # binaryedge.ninja
-142.93.228.128 # binaryedge.ninja
-142.93.233.28 # binaryedge.ninja
-142.93.238.10 # binaryedge.ninja
-142.93.240.34 # binaryedge.ninja
-142.93.244.98 # binaryedge.ninja
-142.93.247.49 # binaryedge.ninja
-142.93.251.206 # binaryedge.ninja
-142.93.255.108 # binaryedge.ninja
-142.93.31.64 # binaryedge.ninja
-142.93.31.80 # binaryedge.ninja
-142.93.33.33 # binaryedge.ninja
-142.93.4.117 # binaryedge.ninja
-142.93.4.126 # binaryedge.ninja
-142.93.40.185 # binaryedge.ninja
-142.93.42.44 # binaryedge.ninja
-142.93.44.203 # binaryedge.ninja
-142.93.55.128 # binaryedge.ninja
-142.93.6.129 # binaryedge.ninja
-142.93.65.24 # binaryedge.ninja
-142.93.78.223 # binaryedge.ninja
-142.93.80.175 # binaryedge.ninja
-142.93.80.229 # binaryedge.ninja
-142.93.80.245 # binaryedge.ninja
-142.93.80.58 # binaryedge.ninja
-142.93.80.59 # binaryedge.ninja
-142.93.95.114 # binaryedge.ninja
-142.93.95.131 # binaryedge.ninja
-142.93.95.16 # binaryedge.ninja
-142.93.95.6 # binaryedge.ninja
-142.93.95.88 # binaryedge.ninja
-142.93.95.89 # binaryedge.ninja
-142.93.95.90 # binaryedge.ninja
-142.93.95.94 # binaryedge.ninja
-143.110.128.216 # binaryedge.ninja
-143.110.128.238 # binaryedge.ninja
-143.110.128.95 # binaryedge.ninja
-143.110.136.22 # binaryedge.ninja
-143.110.136.41 # binaryedge.ninja
-143.110.136.67 # binaryedge.ninja
-143.110.136.78 # binaryedge.ninja
-143.110.136.79 # binaryedge.ninja
-143.110.155.5 # binaryedge.ninja
-143.110.161.125 # binaryedge.ninja
-143.110.166.126 # binaryedge.ninja
-143.110.166.223 # binaryedge.ninja
-143.110.174.208 # binaryedge.ninja
-143.110.174.217 # binaryedge.ninja
-143.110.174.33 # binaryedge.ninja
-143.110.182.83 # binaryedge.ninja
-143.110.192.116 # binaryedge.ninja
-143.110.192.16 # binaryedge.ninja
-143.110.192.163 # binaryedge.ninja
-143.110.192.203 # binaryedge.ninja
-143.110.192.28 # binaryedge.ninja
-143.110.192.53 # binaryedge.ninja
-143.110.208.137 # binaryedge.ninja
-143.110.209.0 # binaryedge.ninja
-143.110.209.94 # binaryedge.ninja
-143.110.211.200 # binaryedge.ninja
-143.110.211.204 # binaryedge.ninja
-143.110.211.210 # binaryedge.ninja
-143.110.211.240 # binaryedge.ninja
-143.110.211.253 # binaryedge.ninja
-143.110.211.54 # binaryedge.ninja
-143.110.212.126 # binaryedge.ninja
-143.110.212.223 # binaryedge.ninja
-143.110.213.15 # binaryedge.ninja
-143.110.213.60 # binaryedge.ninja
-143.110.215.135 # binaryedge.ninja
-143.110.215.189 # binaryedge.ninja
-143.110.215.246 # binaryedge.ninja
-143.110.215.253 # binaryedge.ninja
-143.110.217.110 # binaryedge.ninja
-143.110.217.162 # binaryedge.ninja
-143.110.218.23 # binaryedge.ninja
-143.110.219.10 # binaryedge.ninja
-143.110.219.127 # binaryedge.ninja
-143.110.219.128 # binaryedge.ninja
-143.110.219.172 # binaryedge.ninja
-143.110.219.173 # binaryedge.ninja
-143.110.219.176 # binaryedge.ninja
-143.110.221.112 # binaryedge.ninja
-143.110.222.248 # binaryedge.ninja
-143.110.223.0 # binaryedge.ninja
-143.110.223.28 # binaryedge.ninja
-143.110.223.29 # binaryedge.ninja
-143.110.223.5 # binaryedge.ninja
-143.110.231.143 # binaryedge.ninja
-143.110.232.31 # binaryedge.ninja
-143.110.234.49 # binaryedge.ninja
-143.110.235.52 # binaryedge.ninja
-143.110.237.114 # binaryedge.ninja
-143.110.237.86 # binaryedge.ninja
-143.110.244.136 # binaryedge.ninja
-143.110.248.67 # binaryedge.ninja
-143.110.248.95 # binaryedge.ninja
-143.110.252.84 # binaryedge.ninja
-143.198.105.239 # binaryedge.ninja
-143.198.109.11 # binaryedge.ninja
-143.198.109.236 # binaryedge.ninja
-143.198.109.72 # binaryedge.ninja
-143.198.110.25 # binaryedge.ninja
-143.198.114.21 # binaryedge.ninja
-143.198.12.231 # binaryedge.ninja
-143.198.12.67 # binaryedge.ninja
-143.198.135.98 # binaryedge.ninja
-143.198.141.212 # binaryedge.ninja
-143.198.146.187 # binaryedge.ninja
-143.198.150.80 # binaryedge.ninja
-143.198.157.42 # binaryedge.ninja
-143.198.16.214 # binaryedge.ninja
-143.198.165.80 # binaryedge.ninja
-143.198.171.48 # binaryedge.ninja
-143.198.176.244 # binaryedge.ninja
-143.198.190.135 # binaryedge.ninja
-143.198.191.39 # binaryedge.ninja
-143.198.192.19 # binaryedge.ninja
-143.198.196.95 # binaryedge.ninja
-143.198.198.53 # binaryedge.ninja
-143.198.2.148 # binaryedge.ninja
-143.198.2.235 # binaryedge.ninja
-143.198.20.119 # binaryedge.ninja
-143.198.20.41 # binaryedge.ninja
-143.198.205.43 # binaryedge.ninja
-143.198.208.165 # binaryedge.ninja
-143.198.211.134 # binaryedge.ninja
-143.198.220.121 # binaryedge.ninja
-143.198.220.249 # binaryedge.ninja
-143.198.220.38 # binaryedge.ninja
-143.198.220.86 # binaryedge.ninja
-143.198.221.83 # binaryedge.ninja
-143.198.223.242 # binaryedge.ninja
-143.198.235.149 # binaryedge.ninja
-143.198.235.150 # binaryedge.ninja
-143.198.235.220 # binaryedge.ninja
-143.198.236.21 # binaryedge.ninja
-143.198.238.180 # binaryedge.ninja
-143.198.24.146 # binaryedge.ninja
-143.198.32.112 # binaryedge.ninja
-143.198.33.156 # binaryedge.ninja
-143.198.33.217 # binaryedge.ninja
-143.198.33.242 # binaryedge.ninja
-143.198.33.60 # binaryedge.ninja
-143.198.34.238 # binaryedge.ninja
-143.198.34.35 # binaryedge.ninja
-143.198.35.11 # binaryedge.ninja
-143.198.35.115 # binaryedge.ninja
-143.198.35.116 # binaryedge.ninja
-143.198.35.138 # binaryedge.ninja
-143.198.35.15 # binaryedge.ninja
-143.198.35.209 # binaryedge.ninja
-143.198.35.241 # binaryedge.ninja
-143.198.36.240 # binaryedge.ninja
-143.198.37.144 # binaryedge.ninja
-143.198.37.176 # binaryedge.ninja
-143.198.37.252 # binaryedge.ninja
-143.198.37.253 # binaryedge.ninja
-143.198.38.118 # binaryedge.ninja
-143.198.38.165 # binaryedge.ninja
-143.198.40.179 # binaryedge.ninja
-143.198.41.104 # binaryedge.ninja
-143.198.41.136 # binaryedge.ninja
-143.198.42.11 # binaryedge.ninja
-143.198.42.200 # binaryedge.ninja
-143.198.42.220 # binaryedge.ninja
-143.198.42.222 # binaryedge.ninja
-143.198.42.41 # binaryedge.ninja
-143.198.45.17 # binaryedge.ninja
-143.198.45.2 # binaryedge.ninja
-143.198.45.51 # binaryedge.ninja
-143.198.45.56 # binaryedge.ninja
-143.198.45.83 # binaryedge.ninja
-143.198.48.139 # binaryedge.ninja
-143.198.48.51 # binaryedge.ninja
-143.198.48.8 # binaryedge.ninja
-143.198.58.195 # binaryedge.ninja
-143.198.64.142 # binaryedge.ninja
-143.198.73.72 # binaryedge.ninja
-143.198.78.1 # binaryedge.ninja
-143.198.8.66 # binaryedge.ninja
-143.198.80.69 # binaryedge.ninja
-143.198.81.219 # binaryedge.ninja
-143.198.84.98 # binaryedge.ninja
-143.198.86.246 # binaryedge.ninja
-143.198.90.232 # binaryedge.ninja
-143.198.94.117 # binaryedge.ninja
-143.198.94.60 # binaryedge.ninja
-143.198.96.106 # binaryedge.ninja
-143.198.98.108 # binaryedge.ninja
-143.198.99.231 # binaryedge.ninja
-143.198.99.232 # binaryedge.ninja
-143.198.99.235 # binaryedge.ninja
-143.244.140.39 # binaryedge.ninja
-143.244.146.244 # binaryedge.ninja
-143.244.149.185 # binaryedge.ninja
-143.244.150.66 # binaryedge.ninja
-143.244.151.132 # binaryedge.ninja
-143.244.151.174 # binaryedge.ninja
-143.244.151.198 # binaryedge.ninja
-143.244.152.23 # binaryedge.ninja
-143.244.169.39 # binaryedge.ninja
-143.244.170.144 # binaryedge.ninja
-143.244.171.81 # binaryedge.ninja
-143.244.172.194 # binaryedge.ninja
-143.244.178.214 # binaryedge.ninja
-143.244.180.97 # binaryedge.ninja
-143.244.181.251 # binaryedge.ninja
-143.244.188.200 # binaryedge.ninja
-143.42.0.204 # binaryedge.ninja
-143.42.0.6 # binaryedge.ninja
-143.42.0.81 # binaryedge.ninja
-143.42.10.113 # binaryedge.ninja
-143.42.10.20 # binaryedge.ninja
-143.42.10.45 # binaryedge.ninja
-143.42.102.158 # binaryedge.ninja
-143.42.102.198 # binaryedge.ninja
-143.42.102.58 # binaryedge.ninja
-143.42.102.60 # binaryedge.ninja
-143.42.102.61 # binaryedge.ninja
-143.42.102.90 # binaryedge.ninja
-143.42.16.112 # binaryedge.ninja
-143.42.16.150 # binaryedge.ninja
-143.42.16.199 # binaryedge.ninja
-143.42.16.217 # binaryedge.ninja
-143.42.16.252 # binaryedge.ninja
-143.42.16.38 # binaryedge.ninja
-143.42.16.39 # binaryedge.ninja
-143.42.16.48 # binaryedge.ninja
-143.42.16.79 # binaryedge.ninja
-143.42.16.81 # binaryedge.ninja
-143.42.16.85 # binaryedge.ninja
-143.42.205.14 # binaryedge.ninja
-143.42.22.103 # binaryedge.ninja
-143.42.22.136 # binaryedge.ninja
-143.42.22.224 # binaryedge.ninja
-143.42.50.164 # binaryedge.ninja
-143.42.50.168 # binaryedge.ninja
-143.42.50.247 # binaryedge.ninja
-143.42.53.138 # binaryedge.ninja
-143.42.53.157 # binaryedge.ninja
-143.42.53.176 # binaryedge.ninja
-143.42.53.182 # binaryedge.ninja
-143.42.53.31 # binaryedge.ninja
-143.42.53.76 # binaryedge.ninja
-143.42.56.239 # binaryedge.ninja
-143.42.63.137 # binaryedge.ninja
-143.42.63.14 # binaryedge.ninja
-143.42.63.162 # binaryedge.ninja
-143.42.63.203 # binaryedge.ninja
-143.42.63.253 # binaryedge.ninja
-143.42.63.58 # binaryedge.ninja
-143.42.63.60 # binaryedge.ninja
-143.42.63.89 # binaryedge.ninja
-144.126.198.106 # binaryedge.ninja
-144.126.206.188 # binaryedge.ninja
-144.126.214.72 # binaryedge.ninja
-144.126.225.1 # binaryedge.ninja
-144.126.225.77 # binaryedge.ninja
-144.126.226.139 # binaryedge.ninja
-144.126.226.28 # binaryedge.ninja
-144.126.230.10 # binaryedge.ninja
-144.126.230.136 # binaryedge.ninja
-144.126.230.158 # binaryedge.ninja
-144.126.230.211 # binaryedge.ninja
-146.190.102.55 # binaryedge.ninja
-146.190.104.246 # binaryedge.ninja
-146.190.106.111 # binaryedge.ninja
-146.190.110.92 # binaryedge.ninja
-146.190.111.6 # binaryedge.ninja
-146.190.113.150 # binaryedge.ninja
-146.190.114.34 # binaryedge.ninja
-146.190.118.168 # binaryedge.ninja
-146.190.118.93 # binaryedge.ninja
-146.190.122.157 # binaryedge.ninja
-146.190.122.251 # binaryedge.ninja
-146.190.132.52 # binaryedge.ninja
-146.190.134.26 # binaryedge.ninja
-146.190.140.13 # binaryedge.ninja
-146.190.140.9 # binaryedge.ninja
-146.190.146.25 # binaryedge.ninja
-146.190.148.24 # binaryedge.ninja
-146.190.154.234 # binaryedge.ninja
-146.190.164.95 # binaryedge.ninja
-146.190.170.111 # binaryedge.ninja
-146.190.170.116 # binaryedge.ninja
-146.190.170.27 # binaryedge.ninja
-146.190.170.95 # binaryedge.ninja
-146.190.20.210 # binaryedge.ninja
-146.190.20.8 # binaryedge.ninja
-146.190.208.223 # binaryedge.ninja
-146.190.208.71 # binaryedge.ninja
-146.190.210.222 # binaryedge.ninja
-146.190.211.120 # binaryedge.ninja
-146.190.211.232 # binaryedge.ninja
-146.190.215.129 # binaryedge.ninja
-146.190.215.149 # binaryedge.ninja
-146.190.215.187 # binaryedge.ninja
-146.190.215.50 # binaryedge.ninja
-146.190.215.76 # binaryedge.ninja
-146.190.218.157 # binaryedge.ninja
-146.190.218.185 # binaryedge.ninja
-146.190.219.189 # binaryedge.ninja
-146.190.219.71 # binaryedge.ninja
-146.190.22.11 # binaryedge.ninja
-146.190.223.121 # binaryedge.ninja
-146.190.223.78 # binaryedge.ninja
-146.190.223.86 # binaryedge.ninja
-146.190.230.86 # binaryedge.ninja
-146.190.232.213 # binaryedge.ninja
-146.190.232.243 # binaryedge.ninja
-146.190.236.182 # binaryedge.ninja
-146.190.239.238 # binaryedge.ninja
-146.190.240.65 # binaryedge.ninja
-146.190.240.77 # binaryedge.ninja
-146.190.240.84 # binaryedge.ninja
-146.190.240.95 # binaryedge.ninja
-146.190.242.116 # binaryedge.ninja
-146.190.242.142 # binaryedge.ninja
-146.190.242.146 # binaryedge.ninja
-146.190.242.148 # binaryedge.ninja
-146.190.242.149 # binaryedge.ninja
-146.190.242.16 # binaryedge.ninja
-146.190.242.164 # binaryedge.ninja
-146.190.242.34 # binaryedge.ninja
-146.190.242.67 # binaryedge.ninja
-146.190.244.17 # binaryedge.ninja
-146.190.244.247 # binaryedge.ninja
-146.190.244.78 # binaryedge.ninja
-146.190.246.138 # binaryedge.ninja
-146.190.246.149 # binaryedge.ninja
-146.190.246.163 # binaryedge.ninja
-146.190.246.165 # binaryedge.ninja
-146.190.246.166 # binaryedge.ninja
-146.190.246.167 # binaryedge.ninja
-146.190.246.168 # binaryedge.ninja
-146.190.246.170 # binaryedge.ninja
-146.190.246.171 # binaryedge.ninja
-146.190.246.174 # binaryedge.ninja
-146.190.246.176 # binaryedge.ninja
-146.190.246.177 # binaryedge.ninja
-146.190.246.210 # binaryedge.ninja
-146.190.248.254 # binaryedge.ninja
-146.190.248.36 # binaryedge.ninja
-146.190.250.101 # binaryedge.ninja
-146.190.250.126 # binaryedge.ninja
-146.190.250.160 # binaryedge.ninja
-146.190.250.92 # binaryedge.ninja
-146.190.252.4 # binaryedge.ninja
-146.190.26.174 # binaryedge.ninja
-146.190.28.127 # binaryedge.ninja
-146.190.31.60 # binaryedge.ninja
-146.190.40.112 # binaryedge.ninja
-146.190.40.121 # binaryedge.ninja
-146.190.52.65 # binaryedge.ninja
-146.190.60.13 # binaryedge.ninja
-146.190.60.194 # binaryedge.ninja
-146.190.60.197 # binaryedge.ninja
-146.190.64.218 # binaryedge.ninja
-146.190.65.189 # binaryedge.ninja
-146.190.66.121 # binaryedge.ninja
-146.190.66.247 # binaryedge.ninja
-146.190.71.194 # binaryedge.ninja
-146.190.74.216 # binaryedge.ninja
-146.190.75.147 # binaryedge.ninja
-146.190.79.161 # binaryedge.ninja
-146.190.79.177 # binaryedge.ninja
-146.190.79.191 # binaryedge.ninja
-146.190.80.44 # binaryedge.ninja
-146.190.86.157 # binaryedge.ninja
-146.190.86.219 # binaryedge.ninja
-146.190.86.22 # binaryedge.ninja
-146.190.87.176 # binaryedge.ninja
-146.190.93.197 # binaryedge.ninja
-146.190.95.6 # binaryedge.ninja
-146.190.97.183 # binaryedge.ninja
-146.190.99.23 # binaryedge.ninja
-147.182.132.195 # binaryedge.ninja
-147.182.136.8 # binaryedge.ninja
-147.182.139.27 # binaryedge.ninja
-147.182.144.59 # binaryedge.ninja
-147.182.145.177 # binaryedge.ninja
-147.182.145.181 # binaryedge.ninja
-147.182.145.224 # binaryedge.ninja
-147.182.146.131 # binaryedge.ninja
-147.182.147.202 # binaryedge.ninja
-147.182.147.214 # binaryedge.ninja
-147.182.148.19 # binaryedge.ninja
-147.182.149.116 # binaryedge.ninja
-147.182.149.117 # binaryedge.ninja
-147.182.149.126 # binaryedge.ninja
-147.182.149.81 # binaryedge.ninja
-147.182.149.84 # binaryedge.ninja
-147.182.149.86 # binaryedge.ninja
-147.182.152.120 # binaryedge.ninja
-147.182.152.204 # binaryedge.ninja
-147.182.152.243 # binaryedge.ninja
-147.182.153.1 # binaryedge.ninja
-147.182.153.162 # binaryedge.ninja
-147.182.154.232 # binaryedge.ninja
-147.182.156.33 # binaryedge.ninja
-147.182.158.91 # binaryedge.ninja
-147.182.165.39 # binaryedge.ninja
-147.182.170.197 # binaryedge.ninja
-147.182.171.105 # binaryedge.ninja
-147.182.172.50 # binaryedge.ninja
-147.182.173.246 # binaryedge.ninja
-147.182.174.171 # binaryedge.ninja
-147.182.174.217 # binaryedge.ninja
-147.182.181.7 # binaryedge.ninja
-147.182.187.102 # binaryedge.ninja
-147.182.188.150 # binaryedge.ninja
-147.182.189.92 # binaryedge.ninja
-147.182.192.168 # binaryedge.ninja
-147.182.196.248 # binaryedge.ninja
-147.182.197.198 # binaryedge.ninja
-147.182.199.167 # binaryedge.ninja
-147.182.199.171 # binaryedge.ninja
-147.182.203.255 # binaryedge.ninja
-147.182.207.250 # binaryedge.ninja
-147.182.211.2 # binaryedge.ninja
-147.182.212.220 # binaryedge.ninja
-147.182.215.242 # binaryedge.ninja
-147.182.217.207 # binaryedge.ninja
-147.182.218.177 # binaryedge.ninja
-147.182.220.151 # binaryedge.ninja
-147.182.234.108 # binaryedge.ninja
-147.182.238.132 # binaryedge.ninja
-147.182.241.88 # binaryedge.ninja
-147.182.243.115 # binaryedge.ninja
-147.182.243.126 # binaryedge.ninja
-147.182.246.145 # binaryedge.ninja
-147.182.249.10 # binaryedge.ninja
-147.182.249.205 # binaryedge.ninja
-147.182.253.216 # binaryedge.ninja
-147.182.253.244 # binaryedge.ninja
-151.236.219.127 # binaryedge.ninja
-151.236.219.220 # binaryedge.ninja
-151.236.222.111 # binaryedge.ninja
-151.236.222.119 # binaryedge.ninja
-151.236.222.155 # binaryedge.ninja
-151.236.222.222 # binaryedge.ninja
-151.236.222.71 # binaryedge.ninja
-157.230.1.53 # binaryedge.ninja
-157.230.108.248 # binaryedge.ninja
-157.230.112.246 # binaryedge.ninja
-157.230.120.136 # binaryedge.ninja
-157.230.127.30 # binaryedge.ninja
-157.230.128.98 # binaryedge.ninja
-157.230.13.2 # binaryedge.ninja
-157.230.14.114 # binaryedge.ninja
-157.230.14.147 # binaryedge.ninja
-157.230.14.183 # binaryedge.ninja
-157.230.143.52 # binaryedge.ninja
-157.230.143.72 # binaryedge.ninja
-157.230.143.75 # binaryedge.ninja
-157.230.143.80 # binaryedge.ninja
-157.230.143.81 # binaryedge.ninja
-157.230.143.85 # binaryedge.ninja
-157.230.144.207 # binaryedge.ninja
-157.230.144.211 # binaryedge.ninja
-157.230.144.241 # binaryedge.ninja
-157.230.144.71 # binaryedge.ninja
-157.230.144.89 # binaryedge.ninja
-157.230.144.95 # binaryedge.ninja
-157.230.159.106 # binaryedge.ninja
-157.230.159.19 # binaryedge.ninja
-157.230.159.73 # binaryedge.ninja
-157.230.16.119 # binaryedge.ninja
-157.230.160.110 # binaryedge.ninja
-157.230.160.158 # binaryedge.ninja
-157.230.160.241 # binaryedge.ninja
-157.230.160.34 # binaryedge.ninja
-157.230.160.61 # binaryedge.ninja
-157.230.160.77 # binaryedge.ninja
-157.230.175.115 # binaryedge.ninja
-157.230.175.39 # binaryedge.ninja
-157.230.186.239 # binaryedge.ninja
-157.230.211.126 # binaryedge.ninja
-157.230.212.116 # binaryedge.ninja
-157.230.212.137 # binaryedge.ninja
-157.230.213.0 # binaryedge.ninja
-157.230.213.195 # binaryedge.ninja
-157.230.217.88 # binaryedge.ninja
-157.230.218.104 # binaryedge.ninja
-157.230.221.28 # binaryedge.ninja
-157.230.229.162 # binaryedge.ninja
-157.230.236.32 # binaryedge.ninja
-157.230.237.42 # binaryedge.ninja
-157.230.239.110 # binaryedge.ninja
-157.230.244.62 # binaryedge.ninja
-157.230.248.144 # binaryedge.ninja
-157.230.249.73 # binaryedge.ninja
-157.230.249.85 # binaryedge.ninja
-157.230.255.129 # binaryedge.ninja
-157.230.255.152 # binaryedge.ninja
-157.230.35.124 # binaryedge.ninja
-157.230.42.25 # binaryedge.ninja
-157.230.43.62 # binaryedge.ninja
-157.230.5.32 # binaryedge.ninja
-157.230.51.1 # binaryedge.ninja
-157.230.54.119 # binaryedge.ninja
-157.230.56.115 # binaryedge.ninja
-157.230.63.28 # binaryedge.ninja
-157.230.8.189 # binaryedge.ninja
-157.230.8.198 # binaryedge.ninja
-157.230.80.167 # binaryedge.ninja
-157.230.80.88 # binaryedge.ninja
-157.230.82.247 # binaryedge.ninja
-157.230.84.152 # binaryedge.ninja
-157.230.89.60 # binaryedge.ninja
-157.230.92.202 # binaryedge.ninja
-157.230.95.243 # binaryedge.ninja
-157.245.10.222 # binaryedge.ninja
-157.245.114.192 # binaryedge.ninja
-157.245.118.115 # binaryedge.ninja
-157.245.129.10 # binaryedge.ninja
-157.245.133.255 # binaryedge.ninja
-157.245.135.224 # binaryedge.ninja
-157.245.14.150 # binaryedge.ninja
-157.245.145.57 # binaryedge.ninja
-157.245.150.61 # binaryedge.ninja
-157.245.150.68 # binaryedge.ninja
-157.245.157.125 # binaryedge.ninja
-157.245.157.50 # binaryedge.ninja
-157.245.158.212 # binaryedge.ninja
-157.245.160.252 # binaryedge.ninja
-157.245.160.43 # binaryedge.ninja
-157.245.160.45 # binaryedge.ninja
-157.245.160.81 # binaryedge.ninja
-157.245.168.43 # binaryedge.ninja
-157.245.168.50 # binaryedge.ninja
-157.245.176.80 # binaryedge.ninja
-157.245.184.125 # binaryedge.ninja
-157.245.184.127 # binaryedge.ninja
-157.245.184.128 # binaryedge.ninja
-157.245.184.130 # binaryedge.ninja
-157.245.184.135 # binaryedge.ninja
-157.245.184.188 # binaryedge.ninja
-157.245.184.242 # binaryedge.ninja
-157.245.184.64 # binaryedge.ninja
-157.245.184.75 # binaryedge.ninja
-157.245.192.117 # binaryedge.ninja
-157.245.192.79 # binaryedge.ninja
-157.245.193.185 # binaryedge.ninja
-157.245.196.205 # binaryedge.ninja
-157.245.196.35 # binaryedge.ninja
-157.245.198.113 # binaryedge.ninja
-157.245.200.180 # binaryedge.ninja
-157.245.209.103 # binaryedge.ninja
-157.245.209.144 # binaryedge.ninja
-157.245.214.113 # binaryedge.ninja
-157.245.224.138 # binaryedge.ninja
-157.245.224.183 # binaryedge.ninja
-157.245.224.216 # binaryedge.ninja
-157.245.224.27 # binaryedge.ninja
-157.245.232.100 # binaryedge.ninja
-157.245.232.41 # binaryedge.ninja
-157.245.232.44 # binaryedge.ninja
-157.245.232.48 # binaryedge.ninja
-157.245.232.52 # binaryedge.ninja
-157.245.232.62 # binaryedge.ninja
-157.245.232.65 # binaryedge.ninja
-157.245.232.76 # binaryedge.ninja
-157.245.232.95 # binaryedge.ninja
-157.245.240.124 # binaryedge.ninja
-157.245.240.161 # binaryedge.ninja
-157.245.246.185 # binaryedge.ninja
-157.245.34.115 # binaryedge.ninja
-157.245.34.83 # binaryedge.ninja
-157.245.35.194 # binaryedge.ninja
-157.245.41.172 # binaryedge.ninja
-157.245.45.169 # binaryedge.ninja
-157.245.46.158 # binaryedge.ninja
-157.245.46.98 # binaryedge.ninja
-157.245.53.60 # binaryedge.ninja
-157.245.54.122 # binaryedge.ninja
-157.245.57.223 # binaryedge.ninja
-157.245.58.82 # binaryedge.ninja
-157.245.64.61 # binaryedge.ninja
-157.245.65.238 # binaryedge.ninja
-157.245.70.76 # binaryedge.ninja
-157.245.71.148 # binaryedge.ninja
-157.245.74.26 # binaryedge.ninja
-157.245.77.163 # binaryedge.ninja
-157.245.89.179 # binaryedge.ninja
-157.245.95.13 # binaryedge.ninja
-159.203.0.109 # binaryedge.ninja
-159.203.1.152 # binaryedge.ninja
-159.203.1.89 # binaryedge.ninja
-159.203.100.87 # binaryedge.ninja
-159.203.106.14 # binaryedge.ninja
-159.203.11.183 # binaryedge.ninja
-159.203.13.53 # binaryedge.ninja
-159.203.13.87 # binaryedge.ninja
-159.203.132.171 # binaryedge.ninja
-159.203.136.246 # binaryedge.ninja
-159.203.14.129 # binaryedge.ninja
-159.203.140.13 # binaryedge.ninja
-159.203.143.51 # binaryedge.ninja
-159.203.143.52 # binaryedge.ninja
-159.203.16.112 # binaryedge.ninja
-159.203.166.25 # binaryedge.ninja
-159.203.170.227 # binaryedge.ninja
-159.203.172.105 # binaryedge.ninja
-159.203.177.29 # binaryedge.ninja
-159.203.178.39 # binaryedge.ninja
-159.203.18.244 # binaryedge.ninja
-159.203.189.250 # binaryedge.ninja
-159.203.23.197 # binaryedge.ninja
-159.203.24.81 # binaryedge.ninja
-159.203.26.157 # binaryedge.ninja
-159.203.26.239 # binaryedge.ninja
-159.203.27.11 # binaryedge.ninja
-159.203.37.212 # binaryedge.ninja
-159.203.38.182 # binaryedge.ninja
-159.203.4.184 # binaryedge.ninja
-159.203.40.97 # binaryedge.ninja
-159.203.42.15 # binaryedge.ninja
-159.203.42.187 # binaryedge.ninja
-159.203.43.255 # binaryedge.ninja
-159.203.43.99 # binaryedge.ninja
-159.203.44.81 # binaryedge.ninja
-159.203.45.108 # binaryedge.ninja
-159.203.45.136 # binaryedge.ninja
-159.203.45.157 # binaryedge.ninja
-159.203.46.176 # binaryedge.ninja
-159.203.47.147 # binaryedge.ninja
-159.203.57.173 # binaryedge.ninja
-159.203.58.50 # binaryedge.ninja
-159.203.59.195 # binaryedge.ninja
-159.203.59.46 # binaryedge.ninja
-159.203.59.58 # binaryedge.ninja
-159.203.63.34 # binaryedge.ninja
-159.203.64.66 # binaryedge.ninja
-159.203.7.218 # binaryedge.ninja
-159.203.8.136 # binaryedge.ninja
-159.203.81.8 # binaryedge.ninja
-159.203.86.202 # binaryedge.ninja
-159.203.92.236 # binaryedge.ninja
-159.203.94.176 # binaryedge.ninja
-159.203.94.183 # binaryedge.ninja
-159.203.98.131 # binaryedge.ninja
-159.203.98.196 # binaryedge.ninja
-159.223.0.139 # binaryedge.ninja
-159.223.0.67 # binaryedge.ninja
-159.223.0.77 # binaryedge.ninja
-159.223.10.133 # binaryedge.ninja
-159.223.10.88 # binaryedge.ninja
-159.223.101.60 # binaryedge.ninja
-159.223.109.120 # binaryedge.ninja
-159.223.109.51 # binaryedge.ninja
-159.223.11.163 # binaryedge.ninja
-159.223.114.225 # binaryedge.ninja
-159.223.117.20 # binaryedge.ninja
-159.223.117.35 # binaryedge.ninja
-159.223.117.45 # binaryedge.ninja
-159.223.119.232 # binaryedge.ninja
-159.223.12.242 # binaryedge.ninja
-159.223.124.164 # binaryedge.ninja
-159.223.124.248 # binaryedge.ninja
-159.223.126.74 # binaryedge.ninja
-159.223.128.136 # binaryedge.ninja
-159.223.131.243 # binaryedge.ninja
-159.223.132.106 # binaryedge.ninja
-159.223.144.80 # binaryedge.ninja
-159.223.157.255 # binaryedge.ninja
-159.223.161.16 # binaryedge.ninja
-159.223.174.201 # binaryedge.ninja
-159.223.175.24 # binaryedge.ninja
-159.223.192.23 # binaryedge.ninja
-159.223.193.75 # binaryedge.ninja
-159.223.197.51 # binaryedge.ninja
-159.223.202.149 # binaryedge.ninja
-159.223.209.12 # binaryedge.ninja
-159.223.209.235 # binaryedge.ninja
-159.223.210.179 # binaryedge.ninja
-159.223.211.155 # binaryedge.ninja
-159.223.212.124 # binaryedge.ninja
-159.223.214.41 # binaryedge.ninja
-159.223.216.177 # binaryedge.ninja
-159.223.217.19 # binaryedge.ninja
-159.223.217.87 # binaryedge.ninja
-159.223.218.16 # binaryedge.ninja
-159.223.221.132 # binaryedge.ninja
-159.223.222.246 # binaryedge.ninja
-159.223.224.237 # binaryedge.ninja
-159.223.230.124 # binaryedge.ninja
-159.223.231.89 # binaryedge.ninja
-159.223.232.4 # binaryedge.ninja
-159.223.232.60 # binaryedge.ninja
-159.223.236.174 # binaryedge.ninja
-159.223.37.182 # binaryedge.ninja
-159.223.4.16 # binaryedge.ninja
-159.223.41.104 # binaryedge.ninja
-159.223.42.103 # binaryedge.ninja
-159.223.46.71 # binaryedge.ninja
-159.223.52.191 # binaryedge.ninja
-159.223.55.30 # binaryedge.ninja
-159.223.58.122 # binaryedge.ninja
-159.223.63.30 # binaryedge.ninja
-159.223.64.16 # binaryedge.ninja
-159.223.65.130 # binaryedge.ninja
-159.223.69.127 # binaryedge.ninja
-159.223.7.9 # binaryedge.ninja
-159.223.70.93 # binaryedge.ninja
-159.223.77.36 # binaryedge.ninja
-159.223.78.246 # binaryedge.ninja
-159.223.8.234 # binaryedge.ninja
-159.223.85.25 # binaryedge.ninja
-159.223.9.199 # binaryedge.ninja
-159.223.96.145 # binaryedge.ninja
-159.65.10.50 # binaryedge.ninja
-159.65.111.129 # binaryedge.ninja
-159.65.111.154 # binaryedge.ninja
-159.65.111.174 # binaryedge.ninja
-159.65.133.84 # binaryedge.ninja
-159.65.138.146 # binaryedge.ninja
-159.65.138.161 # binaryedge.ninja
-159.65.142.7 # binaryedge.ninja
-159.65.143.113 # binaryedge.ninja
-159.65.152.72 # binaryedge.ninja
-159.65.159.187 # binaryedge.ninja
-159.65.159.56 # binaryedge.ninja
-159.65.19.132 # binaryedge.ninja
-159.65.191.225 # binaryedge.ninja
-159.65.193.161 # binaryedge.ninja
-159.65.196.228 # binaryedge.ninja
-159.65.196.79 # binaryedge.ninja
-159.65.197.229 # binaryedge.ninja
-159.65.198.189 # binaryedge.ninja
-159.65.198.228 # binaryedge.ninja
-159.65.204.23 # binaryedge.ninja
-159.65.207.11 # binaryedge.ninja
-159.65.207.148 # binaryedge.ninja
-159.65.207.182 # binaryedge.ninja
-159.65.21.211 # binaryedge.ninja
-159.65.216.182 # binaryedge.ninja
-159.65.217.41 # binaryedge.ninja
-159.65.22.26 # binaryedge.ninja
-159.65.222.191 # binaryedge.ninja
-159.65.226.18 # binaryedge.ninja
-159.65.228.239 # binaryedge.ninja
-159.65.229.237 # binaryedge.ninja
-159.65.234.212 # binaryedge.ninja
-159.65.248.89 # binaryedge.ninja
-159.65.250.46 # binaryedge.ninja
-159.65.27.131 # binaryedge.ninja
-159.65.27.192 # binaryedge.ninja
-159.65.27.63 # binaryedge.ninja
-159.65.29.11 # binaryedge.ninja
-159.65.49.117 # binaryedge.ninja
-159.65.50.146 # binaryedge.ninja
-159.65.50.148 # binaryedge.ninja
-159.65.50.18 # binaryedge.ninja
-159.65.50.59 # binaryedge.ninja
-159.65.51.106 # binaryedge.ninja
-159.65.52.141 # binaryedge.ninja
-159.65.53.188 # binaryedge.ninja
-159.65.54.30 # binaryedge.ninja
-159.65.55.9 # binaryedge.ninja
-159.65.56.22 # binaryedge.ninja
-159.65.58.6 # binaryedge.ninja
-159.65.60.146 # binaryedge.ninja
-159.65.60.225 # binaryedge.ninja
-159.65.60.56 # binaryedge.ninja
-159.65.61.165 # binaryedge.ninja
-159.65.62.181 # binaryedge.ninja
-159.65.62.28 # binaryedge.ninja
-159.65.64.128 # binaryedge.ninja
-159.65.64.160 # binaryedge.ninja
-159.65.64.180 # binaryedge.ninja
-159.65.64.187 # binaryedge.ninja
-159.65.7.100 # binaryedge.ninja
-159.65.72.124 # binaryedge.ninja
-159.65.72.134 # binaryedge.ninja
-159.65.72.81 # binaryedge.ninja
-159.65.72.91 # binaryedge.ninja
-159.65.79.101 # binaryedge.ninja
-159.65.79.103 # binaryedge.ninja
-159.65.80.30 # binaryedge.ninja
-159.65.83.143 # binaryedge.ninja
-159.65.87.188 # binaryedge.ninja
-159.65.93.111 # binaryedge.ninja
-159.65.94.15 # binaryedge.ninja
-159.65.94.41 # binaryedge.ninja
-159.65.96.158 # binaryedge.ninja
-159.65.96.212 # binaryedge.ninja
-159.89.100.71 # binaryedge.ninja
-159.89.105.91 # binaryedge.ninja
-159.89.109.248 # binaryedge.ninja
-159.89.112.15 # binaryedge.ninja
-159.89.112.20 # binaryedge.ninja
-159.89.113.203 # binaryedge.ninja
-159.89.118.167 # binaryedge.ninja
-159.89.120.193 # binaryedge.ninja
-159.89.120.194 # binaryedge.ninja
-159.89.120.61 # binaryedge.ninja
-159.89.122.117 # binaryedge.ninja
-159.89.122.166 # binaryedge.ninja
-159.89.122.198 # binaryedge.ninja
-159.89.122.82 # binaryedge.ninja
-159.89.122.96 # binaryedge.ninja
-159.89.123.118 # binaryedge.ninja
-159.89.124.23 # binaryedge.ninja
-159.89.128.115 # binaryedge.ninja
-159.89.132.106 # binaryedge.ninja
-159.89.132.123 # binaryedge.ninja
-159.89.132.134 # binaryedge.ninja
-159.89.143.160 # binaryedge.ninja
-159.89.143.206 # binaryedge.ninja
-159.89.143.208 # binaryedge.ninja
-159.89.143.239 # binaryedge.ninja
-159.89.144.135 # binaryedge.ninja
-159.89.144.216 # binaryedge.ninja
-159.89.144.218 # binaryedge.ninja
-159.89.144.225 # binaryedge.ninja
-159.89.144.238 # binaryedge.ninja
-159.89.144.25 # binaryedge.ninja
-159.89.144.43 # binaryedge.ninja
-159.89.144.66 # binaryedge.ninja
-159.89.15.37 # binaryedge.ninja
-159.89.158.88 # binaryedge.ninja
-159.89.159.162 # binaryedge.ninja
-159.89.159.216 # binaryedge.ninja
-159.89.166.105 # binaryedge.ninja
-159.89.172.171 # binaryedge.ninja
-159.89.18.41 # binaryedge.ninja
-159.89.182.175 # binaryedge.ninja
-159.89.197.214 # binaryedge.ninja
-159.89.231.0 # binaryedge.ninja
-159.89.236.218 # binaryedge.ninja
-159.89.236.42 # binaryedge.ninja
-159.89.239.156 # binaryedge.ninja
-159.89.25.240 # binaryedge.ninja
-159.89.29.116 # binaryedge.ninja
-159.89.32.166 # binaryedge.ninja
-159.89.36.73 # binaryedge.ninja
-159.89.47.243 # binaryedge.ninja
-159.89.47.246 # binaryedge.ninja
-159.89.49.67 # binaryedge.ninja
-159.89.50.253 # binaryedge.ninja
-159.89.6.42 # binaryedge.ninja
-159.89.82.18 # binaryedge.ninja
-159.89.87.91 # binaryedge.ninja
-159.89.9.46 # binaryedge.ninja
-161.35.0.95 # binaryedge.ninja
-161.35.101.145 # binaryedge.ninja
-161.35.103.95 # binaryedge.ninja
-161.35.110.111 # binaryedge.ninja
-161.35.111.42 # binaryedge.ninja
-161.35.113.245 # binaryedge.ninja
-161.35.114.205 # binaryedge.ninja
-161.35.116.185 # binaryedge.ninja
-161.35.12.44 # binaryedge.ninja
-161.35.121.209 # binaryedge.ninja
-161.35.127.189 # binaryedge.ninja
-161.35.128.18 # binaryedge.ninja
-161.35.128.58 # binaryedge.ninja
-161.35.128.73 # binaryedge.ninja
-161.35.128.85 # binaryedge.ninja
-161.35.144.187 # binaryedge.ninja
-161.35.144.31 # binaryedge.ninja
-161.35.147.238 # binaryedge.ninja
-161.35.149.19 # binaryedge.ninja
-161.35.151.250 # binaryedge.ninja
-161.35.156.175 # binaryedge.ninja
-161.35.159.219 # binaryedge.ninja
-161.35.163.140 # binaryedge.ninja
-161.35.163.145 # binaryedge.ninja
-161.35.163.194 # binaryedge.ninja
-161.35.163.207 # binaryedge.ninja
-161.35.163.68 # binaryedge.ninja
-161.35.163.76 # binaryedge.ninja
-161.35.163.80 # binaryedge.ninja
-161.35.163.85 # binaryedge.ninja
-161.35.163.95 # binaryedge.ninja
-161.35.169.165 # binaryedge.ninja
-161.35.169.166 # binaryedge.ninja
-161.35.170.118 # binaryedge.ninja
-161.35.170.167 # binaryedge.ninja
-161.35.172.166 # binaryedge.ninja
-161.35.174.222 # binaryedge.ninja
-161.35.178.177 # binaryedge.ninja
-161.35.178.224 # binaryedge.ninja
-161.35.182.12 # binaryedge.ninja
-161.35.194.70 # binaryedge.ninja
-161.35.200.185 # binaryedge.ninja
-161.35.22.109 # binaryedge.ninja
-161.35.223.5 # binaryedge.ninja
-161.35.228.251 # binaryedge.ninja
-161.35.229.157 # binaryedge.ninja
-161.35.229.96 # binaryedge.ninja
-161.35.233.253 # binaryedge.ninja
-161.35.234.204 # binaryedge.ninja
-161.35.235.103 # binaryedge.ninja
-161.35.235.121 # binaryedge.ninja
-161.35.235.186 # binaryedge.ninja
-161.35.239.17 # binaryedge.ninja
-161.35.32.148 # binaryedge.ninja
-161.35.36.224 # binaryedge.ninja
-161.35.40.148 # binaryedge.ninja
-161.35.40.69 # binaryedge.ninja
-161.35.44.54 # binaryedge.ninja
-161.35.54.20 # binaryedge.ninja
-161.35.54.63 # binaryedge.ninja
-161.35.6.168 # binaryedge.ninja
-161.35.68.123 # binaryedge.ninja
-161.35.7.103 # binaryedge.ninja
-161.35.7.228 # binaryedge.ninja
-161.35.70.101 # binaryedge.ninja
-161.35.75.223 # binaryedge.ninja
-161.35.81.18 # binaryedge.ninja
-161.35.81.193 # binaryedge.ninja
-161.35.83.201 # binaryedge.ninja
-161.35.84.18 # binaryedge.ninja
-161.35.85.246 # binaryedge.ninja
-161.35.97.81 # binaryedge.ninja
-162.243.160.63 # binaryedge.ninja
-162.243.171.175 # binaryedge.ninja
-162.243.187.162 # binaryedge.ninja
-164.90.140.44 # binaryedge.ninja
-164.90.184.178 # binaryedge.ninja
-164.90.192.7 # binaryedge.ninja
-164.90.193.62 # binaryedge.ninja
-164.90.193.91 # binaryedge.ninja
-164.90.194.48 # binaryedge.ninja
-164.90.196.139 # binaryedge.ninja
-164.90.196.158 # binaryedge.ninja
-164.90.196.3 # binaryedge.ninja
-164.90.197.222 # binaryedge.ninja
-164.90.197.86 # binaryedge.ninja
-164.90.208.180 # binaryedge.ninja
-164.90.209.231 # binaryedge.ninja
-164.90.211.246 # binaryedge.ninja
-164.90.215.77 # binaryedge.ninja
-164.90.232.106 # binaryedge.ninja
-164.90.232.29 # binaryedge.ninja
-164.90.236.128 # binaryedge.ninja
-164.90.237.26 # binaryedge.ninja
-164.92.104.138 # binaryedge.ninja
-164.92.104.84 # binaryedge.ninja
-164.92.112.195 # binaryedge.ninja
-164.92.116.140 # binaryedge.ninja
-164.92.116.184 # binaryedge.ninja
-164.92.116.194 # binaryedge.ninja
-164.92.116.91 # binaryedge.ninja
-164.92.120.195 # binaryedge.ninja
-164.92.128.137 # binaryedge.ninja
-164.92.131.238 # binaryedge.ninja
-164.92.132.215 # binaryedge.ninja
-164.92.136.43 # binaryedge.ninja
-164.92.142.23 # binaryedge.ninja
-164.92.143.245 # binaryedge.ninja
-164.92.146.45 # binaryedge.ninja
-164.92.152.35 # binaryedge.ninja
-164.92.152.44 # binaryedge.ninja
-164.92.153.104 # binaryedge.ninja
-164.92.153.244 # binaryedge.ninja
-164.92.158.3 # binaryedge.ninja
-164.92.163.20 # binaryedge.ninja
-164.92.164.147 # binaryedge.ninja
-164.92.166.245 # binaryedge.ninja
-164.92.172.213 # binaryedge.ninja
-164.92.182.5 # binaryedge.ninja
-164.92.208.176 # binaryedge.ninja
-164.92.208.207 # binaryedge.ninja
-164.92.209.159 # binaryedge.ninja
-164.92.209.72 # binaryedge.ninja
-164.92.212.222 # binaryedge.ninja
-164.92.212.45 # binaryedge.ninja
-164.92.215.120 # binaryedge.ninja
-164.92.216.47 # binaryedge.ninja
-164.92.217.31 # binaryedge.ninja
-164.92.218.144 # binaryedge.ninja
-164.92.219.190 # binaryedge.ninja
-164.92.219.50 # binaryedge.ninja
-164.92.220.59 # binaryedge.ninja
-164.92.220.81 # binaryedge.ninja
-164.92.221.243 # binaryedge.ninja
-164.92.232.219 # binaryedge.ninja
-164.92.233.214 # binaryedge.ninja
-164.92.236.50 # binaryedge.ninja
-164.92.238.152 # binaryedge.ninja
-164.92.65.187 # binaryedge.ninja
-164.92.72.80 # binaryedge.ninja
-164.92.74.135 # binaryedge.ninja
-164.92.74.202 # binaryedge.ninja
-164.92.76.145 # binaryedge.ninja
-164.92.92.183 # binaryedge.ninja
-164.92.94.124 # binaryedge.ninja
-164.92.94.209 # binaryedge.ninja
-165.22.111.161 # binaryedge.ninja
-165.22.113.109 # binaryedge.ninja
-165.22.116.145 # binaryedge.ninja
-165.22.118.210 # binaryedge.ninja
-165.22.121.58 # binaryedge.ninja
-165.22.123.228 # binaryedge.ninja
-165.22.125.11 # binaryedge.ninja
-165.22.125.113 # binaryedge.ninja
-165.22.125.120 # binaryedge.ninja
-165.22.125.188 # binaryedge.ninja
-165.22.127.234 # binaryedge.ninja
-165.22.128.197 # binaryedge.ninja
-165.22.143.22 # binaryedge.ninja
-165.22.143.61 # binaryedge.ninja
-165.22.143.65 # binaryedge.ninja
-165.22.143.70 # binaryedge.ninja
-165.22.143.72 # binaryedge.ninja
-165.22.143.96 # binaryedge.ninja
-165.22.144.102 # binaryedge.ninja
-165.22.15.228 # binaryedge.ninja
-165.22.159.127 # binaryedge.ninja
-165.22.159.141 # binaryedge.ninja
-165.22.159.32 # binaryedge.ninja
-165.22.159.68 # binaryedge.ninja
-165.22.16.84 # binaryedge.ninja
-165.22.160.101 # binaryedge.ninja
-165.22.160.14 # binaryedge.ninja
-165.22.160.33 # binaryedge.ninja
-165.22.160.53 # binaryedge.ninja
-165.22.160.65 # binaryedge.ninja
-165.22.175.10 # binaryedge.ninja
-165.22.175.15 # binaryedge.ninja
-165.22.175.16 # binaryedge.ninja
-165.22.175.17 # binaryedge.ninja
-165.22.175.91 # binaryedge.ninja
-165.22.179.80 # binaryedge.ninja
-165.22.183.166 # binaryedge.ninja
-165.22.183.211 # binaryedge.ninja
-165.22.187.241 # binaryedge.ninja
-165.22.188.233 # binaryedge.ninja
-165.22.196.159 # binaryedge.ninja
-165.22.202.110 # binaryedge.ninja
-165.22.202.140 # binaryedge.ninja
-165.22.202.158 # binaryedge.ninja
-165.22.202.249 # binaryedge.ninja
-165.22.204.184 # binaryedge.ninja
-165.22.204.76 # binaryedge.ninja
-165.22.207.161 # binaryedge.ninja
-165.22.207.166 # binaryedge.ninja
-165.22.210.145 # binaryedge.ninja
-165.22.225.125 # binaryedge.ninja
-165.22.228.202 # binaryedge.ninja
-165.22.231.0 # binaryedge.ninja
-165.22.231.1 # binaryedge.ninja
-165.22.231.115 # binaryedge.ninja
-165.22.232.132 # binaryedge.ninja
-165.22.232.99 # binaryedge.ninja
-165.22.234.84 # binaryedge.ninja
-165.22.235.137 # binaryedge.ninja
-165.22.235.154 # binaryedge.ninja
-165.22.235.180 # binaryedge.ninja
-165.22.235.184 # binaryedge.ninja
-165.22.235.202 # binaryedge.ninja
-165.22.235.211 # binaryedge.ninja
-165.22.235.224 # binaryedge.ninja
-165.22.235.227 # binaryedge.ninja
-165.22.235.228 # binaryedge.ninja
-165.22.237.143 # binaryedge.ninja
-165.22.237.181 # binaryedge.ninja
-165.22.237.186 # binaryedge.ninja
-165.22.238.129 # binaryedge.ninja
-165.22.238.130 # binaryedge.ninja
-165.22.238.243 # binaryedge.ninja
-165.22.24.3 # binaryedge.ninja
-165.22.24.37 # binaryedge.ninja
-165.22.241.122 # binaryedge.ninja
-165.22.243.238 # binaryedge.ninja
-165.22.245.213 # binaryedge.ninja
-165.22.245.236 # binaryedge.ninja
-165.22.246.155 # binaryedge.ninja
-165.22.251.254 # binaryedge.ninja
-165.22.26.94 # binaryedge.ninja
-165.22.31.14 # binaryedge.ninja
-165.22.31.201 # binaryedge.ninja
-165.22.32.212 # binaryedge.ninja
-165.22.36.56 # binaryedge.ninja
-165.22.38.107 # binaryedge.ninja
-165.22.42.143 # binaryedge.ninja
-165.22.51.164 # binaryedge.ninja
-165.22.51.76 # binaryedge.ninja
-165.22.54.38 # binaryedge.ninja
-165.22.59.144 # binaryedge.ninja
-165.22.82.12 # binaryedge.ninja
-165.22.82.79 # binaryedge.ninja
-165.22.88.222 # binaryedge.ninja
-165.22.99.88 # binaryedge.ninja
-165.227.10.197 # binaryedge.ninja
-165.227.100.28 # binaryedge.ninja
-165.227.106.42 # binaryedge.ninja
-165.227.108.68 # binaryedge.ninja
-165.227.114.233 # binaryedge.ninja
-165.227.114.32 # binaryedge.ninja
-165.227.12.34 # binaryedge.ninja
-165.227.124.204 # binaryedge.ninja
-165.227.128.80 # binaryedge.ninja
-165.227.136.58 # binaryedge.ninja
-165.227.15.120 # binaryedge.ninja
-165.227.15.181 # binaryedge.ninja
-165.227.15.196 # binaryedge.ninja
-165.227.15.96 # binaryedge.ninja
-165.227.150.41 # binaryedge.ninja
-165.227.16.153 # binaryedge.ninja
-165.227.16.19 # binaryedge.ninja
-165.227.16.200 # binaryedge.ninja
-165.227.16.38 # binaryedge.ninja
-165.227.16.52 # binaryedge.ninja
-165.227.16.61 # binaryedge.ninja
-165.227.167.192 # binaryedge.ninja
-165.227.169.203 # binaryedge.ninja
-165.227.178.230 # binaryedge.ninja
-165.227.180.205 # binaryedge.ninja
-165.227.197.172 # binaryedge.ninja
-165.227.200.68 # binaryedge.ninja
-165.227.202.224 # binaryedge.ninja
-165.227.216.209 # binaryedge.ninja
-165.227.216.238 # binaryedge.ninja
-165.227.226.173 # binaryedge.ninja
-165.227.227.195 # binaryedge.ninja
-165.227.230.154 # binaryedge.ninja
-165.227.231.164 # binaryedge.ninja
-165.227.235.29 # binaryedge.ninja
-165.227.237.153 # binaryedge.ninja
-165.227.237.49 # binaryedge.ninja
-165.227.24.81 # binaryedge.ninja
-165.227.25.164 # binaryedge.ninja
-165.227.31.176 # binaryedge.ninja
-165.227.31.194 # binaryedge.ninja
-165.227.31.216 # binaryedge.ninja
-165.227.31.219 # binaryedge.ninja
-165.227.31.73 # binaryedge.ninja
-165.227.31.87 # binaryedge.ninja
-165.227.36.47 # binaryedge.ninja
-165.227.37.136 # binaryedge.ninja
-165.227.37.147 # binaryedge.ninja
-165.227.37.70 # binaryedge.ninja
-165.227.4.184 # binaryedge.ninja
-165.227.4.37 # binaryedge.ninja
-165.227.40.136 # binaryedge.ninja
-165.227.40.156 # binaryedge.ninja
-165.227.41.127 # binaryedge.ninja
-165.227.41.160 # binaryedge.ninja
-165.227.41.210 # binaryedge.ninja
-165.227.45.13 # binaryedge.ninja
-165.227.47.47 # binaryedge.ninja
-165.227.48.163 # binaryedge.ninja
-165.227.48.226 # binaryedge.ninja
-165.227.48.245 # binaryedge.ninja
-165.227.50.249 # binaryedge.ninja
-165.227.52.44 # binaryedge.ninja
-165.227.56.34 # binaryedge.ninja
-165.227.63.101 # binaryedge.ninja
-165.227.63.102 # binaryedge.ninja
-165.227.63.165 # binaryedge.ninja
-165.227.63.175 # binaryedge.ninja
-165.227.63.18 # binaryedge.ninja
-165.227.63.58 # binaryedge.ninja
-165.227.65.177 # binaryedge.ninja
-165.227.65.200 # binaryedge.ninja
-165.227.66.123 # binaryedge.ninja
-165.227.69.3 # binaryedge.ninja
-165.227.72.206 # binaryedge.ninja
-165.227.8.104 # binaryedge.ninja
-165.227.8.170 # binaryedge.ninja
-165.227.8.177 # binaryedge.ninja
-165.227.8.190 # binaryedge.ninja
-165.227.8.205 # binaryedge.ninja
-165.227.8.98 # binaryedge.ninja
-165.227.82.132 # binaryedge.ninja
-165.227.82.253 # binaryedge.ninja
-165.227.83.200 # binaryedge.ninja
-165.227.98.72 # binaryedge.ninja
-165.227.98.96 # binaryedge.ninja
-165.232.105.194 # binaryedge.ninja
-165.232.106.237 # binaryedge.ninja
-165.232.110.101 # binaryedge.ninja
-165.232.110.129 # binaryedge.ninja
-165.232.110.233 # binaryedge.ninja
-165.232.115.141 # binaryedge.ninja
-165.232.117.174 # binaryedge.ninja
-165.232.124.64 # binaryedge.ninja
-165.232.126.108 # binaryedge.ninja
-165.232.129.2 # binaryedge.ninja
-165.232.131.44 # binaryedge.ninja
-165.232.132.156 # binaryedge.ninja
-165.232.137.102 # binaryedge.ninja
-165.232.138.162 # binaryedge.ninja
-165.232.140.159 # binaryedge.ninja
-165.232.140.176 # binaryedge.ninja
-165.232.140.86 # binaryedge.ninja
-165.232.142.230 # binaryedge.ninja
-165.232.144.31 # binaryedge.ninja
-165.232.148.146 # binaryedge.ninja
-165.232.158.219 # binaryedge.ninja
-165.232.163.28 # binaryedge.ninja
-165.232.168.62 # binaryedge.ninja
-165.232.172.161 # binaryedge.ninja
-165.232.32.81 # binaryedge.ninja
-165.232.33.121 # binaryedge.ninja
-165.232.37.246 # binaryedge.ninja
-165.232.41.35 # binaryedge.ninja
-165.232.45.36 # binaryedge.ninja
-165.232.45.61 # binaryedge.ninja
-165.232.48.40 # binaryedge.ninja
-165.232.56.26 # binaryedge.ninja
-165.232.56.27 # binaryedge.ninja
-165.232.56.28 # binaryedge.ninja
-165.232.56.53 # binaryedge.ninja
-165.232.56.62 # binaryedge.ninja
-165.232.56.69 # binaryedge.ninja
-165.232.56.70 # binaryedge.ninja
-165.232.67.176 # binaryedge.ninja
-165.232.81.61 # binaryedge.ninja
-165.232.81.63 # binaryedge.ninja
-165.232.86.252 # binaryedge.ninja
-165.232.89.105 # binaryedge.ninja
-165.232.89.131 # binaryedge.ninja
-165.232.89.133 # binaryedge.ninja
-165.232.89.144 # binaryedge.ninja
-165.232.90.158 # binaryedge.ninja
-165.232.90.58 # binaryedge.ninja
-165.232.94.137 # binaryedge.ninja
-165.232.96.161 # binaryedge.ninja
-165.232.97.103 # binaryedge.ninja
-165.232.97.15 # binaryedge.ninja
-167.172.107.80 # binaryedge.ninja
-167.172.112.60 # binaryedge.ninja
-167.172.112.89 # binaryedge.ninja
-167.172.120.102 # binaryedge.ninja
-167.172.120.128 # binaryedge.ninja
-167.172.120.54 # binaryedge.ninja
-167.172.142.27 # binaryedge.ninja
-167.172.147.166 # binaryedge.ninja
-167.172.150.5 # binaryedge.ninja
-167.172.159.30 # binaryedge.ninja
-167.172.192.211 # binaryedge.ninja
-167.172.192.233 # binaryedge.ninja
-167.172.192.248 # binaryedge.ninja
-167.172.192.90 # binaryedge.ninja
-167.172.20.19 # binaryedge.ninja
-167.172.20.29 # binaryedge.ninja
-167.172.200.1 # binaryedge.ninja
-167.172.200.22 # binaryedge.ninja
-167.172.200.23 # binaryedge.ninja
-167.172.200.49 # binaryedge.ninja
-167.172.200.8 # binaryedge.ninja
-167.172.208.110 # binaryedge.ninja
-167.172.208.164 # binaryedge.ninja
-167.172.208.200 # binaryedge.ninja
-167.172.208.36 # binaryedge.ninja
-167.172.208.6 # binaryedge.ninja
-167.172.216.39 # binaryedge.ninja
-167.172.216.45 # binaryedge.ninja
-167.172.224.128 # binaryedge.ninja
-167.172.24.163 # binaryedge.ninja
-167.172.250.11 # binaryedge.ninja
-167.172.30.185 # binaryedge.ninja
-167.172.30.253 # binaryedge.ninja
-167.172.32.170 # binaryedge.ninja
-167.172.32.93 # binaryedge.ninja
-167.172.32.99 # binaryedge.ninja
-167.172.39.186 # binaryedge.ninja
-167.172.40.16 # binaryedge.ninja
-167.172.42.74 # binaryedge.ninja
-167.172.44.8 # binaryedge.ninja
-167.172.45.79 # binaryedge.ninja
-167.172.46.232 # binaryedge.ninja
-167.172.47.2 # binaryedge.ninja
-167.172.47.36 # binaryedge.ninja
-167.172.48.169 # binaryedge.ninja
-167.172.48.63 # binaryedge.ninja
-167.172.48.76 # binaryedge.ninja
-167.172.52.110 # binaryedge.ninja
-167.172.57.11 # binaryedge.ninja
-167.172.57.60 # binaryedge.ninja
-167.172.58.195 # binaryedge.ninja
-167.172.60.15 # binaryedge.ninja
-167.172.63.154 # binaryedge.ninja
-167.172.63.201 # binaryedge.ninja
-167.172.63.202 # binaryedge.ninja
-167.172.82.47 # binaryedge.ninja
-167.172.94.51 # binaryedge.ninja
-167.71.10.12 # binaryedge.ninja
-167.71.10.51 # binaryedge.ninja
-167.71.11.27 # binaryedge.ninja
-167.71.11.28 # binaryedge.ninja
-167.71.11.9 # binaryedge.ninja
-167.71.112.219 # binaryedge.ninja
-167.71.112.63 # binaryedge.ninja
-167.71.12.24 # binaryedge.ninja
-167.71.120.104 # binaryedge.ninja
-167.71.120.69 # binaryedge.ninja
-167.71.120.72 # binaryedge.ninja
-167.71.129.234 # binaryedge.ninja
-167.71.13.188 # binaryedge.ninja
-167.71.130.75 # binaryedge.ninja
-167.71.131.221 # binaryedge.ninja
-167.71.135.125 # binaryedge.ninja
-167.71.135.164 # binaryedge.ninja
-167.71.135.78 # binaryedge.ninja
-167.71.136.64 # binaryedge.ninja
-167.71.137.71 # binaryedge.ninja
-167.71.139.41 # binaryedge.ninja
-167.71.140.58 # binaryedge.ninja
-167.71.141.172 # binaryedge.ninja
-167.71.144.225 # binaryedge.ninja
-167.71.144.235 # binaryedge.ninja
-167.71.144.94 # binaryedge.ninja
-167.71.159.110 # binaryedge.ninja
-167.71.159.131 # binaryedge.ninja
-167.71.159.74 # binaryedge.ninja
-167.71.17.217 # binaryedge.ninja
-167.71.17.33 # binaryedge.ninja
-167.71.176.136 # binaryedge.ninja
-167.71.186.198 # binaryedge.ninja
-167.71.186.70 # binaryedge.ninja
-167.71.192.240 # binaryedge.ninja
-167.71.194.153 # binaryedge.ninja
-167.71.196.193 # binaryedge.ninja
-167.71.202.213 # binaryedge.ninja
-167.71.208.241 # binaryedge.ninja
-167.71.209.131 # binaryedge.ninja
-167.71.213.150 # binaryedge.ninja
-167.71.214.182 # binaryedge.ninja
-167.71.214.217 # binaryedge.ninja
-167.71.214.246 # binaryedge.ninja
-167.71.220.171 # binaryedge.ninja
-167.71.222.152 # binaryedge.ninja
-167.71.222.196 # binaryedge.ninja
-167.71.222.60 # binaryedge.ninja
-167.71.23.109 # binaryedge.ninja
-167.71.23.165 # binaryedge.ninja
-167.71.23.44 # binaryedge.ninja
-167.71.23.64 # binaryedge.ninja
-167.71.23.69 # binaryedge.ninja
-167.71.23.86 # binaryedge.ninja
-167.71.23.88 # binaryedge.ninja
-167.71.230.43 # binaryedge.ninja
-167.71.238.177 # binaryedge.ninja
-167.71.238.95 # binaryedge.ninja
-167.71.244.223 # binaryedge.ninja
-167.71.246.55 # binaryedge.ninja
-167.71.250.207 # binaryedge.ninja
-167.71.250.97 # binaryedge.ninja
-167.71.252.133 # binaryedge.ninja
-167.71.252.75 # binaryedge.ninja
-167.71.254.26 # binaryedge.ninja
-167.71.254.71 # binaryedge.ninja
-167.71.27.8 # binaryedge.ninja
-167.71.30.211 # binaryedge.ninja
-167.71.31.141 # binaryedge.ninja
-167.71.31.147 # binaryedge.ninja
-167.71.31.87 # binaryedge.ninja
-167.71.31.90 # binaryedge.ninja
-167.71.36.47 # binaryedge.ninja
-167.71.37.170 # binaryedge.ninja
-167.71.4.73 # binaryedge.ninja
-167.71.4.99 # binaryedge.ninja
-167.71.44.159 # binaryedge.ninja
-167.71.47.25 # binaryedge.ninja
-167.71.64.213 # binaryedge.ninja
-167.71.66.3 # binaryedge.ninja
-167.71.67.231 # binaryedge.ninja
-167.71.70.246 # binaryedge.ninja
-167.71.79.53 # binaryedge.ninja
-167.71.8.136 # binaryedge.ninja
-167.71.88.19 # binaryedge.ninja
-167.71.95.88 # binaryedge.ninja
-167.71.96.44 # binaryedge.ninja
-167.71.96.92 # binaryedge.ninja
-167.99.0.164 # binaryedge.ninja
-167.99.10.193 # binaryedge.ninja
-167.99.104.5 # binaryedge.ninja
-167.99.111.151 # binaryedge.ninja
-167.99.111.195 # binaryedge.ninja
-167.99.111.207 # binaryedge.ninja
-167.99.111.208 # binaryedge.ninja
-167.99.111.210 # binaryedge.ninja
-167.99.111.34 # binaryedge.ninja
-167.99.111.40 # binaryedge.ninja
-167.99.114.50 # binaryedge.ninja
-167.99.12.105 # binaryedge.ninja
-167.99.12.146 # binaryedge.ninja
-167.99.12.64 # binaryedge.ninja
-167.99.130.14 # binaryedge.ninja
-167.99.130.44 # binaryedge.ninja
-167.99.151.64 # binaryedge.ninja
-167.99.160.235 # binaryedge.ninja
-167.99.175.10 # binaryedge.ninja
-167.99.175.102 # binaryedge.ninja
-167.99.175.23 # binaryedge.ninja
-167.99.175.5 # binaryedge.ninja
-167.99.175.63 # binaryedge.ninja
-167.99.175.93 # binaryedge.ninja
-167.99.176.133 # binaryedge.ninja
-167.99.176.143 # binaryedge.ninja
-167.99.176.45 # binaryedge.ninja
-167.99.176.62 # binaryedge.ninja
-167.99.177.251 # binaryedge.ninja
-167.99.179.29 # binaryedge.ninja
-167.99.181.9 # binaryedge.ninja
-167.99.182.137 # binaryedge.ninja
-167.99.183.115 # binaryedge.ninja
-167.99.185.114 # binaryedge.ninja
-167.99.186.114 # binaryedge.ninja
-167.99.187.130 # binaryedge.ninja
-167.99.187.189 # binaryedge.ninja
-167.99.187.194 # binaryedge.ninja
-167.99.187.224 # binaryedge.ninja
-167.99.187.234 # binaryedge.ninja
-167.99.189.111 # binaryedge.ninja
-167.99.189.220 # binaryedge.ninja
-167.99.192.199 # binaryedge.ninja
-167.99.195.15 # binaryedge.ninja
-167.99.195.7 # binaryedge.ninja
-167.99.2.26 # binaryedge.ninja
-167.99.202.186 # binaryedge.ninja
-167.99.202.225 # binaryedge.ninja
-167.99.203.213 # binaryedge.ninja
-167.99.204.82 # binaryedge.ninja
-167.99.205.199 # binaryedge.ninja
-167.99.207.62 # binaryedge.ninja
-167.99.208.177 # binaryedge.ninja
-167.99.208.27 # binaryedge.ninja
-167.99.212.87 # binaryedge.ninja
-167.99.220.163 # binaryedge.ninja
-167.99.222.101 # binaryedge.ninja
-167.99.223.83 # binaryedge.ninja
-167.99.228.40 # binaryedge.ninja
-167.99.233.163 # binaryedge.ninja
-167.99.234.160 # binaryedge.ninja
-167.99.238.205 # binaryedge.ninja
-167.99.243.134 # binaryedge.ninja
-167.99.32.202 # binaryedge.ninja
-167.99.34.251 # binaryedge.ninja
-167.99.56.11 # binaryedge.ninja
-167.99.64.251 # binaryedge.ninja
-167.99.67.40 # binaryedge.ninja
-167.99.67.71 # binaryedge.ninja
-167.99.7.110 # binaryedge.ninja
-167.99.70.45 # binaryedge.ninja
-167.99.73.133 # binaryedge.ninja
-167.99.77.51 # binaryedge.ninja
-167.99.78.201 # binaryedge.ninja
-167.99.80.152 # binaryedge.ninja
-167.99.85.121 # binaryedge.ninja
-167.99.85.137 # binaryedge.ninja
-167.99.85.168 # binaryedge.ninja
-167.99.88.40 # binaryedge.ninja
-167.99.89.143 # binaryedge.ninja
-167.99.92.9 # binaryedge.ninja
-167.99.94.84 # binaryedge.ninja
-167.99.96.147 # binaryedge.ninja
-167.99.96.15 # binaryedge.ninja
-167.99.96.152 # binaryedge.ninja
-167.99.96.156 # binaryedge.ninja
-167.99.96.228 # binaryedge.ninja
-167.99.96.48 # binaryedge.ninja
-167.99.96.51 # binaryedge.ninja
-167.99.96.63 # binaryedge.ninja
-170.187.152.204 # binaryedge.ninja
-170.187.152.232 # binaryedge.ninja
-170.187.152.41 # binaryedge.ninja
-170.187.155.26 # binaryedge.ninja
-170.187.179.96 # binaryedge.ninja
-170.187.181.104 # binaryedge.ninja
-170.187.181.118 # binaryedge.ninja
-170.187.181.12 # binaryedge.ninja
-170.187.181.192 # binaryedge.ninja
-170.187.181.59 # binaryedge.ninja
-170.187.181.86 # binaryedge.ninja
-170.187.181.99 # binaryedge.ninja
-170.187.189.124 # binaryedge.ninja
-170.187.189.190 # binaryedge.ninja
-170.187.189.208 # binaryedge.ninja
-170.187.189.235 # binaryedge.ninja
-170.187.189.246 # binaryedge.ninja
-170.187.189.41 # binaryedge.ninja
-170.187.189.59 # binaryedge.ninja
-170.187.189.64 # binaryedge.ninja
-170.187.193.101 # binaryedge.ninja
-170.187.193.106 # binaryedge.ninja
-170.187.193.12 # binaryedge.ninja
-170.187.193.146 # binaryedge.ninja
-170.187.193.158 # binaryedge.ninja
-170.187.193.167 # binaryedge.ninja
-170.187.193.186 # binaryedge.ninja
-170.187.193.224 # binaryedge.ninja
-170.187.193.237 # binaryedge.ninja
-170.187.193.44 # binaryedge.ninja
-170.187.193.64 # binaryedge.ninja
-170.187.193.67 # binaryedge.ninja
-170.187.193.76 # binaryedge.ninja
-170.187.193.77 # binaryedge.ninja
-170.187.193.8 # binaryedge.ninja
-170.187.193.98 # binaryedge.ninja
-170.187.202.37 # binaryedge.ninja
-170.187.202.4 # binaryedge.ninja
-170.187.202.51 # binaryedge.ninja
-170.187.206.138 # binaryedge.ninja
-170.187.206.51 # binaryedge.ninja
-170.187.227.157 # binaryedge.ninja
-170.187.227.98 # binaryedge.ninja
-170.187.228.234 # binaryedge.ninja
-170.187.228.53 # binaryedge.ninja
-170.187.230.188 # binaryedge.ninja
-170.64.129.161 # binaryedge.ninja
-170.64.129.200 # binaryedge.ninja
-170.64.129.204 # binaryedge.ninja
-170.64.130.35 # binaryedge.ninja
-170.64.134.144 # binaryedge.ninja
-170.64.137.99 # binaryedge.ninja
-170.64.138.43 # binaryedge.ninja
-170.64.141.11 # binaryedge.ninja
-170.64.141.62 # binaryedge.ninja
-170.64.141.66 # binaryedge.ninja
-170.64.141.67 # binaryedge.ninja
-170.64.141.68 # binaryedge.ninja
-170.64.141.8 # binaryedge.ninja
-170.64.142.46 # binaryedge.ninja
-170.64.142.61 # binaryedge.ninja
-170.64.145.195 # binaryedge.ninja
-170.64.145.204 # binaryedge.ninja
-170.64.149.102 # binaryedge.ninja
-170.64.149.121 # binaryedge.ninja
-170.64.149.139 # binaryedge.ninja
-170.64.149.140 # binaryedge.ninja
-170.64.149.148 # binaryedge.ninja
-170.64.149.157 # binaryedge.ninja
-170.64.149.51 # binaryedge.ninja
-170.64.153.100 # binaryedge.ninja
-170.64.153.221 # binaryedge.ninja
-170.64.153.222 # binaryedge.ninja
-170.64.153.86 # binaryedge.ninja
-170.64.153.91 # binaryedge.ninja
-170.64.154.77 # binaryedge.ninja
-170.64.161.118 # binaryedge.ninja
-170.64.162.44 # binaryedge.ninja
-170.64.165.211 # binaryedge.ninja
-170.64.165.212 # binaryedge.ninja
-170.64.165.214 # binaryedge.ninja
-170.64.165.221 # binaryedge.ninja
-170.64.166.50 # binaryedge.ninja
-170.64.168.108 # binaryedge.ninja
-170.64.169.166 # binaryedge.ninja
-170.64.169.190 # binaryedge.ninja
-170.64.171.102 # binaryedge.ninja
-170.64.171.121 # binaryedge.ninja
-170.64.171.122 # binaryedge.ninja
-170.64.171.13 # binaryedge.ninja
-170.64.171.66 # binaryedge.ninja
-170.64.171.76 # binaryedge.ninja
-170.64.173.88 # binaryedge.ninja
-170.64.174.223 # binaryedge.ninja
-170.64.175.154 # binaryedge.ninja
-170.64.175.156 # binaryedge.ninja
-170.64.175.22 # binaryedge.ninja
-170.64.175.220 # binaryedge.ninja
-170.64.175.224 # binaryedge.ninja
-170.64.175.234 # binaryedge.ninja
-170.64.175.251 # binaryedge.ninja
-170.64.175.252 # binaryedge.ninja
-170.64.177.21 # binaryedge.ninja
-170.64.179.125 # binaryedge.ninja
-170.64.181.21 # binaryedge.ninja
-170.64.181.51 # binaryedge.ninja
-170.64.181.70 # binaryedge.ninja
-170.64.185.57 # binaryedge.ninja
-170.64.186.184 # binaryedge.ninja
-170.64.187.62 # binaryedge.ninja
-170.64.187.76 # binaryedge.ninja
-170.64.187.77 # binaryedge.ninja
-170.64.187.80 # binaryedge.ninja
-170.64.189.148 # binaryedge.ninja
-170.64.189.152 # binaryedge.ninja
-170.64.189.193 # binaryedge.ninja
-170.64.189.69 # binaryedge.ninja
-170.64.190.213 # binaryedge.ninja
-170.64.191.188 # binaryedge.ninja
-172.104.105.156 # binaryedge.ninja
-172.104.105.160 # binaryedge.ninja
-172.104.118.120 # binaryedge.ninja
-172.104.118.137 # binaryedge.ninja
-172.104.118.214 # binaryedge.ninja
-172.104.169.115 # binaryedge.ninja
-172.104.169.149 # binaryedge.ninja
-172.104.169.202 # binaryedge.ninja
-172.104.169.208 # binaryedge.ninja
-172.104.169.228 # binaryedge.ninja
-172.104.169.246 # binaryedge.ninja
-172.104.169.248 # binaryedge.ninja
-172.104.169.52 # binaryedge.ninja
-172.104.17.198 # binaryedge.ninja
-172.104.17.34 # binaryedge.ninja
-172.104.17.50 # binaryedge.ninja
-172.104.17.67 # binaryedge.ninja
-172.104.17.68 # binaryedge.ninja
-172.104.17.81 # binaryedge.ninja
-172.104.170.185 # binaryedge.ninja
-172.104.170.249 # binaryedge.ninja
-172.104.170.64 # binaryedge.ninja
-172.104.185.129 # binaryedge.ninja
-172.104.185.61 # binaryedge.ninja
-172.104.188.244 # binaryedge.ninja
-172.104.19.129 # binaryedge.ninja
-172.104.190.83 # binaryedge.ninja
-172.104.208.69 # binaryedge.ninja
-172.104.209.182 # binaryedge.ninja
-172.104.209.219 # binaryedge.ninja
-172.104.209.27 # binaryedge.ninja
-172.104.209.68 # binaryedge.ninja
-172.104.217.224 # binaryedge.ninja
-172.104.217.82 # binaryedge.ninja
-172.104.22.180 # binaryedge.ninja
-172.104.22.191 # binaryedge.ninja
-172.104.22.210 # binaryedge.ninja
-172.104.22.4 # binaryedge.ninja
-172.104.22.50 # binaryedge.ninja
-172.104.22.78 # binaryedge.ninja
-172.104.224.20 # binaryedge.ninja
-172.104.23.105 # binaryedge.ninja
-172.104.23.126 # binaryedge.ninja
-172.104.23.156 # binaryedge.ninja
-172.104.23.201 # binaryedge.ninja
-172.104.23.249 # binaryedge.ninja
-172.104.23.63 # binaryedge.ninja
-172.104.244.71 # binaryedge.ninja
-172.104.25.27 # binaryedge.ninja
-172.104.25.32 # binaryedge.ninja
-172.104.25.62 # binaryedge.ninja
-172.104.25.69 # binaryedge.ninja
-172.104.31.230 # binaryedge.ninja
-172.104.31.247 # binaryedge.ninja
-172.104.31.42 # binaryedge.ninja
-172.104.32.217 # binaryedge.ninja
-172.104.4.107 # binaryedge.ninja
-172.104.44.137 # binaryedge.ninja
-172.104.61.168 # binaryedge.ninja
-172.104.61.212 # binaryedge.ninja
-172.104.61.23 # binaryedge.ninja
-172.104.61.237 # binaryedge.ninja
-172.104.61.242 # binaryedge.ninja
-172.104.78.83 # binaryedge.ninja
-172.104.8.100 # binaryedge.ninja
-172.104.8.161 # binaryedge.ninja
-172.104.8.173 # binaryedge.ninja
-172.104.8.201 # binaryedge.ninja
-172.104.8.202 # binaryedge.ninja
-172.104.8.29 # binaryedge.ninja
-172.104.8.31 # binaryedge.ninja
-172.104.83.96 # binaryedge.ninja
-172.105.104.101 # binaryedge.ninja
-172.105.104.128 # binaryedge.ninja
-172.105.104.134 # binaryedge.ninja
-172.105.104.14 # binaryedge.ninja
-172.105.104.15 # binaryedge.ninja
-172.105.104.169 # binaryedge.ninja
-172.105.104.176 # binaryedge.ninja
-172.105.104.178 # binaryedge.ninja
-172.105.104.190 # binaryedge.ninja
-172.105.104.199 # binaryedge.ninja
-172.105.104.200 # binaryedge.ninja
-172.105.104.213 # binaryedge.ninja
-172.105.104.214 # binaryedge.ninja
-172.105.104.236 # binaryedge.ninja
-172.105.104.31 # binaryedge.ninja
-172.105.104.59 # binaryedge.ninja
-172.105.110.10 # binaryedge.ninja
-172.105.110.101 # binaryedge.ninja
-172.105.110.102 # binaryedge.ninja
-172.105.110.112 # binaryedge.ninja
-172.105.110.117 # binaryedge.ninja
-172.105.110.120 # binaryedge.ninja
-172.105.110.123 # binaryedge.ninja
-172.105.110.126 # binaryedge.ninja
-172.105.110.134 # binaryedge.ninja
-172.105.110.135 # binaryedge.ninja
-172.105.110.140 # binaryedge.ninja
-172.105.110.144 # binaryedge.ninja
-172.105.110.151 # binaryedge.ninja
-172.105.110.175 # binaryedge.ninja
-172.105.110.178 # binaryedge.ninja
-172.105.110.186 # binaryedge.ninja
-172.105.110.19 # binaryedge.ninja
-172.105.110.192 # binaryedge.ninja
-172.105.110.193 # binaryedge.ninja
-172.105.110.199 # binaryedge.ninja
-172.105.110.210 # binaryedge.ninja
-172.105.110.211 # binaryedge.ninja
-172.105.110.23 # binaryedge.ninja
-172.105.110.26 # binaryedge.ninja
-172.105.110.32 # binaryedge.ninja
-172.105.110.51 # binaryedge.ninja
-172.105.110.63 # binaryedge.ninja
-172.105.110.69 # binaryedge.ninja
-172.105.110.73 # binaryedge.ninja
-172.105.110.9 # binaryedge.ninja
-172.105.110.90 # binaryedge.ninja
-172.105.112.96 # binaryedge.ninja
-172.105.115.245 # binaryedge.ninja
-172.105.125.233 # binaryedge.ninja
-172.105.125.5 # binaryedge.ninja
-172.105.125.59 # binaryedge.ninja
-172.105.125.67 # binaryedge.ninja
-172.105.130.153 # binaryedge.ninja
-172.105.130.212 # binaryedge.ninja
-172.105.130.59 # binaryedge.ninja
-172.105.139.68 # binaryedge.ninja
-172.105.152.19 # binaryedge.ninja
-172.105.152.239 # binaryedge.ninja
-172.105.152.80 # binaryedge.ninja
-172.105.156.231 # binaryedge.ninja
-172.105.162.178 # binaryedge.ninja
-172.105.162.193 # binaryedge.ninja
-172.105.177.116 # binaryedge.ninja
-172.105.177.136 # binaryedge.ninja
-172.105.177.15 # binaryedge.ninja
-172.105.177.171 # binaryedge.ninja
-172.105.178.198 # binaryedge.ninja
-172.105.178.201 # binaryedge.ninja
-172.105.184.109 # binaryedge.ninja
-172.105.184.173 # binaryedge.ninja
-172.105.184.185 # binaryedge.ninja
-172.105.184.187 # binaryedge.ninja
-172.105.184.202 # binaryedge.ninja
-172.105.184.211 # binaryedge.ninja
-172.105.184.225 # binaryedge.ninja
-172.105.184.41 # binaryedge.ninja
-172.105.184.57 # binaryedge.ninja
-172.105.184.83 # binaryedge.ninja
-172.105.190.170 # binaryedge.ninja
-172.105.191.235 # binaryedge.ninja
-172.105.191.28 # binaryedge.ninja
-172.105.201.13 # binaryedge.ninja
-172.105.203.171 # binaryedge.ninja
-172.105.209.109 # binaryedge.ninja
-172.105.21.123 # binaryedge.ninja
-172.105.255.66 # binaryedge.ninja
-172.105.27.130 # binaryedge.ninja
-172.105.27.132 # binaryedge.ninja
-172.105.27.174 # binaryedge.ninja
-172.105.30.26 # binaryedge.ninja
-172.105.34.125 # binaryedge.ninja
-172.105.34.146 # binaryedge.ninja
-172.105.34.155 # binaryedge.ninja
-172.105.34.179 # binaryedge.ninja
-172.105.34.190 # binaryedge.ninja
-172.105.34.210 # binaryedge.ninja
-172.105.34.238 # binaryedge.ninja
-172.105.34.243 # binaryedge.ninja
-172.105.34.7 # binaryedge.ninja
-172.105.4.109 # binaryedge.ninja
-172.105.4.160 # binaryedge.ninja
-172.105.4.18 # binaryedge.ninja
-172.105.4.198 # binaryedge.ninja
-172.105.49.223 # binaryedge.ninja
-172.105.56.30 # binaryedge.ninja
-172.105.77.175 # binaryedge.ninja
-172.105.8.19 # binaryedge.ninja
-172.105.8.20 # binaryedge.ninja
-172.105.8.6 # binaryedge.ninja
-172.105.98.129 # binaryedge.ninja
-172.105.98.133 # binaryedge.ninja
-172.105.98.137 # binaryedge.ninja
-172.105.98.144 # binaryedge.ninja
-172.105.98.150 # binaryedge.ninja
-172.105.98.156 # binaryedge.ninja
-172.105.98.165 # binaryedge.ninja
-172.105.98.240 # binaryedge.ninja
-172.105.98.32 # binaryedge.ninja
-172.105.98.43 # binaryedge.ninja
-172.105.98.54 # binaryedge.ninja
-173.230.140.140 # binaryedge.ninja
-173.230.140.21 # binaryedge.ninja
-173.230.140.245 # binaryedge.ninja
-173.230.140.31 # binaryedge.ninja
-173.230.140.35 # binaryedge.ninja
-173.230.140.39 # binaryedge.ninja
-173.230.140.43 # binaryedge.ninja
-173.230.140.47 # binaryedge.ninja
-173.230.140.51 # binaryedge.ninja
-173.230.140.52 # binaryedge.ninja
-173.230.141.111 # binaryedge.ninja
-173.230.141.138 # binaryedge.ninja
-173.230.141.86 # binaryedge.ninja
-173.230.148.183 # binaryedge.ninja
-173.230.148.32 # binaryedge.ninja
-173.230.152.114 # binaryedge.ninja
-173.230.152.122 # binaryedge.ninja
-173.230.152.132 # binaryedge.ninja
-173.230.152.19 # binaryedge.ninja
-173.230.152.217 # binaryedge.ninja
-173.230.152.246 # binaryedge.ninja
-173.230.152.253 # binaryedge.ninja
-173.230.152.61 # binaryedge.ninja
-173.230.155.47 # binaryedge.ninja
-173.255.194.144 # binaryedge.ninja
-173.255.202.131 # binaryedge.ninja
-173.255.202.18 # binaryedge.ninja
-173.255.208.106 # binaryedge.ninja
-173.255.208.12 # binaryedge.ninja
-173.255.208.173 # binaryedge.ninja
-173.255.208.20 # binaryedge.ninja
-173.255.208.67 # binaryedge.ninja
-173.255.211.75 # binaryedge.ninja
-173.255.214.25 # binaryedge.ninja
-173.255.216.185 # binaryedge.ninja
-173.255.216.228 # binaryedge.ninja
-173.255.216.59 # binaryedge.ninja
-173.255.218.211 # binaryedge.ninja
-173.255.219.130 # binaryedge.ninja
-173.255.219.143 # binaryedge.ninja
-173.255.224.10 # binaryedge.ninja
-173.255.224.164 # binaryedge.ninja
-173.255.224.34 # binaryedge.ninja
-173.255.230.115 # binaryedge.ninja
-173.255.237.11 # binaryedge.ninja
-173.255.237.57 # binaryedge.ninja
-173.255.238.175 # binaryedge.ninja
-173.255.238.208 # binaryedge.ninja
-173.255.238.32 # binaryedge.ninja
-173.255.238.67 # binaryedge.ninja
-173.255.241.231 # binaryedge.ninja
-173.255.241.60 # binaryedge.ninja
-173.255.243.64 # binaryedge.ninja
-173.255.250.88 # binaryedge.ninja
-173.255.252.107 # binaryedge.ninja
-173.255.252.16 # binaryedge.ninja
-174.138.10.206 # binaryedge.ninja
-174.138.10.74 # binaryedge.ninja
-174.138.12.136 # binaryedge.ninja
-174.138.13.237 # binaryedge.ninja
-174.138.2.177 # binaryedge.ninja
-174.138.3.73 # binaryedge.ninja
-174.138.34.82 # binaryedge.ninja
-174.138.34.94 # binaryedge.ninja
-174.138.40.79 # binaryedge.ninja
-174.138.6.246 # binaryedge.ninja
-174.138.64.153 # binaryedge.ninja
-174.138.8.155 # binaryedge.ninja
-174.138.8.242 # binaryedge.ninja
-174.138.88.19 # binaryedge.ninja
-174.138.88.44 # binaryedge.ninja
-176.58.101.22 # binaryedge.ninja
-176.58.101.6 # binaryedge.ninja
-176.58.102.47 # binaryedge.ninja
-176.58.102.74 # binaryedge.ninja
-176.58.114.113 # binaryedge.ninja
-176.58.115.12 # binaryedge.ninja
-176.58.115.129 # binaryedge.ninja
-176.58.115.152 # binaryedge.ninja
-176.58.115.249 # binaryedge.ninja
-176.58.117.103 # binaryedge.ninja
-176.58.117.115 # binaryedge.ninja
-176.58.117.179 # binaryedge.ninja
-176.58.117.32 # binaryedge.ninja
-176.58.121.208 # binaryedge.ninja
-176.58.121.90 # binaryedge.ninja
-176.58.125.116 # binaryedge.ninja
-176.58.125.29 # binaryedge.ninja
-176.58.96.32 # binaryedge.ninja
-178.128.0.121 # binaryedge.ninja
-178.128.0.211 # binaryedge.ninja
-178.128.0.233 # binaryedge.ninja
-178.128.0.52 # binaryedge.ninja
-178.128.101.128 # binaryedge.ninja
-178.128.103.118 # binaryedge.ninja
-178.128.103.19 # binaryedge.ninja
-178.128.108.116 # binaryedge.ninja
-178.128.120.115 # binaryedge.ninja
-178.128.124.67 # binaryedge.ninja
-178.128.145.129 # binaryedge.ninja
-178.128.146.84 # binaryedge.ninja
-178.128.148.200 # binaryedge.ninja
-178.128.15.119 # binaryedge.ninja
-178.128.15.92 # binaryedge.ninja
-178.128.151.160 # binaryedge.ninja
-178.128.156.229 # binaryedge.ninja
-178.128.161.68 # binaryedge.ninja
-178.128.166.210 # binaryedge.ninja
-178.128.168.126 # binaryedge.ninja
-178.128.168.83 # binaryedge.ninja
-178.128.17.87 # binaryedge.ninja
-178.128.176.108 # binaryedge.ninja
-178.128.191.21 # binaryedge.ninja
-178.128.191.61 # binaryedge.ninja
-178.128.191.70 # binaryedge.ninja
-178.128.192.199 # binaryedge.ninja
-178.128.197.238 # binaryedge.ninja
-178.128.204.16 # binaryedge.ninja
-178.128.204.246 # binaryedge.ninja
-178.128.209.46 # binaryedge.ninja
-178.128.212.61 # binaryedge.ninja
-178.128.216.233 # binaryedge.ninja
-178.128.222.73 # binaryedge.ninja
-178.128.224.150 # binaryedge.ninja
-178.128.224.171 # binaryedge.ninja
-178.128.224.36 # binaryedge.ninja
-178.128.225.19 # binaryedge.ninja
-178.128.225.210 # binaryedge.ninja
-178.128.225.229 # binaryedge.ninja
-178.128.225.28 # binaryedge.ninja
-178.128.225.87 # binaryedge.ninja
-178.128.226.108 # binaryedge.ninja
-178.128.226.39 # binaryedge.ninja
-178.128.227.204 # binaryedge.ninja
-178.128.227.50 # binaryedge.ninja
-178.128.229.239 # binaryedge.ninja
-178.128.229.67 # binaryedge.ninja
-178.128.232.69 # binaryedge.ninja
-178.128.233.127 # binaryedge.ninja
-178.128.234.19 # binaryedge.ninja
-178.128.235.122 # binaryedge.ninja
-178.128.235.152 # binaryedge.ninja
-178.128.236.69 # binaryedge.ninja
-178.128.237.220 # binaryedge.ninja
-178.128.238.56 # binaryedge.ninja
-178.128.239.4 # binaryedge.ninja
-178.128.24.116 # binaryedge.ninja
-178.128.241.246 # binaryedge.ninja
-178.128.248.172 # binaryedge.ninja
-178.128.248.89 # binaryedge.ninja
-178.128.249.47 # binaryedge.ninja
-178.128.249.64 # binaryedge.ninja
-178.128.254.243 # binaryedge.ninja
-178.128.255.225 # binaryedge.ninja
-178.128.32.21 # binaryedge.ninja
-178.128.32.75 # binaryedge.ninja
-178.128.33.144 # binaryedge.ninja
-178.128.34.33 # binaryedge.ninja
-178.128.40.216 # binaryedge.ninja
-178.128.41.135 # binaryedge.ninja
-178.128.42.127 # binaryedge.ninja
-178.128.42.7 # binaryedge.ninja
-178.128.43.180 # binaryedge.ninja
-178.128.44.99 # binaryedge.ninja
-178.128.47.246 # binaryedge.ninja
-178.128.50.135 # binaryedge.ninja
-178.128.53.116 # binaryedge.ninja
-178.128.54.129 # binaryedge.ninja
-178.128.63.228 # binaryedge.ninja
-178.128.64.110 # binaryedge.ninja
-178.128.64.157 # binaryedge.ninja
-178.128.64.158 # binaryedge.ninja
-178.128.64.83 # binaryedge.ninja
-178.128.79.100 # binaryedge.ninja
-178.128.79.50 # binaryedge.ninja
-178.128.79.93 # binaryedge.ninja
-178.128.85.27 # binaryedge.ninja
-178.128.91.168 # binaryedge.ninja
-178.128.93.18 # binaryedge.ninja
-178.128.93.234 # binaryedge.ninja
-178.128.93.34 # binaryedge.ninja
-178.128.93.64 # binaryedge.ninja
-178.128.95.171 # binaryedge.ninja
-178.128.97.197 # binaryedge.ninja
-178.62.1.174 # binaryedge.ninja
-178.62.1.182 # binaryedge.ninja
-178.62.103.105 # binaryedge.ninja
-178.62.14.63 # binaryedge.ninja
-178.62.15.127 # binaryedge.ninja
-178.62.16.4 # binaryedge.ninja
-178.62.18.222 # binaryedge.ninja
-178.62.195.166 # binaryedge.ninja
-178.62.195.192 # binaryedge.ninja
-178.62.196.144 # binaryedge.ninja
-178.62.196.175 # binaryedge.ninja
-178.62.198.131 # binaryedge.ninja
-178.62.199.157 # binaryedge.ninja
-178.62.2.20 # binaryedge.ninja
-178.62.202.164 # binaryedge.ninja
-178.62.202.173 # binaryedge.ninja
-178.62.207.110 # binaryedge.ninja
-178.62.209.27 # binaryedge.ninja
-178.62.209.28 # binaryedge.ninja
-178.62.3.94 # binaryedge.ninja
-178.62.4.44 # binaryedge.ninja
-178.62.65.119 # binaryedge.ninja
-178.62.69.246 # binaryedge.ninja
-178.62.78.102 # binaryedge.ninja
-178.62.79.241 # binaryedge.ninja
-178.62.80.176 # binaryedge.ninja
-178.79.128.102 # binaryedge.ninja
-178.79.129.190 # binaryedge.ninja
-178.79.129.194 # binaryedge.ninja
-178.79.138.117 # binaryedge.ninja
-178.79.138.214 # binaryedge.ninja
-178.79.139.176 # binaryedge.ninja
-178.79.139.191 # binaryedge.ninja
-178.79.162.218 # binaryedge.ninja
-178.79.174.122 # binaryedge.ninja
-178.79.174.6 # binaryedge.ninja
-178.79.174.78 # binaryedge.ninja
-178.79.176.189 # binaryedge.ninja
-178.79.176.202 # binaryedge.ninja
-178.79.178.193 # binaryedge.ninja
-178.79.178.37 # binaryedge.ninja
-178.79.178.56 # binaryedge.ninja
-178.79.181.10 # binaryedge.ninja
-178.79.181.234 # binaryedge.ninja
-178.79.185.160 # binaryedge.ninja
-178.79.185.221 # binaryedge.ninja
-188.166.124.78 # binaryedge.ninja
-188.166.150.184 # binaryedge.ninja
-188.166.154.115 # binaryedge.ninja
-188.166.155.12 # binaryedge.ninja
-188.166.156.144 # binaryedge.ninja
-188.166.158.136 # binaryedge.ninja
-188.166.159.1 # binaryedge.ninja
-188.166.165.242 # binaryedge.ninja
-188.166.168.154 # binaryedge.ninja
-188.166.171.164 # binaryedge.ninja
-188.166.175.36 # binaryedge.ninja
-188.166.184.165 # binaryedge.ninja
-188.166.2.114 # binaryedge.ninja
-188.166.210.17 # binaryedge.ninja
-188.166.215.186 # binaryedge.ninja
-188.166.225.131 # binaryedge.ninja
-188.166.226.0 # binaryedge.ninja
-188.166.230.179 # binaryedge.ninja
-188.166.230.58 # binaryedge.ninja
-188.166.233.5 # binaryedge.ninja
-188.166.241.97 # binaryedge.ninja
-188.166.248.255 # binaryedge.ninja
-188.166.248.88 # binaryedge.ninja
-188.166.28.138 # binaryedge.ninja
-188.166.4.192 # binaryedge.ninja
-188.166.5.31 # binaryedge.ninja
-188.166.64.219 # binaryedge.ninja
-188.166.65.159 # binaryedge.ninja
-188.166.66.149 # binaryedge.ninja
-188.166.7.32 # binaryedge.ninja
-188.166.7.87 # binaryedge.ninja
-188.166.71.94 # binaryedge.ninja
-188.166.75.57 # binaryedge.ninja
-188.166.77.208 # binaryedge.ninja
-188.166.80.13 # binaryedge.ninja
-188.166.91.136 # binaryedge.ninja
-192.155.80.147 # binaryedge.ninja
-192.155.80.148 # binaryedge.ninja
-192.155.80.170 # binaryedge.ninja
-192.155.82.169 # binaryedge.ninja
-192.155.82.77 # binaryedge.ninja
-192.155.84.228 # binaryedge.ninja
-192.155.84.253 # binaryedge.ninja
-192.155.84.28 # binaryedge.ninja
-192.155.85.145 # binaryedge.ninja
-192.155.87.130 # binaryedge.ninja
-192.155.87.146 # binaryedge.ninja
-192.155.87.200 # binaryedge.ninja
-192.155.87.206 # binaryedge.ninja
-192.155.87.224 # binaryedge.ninja
-192.155.87.37 # binaryedge.ninja
-192.155.87.6 # binaryedge.ninja
-192.155.87.72 # binaryedge.ninja
-192.155.89.111 # binaryedge.ninja
-192.155.89.205 # binaryedge.ninja
-192.155.89.42 # binaryedge.ninja
-192.155.89.87 # binaryedge.ninja
-192.155.89.96 # binaryedge.ninja
-192.155.95.148 # binaryedge.ninja
-192.155.95.181 # binaryedge.ninja
-192.155.95.194 # binaryedge.ninja
-192.155.95.229 # binaryedge.ninja
-192.155.95.247 # binaryedge.ninja
-192.155.95.33 # binaryedge.ninja
-192.155.95.44 # binaryedge.ninja
-192.155.95.46 # binaryedge.ninja
-192.155.95.64 # binaryedge.ninja
-192.155.95.93 # binaryedge.ninja
-192.241.138.34 # binaryedge.ninja
-192.241.140.112 # binaryedge.ninja
-192.241.140.73 # binaryedge.ninja
-192.241.140.9 # binaryedge.ninja
-192.241.145.148 # binaryedge.ninja
-192.241.147.164 # binaryedge.ninja
-192.241.148.40 # binaryedge.ninja
-192.241.157.232 # binaryedge.ninja
-192.34.58.249 # binaryedge.ninja
-192.34.61.106 # binaryedge.ninja
-192.46.220.104 # binaryedge.ninja
-192.46.220.18 # binaryedge.ninja
-192.46.220.208 # binaryedge.ninja
-192.46.220.222 # binaryedge.ninja
-192.46.220.29 # binaryedge.ninja
-192.46.221.147 # binaryedge.ninja
-192.46.222.137 # binaryedge.ninja
-192.46.222.171 # binaryedge.ninja
-192.46.222.179 # binaryedge.ninja
-192.46.222.213 # binaryedge.ninja
-192.46.222.224 # binaryedge.ninja
-192.46.222.97 # binaryedge.ninja
-192.46.234.63 # binaryedge.ninja
-192.53.112.89 # binaryedge.ninja
-192.53.123.112 # binaryedge.ninja
-192.53.123.133 # binaryedge.ninja
-192.53.123.152 # binaryedge.ninja
-192.53.123.183 # binaryedge.ninja
-192.53.123.184 # binaryedge.ninja
-192.53.123.185 # binaryedge.ninja
-192.53.123.199 # binaryedge.ninja
-192.53.123.236 # binaryedge.ninja
-192.53.123.42 # binaryedge.ninja
-192.53.123.48 # binaryedge.ninja
-192.53.123.55 # binaryedge.ninja
-192.53.123.77 # binaryedge.ninja
-192.53.123.89 # binaryedge.ninja
-192.53.123.94 # binaryedge.ninja
-192.53.163.133 # binaryedge.ninja
-192.53.163.183 # binaryedge.ninja
-192.53.163.198 # binaryedge.ninja
-192.53.163.243 # binaryedge.ninja
-192.53.163.73 # binaryedge.ninja
-192.53.163.78 # binaryedge.ninja
-192.53.163.91 # binaryedge.ninja
-192.53.168.167 # binaryedge.ninja
-192.53.171.22 # binaryedge.ninja
-192.53.171.26 # binaryedge.ninja
-192.53.171.54 # binaryedge.ninja
-192.53.171.59 # binaryedge.ninja
-192.53.171.8 # binaryedge.ninja
-192.81.129.224 # binaryedge.ninja
-192.81.133.105 # binaryedge.ninja
-192.81.133.143 # binaryedge.ninja
-192.81.133.159 # binaryedge.ninja
-192.81.133.59 # binaryedge.ninja
-192.81.216.228 # binaryedge.ninja
-192.81.217.207 # binaryedge.ninja
-194.195.114.114 # binaryedge.ninja
-194.195.114.122 # binaryedge.ninja
-194.195.114.155 # binaryedge.ninja
-194.195.114.156 # binaryedge.ninja
-194.195.114.160 # binaryedge.ninja
-194.195.114.166 # binaryedge.ninja
-194.195.114.44 # binaryedge.ninja
-194.195.114.59 # binaryedge.ninja
-194.195.114.77 # binaryedge.ninja
-194.195.116.114 # binaryedge.ninja
-194.195.127.219 # binaryedge.ninja
-194.195.127.99 # binaryedge.ninja
-194.195.212.12 # binaryedge.ninja
-194.195.212.153 # binaryedge.ninja
-194.195.212.164 # binaryedge.ninja
-194.195.212.213 # binaryedge.ninja
-194.195.212.54 # binaryedge.ninja
-194.195.216.207 # binaryedge.ninja
-194.195.216.64 # binaryedge.ninja
-194.195.216.68 # binaryedge.ninja
-194.195.251.89 # binaryedge.ninja
-194.233.160.105 # binaryedge.ninja
-194.233.160.114 # binaryedge.ninja
-194.233.160.123 # binaryedge.ninja
-194.233.160.127 # binaryedge.ninja
-194.233.160.144 # binaryedge.ninja
-194.233.160.58 # binaryedge.ninja
-194.233.160.73 # binaryedge.ninja
-198.199.68.101 # binaryedge.ninja
-198.199.71.189 # binaryedge.ninja
-198.199.75.93 # binaryedge.ninja
-198.199.91.211 # binaryedge.ninja
-198.211.109.194 # binaryedge.ninja
-198.211.113.19 # binaryedge.ninja
-198.58.101.230 # binaryedge.ninja
-198.58.104.162 # binaryedge.ninja
-198.58.104.244 # binaryedge.ninja
-198.58.105.15 # binaryedge.ninja
-198.58.105.192 # binaryedge.ninja
-198.58.105.252 # binaryedge.ninja
-198.58.105.95 # binaryedge.ninja
-198.58.118.214 # binaryedge.ninja
-198.58.118.56 # binaryedge.ninja
-198.58.119.159 # binaryedge.ninja
-198.58.99.63 # binaryedge.ninja
-198.58.99.84 # binaryedge.ninja
-198.74.49.170 # binaryedge.ninja
-198.74.49.219 # binaryedge.ninja
-198.74.50.143 # binaryedge.ninja
-198.74.50.182 # binaryedge.ninja
-198.74.50.187 # binaryedge.ninja
-198.74.50.92 # binaryedge.ninja
-198.74.51.24 # binaryedge.ninja
-198.74.51.30 # binaryedge.ninja
-198.74.51.6 # binaryedge.ninja
-198.74.51.60 # binaryedge.ninja
-198.74.51.87 # binaryedge.ninja
-198.74.51.97 # binaryedge.ninja
-198.74.60.178 # binaryedge.ninja
-198.74.60.222 # binaryedge.ninja
-198.74.60.240 # binaryedge.ninja
-204.48.22.201 # binaryedge.ninja
-204.48.30.121 # binaryedge.ninja
-206.189.0.244 # binaryedge.ninja
-206.189.100.154 # binaryedge.ninja
-206.189.102.153 # binaryedge.ninja
-206.189.102.9 # binaryedge.ninja
-206.189.103.83 # binaryedge.ninja
-206.189.105.160 # binaryedge.ninja
-206.189.107.234 # binaryedge.ninja
-206.189.108.157 # binaryedge.ninja
-206.189.108.48 # binaryedge.ninja
-206.189.110.237 # binaryedge.ninja
-206.189.113.167 # binaryedge.ninja
-206.189.113.249 # binaryedge.ninja
-206.189.114.112 # binaryedge.ninja
-206.189.114.18 # binaryedge.ninja
-206.189.114.4 # binaryedge.ninja
-206.189.116.127 # binaryedge.ninja
-206.189.117.121 # binaryedge.ninja
-206.189.117.254 # binaryedge.ninja
-206.189.117.90 # binaryedge.ninja
-206.189.120.65 # binaryedge.ninja
-206.189.121.107 # binaryedge.ninja
-206.189.121.241 # binaryedge.ninja
-206.189.123.59 # binaryedge.ninja
-206.189.124.197 # binaryedge.ninja
-206.189.125.242 # binaryedge.ninja
-206.189.130.53 # binaryedge.ninja
-206.189.147.106 # binaryedge.ninja
-206.189.15.155 # binaryedge.ninja
-206.189.15.190 # binaryedge.ninja
-206.189.157.176 # binaryedge.ninja
-206.189.16.245 # binaryedge.ninja
-206.189.160.83 # binaryedge.ninja
-206.189.160.88 # binaryedge.ninja
-206.189.17.166 # binaryedge.ninja
-206.189.175.98 # binaryedge.ninja
-206.189.178.20 # binaryedge.ninja
-206.189.178.226 # binaryedge.ninja
-206.189.18.182 # binaryedge.ninja
-206.189.182.228 # binaryedge.ninja
-206.189.185.66 # binaryedge.ninja
-206.189.195.65 # binaryedge.ninja
-206.189.196.231 # binaryedge.ninja
-206.189.202.223 # binaryedge.ninja
-206.189.203.1 # binaryedge.ninja
-206.189.208.105 # binaryedge.ninja
-206.189.208.129 # binaryedge.ninja
-206.189.208.150 # binaryedge.ninja
-206.189.208.183 # binaryedge.ninja
-206.189.208.197 # binaryedge.ninja
-206.189.22.220 # binaryedge.ninja
-206.189.223.55 # binaryedge.ninja
-206.189.223.60 # binaryedge.ninja
-206.189.27.52 # binaryedge.ninja
-206.189.29.178 # binaryedge.ninja
-206.189.3.107 # binaryedge.ninja
-206.189.32.159 # binaryedge.ninja
-206.189.32.79 # binaryedge.ninja
-206.189.33.165 # binaryedge.ninja
-206.189.37.139 # binaryedge.ninja
-206.189.38.149 # binaryedge.ninja
-206.189.5.171 # binaryedge.ninja
-206.189.57.148 # binaryedge.ninja
-206.189.64.186 # binaryedge.ninja
-206.189.64.203 # binaryedge.ninja
-206.189.64.32 # binaryedge.ninja
-206.189.79.146 # binaryedge.ninja
-206.189.79.154 # binaryedge.ninja
-206.189.79.49 # binaryedge.ninja
-206.189.79.87 # binaryedge.ninja
-206.189.86.252 # binaryedge.ninja
-206.189.91.129 # binaryedge.ninja
-206.189.99.194 # binaryedge.ninja
-206.81.2.108 # binaryedge.ninja
-206.81.24.15 # binaryedge.ninja
-207.154.194.47 # binaryedge.ninja
-207.154.199.17 # binaryedge.ninja
-207.154.199.18 # binaryedge.ninja
-207.154.199.94 # binaryedge.ninja
-207.154.204.37 # binaryedge.ninja
-207.154.218.187 # binaryedge.ninja
-207.154.222.101 # binaryedge.ninja
-208.68.39.89 # binaryedge.ninja
-209.38.192.186 # binaryedge.ninja
-209.38.192.189 # binaryedge.ninja
-209.38.204.188 # binaryedge.ninja
-209.38.208.152 # binaryedge.ninja
-209.38.208.180 # binaryedge.ninja
-209.38.216.100 # binaryedge.ninja
-209.38.216.117 # binaryedge.ninja
-209.38.218.125 # binaryedge.ninja
-209.38.220.138 # binaryedge.ninja
-209.38.236.207 # binaryedge.ninja
-209.38.238.131 # binaryedge.ninja
-209.38.246.101 # binaryedge.ninja
-209.38.246.37 # binaryedge.ninja
-209.97.129.130 # binaryedge.ninja
-209.97.130.182 # binaryedge.ninja
-209.97.132.183 # binaryedge.ninja
-209.97.134.10 # binaryedge.ninja
-209.97.134.228 # binaryedge.ninja
-209.97.135.106 # binaryedge.ninja
-209.97.137.120 # binaryedge.ninja
-209.97.138.143 # binaryedge.ninja
-209.97.139.113 # binaryedge.ninja
-209.97.142.166 # binaryedge.ninja
-209.97.172.12 # binaryedge.ninja
-209.97.176.193 # binaryedge.ninja
-209.97.185.149 # binaryedge.ninja
-209.97.185.63 # binaryedge.ninja
-209.97.187.243 # binaryedge.ninja
-209.97.190.68 # binaryedge.ninja
-212.111.41.122 # binaryedge.ninja
-212.111.41.217 # binaryedge.ninja
-212.111.41.243 # binaryedge.ninja
-212.111.41.57 # binaryedge.ninja
-212.71.233.172 # binaryedge.ninja
-212.71.237.144 # binaryedge.ninja
-212.71.237.161 # binaryedge.ninja
-212.71.244.54 # binaryedge.ninja
-212.71.246.199 # binaryedge.ninja
-212.71.248.52 # binaryedge.ninja
-212.71.249.10 # binaryedge.ninja
-212.71.249.135 # binaryedge.ninja
-212.71.249.184 # binaryedge.ninja
-212.71.250.120 # binaryedge.ninja
-212.71.250.125 # binaryedge.ninja
-212.71.250.126 # binaryedge.ninja
-212.71.250.142 # binaryedge.ninja
-212.71.250.8 # binaryedge.ninja
-213.52.129.129 # binaryedge.ninja
-213.52.129.131 # binaryedge.ninja
-213.52.129.250 # binaryedge.ninja
-213.52.130.134 # binaryedge.ninja
-213.52.130.242 # binaryedge.ninja
-213.52.130.50 # binaryedge.ninja
-213.52.130.6 # binaryedge.ninja
-23.239.0.179 # binaryedge.ninja
-23.239.0.248 # binaryedge.ninja
-23.239.20.234 # binaryedge.ninja
-23.239.20.62 # binaryedge.ninja
-23.239.4.185 # binaryedge.ninja
-23.239.4.78 # binaryedge.ninja
-23.239.4.89 # binaryedge.ninja
-23.239.4.98 # binaryedge.ninja
-23.239.7.148 # binaryedge.ninja
-23.239.7.94 # binaryedge.ninja
-23.239.7.95 # binaryedge.ninja
-24.144.104.23 # binaryedge.ninja
-24.144.108.175 # binaryedge.ninja
-24.144.108.198 # binaryedge.ninja
-24.144.108.89 # binaryedge.ninja
-24.144.112.225 # binaryedge.ninja
-24.144.124.128 # binaryedge.ninja
-24.144.124.168 # binaryedge.ninja
-24.144.124.205 # binaryedge.ninja
-24.144.124.226 # binaryedge.ninja
-24.144.124.24 # binaryedge.ninja
-24.144.124.245 # binaryedge.ninja
-24.144.124.246 # binaryedge.ninja
-24.144.124.249 # binaryedge.ninja
-24.144.124.253 # binaryedge.ninja
-24.144.124.255 # binaryedge.ninja
-24.144.124.71 # binaryedge.ninja
-24.144.96.59 # binaryedge.ninja
-24.144.98.0 # binaryedge.ninja
-24.144.98.13 # binaryedge.ninja
-24.144.98.3 # binaryedge.ninja
-24.144.98.67 # binaryedge.ninja
-24.144.98.8 # binaryedge.ninja
-24.144.98.9 # binaryedge.ninja
-24.199.106.151 # binaryedge.ninja
-24.199.106.79 # binaryedge.ninja
-24.199.106.97 # binaryedge.ninja
-24.199.108.177 # binaryedge.ninja
-24.199.108.229 # binaryedge.ninja
-24.199.112.202 # binaryedge.ninja
-24.199.120.50 # binaryedge.ninja
-24.199.122.67 # binaryedge.ninja
-24.199.82.127 # binaryedge.ninja
-24.199.83.186 # binaryedge.ninja
-24.199.85.223 # binaryedge.ninja
-24.199.87.124 # binaryedge.ninja
-24.199.87.130 # binaryedge.ninja
-24.199.87.148 # binaryedge.ninja
-24.199.87.162 # binaryedge.ninja
-24.199.87.165 # binaryedge.ninja
-24.199.87.30 # binaryedge.ninja
-24.199.87.53 # binaryedge.ninja
-24.199.87.8 # binaryedge.ninja
-24.199.87.94 # binaryedge.ninja
-24.199.89.204 # binaryedge.ninja
-24.199.91.102 # binaryedge.ninja
-24.199.91.136 # binaryedge.ninja
-24.199.91.179 # binaryedge.ninja
-24.199.91.184 # binaryedge.ninja
-24.199.91.191 # binaryedge.ninja
-24.199.91.245 # binaryedge.ninja
-24.199.91.30 # binaryedge.ninja
-24.199.94.152 # binaryedge.ninja
-24.199.95.27 # binaryedge.ninja
-24.199.95.40 # binaryedge.ninja
-24.199.97.2 # binaryedge.ninja
-2400:6180:0:d0::1008:2001 # binaryedge.ninja
-2400:6180:0:d0::100a:1 # binaryedge.ninja
-2400:6180:0:d0::1016:f001 # binaryedge.ninja
-2400:6180:0:d0::1020:6001 # binaryedge.ninja
-2400:6180:0:d0::1034:b001 # binaryedge.ninja
-2400:6180:0:d0::103:2001 # binaryedge.ninja
-2400:6180:0:d0::104d:6001 # binaryedge.ninja
-2400:6180:0:d0::104e:2001 # binaryedge.ninja
-2400:6180:0:d0::105f:1 # binaryedge.ninja
-2400:6180:0:d0::106e:d001 # binaryedge.ninja
-2400:6180:0:d0::107b:1001 # binaryedge.ninja
-2400:6180:0:d0::1087:7001 # binaryedge.ninja
-2400:6180:0:d0::10a7:f001 # binaryedge.ninja
-2400:6180:0:d0::10aa:1001 # binaryedge.ninja
-2400:6180:0:d0::10ae:d001 # binaryedge.ninja
-2400:6180:0:d0::10c0:b001 # binaryedge.ninja
-2400:6180:0:d0::10d5:a001 # binaryedge.ninja
-2400:6180:0:d0::10dc:f001 # binaryedge.ninja
-2400:6180:0:d0::10e4:a001 # binaryedge.ninja
-2400:6180:0:d0::10f5:1 # binaryedge.ninja
-2400:6180:0:d0::10ff:a001 # binaryedge.ninja
-2400:6180:0:d0::1115:5001 # binaryedge.ninja
-2400:6180:0:d0::115d:2001 # binaryedge.ninja
-2400:6180:0:d0::1189:c001 # binaryedge.ninja
-2400:6180:0:d0::1190:5001 # binaryedge.ninja
-2400:6180:0:d0::11a5:f001 # binaryedge.ninja
-2400:6180:0:d0::11ae:4001 # binaryedge.ninja
-2400:6180:0:d0::11ee:f001 # binaryedge.ninja
-2400:6180:0:d0::1200:9001 # binaryedge.ninja
-2400:6180:0:d0::1227:d001 # binaryedge.ninja
-2400:6180:0:d0::1254:7001 # binaryedge.ninja
-2400:6180:0:d0::1258:e001 # binaryedge.ninja
-2400:6180:0:d0::125b:9001 # binaryedge.ninja
-2400:6180:0:d0::1263:e001 # binaryedge.ninja
-2400:6180:0:d0::126a:b001 # binaryedge.ninja
-2400:6180:0:d0::1290:e001 # binaryedge.ninja
-2400:6180:0:d0::129a:1 # binaryedge.ninja
-2400:6180:0:d0::129b:d001 # binaryedge.ninja
-2400:6180:0:d0::129d:1 # binaryedge.ninja
-2400:6180:0:d0::12a4:9001 # binaryedge.ninja
-2400:6180:0:d0::12a4:c001 # binaryedge.ninja
-2400:6180:0:d0::12a5:7001 # binaryedge.ninja
-2400:6180:0:d0::12a6:6001 # binaryedge.ninja
-2400:6180:0:d0::12a6:9001 # binaryedge.ninja
-2400:6180:0:d0::12a7:1001 # binaryedge.ninja
-2400:6180:0:d0::12a7:7001 # binaryedge.ninja
-2400:6180:0:d0::12ab:6001 # binaryedge.ninja
-2400:6180:0:d0::12ac:1001 # binaryedge.ninja
-2400:6180:0:d0::12ac:b001 # binaryedge.ninja
-2400:6180:0:d0::12ad:1001 # binaryedge.ninja
-2400:6180:0:d0::12ae:5001 # binaryedge.ninja
-2400:6180:0:d0::12b1:3001 # binaryedge.ninja
-2400:6180:0:d0::12b6:9001 # binaryedge.ninja
-2400:6180:0:d0::12b6:e001 # binaryedge.ninja
-2400:6180:0:d0::12b8:2001 # binaryedge.ninja
-2400:6180:0:d0::12b9:3001 # binaryedge.ninja
-2400:6180:0:d0::12ba:5001 # binaryedge.ninja
-2400:6180:0:d0::12ba:8001 # binaryedge.ninja
-2400:6180:0:d0::12ba:9001 # binaryedge.ninja
-2400:6180:0:d0::12ba:e001 # binaryedge.ninja
-2400:6180:0:d0::12bb:2001 # binaryedge.ninja
-2400:6180:0:d0::12bb:4001 # binaryedge.ninja
-2400:6180:0:d0::12bc:4001 # binaryedge.ninja
-2400:6180:0:d0::12bd:1 # binaryedge.ninja
-2400:6180:0:d0::12bd:3001 # binaryedge.ninja
-2400:6180:0:d0::12bd:7001 # binaryedge.ninja
-2400:6180:0:d0::12bf:6001 # binaryedge.ninja
-2400:6180:0:d0::12c0:1001 # binaryedge.ninja
-2400:6180:0:d0::12c0:2001 # binaryedge.ninja
-2400:6180:0:d0::12c0:5001 # binaryedge.ninja
-2400:6180:0:d0::12c1:7001 # binaryedge.ninja
-2400:6180:0:d0::12c2:2001 # binaryedge.ninja
-2400:6180:0:d0::12c2:5001 # binaryedge.ninja
-2400:6180:0:d0::12c2:f001 # binaryedge.ninja
-2400:6180:0:d0::12c4:1001 # binaryedge.ninja
-2400:6180:0:d0::12c5:a001 # binaryedge.ninja
-2400:6180:0:d0::12c6:1001 # binaryedge.ninja
-2400:6180:0:d0::12c7:1 # binaryedge.ninja
-2400:6180:0:d0::12c7:9001 # binaryedge.ninja
-2400:6180:0:d0::12c7:f001 # binaryedge.ninja
-2400:6180:0:d0::12c9:f001 # binaryedge.ninja
-2400:6180:0:d0::12ca:1001 # binaryedge.ninja
-2400:6180:0:d0::12ca:9001 # binaryedge.ninja
-2400:6180:0:d0::1348:6001 # binaryedge.ninja
-2400:6180:0:d0::1355:5001 # binaryedge.ninja
-2400:6180:0:d0::13a9:3001 # binaryedge.ninja
-2400:6180:0:d0::13ec:6001 # binaryedge.ninja
-2400:6180:0:d0::1425:9001 # binaryedge.ninja
-2400:6180:0:d0::14b6:a001 # binaryedge.ninja
-2400:6180:0:d0::14ea:1001 # binaryedge.ninja
-2400:6180:0:d0::1521:e001 # binaryedge.ninja
-2400:6180:0:d0::152d:d001 # binaryedge.ninja
-2400:6180:0:d0::152f:d001 # binaryedge.ninja
-2400:6180:0:d0::1531:a001 # binaryedge.ninja
-2400:6180:0:d0::1532:a001 # binaryedge.ninja
-2400:6180:0:d0::1533:5001 # binaryedge.ninja
-2400:6180:0:d0::1538:5001 # binaryedge.ninja
-2400:6180:0:d0::153b:a001 # binaryedge.ninja
-2400:6180:0:d0::153c:e001 # binaryedge.ninja
-2400:6180:0:d0::1542:3001 # binaryedge.ninja
-2400:6180:0:d0::1547:a001 # binaryedge.ninja
-2400:6180:0:d0::1547:e001 # binaryedge.ninja
-2400:6180:0:d0::1548:8001 # binaryedge.ninja
-2400:6180:0:d0::1548:9001 # binaryedge.ninja
-2400:6180:0:d0::1549:a001 # binaryedge.ninja
-2400:6180:0:d0::154a:5001 # binaryedge.ninja
-2400:6180:0:d0::154b:1001 # binaryedge.ninja
-2400:6180:0:d0::154b:3001 # binaryedge.ninja
-2400:6180:0:d0::154b:8001 # binaryedge.ninja
-2400:6180:0:d0::154b:9001 # binaryedge.ninja
-2400:6180:0:d0::154b:a001 # binaryedge.ninja
-2400:6180:0:d0::178:b001 # binaryedge.ninja
-2400:6180:0:d0::1b8:e001 # binaryedge.ninja
-2400:6180:0:d0::3d:1 # binaryedge.ninja
-2400:6180:0:d0::473:b001 # binaryedge.ninja
-2400:6180:0:d0::47e:1001 # binaryedge.ninja
-2400:6180:0:d0::5b6:6001 # binaryedge.ninja
-2400:6180:0:d0::696:8001 # binaryedge.ninja
-2400:6180:0:d0::703:4001 # binaryedge.ninja
-2400:6180:0:d0::81b:1001 # binaryedge.ninja
-2400:6180:0:d0::9d:e001 # binaryedge.ninja
-2400:6180:0:d0::c56:5001 # binaryedge.ninja
-2400:6180:0:d0::cb7:9001 # binaryedge.ninja
-2400:6180:0:d0::e68:2001 # binaryedge.ninja
-2400:6180:0:d0::e77:5001 # binaryedge.ninja
-2400:6180:0:d0::e7c:7001 # binaryedge.ninja
-2400:6180:0:d0::ec4:6001 # binaryedge.ninja
-2400:6180:0:d0::ec8:e001 # binaryedge.ninja
-2400:6180:0:d0::ed4:c001 # binaryedge.ninja
-2400:6180:0:d0::f15:b001 # binaryedge.ninja
-2400:6180:0:d0::f2b:1 # binaryedge.ninja
-2400:6180:0:d0::f2d:e001 # binaryedge.ninja
-2400:6180:0:d0::f35:c001 # binaryedge.ninja
-2400:6180:0:d0::f42:d001 # binaryedge.ninja
-2400:6180:0:d0::f49:e001 # binaryedge.ninja
-2400:6180:0:d0::f54:a001 # binaryedge.ninja
-2400:6180:0:d0::f6a:3001 # binaryedge.ninja
-2400:6180:0:d0::f85:5001 # binaryedge.ninja
-2400:6180:0:d0::f96:d001 # binaryedge.ninja
-2400:6180:0:d0::fac:6001 # binaryedge.ninja
-2400:6180:0:d0::faf:d001 # binaryedge.ninja
-2400:6180:0:d0::fb1:e001 # binaryedge.ninja
-2400:6180:0:d0::fb6:f001 # binaryedge.ninja
-2400:6180:0:d0::fb8:b001 # binaryedge.ninja
-2400:6180:0:d0::fc6:2001 # binaryedge.ninja
-2400:6180:0:d0::fce:1 # binaryedge.ninja
-2400:6180:0:d0::fd5:d001 # binaryedge.ninja
-2400:6180:0:d0::fe6:1001 # binaryedge.ninja
-2400:6180:0:d0::ff0:2001 # binaryedge.ninja
-2400:6180:0:d0::ffd:7001 # binaryedge.ninja
-2400:6180:0:d0::ffe:1 # binaryedge.ninja
-2400:6180:100:d0::40c:5001 # binaryedge.ninja
-2400:6180:100:d0::678:6001 # binaryedge.ninja
-2400:6180:100:d0::83d:b001 # binaryedge.ninja
-2400:6180:100:d0::845:a001 # binaryedge.ninja
-2400:6180:100:d0::889:9001 # binaryedge.ninja
-2400:6180:100:d0::8d8:6001 # binaryedge.ninja
-2400:6180:100:d0::8eb:2001 # binaryedge.ninja
-2400:6180:100:d0::91b:a001 # binaryedge.ninja
-2400:6180:100:d0::951:4001 # binaryedge.ninja
-2400:6180:100:d0::985:3001 # binaryedge.ninja
-2400:6180:100:d0::99b:9001 # binaryedge.ninja
-2400:6180:100:d0::9a7:8001 # binaryedge.ninja
-2400:6180:100:d0::9c0:8001 # binaryedge.ninja
-2400:6180:100:d0::9ce:4001 # binaryedge.ninja
-2400:6180:100:d0::9d0:4001 # binaryedge.ninja
-2400:6180:100:d0::9dc:3001 # binaryedge.ninja
-2400:6180:100:d0::9e3:9001 # binaryedge.ninja
-2400:6180:100:d0::9eb:b001 # binaryedge.ninja
-2400:6180:100:d0::9ff:8001 # binaryedge.ninja
-2400:6180:100:d0::a00:f001 # binaryedge.ninja
-2400:6180:100:d0::a09:c001 # binaryedge.ninja
-2400:6180:100:d0::a09:e001 # binaryedge.ninja
-2400:6180:100:d0::a17:6001 # binaryedge.ninja
-2400:6180:100:d0::a27:2001 # binaryedge.ninja
-2400:6180:100:d0::a2a:b001 # binaryedge.ninja
-2400:6180:100:d0::a2a:c001 # binaryedge.ninja
-2400:6180:100:d0::a36:f001 # binaryedge.ninja
-2400:6180:100:d0::a40:1001 # binaryedge.ninja
-2400:6180:100:d0::a4c:4001 # binaryedge.ninja
-2400:6180:100:d0::a53:1 # binaryedge.ninja
-2400:6180:100:d0::a56:1 # binaryedge.ninja
-2400:6180:100:d0::a56:6001 # binaryedge.ninja
-2400:6180:100:d0::a5f:6001 # binaryedge.ninja
-2400:6180:100:d0::a6c:e001 # binaryedge.ninja
-2400:6180:100:d0::a72:1001 # binaryedge.ninja
-2400:6180:100:d0::a7d:e001 # binaryedge.ninja
-2400:6180:100:d0::a7e:a001 # binaryedge.ninja
-2400:6180:100:d0::a82:9001 # binaryedge.ninja
-2400:6180:100:d0::a8e:b001 # binaryedge.ninja
-2400:6180:100:d0::a93:9001 # binaryedge.ninja
-2400:6180:10:200::25:d000 # binaryedge.ninja
-2400:6180:10:200::48:2000 # binaryedge.ninja
-2400:6180:10:200::73:0 # binaryedge.ninja
-2400:6180:10:200::91:2000 # binaryedge.ninja
-2400:6180:10:200::93:f000 # binaryedge.ninja
-2400:6180:10:200::95:0 # binaryedge.ninja
-2400:6180:10:200::95:d000 # binaryedge.ninja
-2400:6180:10:200::97:d000 # binaryedge.ninja
-2400:6180:10:200::99:6000 # binaryedge.ninja
-2400:6180:10:200::9a:9000 # binaryedge.ninja
-2400:6180:10:200::9c:c000 # binaryedge.ninja
-2400:6180:10:200::9d:7000 # binaryedge.ninja
-2400:6180:10:200::9f:d000 # binaryedge.ninja
-2400:6180:10:200::9f:f000 # binaryedge.ninja
-2400:6180:10:200::a0:3000 # binaryedge.ninja
-2400:6180:10:200::a0:8000 # binaryedge.ninja
-2400:6180:10:200::a0:a000 # binaryedge.ninja
-2400:6180:10:200::a0:b000 # binaryedge.ninja
-2400:6180:10:200::a0:c000 # binaryedge.ninja
-2400:6180:10:200::a0:d000 # binaryedge.ninja
-2400:6180:10:200::a0:e000 # binaryedge.ninja
-2400:6180:10:200::a2:7000 # binaryedge.ninja
-2400:6180:10:200::a8:7000 # binaryedge.ninja
-2400:6180:10:200::a8:8000 # binaryedge.ninja
-2400:6180:10:200::a8:a000 # binaryedge.ninja
-2400:6180:10:200::a9:1000 # binaryedge.ninja
-2400:6180:10:200::a9:7000 # binaryedge.ninja
-2400:6180:10:200::a9:a000 # binaryedge.ninja
-2400:6180:10:200::a9:b000 # binaryedge.ninja
-2400:6180:10:200::aa:0 # binaryedge.ninja
-2400:6180:10:200::aa:8000 # binaryedge.ninja
-2400:6180:10:200::ab:4000 # binaryedge.ninja
-2400:6180:10:200::ab:5000 # binaryedge.ninja
-2400:6180:10:200::ab:6000 # binaryedge.ninja
-2400:6180:10:200::ab:8000 # binaryedge.ninja
-2400:6180:10:200::ab:b000 # binaryedge.ninja
-2400:6180:10:200::ab:d000 # binaryedge.ninja
-2400:6180:10:200::ac:1000 # binaryedge.ninja
-2400:6180:10:200::ac:2000 # binaryedge.ninja
-2400:6180:10:200::ac:3000 # binaryedge.ninja
-2400:6180:10:200::ac:4000 # binaryedge.ninja
-2400:6180:10:200::ac:5000 # binaryedge.ninja
-2400:6180:10:200::ac:7000 # binaryedge.ninja
-2400:6180:10:200::ac:8000 # binaryedge.ninja
-2400:6180:10:200::ac:9000 # binaryedge.ninja
-2400:6180:10:200::ac:b000 # binaryedge.ninja
-2400:6180:10:200::ac:e000 # binaryedge.ninja
-2400:6180:10:200::ad:6000 # binaryedge.ninja
-2400:6180:10:200::ad:8000 # binaryedge.ninja
-2400:6180:10:200::ad:a000 # binaryedge.ninja
-2400:6180:10:200::ad:b000 # binaryedge.ninja
-2400:6180:10:200::ad:c000 # binaryedge.ninja
-2400:6180:10:200::ad:d000 # binaryedge.ninja
-2400:6180:10:200::ad:e000 # binaryedge.ninja
-2400:6180:10:200::ad:f000 # binaryedge.ninja
-2400:6180:10:200::ae:0 # binaryedge.ninja
-2400:6180:10:200::b5:9000 # binaryedge.ninja
-2400:6180:10:200::ba:e000 # binaryedge.ninja
-2400:6180:10:200::bf:6000 # binaryedge.ninja
-2400:6180:10:200::c4:c000 # binaryedge.ninja
-2400:6180:10:200::c7:3000 # binaryedge.ninja
-2400:6180:10:200::c7:9000 # binaryedge.ninja
-2400:6180:10:200::c7:c000 # binaryedge.ninja
-2400:6180:10:200::c7:f000 # binaryedge.ninja
-2400:6180:10:200::c8:1000 # binaryedge.ninja
-2400:6180:10:200::c8:2000 # binaryedge.ninja
-2400:6180:10:200::c8:4000 # binaryedge.ninja
-2400:6180:10:200::c8:7000 # binaryedge.ninja
-2400:6180:10:200::c8:9000 # binaryedge.ninja
-2400:6180:10:200::c8:a000 # binaryedge.ninja
-2400:6180:10:200::c8:c000 # binaryedge.ninja
-2400:6180:10:200::c8:e000 # binaryedge.ninja
-2400:6180:10:200::c8:f000 # binaryedge.ninja
-2604:a880:2:d0::1016:c001 # binaryedge.ninja
-2604:a880:2:d0::104a:f001 # binaryedge.ninja
-2604:a880:2:d0::1087:2001 # binaryedge.ninja
-2604:a880:2:d0::1103:d001 # binaryedge.ninja
-2604:a880:2:d0::1235:8001 # binaryedge.ninja
-2604:a880:2:d0::1312:b001 # binaryedge.ninja
-2604:a880:2:d0::131f:b001 # binaryedge.ninja
-2604:a880:2:d0::1332:c001 # binaryedge.ninja
-2604:a880:2:d0::1384:e001 # binaryedge.ninja
-2604:a880:2:d0::1398:2001 # binaryedge.ninja
-2604:a880:2:d0::13c5:6001 # binaryedge.ninja
-2604:a880:2:d0::13fb:1001 # binaryedge.ninja
-2604:a880:2:d0::1403:1001 # binaryedge.ninja
-2604:a880:2:d0::140a:9001 # binaryedge.ninja
-2604:a880:2:d0::14c2:b001 # binaryedge.ninja
-2604:a880:2:d0::14e5:2001 # binaryedge.ninja
-2604:a880:2:d0::1536:d001 # binaryedge.ninja
-2604:a880:2:d0::158a:9001 # binaryedge.ninja
-2604:a880:2:d0::15c1:1 # binaryedge.ninja
-2604:a880:2:d0::15c8:8001 # binaryedge.ninja
-2604:a880:2:d0::15d9:e001 # binaryedge.ninja
-2604:a880:2:d0::1668:1001 # binaryedge.ninja
-2604:a880:2:d0::16fa:3001 # binaryedge.ninja
-2604:a880:2:d0::170c:4001 # binaryedge.ninja
-2604:a880:2:d0::1713:c001 # binaryedge.ninja
-2604:a880:2:d0::1783:e001 # binaryedge.ninja
-2604:a880:2:d0::17ac:b001 # binaryedge.ninja
-2604:a880:2:d0::17c5:7001 # binaryedge.ninja
-2604:a880:2:d0::1903:d001 # binaryedge.ninja
-2604:a880:2:d0::1938:a001 # binaryedge.ninja
-2604:a880:2:d0::196d:9001 # binaryedge.ninja
-2604:a880:2:d0::1975:9001 # binaryedge.ninja
-2604:a880:2:d0::1a4e:1 # binaryedge.ninja
-2604:a880:2:d0::1a5f:b001 # binaryedge.ninja
-2604:a880:2:d0::1abd:f001 # binaryedge.ninja
-2604:a880:2:d0::1b6a:3001 # binaryedge.ninja
-2604:a880:2:d0::1b81:f001 # binaryedge.ninja
-2604:a880:2:d0::1b88:1 # binaryedge.ninja
-2604:a880:2:d0::1c38:5001 # binaryedge.ninja
-2604:a880:2:d0::1c3b:9001 # binaryedge.ninja
-2604:a880:2:d0::1c48:6001 # binaryedge.ninja
-2604:a880:2:d0::1c4b:8001 # binaryedge.ninja
-2604:a880:2:d0::1c5d:f001 # binaryedge.ninja
-2604:a880:2:d0::1c63:7001 # binaryedge.ninja
-2604:a880:2:d0::1c70:f001 # binaryedge.ninja
-2604:a880:2:d0::1ca4:1 # binaryedge.ninja
-2604:a880:2:d0::1ca6:a001 # binaryedge.ninja
-2604:a880:2:d0::1cb4:9001 # binaryedge.ninja
-2604:a880:2:d0::1cd8:7001 # binaryedge.ninja
-2604:a880:2:d0::1cea:2001 # binaryedge.ninja
-2604:a880:2:d0::1cee:4001 # binaryedge.ninja
-2604:a880:2:d0::1cf9:3001 # binaryedge.ninja
-2604:a880:2:d0::1d02:d001 # binaryedge.ninja
-2604:a880:2:d0::1d07:3001 # binaryedge.ninja
-2604:a880:2:d0::1d08:2001 # binaryedge.ninja
-2604:a880:2:d0::1d0f:5001 # binaryedge.ninja
-2604:a880:2:d0::1d28:3001 # binaryedge.ninja
-2604:a880:2:d0::1d5a:f001 # binaryedge.ninja
-2604:a880:2:d0::1d65:e001 # binaryedge.ninja
-2604:a880:2:d0::1d75:1 # binaryedge.ninja
-2604:a880:2:d0::1d9c:d001 # binaryedge.ninja
-2604:a880:2:d0::1d9f:7001 # binaryedge.ninja
-2604:a880:2:d0::1db7:7001 # binaryedge.ninja
-2604:a880:2:d0::1dbf:1001 # binaryedge.ninja
-2604:a880:2:d0::1dcc:e001 # binaryedge.ninja
-2604:a880:2:d0::1dcd:c001 # binaryedge.ninja
-2604:a880:2:d0::1dd4:e001 # binaryedge.ninja
-2604:a880:2:d0::1de0:4001 # binaryedge.ninja
-2604:a880:2:d0::1e01:c001 # binaryedge.ninja
-2604:a880:2:d0::1e1f:3001 # binaryedge.ninja
-2604:a880:2:d0::1e4c:5001 # binaryedge.ninja
-2604:a880:2:d0::1f1d:d001 # binaryedge.ninja
-2604:a880:2:d0::1f3d:f001 # binaryedge.ninja
-2604:a880:2:d0::1fdb:4001 # binaryedge.ninja
-2604:a880:2:d0::1fee:d001 # binaryedge.ninja
-2604:a880:2:d0::2052:8001 # binaryedge.ninja
-2604:a880:2:d0::2054:7001 # binaryedge.ninja
-2604:a880:2:d0::206b:a001 # binaryedge.ninja
-2604:a880:2:d0::206f:a001 # binaryedge.ninja
-2604:a880:2:d0::2071:3001 # binaryedge.ninja
-2604:a880:2:d0::2073:7001 # binaryedge.ninja
-2604:a880:2:d0::2078:1 # binaryedge.ninja
-2604:a880:2:d0::207a:2001 # binaryedge.ninja
-2604:a880:2:d0::207a:4001 # binaryedge.ninja
-2604:a880:2:d0::2083:4001 # binaryedge.ninja
-2604:a880:2:d0::2083:a001 # binaryedge.ninja
-2604:a880:2:d0::2086:d001 # binaryedge.ninja
-2604:a880:2:d0::208c:b001 # binaryedge.ninja
-2604:a880:2:d0::2091:e001 # binaryedge.ninja
-2604:a880:2:d0::209e:1 # binaryedge.ninja
-2604:a880:2:d0::20a0:7001 # binaryedge.ninja
-2604:a880:2:d0::20a5:e001 # binaryedge.ninja
-2604:a880:2:d0::20a6:8001 # binaryedge.ninja
-2604:a880:2:d0::20aa:9001 # binaryedge.ninja
-2604:a880:2:d0::20ad:5001 # binaryedge.ninja
-2604:a880:2:d0::20ae:c001 # binaryedge.ninja
-2604:a880:2:d0::20b0:5001 # binaryedge.ninja
-2604:a880:2:d0::20b0:6001 # binaryedge.ninja
-2604:a880:2:d0::20b1:2001 # binaryedge.ninja
-2604:a880:2:d0::20b3:c001 # binaryedge.ninja
-2604:a880:2:d0::20b7:b001 # binaryedge.ninja
-2604:a880:2:d0::20b8:c001 # binaryedge.ninja
-2604:a880:2:d0::20ba:e001 # binaryedge.ninja
-2604:a880:2:d0::20bc:5001 # binaryedge.ninja
-2604:a880:2:d0::20bd:b001 # binaryedge.ninja
-2604:a880:2:d0::20c1:c001 # binaryedge.ninja
-2604:a880:2:d0::20c1:e001 # binaryedge.ninja
-2604:a880:2:d0::20c3:1 # binaryedge.ninja
-2604:a880:2:d0::20f9:7001 # binaryedge.ninja
-2604:a880:2:d0::20fe:5001 # binaryedge.ninja
-2604:a880:2:d0::20fe:c001 # binaryedge.ninja
-2604:a880:2:d0::20ff:1001 # binaryedge.ninja
-2604:a880:2:d0::2100:8001 # binaryedge.ninja
-2604:a880:2:d0::2102:9001 # binaryedge.ninja
-2604:a880:2:d0::2103:7001 # binaryedge.ninja
-2604:a880:2:d0::2103:c001 # binaryedge.ninja
-2604:a880:2:d0::2104:4001 # binaryedge.ninja
-2604:a880:2:d0::2105:4001 # binaryedge.ninja
-2604:a880:2:d0::2107:5001 # binaryedge.ninja
-2604:a880:2:d0::2107:e001 # binaryedge.ninja
-2604:a880:2:d0::2108:9001 # binaryedge.ninja
-2604:a880:2:d0::2111:a001 # binaryedge.ninja
-2604:a880:2:d0::2112:1001 # binaryedge.ninja
-2604:a880:2:d0::2113:a001 # binaryedge.ninja
-2604:a880:2:d0::2114:6001 # binaryedge.ninja
-2604:a880:2:d0::2115:b001 # binaryedge.ninja
-2604:a880:2:d0::2115:e001 # binaryedge.ninja
-2604:a880:2:d0::2117:7001 # binaryedge.ninja
-2604:a880:2:d0::2117:b001 # binaryedge.ninja
-2604:a880:2:d0::2117:f001 # binaryedge.ninja
-2604:a880:2:d0::2118:3001 # binaryedge.ninja
-2604:a880:2:d0::2118:6001 # binaryedge.ninja
-2604:a880:2:d0::2118:a001 # binaryedge.ninja
-2604:a880:2:d0::2119:6001 # binaryedge.ninja
-2604:a880:2:d0::211a:2001 # binaryedge.ninja
-2604:a880:2:d0::211a:d001 # binaryedge.ninja
-2604:a880:2:d0::211b:1001 # binaryedge.ninja
-2604:a880:2:d0::211b:4001 # binaryedge.ninja
-2604:a880:2:d0::211b:7001 # binaryedge.ninja
-2604:a880:2:d0::211b:8001 # binaryedge.ninja
-2604:a880:2:d0::211b:d001 # binaryedge.ninja
-2604:a880:2:d0::211c:4001 # binaryedge.ninja
-2604:a880:2:d0::211c:7001 # binaryedge.ninja
-2604:a880:2:d0::211e:5001 # binaryedge.ninja
-2604:a880:2:d0::211f:2001 # binaryedge.ninja
-2604:a880:2:d0::211f:9001 # binaryedge.ninja
-2604:a880:2:d0::211f:b001 # binaryedge.ninja
-2604:a880:2:d0::2120:b001 # binaryedge.ninja
-2604:a880:2:d0::2139:2001 # binaryedge.ninja
-2604:a880:2:d0::213b:7001 # binaryedge.ninja
-2604:a880:2:d0::213c:4001 # binaryedge.ninja
-2604:a880:2:d0::2143:7001 # binaryedge.ninja
-2604:a880:2:d0::2145:2001 # binaryedge.ninja
-2604:a880:2:d0::2147:8001 # binaryedge.ninja
-2604:a880:2:d0::2148:9001 # binaryedge.ninja
-2604:a880:2:d0::215d:d001 # binaryedge.ninja
-2604:a880:2:d0::215e:9001 # binaryedge.ninja
-2604:a880:2:d0::215f:1001 # binaryedge.ninja
-2604:a880:2:d0::2161:6001 # binaryedge.ninja
-2604:a880:2:d0::2161:e001 # binaryedge.ninja
-2604:a880:2:d0::2162:a001 # binaryedge.ninja
-2604:a880:2:d0::2162:e001 # binaryedge.ninja
-2604:a880:2:d0::2163:6001 # binaryedge.ninja
-2604:a880:2:d0::2173:6001 # binaryedge.ninja
-2604:a880:2:d0::2174:d001 # binaryedge.ninja
-2604:a880:2:d0::2175:8001 # binaryedge.ninja
-2604:a880:2:d0::217c:8001 # binaryedge.ninja
-2604:a880:2:d0::217e:f001 # binaryedge.ninja
-2604:a880:2:d0::2180:c001 # binaryedge.ninja
-2604:a880:2:d0::2183:1001 # binaryedge.ninja
-2604:a880:2:d0::2183:9001 # binaryedge.ninja
-2604:a880:2:d0::2184:e001 # binaryedge.ninja
-2604:a880:2:d0::2189:d001 # binaryedge.ninja
-2604:a880:2:d0::218a:6001 # binaryedge.ninja
-2604:a880:2:d0::218b:5001 # binaryedge.ninja
-2604:a880:2:d0::218b:b001 # binaryedge.ninja
-2604:a880:2:d0::218b:d001 # binaryedge.ninja
-2604:a880:2:d0::218d:7001 # binaryedge.ninja
-2604:a880:2:d0::2194:1001 # binaryedge.ninja
-2604:a880:2:d0::219c:2001 # binaryedge.ninja
-2604:a880:2:d0::219c:c001 # binaryedge.ninja
-2604:a880:2:d0::219f:3001 # binaryedge.ninja
-2604:a880:2:d0::21a1:5001 # binaryedge.ninja
-2604:a880:2:d0::21a4:9001 # binaryedge.ninja
-2604:a880:2:d0::21a5:4001 # binaryedge.ninja
-2604:a880:2:d0::21a6:6001 # binaryedge.ninja
-2604:a880:2:d0::21a7:4001 # binaryedge.ninja
-2604:a880:2:d0::21a7:8001 # binaryedge.ninja
-2604:a880:2:d0::21a9:e001 # binaryedge.ninja
-2604:a880:2:d0::21aa:a001 # binaryedge.ninja
-2604:a880:2:d0::21ac:f001 # binaryedge.ninja
-2604:a880:2:d0::21ad:2001 # binaryedge.ninja
-2604:a880:2:d0::21ad:4001 # binaryedge.ninja
-2604:a880:2:d0::21af:3001 # binaryedge.ninja
-2604:a880:2:d0::21af:c001 # binaryedge.ninja
-2604:a880:2:d0::21af:d001 # binaryedge.ninja
-2604:a880:2:d0::21b0:c001 # binaryedge.ninja
-2604:a880:2:d0::21b1:1001 # binaryedge.ninja
-2604:a880:2:d0::21b4:c001 # binaryedge.ninja
-2604:a880:2:d0::21b5:c001 # binaryedge.ninja
-2604:a880:2:d0::21b5:d001 # binaryedge.ninja
-2604:a880:2:d0::21ba:4001 # binaryedge.ninja
-2604:a880:2:d0::21bb:d001 # binaryedge.ninja
-2604:a880:2:d0::21d6:2001 # binaryedge.ninja
-2604:a880:2:d0::21d6:3001 # binaryedge.ninja
-2604:a880:2:d0::21d7:2001 # binaryedge.ninja
-2604:a880:2:d0::21d7:6001 # binaryedge.ninja
-2604:a880:2:d0::21d7:c001 # binaryedge.ninja
-2604:a880:2:d0::21d7:d001 # binaryedge.ninja
-2604:a880:2:d0::21d7:e001 # binaryedge.ninja
-2604:a880:2:d0::21d8:1001 # binaryedge.ninja
-2604:a880:2:d0::21d8:3001 # binaryedge.ninja
-2604:a880:2:d0::21d8:7001 # binaryedge.ninja
-2604:a880:2:d0::21d8:8001 # binaryedge.ninja
-2604:a880:2:d0::21db:e001 # binaryedge.ninja
-2604:a880:2:d0::21dc:e001 # binaryedge.ninja
-2604:a880:2:d0::21de:b001 # binaryedge.ninja
-2604:a880:2:d0::21e7:8001 # binaryedge.ninja
-2604:a880:2:d0::21e9:9001 # binaryedge.ninja
-2604:a880:2:d0::21ec:7001 # binaryedge.ninja
-2604:a880:2:d0::21ec:e001 # binaryedge.ninja
-2604:a880:2:d0::21ec:f001 # binaryedge.ninja
-2604:a880:2:d0::21ed:d001 # binaryedge.ninja
-2604:a880:2:d0::21ee:5001 # binaryedge.ninja
-2604:a880:2:d0::21ee:7001 # binaryedge.ninja
-2604:a880:2:d0::21ee:8001 # binaryedge.ninja
-2604:a880:2:d0::21ee:9001 # binaryedge.ninja
-2604:a880:2:d0::21ee:d001 # binaryedge.ninja
-2604:a880:2:d0::21ee:e001 # binaryedge.ninja
-2604:a880:2:d0::21ef:1 # binaryedge.ninja
-2604:a880:2:d0::21ef:3001 # binaryedge.ninja
-2604:a880:2:d0::21ef:5001 # binaryedge.ninja
-2604:a880:2:d0::21f1:6001 # binaryedge.ninja
-2604:a880:2:d0::21f1:7001 # binaryedge.ninja
-2604:a880:2:d0::21f1:8001 # binaryedge.ninja
-2604:a880:2:d0::21f1:9001 # binaryedge.ninja
-2604:a880:2:d0::21f1:a001 # binaryedge.ninja
-2604:a880:2:d0::21f1:c001 # binaryedge.ninja
-2604:a880:2:d0::21f1:d001 # binaryedge.ninja
-2604:a880:2:d0::21f1:f001 # binaryedge.ninja
-2604:a880:2:d0::21f2:1 # binaryedge.ninja
-2604:a880:2:d0::21f2:2001 # binaryedge.ninja
-2604:a880:2:d0::21f2:4001 # binaryedge.ninja
-2604:a880:2:d0::21f2:6001 # binaryedge.ninja
-2604:a880:2:d0::21f2:8001 # binaryedge.ninja
-2604:a880:2:d0::21f2:a001 # binaryedge.ninja
-2604:a880:2:d0::21f2:c001 # binaryedge.ninja
-2604:a880:2:d0::21f2:d001 # binaryedge.ninja
-2604:a880:2:d0::21f3:1001 # binaryedge.ninja
-2604:a880:2:d0::21f3:2001 # binaryedge.ninja
-2604:a880:2:d0::21f3:6001 # binaryedge.ninja
-2604:a880:2:d0::21f3:7001 # binaryedge.ninja
-2604:a880:2:d0::21f3:8001 # binaryedge.ninja
-2604:a880:2:d0::21f3:a001 # binaryedge.ninja
-2604:a880:2:d0::21f3:d001 # binaryedge.ninja
-2604:a880:2:d0::21f3:e001 # binaryedge.ninja
-2604:a880:2:d0::21f4:1 # binaryedge.ninja
-2604:a880:2:d0::21f4:1001 # binaryedge.ninja
-2604:a880:2:d0::21f4:3001 # binaryedge.ninja
-2604:a880:2:d0::21f4:4001 # binaryedge.ninja
-2604:a880:2:d0::21f4:5001 # binaryedge.ninja
-2604:a880:2:d0::21f4:8001 # binaryedge.ninja
-2604:a880:2:d0::21f4:a001 # binaryedge.ninja
-2604:a880:2:d0::21f4:c001 # binaryedge.ninja
-2604:a880:2:d0::21f5:1 # binaryedge.ninja
-2604:a880:2:d0::21f5:3001 # binaryedge.ninja
-2604:a880:2:d0::21f5:6001 # binaryedge.ninja
-2604:a880:2:d0::21f5:7001 # binaryedge.ninja
-2604:a880:2:d0::21f5:8001 # binaryedge.ninja
-2604:a880:2:d0::21f5:9001 # binaryedge.ninja
-2604:a880:2:d0::21f5:e001 # binaryedge.ninja
-2604:a880:2:d0::21f5:f001 # binaryedge.ninja
-2604:a880:2:d0::21f6:1 # binaryedge.ninja
-2604:a880:2:d0::21f6:2001 # binaryedge.ninja
-2604:a880:2:d0::21f6:3001 # binaryedge.ninja
-2604:a880:2:d0::21f6:4001 # binaryedge.ninja
-2604:a880:2:d0::21f6:5001 # binaryedge.ninja
-2604:a880:2:d0::21f6:6001 # binaryedge.ninja
-2604:a880:2:d0::21f6:7001 # binaryedge.ninja
-2604:a880:2:d0::21f6:8001 # binaryedge.ninja
-2604:a880:2:d0::21f6:9001 # binaryedge.ninja
-2604:a880:2:d0::21f6:a001 # binaryedge.ninja
-2604:a880:2:d0::21f6:b001 # binaryedge.ninja
-2604:a880:2:d0::21f6:c001 # binaryedge.ninja
-2604:a880:2:d0::21f6:d001 # binaryedge.ninja
-2604:a880:2:d0::21f6:e001 # binaryedge.ninja
-2604:a880:2:d0::21f6:f001 # binaryedge.ninja
-2604:a880:2:d0::21f7:1 # binaryedge.ninja
-2604:a880:2:d0::21f7:1001 # binaryedge.ninja
-2604:a880:2:d0::21f7:2001 # binaryedge.ninja
-2604:a880:2:d0::21f7:3001 # binaryedge.ninja
-2604:a880:2:d0::21f7:4001 # binaryedge.ninja
-2604:a880:2:d0::21f7:9001 # binaryedge.ninja
-2604:a880:2:d0::21f7:a001 # binaryedge.ninja
-2604:a880:2:d0::21f7:c001 # binaryedge.ninja
-2604:a880:2:d0::21f7:d001 # binaryedge.ninja
-2604:a880:2:d0::21f8:1 # binaryedge.ninja
-2604:a880:2:d0::21f8:2001 # binaryedge.ninja
-2604:a880:2:d0::21f8:3001 # binaryedge.ninja
-2604:a880:2:d0::21f8:4001 # binaryedge.ninja
-2604:a880:2:d0::21f8:8001 # binaryedge.ninja
-2604:a880:2:d0::21f8:9001 # binaryedge.ninja
-2604:a880:2:d0::23:c001 # binaryedge.ninja
-2604:a880:2:d0::2df:d001 # binaryedge.ninja
-2604:a880:2:d0::2f0:5001 # binaryedge.ninja
-2604:a880:2:d0::3b4:b001 # binaryedge.ninja
-2604:a880:2:d0::4d9:1001 # binaryedge.ninja
-2604:a880:2:d0::58:a001 # binaryedge.ninja
-2604:a880:2:d0::5cc:f001 # binaryedge.ninja
-2604:a880:2:d0::63:d001 # binaryedge.ninja
-2604:a880:2:d0::64d:2001 # binaryedge.ninja
-2604:a880:2:d0::64d:4001 # binaryedge.ninja
-2604:a880:2:d0::66:c001 # binaryedge.ninja
-2604:a880:2:d0::77:f001 # binaryedge.ninja
-2604:a880:2:d0::784:c001 # binaryedge.ninja
-2604:a880:2:d0::799:9001 # binaryedge.ninja
-2604:a880:2:d0::875:6001 # binaryedge.ninja
-2604:a880:2:d0::8ac:f001 # binaryedge.ninja
-2604:a880:2:d0::973:8001 # binaryedge.ninja
-2604:a880:2:d0::97f:8001 # binaryedge.ninja
-2604:a880:2:d0::9d0:d001 # binaryedge.ninja
-2604:a880:2:d0::9df:a001 # binaryedge.ninja
-2604:a880:2:d0::bba:7001 # binaryedge.ninja
-2604:a880:2:d0::be3:1 # binaryedge.ninja
-2604:a880:2:d0::bf9:1001 # binaryedge.ninja
-2604:a880:2:d0::c9:8001 # binaryedge.ninja
-2604:a880:2:d0::de6:d001 # binaryedge.ninja
-2604:a880:2:d0::e59:a001 # binaryedge.ninja
-2604:a880:2:d0::e9e:8001 # binaryedge.ninja
-2604:a880:400:d0::14b3:2001 # binaryedge.ninja
-2604:a880:400:d0::152b:b001 # binaryedge.ninja
-2604:a880:400:d0::154a:7001 # binaryedge.ninja
-2604:a880:400:d0::169d:e001 # binaryedge.ninja
-2604:a880:400:d0::171f:8001 # binaryedge.ninja
-2604:a880:400:d0::172a:5001 # binaryedge.ninja
-2604:a880:400:d0::1732:7001 # binaryedge.ninja
-2604:a880:400:d0::177d:3001 # binaryedge.ninja
-2604:a880:400:d0::1784:3001 # binaryedge.ninja
-2604:a880:400:d0::179e:1 # binaryedge.ninja
-2604:a880:400:d0::1807:5001 # binaryedge.ninja
-2604:a880:400:d0::1815:6001 # binaryedge.ninja
-2604:a880:400:d0::183b:d001 # binaryedge.ninja
-2604:a880:400:d0::184c:3001 # binaryedge.ninja
-2604:a880:400:d0::187e:3001 # binaryedge.ninja
-2604:a880:400:d0::189d:7001 # binaryedge.ninja
-2604:a880:400:d0::189f:2001 # binaryedge.ninja
-2604:a880:400:d0::18a5:7001 # binaryedge.ninja
-2604:a880:400:d0::18b7:1001 # binaryedge.ninja
-2604:a880:400:d0::18c0:8001 # binaryedge.ninja
-2604:a880:400:d0::18d0:1001 # binaryedge.ninja
-2604:a880:400:d0::18e7:a001 # binaryedge.ninja
-2604:a880:400:d0::1908:f001 # binaryedge.ninja
-2604:a880:400:d0::1914:2001 # binaryedge.ninja
-2604:a880:400:d0::191b:b001 # binaryedge.ninja
-2604:a880:400:d0::193d:1 # binaryedge.ninja
-2604:a880:400:d0::193e:4001 # binaryedge.ninja
-2604:a880:400:d0::1976:e001 # binaryedge.ninja
-2604:a880:400:d0::199b:7001 # binaryedge.ninja
-2604:a880:400:d0::1a02:d001 # binaryedge.ninja
-2604:a880:400:d0::1a1d:1001 # binaryedge.ninja
-2604:a880:400:d0::1a2f:6001 # binaryedge.ninja
-2604:a880:400:d0::1a3f:e001 # binaryedge.ninja
-2604:a880:400:d0::1a56:e001 # binaryedge.ninja
-2604:a880:400:d0::1a81:8001 # binaryedge.ninja
-2604:a880:400:d0::1a8c:9001 # binaryedge.ninja
-2604:a880:400:d0::1a93:1 # binaryedge.ninja
-2604:a880:400:d0::1a98:2001 # binaryedge.ninja
-2604:a880:400:d0::1aa0:1001 # binaryedge.ninja
-2604:a880:400:d0::1ab3:6001 # binaryedge.ninja
-2604:a880:400:d0::1ab6:1001 # binaryedge.ninja
-2604:a880:400:d0::1ab8:a001 # binaryedge.ninja
-2604:a880:400:d0::1abf:5001 # binaryedge.ninja
-2604:a880:400:d0::1ac5:8001 # binaryedge.ninja
-2604:a880:400:d0::1ad1:1 # binaryedge.ninja
-2604:a880:400:d0::1ad3:8001 # binaryedge.ninja
-2604:a880:400:d0::1ad4:7001 # binaryedge.ninja
-2604:a880:400:d0::1ad4:e001 # binaryedge.ninja
-2604:a880:400:d0::1b22:d001 # binaryedge.ninja
-2604:a880:400:d0::1b35:f001 # binaryedge.ninja
-2604:a880:400:d0::1b7a:c001 # binaryedge.ninja
-2604:a880:400:d0::1b7c:6001 # binaryedge.ninja
-2604:a880:400:d0::1b9f:4001 # binaryedge.ninja
-2604:a880:400:d0::1bc3:4001 # binaryedge.ninja
-2604:a880:400:d0::1bca:8001 # binaryedge.ninja
-2604:a880:400:d0::1bce:a001 # binaryedge.ninja
-2604:a880:400:d0::1bcf:8001 # binaryedge.ninja
-2604:a880:400:d0::1bd1:f001 # binaryedge.ninja
-2604:a880:400:d0::1bd2:f001 # binaryedge.ninja
-2604:a880:400:d0::1bd4:9001 # binaryedge.ninja
-2604:a880:400:d0::1bdd:7001 # binaryedge.ninja
-2604:a880:400:d0::1be1:b001 # binaryedge.ninja
-2604:a880:400:d0::1bf3:c001 # binaryedge.ninja
-2604:a880:400:d0::1bff:6001 # binaryedge.ninja
-2604:a880:400:d0::1c11:1001 # binaryedge.ninja
-2604:a880:400:d0::1c2c:6001 # binaryedge.ninja
-2604:a880:400:d0::1c44:d001 # binaryedge.ninja
-2604:a880:400:d0::1c5f:c001 # binaryedge.ninja
-2604:a880:400:d0::1c66:7001 # binaryedge.ninja
-2604:a880:400:d0::1cba:d001 # binaryedge.ninja
-2604:a880:400:d0::1cd1:8001 # binaryedge.ninja
-2604:a880:400:d0::1cfd:6001 # binaryedge.ninja
-2604:a880:400:d0::1d0e:1001 # binaryedge.ninja
-2604:a880:400:d0::1d11:8001 # binaryedge.ninja
-2604:a880:400:d0::1d4a:d001 # binaryedge.ninja
-2604:a880:400:d0::1d60:e001 # binaryedge.ninja
-2604:a880:400:d0::1d67:b001 # binaryedge.ninja
-2604:a880:400:d0::1d6e:2001 # binaryedge.ninja
-2604:a880:400:d0::1d8d:4001 # binaryedge.ninja
-2604:a880:400:d0::1d9c:7001 # binaryedge.ninja
-2604:a880:400:d0::1da2:2001 # binaryedge.ninja
-2604:a880:400:d0::1db9:9001 # binaryedge.ninja
-2604:a880:400:d0::1dbb:b001 # binaryedge.ninja
-2604:a880:400:d0::1dcb:b001 # binaryedge.ninja
-2604:a880:400:d0::1de1:2001 # binaryedge.ninja
-2604:a880:400:d0::1dee:7001 # binaryedge.ninja
-2604:a880:400:d0::1df0:d001 # binaryedge.ninja
-2604:a880:400:d0::1e0a:3001 # binaryedge.ninja
-2604:a880:400:d0::1e1a:4001 # binaryedge.ninja
-2604:a880:400:d0::1e20:6001 # binaryedge.ninja
-2604:a880:400:d0::1e56:7001 # binaryedge.ninja
-2604:a880:400:d0::1e59:b001 # binaryedge.ninja
-2604:a880:400:d0::1e6c:d001 # binaryedge.ninja
-2604:a880:400:d0::1e73:a001 # binaryedge.ninja
-2604:a880:400:d0::1e76:2001 # binaryedge.ninja
-2604:a880:400:d0::1e7d:6001 # binaryedge.ninja
-2604:a880:400:d0::1e81:f001 # binaryedge.ninja
-2604:a880:400:d0::1e83:9001 # binaryedge.ninja
-2604:a880:400:d0::1e88:f001 # binaryedge.ninja
-2604:a880:400:d0::1e95:8001 # binaryedge.ninja
-2604:a880:400:d0::1ebd:1 # binaryedge.ninja
-2604:a880:400:d0::1ede:7001 # binaryedge.ninja
-2604:a880:400:d0::1ef2:d001 # binaryedge.ninja
-2604:a880:400:d0::1f0b:f001 # binaryedge.ninja
-2604:a880:400:d0::1f18:9001 # binaryedge.ninja
-2604:a880:400:d0::1f1e:1001 # binaryedge.ninja
-2604:a880:400:d0::1f3b:7001 # binaryedge.ninja
-2604:a880:400:d0::1f63:8001 # binaryedge.ninja
-2604:a880:400:d0::1f70:1001 # binaryedge.ninja
-2604:a880:400:d0::1f86:8001 # binaryedge.ninja
-2604:a880:400:d0::1f8b:2001 # binaryedge.ninja
-2604:a880:400:d0::1f98:e001 # binaryedge.ninja
-2604:a880:400:d0::1fb2:5001 # binaryedge.ninja
-2604:a880:400:d0::1fbc:3001 # binaryedge.ninja
-2604:a880:400:d0::1fca:6001 # binaryedge.ninja
-2604:a880:400:d0::1fcc:d001 # binaryedge.ninja
-2604:a880:400:d0::1fce:6001 # binaryedge.ninja
-2604:a880:400:d0::2004:5001 # binaryedge.ninja
-2604:a880:400:d0::201a:6001 # binaryedge.ninja
-2604:a880:400:d0::2044:d001 # binaryedge.ninja
-2604:a880:400:d0::2058:1 # binaryedge.ninja
-2604:a880:400:d0::2062:7001 # binaryedge.ninja
-2604:a880:400:d0::2063:5001 # binaryedge.ninja
-2604:a880:400:d0::2066:c001 # binaryedge.ninja
-2604:a880:400:d0::2073:8001 # binaryedge.ninja
-2604:a880:400:d0::2077:3001 # binaryedge.ninja
-2604:a880:400:d0::2085:6001 # binaryedge.ninja
-2604:a880:400:d0::208f:3001 # binaryedge.ninja
-2604:a880:400:d0::20ce:7001 # binaryedge.ninja
-2604:a880:400:d0::2126:4001 # binaryedge.ninja
-2604:a880:400:d0::212a:9001 # binaryedge.ninja
-2604:a880:400:d0::218c:f001 # binaryedge.ninja
-2604:a880:400:d0::21a4:c001 # binaryedge.ninja
-2604:a880:400:d0::21c5:3001 # binaryedge.ninja
-2604:a880:400:d0::21d6:8001 # binaryedge.ninja
-2604:a880:400:d0::21dc:4001 # binaryedge.ninja
-2604:a880:400:d0::21f9:6001 # binaryedge.ninja
-2604:a880:400:d0::21fa:1 # binaryedge.ninja
-2604:a880:400:d0::21fd:d001 # binaryedge.ninja
-2604:a880:400:d0::2202:b001 # binaryedge.ninja
-2604:a880:400:d0::2209:c001 # binaryedge.ninja
-2604:a880:400:d0::220b:b001 # binaryedge.ninja
-2604:a880:400:d0::220f:e001 # binaryedge.ninja
-2604:a880:400:d0::221c:3001 # binaryedge.ninja
-2604:a880:400:d0::2227:1001 # binaryedge.ninja
-2604:a880:400:d0::225f:d001 # binaryedge.ninja
-2604:a880:400:d0::2271:8001 # binaryedge.ninja
-2604:a880:400:d0::2273:3001 # binaryedge.ninja
-2604:a880:400:d0::227a:a001 # binaryedge.ninja
-2604:a880:400:d0::227c:4001 # binaryedge.ninja
-2604:a880:400:d0::228e:a001 # binaryedge.ninja
-2604:a880:400:d0::229a:c001 # binaryedge.ninja
-2604:a880:400:d0::22c1:5001 # binaryedge.ninja
-2604:a880:400:d0::22d5:c001 # binaryedge.ninja
-2604:a880:400:d0::22d7:3001 # binaryedge.ninja
-2604:a880:400:d0::22f9:d001 # binaryedge.ninja
-2604:a880:400:d0::22fc:b001 # binaryedge.ninja
-2604:a880:400:d0::2304:c001 # binaryedge.ninja
-2604:a880:400:d0::2308:e001 # binaryedge.ninja
-2604:a880:400:d0::2312:a001 # binaryedge.ninja
-2604:a880:400:d0::231f:4001 # binaryedge.ninja
-2604:a880:400:d0::2322:4001 # binaryedge.ninja
-2604:a880:400:d0::2326:4001 # binaryedge.ninja
-2604:a880:400:d0::2332:e001 # binaryedge.ninja
-2604:a880:400:d0::2335:2001 # binaryedge.ninja
-2604:a880:400:d0::233f:1001 # binaryedge.ninja
-2604:a880:400:d0::2340:9001 # binaryedge.ninja
-2604:a880:400:d0::234a:e001 # binaryedge.ninja
-2604:a880:400:d0::234b:1 # binaryedge.ninja
-2604:a880:400:d0::234c:9001 # binaryedge.ninja
-2604:a880:400:d0::234e:f001 # binaryedge.ninja
-2604:a880:400:d0::234f:4001 # binaryedge.ninja
-2604:a880:400:d0::2351:1001 # binaryedge.ninja
-2604:a880:400:d0::2355:a001 # binaryedge.ninja
-2604:a880:400:d0::2359:e001 # binaryedge.ninja
-2604:a880:400:d0::235a:2001 # binaryedge.ninja
-2604:a880:400:d0::235d:f001 # binaryedge.ninja
-2604:a880:400:d0::2365:5001 # binaryedge.ninja
-2604:a880:400:d0::23bb:9001 # binaryedge.ninja
-2604:a880:400:d0::23bf:9001 # binaryedge.ninja
-2604:a880:400:d0::23c2:f001 # binaryedge.ninja
-2604:a880:400:d0::23c7:c001 # binaryedge.ninja
-2604:a880:400:d0::23dd:b001 # binaryedge.ninja
-2604:a880:400:d0::23e1:a001 # binaryedge.ninja
-2604:a880:400:d0::23f1:2001 # binaryedge.ninja
-2604:a880:400:d0::23f8:1001 # binaryedge.ninja
-2604:a880:400:d0::241e:c001 # binaryedge.ninja
-2604:a880:400:d0::2423:3001 # binaryedge.ninja
-2604:a880:400:d0::2424:1 # binaryedge.ninja
-2604:a880:400:d0::242d:e001 # binaryedge.ninja
-2604:a880:400:d0::242e:f001 # binaryedge.ninja
-2604:a880:400:d0::242f:7001 # binaryedge.ninja
-2604:a880:400:d0::242f:9001 # binaryedge.ninja
-2604:a880:400:d0::2430:1001 # binaryedge.ninja
-2604:a880:400:d0::2431:4001 # binaryedge.ninja
-2604:a880:400:d0::2434:2001 # binaryedge.ninja
-2604:a880:400:d0::2435:2001 # binaryedge.ninja
-2604:a880:400:d0::2435:3001 # binaryedge.ninja
-2604:a880:400:d0::244d:8001 # binaryedge.ninja
-2604:a880:400:d0::2457:3001 # binaryedge.ninja
-2604:a880:400:d0::2457:8001 # binaryedge.ninja
-2604:a880:400:d0::2458:2001 # binaryedge.ninja
-2604:a880:400:d0::2458:8001 # binaryedge.ninja
-2604:a880:400:d0::245a:d001 # binaryedge.ninja
-2604:a880:400:d0::245b:6001 # binaryedge.ninja
-2604:a880:400:d0::245b:b001 # binaryedge.ninja
-2604:a880:400:d0::2464:6001 # binaryedge.ninja
-2604:a880:400:d0::2473:a001 # binaryedge.ninja
-2604:a880:400:d0::247c:4001 # binaryedge.ninja
-2604:a880:400:d0::248b:f001 # binaryedge.ninja
-2604:a880:400:d0::24bf:6001 # binaryedge.ninja
-2604:a880:400:d0::24c1:7001 # binaryedge.ninja
-2604:a880:400:d0::24c7:a001 # binaryedge.ninja
-2604:a880:400:d0::24c7:c001 # binaryedge.ninja
-2604:a880:400:d0::24d3:5001 # binaryedge.ninja
-2604:a880:400:d0::24d4:9001 # binaryedge.ninja
-2604:a880:400:d0::24df:f001 # binaryedge.ninja
-2604:a880:400:d0::24e3:b001 # binaryedge.ninja
-2604:a880:400:d0::24ea:6001 # binaryedge.ninja
-2604:a880:400:d0::2504:e001 # binaryedge.ninja
-2604:a880:400:d0::2507:6001 # binaryedge.ninja
-2604:a880:400:d0::2508:3001 # binaryedge.ninja
-2604:a880:400:d0::2520:c001 # binaryedge.ninja
-2604:a880:400:d0::2527:f001 # binaryedge.ninja
-2604:a880:400:d0::252d:f001 # binaryedge.ninja
-2604:a880:400:d0::2542:9001 # binaryedge.ninja
-2604:a880:400:d0::2557:9001 # binaryedge.ninja
-2604:a880:400:d0::256f:b001 # binaryedge.ninja
-2604:a880:400:d0::256f:d001 # binaryedge.ninja
-2604:a880:400:d0::2570:7001 # binaryedge.ninja
-2604:a880:400:d0::2586:9001 # binaryedge.ninja
-2604:a880:400:d0::2587:1001 # binaryedge.ninja
-2604:a880:400:d0::258c:8001 # binaryedge.ninja
-2604:a880:400:d0::258f:1001 # binaryedge.ninja
-2604:a880:400:d0::258f:6001 # binaryedge.ninja
-2604:a880:400:d0::2592:c001 # binaryedge.ninja
-2604:a880:400:d0::25a4:8001 # binaryedge.ninja
-2604:a880:400:d0::25a9:3001 # binaryedge.ninja
-2604:a880:400:d0::25b1:9001 # binaryedge.ninja
-2604:a880:400:d0::25c7:6001 # binaryedge.ninja
-2604:a880:400:d0::25e5:9001 # binaryedge.ninja
-2604:a880:400:d0::25e5:f001 # binaryedge.ninja
-2604:a880:400:d0::25f1:c001 # binaryedge.ninja
-2604:a880:400:d0::25f2:7001 # binaryedge.ninja
-2604:a880:400:d0::25fb:c001 # binaryedge.ninja
-2604:a880:400:d0::25fc:f001 # binaryedge.ninja
-2604:a880:400:d0::2603:6001 # binaryedge.ninja
-2604:a880:400:d0::260c:2001 # binaryedge.ninja
-2604:a880:400:d0::2619:a001 # binaryedge.ninja
-2604:a880:400:d0::261b:a001 # binaryedge.ninja
-2604:a880:400:d0::261c:9001 # binaryedge.ninja
-2604:a880:400:d0::261d:b001 # binaryedge.ninja
-2604:a880:400:d0::2626:b001 # binaryedge.ninja
-2604:a880:400:d0::2638:d001 # binaryedge.ninja
-2604:a880:400:d0::2642:7001 # binaryedge.ninja
-2604:a880:400:d0::2645:8001 # binaryedge.ninja
-2604:a880:400:d0::2646:5001 # binaryedge.ninja
-2604:a880:400:d0::2647:5001 # binaryedge.ninja
-2604:a880:400:d0::2647:c001 # binaryedge.ninja
-2604:a880:400:d0::2648:6001 # binaryedge.ninja
-2604:a880:400:d0::2649:1 # binaryedge.ninja
-2604:a880:400:d0::2651:2001 # binaryedge.ninja
-2604:a880:400:d0::265c:2001 # binaryedge.ninja
-2604:a880:400:d0::265d:3001 # binaryedge.ninja
-2604:a880:400:d0::265e:d001 # binaryedge.ninja
-2604:a880:400:d0::265e:e001 # binaryedge.ninja
-2604:a880:400:d0::2660:2001 # binaryedge.ninja
-2604:a880:400:d0::2660:7001 # binaryedge.ninja
-2604:a880:400:d0::2660:e001 # binaryedge.ninja
-2604:a880:400:d0::2664:6001 # binaryedge.ninja
-2604:a880:400:d0::2666:c001 # binaryedge.ninja
-2604:a880:400:d0::266b:2001 # binaryedge.ninja
-2604:a880:400:d0::2674:b001 # binaryedge.ninja
-2604:a880:400:d0::267b:2001 # binaryedge.ninja
-2604:a880:400:d0::2686:9001 # binaryedge.ninja
-2604:a880:400:d0::2688:1001 # binaryedge.ninja
-2604:a880:400:d0::2688:c001 # binaryedge.ninja
-2604:a880:400:d0::268a:b001 # binaryedge.ninja
-2604:a880:400:d0::2692:9001 # binaryedge.ninja
-2604:a880:400:d0::2693:d001 # binaryedge.ninja
-2604:a880:400:d0::2694:a001 # binaryedge.ninja
-2604:a880:400:d0::2694:d001 # binaryedge.ninja
-2604:a880:400:d0::2694:e001 # binaryedge.ninja
-2604:a880:400:d0::26a7:9001 # binaryedge.ninja
-2604:a880:400:d0::26a7:d001 # binaryedge.ninja
-2604:a880:400:d0::26a8:8001 # binaryedge.ninja
-2604:a880:400:d0::26a8:e001 # binaryedge.ninja
-2604:a880:400:d0::26a8:f001 # binaryedge.ninja
-2604:a880:400:d0::26a9:5001 # binaryedge.ninja
-2604:a880:400:d0::26aa:1 # binaryedge.ninja
-2604:a880:400:d0::26aa:5001 # binaryedge.ninja
-2604:a880:400:d0::26aa:9001 # binaryedge.ninja
-2604:a880:400:d0::26ab:c001 # binaryedge.ninja
-2604:a880:400:d0::26ac:7001 # binaryedge.ninja
-2604:a880:400:d0::26ac:c001 # binaryedge.ninja
-2604:a880:400:d0::26ac:e001 # binaryedge.ninja
-2604:a880:400:d0::26ad:5001 # binaryedge.ninja
-2604:a880:400:d0::26ad:6001 # binaryedge.ninja
-2604:a880:400:d0::26ad:9001 # binaryedge.ninja
-2604:a880:400:d0::26ad:f001 # binaryedge.ninja
-2604:a880:400:d0::26ae:1001 # binaryedge.ninja
-2604:a880:400:d0::26ae:3001 # binaryedge.ninja
-2604:a880:400:d0::26ae:5001 # binaryedge.ninja
-2604:a880:400:d0::26ae:9001 # binaryedge.ninja
-2604:a880:400:d0::26ae:b001 # binaryedge.ninja
-2604:a880:400:d0::26ae:c001 # binaryedge.ninja
-2604:a880:400:d0::26af:8001 # binaryedge.ninja
-2604:a880:400:d0::26af:9001 # binaryedge.ninja
-2604:a880:400:d0::26af:e001 # binaryedge.ninja
-2604:a880:400:d0::26b0:1001 # binaryedge.ninja
-2604:a880:400:d0::26b5:2001 # binaryedge.ninja
-2604:a880:400:d0::26b6:1 # binaryedge.ninja
-2604:a880:400:d0::26b6:e001 # binaryedge.ninja
-2604:a880:400:d0::331:3001 # binaryedge.ninja
-2604:a880:400:d0::35d:d001 # binaryedge.ninja
-2604:a880:400:d0::3b9:1001 # binaryedge.ninja
-2604:a880:400:d0::52:a001 # binaryedge.ninja
-2604:a880:400:d0::52e:c001 # binaryedge.ninja
-2604:a880:400:d0::55:8001 # binaryedge.ninja
-2604:a880:400:d0::62:f001 # binaryedge.ninja
-2604:a880:400:d0::9a4:4001 # binaryedge.ninja
-2604:a880:400:d0::9af:5001 # binaryedge.ninja
-2604:a880:400:d0::a4:3001 # binaryedge.ninja
-2604:a880:400:d0::dcf:2001 # binaryedge.ninja
-2604:a880:4:1d0::105:9000 # binaryedge.ninja
-2604:a880:4:1d0::110:3000 # binaryedge.ninja
-2604:a880:4:1d0::188:2000 # binaryedge.ninja
-2604:a880:4:1d0::1a4:4000 # binaryedge.ninja
-2604:a880:4:1d0::1d4:e000 # binaryedge.ninja
-2604:a880:4:1d0::21e:4000 # binaryedge.ninja
-2604:a880:4:1d0::24f:8000 # binaryedge.ninja
-2604:a880:4:1d0::291:a000 # binaryedge.ninja
-2604:a880:4:1d0::2ba:d000 # binaryedge.ninja
-2604:a880:4:1d0::2bc:3000 # binaryedge.ninja
-2604:a880:4:1d0::322:f000 # binaryedge.ninja
-2604:a880:4:1d0::38b:3000 # binaryedge.ninja
-2604:a880:4:1d0::392:5000 # binaryedge.ninja
-2604:a880:4:1d0::3a9:f000 # binaryedge.ninja
-2604:a880:4:1d0::411:4000 # binaryedge.ninja
-2604:a880:4:1d0::419:f000 # binaryedge.ninja
-2604:a880:4:1d0::439:1000 # binaryedge.ninja
-2604:a880:4:1d0::493:7000 # binaryedge.ninja
-2604:a880:4:1d0::4ad:a000 # binaryedge.ninja
-2604:a880:4:1d0::4ba:c000 # binaryedge.ninja
-2604:a880:4:1d0::4dd:c000 # binaryedge.ninja
-2604:a880:4:1d0::4de:0 # binaryedge.ninja
-2604:a880:4:1d0::4e4:f000 # binaryedge.ninja
-2604:a880:4:1d0::4ff:9000 # binaryedge.ninja
-2604:a880:4:1d0::509:a000 # binaryedge.ninja
-2604:a880:4:1d0::517:3000 # binaryedge.ninja
-2604:a880:4:1d0::51d:1000 # binaryedge.ninja
-2604:a880:4:1d0::51d:3000 # binaryedge.ninja
-2604:a880:4:1d0::521:1000 # binaryedge.ninja
-2604:a880:4:1d0::527:1000 # binaryedge.ninja
-2604:a880:4:1d0::558:c000 # binaryedge.ninja
-2604:a880:4:1d0::57e:2000 # binaryedge.ninja
-2604:a880:4:1d0::584:c000 # binaryedge.ninja
-2604:a880:4:1d0::5d2:9000 # binaryedge.ninja
-2604:a880:4:1d0::608:f000 # binaryedge.ninja
-2604:a880:4:1d0::619:d000 # binaryedge.ninja
-2604:a880:4:1d0::632:9000 # binaryedge.ninja
-2604:a880:4:1d0::655:3000 # binaryedge.ninja
-2604:a880:4:1d0::65e:9000 # binaryedge.ninja
-2604:a880:4:1d0::67b:8000 # binaryedge.ninja
-2604:a880:4:1d0::6aa:c000 # binaryedge.ninja
-2604:a880:4:1d0::6af:d000 # binaryedge.ninja
-2604:a880:4:1d0::6cb:6000 # binaryedge.ninja
-2604:a880:4:1d0::6cb:d000 # binaryedge.ninja
-2604:a880:4:1d0::6cc:6000 # binaryedge.ninja
-2604:a880:4:1d0::6cd:5000 # binaryedge.ninja
-2604:a880:4:1d0::6ce:4000 # binaryedge.ninja
-2604:a880:4:1d0::6ce:9000 # binaryedge.ninja
-2604:a880:4:1d0::6cf:4000 # binaryedge.ninja
-2604:a880:4:1d0::6cf:f000 # binaryedge.ninja
-2604:a880:4:1d0::6d0:e000 # binaryedge.ninja
-2604:a880:4:1d0::6d1:b000 # binaryedge.ninja
-2604:a880:4:1d0::6d1:f000 # binaryedge.ninja
-2604:a880:4:1d0::6d2:8000 # binaryedge.ninja
-2604:a880:4:1d0::6d2:f000 # binaryedge.ninja
-2604:a880:4:1d0::6d3:1000 # binaryedge.ninja
-2604:a880:4:1d0::6d3:c000 # binaryedge.ninja
-2604:a880:4:1d0::6d3:d000 # binaryedge.ninja
-2604:a880:4:1d0::6d4:8000 # binaryedge.ninja
-2604:a880:4:1d0::6d4:a000 # binaryedge.ninja
-2604:a880:4:1d0::6d4:c000 # binaryedge.ninja
-2604:a880:4:1d0::6d5:3000 # binaryedge.ninja
-2604:a880:4:1d0::6d5:5000 # binaryedge.ninja
-2604:a880:4:1d0::6d5:7000 # binaryedge.ninja
-2604:a880:4:1d0::6d5:8000 # binaryedge.ninja
-2604:a880:4:1d0::6d5:9000 # binaryedge.ninja
-2604:a880:4:1d0::6d5:b000 # binaryedge.ninja
-2604:a880:4:1d0::6d6:1000 # binaryedge.ninja
-2604:a880:4:1d0::6d6:4000 # binaryedge.ninja
-2604:a880:4:1d0::6d6:c000 # binaryedge.ninja
-2604:a880:4:1d0::6d7:0 # binaryedge.ninja
-2604:a880:4:1d0::6d7:3000 # binaryedge.ninja
-2604:a880:4:1d0::6d7:9000 # binaryedge.ninja
-2604:a880:4:1d0::6d8:0 # binaryedge.ninja
-2604:a880:4:1d0::6d8:8000 # binaryedge.ninja
-2604:a880:4:1d0::6d9:5000 # binaryedge.ninja
-2604:a880:4:1d0::6db:f000 # binaryedge.ninja
-2604:a880:4:1d0::6dc:0 # binaryedge.ninja
-2604:a880:4:1d0::6dc:8000 # binaryedge.ninja
-2604:a880:4:1d0::6dc:b000 # binaryedge.ninja
-2604:a880:4:1d0::6de:6000 # binaryedge.ninja
-2604:a880:4:1d0::6df:6000 # binaryedge.ninja
-2604:a880:4:1d0::6e1:e000 # binaryedge.ninja
-2604:a880:4:1d0::6e2:8000 # binaryedge.ninja
-2604:a880:4:1d0::6e2:e000 # binaryedge.ninja
-2604:a880:4:1d0::6e3:9000 # binaryedge.ninja
-2604:a880:4:1d0::6e6:4000 # binaryedge.ninja
-2604:a880:4:1d0::6e7:0 # binaryedge.ninja
-2604:a880:4:1d0::6e7:3000 # binaryedge.ninja
-2604:a880:4:1d0::6e8:6000 # binaryedge.ninja
-2604:a880:4:1d0::6e8:e000 # binaryedge.ninja
-2604:a880:4:1d0::6e9:1000 # binaryedge.ninja
-2604:a880:4:1d0::6ea:5000 # binaryedge.ninja
-2604:a880:4:1d0::6ea:7000 # binaryedge.ninja
-2604:a880:4:1d0::6ea:a000 # binaryedge.ninja
-2604:a880:4:1d0::6ea:c000 # binaryedge.ninja
-2604:a880:4:1d0::6ea:d000 # binaryedge.ninja
-2604:a880:4:1d0::6eb:1000 # binaryedge.ninja
-2604:a880:4:1d0::6eb:4000 # binaryedge.ninja
-2604:a880:4:1d0::6eb:c000 # binaryedge.ninja
-2604:a880:4:1d0::6ec:d000 # binaryedge.ninja
-2604:a880:4:1d0::6ec:e000 # binaryedge.ninja
-2604:a880:4:1d0::6ed:0 # binaryedge.ninja
-2604:a880:4:1d0::6ed:b000 # binaryedge.ninja
-2604:a880:4:1d0::6ed:c000 # binaryedge.ninja
-2604:a880:4:1d0::6ee:1000 # binaryedge.ninja
-2604:a880:4:1d0::6ee:2000 # binaryedge.ninja
-2604:a880:4:1d0::6ee:3000 # binaryedge.ninja
-2604:a880:4:1d0::6ee:6000 # binaryedge.ninja
-2604:a880:4:1d0::6ee:8000 # binaryedge.ninja
-2604:a880:4:1d0::6ef:1000 # binaryedge.ninja
-2604:a880:4:1d0::6ef:2000 # binaryedge.ninja
-2604:a880:4:1d0::6ef:9000 # binaryedge.ninja
-2604:a880:4:1d0::6f0:3000 # binaryedge.ninja
-2604:a880:4:1d0::6f0:4000 # binaryedge.ninja
-2604:a880:4:1d0::6f0:8000 # binaryedge.ninja
-2604:a880:4:1d0::6f0:b000 # binaryedge.ninja
-2604:a880:4:1d0::6f1:1000 # binaryedge.ninja
-2604:a880:4:1d0::6f2:2000 # binaryedge.ninja
-2604:a880:4:1d0::6f3:2000 # binaryedge.ninja
-2604:a880:4:1d0::6f3:4000 # binaryedge.ninja
-2604:a880:4:1d0::88:7000 # binaryedge.ninja
-2604:a880:4:1d0::8b:e000 # binaryedge.ninja
-2604:a880:4:1d0::c4:b000 # binaryedge.ninja
-2604:a880:800:10::27a:6001 # binaryedge.ninja
-2604:a880:800:10::2f0:3001 # binaryedge.ninja
-2604:a880:800:10::3da:d001 # binaryedge.ninja
-2604:a880:800:10::3f2:c001 # binaryedge.ninja
-2604:a880:800:10::45:1001 # binaryedge.ninja
-2604:a880:800:10::48d:3001 # binaryedge.ninja
-2604:a880:800:10::5aa:5001 # binaryedge.ninja
-2604:a880:800:10::5da:d001 # binaryedge.ninja
-2604:a880:800:10::5de:1001 # binaryedge.ninja
-2604:a880:800:10::5ee:d001 # binaryedge.ninja
-2604:a880:800:10::604:3001 # binaryedge.ninja
-2604:a880:800:10::64:5001 # binaryedge.ninja
-2604:a880:800:10::685:b001 # binaryedge.ninja
-2604:a880:800:10::694:d001 # binaryedge.ninja
-2604:a880:800:10::69e:d001 # binaryedge.ninja
-2604:a880:800:10::6b4:5001 # binaryedge.ninja
-2604:a880:800:10::6dc:e001 # binaryedge.ninja
-2604:a880:800:10::6e7:4001 # binaryedge.ninja
-2604:a880:800:10::750:8001 # binaryedge.ninja
-2604:a880:800:10::76b:3001 # binaryedge.ninja
-2604:a880:800:10::784:4001 # binaryedge.ninja
-2604:a880:800:10::7e4:f001 # binaryedge.ninja
-2604:a880:800:10::7f5:4001 # binaryedge.ninja
-2604:a880:800:10::802:1 # binaryedge.ninja
-2604:a880:800:10::873:6001 # binaryedge.ninja
-2604:a880:800:10::893:a001 # binaryedge.ninja
-2604:a880:800:10::8af:a001 # binaryedge.ninja
-2604:a880:800:10::8b0:5001 # binaryedge.ninja
-2604:a880:800:10::8b2:b001 # binaryedge.ninja
-2604:a880:800:10::8c8:2001 # binaryedge.ninja
-2604:a880:800:10::8d2:1001 # binaryedge.ninja
-2604:a880:800:10::8fa:3001 # binaryedge.ninja
-2604:a880:800:10::91b:4001 # binaryedge.ninja
-2604:a880:800:10::91b:b001 # binaryedge.ninja
-2604:a880:800:10::923:b001 # binaryedge.ninja
-2604:a880:800:10::92b:1 # binaryedge.ninja
-2604:a880:800:10::960:9001 # binaryedge.ninja
-2604:a880:800:10::96d:3001 # binaryedge.ninja
-2604:a880:800:10::97f:2001 # binaryedge.ninja
-2604:a880:800:10::980:3001 # binaryedge.ninja
-2604:a880:800:10::997:2001 # binaryedge.ninja
-2604:a880:800:10::997:3001 # binaryedge.ninja
-2604:a880:800:10::997:7001 # binaryedge.ninja
-2604:a880:800:10::99c:9001 # binaryedge.ninja
-2604:a880:800:10::9ae:a001 # binaryedge.ninja
-2604:a880:800:10::9b2:1001 # binaryedge.ninja
-2604:a880:800:10::9b4:a001 # binaryedge.ninja
-2604:a880:800:10::9b4:d001 # binaryedge.ninja
-2604:a880:800:10::9bd:7001 # binaryedge.ninja
-2604:a880:800:10::9c7:3001 # binaryedge.ninja
-2604:a880:800:10::9ce:8001 # binaryedge.ninja
-2604:a880:800:10::9d2:a001 # binaryedge.ninja
-2604:a880:800:10::9dc:6001 # binaryedge.ninja
-2604:a880:800:10::9dd:7001 # binaryedge.ninja
-2604:a880:800:10::9e9:2001 # binaryedge.ninja
-2604:a880:800:10::9ea:6001 # binaryedge.ninja
-2604:a880:800:10::9ec:8001 # binaryedge.ninja
-2604:a880:800:10::9f0:8001 # binaryedge.ninja
-2604:a880:800:10::9f0:a001 # binaryedge.ninja
-2604:a880:800:10::9f0:e001 # binaryedge.ninja
-2604:a880:800:10::9f0:f001 # binaryedge.ninja
-2604:a880:800:10::9f2:d001 # binaryedge.ninja
-2604:a880:800:10::9f5:2001 # binaryedge.ninja
-2604:a880:800:10::9f5:e001 # binaryedge.ninja
-2604:a880:800:10::9fb:4001 # binaryedge.ninja
-2604:a880:800:10::a02:6001 # binaryedge.ninja
-2604:a880:800:10::a03:f001 # binaryedge.ninja
-2604:a880:800:10::a05:1001 # binaryedge.ninja
-2604:a880:800:10::a0c:6001 # binaryedge.ninja
-2604:a880:800:10::a17:7001 # binaryedge.ninja
-2604:a880:800:10::a2d:f001 # binaryedge.ninja
-2604:a880:800:10::a2e:b001 # binaryedge.ninja
-2604:a880:800:10::a31:b001 # binaryedge.ninja
-2604:a880:800:10::a33:8001 # binaryedge.ninja
-2604:a880:800:10::a37:5001 # binaryedge.ninja
-2604:a880:800:10::a39:a001 # binaryedge.ninja
-2604:a880:800:10::a3b:2001 # binaryedge.ninja
-2604:a880:800:10::a3c:1 # binaryedge.ninja
-2604:a880:800:10::a3d:3001 # binaryedge.ninja
-2604:a880:800:10::a3f:8001 # binaryedge.ninja
-2604:a880:800:10::a40:5001 # binaryedge.ninja
-2604:a880:800:10::a41:8001 # binaryedge.ninja
-2604:a880:800:10::a42:1 # binaryedge.ninja
-2604:a880:800:10::a42:6001 # binaryedge.ninja
-2604:a880:800:10::a43:c001 # binaryedge.ninja
-2604:a880:800:10::a44:3001 # binaryedge.ninja
-2604:a880:800:10::a45:3001 # binaryedge.ninja
-2604:a880:800:10::a49:2001 # binaryedge.ninja
-2604:a880:800:10::a4a:d001 # binaryedge.ninja
-2604:a880:800:10::a55:1001 # binaryedge.ninja
-2604:a880:800:10::a64:b001 # binaryedge.ninja
-2604:a880:800:10::a9e:d001 # binaryedge.ninja
-2604:a880:800:10::aa2:7001 # binaryedge.ninja
-2604:a880:800:10::b05:f001 # binaryedge.ninja
-2604:a880:800:10::b4:7001 # binaryedge.ninja
-2604:a880:800:10::b58:a001 # binaryedge.ninja
-2604:a880:800:10::b63:e001 # binaryedge.ninja
-2604:a880:800:10::b75:4001 # binaryedge.ninja
-2604:a880:800:10::b9d:2001 # binaryedge.ninja
-2604:a880:800:10::b9e:6001 # binaryedge.ninja
-2604:a880:800:10::ba4:c001 # binaryedge.ninja
-2604:a880:800:10::ba7:1 # binaryedge.ninja
-2604:a880:800:10::ba7:2001 # binaryedge.ninja
-2604:a880:800:10::ba9:6001 # binaryedge.ninja
-2604:a880:800:10::bae:4001 # binaryedge.ninja
-2604:a880:800:10::bb0:b001 # binaryedge.ninja
-2604:a880:800:10::bb6:6001 # binaryedge.ninja
-2604:a880:800:10::bbb:d001 # binaryedge.ninja
-2604:a880:800:10::bc3:1 # binaryedge.ninja
-2604:a880:800:10::bc6:6001 # binaryedge.ninja
-2604:a880:800:10::bc6:b001 # binaryedge.ninja
-2604:a880:800:10::bcc:7001 # binaryedge.ninja
-2604:a880:800:10::bd3:3001 # binaryedge.ninja
-2604:a880:800:10::bd3:d001 # binaryedge.ninja
-2604:a880:800:10::bd9:4001 # binaryedge.ninja
-2604:a880:800:10::bdc:4001 # binaryedge.ninja
-2604:a880:800:10::be1:1001 # binaryedge.ninja
-2604:a880:800:10::d8:1 # binaryedge.ninja
-2604:a880:800:10::fe:3001 # binaryedge.ninja
-2604:a880:cad:d0::28a:8001 # binaryedge.ninja
-2604:a880:cad:d0::31:2001 # binaryedge.ninja
-2604:a880:cad:d0::39f:3001 # binaryedge.ninja
-2604:a880:cad:d0::83:d001 # binaryedge.ninja
-2604:a880:cad:d0::91f:3001 # binaryedge.ninja
-2604:a880:cad:d0::bc5:7001 # binaryedge.ninja
-2604:a880:cad:d0::bc6:9001 # binaryedge.ninja
-2604:a880:cad:d0::bd1:1001 # binaryedge.ninja
-2604:a880:cad:d0::bd4:e001 # binaryedge.ninja
-2604:a880:cad:d0::bfa:3001 # binaryedge.ninja
-2604:a880:cad:d0::bff:7001 # binaryedge.ninja
-2604:a880:cad:d0::c18:8001 # binaryedge.ninja
-2604:a880:cad:d0::c25:5001 # binaryedge.ninja
-2604:a880:cad:d0::c37:a001 # binaryedge.ninja
-2604:a880:cad:d0::c39:9001 # binaryedge.ninja
-2604:a880:cad:d0::c45:1001 # binaryedge.ninja
-2604:a880:cad:d0::c4c:a001 # binaryedge.ninja
-2604:a880:cad:d0::c5d:7001 # binaryedge.ninja
-2604:a880:cad:d0::c67:d001 # binaryedge.ninja
-2604:a880:cad:d0::c6d:7001 # binaryedge.ninja
-2604:a880:cad:d0::c7f:1 # binaryedge.ninja
-2604:a880:cad:d0::c96:3001 # binaryedge.ninja
-2604:a880:cad:d0::ca1:c001 # binaryedge.ninja
-2604:a880:cad:d0::ca2:4001 # binaryedge.ninja
-2604:a880:cad:d0::ca5:1001 # binaryedge.ninja
-2604:a880:cad:d0::cdc:1 # binaryedge.ninja
-2604:a880:cad:d0::ce4:b001 # binaryedge.ninja
-2604:a880:cad:d0::cf2:1001 # binaryedge.ninja
-2604:a880:cad:d0::cf7:d001 # binaryedge.ninja
-2604:a880:cad:d0::cfb:4001 # binaryedge.ninja
-2604:a880:cad:d0::d26:8001 # binaryedge.ninja
-2604:a880:cad:d0::d32:9001 # binaryedge.ninja
-2604:a880:cad:d0::d34:9001 # binaryedge.ninja
-2604:a880:cad:d0::d39:2001 # binaryedge.ninja
-2604:a880:cad:d0::d39:c001 # binaryedge.ninja
-2604:a880:cad:d0::d3a:2001 # binaryedge.ninja
-2604:a880:cad:d0::d3f:1001 # binaryedge.ninja
-2604:a880:cad:d0::d3f:8001 # binaryedge.ninja
-2604:a880:cad:d0::d46:8001 # binaryedge.ninja
-2604:a880:cad:d0::d46:f001 # binaryedge.ninja
-2604:a880:cad:d0::d4b:a001 # binaryedge.ninja
-2604:a880:cad:d0::d54:9001 # binaryedge.ninja
-2604:a880:cad:d0::d58:9001 # binaryedge.ninja
-2604:a880:cad:d0::d5d:3001 # binaryedge.ninja
-2604:a880:cad:d0::d5e:f001 # binaryedge.ninja
-2604:a880:cad:d0::d60:b001 # binaryedge.ninja
-2604:a880:cad:d0::d6f:f001 # binaryedge.ninja
-2604:a880:cad:d0::d75:1001 # binaryedge.ninja
-2604:a880:cad:d0::d75:4001 # binaryedge.ninja
-2604:a880:cad:d0::d75:a001 # binaryedge.ninja
-2604:a880:cad:d0::d82:d001 # binaryedge.ninja
-2604:a880:cad:d0::d85:f001 # binaryedge.ninja
-2604:a880:cad:d0::d89:b001 # binaryedge.ninja
-2604:a880:cad:d0::d90:8001 # binaryedge.ninja
-2604:a880:cad:d0::d91:3001 # binaryedge.ninja
-2604:a880:cad:d0::d91:d001 # binaryedge.ninja
-2604:a880:cad:d0::d94:c001 # binaryedge.ninja
-2604:a880:cad:d0::d96:3001 # binaryedge.ninja
-2604:a880:cad:d0::d97:2001 # binaryedge.ninja
-2604:a880:cad:d0::d98:c001 # binaryedge.ninja
-2604:a880:cad:d0::d9c:7001 # binaryedge.ninja
-2604:a880:cad:d0::d9d:b001 # binaryedge.ninja
-2604:a880:cad:d0::d9f:7001 # binaryedge.ninja
-2604:a880:cad:d0::da3:a001 # binaryedge.ninja
-2604:a880:cad:d0::da4:9001 # binaryedge.ninja
-2604:a880:cad:d0::daa:3001 # binaryedge.ninja
-2604:a880:cad:d0::dab:b001 # binaryedge.ninja
-2604:a880:cad:d0::daf:b001 # binaryedge.ninja
-2604:a880:cad:d0::db4:4001 # binaryedge.ninja
-2604:a880:cad:d0::dbd:a001 # binaryedge.ninja
-2604:a880:cad:d0::dc0:2001 # binaryedge.ninja
-2604:a880:cad:d0::dc5:f001 # binaryedge.ninja
-2604:a880:cad:d0::dca:b001 # binaryedge.ninja
-2604:a880:cad:d0::dd4:f001 # binaryedge.ninja
-2604:a880:cad:d0::dd8:2001 # binaryedge.ninja
-2604:a880:cad:d0::ddd:2001 # binaryedge.ninja
-2604:a880:cad:d0::ddd:6001 # binaryedge.ninja
-2604:a880:cad:d0::de1:2001 # binaryedge.ninja
-2604:a880:cad:d0::de3:5001 # binaryedge.ninja
-2604:a880:cad:d0::de4:e001 # binaryedge.ninja
-2604:a880:cad:d0::de9:1001 # binaryedge.ninja
-2604:a880:cad:d0::de9:4001 # binaryedge.ninja
-2604:a880:cad:d0::deb:1 # binaryedge.ninja
-2604:a880:cad:d0::dee:d001 # binaryedge.ninja
-2604:a880:cad:d0::def:3001 # binaryedge.ninja
-2604:a880:cad:d0::def:c001 # binaryedge.ninja
-2604:a880:cad:d0::df0:4001 # binaryedge.ninja
-2604:a880:cad:d0::df3:8001 # binaryedge.ninja
-2604:a880:cad:d0::df5:4001 # binaryedge.ninja
-2604:a880:cad:d0::df6:3001 # binaryedge.ninja
-2604:a880:cad:d0::dfa:2001 # binaryedge.ninja
-2604:a880:cad:d0::dfb:6001 # binaryedge.ninja
-2604:a880:cad:d0::dfe:2001 # binaryedge.ninja
-2604:a880:cad:d0::e00:2001 # binaryedge.ninja
-2604:a880:cad:d0::e11:9001 # binaryedge.ninja
-2604:a880:cad:d0::e12:d001 # binaryedge.ninja
-2604:a880:cad:d0::e16:7001 # binaryedge.ninja
-2604:a880:cad:d0::e17:3001 # binaryedge.ninja
-2604:a880:cad:d0::e17:f001 # binaryedge.ninja
-2604:a880:cad:d0::e18:4001 # binaryedge.ninja
-2604:a880:cad:d0::e1b:9001 # binaryedge.ninja
-2604:a880:cad:d0::e1c:6001 # binaryedge.ninja
-2604:a880:cad:d0::e24:2001 # binaryedge.ninja
-2604:a880:cad:d0::e28:1001 # binaryedge.ninja
-2604:a880:cad:d0::e28:2001 # binaryedge.ninja
-2604:a880:cad:d0::e29:1001 # binaryedge.ninja
-2604:a880:cad:d0::e2e:a001 # binaryedge.ninja
-2604:a880:cad:d0::e34:3001 # binaryedge.ninja
-2604:a880:cad:d0::e34:7001 # binaryedge.ninja
-2604:a880:cad:d0::e3d:5001 # binaryedge.ninja
-2604:a880:cad:d0::e3d:9001 # binaryedge.ninja
-2604:a880:cad:d0::e43:5001 # binaryedge.ninja
-2604:a880:cad:d0::e46:e001 # binaryedge.ninja
-2604:a880:cad:d0::e47:4001 # binaryedge.ninja
-2604:a880:cad:d0::e55:8001 # binaryedge.ninja
-2604:a880:cad:d0::e5a:5001 # binaryedge.ninja
-2604:a880:cad:d0::e6b:6001 # binaryedge.ninja
-2604:a880:cad:d0::e6b:8001 # binaryedge.ninja
-2604:a880:cad:d0::e6f:e001 # binaryedge.ninja
-2604:a880:cad:d0::e70:1 # binaryedge.ninja
-2604:a880:cad:d0::e72:c001 # binaryedge.ninja
-2604:a880:cad:d0::e72:d001 # binaryedge.ninja
-2604:a880:cad:d0::e75:8001 # binaryedge.ninja
-2604:a880:cad:d0::e79:6001 # binaryedge.ninja
-2604:a880:cad:d0::e7a:4001 # binaryedge.ninja
-2604:a880:cad:d0::e7a:8001 # binaryedge.ninja
-2604:a880:cad:d0::e7c:1001 # binaryedge.ninja
-2604:a880:cad:d0::e7d:4001 # binaryedge.ninja
-2604:a880:cad:d0::e7e:3001 # binaryedge.ninja
-2604:a880:cad:d0::e7f:5001 # binaryedge.ninja
-2604:a880:cad:d0::e86:4001 # binaryedge.ninja
-2604:a880:cad:d0::e87:8001 # binaryedge.ninja
-2604:a880:cad:d0::e8a:e001 # binaryedge.ninja
-2604:a880:cad:d0::e8b:7001 # binaryedge.ninja
-2604:a880:cad:d0::e90:6001 # binaryedge.ninja
-2604:a880:cad:d0::e93:8001 # binaryedge.ninja
-2604:a880:cad:d0::e93:9001 # binaryedge.ninja
-2604:a880:cad:d0::e93:e001 # binaryedge.ninja
-2604:a880:cad:d0::e94:3001 # binaryedge.ninja
-2604:a880:cad:d0::e98:1 # binaryedge.ninja
-2604:a880:cad:d0::e9d:2001 # binaryedge.ninja
-2604:a880:cad:d0::e9d:6001 # binaryedge.ninja
-2604:a880:cad:d0::e9d:b001 # binaryedge.ninja
-2604:a880:cad:d0::e9d:c001 # binaryedge.ninja
-2604:a880:cad:d0::ea5:d001 # binaryedge.ninja
-2604:a880:cad:d0::ea8:3001 # binaryedge.ninja
-2604:a880:cad:d0::ea9:b001 # binaryedge.ninja
-2604:a880:cad:d0::eab:6001 # binaryedge.ninja
-2604:a880:cad:d0::ead:4001 # binaryedge.ninja
-2604:a880:cad:d0::ead:d001 # binaryedge.ninja
-2604:a880:cad:d0::eae:d001 # binaryedge.ninja
-2604:a880:cad:d0::eb0:7001 # binaryedge.ninja
-2604:a880:cad:d0::eb0:f001 # binaryedge.ninja
-2604:a880:cad:d0::eb2:a001 # binaryedge.ninja
-2604:a880:cad:d0::eb5:8001 # binaryedge.ninja
-2604:a880:cad:d0::eb6:1 # binaryedge.ninja
-2604:a880:cad:d0::eb9:5001 # binaryedge.ninja
-2604:a880:cad:d0::eba:2001 # binaryedge.ninja
-2604:a880:cad:d0::ebb:1001 # binaryedge.ninja
-2604:a880:cad:d0::ebc:b001 # binaryedge.ninja
-2604:a880:cad:d0::ebd:6001 # binaryedge.ninja
-2604:a880:cad:d0::ec0:9001 # binaryedge.ninja
-2604:a880:cad:d0::ec3:1001 # binaryedge.ninja
-2604:a880:cad:d0::ec4:3001 # binaryedge.ninja
-2604:a880:cad:d0::ec7:8001 # binaryedge.ninja
-2604:a880:cad:d0::ec8:d001 # binaryedge.ninja
-2604:a880:cad:d0::eca:4001 # binaryedge.ninja
-2604:a880:cad:d0::ecb:f001 # binaryedge.ninja
-2604:a880:cad:d0::ed0:3001 # binaryedge.ninja
-2604:a880:cad:d0::ed0:e001 # binaryedge.ninja
-2604:a880:cad:d0::ed2:2001 # binaryedge.ninja
-2604:a880:cad:d0::ed2:3001 # binaryedge.ninja
-2604:a880:cad:d0::ed2:5001 # binaryedge.ninja
-2604:a880:cad:d0::ed3:a001 # binaryedge.ninja
-2604:a880:cad:d0::ed4:2001 # binaryedge.ninja
-2604:a880:cad:d0::ed5:b001 # binaryedge.ninja
-2604:a880:cad:d0::ed5:c001 # binaryedge.ninja
-2604:a880:cad:d0::ed6:1001 # binaryedge.ninja
-2604:a880:cad:d0::ed6:a001 # binaryedge.ninja
-2604:a880:cad:d0::ed7:9001 # binaryedge.ninja
-2604:a880:cad:d0::ed7:f001 # binaryedge.ninja
-2604:a880:cad:d0::ed8:2001 # binaryedge.ninja
-2604:a880:cad:d0::ed8:b001 # binaryedge.ninja
-2604:a880:cad:d0::ed9:8001 # binaryedge.ninja
-2604:a880:cad:d0::eda:2001 # binaryedge.ninja
-2604:a880:cad:d0::edb:9001 # binaryedge.ninja
-2604:a880:cad:d0::ede:8001 # binaryedge.ninja
-2604:a880:cad:d0::edf:9001 # binaryedge.ninja
-2604:a880:cad:d0::ee0:1001 # binaryedge.ninja
-2604:a880:cad:d0::ee0:5001 # binaryedge.ninja
-2604:a880:cad:d0::ee1:8001 # binaryedge.ninja
-2604:a880:cad:d0::ee1:c001 # binaryedge.ninja
-2604:a880:cad:d0::ee2:1 # binaryedge.ninja
-2604:a880:cad:d0::ee2:3001 # binaryedge.ninja
-2604:a880:cad:d0::ee3:e001 # binaryedge.ninja
-2604:a880:cad:d0::ef4:1 # binaryedge.ninja
-2604:a880:cad:d0::ef4:d001 # binaryedge.ninja
-2604:a880:cad:d0::ef4:f001 # binaryedge.ninja
-2604:a880:cad:d0::ef5:d001 # binaryedge.ninja
-2604:a880:cad:d0::ef6:c001 # binaryedge.ninja
-2604:a880:cad:d0::ef7:a001 # binaryedge.ninja
-2604:a880:cad:d0::ef8:1 # binaryedge.ninja
-2604:a880:cad:d0::efa:1 # binaryedge.ninja
-2604:a880:cad:d0::efa:9001 # binaryedge.ninja
-2604:a880:cad:d0::efa:f001 # binaryedge.ninja
-2604:a880:cad:d0::efd:3001 # binaryedge.ninja
-2604:a880:cad:d0::efd:c001 # binaryedge.ninja
-2604:a880:cad:d0::efd:d001 # binaryedge.ninja
-2604:a880:cad:d0::eff:2001 # binaryedge.ninja
-2604:a880:cad:d0::eff:b001 # binaryedge.ninja
-2604:a880:cad:d0::f00:d001 # binaryedge.ninja
-2604:a880:cad:d0::f01:a001 # binaryedge.ninja
-2604:a880:cad:d0::f01:c001 # binaryedge.ninja
-2604:a880:cad:d0::f01:f001 # binaryedge.ninja
-2604:a880:cad:d0::f05:4001 # binaryedge.ninja
-2604:a880:cad:d0::f05:b001 # binaryedge.ninja
-2604:a880:cad:d0::f07:c001 # binaryedge.ninja
-2604:a880:cad:d0::f0b:4001 # binaryedge.ninja
-2604:a880:cad:d0::f0b:8001 # binaryedge.ninja
-2604:a880:cad:d0::f0b:e001 # binaryedge.ninja
-2604:a880:cad:d0::f0c:c001 # binaryedge.ninja
-2604:a880:cad:d0::f0d:5001 # binaryedge.ninja
-2604:a880:cad:d0::f0d:f001 # binaryedge.ninja
-2604:a880:cad:d0::f0e:1 # binaryedge.ninja
-2604:a880:cad:d0::f0e:1001 # binaryedge.ninja
-2604:a880:cad:d0::f0e:2001 # binaryedge.ninja
-2604:a880:cad:d0::f0e:5001 # binaryedge.ninja
-2604:a880:cad:d0::f0e:6001 # binaryedge.ninja
-2604:a880:cad:d0::f0e:f001 # binaryedge.ninja
-2604:a880:cad:d0::f0f:1 # binaryedge.ninja
-2604:a880:cad:d0::f0f:3001 # binaryedge.ninja
-2604:a880:cad:d0::f0f:4001 # binaryedge.ninja
-2604:a880:cad:d0::f0f:6001 # binaryedge.ninja
-2604:a880:cad:d0::f10:6001 # binaryedge.ninja
-2604:a880:cad:d0::f10:e001 # binaryedge.ninja
-2604:a880:cad:d0::f11:3001 # binaryedge.ninja
-2604:a880:cad:d0::f11:7001 # binaryedge.ninja
-2604:a880:cad:d0::f12:3001 # binaryedge.ninja
-2604:a880:cad:d0::f12:5001 # binaryedge.ninja
-2604:a880:cad:d0::f12:d001 # binaryedge.ninja
-2604:a880:cad:d0::f12:e001 # binaryedge.ninja
-2604:a880:cad:d0::f13:1 # binaryedge.ninja
-2604:a880:cad:d0::f13:1001 # binaryedge.ninja
-2604:a880:cad:d0::f14:1001 # binaryedge.ninja
-2604:a880:cad:d0::f14:7001 # binaryedge.ninja
-2604:a880:cad:d0::f15:1001 # binaryedge.ninja
-2604:a880:cad:d0::f15:e001 # binaryedge.ninja
-2604:a880:cad:d0::f16:1001 # binaryedge.ninja
-2604:a880:cad:d0::f16:5001 # binaryedge.ninja
-2604:a880:cad:d0::f18:7001 # binaryedge.ninja
-2604:a880:cad:d0::f19:9001 # binaryedge.ninja
-2604:a880:cad:d0::f19:a001 # binaryedge.ninja
-2604:a880:cad:d0::f1a:5001 # binaryedge.ninja
-2604:a880:cad:d0::f1a:8001 # binaryedge.ninja
-2604:a880:cad:d0::f1a:b001 # binaryedge.ninja
-2604:a880:cad:d0::f1a:e001 # binaryedge.ninja
-2604:a880:cad:d0::f1b:5001 # binaryedge.ninja
-2604:a880:cad:d0::f1b:b001 # binaryedge.ninja
-2604:a880:cad:d0::f1c:9001 # binaryedge.ninja
-2604:a880:cad:d0::f1c:a001 # binaryedge.ninja
-2604:a880:cad:d0::f1c:c001 # binaryedge.ninja
-2604:a880:cad:d0::f1c:e001 # binaryedge.ninja
-2604:a880:cad:d0::f1d:9001 # binaryedge.ninja
-2604:a880:cad:d0::f1d:a001 # binaryedge.ninja
-2604:a880:cad:d0::f1d:d001 # binaryedge.ninja
-2604:a880:cad:d0::f1e:8001 # binaryedge.ninja
-2604:a880:cad:d0::f1e:9001 # binaryedge.ninja
-2604:a880:cad:d0::f1e:a001 # binaryedge.ninja
-2604:a880:cad:d0::f1e:d001 # binaryedge.ninja
-2604:a880:cad:d0::f1f:1 # binaryedge.ninja
-2604:a880:cad:d0::f1f:1001 # binaryedge.ninja
-2604:a880:cad:d0::f1f:3001 # binaryedge.ninja
-2604:a880:cad:d0::f1f:4001 # binaryedge.ninja
-2604:a880:cad:d0::f1f:6001 # binaryedge.ninja
-2604:a880:cad:d0::f1f:7001 # binaryedge.ninja
-2604:a880:cad:d0::f1f:9001 # binaryedge.ninja
-2604:a880:cad:d0::f1f:b001 # binaryedge.ninja
-2604:a880:cad:d0::f20:5001 # binaryedge.ninja
-2604:a880:cad:d0::f20:6001 # binaryedge.ninja
-2604:a880:cad:d0::f20:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::1035:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::1049:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::1052:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::105d:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::106b:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::1076:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::1077:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::10a1:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::10b9:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::10c6:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::10d9:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::10e5:1 # binaryedge.ninja
-2a03:b0c0:1:d0::10e8:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::10ef:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::1107:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::110a:1 # binaryedge.ninja
-2a03:b0c0:1:d0::1115:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::1119:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::1124:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::112b:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::1145:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::1146:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::1153:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::115a:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::116b:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::116d:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::1175:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::1175:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::117b:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::117c:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::117c:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::1188:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::1192:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::11ce:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::11e4:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::11e6:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::11eb:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::11fa:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::11fc:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::11ff:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::1201:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::1207:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::120c:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::120f:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::1211:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::121b:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::1233:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::123f:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::123f:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::1240:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::1240:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::1241:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::1241:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::1242:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::1242:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::1242:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::1242:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::1243:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::1243:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::1243:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::1243:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::1243:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::1244:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::1244:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::1244:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::1244:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::1244:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::1245:1 # binaryedge.ninja
-2a03:b0c0:1:d0::1245:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::1246:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::1247:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::1247:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::1248:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::1248:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::1248:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::1248:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::1249:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::1249:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::124b:1 # binaryedge.ninja
-2a03:b0c0:1:d0::124b:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::124c:1 # binaryedge.ninja
-2a03:b0c0:1:d0::124d:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::124e:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::124e:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::124f:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::1251:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::1251:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::1253:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::1254:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::1256:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::1258:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::125b:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::125c:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::125c:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::125c:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::125e:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::125f:1 # binaryedge.ninja
-2a03:b0c0:1:d0::125f:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::125f:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::1260:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::1260:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::1261:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::1261:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::1263:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::1264:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::1270:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::127c:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::128a:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::1297:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::129a:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::129d:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::12:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::12a1:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::12a1:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::12a2:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::12a5:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::12aa:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::12b0:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::12b7:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::12be:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::12cd:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::12d1:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::12d9:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::12da:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::12dc:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::12e2:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::12e3:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::12e3:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::12e5:1 # binaryedge.ninja
-2a03:b0c0:1:d0::131c:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::1327:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::1338:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::133d:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::133e:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::1340:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::1341:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::1343:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::1344:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::1344:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::1344:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::1345:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::1345:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::1346:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::1346:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::1346:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::1346:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::1348:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::1349:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::1349:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::1349:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::1349:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::134a:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::134a:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::134a:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::134a:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::134a:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::134a:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::134a:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::134b:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::134b:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::134b:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::134b:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::134c:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::134c:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::134d:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::134d:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::1e2:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::2b0:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::2b4:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::426:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::428:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::44c:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::48:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::4f4:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::567:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::62c:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::ab1:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::b1a:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::bbc:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::bc:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::be3:1 # binaryedge.ninja
-2a03:b0c0:1:d0::c2:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::c2d:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::c8a:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::ca9:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::ccd:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::cf4:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::d18:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::d58:1 # binaryedge.ninja
-2a03:b0c0:1:d0::da6:3001 # binaryedge.ninja
-2a03:b0c0:1:d0::dbb:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::deb:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::e0c:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::e1a:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::e25:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::e3a:8001 # binaryedge.ninja
-2a03:b0c0:1:d0::e5a:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::e63:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::e99:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::ea5:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::ea9:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::ebf:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::ee4:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::ef5:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::f0b:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::f0d:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::f12:c001 # binaryedge.ninja
-2a03:b0c0:1:d0::f1a:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::f1a:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::f35:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::f3b:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::f3c:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::f3e:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::f3f:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::f48:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::f4a:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::f50:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::f5b:d001 # binaryedge.ninja
-2a03:b0c0:1:d0::f5d:5001 # binaryedge.ninja
-2a03:b0c0:1:d0::f5e:7001 # binaryedge.ninja
-2a03:b0c0:1:d0::f63:6001 # binaryedge.ninja
-2a03:b0c0:1:d0::f67:1001 # binaryedge.ninja
-2a03:b0c0:1:d0::f68:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::f7d:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::f7f:b001 # binaryedge.ninja
-2a03:b0c0:1:d0::f80:1 # binaryedge.ninja
-2a03:b0c0:1:d0::f88:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::f8f:4001 # binaryedge.ninja
-2a03:b0c0:1:d0::f96:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::f99:2001 # binaryedge.ninja
-2a03:b0c0:1:d0::f9b:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::fa6:e001 # binaryedge.ninja
-2a03:b0c0:1:d0::fac:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::fad:a001 # binaryedge.ninja
-2a03:b0c0:1:d0::fb6:f001 # binaryedge.ninja
-2a03:b0c0:1:d0::fe9:1 # binaryedge.ninja
-2a03:b0c0:1:d0::fec:9001 # binaryedge.ninja
-2a03:b0c0:1:d0::fed:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::10a8:3001 # binaryedge.ninja
-2a03:b0c0:2:d0::10b3:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::10b4:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::10b7:1 # binaryedge.ninja
-2a03:b0c0:2:d0::10ce:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::10cf:2001 # binaryedge.ninja
-2a03:b0c0:2:d0::10d8:8001 # binaryedge.ninja
-2a03:b0c0:2:d0::10d9:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::10de:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::112c:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::1139:7001 # binaryedge.ninja
-2a03:b0c0:2:d0::1141:f001 # binaryedge.ninja
-2a03:b0c0:2:d0::114c:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::1155:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::1168:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::1174:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::1176:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::1179:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::117d:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::1197:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::11c3:a001 # binaryedge.ninja
-2a03:b0c0:2:d0::11cd:c001 # binaryedge.ninja
-2a03:b0c0:2:d0::11d7:c001 # binaryedge.ninja
-2a03:b0c0:2:d0::11f6:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::11f8:1 # binaryedge.ninja
-2a03:b0c0:2:d0::11f8:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::11fc:1 # binaryedge.ninja
-2a03:b0c0:2:d0::1207:1 # binaryedge.ninja
-2a03:b0c0:2:d0::120e:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::120f:2001 # binaryedge.ninja
-2a03:b0c0:2:d0::122c:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::1239:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::1268:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::1276:1 # binaryedge.ninja
-2a03:b0c0:2:d0::127a:3001 # binaryedge.ninja
-2a03:b0c0:2:d0::1298:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::12b6:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::12be:a001 # binaryedge.ninja
-2a03:b0c0:2:d0::131d:c001 # binaryedge.ninja
-2a03:b0c0:2:d0::131f:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::1327:2001 # binaryedge.ninja
-2a03:b0c0:2:d0::132a:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::133b:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::133f:2001 # binaryedge.ninja
-2a03:b0c0:2:d0::1348:3001 # binaryedge.ninja
-2a03:b0c0:2:d0::1357:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::1359:8001 # binaryedge.ninja
-2a03:b0c0:2:d0::135c:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::1375:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::1397:1 # binaryedge.ninja
-2a03:b0c0:2:d0::13a6:1 # binaryedge.ninja
-2a03:b0c0:2:d0::13ae:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::13be:7001 # binaryedge.ninja
-2a03:b0c0:2:d0::13c5:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::13cf:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::13de:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::13e2:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::13f1:8001 # binaryedge.ninja
-2a03:b0c0:2:d0::141e:8001 # binaryedge.ninja
-2a03:b0c0:2:d0::142e:1 # binaryedge.ninja
-2a03:b0c0:2:d0::1432:3001 # binaryedge.ninja
-2a03:b0c0:2:d0::143f:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::144e:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::1465:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::1467:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::1469:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::146a:7001 # binaryedge.ninja
-2a03:b0c0:2:d0::1475:1 # binaryedge.ninja
-2a03:b0c0:2:d0::1475:8001 # binaryedge.ninja
-2a03:b0c0:2:d0::1476:7001 # binaryedge.ninja
-2a03:b0c0:2:d0::1477:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::1477:c001 # binaryedge.ninja
-2a03:b0c0:2:d0::1479:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::1479:f001 # binaryedge.ninja
-2a03:b0c0:2:d0::147a:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::147a:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::147b:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::147c:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::147c:f001 # binaryedge.ninja
-2a03:b0c0:2:d0::147e:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::147f:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::1480:1 # binaryedge.ninja
-2a03:b0c0:2:d0::1480:7001 # binaryedge.ninja
-2a03:b0c0:2:d0::1489:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::14b0:a001 # binaryedge.ninja
-2a03:b0c0:2:d0::14ba:1 # binaryedge.ninja
-2a03:b0c0:2:d0::14bb:8001 # binaryedge.ninja
-2a03:b0c0:2:d0::14be:2001 # binaryedge.ninja
-2a03:b0c0:2:d0::14ed:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::14ed:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::14f4:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::14f7:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::1501:7001 # binaryedge.ninja
-2a03:b0c0:2:d0::1514:a001 # binaryedge.ninja
-2a03:b0c0:2:d0::1516:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::1523:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::1524:2001 # binaryedge.ninja
-2a03:b0c0:2:d0::152b:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::1544:7001 # binaryedge.ninja
-2a03:b0c0:2:d0::154e:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::1551:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::1553:a001 # binaryedge.ninja
-2a03:b0c0:2:d0::1554:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::1556:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::1557:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::1565:1 # binaryedge.ninja
-2a03:b0c0:2:d0::1568:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::1576:c001 # binaryedge.ninja
-2a03:b0c0:2:d0::157a:7001 # binaryedge.ninja
-2a03:b0c0:2:d0::157b:3001 # binaryedge.ninja
-2a03:b0c0:2:d0::157b:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::1589:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::1592:2001 # binaryedge.ninja
-2a03:b0c0:2:d0::1593:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::1593:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::1594:f001 # binaryedge.ninja
-2a03:b0c0:2:d0::1595:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::1596:7001 # binaryedge.ninja
-2a03:b0c0:2:d0::1597:a001 # binaryedge.ninja
-2a03:b0c0:2:d0::1597:c001 # binaryedge.ninja
-2a03:b0c0:2:d0::1597:f001 # binaryedge.ninja
-2a03:b0c0:2:d0::1598:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::1598:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::1598:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::159a:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::159b:1 # binaryedge.ninja
-2a03:b0c0:2:d0::159b:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::159c:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::159d:1 # binaryedge.ninja
-2a03:b0c0:2:d0::159d:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::159d:f001 # binaryedge.ninja
-2a03:b0c0:2:d0::159e:7001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a0:3001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a2:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a2:8001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a2:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a2:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a5:3001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a5:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a5:f001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a6:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a6:f001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a7:a001 # binaryedge.ninja
-2a03:b0c0:2:d0::15a9:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::15aa:1 # binaryedge.ninja
-2a03:b0c0:2:d0::15ab:1 # binaryedge.ninja
-2a03:b0c0:2:d0::15ce:f001 # binaryedge.ninja
-2a03:b0c0:2:d0::15dd:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::1600:8001 # binaryedge.ninja
-2a03:b0c0:2:d0::1605:2001 # binaryedge.ninja
-2a03:b0c0:2:d0::1613:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::1614:c001 # binaryedge.ninja
-2a03:b0c0:2:d0::33:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::47c:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::498:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::4:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::4dd:7001 # binaryedge.ninja
-2a03:b0c0:2:d0::4f6:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::53c:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::55a:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::58d:9001 # binaryedge.ninja
-2a03:b0c0:2:d0::5f2:5001 # binaryedge.ninja
-2a03:b0c0:2:d0::625:c001 # binaryedge.ninja
-2a03:b0c0:2:d0::6ef:1 # binaryedge.ninja
-2a03:b0c0:2:d0::70:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::cb0:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::d1e:d001 # binaryedge.ninja
-2a03:b0c0:2:d0::d4f:1 # binaryedge.ninja
-2a03:b0c0:2:d0::dab:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::dba:3001 # binaryedge.ninja
-2a03:b0c0:2:d0::dc6:3001 # binaryedge.ninja
-2a03:b0c0:2:d0::dc6:f001 # binaryedge.ninja
-2a03:b0c0:2:d0::dcd:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::dd2:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::dd6:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::e1f:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::e42:3001 # binaryedge.ninja
-2a03:b0c0:2:d0::ea1:2001 # binaryedge.ninja
-2a03:b0c0:2:d0::ea7:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::eaa:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::ebc:1001 # binaryedge.ninja
-2a03:b0c0:2:d0::ec1:1 # binaryedge.ninja
-2a03:b0c0:2:d0::f12:4001 # binaryedge.ninja
-2a03:b0c0:2:d0::f13:e001 # binaryedge.ninja
-2a03:b0c0:2:d0::f6c:b001 # binaryedge.ninja
-2a03:b0c0:2:d0::f95:6001 # binaryedge.ninja
-2a03:b0c0:2:d0::fc6:1 # binaryedge.ninja
-2a03:b0c0:2:d0::ff4:7001 # binaryedge.ninja
-2a03:b0c0:3:d0::10e9:4001 # binaryedge.ninja
-2a03:b0c0:3:d0::11c1:7001 # binaryedge.ninja
-2a03:b0c0:3:d0::11ce:1001 # binaryedge.ninja
-2a03:b0c0:3:d0::1212:d001 # binaryedge.ninja
-2a03:b0c0:3:d0::1241:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::1279:9001 # binaryedge.ninja
-2a03:b0c0:3:d0::13a8:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::143c:7001 # binaryedge.ninja
-2a03:b0c0:3:d0::14eb:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::1579:9001 # binaryedge.ninja
-2a03:b0c0:3:d0::15de:4001 # binaryedge.ninja
-2a03:b0c0:3:d0::15fb:8001 # binaryedge.ninja
-2a03:b0c0:3:d0::15ff:a001 # binaryedge.ninja
-2a03:b0c0:3:d0::162a:7001 # binaryedge.ninja
-2a03:b0c0:3:d0::163d:c001 # binaryedge.ninja
-2a03:b0c0:3:d0::165d:3001 # binaryedge.ninja
-2a03:b0c0:3:d0::1692:6001 # binaryedge.ninja
-2a03:b0c0:3:d0::175d:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::1763:a001 # binaryedge.ninja
-2a03:b0c0:3:d0::1786:b001 # binaryedge.ninja
-2a03:b0c0:3:d0::178e:8001 # binaryedge.ninja
-2a03:b0c0:3:d0::17df:3001 # binaryedge.ninja
-2a03:b0c0:3:d0::17e8:7001 # binaryedge.ninja
-2a03:b0c0:3:d0::17ed:4001 # binaryedge.ninja
-2a03:b0c0:3:d0::181a:1 # binaryedge.ninja
-2a03:b0c0:3:d0::18c0:2001 # binaryedge.ninja
-2a03:b0c0:3:d0::18c3:d001 # binaryedge.ninja
-2a03:b0c0:3:d0::18d7:b001 # binaryedge.ninja
-2a03:b0c0:3:d0::18fb:5001 # binaryedge.ninja
-2a03:b0c0:3:d0::1934:d001 # binaryedge.ninja
-2a03:b0c0:3:d0::19be:9001 # binaryedge.ninja
-2a03:b0c0:3:d0::1a35:a001 # binaryedge.ninja
-2a03:b0c0:3:d0::1a3b:a001 # binaryedge.ninja
-2a03:b0c0:3:d0::1a56:2001 # binaryedge.ninja
-2a03:b0c0:3:d0::1a74:7001 # binaryedge.ninja
-2a03:b0c0:3:d0::1a93:b001 # binaryedge.ninja
-2a03:b0c0:3:d0::1a98:8001 # binaryedge.ninja
-2a03:b0c0:3:d0::1adf:5001 # binaryedge.ninja
-2a03:b0c0:3:d0::1b4c:a001 # binaryedge.ninja
-2a03:b0c0:3:d0::1b68:8001 # binaryedge.ninja
-2a03:b0c0:3:d0::1b6f:d001 # binaryedge.ninja
-2a03:b0c0:3:d0::1b83:4001 # binaryedge.ninja
-2a03:b0c0:3:d0::1b85:1 # binaryedge.ninja
-2a03:b0c0:3:d0::1bb4:a001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bbf:4001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bcb:2001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bcc:2001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bcc:d001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bce:1 # binaryedge.ninja
-2a03:b0c0:3:d0::1bd0:4001 # binaryedge.ninja
-2a03:b0c0:3:d0::1be2:d001 # binaryedge.ninja
-2a03:b0c0:3:d0::1be3:3001 # binaryedge.ninja
-2a03:b0c0:3:d0::1be3:b001 # binaryedge.ninja
-2a03:b0c0:3:d0::1be4:9001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bea:3001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bea:f001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bec:4001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bf1:9001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfb:f001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfc:1001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfc:2001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfc:4001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfc:9001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfc:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfd:4001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfd:8001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfd:9001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfd:d001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfe:4001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfe:9001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bfe:b001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bff:3001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bff:6001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bff:a001 # binaryedge.ninja
-2a03:b0c0:3:d0::1bff:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c00:6001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c00:7001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c00:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c01:2001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c01:f001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c02:7001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c03:2001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c03:6001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c03:d001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c05:7001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c05:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c06:a001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c07:2001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c07:c001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c08:1001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c08:b001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c08:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c09:2001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c09:8001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c09:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c09:f001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c0a:8001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c0b:6001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c0c:1001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c0c:6001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c0c:7001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c0c:b001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c0d:1001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c0d:6001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c0d:7001 # binaryedge.ninja
-2a03:b0c0:3:d0::1c0d:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::2001 # binaryedge.ninja
-2a03:b0c0:3:d0::44:1 # binaryedge.ninja
-2a03:b0c0:3:d0::87:1001 # binaryedge.ninja
-2a03:b0c0:3:d0::ca9:6001 # binaryedge.ninja
-2a03:b0c0:3:d0::d0e:3001 # binaryedge.ninja
-2a03:b0c0:3:d0::d1f:6001 # binaryedge.ninja
-2a03:b0c0:3:d0::d77:e001 # binaryedge.ninja
-2a03:b0c0:3:d0::dc7:5001 # binaryedge.ninja
-2a03:b0c0:3:d0::e08:7001 # binaryedge.ninja
-45.33.101.148 # binaryedge.ninja
-45.33.104.113 # binaryedge.ninja
-45.33.108.171 # binaryedge.ninja
-45.33.108.240 # binaryedge.ninja
-45.33.109.162 # binaryedge.ninja
-45.33.11.125 # binaryedge.ninja
-45.33.11.132 # binaryedge.ninja
-45.33.11.161 # binaryedge.ninja
-45.33.11.174 # binaryedge.ninja
-45.33.11.21 # binaryedge.ninja
-45.33.11.28 # binaryedge.ninja
-45.33.11.8 # binaryedge.ninja
-45.33.112.51 # binaryedge.ninja
-45.33.121.226 # binaryedge.ninja
-45.33.121.230 # binaryedge.ninja
-45.33.121.231 # binaryedge.ninja
-45.33.124.70 # binaryedge.ninja
-45.33.15.137 # binaryedge.ninja
-45.33.15.140 # binaryedge.ninja
-45.33.15.210 # binaryedge.ninja
-45.33.20.17 # binaryedge.ninja
-45.33.20.36 # binaryedge.ninja
-45.33.21.135 # binaryedge.ninja
-45.33.21.138 # binaryedge.ninja
-45.33.21.160 # binaryedge.ninja
-45.33.21.201 # binaryedge.ninja
-45.33.21.91 # binaryedge.ninja
-45.33.22.120 # binaryedge.ninja
-45.33.34.200 # binaryedge.ninja
-45.33.36.146 # binaryedge.ninja
-45.33.36.211 # binaryedge.ninja
-45.33.36.25 # binaryedge.ninja
-45.33.4.107 # binaryedge.ninja
-45.33.4.111 # binaryedge.ninja
-45.33.4.220 # binaryedge.ninja
-45.33.47.155 # binaryedge.ninja
-45.33.47.220 # binaryedge.ninja
-45.33.47.238 # binaryedge.ninja
-45.33.52.121 # binaryedge.ninja
-45.33.52.141 # binaryedge.ninja
-45.33.52.197 # binaryedge.ninja
-45.33.52.7 # binaryedge.ninja
-45.33.52.97 # binaryedge.ninja
-45.33.58.250 # binaryedge.ninja
-45.33.61.179 # binaryedge.ninja
-45.33.63.35 # binaryedge.ninja
-45.33.63.5 # binaryedge.ninja
-45.33.72.151 # binaryedge.ninja
-45.33.72.191 # binaryedge.ninja
-45.33.72.199 # binaryedge.ninja
-45.33.72.67 # binaryedge.ninja
-45.33.76.150 # binaryedge.ninja
-45.33.76.222 # binaryedge.ninja
-45.33.81.152 # binaryedge.ninja
-45.33.81.171 # binaryedge.ninja
-45.33.81.50 # binaryedge.ninja
-45.33.81.56 # binaryedge.ninja
-45.33.97.114 # binaryedge.ninja
-45.33.97.132 # binaryedge.ninja
-45.33.97.48 # binaryedge.ninja
-45.33.97.59 # binaryedge.ninja
-45.33.97.73 # binaryedge.ninja
-45.33.97.82 # binaryedge.ninja
-45.55.129.210 # binaryedge.ninja
-45.55.129.42 # binaryedge.ninja
-45.55.32.194 # binaryedge.ninja
-45.55.35.54 # binaryedge.ninja
-45.55.64.197 # binaryedge.ninja
-45.55.65.149 # binaryedge.ninja
-45.56.104.215 # binaryedge.ninja
-45.56.104.224 # binaryedge.ninja
-45.56.112.207 # binaryedge.ninja
-45.56.112.223 # binaryedge.ninja
-45.56.112.57 # binaryedge.ninja
-45.56.112.76 # binaryedge.ninja
-45.56.114.22 # binaryedge.ninja
-45.56.66.117 # binaryedge.ninja
-45.56.66.231 # binaryedge.ninja
-45.56.66.86 # binaryedge.ninja
-45.56.71.103 # binaryedge.ninja
-45.56.77.24 # binaryedge.ninja
-45.56.84.205 # binaryedge.ninja
-45.56.94.239 # binaryedge.ninja
-45.56.95.202 # binaryedge.ninja
-45.56.95.55 # binaryedge.ninja
-45.56.99.108 # binaryedge.ninja
-45.79.102.48 # binaryedge.ninja
-45.79.103.23 # binaryedge.ninja
-45.79.103.34 # binaryedge.ninja
-45.79.104.134 # binaryedge.ninja
-45.79.104.171 # binaryedge.ninja
-45.79.104.182 # binaryedge.ninja
-45.79.104.194 # binaryedge.ninja
-45.79.106.153 # binaryedge.ninja
-45.79.106.167 # binaryedge.ninja
-45.79.111.185 # binaryedge.ninja
-45.79.111.228 # binaryedge.ninja
-45.79.122.124 # binaryedge.ninja
-45.79.124.109 # binaryedge.ninja
-45.79.124.188 # binaryedge.ninja
-45.79.124.191 # binaryedge.ninja
-45.79.124.198 # binaryedge.ninja
-45.79.124.212 # binaryedge.ninja
-45.79.124.242 # binaryedge.ninja
-45.79.124.31 # binaryedge.ninja
-45.79.124.44 # binaryedge.ninja
-45.79.124.47 # binaryedge.ninja
-45.79.124.51 # binaryedge.ninja
-45.79.124.64 # binaryedge.ninja
-45.79.124.94 # binaryedge.ninja
-45.79.131.163 # binaryedge.ninja
-45.79.131.74 # binaryedge.ninja
-45.79.133.191 # binaryedge.ninja
-45.79.134.111 # binaryedge.ninja
-45.79.134.132 # binaryedge.ninja
-45.79.134.151 # binaryedge.ninja
-45.79.134.221 # binaryedge.ninja
-45.79.134.23 # binaryedge.ninja
-45.79.134.36 # binaryedge.ninja
-45.79.136.129 # binaryedge.ninja
-45.79.136.160 # binaryedge.ninja
-45.79.136.166 # binaryedge.ninja
-45.79.136.27 # binaryedge.ninja
-45.79.14.100 # binaryedge.ninja
-45.79.14.112 # binaryedge.ninja
-45.79.14.113 # binaryedge.ninja
-45.79.14.40 # binaryedge.ninja
-45.79.14.82 # binaryedge.ninja
-45.79.141.227 # binaryedge.ninja
-45.79.141.94 # binaryedge.ninja
-45.79.141.96 # binaryedge.ninja
-45.79.142.128 # binaryedge.ninja
-45.79.142.148 # binaryedge.ninja
-45.79.142.207 # binaryedge.ninja
-45.79.142.40 # binaryedge.ninja
-45.79.142.49 # binaryedge.ninja
-45.79.142.59 # binaryedge.ninja
-45.79.142.87 # binaryedge.ninja
-45.79.145.110 # binaryedge.ninja
-45.79.145.111 # binaryedge.ninja
-45.79.145.120 # binaryedge.ninja
-45.79.145.201 # binaryedge.ninja
-45.79.145.207 # binaryedge.ninja
-45.79.145.215 # binaryedge.ninja
-45.79.145.51 # binaryedge.ninja
-45.79.146.17 # binaryedge.ninja
-45.79.146.63 # binaryedge.ninja
-45.79.147.135 # binaryedge.ninja
-45.79.147.143 # binaryedge.ninja
-45.79.147.234 # binaryedge.ninja
-45.79.152.129 # binaryedge.ninja
-45.79.152.17 # binaryedge.ninja
-45.79.152.171 # binaryedge.ninja
-45.79.152.181 # binaryedge.ninja
-45.79.152.218 # binaryedge.ninja
-45.79.152.243 # binaryedge.ninja
-45.79.152.254 # binaryedge.ninja
-45.79.152.47 # binaryedge.ninja
-45.79.16.218 # binaryedge.ninja
-45.79.16.248 # binaryedge.ninja
-45.79.168.8 # binaryedge.ninja
-45.79.17.173 # binaryedge.ninja
-45.79.171.108 # binaryedge.ninja
-45.79.171.163 # binaryedge.ninja
-45.79.177.112 # binaryedge.ninja
-45.79.18.108 # binaryedge.ninja
-45.79.18.132 # binaryedge.ninja
-45.79.18.215 # binaryedge.ninja
-45.79.184.102 # binaryedge.ninja
-45.79.184.171 # binaryedge.ninja
-45.79.184.194 # binaryedge.ninja
-45.79.200.120 # binaryedge.ninja
-45.79.200.134 # binaryedge.ninja
-45.79.207.109 # binaryedge.ninja
-45.79.207.143 # binaryedge.ninja
-45.79.207.175 # binaryedge.ninja
-45.79.21.172 # binaryedge.ninja
-45.79.21.187 # binaryedge.ninja
-45.79.21.218 # binaryedge.ninja
-45.79.21.228 # binaryedge.ninja
-45.79.21.32 # binaryedge.ninja
-45.79.21.43 # binaryedge.ninja
-45.79.211.114 # binaryedge.ninja
-45.79.211.252 # binaryedge.ninja
-45.79.223.162 # binaryedge.ninja
-45.79.223.17 # binaryedge.ninja
-45.79.223.178 # binaryedge.ninja
-45.79.223.181 # binaryedge.ninja
-45.79.223.195 # binaryedge.ninja
-45.79.223.197 # binaryedge.ninja
-45.79.223.214 # binaryedge.ninja
-45.79.223.46 # binaryedge.ninja
-45.79.223.70 # binaryedge.ninja
-45.79.223.79 # binaryedge.ninja
-45.79.223.83 # binaryedge.ninja
-45.79.224.134 # binaryedge.ninja
-45.79.224.251 # binaryedge.ninja
-45.79.226.166 # binaryedge.ninja
-45.79.226.183 # binaryedge.ninja
-45.79.226.211 # binaryedge.ninja
-45.79.226.234 # binaryedge.ninja
-45.79.228.118 # binaryedge.ninja
-45.79.228.180 # binaryedge.ninja
-45.79.228.192 # binaryedge.ninja
-45.79.228.193 # binaryedge.ninja
-45.79.228.74 # binaryedge.ninja
-45.79.238.105 # binaryedge.ninja
-45.79.238.119 # binaryedge.ninja
-45.79.238.128 # binaryedge.ninja
-45.79.238.203 # binaryedge.ninja
-45.79.238.205 # binaryedge.ninja
-45.79.238.216 # binaryedge.ninja
-45.79.238.252 # binaryedge.ninja
-45.79.238.254 # binaryedge.ninja
-45.79.238.38 # binaryedge.ninja
-45.79.238.43 # binaryedge.ninja
-45.79.238.77 # binaryedge.ninja
-45.79.25.117 # binaryedge.ninja
-45.79.25.186 # binaryedge.ninja
-45.79.25.23 # binaryedge.ninja
-45.79.25.71 # binaryedge.ninja
-45.79.25.74 # binaryedge.ninja
-45.79.31.156 # binaryedge.ninja
-45.79.31.71 # binaryedge.ninja
-45.79.33.151 # binaryedge.ninja
-45.79.33.189 # binaryedge.ninja
-45.79.37.14 # binaryedge.ninja
-45.79.37.72 # binaryedge.ninja
-45.79.42.16 # binaryedge.ninja
-45.79.42.253 # binaryedge.ninja
-45.79.42.38 # binaryedge.ninja
-45.79.49.118 # binaryedge.ninja
-45.79.5.247 # binaryedge.ninja
-45.79.56.114 # binaryedge.ninja
-45.79.56.116 # binaryedge.ninja
-45.79.56.194 # binaryedge.ninja
-45.79.66.232 # binaryedge.ninja
-45.79.66.233 # binaryedge.ninja
-45.79.66.237 # binaryedge.ninja
-45.79.66.246 # binaryedge.ninja
-45.79.66.39 # binaryedge.ninja
-45.79.67.18 # binaryedge.ninja
-45.79.67.40 # binaryedge.ninja
-45.79.67.53 # binaryedge.ninja
-45.79.67.67 # binaryedge.ninja
-45.79.69.144 # binaryedge.ninja
-45.79.69.145 # binaryedge.ninja
-45.79.69.77 # binaryedge.ninja
-45.79.77.116 # binaryedge.ninja
-45.79.77.167 # binaryedge.ninja
-45.79.77.182 # binaryedge.ninja
-45.79.77.218 # binaryedge.ninja
-45.79.77.237 # binaryedge.ninja
-45.79.77.243 # binaryedge.ninja
-45.79.77.28 # binaryedge.ninja
-45.79.78.10 # binaryedge.ninja
-45.79.78.160 # binaryedge.ninja
-45.79.78.181 # binaryedge.ninja
-45.79.78.220 # binaryedge.ninja
-45.79.78.92 # binaryedge.ninja
-45.79.79.225 # binaryedge.ninja
-45.79.79.89 # binaryedge.ninja
-45.79.8.150 # binaryedge.ninja
-45.79.8.154 # binaryedge.ninja
-45.79.80.7 # binaryedge.ninja
-45.79.81.186 # binaryedge.ninja
-45.79.82.49 # binaryedge.ninja
-45.79.85.38 # binaryedge.ninja
-45.79.91.181 # binaryedge.ninja
-45.79.94.102 # binaryedge.ninja
-45.79.94.5 # binaryedge.ninja
-45.79.97.32 # binaryedge.ninja
-45.79.97.77 # binaryedge.ninja
-45.79.98.183 # binaryedge.ninja
-45.79.98.192 # binaryedge.ninja
-45.79.98.205 # binaryedge.ninja
-46.101.101.44 # binaryedge.ninja
-46.101.125.14 # binaryedge.ninja
-46.101.134.97 # binaryedge.ninja
-46.101.139.14 # binaryedge.ninja
-46.101.152.153 # binaryedge.ninja
-46.101.153.133 # binaryedge.ninja
-46.101.177.147 # binaryedge.ninja
-46.101.177.204 # binaryedge.ninja
-46.101.18.185 # binaryedge.ninja
-46.101.180.86 # binaryedge.ninja
-46.101.19.66 # binaryedge.ninja
-46.101.193.150 # binaryedge.ninja
-46.101.194.78 # binaryedge.ninja
-46.101.198.28 # binaryedge.ninja
-46.101.200.84 # binaryedge.ninja
-46.101.206.44 # binaryedge.ninja
-46.101.21.210 # binaryedge.ninja
-46.101.23.175 # binaryedge.ninja
-46.101.3.205 # binaryedge.ninja
-46.101.6.245 # binaryedge.ninja
-46.101.73.196 # binaryedge.ninja
-46.101.74.156 # binaryedge.ninja
-46.101.8.25 # binaryedge.ninja
-46.101.81.193 # binaryedge.ninja
-46.101.81.242 # binaryedge.ninja
-46.101.88.122 # binaryedge.ninja
-46.101.91.165 # binaryedge.ninja
-46.101.93.181 # binaryedge.ninja
-46.101.97.18 # binaryedge.ninja
-50.116.0.128 # binaryedge.ninja
-50.116.0.34 # binaryedge.ninja
-50.116.0.62 # binaryedge.ninja
-50.116.0.92 # binaryedge.ninja
-50.116.1.130 # binaryedge.ninja
-50.116.1.203 # binaryedge.ninja
-50.116.1.29 # binaryedge.ninja
-50.116.12.104 # binaryedge.ninja
-50.116.12.11 # binaryedge.ninja
-50.116.12.119 # binaryedge.ninja
-50.116.14.234 # binaryedge.ninja
-50.116.14.51 # binaryedge.ninja
-50.116.19.65 # binaryedge.ninja
-50.116.2.128 # binaryedge.ninja
-50.116.2.74 # binaryedge.ninja
-50.116.27.252 # binaryedge.ninja
-50.116.27.52 # binaryedge.ninja
-50.116.27.94 # binaryedge.ninja
-50.116.28.183 # binaryedge.ninja
-50.116.28.224 # binaryedge.ninja
-50.116.29.13 # binaryedge.ninja
-50.116.29.14 # binaryedge.ninja
-50.116.29.29 # binaryedge.ninja
-50.116.29.57 # binaryedge.ninja
-50.116.29.62 # binaryedge.ninja
-50.116.29.68 # binaryedge.ninja
-50.116.34.47 # binaryedge.ninja
-50.116.34.71 # binaryedge.ninja
-50.116.35.148 # binaryedge.ninja
-50.116.35.160 # binaryedge.ninja
-50.116.35.164 # binaryedge.ninja
-50.116.35.167 # binaryedge.ninja
-50.116.35.205 # binaryedge.ninja
-50.116.35.219 # binaryedge.ninja
-50.116.35.39 # binaryedge.ninja
-50.116.35.69 # binaryedge.ninja
-50.116.35.83 # binaryedge.ninja
-50.116.36.243 # binaryedge.ninja
-50.116.39.184 # binaryedge.ninja
-50.116.39.91 # binaryedge.ninja
-50.116.44.144 # binaryedge.ninja
-50.116.5.7 # binaryedge.ninja
-50.116.53.165 # binaryedge.ninja
-50.116.53.176 # binaryedge.ninja
-50.116.53.195 # binaryedge.ninja
-50.116.55.232 # binaryedge.ninja
-50.116.55.246 # binaryedge.ninja
-50.116.62.104 # binaryedge.ninja
-50.116.62.108 # binaryedge.ninja
-50.116.62.131 # binaryedge.ninja
-50.116.62.188 # binaryedge.ninja
-50.116.62.193 # binaryedge.ninja
-50.116.62.232 # binaryedge.ninja
-50.116.62.238 # binaryedge.ninja
-50.116.62.252 # binaryedge.ninja
-50.116.62.30 # binaryedge.ninja
-50.116.8.43 # binaryedge.ninja
-64.225.10.172 # binaryedge.ninja
-64.225.112.156 # binaryedge.ninja
-64.225.112.178 # binaryedge.ninja
-64.225.112.225 # binaryedge.ninja
-64.225.120.118 # binaryedge.ninja
-64.225.120.61 # binaryedge.ninja
-64.225.120.62 # binaryedge.ninja
-64.225.120.63 # binaryedge.ninja
-64.225.14.223 # binaryedge.ninja
-64.225.26.211 # binaryedge.ninja
-64.225.32.181 # binaryedge.ninja
-64.225.4.95 # binaryedge.ninja
-64.225.40.114 # binaryedge.ninja
-64.225.40.37 # binaryedge.ninja
-64.225.40.48 # binaryedge.ninja
-64.225.52.188 # binaryedge.ninja
-64.225.54.135 # binaryedge.ninja
-64.225.54.14 # binaryedge.ninja
-64.225.54.140 # binaryedge.ninja
-64.225.56.238 # binaryedge.ninja
-64.225.6.22 # binaryedge.ninja
-64.225.65.151 # binaryedge.ninja
-64.225.65.63 # binaryedge.ninja
-64.225.67.231 # binaryedge.ninja
-64.225.76.194 # binaryedge.ninja
-64.225.97.245 # binaryedge.ninja
-64.226.100.183 # binaryedge.ninja
-64.226.104.21 # binaryedge.ninja
-64.226.107.139 # binaryedge.ninja
-64.226.109.107 # binaryedge.ninja
-64.226.115.219 # binaryedge.ninja
-64.226.116.172 # binaryedge.ninja
-64.226.121.11 # binaryedge.ninja
-64.226.69.70 # binaryedge.ninja
-64.226.71.64 # binaryedge.ninja
-64.226.86.108 # binaryedge.ninja
-64.226.89.3 # binaryedge.ninja
-64.226.89.84 # binaryedge.ninja
-64.226.94.163 # binaryedge.ninja
-64.226.96.156 # binaryedge.ninja
-64.226.98.114 # binaryedge.ninja
-64.227.10.233 # binaryedge.ninja
-64.227.101.200 # binaryedge.ninja
-64.227.103.2 # binaryedge.ninja
-64.227.106.132 # binaryedge.ninja
-64.227.106.214 # binaryedge.ninja
-64.227.107.110 # binaryedge.ninja
-64.227.11.88 # binaryedge.ninja
-64.227.115.62 # binaryedge.ninja
-64.227.126.182 # binaryedge.ninja
-64.227.127.136 # binaryedge.ninja
-64.227.134.215 # binaryedge.ninja
-64.227.134.33 # binaryedge.ninja
-64.227.137.10 # binaryedge.ninja
-64.227.144.114 # binaryedge.ninja
-64.227.16.21 # binaryedge.ninja
-64.227.18.100 # binaryedge.ninja
-64.227.182.163 # binaryedge.ninja
-64.227.19.64 # binaryedge.ninja
-64.227.26.239 # binaryedge.ninja
-64.227.28.159 # binaryedge.ninja
-64.227.29.185 # binaryedge.ninja
-64.227.32.70 # binaryedge.ninja
-64.227.33.32 # binaryedge.ninja
-64.227.34.189 # binaryedge.ninja
-64.227.38.240 # binaryedge.ninja
-64.227.45.64 # binaryedge.ninja
-64.227.47.78 # binaryedge.ninja
-64.227.48.125 # binaryedge.ninja
-64.227.48.168 # binaryedge.ninja
-64.227.48.174 # binaryedge.ninja
-64.227.56.15 # binaryedge.ninja
-64.227.56.40 # binaryedge.ninja
-64.227.56.67 # binaryedge.ninja
-64.227.56.70 # binaryedge.ninja
-64.227.56.8 # binaryedge.ninja
-64.227.56.82 # binaryedge.ninja
-64.227.67.100 # binaryedge.ninja
-64.227.68.117 # binaryedge.ninja
-64.227.68.132 # binaryedge.ninja
-64.227.69.181 # binaryedge.ninja
-64.227.70.158 # binaryedge.ninja
-64.227.74.166 # binaryedge.ninja
-64.227.74.22 # binaryedge.ninja
-64.227.77.204 # binaryedge.ninja
-64.227.80.165 # binaryedge.ninja
-64.227.80.175 # binaryedge.ninja
-64.227.80.223 # binaryedge.ninja
-64.227.80.85 # binaryedge.ninja
-64.227.88.0 # binaryedge.ninja
-64.227.88.1 # binaryedge.ninja
-64.227.88.13 # binaryedge.ninja
-64.227.88.21 # binaryedge.ninja
-64.227.88.67 # binaryedge.ninja
-64.227.88.85 # binaryedge.ninja
-64.227.88.95 # binaryedge.ninja
-64.227.88.96 # binaryedge.ninja
-66.228.39.149 # binaryedge.ninja
-66.228.39.215 # binaryedge.ninja
-66.228.39.247 # binaryedge.ninja
-66.228.43.191 # binaryedge.ninja
-66.228.43.9 # binaryedge.ninja
-66.228.47.123 # binaryedge.ninja
-66.228.47.141 # binaryedge.ninja
-66.228.47.168 # binaryedge.ninja
-66.228.47.199 # binaryedge.ninja
-67.205.131.136 # binaryedge.ninja
-67.205.131.18 # binaryedge.ninja
-67.205.154.163 # binaryedge.ninja
-67.205.158.115 # binaryedge.ninja
-67.205.160.218 # binaryedge.ninja
-67.205.160.95 # binaryedge.ninja
-67.205.176.192 # binaryedge.ninja
-67.205.178.10 # binaryedge.ninja
-67.207.81.18 # binaryedge.ninja
-67.207.83.62 # binaryedge.ninja
-67.207.88.18 # binaryedge.ninja
-67.207.90.170 # binaryedge.ninja
-67.207.92.57 # binaryedge.ninja
-68.183.0.140 # binaryedge.ninja
-68.183.101.152 # binaryedge.ninja
-68.183.106.29 # binaryedge.ninja
-68.183.107.2 # binaryedge.ninja
-68.183.107.239 # binaryedge.ninja
-68.183.115.18 # binaryedge.ninja
-68.183.118.47 # binaryedge.ninja
-68.183.121.129 # binaryedge.ninja
-68.183.128.73 # binaryedge.ninja
-68.183.13.61 # binaryedge.ninja
-68.183.131.147 # binaryedge.ninja
-68.183.139.124 # binaryedge.ninja
-68.183.143.25 # binaryedge.ninja
-68.183.144.165 # binaryedge.ninja
-68.183.159.40 # binaryedge.ninja
-68.183.160.150 # binaryedge.ninja
-68.183.160.226 # binaryedge.ninja
-68.183.160.63 # binaryedge.ninja
-68.183.160.93 # binaryedge.ninja
-68.183.175.27 # binaryedge.ninja
-68.183.175.28 # binaryedge.ninja
-68.183.175.42 # binaryedge.ninja
-68.183.175.64 # binaryedge.ninja
-68.183.175.77 # binaryedge.ninja
-68.183.18.129 # binaryedge.ninja
-68.183.184.40 # binaryedge.ninja
-68.183.195.14 # binaryedge.ninja
-68.183.195.210 # binaryedge.ninja
-68.183.195.52 # binaryedge.ninja
-68.183.195.70 # binaryedge.ninja
-68.183.195.79 # binaryedge.ninja
-68.183.196.101 # binaryedge.ninja
-68.183.198.131 # binaryedge.ninja
-68.183.199.209 # binaryedge.ninja
-68.183.199.218 # binaryedge.ninja
-68.183.199.233 # binaryedge.ninja
-68.183.199.242 # binaryedge.ninja
-68.183.199.252 # binaryedge.ninja
-68.183.199.253 # binaryedge.ninja
-68.183.2.162 # binaryedge.ninja
-68.183.201.8 # binaryedge.ninja
-68.183.202.104 # binaryedge.ninja
-68.183.202.65 # binaryedge.ninja
-68.183.202.79 # binaryedge.ninja
-68.183.203.13 # binaryedge.ninja
-68.183.203.153 # binaryedge.ninja
-68.183.203.166 # binaryedge.ninja
-68.183.203.17 # binaryedge.ninja
-68.183.203.24 # binaryedge.ninja
-68.183.203.26 # binaryedge.ninja
-68.183.203.42 # binaryedge.ninja
-68.183.203.68 # binaryedge.ninja
-68.183.203.69 # binaryedge.ninja
-68.183.203.89 # binaryedge.ninja
-68.183.203.94 # binaryedge.ninja
-68.183.204.243 # binaryedge.ninja
-68.183.205.177 # binaryedge.ninja
-68.183.206.16 # binaryedge.ninja
-68.183.21.105 # binaryedge.ninja
-68.183.215.12 # binaryedge.ninja
-68.183.226.83 # binaryedge.ninja
-68.183.24.248 # binaryedge.ninja
-68.183.25.158 # binaryedge.ninja
-68.183.30.125 # binaryedge.ninja
-68.183.33.109 # binaryedge.ninja
-68.183.34.68 # binaryedge.ninja
-68.183.39.240 # binaryedge.ninja
-68.183.41.243 # binaryedge.ninja
-68.183.43.130 # binaryedge.ninja
-68.183.44.161 # binaryedge.ninja
-68.183.44.58 # binaryedge.ninja
-68.183.5.148 # binaryedge.ninja
-68.183.56.154 # binaryedge.ninja
-68.183.6.177 # binaryedge.ninja
-68.183.72.190 # binaryedge.ninja
-68.183.78.103 # binaryedge.ninja
-68.183.8.111 # binaryedge.ninja
-68.183.88.157 # binaryedge.ninja
-68.183.9.213 # binaryedge.ninja
-69.164.205.187 # binaryedge.ninja
-69.164.205.19 # binaryedge.ninja
-69.164.205.235 # binaryedge.ninja
-69.164.205.250 # binaryedge.ninja
-69.164.205.34 # binaryedge.ninja
-69.164.205.76 # binaryedge.ninja
-69.164.206.161 # binaryedge.ninja
-69.164.206.175 # binaryedge.ninja
-69.164.206.248 # binaryedge.ninja
-69.164.206.37 # binaryedge.ninja
-69.164.210.125 # binaryedge.ninja
-69.164.210.132 # binaryedge.ninja
-69.164.210.185 # binaryedge.ninja
-69.164.210.209 # binaryedge.ninja
-69.164.210.22 # binaryedge.ninja
-69.164.210.230 # binaryedge.ninja
-69.164.210.235 # binaryedge.ninja
-69.164.210.240 # binaryedge.ninja
-69.164.210.83 # binaryedge.ninja
-69.164.210.95 # binaryedge.ninja
-69.164.210.99 # binaryedge.ninja
-69.164.212.176 # binaryedge.ninja
-69.164.212.200 # binaryedge.ninja
-69.164.212.254 # binaryedge.ninja
-69.164.213.220 # binaryedge.ninja
-69.164.213.253 # binaryedge.ninja
-69.164.213.4 # binaryedge.ninja
-69.164.213.64 # binaryedge.ninja
-69.164.214.67 # binaryedge.ninja
-69.164.214.80 # binaryedge.ninja
-69.164.215.99 # binaryedge.ninja
-69.164.216.170 # binaryedge.ninja
-69.55.49.201 # binaryedge.ninja
-69.55.49.44 # binaryedge.ninja
-72.14.181.20 # binaryedge.ninja
-72.14.181.205 # binaryedge.ninja
-72.14.181.27 # binaryedge.ninja
-72.14.185.240 # binaryedge.ninja
-74.207.228.186 # binaryedge.ninja
-74.207.228.243 # binaryedge.ninja
-74.207.228.73 # binaryedge.ninja
-74.207.232.222 # binaryedge.ninja
-74.207.244.216 # binaryedge.ninja
-74.207.245.123 # binaryedge.ninja
-74.207.245.153 # binaryedge.ninja
-74.207.245.165 # binaryedge.ninja
-74.207.245.18 # binaryedge.ninja
-74.207.245.78 # binaryedge.ninja
-74.207.245.8 # binaryedge.ninja
-74.207.246.118 # binaryedge.ninja
-74.207.248.141 # binaryedge.ninja
-74.207.248.83 # binaryedge.ninja
-74.207.254.125 # binaryedge.ninja
-85.159.212.179 # binaryedge.ninja
-85.159.212.19 # binaryedge.ninja
-85.159.213.162 # binaryedge.ninja
-85.159.213.23 # binaryedge.ninja
-85.90.247.62 # binaryedge.ninja
-88.80.186.64 # binaryedge.ninja
-88.80.186.70 # binaryedge.ninja
-88.80.186.72 # binaryedge.ninja
-88.80.186.80 # binaryedge.ninja
-88.80.189.129 # binaryedge.ninja
-88.80.189.220 # binaryedge.ninja
-96.126.100.238 # binaryedge.ninja
-96.126.104.107 # binaryedge.ninja
-96.126.104.109 # binaryedge.ninja
-96.126.104.125 # binaryedge.ninja
-96.126.104.129 # binaryedge.ninja
-96.126.104.16 # binaryedge.ninja
-96.126.104.209 # binaryedge.ninja
-96.126.104.221 # binaryedge.ninja
-96.126.104.244 # binaryedge.ninja
-96.126.109.147 # binaryedge.ninja
-96.126.109.188 # binaryedge.ninja
-96.126.109.32 # binaryedge.ninja
-96.126.109.78 # binaryedge.ninja
-96.126.109.8 # binaryedge.ninja
-96.126.114.94 # binaryedge.ninja
-96.126.118.84 # binaryedge.ninja
-96.126.118.98 # binaryedge.ninja
-96.126.126.154 # binaryedge.ninja
-96.126.127.130 # binaryedge.ninja
-96.126.127.235 # binaryedge.ninja
-96.126.96.19 # binaryedge.ninja
-96.126.96.6 # binaryedge.ninja
-96.126.97.144 # binaryedge.ninja
-96.126.97.187 # binaryedge.ninja
-96.126.97.209 # binaryedge.ninja
-96.126.97.229 # binaryedge.ninja
-96.126.97.231 # binaryedge.ninja
-97.107.136.171 # binaryedge.ninja
-97.107.136.18 # binaryedge.ninja
-97.107.136.52 # binaryedge.ninja
-97.107.137.159 # binaryedge.ninja
-97.107.137.228 # binaryedge.ninja
-97.107.137.247 # binaryedge.ninja
-97.107.140.226 # binaryedge.ninja
-
-# Reference: https://twitter.com/bad_packets/status/1105245951327784960
-
-198.20.103.178 # internet-census.org
-178.79.181.200
-172.104.182.103
-172.104.30.71
-172.104.251.182
-173.230.138.235
-107.6.150.242
-198.143.158.178
-139.162.73.218
-69.164.202.154
-
-# Reference: https://www.virustotal.com/gui/domain/www.internet-census.org/relations
-
-107.6.150.242
-107.6.169.250
-107.6.171.130
-107.6.183.162
-107.6.183.226
-108.178.61.58
-13.249.87.125
-13.249.87.45
-13.249.87.52
-13.249.87.58
-139.162.73.218
-172.104.130.222
-172.104.174.208
-172.104.182.103
-172.104.251.182
-172.104.30.71
-172.104.75.101
-173.230.138.235
-173.236.9.34
-173.255.213.43
-178.79.181.200
-184.154.253.82
-184.154.47.2
-184.154.74.66
-192.155.95.9
-198.143.133.154
-198.143.155.138
-198.143.158.178
-198.143.158.82
-198.20.103.178
-45.33.2.193
-45.33.66.232
-45.33.77.149
-50.116.35.113
-52.216.108.218
-52.216.145.202
-52.216.80.226
-52.216.92.82
-69.164.202.154
-69.175.97.170
-74.207.253.60
-84.154.47.2
-96.127.158.234
-96.127.169.2
-99.84.168.122
-99.84.168.15
-99.84.168.29
-99.84.168.89
-99.84.254.24
-99.84.254.27
-99.84.254.42
-99.84.254.71
-
-# Reference: https://twitter.com/bad_packets/status/1102675361496616960
-# Reference: https://www.virustotal.com/#/domain/internettl.org
-
-104.152.52.2 # internettl.org
-104.152.52.3 # internettl.org
-104.152.52.4 # internettl.org
-104.152.52.5 # internettl.org
-104.152.52.6 # internettl.org
-104.152.52.7 # internettl.org
-104.152.52.9 # internettl.org
-104.152.52.10 # internettl.org
-104.152.52.11 # internettl.org
-104.152.52.12 # internettl.org
-104.152.52.13 # internettl.org
-104.152.52.14 # internettl.org
-104.152.52.15 # internettl.org
-104.152.52.16 # internettl.org
-104.152.52.17 # internettl.org
-104.152.52.100 # internettl.org
-104.152.52.101 # internettl.org
-104.152.52.102 # internettl.org
-104.152.52.103 # internettl.org
-104.152.52.104 # internettl.org
-104.152.52.105 # internettl.org
-104.152.52.106 # internettl.org
-104.152.52.107 # internettl.org
-104.152.52.108 # internettl.org
-104.152.52.109 # internettl.org
-104.152.52.110 # internettl.org
-104.152.52.111 # internettl.org
-104.152.52.112 # internettl.org
-104.152.52.113 # internettl.org
-104.152.52.114 # internettl.org
-104.152.52.115 # internettl.org
-104.152.52.116 # internettl.org
-104.152.52.117 # internettl.org
-104.152.52.118 # internettl.org
-104.152.52.119 # internettl.org
-104.152.52.120 # internettl.org
-104.152.52.121 # internettl.org
-104.152.52.122 # internettl.org
-104.152.52.123 # internettl.org
-104.152.52.124 # internettl.org
-104.152.52.125 # internettl.org
-104.152.52.126 # internettl.org
-104.152.52.127 # internettl.org
-104.152.52.128 # internettl.org
-104.152.52.129 # internettl.org
-104.152.52.130 # internettl.org
-104.152.52.131 # internettl.org
-104.152.52.132 # internettl.org
-104.152.52.133 # internettl.org
-104.152.52.134 # internettl.org
-104.152.52.135 # internettl.org
-104.152.52.136 # internettl.org
-104.152.52.137 # internettl.org
-104.152.52.138 # internettl.org
-104.152.52.139 # internettl.org
-104.152.52.140 # internettl.org
-104.152.52.141 # internettl.org
-104.152.52.142 # internettl.org
-104.152.52.143 # internettl.org
-104.152.52.144 # internettl.org
-104.152.52.145 # internettl.org
-104.152.52.146 # internettl.org
-104.152.52.147 # internettl.org
-104.152.52.148 # internettl.org
-104.152.52.149 # internettl.org
-104.152.52.150 # internettl.org
-104.152.52.151 # internettl.org
-104.152.52.152 # internettl.org
-104.152.52.153 # internettl.org
-104.152.52.154 # internettl.org
-104.152.52.155 # internettl.org
-104.152.52.156 # internettl.org
-104.152.52.157 # internettl.org
-104.152.52.158 # internettl.org
-104.152.52.159 # internettl.org
-104.152.52.160 # internettl.org
-104.152.52.161 # internettl.org
-104.152.52.162 # internettl.org
-104.152.52.163 # internettl.org
-104.152.52.164 # internettl.org
-104.152.52.165 # internettl.org
-104.152.52.166 # internettl.org
-104.152.52.167 # internettl.org
-104.152.52.168 # internettl.org
-104.152.52.169 # internettl.org
-104.152.52.170 # internettl.org
-104.152.52.171 # internettl.org
-104.152.52.172 # internettl.org
-104.152.52.173 # internettl.org
-104.152.52.174 # internettl.org
-104.152.52.175 # internettl.org
-104.152.52.176 # internettl.org
-104.152.52.177 # internettl.org
-104.152.52.178 # internettl.org
-104.152.52.179 # internettl.org
-104.152.52.180 # internettl.org
-104.152.52.181 # internettl.org
-104.152.52.182 # internettl.org
-104.152.52.183 # internettl.org
-104.152.52.184 # internettl.org
-104.152.52.185 # internettl.org
-104.152.52.186 # internettl.org
-104.152.52.187 # internettl.org
-104.152.52.188 # internettl.org
-104.152.52.189 # internettl.org
-104.152.52.190 # internettl.org
-104.152.52.191 # internettl.org
-104.152.52.192 # internettl.org
-104.152.52.193 # internettl.org
-104.152.52.194 # internettl.org
-104.152.52.195 # internettl.org
-104.152.52.196 # internettl.org
-104.152.52.197 # internettl.org
-104.152.52.198 # internettl.org
-104.152.52.199 # internettl.org
-104.152.52.21 # internettl.org
-104.152.52.22 # internettl.org
-104.152.52.23 # internettl.org
-104.152.52.24 # internettl.org
-104.152.52.25 # internettl.org
-104.152.52.26 # internettl.org
-104.152.52.27 # internettl.org
-104.152.52.28 # internettl.org
-104.152.52.29 # internettl.org
-104.152.52.30 # internettl.org
-104.152.52.31 # internettl.org
-104.152.52.32 # internettl.org
-104.152.52.33 # internettl.org
-104.152.52.34 # internettl.org
-104.152.52.35 # internettl.org
-104.152.52.36 # internettl.org
-104.152.52.37 # internettl.org
-104.152.52.38 # internettl.org
-104.152.52.39 # internettl.org
-104.152.52.55 # internettl.org
-104.152.52.56 # internettl.org
-104.152.52.57 # internettl.org
-104.152.52.58 # internettl.org
-104.152.52.59 # internettl.org
-104.152.52.60 # internettl.org
-104.152.52.61 # internettl.org
-104.152.52.64 # internettl.org
-104.152.52.65 # internettl.org
-104.152.52.66 # internettl.org
-104.152.52.67 # internettl.org
-104.152.52.69 # internettl.org
-104.152.52.70 # internettl.org
-104.152.52.72 # internettl.org
-104.152.52.73 # internettl.org
-104.152.52.74 # internettl.org
-104.152.52.75 # internettl.org
-192.64.119.254 # census.internettl.org
-
-# Reference: https://twitter.com/bad_packets/status/1082733800780574720
-# Reference: https://www.virustotal.com/gui/domain/binaryedge.io/details
-# Reference: https://www.virustotal.com/gui/domain/binaryedge.ninja/details
-
-46.101.0.118 # do-prod-eu-west-scanner-0402-10.do.binaryedge.ninja
-46.101.0.138 # do-prod-eu-west-scanner-0402-8.do.binaryedge.ninja
-46.101.0.20 # do-prod-eu-west-scanner-0402-22.do.binaryedge.ninja
-46.101.13.122 # do-prod-eu-west-scanner-2604-37.do.binaryedge.ninja
-46.101.16.176 # do-prod-eu-west-scanner-2604-8.do.binaryedge.ninja
-46.101.24.43 # do-prod-eu-west-scanner-2304-2.do.binaryedge.ninja
-46.101.26.182 # jerry-se-do-eu-west-scanners-32.do.binaryedge.ninja
-46.101.28.43 # do-prod-eu-west-scanner-2304-8.do.binaryedge.ninja
-46.101.32.242 # do-prod-eu-west-scanner-2304-1.do.binaryedge.ninja
-46.101.33.13 # do-prod-eu-west-scanner-2304-5.do.binaryedge.ninja
-46.101.34.153 # do-prod-eu-west-scanner-2304-13.do.binaryedge.ninja
-46.101.35.18 # jerry-se-do-eu-west-scanners-7.do.binaryedge.ninja
-46.101.40.180 # jerry-se-do-eu-west-scanners-27.do.binaryedge.ninja
-46.101.44.194 # do-prod-eu-west-scanner-2604-32.do.binaryedge.ninja
-46.101.57.138 # jerry-se-do-eu-west-scanners-6.do.binaryedge.ninja
-46.101.62.228 # jerry-se-do-eu-west-scanners-65.do.binaryedge.ninja
-46.101.76.121 # jerry-se-do-eu-west-scanners-11.do.binaryedge.ninja
-46.101.79.244 # jerry-se-do-eu-west-scanners-12.do.binaryedge.ninja
-46.101.8.136 # jerry-se-do-eu-west-scanners-63.do.binaryedge.ninja
-46.101.9.166 # do-prod-eu-west-scanner-2304-12.do.binaryedge.ninja
-64.225.124.134 # do-prod-us-west-scanner-0106-4.do.binaryedge.ninja
-64.225.124.141 # do-prod-us-west-scanner-0106-9.do.binaryedge.ninja
-64.225.124.184 # do-prod-us-west-scanner-0106-8.do.binaryedge.ninja
-64.225.124.194 # do-prod-us-west-scanner-0106-5.do.binaryedge.ninja
-64.225.64.251 # do-prod-eu-central-scanner-2304-9.do.binaryedge.ninja
-64.225.64.8 # do-prod-eu-central-scanner-0106-38.do.binaryedge.ninja
-64.225.64.96 # do-prod-eu-central-scanner-0106-13.do.binaryedge.ninja
-64.225.64.96 # do-prod-eu-central-scanner-0610-4.do.binaryedge.ninja
-64.225.65.143 # do-prod-eu-central-scanner-0106-33.do.binaryedge.ninja
-64.225.68.160 # do-prod-eu-central-scanner-0106-19.do.binaryedge.ninja
-64.225.68.218 # do-prod-eu-central-scanner-0106-29.do.binaryedge.ninja
-64.225.68.218 # do-prod-eu-central-scanner-0610-32.do.binaryedge.ninja
-64.225.68.251 # do-prod-eu-central-scanner-0402-12.do.binaryedge.ninja
-64.225.69.41 # do-prod-eu-central-scanner-0402-25.do.binaryedge.ninja
-64.225.69.50 # do-prod-eu-central-scanner-0402-16.do.binaryedge.ninja
-64.225.69.55 # do-prod-eu-central-scanner-0402-5.do.binaryedge.ninja
-64.225.72.0 # do-prod-eu-central-scanner-2304-6.do.binaryedge.ninja
-64.225.72.229 # do-prod-eu-central-scanner-0610-17.do.binaryedge.ninja
-64.225.73.254 # do-prod-eu-central-scanner-0106-28.do.binaryedge.ninja
-64.225.73.49 # do-prod-eu-central-scanner-0106-23.do.binaryedge.ninja
-64.225.73.59 # do-prod-eu-central-scanner-0106-11.do.binaryedge.ninja
-64.225.74.229 # do-prod-eu-central-scanner-0402-14.do.binaryedge.ninja
-64.225.76.243 # do-prod-eu-central-scanner-0610-16.do.binaryedge.ninja
-64.225.76.244 # do-prod-eu-central-scanner-0402-8.do.binaryedge.ninja
-64.225.78.120 # do-prod-eu-central-scanner-0402-2.do.binaryedge.ninja
-64.225.78.121 # do-prod-eu-central-scanner-0402-4.do.binaryedge.ninja
-64.225.78.153 # do-prod-eu-central-scanner-0402-20.do.binaryedge.ninja
-64.225.78.210 # do-prod-eu-central-scanner-0402-19.do.binaryedge.ninja
-64.225.78.32 # do-prod-eu-central-scanner-0402-9.do.binaryedge.ninja
-64.227.21.117 # do-prod-us-east-scanner-0106-38.do.binaryedge.ninja
-64.227.22.142 # do-prod-us-east-scanner-0402-29.do.binaryedge.ninja
-64.227.29.97 # do-prod-us-east-scanner-0106-11.do.binaryedge.ninja
-64.227.30.133 # do-prod-us-east-scanner-0402-24.do.binaryedge.ninja
-64.227.3.134 # do-prod-us-east-scanner-0402-17.do.binaryedge.ninja
-64.227.33.99 # do-prod-eu-west-scanner-0402-3.do.binaryedge.ninja
-64.227.34.226 # do-prod-eu-west-scanner-0610-31.do.binaryedge.ninja
-64.227.35.132 # do-prod-eu-west-scanner-0106-13.do.binaryedge.ninja
-64.227.35.132 # do-prod-eu-west-scanner-0610-13.do.binaryedge.ninja
-64.227.37.54 # do-prod-eu-west-scanner-0402-12.do.binaryedge.ninja
-64.227.38.210 # do-prod-eu-west-scanner-0610-4.do.binaryedge.ninja
-64.227.38.225 # do-prod-eu-west-scanner-0610-3.do.binaryedge.ninja
-64.227.41.242 # do-prod-eu-west-scanner-0106-33.do.binaryedge.ninja
-64.227.41.242 # do-prod-eu-west-scanner-0610-37.do.binaryedge.ninja
-64.227.42.182 # do-prod-eu-west-scanner-0610-11.do.binaryedge.ninja
-64.227.42.185 # do-prod-eu-west-scanner-0610-29.do.binaryedge.ninja
-64.227.42.191 # do-prod-eu-west-scanner-0610-21.do.binaryedge.ninja
-64.227.44.126 # do-prod-eu-west-scanner-0402-28.do.binaryedge.ninja
-64.227.47.100 # do-prod-eu-west-scanner-0610-30.do.binaryedge.ninja
-67.205.132.3 # do-prod-us-east-scanner-2604-12.do.binaryedge.ninja
-67.205.151.242 # do-prod-us-east-scanner-0106-14.do.binaryedge.ninja
-67.205.175.245 # do-prod-us-east-scanner-0402-21.do.binaryedge.ninja
-67.205.191.219 # do-prod-us-east-scanner-0402-18.do.binaryedge.ninja
-68.183.102.106 # do-prod-us-east-scanner-2604-35.do.binaryedge.ninja
-68.183.105.98 # do-prod-us-east-scanner-2304-1.do.binaryedge.ninja
-68.183.107.134 # do-prod-us-east-scanner-2604-32.do.binaryedge.ninja
-68.183.113.59 # do-prod-us-east-scanner-2304-9.do.binaryedge.ninja
-68.183.123.133 # do-prod-us-east-scanner-2304-13.do.binaryedge.ninja
-68.183.129.209 # do-prod-us-east-scanner-2304-14.do.binaryedge.ninja
-68.183.129.48 # do-prod-us-east-scanner-2304-2.do.binaryedge.ninja
-68.183.130.177 # do-prod-us-east-scanner-2604-23.do.binaryedge.ninja
-68.183.131.180 # do-prod-us-east-scanner-2304-10.do.binaryedge.ninja
-68.183.137.43 # do-prod-us-east-scanner-2304-6.do.binaryedge.ninja
-68.183.192.247 # do-prod-us-north-scanner-0106-3.do.binaryedge.ninja
-68.183.192.74 # do-prod-us-north-scanner-2604-26.do.binaryedge.ninja
-68.183.193.8 # do-prod-us-north-scanner-2604-36.do.binaryedge.ninja
-68.183.194.100 # do-prod-us-north-scanner-2604-18.do.binaryedge.ninja
-68.183.195.12 # do-prod-us-north-scanner-2304-7.do.binaryedge.ninja
-68.183.195.222 # do-prod-us-north-scanner-2604-24.do.binaryedge.ninja
-68.183.195.47 # do-prod-us-north-scanner-0106-2.do.binaryedge.ninja
-68.183.195.79 # do-prod-us-north-scanner-2604-9.do.binaryedge.ninja
-68.183.195.93 # do-prod-us-north-scanner-2604-25.do.binaryedge.ninja
-68.183.196.109 # do-prod-us-north-scanner-0106-29.do.binaryedge.ninja
-68.183.197.202 # do-prod-us-north-scanner-0106-0.do.binaryedge.ninja
-68.183.197.231 # do-prod-us-north-scanner-0106-11.do.binaryedge.ninja
-68.183.197.255 # do-prod-us-north-scanner-2604-17.do.binaryedge.ninja
-68.183.198.68 # do-prod-us-north-scanner-2604-12.do.binaryedge.ninja
-68.183.199.169 # do-prod-us-north-scanner-0106-10.do.binaryedge.ninja
-68.183.199.171 # do-prod-us-north-scanner-0106-16.do.binaryedge.ninja
-68.183.199.198 # do-prod-us-north-scanner-0106-23.do.binaryedge.ninja
-68.183.199.207 # do-prod-us-north-scanner-0106-1.do.binaryedge.ninja
-68.183.199.238 # do-prod-us-north-scanner-0106-20.do.binaryedge.ninja
-68.183.199.255 # do-prod-us-north-scanner-0106-6.do.binaryedge.ninja
-68.183.200.160 # do-prod-us-north-scanner-2604-33.do.binaryedge.ninja
-68.183.201.105 # do-prod-us-north-scanner-2604-27.do.binaryedge.ninja
-68.183.201.126 # do-prod-us-north-scanner-2604-38.do.binaryedge.ninja
-68.183.203.120 # do-prod-us-north-scanner-2604-5.do.binaryedge.ninja
-68.183.203.152 # do-prod-us-north-scanner-0106-17.do.binaryedge.ninja
-68.183.203.154 # do-prod-us-north-scanner-0106-31.do.binaryedge.ninja
-68.183.203.157 # do-prod-us-north-scanner-0106-13.do.binaryedge.ninja
-68.183.203.168 # do-prod-us-north-scanner-0106-37.do.binaryedge.ninja
-68.183.203.98 # do-prod-us-north-scanner-2604-13.do.binaryedge.ninja
-68.183.205.181 # do-prod-us-north-scanner-0106-19.do.binaryedge.ninja
-68.183.205.23 # do-prod-us-north-scanner-0106-14.do.binaryedge.ninja
-68.183.205.35 # do-prod-us-north-scanner-2604-34.do.binaryedge.ninja
-68.183.205.37 # do-prod-us-north-scanner-0106-28.do.binaryedge.ninja
-68.183.205.48 # do-prod-us-north-scanner-0106-38.do.binaryedge.ninja
-68.183.206.220 # do-prod-us-north-scanner-2604-14.do.binaryedge.ninja
-68.183.207.70 # do-prod-us-north-scanner-2604-15.do.binaryedge.ninja
-68.183.22.200 # do-prod-us-east-scanner-2304-3.do.binaryedge.ninja
-68.183.23.237 # do-prod-us-east-scanner-2604-39.do.binaryedge.ninja
-68.183.30.55 # do-prod-us-east-scanner-2604-17.do.binaryedge.ninja
-68.183.33.144 # jerry-se-do-eu-west-scanners-87.do.binaryedge.ninja
-68.183.34.176 # do-prod-eu-west-scanner-0610-5.do.binaryedge.ninja
-68.183.34.33 # jerry-se-do-eu-west-scanners-41.do.binaryedge.ninja
-68.183.34.42 # jerry-se-do-eu-west-scanners-68.do.binaryedge.ninja
-68.183.35.171 # jerry-se-do-eu-west-scanners-86.do.binaryedge.ninja
-68.183.35.70 # do-prod-eu-west-scanner-0402-23.do.binaryedge.ninja
-68.183.36.244 # jerry-se-do-eu-west-scanners-64.do.binaryedge.ninja
-68.183.36.254 # jerry-se-do-eu-west-scanners-19.do.binaryedge.ninja
-68.183.36.5 # do-prod-eu-west-scanner-0610-14.do.binaryedge.ninja
-68.183.37.10 # jerry-se-do-eu-west-scanners-82.do.binaryedge.ninja
-68.183.37.12 # jerry-se-do-eu-west-scanners-17.do.binaryedge.ninja
-68.183.39.136 # do-prod-eu-west-scanner-0106-26.do.binaryedge.ninja
-68.183.41.150 # jerry-se-do-eu-west-scanners-81.do.binaryedge.ninja
-68.183.44.143 # jerry-se-do-eu-west-scanners-35.do.binaryedge.ninja
-68.183.44.164 # jerry-se-do-eu-west-scanners-53.do.binaryedge.ninja
-68.183.80.108 # do-prod-ap-central-scanner-0402-2.do.binaryedge.ninja
-68.183.80.125 # do-prod-ap-central-scanner-0106-1.do.binaryedge.ninja
-68.183.82.222 # do-prod-ap-central-scanner-0106-0.do.binaryedge.ninja
-68.183.85.78 # do-prod-ap-central-scanner-0402-0.do.binaryedge.ninja
-68.183.88.255 # do-prod-ap-central-scanner-0106-5.do.binaryedge.ninja
-68.183.88.255 # do-prod-ap-central-scanner-0402-6.do.binaryedge.ninja
-68.183.88.97 # do-prod-ap-central-scanner-0106-9.do.binaryedge.ninja
-68.183.91.90 # do-prod-ap-central-scanner-2604-7.do.binaryedge.ninja
-68.183.94.129 # do-prod-ap-central-scanner-0106-2.do.binaryedge.ninja
-68.183.94.129 # do-prod-ap-central-scanner-0402-9.do.binaryedge.ninja
-68.183.98.107 # do-prod-us-east-scanner-2304-4.do.binaryedge.ninja
-104.131.209.10 # min-extra-scan-104-usny-prod.binaryedge.ninja.
-104.131.209.12 # min-extra-scan-105-usny-prod.binaryedge.ninja.
-104.131.209.9 # min-extra-scan-106-usny-prod.binaryedge.ninja.
-104.248.121.241 # do-prod-us-east-scanner-2604-30.do.binaryedge.ninja
-104.248.121.27 # do-prod-us-east-scanner-2604-25.do.binaryedge.ninja
-104.248.122.181 # do-prod-us-east-scanner-2604-37.do.binaryedge.ninja
-104.248.157.238 # do-prod-ap-south-scanner-0402-9.do.binaryedge.ninja
-104.248.161.138 # jerry-se-do-eu-west-scanners-37.do.binaryedge.ninja
-104.248.163.91 # jerry-se-do-eu-west-scanners-5.do.binaryedge.ninja
-104.248.168.255 # jerry-se-do-eu-west-scanners-22.do.binaryedge.ninja
-104.248.201.176 # do-prod-eu-central-scanner-2304-0.do.binaryedge.ninja
-104.248.202.55 # do-prod-eu-central-scanner-2604-11.do.binaryedge.ninja
-104.248.204.81 # do-prod-eu-central-scanner-2604-17.do.binaryedge.ninja
-104.248.238.50 # do-prod-us-east-scanner-2604-2.do.binaryedge.ninja
-104.248.49.147 # do-prod-us-east-scanner-2604-0.do.binaryedge.ninja
-104.248.53.147 # do-prod-us-east-scanner-2604-16.do.binaryedge.ninja
-104.248.81.11 # do-prod-eu-central-scanner-0402-1.do.binaryedge.ninja
-104.248.93.171 # do-prod-eu-central-scanner-0106-22.do.binaryedge.ninja
-104.248.93.7 # do-prod-eu-central-scanner-2604-6.do.binaryedge.ninja
-104.248.94.213 # do-prod-eu-central-scanner-2604-23.do.binaryedge.ninja
-128.199.113.233 # do-prod-ap-south-scanner-0610-8.do.binaryedge.ninja
-128.199.155.173 # do-prod-ap-south-scanner-0106-1.do.binaryedge.ninja
-128.199.163.130 # do-prod-ap-south-scanner-2604-9.do.binaryedge.ninja
-128.199.169.34 # do-prod-ap-south-scanner-0106-4.do.binaryedge.ninja
-128.199.169.45 # do-prod-ap-south-scanner-0610-3.do.binaryedge.ninja
-128.199.173.145 # do-prod-ap-south-scanner-0106-9.do.binaryedge.ninja
-128.199.243.142 # do-prod-ap-south-scanner-0402-3.do.binaryedge.ninja
-128.199.254.145 # do-prod-ap-south-scanner-0402-8.do.binaryedge.ninja
-128.199.254.226 # do-prod-ap-south-scanner-0402-0.do.binaryedge.ninja
-128.199.255.87 # do-prod-ap-south-scanner-0402-1.do.binaryedge.ninja
-128.199.255.88 # do-prod-ap-south-scanner-0402-7.do.binaryedge.ninja
-128.199.37.62 # do-prod-eu-central-scanner-0610-13.do.binaryedge.ninja
-128.199.37.62 # do-prod-eu-central-scanner-2604-10.do.binaryedge.ninja
-128.199.39.125 # do-prod-eu-central-scanner-0402-18.do.binaryedge.ninja
-128.199.39.251 # do-prod-eu-central-scanner-0610-11.do.binaryedge.ninja
-128.199.44.16 # do-prod-eu-central-scanner-2604-31.do.binaryedge.ninja
-128.199.48.147 # do-prod-eu-central-scanner-2304-13.do.binaryedge.ninja
-128.199.49.220 # do-prod-eu-central-scanner-0610-21.do.binaryedge.ninja
-128.199.59.238 # do-prod-eu-central-scanner-0402-26.do.binaryedge.ninja
-134.122.101.173 # do-prod-eu-west-scanner-0402-9.do.binaryedge.ninja
-134.122.101.181 # do-prod-eu-west-scanner-0106-36.do.binaryedge.ninja
-134.122.101.207 # do-prod-eu-west-scanner-0106-34.do.binaryedge.ninja
-134.122.101.219 # do-prod-eu-west-scanner-0106-29.do.binaryedge.ninja
-134.122.101.91 # do-prod-eu-west-scanner-0106-38.do.binaryedge.ninja
-134.122.102.133 # do-prod-eu-west-scanner-0106-0.do.binaryedge.ninja
-134.122.104.100 # do-prod-eu-west-scanner-0106-12.do.binaryedge.ninja
-134.122.104.132 # do-prod-eu-west-scanner-0106-25.do.binaryedge.ninja
-134.122.104.132 # do-prod-eu-west-scanner-0610-9.do.binaryedge.ninja
-134.122.105.100 # do-prod-eu-west-scanner-0106-3.do.binaryedge.ninja
-134.122.105.123 # do-prod-eu-west-scanner-0610-10.do.binaryedge.ninja
-134.122.105.236 # do-prod-eu-west-scanner-0106-27.do.binaryedge.ninja
-134.122.105.23 # do-prod-eu-west-scanner-0106-35.do.binaryedge.ninja
-134.122.105.48 # do-prod-eu-west-scanner-0106-14.do.binaryedge.ninja
-134.122.105.9 # do-prod-eu-west-scanner-0106-19.do.binaryedge.ninja
-134.122.106.188 # do-prod-eu-west-scanner-0402-17.do.binaryedge.ninja
-134.122.106.232 # do-prod-eu-west-scanner-0106-28.do.binaryedge.ninja
-134.122.107.9 # do-prod-eu-west-scanner-0402-18.do.binaryedge.ninja
-134.122.108.105 # do-prod-eu-west-scanner-0610-38.do.binaryedge.ninja
-134.122.108.194 # do-prod-eu-west-scanner-0106-23.do.binaryedge.ninja
-134.122.108.208 # do-prod-eu-west-scanner-0106-24.do.binaryedge.ninja
-134.122.109.113 # do-prod-eu-west-scanner-0106-30.do.binaryedge.ninja
-134.122.109.127 # do-prod-eu-west-scanner-0106-21.do.binaryedge.ninja
-134.122.109.150 # do-prod-eu-west-scanner-0402-14.do.binaryedge.ninja
-134.122.109.151 # do-prod-eu-west-scanner-0106-17.do.binaryedge.ninja
-134.122.109.161 # do-prod-eu-west-scanner-0106-22.do.binaryedge.ninja
-134.122.110.102 # do-prod-eu-west-scanner-0106-8.do.binaryedge.ninja
-134.122.110.47 # do-prod-eu-west-scanner-0106-16.do.binaryedge.ninja
-134.122.110.78 # do-prod-eu-west-scanner-0106-4.do.binaryedge.ninja
-134.122.111.144 # do-prod-eu-west-scanner-0402-20.do.binaryedge.ninja
-134.122.111.150 # do-prod-eu-west-scanner-0402-26.do.binaryedge.ninja
-134.122.111.156 # do-prod-eu-west-scanner-0402-19.do.binaryedge.ninja
-134.122.24.141 # do-prod-us-east-scanner-0402-23.do.binaryedge.ninja
-134.122.28.12 # do-prod-us-east-scanner-0402-1.do.binaryedge.ninja
-134.122.28.146 # do-prod-us-east-scanner-0402-2.do.binaryedge.ninja
-134.122.28.192 # do-prod-us-east-scanner-0402-10.do.binaryedge.ninja
-134.122.28.20 # do-prod-us-east-scanner-0402-9.do.binaryedge.ninja
-134.122.30.193 # do-prod-us-east-scanner-0402-19.do.binaryedge.ninja
-134.122.30.227 # do-prod-us-east-scanner-0402-0.do.binaryedge.ninja
-134.122.30.230 # do-prod-us-east-scanner-0402-4.do.binaryedge.ninja
-134.122.30.80 # do-prod-us-east-scanner-0402-7.do.binaryedge.ninja
-134.122.39.203 # do-prod-us-north-scanner-2604-35.do.binaryedge.ninja
-134.122.42.184 # do-prod-us-north-scanner-2604-29.do.binaryedge.ninja
-134.122.43.153 # do-prod-us-north-scanner-2604-31.do.binaryedge.ninja
-134.122.45.197 # do-prod-us-north-scanner-2604-39.do.binaryedge.ninja
-134.122.97.252 # do-prod-eu-west-scanner-0106-15.do.binaryedge.ninja
-134.122.99.39 # do-prod-eu-west-scanner-0402-6.do.binaryedge.ninja
-134.209.145.100 # do-prod-ap-central-scanner-0402-7.do.binaryedge.ninja
-134.209.145.188 # do-prod-ap-central-scanner-0402-1.do.binaryedge.ninja
-134.209.146.193 # do-prod-ap-central-scanner-0402-4.do.binaryedge.ninja
-134.209.149.90 # do-prod-ap-central-scanner-0402-5.do.binaryedge.ninja
-134.209.155.240 # do-prod-ap-central-scanner-2604-8.do.binaryedge.ninja
-134.209.158.199 # do-prod-ap-central-scanner-0402-8.do.binaryedge.ninja
-134.209.179.35 # do-prod-eu-west-scanner-0610-28.do.binaryedge.ninja
-134.209.184.192 # do-prod-eu-west-scanner-0106-2.do.binaryedge.ninja
-134.209.184.7 # do-prod-eu-west-scanner-0610-25.do.binaryedge.ninja
-134.209.192.64 # do-prod-eu-central-scanner-0610-26.do.binaryedge.ninja
-134.209.195.95 # do-prod-eu-central-scanner-0402-15.do.binaryedge.ninja
-134.209.20.127 # jerry-se-do-eu-west-scanners-76.do.binaryedge.ninja
-134.209.202.147 # do-prod-eu-central-scanner-2604-29.do.binaryedge.ninja
-134.209.204.202 # do-prod-eu-central-scanner-0610-22.do.binaryedge.ninja
-134.209.22.239 # do-prod-eu-west-scanner-0106-6.do.binaryedge.ninja
-134.209.23.41 # do-prod-eu-west-scanner-0402-15.do.binaryedge.ninja
-134.209.24.42 # jerry-se-do-eu-west-scanners-83.do.binaryedge.ninja
-134.209.27.208 # jerry-se-do-eu-west-scanners-45.do.binaryedge.ninja
-134.209.29.114 # jerry-se-do-eu-west-scanners-31.do.binaryedge.ninja
-134.209.82.255 # do-prod-eu-central-scanner-2304-2.do.binaryedge.ninja
-134.209.84.219 # do-prod-eu-central-scanner-2604-11.do.binaryedge.ninja
-134.209.87.69 # do-prod-eu-central-scanner-2604-15.do.binaryedge.ninja
-134.209.87.86 # do-prod-eu-central-scanner-0610-3.do.binaryedge.ninja
-134.209.89.12 # do-prod-eu-central-scanner-0106-18.do.binaryedge.ninja
-138.197.137.224 # do-prod-us-north-scanner-0106-34.do.binaryedge.ninja
-138.197.137.244 # do-prod-us-north-scanner-0106-18.do.binaryedge.ninja
-138.197.147.8 # do-prod-us-north-scanner-2604-0.do.binaryedge.ninja
-138.197.158.86 # do-prod-us-north-scanner-2304-12.do.binaryedge.ninja
-138.197.170.252 # do-prod-us-north-scanner-0402-27.do.binaryedge.ninja
-138.197.172.201 # do-prod-us-north-scanner-0106-30.do.binaryedge.ninja
-138.197.173.150 # do-prod-us-north-scanner-2604-4.do.binaryedge.ninja
-138.197.174.2 # do-prod-us-north-scanner-0402-9.do.binaryedge.ninja
-138.197.174.39 # do-prod-us-north-scanner-0106-12.do.binaryedge.ninja
-138.68.131.10 # jerry-se-do-eu-west-scanners-34.do.binaryedge.ninja
-138.68.132.247 # jerry-se-do-eu-west-scanners-29.do.binaryedge.ninja
-138.68.132.66 # do-prod-eu-west-scanner-2304-6.do.binaryedge.ninja
-138.68.135.7 # do-prod-eu-west-scanner-2604-3.do.binaryedge.ninja
-138.68.141.169 # do-prod-eu-west-scanner-2604-7.do.binaryedge.ninja
-138.68.142.34 # jerry-se-do-eu-west-scanners-66.do.binaryedge.ninja
-138.68.147.16 # do-prod-eu-west-scanner-2604-25.do.binaryedge.ninja
-138.68.148.116 # jerry-se-do-eu-west-scanners-46.do.binaryedge.ninja
-138.68.152.200 # do-prod-eu-west-scanner-2604-3.do.binaryedge.ninja
-138.68.155.222 # jerry-se-do-eu-west-scanners-33.do.binaryedge.ninja
-138.68.162.39 # jerry-se-do-eu-west-scanners-14.do.binaryedge.ninja
-138.68.167.19 # jerry-se-do-eu-west-scanners-62.do.binaryedge.ninja
-138.68.167.234 # jerry-se-do-eu-west-scanners-0.do.binaryedge.ninja
-138.68.169.29 # do-prod-eu-west-scanner-2604-11.do.binaryedge.ninja
-138.68.171.142 # do-prod-eu-west-scanner-2604-12.do.binaryedge.ninja
-138.68.171.219 # jerry-se-do-eu-west-scanners-24.do.binaryedge.ninja
-138.68.176.195 # do-prod-eu-west-scanner-2604-11.do.binaryedge.ninja
-138.68.179.238 # jerry-se-do-eu-west-scanners-47.do.binaryedge.ninja
-138.68.180.131 # do-prod-eu-west-scanner-2604-13.do.binaryedge.ninja
-138.68.180.200 # jerry-se-do-eu-west-scanners-48.do.binaryedge.ninja
-138.68.183.227 # jerry-se-do-eu-west-scanners-25.do.binaryedge.ninja
-138.68.185.19 # do-prod-eu-west-scanner-2604-4.do.binaryedge.ninja
-138.68.185.218 # do-prod-eu-west-scanner-2604-17.do.binaryedge.ninja
-138.68.187.151 # do-prod-eu-west-scanner-2604-38.do.binaryedge.ninja
-138.68.187.232 # do-prod-eu-west-scanner-2604-10.do.binaryedge.ninja
-138.68.187.83 # do-prod-eu-west-scanner-2604-0.do.binaryedge.ninja
-138.68.189.162 # do-prod-eu-west-scanner-2604-39.do.binaryedge.ninja
-138.68.189.98 # do-prod-eu-west-scanner-2604-30.do.binaryedge.ninja
-138.68.190.198 # do-prod-eu-west-scanner-2604-20.do.binaryedge.ninja
-138.68.230.80 # do-prod-us-west-scanner-2604-18.do.binaryedge.ninja
-138.68.233.25 # do-prod-us-west-scanner-2304-5.do.binaryedge.ninja
-138.68.234.246 # do-prod-us-west-scanner-2304-12.do.binaryedge.ninja
-138.68.236.218 # do-prod-us-west-scanner-2604-11.do.binaryedge.ninja
-138.68.243.241 # do-prod-us-west-scanner-2304-4.do.binaryedge.ninja
-138.68.243.62 # do-prod-us-west-scanner-0402-1.do.binaryedge.ninja
-138.68.246.138 # do-prod-us-west-scanner-2604-4.do.binaryedge.ninja
-138.68.250.137 # do-prod-us-west-scanner-2604-3.do.binaryedge.ninja
-138.68.31.136 # do-prod-us-west-scanner-2604-3.do.binaryedge.ninja
-138.68.40.141 # do-prod-us-west-scanner-2604-8.do.binaryedge.ninja
-138.68.51.196 # do-prod-us-west-scanner-2604-13.do.binaryedge.ninja
-138.68.61.207 # do-prod-us-west-scanner-2604-9.do.binaryedge.ninja
-139.162.234.187 # min-extra-scan-100-uk-prod.binaryedge.ninja.
-139.59.101.65 # do-prod-ap-south-scanner-2604-8.do.binaryedge.ninja
-139.59.15.46 # do-prod-ap-central-scanner-2604-2.do.binaryedge.ninja
-139.59.162.124 # jerry-se-do-eu-west-scanners-73.do.binaryedge.ninja
-139.59.16.74 # do-prod-ap-central-scanner-0106-6.do.binaryedge.ninja
-139.59.16.74 # do-prod-ap-central-scanner-0402-3.do.binaryedge.ninja
-139.59.167.79 # do-prod-eu-west-scanner-2304-14.do.binaryedge.ninja
-139.59.170.240 # do-prod-eu-west-scanner-2304-3.do.binaryedge.ninja
-139.59.170.63 # do-prod-eu-west-scanner-2604-36.do.binaryedge.ninja
-139.59.174.185 # do-prod-eu-west-scanner-2604-9.do.binaryedge.ninja
-139.59.176.146 # jerry-se-do-eu-west-scanners-57.do.binaryedge.ninja
-139.59.178.185 # do-prod-eu-west-scanner-2604-29.do.binaryedge.ninja
-139.59.179.181 # do-prod-eu-west-scanner-2604-16.do.binaryedge.ninja
-139.59.190.72 # do-prod-eu-west-scanner-2604-22.do.binaryedge.ninja
-139.59.224.123 # do-prod-ap-south-scanner-0610-4.do.binaryedge.ninja
-139.59.224.172 # do-prod-ap-south-scanner-0610-7.do.binaryedge.ninja
-139.59.224.172 # do-prod-ap-south-scanner-2604-3.do.binaryedge.ninja
-139.59.229.152 # do-prod-ap-south-scanner-0610-1.do.binaryedge.ninja
-139.59.22.98 # do-prod-ap-central-scanner-0610-1.do.binaryedge.ninja
-139.59.230.117 # do-prod-ap-south-scanner-0610-5.do.binaryedge.ninja
-139.59.230.117 # do-prod-ap-south-scanner-2604-1.do.binaryedge.ninja
-139.59.230.228 # do-prod-ap-south-scanner-0610-6.do.binaryedge.ninja
-139.59.23.158 # do-prod-ap-central-scanner-0106-7.do.binaryedge.ninja
-139.59.233.231 # do-prod-ap-south-scanner-0610-9.do.binaryedge.ninja
-139.59.233.59 # do-prod-ap-south-scanner-0610-2.do.binaryedge.ninja
-139.59.58.25 # do-prod-ap-central-scanner-0610-5.do.binaryedge.ninja
-139.59.84.189 # do-prod-ap-central-scanner-0610-2.do.binaryedge.ninja
-139.59.84.189 # do-prod-ap-central-scanner-2604-6.do.binaryedge.ninja
-139.59.86.56 # do-prod-ap-central-scanner-0106-8.do.binaryedge.ninja
-142.93.10.221 # do-prod-us-east-scanner-2304-7.do.binaryedge.ninja
-142.93.115.172 # do-prod-us-east-scanner-0106-34.do.binaryedge.ninja
-142.93.119.136 # do-prod-us-east-scanner-2604-15.do.binaryedge.ninja
-142.93.131.15 # do-prod-eu-central-scanner-2604-12.do.binaryedge.ninja
-142.93.145.211 # do-prod-us-north-scanner-2304-4.do.binaryedge.ninja
-142.93.147.165 # do-prod-us-north-scanner-0402-24.do.binaryedge.ninja
-142.93.147.67 # do-prod-us-north-scanner-0106-7.do.binaryedge.ninja
-142.93.150.2 # do-prod-us-north-scanner-0402-12.do.binaryedge.ninja
-142.93.150.6 # do-prod-us-north-scanner-0402-2.do.binaryedge.ninja
-142.93.15.154 # do-prod-us-east-scanner-0106-28.do.binaryedge.ninja
-142.93.151.62 # do-prod-us-north-scanner-2604-20.do.binaryedge.ninja
-142.93.153.184 # do-prod-us-north-scanner-2604-1.do.binaryedge.ninja
-142.93.155.111 # do-prod-us-north-scanner-0402-1.do.binaryedge.ninja
-142.93.155.145 # do-prod-us-north-scanner-0402-23.do.binaryedge.ninja
-142.93.155.26 # do-prod-us-north-scanner-0402-17.do.binaryedge.ninja
-142.93.155.64 # do-prod-us-north-scanner-0402-25.do.binaryedge.ninja
-142.93.155.88 # do-prod-us-north-scanner-0402-20.do.binaryedge.ninja
-142.93.156.127 # do-prod-us-north-scanner-0106-15.do.binaryedge.ninja
-142.93.157.191 # do-prod-us-north-scanner-0106-22.do.binaryedge.ninja
-142.93.157.203 # do-prod-us-north-scanner-0402-6.do.binaryedge.ninja
-142.93.157.249 # do-prod-us-north-scanner-0402-13.do.binaryedge.ninja
-142.93.200.36 # do-prod-us-east-scanner-0106-18.do.binaryedge.ninja
-142.93.200.40 # do-prod-us-east-scanner-0106-17.do.binaryedge.ninja
-142.93.202.208 # do-prod-us-east-scanner-0106-15.do.binaryedge.ninja
-142.93.204.219 # do-prod-us-east-scanner-0106-31.do.binaryedge.ninja
-142.93.204.237 # do-prod-us-east-scanner-0106-29.do.binaryedge.ninja
-142.93.207.144 # do-prod-us-east-scanner-0106-7.do.binaryedge.ninja
-142.93.207.198 # do-prod-us-east-scanner-0106-19.do.binaryedge.ninja
-142.93.214.70 # do-prod-ap-central-scanner-2604-3.do.binaryedge.ninja
-142.93.217.180 # do-prod-ap-central-scanner-0106-3.do.binaryedge.ninja
-142.93.235.156 # do-prod-eu-central-scanner-0610-39.do.binaryedge.ninja
-142.93.238.85 # do-prod-eu-central-scanner-2604-19.do.binaryedge.ninja
-142.93.254.208 # do-prod-us-east-scanner-2604-29.do.binaryedge.ninja
-142.93.34.250 # jerry-se-do-eu-west-scanners-21.do.binaryedge.ninja
-142.93.34.55 # jerry-se-do-eu-west-scanners-30.do.binaryedge.ninja
-142.93.36.237 # jerry-se-do-eu-west-scanners-2.do.binaryedge.ninja
-142.93.37.178 # do-prod-eu-west-scanner-0106-10.do.binaryedge.ninja
-142.93.37.178 # do-prod-eu-west-scanner-0610-19.do.binaryedge.ninja
-142.93.38.96 # do-prod-eu-west-scanner-0610-18.do.binaryedge.ninja
-142.93.44.95 # jerry-se-do-eu-west-scanners-50.do.binaryedge.ninja
-142.93.47.173 # do-prod-eu-west-scanner-0402-11.do.binaryedge.ninja
-142.93.48.89 # do-prod-us-east-scanner-0106-6.do.binaryedge.ninja
-142.93.50.112 # do-prod-us-east-scanner-0402-8.do.binaryedge.ninja
-142.93.52.228 # do-prod-us-east-scanner-0402-6.do.binaryedge.ninja
-142.93.56.192 # do-prod-us-east-scanner-0106-39.do.binaryedge.ninja
-142.93.63.25 # do-prod-us-east-scanner-0106-20.do.binaryedge.ninja
-142.93.9.91 # do-prod-us-east-scanner-0106-16.do.binaryedge.ninja
-143.110.211.118 # do-prod-us-north-scanner-2304-1.do.binaryedge.ninja
-143.110.211.120 # do-prod-us-north-scanner-2304-2.do.binaryedge.ninja
-143.110.211.145 # do-prod-us-north-scanner-2304-5.do.binaryedge.ninja
-143.110.211.149 # do-prod-us-north-scanner-2304-9.do.binaryedge.ninja
-143.110.211.151 # do-prod-us-north-scanner-2304-8.do.binaryedge.ninja
-143.110.211.156 # do-prod-us-north-scanner-2304-3.do.binaryedge.ninja
-143.110.211.170 # do-prod-us-north-scanner-2304-6.do.binaryedge.ninja
-143.110.211.180 # do-prod-us-north-scanner-2304-10.do.binaryedge.ninja
-143.110.212.129 # do-prod-us-north-scanner-2604-28.do.binaryedge.ninja
-143.110.214.43 # do-prod-us-north-scanner-2604-3.do.binaryedge.ninja
-143.110.215.84 # do-prod-us-north-scanner-2604-7.do.binaryedge.ninja
-143.110.217.208 # do-prod-us-north-scanner-2604-10.do.binaryedge.ninja
-143.110.220.50 # do-prod-us-north-scanner-2604-2.do.binaryedge.ninja
-143.110.223.101 # do-prod-us-north-scanner-2604-12.do.binaryedge.ninja
-143.110.223.99 # do-prod-us-north-scanner-2604-16.do.binaryedge.ninja
-143.198.115.140 # do-prod-us-east-scanner-2604-21.do.binaryedge.ninja
-143.198.121.231 # do-prod-us-east-scanner-2304-11.do.binaryedge.ninja
-143.198.125.255 # do-prod-us-east-scanner-2304-5.do.binaryedge.ninja
-143.198.126.30 # do-prod-us-east-scanner-2604-14.do.binaryedge.ninja
-143.198.127.30 # do-prod-us-east-scanner-2604-6.do.binaryedge.ninja
-143.198.32.152 # do-prod-us-north-scanner-2604-17.do.binaryedge.ninja
-143.198.32.167 # do-prod-us-north-scanner-2604-4.do.binaryedge.ninja
-143.198.40.227 # do-prod-us-north-scanner-2604-13.do.binaryedge.ninja
-143.198.40.228 # do-prod-us-north-scanner-2604-11.do.binaryedge.ninja
-143.198.40.229 # do-prod-us-north-scanner-2604-2.do.binaryedge.ninja
-143.198.40.230 # do-prod-us-north-scanner-2604-3.do.binaryedge.ninja
-143.198.40.232 # do-prod-us-north-scanner-2604-18.do.binaryedge.ninja
-143.198.40.234 # do-prod-us-north-scanner-2604-0.do.binaryedge.ninja
-143.198.40.240 # do-prod-us-north-scanner-2604-1.do.binaryedge.ninja
-143.198.40.241 # do-prod-us-north-scanner-2604-8.do.binaryedge.ninja
-143.198.40.242 # do-prod-us-north-scanner-2604-9.do.binaryedge.ninja
-143.198.40.35 # do-prod-us-north-scanner-2604-6.do.binaryedge.ninja
-143.198.40.43 # do-prod-us-north-scanner-2604-15.do.binaryedge.ninja
-143.198.40.51 # do-prod-us-north-scanner-2604-14.do.binaryedge.ninja
-143.198.40.57 # do-prod-us-north-scanner-2604-19.do.binaryedge.ninja
-157.230.179.79 # do-prod-us-east-scanner-2604-20.do.binaryedge.ninja
-157.230.181.24 # do-prod-us-east-scanner-2604-4.do.binaryedge.ninja
-157.230.183.197 # do-prod-us-east-scanner-2604-19.do.binaryedge.ninja
-157.230.186.113 # do-prod-us-east-scanner-2604-1.do.binaryedge.ninja
-157.230.187.195 # do-prod-us-east-scanner-2604-3.do.binaryedge.ninja
-157.230.212.167 # do-prod-us-east-scanner-2604-28.do.binaryedge.ninja
-157.230.212.7 # do-prod-us-east-scanner-2604-15.do.binaryedge.ninja
-157.230.213.72 # do-prod-us-east-scanner-2604-9.do.binaryedge.ninja
-157.230.213.77 # do-prod-us-east-scanner-2604-8.do.binaryedge.ninja
-157.230.214.77 # do-prod-us-east-scanner-2604-17.do.binaryedge.ninja
-157.230.215.214 # do-prod-us-east-scanner-2604-11.do.binaryedge.ninja
-157.230.215.226 # do-prod-us-east-scanner-2604-22.do.binaryedge.ninja
-157.230.215.2 # do-prod-us-east-scanner-2604-38.do.binaryedge.ninja
-157.230.219.210 # do-prod-us-east-scanner-2604-13.do.binaryedge.ninja
-157.230.221.94 # do-prod-us-east-scanner-2604-10.do.binaryedge.ninja
-157.230.224.96 # do-prod-us-east-scanner-2604-7.do.binaryedge.ninja
-157.230.228.176 # do-prod-us-east-scanner-2604-18.do.binaryedge.ninja
-157.230.231.92 # do-prod-us-east-scanner-2604-7.do.binaryedge.ninja
-157.230.234.50 # do-prod-us-east-scanner-2604-13.do.binaryedge.ninja
-157.230.239.55 # do-prod-us-east-scanner-2604-18.do.binaryedge.ninja
-157.230.47.189 # do-prod-ap-south-scanner-0402-5.do.binaryedge.ninja
-157.230.49.9 # do-prod-us-east-scanner-2604-31.do.binaryedge.ninja
-157.230.51.82 # do-prod-us-east-scanner-2604-10.do.binaryedge.ninja
-157.230.6.217 # do-prod-us-east-scanner-2604-34.do.binaryedge.ninja
-157.230.81.99 # do-prod-us-east-scanner-2604-27.do.binaryedge.ninja
-157.230.86.8 # do-prod-us-east-scanner-2604-26.do.binaryedge.ninja
-157.230.87.194 # do-prod-us-east-scanner-2604-36.do.binaryedge.ninja
-157.245.139.234 # do-prod-us-east-scanner-0106-8.do.binaryedge.ninja
-157.245.142.159 # do-prod-us-east-scanner-0402-20.do.binaryedge.ninja
-157.245.166.176 # do-prod-us-west-scanner-0402-3.do.binaryedge.ninja
-157.245.228.70 # do-prod-us-west-scanner-0402-8.do.binaryedge.ninja
-157.245.250.139 # do-prod-us-east-scanner-0402-3.do.binaryedge.ninja
-157.245.254.227 # do-prod-us-east-scanner-0402-11.do.binaryedge.ninja
-157.245.32.41 # do-prod-eu-west-scanner-0106-11.do.binaryedge.ninja
-157.245.32.41 # do-prod-eu-west-scanner-0610-2.do.binaryedge.ninja
-157.245.35.188 # jerry-se-do-eu-west-scanners-8.do.binaryedge.ninja
-157.245.37.100 # jerry-se-do-eu-west-scanners-38.do.binaryedge.ninja
-157.245.45.242 # jerry-se-do-eu-west-scanners-10.do.binaryedge.ninja
-157.245.65.159 # do-prod-eu-central-scanner-0106-17.do.binaryedge.ninja
-157.245.65.159 # do-prod-eu-central-scanner-0610-38.do.binaryedge.ninja
-157.245.65.165 # do-prod-eu-central-scanner-2604-2.do.binaryedge.ninja
-157.245.66.157 # do-prod-eu-central-scanner-0106-30.do.binaryedge.ninja
-157.245.67.100 # do-prod-eu-central-scanner-0106-7.do.binaryedge.ninja
-157.245.67.197 # do-prod-eu-central-scanner-0106-36.do.binaryedge.ninja
-157.245.68.134 # do-prod-eu-central-scanner-0610-14.do.binaryedge.ninja
-157.245.69.97 # do-prod-eu-central-scanner-0106-0.do.binaryedge.ninja
-157.245.69.97 # do-prod-eu-central-scanner-0610-20.do.binaryedge.ninja
-157.245.70.180 # do-prod-eu-central-scanner-0106-5.do.binaryedge.ninja
-157.245.74.205 # do-prod-eu-central-scanner-0610-2.do.binaryedge.ninja
-157.245.76.148 # do-prod-eu-central-scanner-0106-8.do.binaryedge.ninja
-157.245.76.148 # do-prod-eu-central-scanner-0610-25.do.binaryedge.ninja
-157.245.77.151 # do-prod-eu-central-scanner-0106-3.do.binaryedge.ninja
-157.245.77.151 # do-prod-eu-central-scanner-0610-10.do.binaryedge.ninja
-157.245.77.151 # do-prod-eu-central-scanner-2604-13.do.binaryedge.ninja
-157.245.97.118 # do-prod-ap-central-scanner-0610-9.do.binaryedge.ninja
-157.245.97.208 # do-prod-ap-central-scanner-0610-3.do.binaryedge.ninja
-157.245.97.208 # do-prod-ap-central-scanner-2604-1.do.binaryedge.ninja
-157.245.97.243 # do-prod-ap-central-scanner-0610-7.do.binaryedge.ninja
-157.245.97.249 # do-prod-ap-central-scanner-0610-6.do.binaryedge.ninja
-157.245.98.175 # do-prod-ap-central-scanner-0610-8.do.binaryedge.ninja
-157.245.98.175 # do-prod-ap-central-scanner-2604-4.do.binaryedge.ninja
-159.203.10.178 # do-prod-us-north-scanner-0402-14.do.binaryedge.ninja
-159.203.189.178 # do-prod-us-east-scanner-0402-15.do.binaryedge.ninja
-159.203.22.148 # do-prod-us-north-scanner-2304-0.do.binaryedge.ninja
-159.203.2.249 # do-prod-us-north-scanner-2304-13.do.binaryedge.ninja
-159.203.29.14 # do-prod-us-north-scanner-0402-16.do.binaryedge.ninja
-159.203.31.143 # do-prod-us-north-scanner-2604-23.do.binaryedge.ninja
-159.203.3.3 # do-prod-us-north-scanner-2604-21.do.binaryedge.ninja
-159.203.36.225 # do-prod-us-north-scanner-2604-30.do.binaryedge.ninja
-159.203.40.166 # do-prod-us-north-scanner-0106-24.do.binaryedge.ninja
-159.203.41.47 # do-prod-us-north-scanner-2604-7.do.binaryedge.ninja
-159.203.43.231 # do-prod-us-north-scanner-2304-14.do.binaryedge.ninja
-159.203.58.178 # do-prod-us-north-scanner-0402-21.do.binaryedge.ninja
-159.203.59.249 # do-prod-us-north-scanner-2604-5.do.binaryedge.ninja
-159.203.9.202 # do-prod-us-north-scanner-0402-5.do.binaryedge.ninja
-159.65.105.162 # do-prod-us-west-scanner-2304-8.do.binaryedge.ninja
-159.65.129.194 # do-prod-ap-south-scanner-2604-4.do.binaryedge.ninja
-159.65.129.57 # do-prod-ap-south-scanner-2604-5.do.binaryedge.ninja
-159.65.134.221 # do-prod-ap-south-scanner-2604-7.do.binaryedge.ninja
-159.65.134.224 # do-prod-ap-south-scanner-2604-0.do.binaryedge.ninja
-159.65.142.168 # do-prod-ap-south-scanner-2604-6.do.binaryedge.ninja
-159.65.142.53 # do-prod-ap-south-scanner-2604-2.do.binaryedge.ninja
-159.65.18.158 # do-prod-eu-west-scanner-2604-19.do.binaryedge.ninja
-159.65.18.226 # do-prod-eu-west-scanner-2604-5.do.binaryedge.ninja
-159.65.18.237 # do-prod-eu-west-scanner-2604-7.do.binaryedge.ninja
-159.65.18.248 # do-prod-eu-west-scanner-2604-13.do.binaryedge.ninja
-159.65.18.59 # do-prod-eu-west-scanner-2604-0.do.binaryedge.ninja
-159.65.20.78 # do-prod-eu-west-scanner-2604-33.do.binaryedge.ninja
-159.65.22.1 # do-prod-eu-west-scanner-2604-12.do.binaryedge.ninja
-159.65.230.103 # do-prod-us-east-scanner-0106-36.do.binaryedge.ninja
-159.65.24.133 # do-prod-eu-west-scanner-2604-34.do.binaryedge.ninja
-159.65.24.240 # do-prod-eu-west-scanner-2304-11.do.binaryedge.ninja
-159.65.25.103 # jerry-se-do-eu-west-scanners-74.do.binaryedge.ninja
-159.65.26.112 # do-prod-eu-west-scanner-2304-0.do.binaryedge.ninja
-159.65.26.115 # do-prod-eu-west-scanner-2304-9.do.binaryedge.ninja
-159.65.26.116 # do-prod-eu-west-scanner-2604-19.do.binaryedge.ninja
-159.65.26.121 # do-prod-eu-west-scanner-2604-2.do.binaryedge.ninja
-159.65.26.13 # do-prod-eu-west-scanner-2604-18.do.binaryedge.ninja
-159.65.26.1 # do-prod-eu-west-scanner-2604-4.do.binaryedge.ninja
-159.65.26.46 # do-prod-eu-west-scanner-2604-8.do.binaryedge.ninja
-159.65.26.6 # do-prod-eu-west-scanner-2604-16.do.binaryedge.ninja
-159.65.26.70 # do-prod-eu-west-scanner-2604-10.do.binaryedge.ninja
-159.65.26.71 # do-prod-eu-west-scanner-2604-9.do.binaryedge.ninja
-159.65.28.170 # do-prod-eu-west-scanner-2604-28.do.binaryedge.ninja
-159.65.31.243 # do-prod-eu-west-scanner-2604-1.do.binaryedge.ninja
-159.65.4.234 # do-prod-ap-south-scanner-0106-8.do.binaryedge.ninja
-159.65.51.145 # jerry-se-do-eu-west-scanners-56.do.binaryedge.ninja
-159.65.58.66 # jerry-se-do-eu-west-scanners-36.do.binaryedge.ninja
-159.65.59.77 # jerry-se-do-eu-west-scanners-88.do.binaryedge.ninja
-159.65.60.100 # jerry-se-do-eu-west-scanners-26.do.binaryedge.ninja
-159.65.64.4 # do-prod-us-west-scanner-2604-7.do.binaryedge.ninja
-159.65.67.10 # do-prod-us-west-scanner-2304-0.do.binaryedge.ninja
-159.65.74.65 # do-prod-us-west-scanner-0106-0.do.binaryedge.ninja
-159.65.82.183 # jerry-se-do-eu-west-scanners-77.do.binaryedge.ninja
-159.65.86.32 # do-prod-eu-west-scanner-0106-1.do.binaryedge.ninja
-159.65.94.82 # do-prod-eu-west-scanner-0610-24.do.binaryedge.ninja
-159.65.97.205 # do-prod-us-west-scanner-2304-2.do.binaryedge.ninja
-159.65.98.161 # do-prod-us-west-scanner-2304-10.do.binaryedge.ninja
-159.89.113.87 # do-prod-us-north-scanner-0106-8.do.binaryedge.ninja
-159.89.113.97 # do-prod-us-north-scanner-0402-28.do.binaryedge.ninja
-159.89.114.193 # do-prod-us-north-scanner-0402-26.do.binaryedge.ninja
-159.89.118.61 # do-prod-us-north-scanner-0106-39.do.binaryedge.ninja
-159.89.121.111 # do-prod-us-north-scanner-0402-4.do.binaryedge.ninja
-159.89.124.210 # do-prod-us-north-scanner-0106-33.do.binaryedge.ninja
-159.89.124.38 # do-prod-us-north-scanner-0402-8.do.binaryedge.ninja
-159.89.126.171 # do-prod-us-north-scanner-0402-15.do.binaryedge.ninja
-159.89.126.220 # do-prod-us-north-scanner-0402-18.do.binaryedge.ninja
-159.89.131.119 # do-prod-us-west-scanner-2604-5.do.binaryedge.ninja
-159.89.131.17 # do-prod-us-west-scanner-2604-0.do.binaryedge.ninja
-159.89.132.91 # do-prod-us-west-scanner-0106-7.do.binaryedge.ninja
-159.89.134.17 # do-prod-us-west-scanner-2604-2.do.binaryedge.ninja
-159.89.137.18 # do-prod-us-west-scanner-2304-13.do.binaryedge.ninja
-159.89.155.245 # do-prod-us-west-scanner-2604-4.do.binaryedge.ninja
-159.89.157.254 # do-prod-us-west-scanner-2604-1.do.binaryedge.ninja
-159.89.159.85 # do-prod-us-west-scanner-2604-8.do.binaryedge.ninja
-159.89.161.68 # do-prod-ap-central-scanner-0610-4.do.binaryedge.ninja
-159.89.164.129 # do-prod-ap-central-scanner-2604-5.do.binaryedge.ninja
-159.89.237.131 # do-prod-us-east-scanner-0402-5.do.binaryedge.ninja
-159.89.53.247 # do-prod-us-east-scanner-2604-33.do.binaryedge.ninja
-159.89.88.209 # do-prod-us-east-scanner-0402-26.do.binaryedge.ninja
-161.35.108.76 # do-prod-us-east-scanner-0106-4.do.binaryedge.ninja
-161.35.111.131 # do-prod-us-east-scanner-0106-13.do.binaryedge.ninja
-161.35.122.26 # do-prod-us-east-scanner-2604-5.do.binaryedge.ninja
-161.35.126.184 # do-prod-us-east-scanner-0106-25.do.binaryedge.ninja
-161.35.5.101 # do-prod-us-east-scanner-0106-24.do.binaryedge.ninja
-161.35.55.104 # do-prod-us-east-scanner-0106-30.do.binaryedge.ninja
-161.35.63.39 # do-prod-us-east-scanner-2604-4.do.binaryedge.ninja
-161.35.97.10 # do-prod-us-east-scanner-0106-2.do.binaryedge.ninja
-165.22.124.167 # do-prod-eu-west-scanner-0402-4.do.binaryedge.ninja
-165.22.125.167 # do-prod-eu-west-scanner-0610-26.do.binaryedge.ninja
-165.22.178.44 # do-prod-us-east-scanner-2604-2.do.binaryedge.ninja
-165.22.180.163 # do-prod-us-east-scanner-2604-9.do.binaryedge.ninja
-165.22.180.207 # do-prod-us-east-scanner-2604-11.do.binaryedge.ninja
-165.22.184.177 # do-prod-us-east-scanner-2604-1.do.binaryedge.ninja
-165.22.186.199 # do-prod-us-east-scanner-2604-16.do.binaryedge.ninja
-165.22.188.86 # do-prod-us-east-scanner-2604-6.do.binaryedge.ninja
-165.22.191.95 # do-prod-us-east-scanner-2604-19.do.binaryedge.ninja
-165.22.191.99 # do-prod-us-east-scanner-2604-0.do.binaryedge.ninja
-165.22.193.70 # do-prod-eu-central-scanner-0106-24.do.binaryedge.ninja
-165.22.196.119 # do-prod-eu-central-scanner-0610-1.do.binaryedge.ninja
-165.22.205.235 # do-prod-eu-central-scanner-0402-13.do.binaryedge.ninja
-165.22.207.148 # do-prod-eu-central-scanner-0106-4.do.binaryedge.ninja
-165.22.210.128 # do-prod-ap-central-scanner-0610-0.do.binaryedge.ninja
-165.22.210.128 # do-prod-ap-central-scanner-2604-0.do.binaryedge.ninja
-165.22.224.30 # do-prod-us-north-scanner-0106-35.do.binaryedge.ninja
-165.22.224.31 # do-prod-us-north-scanner-0106-32.do.binaryedge.ninja
-165.22.224.40 # do-prod-us-north-scanner-0106-26.do.binaryedge.ninja
-165.22.5.250 # do-prod-us-east-scanner-2604-8.do.binaryedge.ninja
-165.227.203.250 # do-prod-us-east-scanner-0402-12.do.binaryedge.ninja
-165.227.207.241 # do-prod-us-east-scanner-2304-12.do.binaryedge.ninja
-165.227.2.159 # do-prod-us-west-scanner-2604-12.do.binaryedge.ninja
-165.227.226.87 # do-prod-eu-west-scanner-2604-6.do.binaryedge.ninja
-165.227.227.61 # do-prod-eu-west-scanner-2604-2.do.binaryedge.ninja
-165.227.228.34 # do-prod-eu-west-scanner-2604-15.do.binaryedge.ninja
-165.227.230.141 # do-prod-eu-west-scanner-2604-15.do.binaryedge.ninja
-165.227.231.82 # do-prod-eu-west-scanner-2604-35.do.binaryedge.ninja
-165.227.232.35 # do-prod-eu-west-scanner-2304-4.do.binaryedge.ninja
-165.227.236.224 # do-prod-eu-west-scanner-2604-1.do.binaryedge.ninja
-165.227.238.223 # jerry-se-do-eu-west-scanners-78.do.binaryedge.ninja
-165.227.239.66 # do-prod-eu-west-scanner-2604-18.do.binaryedge.ninja
-165.227.26.105 # do-prod-us-west-scanner-2604-9.do.binaryedge.ninja
-165.227.32.110 # do-prod-us-north-scanner-0402-3.do.binaryedge.ninja
-165.227.32.20 # do-prod-us-north-scanner-0106-4.do.binaryedge.ninja
-165.227.34.156 # do-prod-us-north-scanner-0402-0.do.binaryedge.ninja
-165.227.36.192 # do-prod-us-north-scanner-2604-6.do.binaryedge.ninja
-165.227.41.68 # do-prod-us-north-scanner-0106-25.do.binaryedge.ninja
-165.227.43.166 # do-prod-us-north-scanner-0106-9.do.binaryedge.ninja
-165.227.44.149 # do-prod-us-north-scanner-0402-11.do.binaryedge.ninja
-165.227.45.173 # do-prod-us-north-scanner-0106-21.do.binaryedge.ninja
-165.227.45.3 # do-prod-us-north-scanner-0402-22.do.binaryedge.ninja
-165.227.47.29 # do-prod-us-north-scanner-0106-5.do.binaryedge.ninja
-165.227.50.14 # do-prod-us-west-scanner-2604-0.do.binaryedge.ninja
-165.227.51.21 # do-prod-us-west-scanner-2304-3.do.binaryedge.ninja
-165.227.57.82 # do-prod-us-west-scanner-2604-6.do.binaryedge.ninja
-165.227.84.52 # do-prod-us-east-scanner-0106-37.do.binaryedge.ninja
-165.227.88.131 # do-prod-us-east-scanner-0106-26.do.binaryedge.ninja
-167.172.133.55 # do-prod-us-east-scanner-2604-3.do.binaryedge.ninja
-167.172.151.39 # do-prod-us-east-scanner-2604-14.do.binaryedge.ninja
-167.172.158.102 # do-prod-us-east-scanner-0106-35.do.binaryedge.ninja
-167.172.212.80 # do-prod-us-west-scanner-0402-0.do.binaryedge.ninja
-167.172.220.44 # do-prod-us-west-scanner-0402-9.do.binaryedge.ninja
-167.172.32.170 # do-prod-eu-central-scanner-0610-24.do.binaryedge.ninja
-167.172.33.218 # do-prod-eu-central-scanner-2604-7.do.binaryedge.ninja
-167.172.33.222 # do-prod-eu-central-scanner-2604-13.do.binaryedge.ninja
-167.172.34.13 # do-prod-eu-central-scanner-2604-25.do.binaryedge.ninja
-167.172.34.185 # do-prod-eu-central-scanner-2604-22.do.binaryedge.ninja
-167.172.34.203 # do-prod-eu-central-scanner-2604-36.do.binaryedge.ninja
-167.172.34.20 # do-prod-eu-central-scanner-2604-0.do.binaryedge.ninja
-167.172.34.24 # do-prod-eu-central-scanner-2604-6.do.binaryedge.ninja
-167.172.34.253 # do-prod-eu-central-scanner-2304-7.do.binaryedge.ninja
-167.172.35.157 # do-prod-eu-central-scanner-0106-31.do.binaryedge.ninja
-167.172.35.175 # do-prod-eu-central-scanner-2604-15.do.binaryedge.ninja
-167.172.35.37 # do-prod-eu-central-scanner-2604-4.do.binaryedge.ninja
-167.172.35.44 # do-prod-eu-central-scanner-2604-14.do.binaryedge.ninja
-167.172.36.114 # do-prod-eu-central-scanner-2304-5.do.binaryedge.ninja
-167.172.36.115 # do-prod-eu-central-scanner-2304-12.do.binaryedge.ninja
-167.172.36.29 # do-prod-eu-central-scanner-2304-8.do.binaryedge.ninja
-167.172.38.161 # do-prod-eu-central-scanner-2304-3.do.binaryedge.ninja
-167.172.39.126 # do-prod-eu-central-scanner-0106-27.do.binaryedge.ninja
-167.172.39.33 # do-prod-eu-central-scanner-2604-1.do.binaryedge.ninja
-167.172.40.202 # do-prod-eu-central-scanner-2604-24.do.binaryedge.ninja
-167.172.40.240 # do-prod-eu-central-scanner-2604-4.do.binaryedge.ninja
-167.172.42.18 # do-prod-eu-central-scanner-0610-12.do.binaryedge.ninja
-167.172.42.209 # do-prod-eu-central-scanner-2604-28.do.binaryedge.ninja
-167.172.42.224 # do-prod-eu-central-scanner-2604-20.do.binaryedge.ninja
-167.172.42.255 # do-prod-eu-central-scanner-2604-1.do.binaryedge.ninja
-167.172.42.35 # do-prod-eu-central-scanner-2604-7.do.binaryedge.ninja
-167.172.42.74 # do-prod-eu-central-scanner-2604-26.do.binaryedge.ninja
-167.172.42.90 # do-prod-eu-central-scanner-2604-35.do.binaryedge.ninja
-167.172.43.117 # do-prod-eu-central-scanner-0106-26.do.binaryedge.ninja
-167.172.43.117 # do-prod-eu-central-scanner-0610-19.do.binaryedge.ninja
-167.172.43.127 # do-prod-eu-central-scanner-2604-12.do.binaryedge.ninja
-167.172.43.222 # do-prod-eu-central-scanner-2604-16.do.binaryedge.ninja
-167.172.43.82 # do-prod-eu-central-scanner-2604-18.do.binaryedge.ninja
-167.172.44.190 # do-prod-eu-central-scanner-2604-37.do.binaryedge.ninja
-167.172.44.239 # do-prod-eu-central-scanner-0106-1.do.binaryedge.ninja
-167.172.44.254 # do-prod-eu-central-scanner-2604-34.do.binaryedge.ninja
-167.172.44.60 # do-prod-eu-central-scanner-2604-19.do.binaryedge.ninja
-167.172.44.84 # do-prod-eu-central-scanner-2304-14.do.binaryedge.ninja
-167.172.46.71 # do-prod-eu-central-scanner-0106-2.do.binaryedge.ninja
-167.172.46.71 # do-prod-eu-central-scanner-0610-37.do.binaryedge.ninja
-167.172.47.146 # do-prod-eu-central-scanner-2604-3.do.binaryedge.ninja
-167.172.47.243 # do-prod-eu-central-scanner-0106-14.do.binaryedge.ninja
-167.172.47.243 # do-prod-eu-central-scanner-0402-22.do.binaryedge.ninja
-167.172.47.98 # do-prod-eu-central-scanner-2604-17.do.binaryedge.ninja
-167.172.48.101 # do-prod-eu-west-scanner-0402-21.do.binaryedge.ninja
-167.172.53.64 # do-prod-eu-west-scanner-0106-37.do.binaryedge.ninja
-167.172.54.168 # do-prod-eu-west-scanner-0610-20.do.binaryedge.ninja
-167.172.54.95 # do-prod-eu-west-scanner-0610-16.do.binaryedge.ninja
-167.172.58.67 # do-prod-eu-west-scanner-0610-1.do.binaryedge.ninja
-167.172.63.56 # do-prod-eu-west-scanner-0402-1.do.binaryedge.ninja
-167.71.11.117 # do-prod-eu-central-scanner-0610-33.do.binaryedge.ninja
-167.71.14.185 # do-prod-eu-central-scanner-0610-0.do.binaryedge.ninja
-167.71.144.4 # do-prod-us-west-scanner-0106-3.do.binaryedge.ninja
-167.71.150.200 # do-prod-us-west-scanner-0402-2.do.binaryedge.ninja
-167.71.199.239 # do-prod-ap-south-scanner-0106-6.do.binaryedge.ninja
-167.71.203.123 # do-prod-ap-south-scanner-0106-5.do.binaryedge.ninja
-167.71.210.72 # do-prod-ap-south-scanner-0106-7.do.binaryedge.ninja
-167.71.212.202 # do-prod-ap-south-scanner-0106-2.do.binaryedge.ninja
-167.71.216.86 # do-prod-ap-south-scanner-0106-3.do.binaryedge.ninja
-167.71.223.11 # do-prod-ap-south-scanner-0106-0.do.binaryedge.ninja
-167.71.4.187 # do-prod-eu-central-scanner-0106-35.do.binaryedge.ninja
-167.71.4.250 # do-prod-eu-central-scanner-0610-18.do.binaryedge.ninja
-167.71.4.99 # do-prod-eu-central-scanner-0106-20.do.binaryedge.ninja
-167.71.64.192 # do-prod-eu-central-scanner-0610-15.do.binaryedge.ninja
-167.71.66.171 # do-prod-eu-central-scanner-0402-11.do.binaryedge.ninja
-167.71.66.96 # do-prod-eu-central-scanner-0106-9.do.binaryedge.ninja
-167.71.69.246 # do-prod-eu-central-scanner-0106-32.do.binaryedge.ninja
-167.71.70.100 # do-prod-eu-central-scanner-0106-25.do.binaryedge.ninja
-167.71.70.245 # do-prod-eu-central-scanner-0106-12.do.binaryedge.ninja
-167.71.70.38 # do-prod-eu-central-scanner-0106-16.do.binaryedge.ninja
-167.71.71.186 # do-prod-eu-central-scanner-2604-5.do.binaryedge.ninja
-167.71.71.251 # do-prod-eu-central-scanner-0106-21.do.binaryedge.ninja
-167.71.7.175 # do-prod-eu-central-scanner-0106-6.do.binaryedge.ninja
-167.71.73.197 # do-prod-eu-central-scanner-0106-15.do.binaryedge.ninja
-167.71.75.62 # do-prod-eu-central-scanner-0106-34.do.binaryedge.ninja
-167.71.79.214 # do-prod-eu-central-scanner-0106-37.do.binaryedge.ninja
-167.71.79.245 # do-prod-eu-central-scanner-0106-39.do.binaryedge.ninja
-167.71.79.41 # do-prod-eu-central-scanner-0106-10.do.binaryedge.ninja
-167.99.103.188 # do-prod-us-west-scanner-0106-2.do.binaryedge.ninja
-167.99.106.242 # do-prod-us-west-scanner-2304-6.do.binaryedge.ninja
-167.99.108.222 # do-prod-us-west-scanner-0402-6.do.binaryedge.ninja
-167.99.108.74 # do-prod-us-west-scanner-0106-1.do.binaryedge.ninja
-167.99.109.178 # do-prod-us-west-scanner-0402-5.do.binaryedge.ninja
-167.99.109.223 # do-prod-us-west-scanner-0106-6.do.binaryedge.ninja
-167.99.109.99 # do-prod-us-west-scanner-0402-4.do.binaryedge.ninja
-167.99.110.125 # do-prod-us-west-scanner-2304-11.do.binaryedge.ninja
-167.99.110.39 # do-prod-us-west-scanner-2304-1.do.binaryedge.ninja
-167.99.110.51 # do-prod-us-west-scanner-2304-14.do.binaryedge.ninja
-167.99.110.67 # do-prod-us-west-scanner-2304-7.do.binaryedge.ninja
-167.99.110.81 # do-prod-us-west-scanner-2304-9.do.binaryedge.ninja
-167.99.157.136 # do-prod-us-east-scanner-0106-33.do.binaryedge.ninja
-167.99.165.11 # do-prod-us-west-scanner-2604-19.do.binaryedge.ninja
-167.99.165.15 # do-prod-us-west-scanner-2604-2.do.binaryedge.ninja
-167.99.165.18 # do-prod-us-west-scanner-2604-5.do.binaryedge.ninja
-167.99.165.3 # do-prod-us-west-scanner-2604-10.do.binaryedge.ninja
-167.99.165.5 # do-prod-us-west-scanner-2604-7.do.binaryedge.ninja
-167.99.169.127 # do-prod-us-west-scanner-2604-16.do.binaryedge.ninja
-167.99.169.163 # do-prod-us-west-scanner-2604-6.do.binaryedge.ninja
-167.99.169.235 # do-prod-us-west-scanner-2604-17.do.binaryedge.ninja
-167.99.169.236 # do-prod-us-west-scanner-2604-14.do.binaryedge.ninja
-167.99.169.240 # do-prod-us-west-scanner-2604-15.do.binaryedge.ninja
-167.99.180.119 # do-prod-us-north-scanner-2304-11.do.binaryedge.ninja
-167.99.180.251 # do-prod-us-north-scanner-0106-27.do.binaryedge.ninja
-167.99.180.26 # do-prod-us-north-scanner-0106-36.do.binaryedge.ninja
-167.99.183.120 # do-prod-us-north-scanner-2604-16.do.binaryedge.ninja
-167.99.185.217 # do-prod-us-north-scanner-2604-37.do.binaryedge.ninja
-167.99.186.43 # do-prod-us-north-scanner-2604-11.do.binaryedge.ninja
-167.99.186.47 # do-prod-us-north-scanner-2604-22.do.binaryedge.ninja
-167.99.187.73 # do-prod-us-north-scanner-0402-29.do.binaryedge.ninja
-167.99.189.181 # do-prod-us-north-scanner-0402-10.do.binaryedge.ninja
-167.99.190.197 # do-prod-us-north-scanner-2604-10.do.binaryedge.ninja
-167.99.191.143 # do-prod-us-north-scanner-0402-7.do.binaryedge.ninja
-167.99.194.147 # do-prod-eu-west-scanner-0402-29.do.binaryedge.ninja
-167.99.200.172 # do-prod-eu-west-scanner-0106-32.do.binaryedge.ninja
-167.99.204.151 # jerry-se-do-eu-west-scanners-89.do.binaryedge.ninja
-167.99.211.160 # do-prod-eu-central-scanner-2604-5.do.binaryedge.ninja
-167.99.213.2 # do-prod-eu-central-scanner-2604-8.do.binaryedge.ninja
-167.99.237.222 # do-prod-us-east-scanner-2304-0.do.binaryedge.ninja
-167.99.32.27 # do-prod-eu-central-scanner-2604-39.do.binaryedge.ninja
-167.99.45.221 # do-prod-eu-central-scanner-2604-16.do.binaryedge.ninja
-167.99.83.42 # jerry-se-do-eu-west-scanners-75.do.binaryedge.ninja
-167.99.88.151 # jerry-se-do-eu-west-scanners-84.do.binaryedge.ninja
-167.99.89.163 # do-prod-eu-west-scanner-0402-0.do.binaryedge.ninja
-167.99.96.18 # do-prod-us-west-scanner-2604-1.do.binaryedge.ninja
-167.99.98.124 # do-prod-us-west-scanner-0402-7.do.binaryedge.ninja
-174.138.6.128 # do-prod-eu-central-scanner-2304-4.do.binaryedge.ninja
-174.138.8.31 # do-prod-eu-central-scanner-2604-33.do.binaryedge.ninja
-178.128.119.35 # do-prod-ap-south-scanner-0402-4.do.binaryedge.ninja
-178.128.151.140 # do-prod-us-east-scanner-0106-0.do.binaryedge.ninja
-178.128.151.63 # do-prod-us-east-scanner-0106-10.do.binaryedge.ninja
-178.128.156.230 # do-prod-us-east-scanner-0402-27.do.binaryedge.ninja
-178.128.159.13 # do-prod-us-east-scanner-0402-25.do.binaryedge.ninja
-178.128.160.55 # jerry-se-do-eu-west-scanners-9.do.binaryedge.ninja
-178.128.171.59 # do-prod-eu-west-scanner-0610-35.do.binaryedge.ninja
-178.128.173.147 # do-prod-eu-west-scanner-0610-22.do.binaryedge.ninja
-178.128.228.15 # do-prod-us-north-scanner-2604-8.do.binaryedge.ninja
-178.128.231.137 # do-prod-us-north-scanner-0402-19.do.binaryedge.ninja
-178.128.236.243 # do-prod-us-north-scanner-2604-32.do.binaryedge.ninja
-178.128.239.217 # do-prod-us-north-scanner-2604-19.do.binaryedge.ninja
-178.128.241.137 # do-prod-eu-central-scanner-0610-8.do.binaryedge.ninja
-178.128.247.152 # do-prod-eu-central-scanner-0610-29.do.binaryedge.ninja
-178.128.247.152 # do-prod-eu-central-scanner-2604-9.do.binaryedge.ninja
-178.128.249.138 # do-prod-eu-central-scanner-2604-9.do.binaryedge.ninja
-178.128.34.137 # do-prod-eu-west-scanner-0610-15.do.binaryedge.ninja
-178.128.38.105 # jerry-se-do-eu-west-scanners-67.do.binaryedge.ninja
-178.128.39.65 # jerry-se-do-eu-west-scanners-15.do.binaryedge.ninja
-178.128.41.212 # do-prod-eu-west-scanner-0106-20.do.binaryedge.ninja
-178.128.41.212 # do-prod-eu-west-scanner-0610-36.do.binaryedge.ninja
-178.128.46.127 # do-prod-eu-west-scanner-0402-25.do.binaryedge.ninja
-178.128.54.208 # do-prod-ap-south-scanner-0402-6.do.binaryedge.ninja
-178.128.62.15 # do-prod-ap-south-scanner-0402-2.do.binaryedge.ninja
-178.62.106.58 # jerry-se-do-eu-west-scanners-58.do.binaryedge.ninja
-178.62.107.137 # do-prod-eu-west-scanner-0610-17.do.binaryedge.ninja
-178.62.11.161 # do-prod-eu-west-scanner-2604-17.do.binaryedge.ninja
-178.62.112.19 # do-prod-eu-west-scanner-0610-32.do.binaryedge.ninja
-178.62.115.246 # do-prod-eu-west-scanner-0610-23.do.binaryedge.ninja
-178.62.116.47 # do-prod-eu-west-scanner-0610-12.do.binaryedge.ninja
-178.62.119.15 # do-prod-eu-west-scanner-0610-7.do.binaryedge.ninja
-178.62.120.209 # do-prod-eu-west-scanner-0610-0.do.binaryedge.ninja
-178.62.127.114 # do-prod-eu-west-scanner-0402-27.do.binaryedge.ninja
-178.62.127.248 # do-prod-eu-west-scanner-0402-24.do.binaryedge.ninja
-178.62.15.29 # do-prod-eu-west-scanner-0402-7.do.binaryedge.ninja
-178.62.196.109 # do-prod-eu-central-scanner-2604-32.do.binaryedge.ninja
-178.62.202.154 # do-prod-eu-central-scanner-2304-1.do.binaryedge.ninja
-178.62.20.4 # do-prod-eu-west-scanner-2604-14.do.binaryedge.ninja
-178.62.207.105 # do-prod-eu-central-scanner-0402-6.do.binaryedge.ninja
-178.62.216.232 # do-prod-eu-central-scanner-0610-30.do.binaryedge.ninja
-178.62.220.127 # do-prod-eu-central-scanner-2604-3.do.binaryedge.ninja
-178.62.221.172 # do-prod-eu-central-scanner-2604-21.do.binaryedge.ninja
-178.62.223.33 # do-prod-eu-central-scanner-0610-6.do.binaryedge.ninja
-178.62.23.146 # jerry-se-do-eu-west-scanners-85.do.binaryedge.ninja
-178.62.233.238 # do-prod-eu-central-scanner-2604-14.do.binaryedge.ninja
-178.62.236.71 # do-prod-eu-central-scanner-0610-27.do.binaryedge.ninja
-178.62.238.37 # do-prod-eu-central-scanner-0610-28.do.binaryedge.ninja
-178.62.241.30 # do-prod-eu-central-scanner-0610-9.do.binaryedge.ninja
-178.62.30.161 # jerry-se-do-eu-west-scanners-16.do.binaryedge.ninja
-178.62.32.211 # jerry-se-do-eu-west-scanners-80.do.binaryedge.ninja
-178.62.36.84 # do-prod-eu-west-scanner-0610-39.do.binaryedge.ninja
-178.62.37.146 # jerry-se-do-eu-west-scanners-72.do.binaryedge.ninja
-178.62.37.90 # do-prod-eu-west-scanner-0106-18.do.binaryedge.ninja
-178.62.44.13 # do-prod-eu-west-scanner-2604-24.do.binaryedge.ninja
-178.62.45.138 # do-prod-eu-west-scanner-2604-21.do.binaryedge.ninja
-178.62.45.196 # jerry-se-do-eu-west-scanners-28.do.binaryedge.ninja
-178.62.47.63 # do-prod-eu-west-scanner-0106-7.do.binaryedge.ninja
-178.62.49.9 # jerry-se-do-eu-west-scanners-49.do.binaryedge.ninja
-178.62.50.28 # do-prod-eu-west-scanner-0610-33.do.binaryedge.ninja
-178.62.66.24 # do-prod-eu-west-scanner-2604-6.do.binaryedge.ninja
-178.62.68.153 # do-prod-eu-west-scanner-0106-5.do.binaryedge.ninja
-178.62.69.110 # do-prod-eu-west-scanner-0106-9.do.binaryedge.ninja
-178.62.69.165 # jerry-se-do-eu-west-scanners-3.do.binaryedge.ninja
-178.62.77.237 # do-prod-eu-west-scanner-0610-8.do.binaryedge.ninja
-178.62.8.174 # do-prod-eu-west-scanner-0610-6.do.binaryedge.ninja
-178.62.82.171 # jerry-se-do-eu-west-scanners-71.do.binaryedge.ninja
-178.62.83.118 # do-prod-eu-west-scanner-0106-31.do.binaryedge.ninja
-178.62.83.118 # do-prod-eu-west-scanner-0402-13.do.binaryedge.ninja
-178.62.84.99 # do-prod-eu-west-scanner-2604-14.do.binaryedge.ninja
-178.62.85.35 # do-prod-eu-west-scanner-0402-16.do.binaryedge.ninja
-178.62.92.48 # do-prod-eu-west-scanner-2604-27.do.binaryedge.ninja
-188.166.103.91 # do-prod-eu-central-scanner-2304-11.do.binaryedge.ninja
-188.166.113.86 # do-prod-eu-central-scanner-2604-27.do.binaryedge.ninja
-188.166.122.29 # do-prod-eu-central-scanner-2604-10.do.binaryedge.ninja
-188.166.123.9 # do-prod-eu-central-scanner-2304-10.do.binaryedge.ninja
-188.166.146.122 # jerry-se-do-eu-west-scanners-60.do.binaryedge.ninja
-188.166.146.235 # do-prod-eu-west-scanner-2304-7.do.binaryedge.ninja
-188.166.154.56 # do-prod-eu-west-scanner-2604-23.do.binaryedge.ninja
-188.166.16.211 # do-prod-eu-central-scanner-0402-3.do.binaryedge.ninja
-188.166.16.36 # do-prod-eu-central-scanner-0402-7.do.binaryedge.ninja
-188.166.168.207 # do-prod-eu-west-scanner-2604-5.do.binaryedge.ninja
-188.166.168.236 # do-prod-eu-west-scanner-2304-10.do.binaryedge.ninja
-188.166.169.174 # jerry-se-do-eu-west-scanners-1.do.binaryedge.ninja
-188.166.174.98 # do-prod-eu-west-scanner-2604-26.do.binaryedge.ninja
-188.166.175.162 # do-prod-eu-west-scanner-2604-31.do.binaryedge.ninja
-188.166.18.230 # do-prod-eu-central-scanner-0610-7.do.binaryedge.ninja
-188.166.18.245 # do-prod-eu-central-scanner-0402-23.do.binaryedge.ninja
-188.166.30.192 # do-prod-eu-central-scanner-0402-24.do.binaryedge.ninja
-188.166.32.94 # do-prod-eu-central-scanner-0402-0.do.binaryedge.ninja
-188.166.35.206 # do-prod-eu-central-scanner-0610-5.do.binaryedge.ninja
-188.166.3.89 # do-prod-eu-central-scanner-0402-29.do.binaryedge.ninja
-188.166.41.205 # do-prod-eu-central-scanner-0610-31.do.binaryedge.ninja
-188.166.41.205 # do-prod-eu-central-scanner-2604-38.do.binaryedge.ninja
-188.166.49.90 # do-prod-eu-central-scanner-0402-27.do.binaryedge.ninja
-188.166.50.179 # do-prod-eu-central-scanner-0402-17.do.binaryedge.ninja
-188.166.51.197 # do-prod-eu-central-scanner-0402-21.do.binaryedge.ninja
-188.166.51.23 # do-prod-eu-central-scanner-0402-28.do.binaryedge.ninja
-188.166.51.243 # do-prod-eu-central-scanner-0402-10.do.binaryedge.ninja
-188.166.90.157 # do-prod-eu-central-scanner-0610-36.do.binaryedge.ninja
-188.166.91.184 # do-prod-eu-central-scanner-0610-34.do.binaryedge.ninja
-188.166.91.184 # do-prod-eu-central-scanner-2604-30.do.binaryedge.ninja
-188.166.91.210 # do-prod-eu-central-scanner-0610-35.do.binaryedge.ninja
-188.166.91.210 # do-prod-eu-central-scanner-2604-18.do.binaryedge.ninja
-188.166.91.223 # do-prod-eu-central-scanner-0610-23.do.binaryedge.ninja
-188.166.92.122 # do-prod-eu-central-scanner-2604-0.do.binaryedge.ninja
-192.241.138.64 # do-prod-us-east-scanner-0402-13.do.binaryedge.ninja
-192.241.142.18 # do-prod-us-east-scanner-0106-23.do.binaryedge.ninja
-192.241.147.144 # do-prod-us-east-scanner-0106-22.do.binaryedge.ninja
-192.34.59.95 # do-prod-us-east-scanner-0106-21.do.binaryedge.ninja
-198.211.107.35 # do-prod-us-east-scanner-0402-28.do.binaryedge.ninja
-198.211.112.100 # do-prod-us-east-scanner-0106-12.do.binaryedge.ninja
-198.211.113.71 # do-prod-us-east-scanner-0402-22.do.binaryedge.ninja
-198.211.96.65 # do-prod-us-east-scanner-0106-1.do.binaryedge.ninja
-204.48.21.103 # do-prod-us-east-scanner-0402-16.do.binaryedge.ninja
-204.48.26.117 # do-prod-us-east-scanner-0106-27.do.binaryedge.ninja
-206.189.106.14 # do-prod-eu-central-scanner-2604-8.do.binaryedge.ninja
-206.189.115.6 # jerry-se-do-eu-west-scanners-39.do.binaryedge.ninja
-206.189.116.201 # jerry-se-do-eu-west-scanners-54.do.binaryedge.ninja
-206.189.119.3 # jerry-se-do-eu-west-scanners-23.do.binaryedge.ninja
-206.189.120.91 # jerry-se-do-eu-west-scanners-13.do.binaryedge.ninja
-206.189.123.99 # jerry-se-do-eu-west-scanners-55.do.binaryedge.ninja
-206.189.125.34 # jerry-se-do-eu-west-scanners-40.do.binaryedge.ninja
-206.189.126.160 # jerry-se-do-eu-west-scanners-44.do.binaryedge.ninja
-206.189.126.87 # jerry-se-do-eu-west-scanners-18.do.binaryedge.ninja
-206.189.133.29 # do-prod-ap-central-scanner-0106-4.do.binaryedge.ninja
-206.189.142.201 # do-prod-ap-central-scanner-2604-9.do.binaryedge.ninja
-206.189.178.110 # do-prod-us-east-scanner-0106-32.do.binaryedge.ninja
-206.189.180.18 # do-prod-us-east-scanner-0106-5.do.binaryedge.ninja
-206.189.18.114 # do-prod-eu-west-scanner-0402-5.do.binaryedge.ninja
-206.189.182.14 # do-prod-us-east-scanner-2604-5.do.binaryedge.ninja
-206.189.188.210 # do-prod-us-east-scanner-2604-24.do.binaryedge.ninja
-206.189.20.118 # jerry-se-do-eu-west-scanners-4.do.binaryedge.ninja
-206.189.20.141 # jerry-se-do-eu-west-scanners-42.do.binaryedge.ninja
-206.189.202.223 # do-prod-us-east-scanner-2604-12.do.binaryedge.ninja
-206.189.237.114 # do-prod-us-east-scanner-0106-3.do.binaryedge.ninja
-206.189.26.189 # do-prod-eu-west-scanner-0610-34.do.binaryedge.ninja
-206.189.29.232 # jerry-se-do-eu-west-scanners-51.do.binaryedge.ninja
-206.189.5.79 # do-prod-eu-central-scanner-2604-2.do.binaryedge.ninja
-206.81.12.83 # do-prod-us-east-scanner-2304-8.do.binaryedge.ninja
-206.81.4.83 # do-prod-us-east-scanner-0106-9.do.binaryedge.ninja
-208.68.38.52 # do-prod-us-east-scanner-0402-14.do.binaryedge.ninja
-209.97.128.132 # jerry-se-do-eu-west-scanners-20.do.binaryedge.ninja
-209.97.131.88 # jerry-se-do-eu-west-scanners-69.do.binaryedge.ninja
-209.97.133.112 # jerry-se-do-eu-west-scanners-43.do.binaryedge.ninja
-209.97.135.185 # jerry-se-do-eu-west-scanners-59.do.binaryedge.ninja
-209.97.136.164 # jerry-se-do-eu-west-scanners-52.do.binaryedge.ninja
-209.97.137.14 # do-prod-eu-west-scanner-0106-39.do.binaryedge.ninja
-209.97.137.198 # jerry-se-do-eu-west-scanners-79.do.binaryedge.ninja
-209.97.141.11 # jerry-se-do-eu-west-scanners-61.do.binaryedge.ninja
-209.97.143.3 # jerry-se-do-eu-west-scanners-70.do.binaryedge.ninja
-209.97.172.97 # do-prod-ap-south-scanner-0610-0.do.binaryedge.ninja
-209.97.179.248 # do-prod-eu-west-scanner-0402-2.do.binaryedge.ninja
-209.97.187.124 # do-prod-eu-west-scanner-0610-27.do.binaryedge.ninja
-
-# Reference: https://twitter.com/bad_packets/status/1145859072979169280 (# Net Systems Research)
-
-168.1.128.32
-168.1.128.33
-168.1.128.34
-168.1.128.35
-168.1.128.36
-168.1.128.37
-168.1.128.38
-168.1.128.39
-168.1.128.40
-168.1.128.41
-168.1.128.42
-168.1.128.43
-168.1.128.44
-168.1.128.45
-168.1.128.46
-168.1.128.47
-168.1.128.48
-168.1.128.49
-168.1.128.50
-168.1.128.51
-168.1.128.52
-168.1.128.53
-168.1.128.54
-168.1.128.55
-168.1.128.56
-168.1.128.57
-168.1.128.58
-168.1.128.59
-168.1.128.60
-168.1.128.61
-168.1.128.62
-168.1.128.63
-168.1.128.64
-168.1.128.65
-168.1.128.66
-168.1.128.67
-168.1.128.68
-168.1.128.69
-168.1.128.70
-168.1.128.71
-168.1.128.72
-168.1.128.73
-168.1.128.74
-168.1.128.75
-168.1.128.76
-168.1.128.77
-168.1.128.78
-168.1.128.79
-168.1.128.80
-168.1.128.81
-168.1.128.82
-168.1.128.83
-168.1.128.84
-168.1.128.85
-168.1.128.86
-168.1.128.87
-168.1.128.88
-168.1.128.89
-168.1.128.90
-168.1.128.91
-168.1.128.92
-168.1.128.93
-168.1.128.94
-168.1.128.95
-169.45.161.160
-169.45.161.161
-169.45.161.162
-169.45.161.163
-169.45.161.164
-169.45.161.165
-169.45.161.166
-169.45.161.167
-169.45.161.168
-169.45.161.169
-169.45.161.170
-169.45.161.171
-169.45.161.172
-169.45.161.173
-169.45.161.174
-169.45.161.175
-169.45.161.176
-169.45.161.177
-169.45.161.178
-169.45.161.179
-169.45.161.180
-169.45.161.181
-169.45.161.182
-169.45.161.183
-169.45.161.184
-169.45.161.185
-169.45.161.186
-169.45.161.187
-169.45.161.188
-169.45.161.189
-169.45.161.190
-169.45.161.191
-169.54.233.112
-169.54.233.113
-169.54.233.114
-169.54.233.115
-169.54.233.116
-169.54.233.117
-169.54.233.118
-169.54.233.119
-169.54.233.120
-169.54.233.121
-169.54.233.122
-169.54.233.123
-169.54.233.124
-169.54.233.125
-169.54.233.126
-169.54.233.127
-169.54.244.64
-169.54.244.65
-169.54.244.66
-169.54.244.67
-169.54.244.68
-169.54.244.69
-169.54.244.70
-169.54.244.71
-169.54.244.72
-169.54.244.73
-169.54.244.74
-169.54.244.75
-169.54.244.76
-169.54.244.77
-169.54.244.78
-169.54.244.79
-169.54.244.80
-169.54.244.81
-169.54.244.82
-169.54.244.83
-169.54.244.84
-169.54.244.85
-169.54.244.86
-169.54.244.87
-169.54.244.88
-169.54.244.89
-169.54.244.90
-169.54.244.91
-169.54.244.92
-169.54.244.93
-169.54.244.94
-169.54.244.95
-169.53.184.0
-169.53.184.1
-169.53.184.2
-169.53.184.3
-169.53.184.4
-169.53.184.5
-169.53.184.6
-169.53.184.7
-169.53.184.8
-169.53.184.9
-169.53.184.10
-169.53.184.11
-169.53.184.12
-169.53.184.13
-169.53.184.14
-169.53.184.15
-169.53.184.16
-169.53.184.17
-169.53.184.18
-169.53.184.19
-169.53.184.20
-169.53.184.21
-169.53.184.22
-169.53.184.23
-169.53.184.24
-169.53.184.25
-169.53.184.26
-169.53.184.27
-169.53.184.28
-169.53.184.29
-169.53.184.30
-169.53.184.31
-158.85.81.112
-158.85.81.113
-158.85.81.114
-158.85.81.115
-158.85.81.116
-158.85.81.117
-158.85.81.118
-158.85.81.119
-158.85.81.120
-158.85.81.121
-158.85.81.122
-158.85.81.123
-158.85.81.124
-158.85.81.125
-158.85.81.126
-158.85.81.127
-196.52.43.0
-196.52.43.1
-196.52.43.2
-196.52.43.3
-196.52.43.4
-196.52.43.5
-196.52.43.6
-196.52.43.7
-196.52.43.8
-196.52.43.9
-196.52.43.10
-196.52.43.11
-196.52.43.12
-196.52.43.13
-196.52.43.14
-196.52.43.15
-196.52.43.16
-196.52.43.17
-196.52.43.18
-196.52.43.19
-196.52.43.20
-196.52.43.21
-196.52.43.22
-196.52.43.23
-196.52.43.24
-196.52.43.25
-196.52.43.26
-196.52.43.27
-196.52.43.28
-196.52.43.29
-196.52.43.30
-196.52.43.31
-196.52.43.32
-196.52.43.33
-196.52.43.34
-196.52.43.35
-196.52.43.36
-196.52.43.37
-196.52.43.38
-196.52.43.39
-196.52.43.40
-196.52.43.41
-196.52.43.42
-196.52.43.43
-196.52.43.44
-196.52.43.45
-196.52.43.46
-196.52.43.47
-196.52.43.48
-196.52.43.49
-196.52.43.50
-196.52.43.51
-196.52.43.52
-196.52.43.53
-196.52.43.54
-196.52.43.55
-196.52.43.56
-196.52.43.57
-196.52.43.58
-196.52.43.59
-196.52.43.60
-196.52.43.61
-196.52.43.62
-196.52.43.63
-196.52.43.64
-196.52.43.65
-196.52.43.66
-196.52.43.67
-196.52.43.68
-196.52.43.69
-196.52.43.70
-196.52.43.71
-196.52.43.72
-196.52.43.73
-196.52.43.74
-196.52.43.75
-196.52.43.76
-196.52.43.77
-196.52.43.78
-196.52.43.79
-196.52.43.80
-196.52.43.81
-196.52.43.82
-196.52.43.83
-196.52.43.84
-196.52.43.85
-196.52.43.86
-196.52.43.87
-196.52.43.88
-196.52.43.89
-196.52.43.90
-196.52.43.91
-196.52.43.92
-196.52.43.93
-196.52.43.94
-196.52.43.95
-196.52.43.96
-196.52.43.97
-196.52.43.98
-196.52.43.99
-196.52.43.100
-196.52.43.101
-196.52.43.102
-196.52.43.103
-196.52.43.104
-196.52.43.105
-196.52.43.106
-196.52.43.107
-196.52.43.108
-196.52.43.109
-196.52.43.110
-196.52.43.111
-196.52.43.112
-196.52.43.113
-196.52.43.114
-196.52.43.115
-196.52.43.116
-196.52.43.117
-196.52.43.118
-196.52.43.119
-196.52.43.120
-196.52.43.121
-196.52.43.122
-196.52.43.123
-196.52.43.124
-196.52.43.125
-196.52.43.126
-196.52.43.127
-196.52.43.128
-196.52.43.129
-196.52.43.130
-196.52.43.131
-196.52.43.132
-196.52.43.133
-196.52.43.134
-196.52.43.135
-196.52.43.136
-196.52.43.137
-196.52.43.138
-196.52.43.139
-196.52.43.140
-196.52.43.141
-196.52.43.142
-196.52.43.143
-196.52.43.144
-196.52.43.145
-196.52.43.146
-196.52.43.147
-196.52.43.148
-196.52.43.149
-196.52.43.150
-196.52.43.151
-196.52.43.152
-196.52.43.153
-196.52.43.154
-196.52.43.155
-196.52.43.156
-196.52.43.157
-196.52.43.158
-196.52.43.159
-196.52.43.160
-196.52.43.161
-196.52.43.162
-196.52.43.163
-196.52.43.164
-196.52.43.165
-196.52.43.166
-196.52.43.167
-196.52.43.168
-196.52.43.169
-196.52.43.170
-196.52.43.171
-196.52.43.172
-196.52.43.173
-196.52.43.174
-196.52.43.175
-196.52.43.176
-196.52.43.177
-196.52.43.178
-196.52.43.179
-196.52.43.180
-196.52.43.181
-196.52.43.182
-196.52.43.183
-196.52.43.184
-196.52.43.185
-196.52.43.186
-196.52.43.187
-196.52.43.188
-196.52.43.189
-196.52.43.190
-196.52.43.191
-196.52.43.192
-196.52.43.193
-196.52.43.194
-196.52.43.195
-196.52.43.196
-196.52.43.197
-196.52.43.198
-196.52.43.199
-196.52.43.200
-196.52.43.201
-196.52.43.202
-196.52.43.203
-196.52.43.204
-196.52.43.205
-196.52.43.206
-196.52.43.207
-196.52.43.208
-196.52.43.209
-196.52.43.210
-196.52.43.211
-196.52.43.212
-196.52.43.213
-196.52.43.214
-196.52.43.215
-196.52.43.216
-196.52.43.217
-196.52.43.218
-196.52.43.219
-196.52.43.220
-196.52.43.221
-196.52.43.222
-196.52.43.223
-196.52.43.224
-196.52.43.225
-196.52.43.226
-196.52.43.227
-196.52.43.228
-196.52.43.229
-196.52.43.230
-196.52.43.231
-196.52.43.232
-196.52.43.233
-196.52.43.234
-196.52.43.235
-196.52.43.236
-196.52.43.237
-196.52.43.238
-196.52.43.239
-196.52.43.240
-196.52.43.241
-196.52.43.242
-196.52.43.243
-196.52.43.244
-196.52.43.245
-196.52.43.246
-196.52.43.247
-196.52.43.248
-196.52.43.249
-196.52.43.250
-196.52.43.251
-196.52.43.252
-196.52.43.253
-196.52.43.254
-196.52.43.255
-92.118.160.0
-92.118.160.1 # netsystemsresearch.com
-92.118.160.2
-92.118.160.3
-92.118.160.4
-92.118.160.5 # netsystemsresearch.com
-92.118.160.6
-92.118.160.7
-92.118.160.8
-92.118.160.9 # netsystemsresearch.com
-92.118.160.10
-92.118.160.11
-92.118.160.12
-92.118.160.13 # netsystemsresearch.com
-92.118.160.14
-92.118.160.15
-92.118.160.16
-92.118.160.17 # netsystemsresearch.com
-92.118.160.18
-92.118.160.19
-92.118.160.20
-92.118.160.21
-92.118.160.22
-92.118.160.23
-92.118.160.24
-92.118.160.25 # netsystemsresearch.com
-92.118.160.26
-92.118.160.27
-92.118.160.28
-92.118.160.29 # netsystemsresearch.com
-92.118.160.30
-92.118.160.31
-92.118.160.32
-92.118.160.33 # netsystemsresearch.com
-92.118.160.34
-92.118.160.35
-92.118.160.36
-92.118.160.37 # netsystemsresearch.com
-92.118.160.38
-92.118.160.39
-92.118.160.40
-92.118.160.41 # netsystemsresearch.com
-92.118.160.42
-92.118.160.43
-92.118.160.44
-92.118.160.45 # netsystemsresearch.com
-92.118.160.46
-92.118.160.47
-92.118.160.48
-92.118.160.49 # netsystemsresearch.com
-92.118.160.50
-92.118.160.51
-92.118.160.52
-92.118.160.53 # netsystemsresearch.com
-92.118.160.54
-92.118.160.55
-92.118.160.56
-92.118.160.57 # netsystemsresearch.com
-92.118.160.58
-92.118.160.59
-92.118.160.60
-92.118.160.61 # netsystemsresearch.com
-92.118.160.62
-92.118.160.63
-92.118.160.64
-92.118.160.65
-92.118.160.66
-92.118.160.67
-92.118.160.68
-92.118.160.69
-92.118.160.70
-92.118.160.71
-92.118.160.72
-92.118.160.73
-92.118.160.74
-92.118.160.75
-92.118.160.76
-92.118.160.77
-92.118.160.78
-92.118.160.79
-92.118.160.80
-92.118.160.81
-92.118.160.82
-92.118.160.83
-92.118.160.84
-92.118.160.85
-92.118.160.86
-92.118.160.87
-92.118.160.88
-92.118.160.89
-92.118.160.90
-92.118.160.91
-92.118.160.92
-92.118.160.93
-92.118.160.94
-92.118.160.95
-92.118.160.96
-92.118.160.97
-92.118.160.98
-92.118.160.99
-92.118.160.100
-92.118.160.101
-92.118.160.102
-92.118.160.103
-92.118.160.104
-92.118.160.105
-92.118.160.106
-92.118.160.107
-92.118.160.108
-92.118.160.109
-92.118.160.110
-92.118.160.111
-92.118.160.112
-92.118.160.113
-92.118.160.114
-92.118.160.115
-92.118.160.116
-92.118.160.117
-92.118.160.118
-92.118.160.119
-92.118.160.120
-92.118.160.121
-92.118.160.122
-92.118.160.123
-92.118.160.124
-92.118.160.125
-92.118.160.126
-92.118.160.127
-92.118.160.128
-92.118.160.129
-92.118.160.130
-92.118.160.131
-92.118.160.132
-92.118.160.133
-92.118.160.134
-92.118.160.135
-92.118.160.136
-92.118.160.137
-92.118.160.138
-92.118.160.139
-92.118.160.140
-92.118.160.141
-92.118.160.142
-92.118.160.143
-92.118.160.144
-92.118.160.145
-92.118.160.146
-92.118.160.147
-92.118.160.148
-92.118.160.149
-92.118.160.150
-92.118.160.151
-92.118.160.152
-92.118.160.153
-92.118.160.154
-92.118.160.155
-92.118.160.156
-92.118.160.157
-92.118.160.158
-92.118.160.159
-92.118.160.160
-92.118.160.161
-92.118.160.162
-92.118.160.163
-92.118.160.164
-92.118.160.165
-92.118.160.166
-92.118.160.167
-92.118.160.168
-92.118.160.169
-92.118.160.170
-92.118.160.171
-92.118.160.172
-92.118.160.173
-92.118.160.174
-92.118.160.175
-92.118.160.176
-92.118.160.177
-92.118.160.178
-92.118.160.179
-92.118.160.180
-92.118.160.181
-92.118.160.182
-92.118.160.183
-92.118.160.184
-92.118.160.185
-92.118.160.186
-92.118.160.187
-92.118.160.188
-92.118.160.189
-92.118.160.190
-92.118.160.191
-92.118.160.192
-92.118.160.193
-92.118.160.194
-92.118.160.195
-92.118.160.196
-92.118.160.197
-92.118.160.198
-92.118.160.199
-92.118.160.200
-92.118.160.201
-92.118.160.202
-92.118.160.203
-92.118.160.204
-92.118.160.205
-92.118.160.206
-92.118.160.207
-92.118.160.208
-92.118.160.209
-92.118.160.210
-92.118.160.211
-92.118.160.212
-92.118.160.213
-92.118.160.214
-92.118.160.215
-92.118.160.216
-92.118.160.217
-92.118.160.218
-92.118.160.219
-92.118.160.220
-92.118.160.221
-92.118.160.222
-92.118.160.223
-92.118.160.224
-92.118.160.225
-92.118.160.226
-92.118.160.227
-92.118.160.228
-92.118.160.229
-92.118.160.230
-92.118.160.231
-92.118.160.232
-92.118.160.233
-92.118.160.234
-92.118.160.235
-92.118.160.236
-92.118.160.237
-92.118.160.238
-92.118.160.239
-92.118.160.240
-92.118.160.241
-92.118.160.242
-92.118.160.243
-92.118.160.244
-92.118.160.245
-92.118.160.246
-92.118.160.247
-92.118.160.248
-92.118.160.249
-92.118.160.250
-92.118.160.251
-92.118.160.252
-92.118.160.253
-92.118.160.254
-92.118.160.255
-92.118.161.0
-92.118.161.1 # netsystemsresearch.com
-92.118.161.2
-92.118.161.3 # netsystemsresearch.com
-92.118.161.4
-92.118.161.5 # netsystemsresearch.com
-92.118.161.6
-92.118.161.7
-92.118.161.8
-92.118.161.9 # netsystemsresearch.com
-92.118.161.10
-92.118.161.11
-92.118.161.12
-92.118.161.13
-92.118.161.14
-92.118.161.15
-92.118.161.16
-92.118.161.17 # netsystemsresearch.com
-92.118.161.18
-92.118.161.19
-92.118.161.20
-92.118.161.21 # netsystemsresearch.com
-92.118.161.22
-92.118.161.23
-92.118.161.24
-92.118.161.25 # netsystemsresearch.com
-92.118.161.26
-92.118.161.27
-92.118.161.28
-92.118.161.29 # netsystemsresearch.com
-92.118.161.30
-92.118.161.31
-92.118.161.32
-92.118.161.33 # netsystemsresearch.com
-92.118.161.34
-92.118.161.35
-92.118.161.36
-92.118.161.37 # netsystemsresearch.com
-92.118.161.38
-92.118.161.39
-92.118.161.40
-92.118.161.41 # netsystemsresearch.com
-92.118.161.42
-92.118.161.43
-92.118.161.44
-92.118.161.45 # netsystemsresearch.com
-92.118.161.46
-92.118.161.47
-92.118.161.48
-92.118.161.49 # netsystemsresearch.com
-92.118.161.50
-92.118.161.51
-92.118.161.52
-92.118.161.53 # netsystemsresearch.com
-92.118.161.54
-92.118.161.55
-92.118.161.56
-92.118.161.57 # netsystemsresearch.com
-92.118.161.58
-92.118.161.59
-92.118.161.60
-92.118.161.61 # netsystemsresearch.com
-92.118.161.62
-92.118.161.63
-92.118.161.64
-92.118.161.65
-92.118.161.66
-92.118.161.67
-92.118.161.68
-92.118.161.69
-92.118.161.70
-92.118.161.71
-92.118.161.72
-92.118.161.73
-92.118.161.74
-92.118.161.75
-92.118.161.76
-92.118.161.77
-92.118.161.78
-92.118.161.79
-92.118.161.80
-92.118.161.81
-92.118.161.82
-92.118.161.83
-92.118.161.84
-92.118.161.85
-92.118.161.86
-92.118.161.87
-92.118.161.88
-92.118.161.89
-92.118.161.90
-92.118.161.91
-92.118.161.92
-92.118.161.93
-92.118.161.94
-92.118.161.95
-92.118.161.96
-92.118.161.97
-92.118.161.98
-92.118.161.99
-92.118.161.100
-92.118.161.101
-92.118.161.102
-92.118.161.103
-92.118.161.104
-92.118.161.105
-92.118.161.106
-92.118.161.107
-92.118.161.108
-92.118.161.109
-92.118.161.110
-92.118.161.111
-92.118.161.112
-92.118.161.113
-92.118.161.114
-92.118.161.115
-92.118.161.116
-92.118.161.117
-92.118.161.118
-92.118.161.119
-92.118.161.120
-92.118.161.121
-92.118.161.122
-92.118.161.123
-92.118.161.124
-92.118.161.125
-92.118.161.126
-92.118.161.127
-92.118.161.128
-92.118.161.129
-92.118.161.130
-92.118.161.131
-92.118.161.132
-92.118.161.133
-92.118.161.134
-92.118.161.135
-92.118.161.136
-92.118.161.137
-92.118.161.138
-92.118.161.139
-92.118.161.140
-92.118.161.141
-92.118.161.142
-92.118.161.143
-92.118.161.144
-92.118.161.145
-92.118.161.146
-92.118.161.147
-92.118.161.148
-92.118.161.149
-92.118.161.150
-92.118.161.151
-92.118.161.152
-92.118.161.153
-92.118.161.154
-92.118.161.155
-92.118.161.156
-92.118.161.157
-92.118.161.158
-92.118.161.159
-92.118.161.160
-92.118.161.161
-92.118.161.162
-92.118.161.163
-92.118.161.164
-92.118.161.165
-92.118.161.166
-92.118.161.167
-92.118.161.168
-92.118.161.169
-92.118.161.170
-92.118.161.171
-92.118.161.172
-92.118.161.173
-92.118.161.174
-92.118.161.175
-92.118.161.176
-92.118.161.177
-92.118.161.178
-92.118.161.179
-92.118.161.180
-92.118.161.181
-92.118.161.182
-92.118.161.183
-92.118.161.184
-92.118.161.185
-92.118.161.186
-92.118.161.187
-92.118.161.188
-92.118.161.189
-92.118.161.190
-92.118.161.191
-92.118.161.192
-92.118.161.193
-92.118.161.194
-92.118.161.195
-92.118.161.196
-92.118.161.197
-92.118.161.198
-92.118.161.199
-92.118.161.200
-92.118.161.201
-92.118.161.202
-92.118.161.203
-92.118.161.204
-92.118.161.205
-92.118.161.206
-92.118.161.207
-92.118.161.208
-92.118.161.209
-92.118.161.210
-92.118.161.211
-92.118.161.212
-92.118.161.213
-92.118.161.214
-92.118.161.215
-92.118.161.216
-92.118.161.217
-92.118.161.218
-92.118.161.219
-92.118.161.220
-92.118.161.221
-92.118.161.222
-92.118.161.223
-92.118.161.224
-92.118.161.225
-92.118.161.226
-92.118.161.227
-92.118.161.228
-92.118.161.229
-92.118.161.230
-92.118.161.231
-92.118.161.232
-92.118.161.233
-92.118.161.234
-92.118.161.235
-92.118.161.236
-92.118.161.237
-92.118.161.238
-92.118.161.239
-92.118.161.240
-92.118.161.241
-92.118.161.242
-92.118.161.243
-92.118.161.244
-92.118.161.245
-92.118.161.246
-92.118.161.247
-92.118.161.248
-92.118.161.249
-92.118.161.250
-92.118.161.251
-92.118.161.252
-92.118.161.253
-92.118.161.254
-92.118.161.255
-185.173.35.0
-185.173.35.1 # 185.173.35.1.netsystemsresearch.com
-185.173.35.2
-185.173.35.3
-185.173.35.4
-185.173.35.5 # 185.173.35.5.netsystemsresearch.com
-185.173.35.6
-185.173.35.7
-185.173.35.8
-185.173.35.9 # 185.173.35.9.netsystemsresearch.com
-185.173.35.10
-185.173.35.11
-185.173.35.12
-185.173.35.13 # 185.173.35.13.netsystemsresearch.com
-185.173.35.14
-185.173.35.15
-185.173.35.16
-185.173.35.17 # 185.173.35.17.netsystemsresearch.com
-185.173.35.18
-185.173.35.19
-185.173.35.20
-185.173.35.21 # 185.173.35.21.netsystemsresearch.com
-185.173.35.22
-185.173.35.23
-185.173.35.24
-185.173.35.25 # 185.173.35.25.netsystemsresearch.com
-185.173.35.26
-185.173.35.27
-185.173.35.28
-185.173.35.29
-185.173.35.30
-185.173.35.31
-185.173.35.32
-185.173.35.33 # 185.173.35.33.netsystemsresearch.com
-185.173.35.34
-185.173.35.35
-185.173.35.36
-185.173.35.37 # 185.173.35.37.netsystemsresearch.com
-185.173.35.38
-185.173.35.39
-185.173.35.40
-185.173.35.41 # 185.173.35.41.netsystemsresearch.com
-185.173.35.42
-185.173.35.43
-185.173.35.44
-185.173.35.45 # 185.173.35.45.netsystemsresearch.com
-185.173.35.46
-185.173.35.47
-185.173.35.48
-185.173.35.49
-185.173.35.50
-185.173.35.51
-185.173.35.52
-185.173.35.53 # 185.173.35.53.netsystemsresearch.com
-185.173.35.54
-185.173.35.55
-185.173.35.56
-185.173.35.57 # 185.173.35.57.netsystemsresearch.com
-185.173.35.58
-185.173.35.59
-185.173.35.60
-185.173.35.61 # 185.173.35.61.netsystemsresearch.com
-185.173.35.62
-185.173.35.63
-185.173.35.64
-185.173.35.65
-185.173.35.66
-185.173.35.67
-185.173.35.68
-185.173.35.69
-185.173.35.70
-185.173.35.71
-185.173.35.72
-185.173.35.73
-185.173.35.74
-185.173.35.75
-185.173.35.76
-185.173.35.77
-185.173.35.78
-185.173.35.79
-185.173.35.80
-185.173.35.81
-185.173.35.82
-185.173.35.83
-185.173.35.84
-185.173.35.85
-185.173.35.86
-185.173.35.87
-185.173.35.88
-185.173.35.89
-185.173.35.90
-185.173.35.91
-185.173.35.92
-185.173.35.93
-185.173.35.94
-185.173.35.95
-185.173.35.96
-185.173.35.97
-185.173.35.98
-185.173.35.99
-185.173.35.100
-185.173.35.101
-185.173.35.102
-185.173.35.103
-185.173.35.104
-185.173.35.105
-185.173.35.106
-185.173.35.107
-185.173.35.108
-185.173.35.109
-185.173.35.110
-185.173.35.111
-185.173.35.112
-185.173.35.113
-185.173.35.114
-185.173.35.115
-185.173.35.116
-185.173.35.117
-185.173.35.118
-185.173.35.119
-185.173.35.120
-185.173.35.121
-185.173.35.122
-185.173.35.123
-185.173.35.124
-185.173.35.125
-185.173.35.126
-185.173.35.127
-185.173.35.128
-185.173.35.129
-185.173.35.130
-185.173.35.131
-185.173.35.132
-185.173.35.133
-185.173.35.134
-185.173.35.135
-185.173.35.136
-185.173.35.137
-185.173.35.138
-185.173.35.139
-185.173.35.140
-185.173.35.141
-185.173.35.142
-185.173.35.143
-185.173.35.144
-185.173.35.145
-185.173.35.146
-185.173.35.147
-185.173.35.148
-185.173.35.149
-185.173.35.150
-185.173.35.151
-185.173.35.152
-185.173.35.153
-185.173.35.154
-185.173.35.155
-185.173.35.156
-185.173.35.157
-185.173.35.158
-185.173.35.159
-185.173.35.160
-185.173.35.161
-185.173.35.162
-185.173.35.163
-185.173.35.164
-185.173.35.165
-185.173.35.166
-185.173.35.167
-185.173.35.168
-185.173.35.169
-185.173.35.170
-185.173.35.171
-185.173.35.172
-185.173.35.173
-185.173.35.174
-185.173.35.175
-185.173.35.176
-185.173.35.177
-185.173.35.178
-185.173.35.179
-185.173.35.180
-185.173.35.181
-185.173.35.182
-185.173.35.183
-185.173.35.184
-185.173.35.185
-185.173.35.186
-185.173.35.187
-185.173.35.188
-185.173.35.189
-185.173.35.190
-185.173.35.191
-185.173.35.192
-185.173.35.193
-185.173.35.194
-185.173.35.195
-185.173.35.196
-185.173.35.197
-185.173.35.198
-185.173.35.199
-185.173.35.200
-185.173.35.201
-185.173.35.202
-185.173.35.203
-185.173.35.204
-185.173.35.205
-185.173.35.206
-185.173.35.207
-185.173.35.208
-185.173.35.209
-185.173.35.210
-185.173.35.211
-185.173.35.212
-185.173.35.213
-185.173.35.214
-185.173.35.215
-185.173.35.216
-185.173.35.217
-185.173.35.218
-185.173.35.219
-185.173.35.220
-185.173.35.221
-185.173.35.222
-185.173.35.223
-185.173.35.224
-185.173.35.225
-185.173.35.226
-185.173.35.227
-185.173.35.228
-185.173.35.229
-185.173.35.230
-185.173.35.231
-185.173.35.232
-185.173.35.233
-185.173.35.234
-185.173.35.235
-185.173.35.236
-185.173.35.237
-185.173.35.238
-185.173.35.239
-185.173.35.240
-185.173.35.241
-185.173.35.242
-185.173.35.243
-185.173.35.244
-185.173.35.245
-185.173.35.246
-185.173.35.247
-185.173.35.248
-185.173.35.249
-185.173.35.250
-185.173.35.251
-185.173.35.252
-185.173.35.253
-185.173.35.254
-185.173.35.255
-
-# Reference: https://twitter.com/bad_packets/status/1148762019186610176
-
-176.58.124.134 # tequilaboomboom.club
-
-# Reference: https://twitter.com/bad_packets/status/1148796825379336194
-
-185.232.64.20
-185.232.64.21
-185.232.64.22
-185.232.64.23
-
-# Reference: https://support.censys.io/hc/en-us/articles/360043177092-Opt-Out-of-Scanning
-
-162.142.125.1 # censys.io
-162.142.125.2 # censys.io
-162.142.125.3 # censys.io
-162.142.125.4 # censys.io
-162.142.125.5 # censys.io
-162.142.125.6 # censys.io
-162.142.125.7 # censys.io
-162.142.125.8 # censys.io
-162.142.125.9 # censys.io
-162.142.125.10 # censys.io
-162.142.125.11 # censys.io
-162.142.125.12 # censys.io
-162.142.125.13 # censys.io
-162.142.125.14 # censys.io
-162.142.125.15 # censys.io
-162.142.125.16 # censys.io
-162.142.125.17 # censys.io
-162.142.125.18 # censys.io
-162.142.125.19 # censys.io
-162.142.125.20 # censys.io
-162.142.125.21 # censys.io
-162.142.125.22 # censys.io
-162.142.125.23 # censys.io
-162.142.125.24 # censys.io
-162.142.125.25 # censys.io
-162.142.125.26 # censys.io
-162.142.125.27 # censys.io
-162.142.125.28 # censys.io
-162.142.125.29 # censys.io
-162.142.125.30 # censys.io
-162.142.125.31 # censys.io
-162.142.125.32 # censys.io
-162.142.125.33 # censys.io
-162.142.125.34 # censys.io
-162.142.125.35 # censys.io
-162.142.125.36 # censys.io
-162.142.125.37 # censys.io
-162.142.125.38 # censys.io
-162.142.125.39 # censys.io
-162.142.125.40 # censys.io
-162.142.125.41 # censys.io
-162.142.125.42 # censys.io
-162.142.125.43 # censys.io
-162.142.125.44 # censys.io
-162.142.125.45 # censys.io
-162.142.125.46 # censys.io
-162.142.125.47 # censys.io
-162.142.125.48 # censys.io
-162.142.125.49 # censys.io
-162.142.125.50 # censys.io
-162.142.125.51 # censys.io
-162.142.125.52 # censys.io
-162.142.125.53 # censys.io
-162.142.125.54 # censys.io
-162.142.125.55 # censys.io
-162.142.125.56 # censys.io
-162.142.125.57 # censys.io
-162.142.125.58 # censys.io
-162.142.125.59 # censys.io
-162.142.125.60 # censys.io
-162.142.125.61 # censys.io
-162.142.125.62 # censys.io
-162.142.125.63 # censys.io
-162.142.125.64 # censys.io
-162.142.125.65 # censys.io
-162.142.125.66 # censys.io
-162.142.125.67 # censys.io
-162.142.125.68 # censys.io
-162.142.125.69 # censys.io
-162.142.125.70 # censys.io
-162.142.125.71 # censys.io
-162.142.125.72 # censys.io
-162.142.125.73 # censys.io
-162.142.125.74 # censys.io
-162.142.125.75 # censys.io
-162.142.125.76 # censys.io
-162.142.125.77 # censys.io
-162.142.125.78 # censys.io
-162.142.125.79 # censys.io
-162.142.125.80 # censys.io
-162.142.125.81 # censys.io
-162.142.125.82 # censys.io
-162.142.125.83 # censys.io
-162.142.125.84 # censys.io
-162.142.125.85 # censys.io
-162.142.125.86 # censys.io
-162.142.125.87 # censys.io
-162.142.125.88 # censys.io
-162.142.125.89 # censys.io
-162.142.125.90 # censys.io
-162.142.125.91 # censys.io
-162.142.125.92 # censys.io
-162.142.125.93 # censys.io
-162.142.125.94 # censys.io
-162.142.125.95 # censys.io
-162.142.125.96 # censys.io
-162.142.125.97 # censys.io
-162.142.125.98 # censys.io
-162.142.125.99 # censys.io
-162.142.125.100 # censys.io
-162.142.125.101 # censys.io
-162.142.125.102 # censys.io
-162.142.125.103 # censys.io
-162.142.125.104 # censys.io
-162.142.125.105 # censys.io
-162.142.125.106 # censys.io
-162.142.125.107 # censys.io
-162.142.125.108 # censys.io
-162.142.125.109 # censys.io
-162.142.125.110 # censys.io
-162.142.125.111 # censys.io
-162.142.125.112 # censys.io
-162.142.125.113 # censys.io
-162.142.125.114 # censys.io
-162.142.125.115 # censys.io
-162.142.125.116 # censys.io
-162.142.125.117 # censys.io
-162.142.125.118 # censys.io
-162.142.125.119 # censys.io
-162.142.125.120 # censys.io
-162.142.125.121 # censys.io
-162.142.125.122 # censys.io
-162.142.125.123 # censys.io
-162.142.125.124 # censys.io
-162.142.125.125 # censys.io
-162.142.125.126 # censys.io
-162.142.125.127 # censys.io
-162.142.125.128 # censys.io
-162.142.125.129 # censys.io
-162.142.125.130 # censys.io
-162.142.125.131 # censys.io
-162.142.125.132 # censys.io
-162.142.125.133 # censys.io
-162.142.125.134 # censys.io
-162.142.125.135 # censys.io
-162.142.125.136 # censys.io
-162.142.125.137 # censys.io
-162.142.125.138 # censys.io
-162.142.125.139 # censys.io
-162.142.125.140 # censys.io
-162.142.125.141 # censys.io
-162.142.125.142 # censys.io
-162.142.125.143 # censys.io
-162.142.125.144 # censys.io
-162.142.125.145 # censys.io
-162.142.125.146 # censys.io
-162.142.125.147 # censys.io
-162.142.125.148 # censys.io
-162.142.125.149 # censys.io
-162.142.125.150 # censys.io
-162.142.125.151 # censys.io
-162.142.125.152 # censys.io
-162.142.125.153 # censys.io
-162.142.125.154 # censys.io
-162.142.125.155 # censys.io
-162.142.125.156 # censys.io
-162.142.125.157 # censys.io
-162.142.125.158 # censys.io
-162.142.125.159 # censys.io
-162.142.125.160 # censys.io
-162.142.125.161 # censys.io
-162.142.125.162 # censys.io
-162.142.125.163 # censys.io
-162.142.125.164 # censys.io
-162.142.125.165 # censys.io
-162.142.125.166 # censys.io
-162.142.125.167 # censys.io
-162.142.125.168 # censys.io
-162.142.125.169 # censys.io
-162.142.125.170 # censys.io
-162.142.125.171 # censys.io
-162.142.125.172 # censys.io
-162.142.125.173 # censys.io
-162.142.125.174 # censys.io
-162.142.125.175 # censys.io
-162.142.125.176 # censys.io
-162.142.125.177 # censys.io
-162.142.125.178 # censys.io
-162.142.125.179 # censys.io
-162.142.125.180 # censys.io
-162.142.125.181 # censys.io
-162.142.125.182 # censys.io
-162.142.125.183 # censys.io
-162.142.125.184 # censys.io
-162.142.125.185 # censys.io
-162.142.125.186 # censys.io
-162.142.125.187 # censys.io
-162.142.125.188 # censys.io
-162.142.125.189 # censys.io
-162.142.125.190 # censys.io
-162.142.125.191 # censys.io
-162.142.125.192 # censys.io
-162.142.125.193 # censys.io
-162.142.125.194 # censys.io
-162.142.125.195 # censys.io
-162.142.125.196 # censys.io
-162.142.125.197 # censys.io
-162.142.125.198 # censys.io
-162.142.125.199 # censys.io
-162.142.125.200 # censys.io
-162.142.125.201 # censys.io
-162.142.125.202 # censys.io
-162.142.125.203 # censys.io
-162.142.125.204 # censys.io
-162.142.125.205 # censys.io
-162.142.125.206 # censys.io
-162.142.125.207 # censys.io
-162.142.125.208 # censys.io
-162.142.125.209 # censys.io
-162.142.125.210 # censys.io
-162.142.125.211 # censys.io
-162.142.125.212 # censys.io
-162.142.125.213 # censys.io
-162.142.125.214 # censys.io
-162.142.125.215 # censys.io
-162.142.125.216 # censys.io
-162.142.125.217 # censys.io
-162.142.125.218 # censys.io
-162.142.125.219 # censys.io
-162.142.125.220 # censys.io
-162.142.125.221 # censys.io
-162.142.125.222 # censys.io
-162.142.125.223 # censys.io
-162.142.125.224 # censys.io
-162.142.125.225 # censys.io
-162.142.125.226 # censys.io
-162.142.125.227 # censys.io
-162.142.125.228 # censys.io
-162.142.125.229 # censys.io
-162.142.125.230 # censys.io
-162.142.125.231 # censys.io
-162.142.125.232 # censys.io
-162.142.125.233 # censys.io
-162.142.125.234 # censys.io
-162.142.125.235 # censys.io
-162.142.125.236 # censys.io
-162.142.125.237 # censys.io
-162.142.125.238 # censys.io
-162.142.125.239 # censys.io
-162.142.125.240 # censys.io
-162.142.125.241 # censys.io
-162.142.125.242 # censys.io
-162.142.125.243 # censys.io
-162.142.125.244 # censys.io
-162.142.125.245 # censys.io
-162.142.125.246 # censys.io
-162.142.125.247 # censys.io
-162.142.125.248 # censys.io
-162.142.125.249 # censys.io
-162.142.125.250 # censys.io
-162.142.125.251 # censys.io
-162.142.125.252 # censys.io
-162.142.125.253 # censys.io
-162.142.125.254 # censys.io
-167.94.138.1 # censys.io
-167.94.138.2 # censys.io
-167.94.138.3 # censys.io
-167.94.138.4 # censys.io
-167.94.138.5 # censys.io
-167.94.138.6 # censys.io
-167.94.138.7 # censys.io
-167.94.138.8 # censys.io
-167.94.138.9 # censys.io
-167.94.138.10 # censys.io
-167.94.138.11 # censys.io
-167.94.138.12 # censys.io
-167.94.138.13 # censys.io
-167.94.138.14 # censys.io
-167.94.138.15 # censys.io
-167.94.138.16 # censys.io
-167.94.138.17 # censys.io
-167.94.138.18 # censys.io
-167.94.138.19 # censys.io
-167.94.138.20 # censys.io
-167.94.138.21 # censys.io
-167.94.138.22 # censys.io
-167.94.138.23 # censys.io
-167.94.138.24 # censys.io
-167.94.138.25 # censys.io
-167.94.138.26 # censys.io
-167.94.138.27 # censys.io
-167.94.138.28 # censys.io
-167.94.138.29 # censys.io
-167.94.138.30 # censys.io
-167.94.138.31 # censys.io
-167.94.138.32 # censys.io
-167.94.138.33 # censys.io
-167.94.138.34 # censys.io
-167.94.138.35 # censys.io
-167.94.138.36 # censys.io
-167.94.138.37 # censys.io
-167.94.138.38 # censys.io
-167.94.138.39 # censys.io
-167.94.138.40 # censys.io
-167.94.138.41 # censys.io
-167.94.138.42 # censys.io
-167.94.138.43 # censys.io
-167.94.138.44 # censys.io
-167.94.138.45 # censys.io
-167.94.138.46 # censys.io
-167.94.138.47 # censys.io
-167.94.138.48 # censys.io
-167.94.138.49 # censys.io
-167.94.138.50 # censys.io
-167.94.138.51 # censys.io
-167.94.138.52 # censys.io
-167.94.138.53 # censys.io
-167.94.138.54 # censys.io
-167.94.138.55 # censys.io
-167.94.138.56 # censys.io
-167.94.138.57 # censys.io
-167.94.138.58 # censys.io
-167.94.138.59 # censys.io
-167.94.138.60 # censys.io
-167.94.138.61 # censys.io
-167.94.138.62 # censys.io
-167.94.138.63 # censys.io
-167.94.138.64 # censys.io
-167.94.138.65 # censys.io
-167.94.138.66 # censys.io
-167.94.138.67 # censys.io
-167.94.138.68 # censys.io
-167.94.138.69 # censys.io
-167.94.138.70 # censys.io
-167.94.138.71 # censys.io
-167.94.138.72 # censys.io
-167.94.138.73 # censys.io
-167.94.138.74 # censys.io
-167.94.138.75 # censys.io
-167.94.138.76 # censys.io
-167.94.138.77 # censys.io
-167.94.138.78 # censys.io
-167.94.138.79 # censys.io
-167.94.138.80 # censys.io
-167.94.138.81 # censys.io
-167.94.138.82 # censys.io
-167.94.138.83 # censys.io
-167.94.138.84 # censys.io
-167.94.138.85 # censys.io
-167.94.138.86 # censys.io
-167.94.138.87 # censys.io
-167.94.138.88 # censys.io
-167.94.138.89 # censys.io
-167.94.138.90 # censys.io
-167.94.138.91 # censys.io
-167.94.138.92 # censys.io
-167.94.138.93 # censys.io
-167.94.138.94 # censys.io
-167.94.138.95 # censys.io
-167.94.138.96 # censys.io
-167.94.138.97 # censys.io
-167.94.138.98 # censys.io
-167.94.138.99 # censys.io
-167.94.138.100 # censys.io
-167.94.138.101 # censys.io
-167.94.138.102 # censys.io
-167.94.138.103 # censys.io
-167.94.138.104 # censys.io
-167.94.138.105 # censys.io
-167.94.138.106 # censys.io
-167.94.138.107 # censys.io
-167.94.138.108 # censys.io
-167.94.138.109 # censys.io
-167.94.138.110 # censys.io
-167.94.138.111 # censys.io
-167.94.138.112 # censys.io
-167.94.138.113 # censys.io
-167.94.138.114 # censys.io
-167.94.138.115 # censys.io
-167.94.138.116 # censys.io
-167.94.138.117 # censys.io
-167.94.138.118 # censys.io
-167.94.138.119 # censys.io
-167.94.138.120 # censys.io
-167.94.138.121 # censys.io
-167.94.138.122 # censys.io
-167.94.138.123 # censys.io
-167.94.138.124 # censys.io
-167.94.138.125 # censys.io
-167.94.138.126 # censys.io
-167.94.138.127 # censys.io
-167.94.138.128 # censys.io
-167.94.138.129 # censys.io
-167.94.138.130 # censys.io
-167.94.138.131 # censys.io
-167.94.138.132 # censys.io
-167.94.138.133 # censys.io
-167.94.138.134 # censys.io
-167.94.138.135 # censys.io
-167.94.138.136 # censys.io
-167.94.138.137 # censys.io
-167.94.138.138 # censys.io
-167.94.138.139 # censys.io
-167.94.138.140 # censys.io
-167.94.138.141 # censys.io
-167.94.138.142 # censys.io
-167.94.138.143 # censys.io
-167.94.138.144 # censys.io
-167.94.138.145 # censys.io
-167.94.138.146 # censys.io
-167.94.138.147 # censys.io
-167.94.138.148 # censys.io
-167.94.138.149 # censys.io
-167.94.138.150 # censys.io
-167.94.138.151 # censys.io
-167.94.138.152 # censys.io
-167.94.138.153 # censys.io
-167.94.138.154 # censys.io
-167.94.138.155 # censys.io
-167.94.138.156 # censys.io
-167.94.138.157 # censys.io
-167.94.138.158 # censys.io
-167.94.138.159 # censys.io
-167.94.138.160 # censys.io
-167.94.138.161 # censys.io
-167.94.138.162 # censys.io
-167.94.138.163 # censys.io
-167.94.138.164 # censys.io
-167.94.138.165 # censys.io
-167.94.138.166 # censys.io
-167.94.138.167 # censys.io
-167.94.138.168 # censys.io
-167.94.138.169 # censys.io
-167.94.138.170 # censys.io
-167.94.138.171 # censys.io
-167.94.138.172 # censys.io
-167.94.138.173 # censys.io
-167.94.138.174 # censys.io
-167.94.138.175 # censys.io
-167.94.138.176 # censys.io
-167.94.138.177 # censys.io
-167.94.138.178 # censys.io
-167.94.138.179 # censys.io
-167.94.138.180 # censys.io
-167.94.138.181 # censys.io
-167.94.138.182 # censys.io
-167.94.138.183 # censys.io
-167.94.138.184 # censys.io
-167.94.138.185 # censys.io
-167.94.138.186 # censys.io
-167.94.138.187 # censys.io
-167.94.138.188 # censys.io
-167.94.138.189 # censys.io
-167.94.138.190 # censys.io
-167.94.138.191 # censys.io
-167.94.138.192 # censys.io
-167.94.138.193 # censys.io
-167.94.138.194 # censys.io
-167.94.138.195 # censys.io
-167.94.138.196 # censys.io
-167.94.138.197 # censys.io
-167.94.138.198 # censys.io
-167.94.138.199 # censys.io
-167.94.138.200 # censys.io
-167.94.138.201 # censys.io
-167.94.138.202 # censys.io
-167.94.138.203 # censys.io
-167.94.138.204 # censys.io
-167.94.138.205 # censys.io
-167.94.138.206 # censys.io
-167.94.138.207 # censys.io
-167.94.138.208 # censys.io
-167.94.138.209 # censys.io
-167.94.138.210 # censys.io
-167.94.138.211 # censys.io
-167.94.138.212 # censys.io
-167.94.138.213 # censys.io
-167.94.138.214 # censys.io
-167.94.138.215 # censys.io
-167.94.138.216 # censys.io
-167.94.138.217 # censys.io
-167.94.138.218 # censys.io
-167.94.138.219 # censys.io
-167.94.138.220 # censys.io
-167.94.138.221 # censys.io
-167.94.138.222 # censys.io
-167.94.138.223 # censys.io
-167.94.138.224 # censys.io
-167.94.138.225 # censys.io
-167.94.138.226 # censys.io
-167.94.138.227 # censys.io
-167.94.138.228 # censys.io
-167.94.138.229 # censys.io
-167.94.138.230 # censys.io
-167.94.138.231 # censys.io
-167.94.138.232 # censys.io
-167.94.138.233 # censys.io
-167.94.138.234 # censys.io
-167.94.138.235 # censys.io
-167.94.138.236 # censys.io
-167.94.138.237 # censys.io
-167.94.138.238 # censys.io
-167.94.138.239 # censys.io
-167.94.138.240 # censys.io
-167.94.138.241 # censys.io
-167.94.138.242 # censys.io
-167.94.138.243 # censys.io
-167.94.138.244 # censys.io
-167.94.138.245 # censys.io
-167.94.138.246 # censys.io
-167.94.138.247 # censys.io
-167.94.138.248 # censys.io
-167.94.138.249 # censys.io
-167.94.138.250 # censys.io
-167.94.138.251 # censys.io
-167.94.138.252 # censys.io
-167.94.138.253 # censys.io
-167.94.138.254 # censys.io
-167.94.145.1 # censys.io
-167.94.145.2 # censys.io
-167.94.145.3 # censys.io
-167.94.145.4 # censys.io
-167.94.145.5 # censys.io
-167.94.145.6 # censys.io
-167.94.145.7 # censys.io
-167.94.145.8 # censys.io
-167.94.145.9 # censys.io
-167.94.145.10 # censys.io
-167.94.145.11 # censys.io
-167.94.145.12 # censys.io
-167.94.145.13 # censys.io
-167.94.145.14 # censys.io
-167.94.145.15 # censys.io
-167.94.145.16 # censys.io
-167.94.145.17 # censys.io
-167.94.145.18 # censys.io
-167.94.145.19 # censys.io
-167.94.145.20 # censys.io
-167.94.145.21 # censys.io
-167.94.145.22 # censys.io
-167.94.145.23 # censys.io
-167.94.145.24 # censys.io
-167.94.145.25 # censys.io
-167.94.145.26 # censys.io
-167.94.145.27 # censys.io
-167.94.145.28 # censys.io
-167.94.145.29 # censys.io
-167.94.145.30 # censys.io
-167.94.145.31 # censys.io
-167.94.145.32 # censys.io
-167.94.145.33 # censys.io
-167.94.145.34 # censys.io
-167.94.145.35 # censys.io
-167.94.145.36 # censys.io
-167.94.145.37 # censys.io
-167.94.145.38 # censys.io
-167.94.145.39 # censys.io
-167.94.145.40 # censys.io
-167.94.145.41 # censys.io
-167.94.145.42 # censys.io
-167.94.145.43 # censys.io
-167.94.145.44 # censys.io
-167.94.145.45 # censys.io
-167.94.145.46 # censys.io
-167.94.145.47 # censys.io
-167.94.145.48 # censys.io
-167.94.145.49 # censys.io
-167.94.145.50 # censys.io
-167.94.145.51 # censys.io
-167.94.145.52 # censys.io
-167.94.145.53 # censys.io
-167.94.145.54 # censys.io
-167.94.145.55 # censys.io
-167.94.145.56 # censys.io
-167.94.145.57 # censys.io
-167.94.145.58 # censys.io
-167.94.145.59 # censys.io
-167.94.145.60 # censys.io
-167.94.145.61 # censys.io
-167.94.145.62 # censys.io
-167.94.145.63 # censys.io
-167.94.145.64 # censys.io
-167.94.145.65 # censys.io
-167.94.145.66 # censys.io
-167.94.145.67 # censys.io
-167.94.145.68 # censys.io
-167.94.145.69 # censys.io
-167.94.145.70 # censys.io
-167.94.145.71 # censys.io
-167.94.145.72 # censys.io
-167.94.145.73 # censys.io
-167.94.145.74 # censys.io
-167.94.145.75 # censys.io
-167.94.145.76 # censys.io
-167.94.145.77 # censys.io
-167.94.145.78 # censys.io
-167.94.145.79 # censys.io
-167.94.145.80 # censys.io
-167.94.145.81 # censys.io
-167.94.145.82 # censys.io
-167.94.145.83 # censys.io
-167.94.145.84 # censys.io
-167.94.145.85 # censys.io
-167.94.145.86 # censys.io
-167.94.145.87 # censys.io
-167.94.145.88 # censys.io
-167.94.145.89 # censys.io
-167.94.145.90 # censys.io
-167.94.145.91 # censys.io
-167.94.145.92 # censys.io
-167.94.145.93 # censys.io
-167.94.145.94 # censys.io
-167.94.145.95 # censys.io
-167.94.145.96 # censys.io
-167.94.145.97 # censys.io
-167.94.145.98 # censys.io
-167.94.145.99 # censys.io
-167.94.145.100 # censys.io
-167.94.145.101 # censys.io
-167.94.145.102 # censys.io
-167.94.145.103 # censys.io
-167.94.145.104 # censys.io
-167.94.145.105 # censys.io
-167.94.145.106 # censys.io
-167.94.145.107 # censys.io
-167.94.145.108 # censys.io
-167.94.145.109 # censys.io
-167.94.145.110 # censys.io
-167.94.145.111 # censys.io
-167.94.145.112 # censys.io
-167.94.145.113 # censys.io
-167.94.145.114 # censys.io
-167.94.145.115 # censys.io
-167.94.145.116 # censys.io
-167.94.145.117 # censys.io
-167.94.145.118 # censys.io
-167.94.145.119 # censys.io
-167.94.145.120 # censys.io
-167.94.145.121 # censys.io
-167.94.145.122 # censys.io
-167.94.145.123 # censys.io
-167.94.145.124 # censys.io
-167.94.145.125 # censys.io
-167.94.145.126 # censys.io
-167.94.145.127 # censys.io
-167.94.145.128 # censys.io
-167.94.145.129 # censys.io
-167.94.145.130 # censys.io
-167.94.145.131 # censys.io
-167.94.145.132 # censys.io
-167.94.145.133 # censys.io
-167.94.145.134 # censys.io
-167.94.145.135 # censys.io
-167.94.145.136 # censys.io
-167.94.145.137 # censys.io
-167.94.145.138 # censys.io
-167.94.145.139 # censys.io
-167.94.145.140 # censys.io
-167.94.145.141 # censys.io
-167.94.145.142 # censys.io
-167.94.145.143 # censys.io
-167.94.145.144 # censys.io
-167.94.145.145 # censys.io
-167.94.145.146 # censys.io
-167.94.145.147 # censys.io
-167.94.145.148 # censys.io
-167.94.145.149 # censys.io
-167.94.145.150 # censys.io
-167.94.145.151 # censys.io
-167.94.145.152 # censys.io
-167.94.145.153 # censys.io
-167.94.145.154 # censys.io
-167.94.145.155 # censys.io
-167.94.145.156 # censys.io
-167.94.145.157 # censys.io
-167.94.145.158 # censys.io
-167.94.145.159 # censys.io
-167.94.145.160 # censys.io
-167.94.145.161 # censys.io
-167.94.145.162 # censys.io
-167.94.145.163 # censys.io
-167.94.145.164 # censys.io
-167.94.145.165 # censys.io
-167.94.145.166 # censys.io
-167.94.145.167 # censys.io
-167.94.145.168 # censys.io
-167.94.145.169 # censys.io
-167.94.145.170 # censys.io
-167.94.145.171 # censys.io
-167.94.145.172 # censys.io
-167.94.145.173 # censys.io
-167.94.145.174 # censys.io
-167.94.145.175 # censys.io
-167.94.145.176 # censys.io
-167.94.145.177 # censys.io
-167.94.145.178 # censys.io
-167.94.145.179 # censys.io
-167.94.145.180 # censys.io
-167.94.145.181 # censys.io
-167.94.145.182 # censys.io
-167.94.145.183 # censys.io
-167.94.145.184 # censys.io
-167.94.145.185 # censys.io
-167.94.145.186 # censys.io
-167.94.145.187 # censys.io
-167.94.145.188 # censys.io
-167.94.145.189 # censys.io
-167.94.145.190 # censys.io
-167.94.145.191 # censys.io
-167.94.145.192 # censys.io
-167.94.145.193 # censys.io
-167.94.145.194 # censys.io
-167.94.145.195 # censys.io
-167.94.145.196 # censys.io
-167.94.145.197 # censys.io
-167.94.145.198 # censys.io
-167.94.145.199 # censys.io
-167.94.145.200 # censys.io
-167.94.145.201 # censys.io
-167.94.145.202 # censys.io
-167.94.145.203 # censys.io
-167.94.145.204 # censys.io
-167.94.145.205 # censys.io
-167.94.145.206 # censys.io
-167.94.145.207 # censys.io
-167.94.145.208 # censys.io
-167.94.145.209 # censys.io
-167.94.145.210 # censys.io
-167.94.145.211 # censys.io
-167.94.145.212 # censys.io
-167.94.145.213 # censys.io
-167.94.145.214 # censys.io
-167.94.145.215 # censys.io
-167.94.145.216 # censys.io
-167.94.145.217 # censys.io
-167.94.145.218 # censys.io
-167.94.145.219 # censys.io
-167.94.145.220 # censys.io
-167.94.145.221 # censys.io
-167.94.145.222 # censys.io
-167.94.145.223 # censys.io
-167.94.145.224 # censys.io
-167.94.145.225 # censys.io
-167.94.145.226 # censys.io
-167.94.145.227 # censys.io
-167.94.145.228 # censys.io
-167.94.145.229 # censys.io
-167.94.145.230 # censys.io
-167.94.145.231 # censys.io
-167.94.145.232 # censys.io
-167.94.145.233 # censys.io
-167.94.145.234 # censys.io
-167.94.145.235 # censys.io
-167.94.145.236 # censys.io
-167.94.145.237 # censys.io
-167.94.145.238 # censys.io
-167.94.145.239 # censys.io
-167.94.145.240 # censys.io
-167.94.145.241 # censys.io
-167.94.145.242 # censys.io
-167.94.145.243 # censys.io
-167.94.145.244 # censys.io
-167.94.145.245 # censys.io
-167.94.145.246 # censys.io
-167.94.145.247 # censys.io
-167.94.145.248 # censys.io
-167.94.145.249 # censys.io
-167.94.145.250 # censys.io
-167.94.145.251 # censys.io
-167.94.145.252 # censys.io
-167.94.145.253 # censys.io
-167.94.145.254 # censys.io
-167.94.146.1 # censys.io
-167.94.146.2 # censys.io
-167.94.146.3 # censys.io
-167.94.146.4 # censys.io
-167.94.146.5 # censys.io
-167.94.146.6 # censys.io
-167.94.146.7 # censys.io
-167.94.146.8 # censys.io
-167.94.146.9 # censys.io
-167.94.146.10 # censys.io
-167.94.146.11 # censys.io
-167.94.146.12 # censys.io
-167.94.146.13 # censys.io
-167.94.146.14 # censys.io
-167.94.146.15 # censys.io
-167.94.146.16 # censys.io
-167.94.146.17 # censys.io
-167.94.146.18 # censys.io
-167.94.146.19 # censys.io
-167.94.146.20 # censys.io
-167.94.146.21 # censys.io
-167.94.146.22 # censys.io
-167.94.146.23 # censys.io
-167.94.146.24 # censys.io
-167.94.146.25 # censys.io
-167.94.146.26 # censys.io
-167.94.146.27 # censys.io
-167.94.146.28 # censys.io
-167.94.146.29 # censys.io
-167.94.146.30 # censys.io
-167.94.146.31 # censys.io
-167.94.146.32 # censys.io
-167.94.146.33 # censys.io
-167.94.146.34 # censys.io
-167.94.146.35 # censys.io
-167.94.146.36 # censys.io
-167.94.146.37 # censys.io
-167.94.146.38 # censys.io
-167.94.146.39 # censys.io
-167.94.146.40 # censys.io
-167.94.146.41 # censys.io
-167.94.146.42 # censys.io
-167.94.146.43 # censys.io
-167.94.146.44 # censys.io
-167.94.146.45 # censys.io
-167.94.146.46 # censys.io
-167.94.146.47 # censys.io
-167.94.146.48 # censys.io
-167.94.146.49 # censys.io
-167.94.146.50 # censys.io
-167.94.146.51 # censys.io
-167.94.146.52 # censys.io
-167.94.146.53 # censys.io
-167.94.146.54 # censys.io
-167.94.146.55 # censys.io
-167.94.146.56 # censys.io
-167.94.146.57 # censys.io
-167.94.146.58 # censys.io
-167.94.146.59 # censys.io
-167.94.146.60 # censys.io
-167.94.146.61 # censys.io
-167.94.146.62 # censys.io
-167.94.146.63 # censys.io
-167.94.146.64 # censys.io
-167.94.146.65 # censys.io
-167.94.146.66 # censys.io
-167.94.146.67 # censys.io
-167.94.146.68 # censys.io
-167.94.146.69 # censys.io
-167.94.146.70 # censys.io
-167.94.146.71 # censys.io
-167.94.146.72 # censys.io
-167.94.146.73 # censys.io
-167.94.146.74 # censys.io
-167.94.146.75 # censys.io
-167.94.146.76 # censys.io
-167.94.146.77 # censys.io
-167.94.146.78 # censys.io
-167.94.146.79 # censys.io
-167.94.146.80 # censys.io
-167.94.146.81 # censys.io
-167.94.146.82 # censys.io
-167.94.146.83 # censys.io
-167.94.146.84 # censys.io
-167.94.146.85 # censys.io
-167.94.146.86 # censys.io
-167.94.146.87 # censys.io
-167.94.146.88 # censys.io
-167.94.146.89 # censys.io
-167.94.146.90 # censys.io
-167.94.146.91 # censys.io
-167.94.146.92 # censys.io
-167.94.146.93 # censys.io
-167.94.146.94 # censys.io
-167.94.146.95 # censys.io
-167.94.146.96 # censys.io
-167.94.146.97 # censys.io
-167.94.146.98 # censys.io
-167.94.146.99 # censys.io
-167.94.146.100 # censys.io
-167.94.146.101 # censys.io
-167.94.146.102 # censys.io
-167.94.146.103 # censys.io
-167.94.146.104 # censys.io
-167.94.146.105 # censys.io
-167.94.146.106 # censys.io
-167.94.146.107 # censys.io
-167.94.146.108 # censys.io
-167.94.146.109 # censys.io
-167.94.146.110 # censys.io
-167.94.146.111 # censys.io
-167.94.146.112 # censys.io
-167.94.146.113 # censys.io
-167.94.146.114 # censys.io
-167.94.146.115 # censys.io
-167.94.146.116 # censys.io
-167.94.146.117 # censys.io
-167.94.146.118 # censys.io
-167.94.146.119 # censys.io
-167.94.146.120 # censys.io
-167.94.146.121 # censys.io
-167.94.146.122 # censys.io
-167.94.146.123 # censys.io
-167.94.146.124 # censys.io
-167.94.146.125 # censys.io
-167.94.146.126 # censys.io
-167.94.146.127 # censys.io
-167.94.146.128 # censys.io
-167.94.146.129 # censys.io
-167.94.146.130 # censys.io
-167.94.146.131 # censys.io
-167.94.146.132 # censys.io
-167.94.146.133 # censys.io
-167.94.146.134 # censys.io
-167.94.146.135 # censys.io
-167.94.146.136 # censys.io
-167.94.146.137 # censys.io
-167.94.146.138 # censys.io
-167.94.146.139 # censys.io
-167.94.146.140 # censys.io
-167.94.146.141 # censys.io
-167.94.146.142 # censys.io
-167.94.146.143 # censys.io
-167.94.146.144 # censys.io
-167.94.146.145 # censys.io
-167.94.146.146 # censys.io
-167.94.146.147 # censys.io
-167.94.146.148 # censys.io
-167.94.146.149 # censys.io
-167.94.146.150 # censys.io
-167.94.146.151 # censys.io
-167.94.146.152 # censys.io
-167.94.146.153 # censys.io
-167.94.146.154 # censys.io
-167.94.146.155 # censys.io
-167.94.146.156 # censys.io
-167.94.146.157 # censys.io
-167.94.146.158 # censys.io
-167.94.146.159 # censys.io
-167.94.146.160 # censys.io
-167.94.146.161 # censys.io
-167.94.146.162 # censys.io
-167.94.146.163 # censys.io
-167.94.146.164 # censys.io
-167.94.146.165 # censys.io
-167.94.146.166 # censys.io
-167.94.146.167 # censys.io
-167.94.146.168 # censys.io
-167.94.146.169 # censys.io
-167.94.146.170 # censys.io
-167.94.146.171 # censys.io
-167.94.146.172 # censys.io
-167.94.146.173 # censys.io
-167.94.146.174 # censys.io
-167.94.146.175 # censys.io
-167.94.146.176 # censys.io
-167.94.146.177 # censys.io
-167.94.146.178 # censys.io
-167.94.146.179 # censys.io
-167.94.146.180 # censys.io
-167.94.146.181 # censys.io
-167.94.146.182 # censys.io
-167.94.146.183 # censys.io
-167.94.146.184 # censys.io
-167.94.146.185 # censys.io
-167.94.146.186 # censys.io
-167.94.146.187 # censys.io
-167.94.146.188 # censys.io
-167.94.146.189 # censys.io
-167.94.146.190 # censys.io
-167.94.146.191 # censys.io
-167.94.146.192 # censys.io
-167.94.146.193 # censys.io
-167.94.146.194 # censys.io
-167.94.146.195 # censys.io
-167.94.146.196 # censys.io
-167.94.146.197 # censys.io
-167.94.146.198 # censys.io
-167.94.146.199 # censys.io
-167.94.146.200 # censys.io
-167.94.146.201 # censys.io
-167.94.146.202 # censys.io
-167.94.146.203 # censys.io
-167.94.146.204 # censys.io
-167.94.146.205 # censys.io
-167.94.146.206 # censys.io
-167.94.146.207 # censys.io
-167.94.146.208 # censys.io
-167.94.146.209 # censys.io
-167.94.146.210 # censys.io
-167.94.146.211 # censys.io
-167.94.146.212 # censys.io
-167.94.146.213 # censys.io
-167.94.146.214 # censys.io
-167.94.146.215 # censys.io
-167.94.146.216 # censys.io
-167.94.146.217 # censys.io
-167.94.146.218 # censys.io
-167.94.146.219 # censys.io
-167.94.146.220 # censys.io
-167.94.146.221 # censys.io
-167.94.146.222 # censys.io
-167.94.146.223 # censys.io
-167.94.146.224 # censys.io
-167.94.146.225 # censys.io
-167.94.146.226 # censys.io
-167.94.146.227 # censys.io
-167.94.146.228 # censys.io
-167.94.146.229 # censys.io
-167.94.146.230 # censys.io
-167.94.146.231 # censys.io
-167.94.146.232 # censys.io
-167.94.146.233 # censys.io
-167.94.146.234 # censys.io
-167.94.146.235 # censys.io
-167.94.146.236 # censys.io
-167.94.146.237 # censys.io
-167.94.146.238 # censys.io
-167.94.146.239 # censys.io
-167.94.146.240 # censys.io
-167.94.146.241 # censys.io
-167.94.146.242 # censys.io
-167.94.146.243 # censys.io
-167.94.146.244 # censys.io
-167.94.146.245 # censys.io
-167.94.146.246 # censys.io
-167.94.146.247 # censys.io
-167.94.146.248 # censys.io
-167.94.146.249 # censys.io
-167.94.146.250 # censys.io
-167.94.146.251 # censys.io
-167.94.146.252 # censys.io
-167.94.146.253 # censys.io
-167.94.146.254 # censys.io
-167.248.133.1 # censys.io
-167.248.133.2 # censys.io
-167.248.133.3 # censys.io
-167.248.133.4 # censys.io
-167.248.133.5 # censys.io
-167.248.133.6 # censys.io
-167.248.133.7 # censys.io
-167.248.133.8 # censys.io
-167.248.133.9 # censys.io
-167.248.133.10 # censys.io
-167.248.133.11 # censys.io
-167.248.133.12 # censys.io
-167.248.133.13 # censys.io
-167.248.133.14 # censys.io
-167.248.133.15 # censys.io
-167.248.133.16 # censys.io
-167.248.133.17 # censys.io
-167.248.133.18 # censys.io
-167.248.133.19 # censys.io
-167.248.133.20 # censys.io
-167.248.133.21 # censys.io
-167.248.133.22 # censys.io
-167.248.133.23 # censys.io
-167.248.133.24 # censys.io
-167.248.133.25 # censys.io
-167.248.133.26 # censys.io
-167.248.133.27 # censys.io
-167.248.133.28 # censys.io
-167.248.133.29 # censys.io
-167.248.133.30 # censys.io
-167.248.133.31 # censys.io
-167.248.133.32 # censys.io
-167.248.133.33 # censys.io
-167.248.133.34 # censys.io
-167.248.133.35 # censys.io
-167.248.133.36 # censys.io
-167.248.133.37 # censys.io
-167.248.133.38 # censys.io
-167.248.133.39 # censys.io
-167.248.133.40 # censys.io
-167.248.133.41 # censys.io
-167.248.133.42 # censys.io
-167.248.133.43 # censys.io
-167.248.133.44 # censys.io
-167.248.133.45 # censys.io
-167.248.133.46 # censys.io
-167.248.133.47 # censys.io
-167.248.133.48 # censys.io
-167.248.133.49 # censys.io
-167.248.133.50 # censys.io
-167.248.133.51 # censys.io
-167.248.133.52 # censys.io
-167.248.133.53 # censys.io
-167.248.133.54 # censys.io
-167.248.133.55 # censys.io
-167.248.133.56 # censys.io
-167.248.133.57 # censys.io
-167.248.133.58 # censys.io
-167.248.133.59 # censys.io
-167.248.133.60 # censys.io
-167.248.133.61 # censys.io
-167.248.133.62 # censys.io
-167.248.133.63 # censys.io
-167.248.133.64 # censys.io
-167.248.133.65 # censys.io
-167.248.133.66 # censys.io
-167.248.133.67 # censys.io
-167.248.133.68 # censys.io
-167.248.133.69 # censys.io
-167.248.133.70 # censys.io
-167.248.133.71 # censys.io
-167.248.133.72 # censys.io
-167.248.133.73 # censys.io
-167.248.133.74 # censys.io
-167.248.133.75 # censys.io
-167.248.133.76 # censys.io
-167.248.133.77 # censys.io
-167.248.133.78 # censys.io
-167.248.133.79 # censys.io
-167.248.133.80 # censys.io
-167.248.133.81 # censys.io
-167.248.133.82 # censys.io
-167.248.133.83 # censys.io
-167.248.133.84 # censys.io
-167.248.133.85 # censys.io
-167.248.133.86 # censys.io
-167.248.133.87 # censys.io
-167.248.133.88 # censys.io
-167.248.133.89 # censys.io
-167.248.133.90 # censys.io
-167.248.133.91 # censys.io
-167.248.133.92 # censys.io
-167.248.133.93 # censys.io
-167.248.133.94 # censys.io
-167.248.133.95 # censys.io
-167.248.133.96 # censys.io
-167.248.133.97 # censys.io
-167.248.133.98 # censys.io
-167.248.133.99 # censys.io
-167.248.133.100 # censys.io
-167.248.133.101 # censys.io
-167.248.133.102 # censys.io
-167.248.133.103 # censys.io
-167.248.133.104 # censys.io
-167.248.133.105 # censys.io
-167.248.133.106 # censys.io
-167.248.133.107 # censys.io
-167.248.133.108 # censys.io
-167.248.133.109 # censys.io
-167.248.133.110 # censys.io
-167.248.133.111 # censys.io
-167.248.133.112 # censys.io
-167.248.133.113 # censys.io
-167.248.133.114 # censys.io
-167.248.133.115 # censys.io
-167.248.133.116 # censys.io
-167.248.133.117 # censys.io
-167.248.133.118 # censys.io
-167.248.133.119 # censys.io
-167.248.133.120 # censys.io
-167.248.133.121 # censys.io
-167.248.133.122 # censys.io
-167.248.133.123 # censys.io
-167.248.133.124 # censys.io
-167.248.133.125 # censys.io
-167.248.133.126 # censys.io
-167.248.133.127 # censys.io
-167.248.133.128 # censys.io
-167.248.133.129 # censys.io
-167.248.133.130 # censys.io
-167.248.133.131 # censys.io
-167.248.133.132 # censys.io
-167.248.133.133 # censys.io
-167.248.133.134 # censys.io
-167.248.133.135 # censys.io
-167.248.133.136 # censys.io
-167.248.133.137 # censys.io
-167.248.133.138 # censys.io
-167.248.133.139 # censys.io
-167.248.133.140 # censys.io
-167.248.133.141 # censys.io
-167.248.133.142 # censys.io
-167.248.133.143 # censys.io
-167.248.133.144 # censys.io
-167.248.133.145 # censys.io
-167.248.133.146 # censys.io
-167.248.133.147 # censys.io
-167.248.133.148 # censys.io
-167.248.133.149 # censys.io
-167.248.133.150 # censys.io
-167.248.133.151 # censys.io
-167.248.133.152 # censys.io
-167.248.133.153 # censys.io
-167.248.133.154 # censys.io
-167.248.133.155 # censys.io
-167.248.133.156 # censys.io
-167.248.133.157 # censys.io
-167.248.133.158 # censys.io
-167.248.133.159 # censys.io
-167.248.133.160 # censys.io
-167.248.133.161 # censys.io
-167.248.133.162 # censys.io
-167.248.133.163 # censys.io
-167.248.133.164 # censys.io
-167.248.133.165 # censys.io
-167.248.133.166 # censys.io
-167.248.133.167 # censys.io
-167.248.133.168 # censys.io
-167.248.133.169 # censys.io
-167.248.133.170 # censys.io
-167.248.133.171 # censys.io
-167.248.133.172 # censys.io
-167.248.133.173 # censys.io
-167.248.133.174 # censys.io
-167.248.133.175 # censys.io
-167.248.133.176 # censys.io
-167.248.133.177 # censys.io
-167.248.133.178 # censys.io
-167.248.133.179 # censys.io
-167.248.133.180 # censys.io
-167.248.133.181 # censys.io
-167.248.133.182 # censys.io
-167.248.133.183 # censys.io
-167.248.133.184 # censys.io
-167.248.133.185 # censys.io
-167.248.133.186 # censys.io
-167.248.133.187 # censys.io
-167.248.133.188 # censys.io
-167.248.133.189 # censys.io
-167.248.133.190 # censys.io
-167.248.133.191 # censys.io
-167.248.133.192 # censys.io
-167.248.133.193 # censys.io
-167.248.133.194 # censys.io
-167.248.133.195 # censys.io
-167.248.133.196 # censys.io
-167.248.133.197 # censys.io
-167.248.133.198 # censys.io
-167.248.133.199 # censys.io
-167.248.133.200 # censys.io
-167.248.133.201 # censys.io
-167.248.133.202 # censys.io
-167.248.133.203 # censys.io
-167.248.133.204 # censys.io
-167.248.133.205 # censys.io
-167.248.133.206 # censys.io
-167.248.133.207 # censys.io
-167.248.133.208 # censys.io
-167.248.133.209 # censys.io
-167.248.133.210 # censys.io
-167.248.133.211 # censys.io
-167.248.133.212 # censys.io
-167.248.133.213 # censys.io
-167.248.133.214 # censys.io
-167.248.133.215 # censys.io
-167.248.133.216 # censys.io
-167.248.133.217 # censys.io
-167.248.133.218 # censys.io
-167.248.133.219 # censys.io
-167.248.133.220 # censys.io
-167.248.133.221 # censys.io
-167.248.133.222 # censys.io
-167.248.133.223 # censys.io
-167.248.133.224 # censys.io
-167.248.133.225 # censys.io
-167.248.133.226 # censys.io
-167.248.133.227 # censys.io
-167.248.133.228 # censys.io
-167.248.133.229 # censys.io
-167.248.133.230 # censys.io
-167.248.133.231 # censys.io
-167.248.133.232 # censys.io
-167.248.133.233 # censys.io
-167.248.133.234 # censys.io
-167.248.133.235 # censys.io
-167.248.133.236 # censys.io
-167.248.133.237 # censys.io
-167.248.133.238 # censys.io
-167.248.133.239 # censys.io
-167.248.133.240 # censys.io
-167.248.133.241 # censys.io
-167.248.133.242 # censys.io
-167.248.133.243 # censys.io
-167.248.133.244 # censys.io
-167.248.133.245 # censys.io
-167.248.133.246 # censys.io
-167.248.133.247 # censys.io
-167.248.133.248 # censys.io
-167.248.133.249 # censys.io
-167.248.133.250 # censys.io
-167.248.133.251 # censys.io
-167.248.133.252 # censys.io
-167.248.133.253 # censys.io
-167.248.133.254 # censys.io
-192.35.168.1 # censys.io
-192.35.168.2 # censys.io
-192.35.168.3 # censys.io
-192.35.168.4 # censys.io
-192.35.168.5 # censys.io
-192.35.168.6 # censys.io
-192.35.168.7 # censys.io
-192.35.168.8 # censys.io
-192.35.168.9 # censys.io
-192.35.168.10 # censys.io
-192.35.168.11 # censys.io
-192.35.168.12 # censys.io
-192.35.168.13 # censys.io
-192.35.168.14 # censys.io
-192.35.168.15 # censys.io
-192.35.168.16 # censys.io
-192.35.168.17 # censys.io
-192.35.168.18 # censys.io
-192.35.168.19 # censys.io
-192.35.168.20 # censys.io
-192.35.168.21 # censys.io
-192.35.168.22 # censys.io
-192.35.168.23 # censys.io
-192.35.168.24 # censys.io
-192.35.168.25 # censys.io
-192.35.168.26 # censys.io
-192.35.168.27 # censys.io
-192.35.168.28 # censys.io
-192.35.168.29 # censys.io
-192.35.168.30 # censys.io
-192.35.168.31 # censys.io
-192.35.168.32 # censys.io
-192.35.168.33 # censys.io
-192.35.168.34 # censys.io
-192.35.168.35 # censys.io
-192.35.168.36 # censys.io
-192.35.168.37 # censys.io
-192.35.168.38 # censys.io
-192.35.168.39 # censys.io
-192.35.168.40 # censys.io
-192.35.168.41 # censys.io
-192.35.168.42 # censys.io
-192.35.168.43 # censys.io
-192.35.168.44 # censys.io
-192.35.168.45 # censys.io
-192.35.168.46 # censys.io
-192.35.168.47 # censys.io
-192.35.168.48 # censys.io
-192.35.168.49 # censys.io
-192.35.168.50 # censys.io
-192.35.168.51 # censys.io
-192.35.168.52 # censys.io
-192.35.168.53 # censys.io
-192.35.168.54 # censys.io
-192.35.168.55 # censys.io
-192.35.168.56 # censys.io
-192.35.168.57 # censys.io
-192.35.168.58 # censys.io
-192.35.168.59 # censys.io
-192.35.168.60 # censys.io
-192.35.168.61 # censys.io
-192.35.168.62 # censys.io
-192.35.168.63 # censys.io
-192.35.168.64 # censys.io
-192.35.168.65 # censys.io
-192.35.168.66 # censys.io
-192.35.168.67 # censys.io
-192.35.168.68 # censys.io
-192.35.168.69 # censys.io
-192.35.168.70 # censys.io
-192.35.168.71 # censys.io
-192.35.168.72 # censys.io
-192.35.168.73 # censys.io
-192.35.168.74 # censys.io
-192.35.168.75 # censys.io
-192.35.168.76 # censys.io
-192.35.168.77 # censys.io
-192.35.168.78 # censys.io
-192.35.168.79 # censys.io
-192.35.168.80 # censys.io
-192.35.168.81 # censys.io
-192.35.168.82 # censys.io
-192.35.168.83 # censys.io
-192.35.168.84 # censys.io
-192.35.168.85 # censys.io
-192.35.168.86 # censys.io
-192.35.168.87 # censys.io
-192.35.168.88 # censys.io
-192.35.168.89 # censys.io
-192.35.168.90 # censys.io
-192.35.168.91 # censys.io
-192.35.168.92 # censys.io
-192.35.168.93 # censys.io
-192.35.168.94 # censys.io
-192.35.168.95 # censys.io
-192.35.168.96 # censys.io
-192.35.168.97 # censys.io
-192.35.168.98 # censys.io
-192.35.168.99 # censys.io
-192.35.168.100 # censys.io
-192.35.168.101 # censys.io
-192.35.168.102 # censys.io
-192.35.168.103 # censys.io
-192.35.168.104 # censys.io
-192.35.168.105 # censys.io
-192.35.168.106 # censys.io
-192.35.168.107 # censys.io
-192.35.168.108 # censys.io
-192.35.168.109 # censys.io
-192.35.168.110 # censys.io
-192.35.168.111 # censys.io
-192.35.168.112 # censys.io
-192.35.168.113 # censys.io
-192.35.168.114 # censys.io
-192.35.168.115 # censys.io
-192.35.168.116 # censys.io
-192.35.168.117 # censys.io
-192.35.168.118 # censys.io
-192.35.168.119 # censys.io
-192.35.168.120 # censys.io
-192.35.168.121 # censys.io
-192.35.168.122 # censys.io
-192.35.168.123 # censys.io
-192.35.168.124 # censys.io
-192.35.168.125 # censys.io
-192.35.168.126 # censys.io
-192.35.168.127 # censys.io
-192.35.168.128 # censys.io
-192.35.168.129 # censys.io
-192.35.168.130 # censys.io
-192.35.168.131 # censys.io
-192.35.168.132 # censys.io
-192.35.168.133 # censys.io
-192.35.168.134 # censys.io
-192.35.168.135 # censys.io
-192.35.168.136 # censys.io
-192.35.168.137 # censys.io
-192.35.168.138 # censys.io
-192.35.168.139 # censys.io
-192.35.168.140 # censys.io
-192.35.168.141 # censys.io
-192.35.168.142 # censys.io
-192.35.168.143 # censys.io
-192.35.168.144 # censys.io
-192.35.168.145 # censys.io
-192.35.168.146 # censys.io
-192.35.168.147 # censys.io
-192.35.168.148 # censys.io
-192.35.168.149 # censys.io
-192.35.168.150 # censys.io
-192.35.168.151 # censys.io
-192.35.168.152 # censys.io
-192.35.168.153 # censys.io
-192.35.168.154 # censys.io
-192.35.168.155 # censys.io
-192.35.168.156 # censys.io
-192.35.168.157 # censys.io
-192.35.168.158 # censys.io
-192.35.168.159 # censys.io
-192.35.168.160 # censys.io
-192.35.168.161 # censys.io
-192.35.168.162 # censys.io
-192.35.168.163 # censys.io
-192.35.168.164 # censys.io
-192.35.168.165 # censys.io
-192.35.168.166 # censys.io
-192.35.168.167 # censys.io
-192.35.168.168 # censys.io
-192.35.168.169 # censys.io
-192.35.168.170 # censys.io
-192.35.168.171 # censys.io
-192.35.168.172 # censys.io
-192.35.168.173 # censys.io
-192.35.168.174 # censys.io
-192.35.168.175 # censys.io
-192.35.168.176 # censys.io
-192.35.168.177 # censys.io
-192.35.168.178 # censys.io
-192.35.168.179 # censys.io
-192.35.168.180 # censys.io
-192.35.168.181 # censys.io
-192.35.168.182 # censys.io
-192.35.168.183 # censys.io
-192.35.168.184 # censys.io
-192.35.168.185 # censys.io
-192.35.168.186 # censys.io
-192.35.168.187 # censys.io
-192.35.168.188 # censys.io
-192.35.168.189 # censys.io
-192.35.168.190 # censys.io
-192.35.168.191 # censys.io
-192.35.168.192 # censys.io
-192.35.168.193 # censys.io
-192.35.168.194 # censys.io
-192.35.168.195 # censys.io
-192.35.168.196 # censys.io
-192.35.168.197 # censys.io
-192.35.168.198 # censys.io
-192.35.168.199 # censys.io
-192.35.168.200 # censys.io
-192.35.168.201 # censys.io
-192.35.168.202 # censys.io
-192.35.168.203 # censys.io
-192.35.168.204 # censys.io
-192.35.168.205 # censys.io
-192.35.168.206 # censys.io
-192.35.168.207 # censys.io
-192.35.168.208 # censys.io
-192.35.168.209 # censys.io
-192.35.168.210 # censys.io
-192.35.168.211 # censys.io
-192.35.168.212 # censys.io
-192.35.168.213 # censys.io
-192.35.168.214 # censys.io
-192.35.168.215 # censys.io
-192.35.168.216 # censys.io
-192.35.168.217 # censys.io
-192.35.168.218 # censys.io
-192.35.168.219 # censys.io
-192.35.168.220 # censys.io
-192.35.168.221 # censys.io
-192.35.168.222 # censys.io
-192.35.168.223 # censys.io
-192.35.168.224 # censys.io
-192.35.168.225 # censys.io
-192.35.168.226 # censys.io
-192.35.168.227 # censys.io
-192.35.168.228 # censys.io
-192.35.168.229 # censys.io
-192.35.168.230 # censys.io
-192.35.168.231 # censys.io
-192.35.168.232 # censys.io
-192.35.168.233 # censys.io
-192.35.168.234 # censys.io
-192.35.168.235 # censys.io
-192.35.168.236 # censys.io
-192.35.168.237 # censys.io
-192.35.168.238 # censys.io
-192.35.168.239 # censys.io
-192.35.168.240 # censys.io
-192.35.168.241 # censys.io
-192.35.168.242 # censys.io
-192.35.168.243 # censys.io
-192.35.168.244 # censys.io
-192.35.168.245 # censys.io
-192.35.168.246 # censys.io
-192.35.168.247 # censys.io
-192.35.168.248 # censys.io
-192.35.168.249 # censys.io
-192.35.168.250 # censys.io
-192.35.168.251 # censys.io
-192.35.168.252 # censys.io
-192.35.168.253 # censys.io
-192.35.168.254 # censys.io
-192.35.168.255 # censys.io
-192.35.169.0 # censys.io
-192.35.169.1 # censys.io
-192.35.169.2 # censys.io
-192.35.169.3 # censys.io
-192.35.169.4 # censys.io
-192.35.169.5 # censys.io
-192.35.169.6 # censys.io
-192.35.169.7 # censys.io
-192.35.169.8 # censys.io
-192.35.169.9 # censys.io
-192.35.169.10 # censys.io
-192.35.169.11 # censys.io
-192.35.169.12 # censys.io
-192.35.169.13 # censys.io
-192.35.169.14 # censys.io
-192.35.169.15 # censys.io
-192.35.169.16 # censys.io
-192.35.169.17 # censys.io
-192.35.169.18 # censys.io
-192.35.169.19 # censys.io
-192.35.169.20 # censys.io
-192.35.169.21 # censys.io
-192.35.169.22 # censys.io
-192.35.169.23 # censys.io
-192.35.169.24 # censys.io
-192.35.169.25 # censys.io
-192.35.169.26 # censys.io
-192.35.169.27 # censys.io
-192.35.169.28 # censys.io
-192.35.169.29 # censys.io
-192.35.169.30 # censys.io
-192.35.169.31 # censys.io
-192.35.169.32 # censys.io
-192.35.169.33 # censys.io
-192.35.169.34 # censys.io
-192.35.169.35 # censys.io
-192.35.169.36 # censys.io
-192.35.169.37 # censys.io
-192.35.169.38 # censys.io
-192.35.169.39 # censys.io
-192.35.169.40 # censys.io
-192.35.169.41 # censys.io
-192.35.169.42 # censys.io
-192.35.169.43 # censys.io
-192.35.169.44 # censys.io
-192.35.169.45 # censys.io
-192.35.169.46 # censys.io
-192.35.169.47 # censys.io
-192.35.169.48 # censys.io
-192.35.169.49 # censys.io
-192.35.169.50 # censys.io
-192.35.169.51 # censys.io
-192.35.169.52 # censys.io
-192.35.169.53 # censys.io
-192.35.169.54 # censys.io
-192.35.169.55 # censys.io
-192.35.169.56 # censys.io
-192.35.169.57 # censys.io
-192.35.169.58 # censys.io
-192.35.169.59 # censys.io
-192.35.169.60 # censys.io
-192.35.169.61 # censys.io
-192.35.169.62 # censys.io
-192.35.169.63 # censys.io
-192.35.169.64 # censys.io
-192.35.169.65 # censys.io
-192.35.169.66 # censys.io
-192.35.169.67 # censys.io
-192.35.169.68 # censys.io
-192.35.169.69 # censys.io
-192.35.169.70 # censys.io
-192.35.169.71 # censys.io
-192.35.169.72 # censys.io
-192.35.169.73 # censys.io
-192.35.169.74 # censys.io
-192.35.169.75 # censys.io
-192.35.169.76 # censys.io
-192.35.169.77 # censys.io
-192.35.169.78 # censys.io
-192.35.169.79 # censys.io
-192.35.169.80 # censys.io
-192.35.169.81 # censys.io
-192.35.169.82 # censys.io
-192.35.169.83 # censys.io
-192.35.169.84 # censys.io
-192.35.169.85 # censys.io
-192.35.169.86 # censys.io
-192.35.169.87 # censys.io
-192.35.169.88 # censys.io
-192.35.169.89 # censys.io
-192.35.169.90 # censys.io
-192.35.169.91 # censys.io
-192.35.169.92 # censys.io
-192.35.169.93 # censys.io
-192.35.169.94 # censys.io
-192.35.169.95 # censys.io
-192.35.169.96 # censys.io
-192.35.169.97 # censys.io
-192.35.169.98 # censys.io
-192.35.169.99 # censys.io
-192.35.169.100 # censys.io
-192.35.169.101 # censys.io
-192.35.169.102 # censys.io
-192.35.169.103 # censys.io
-192.35.169.104 # censys.io
-192.35.169.105 # censys.io
-192.35.169.106 # censys.io
-192.35.169.107 # censys.io
-192.35.169.108 # censys.io
-192.35.169.109 # censys.io
-192.35.169.110 # censys.io
-192.35.169.111 # censys.io
-192.35.169.112 # censys.io
-192.35.169.113 # censys.io
-192.35.169.114 # censys.io
-192.35.169.115 # censys.io
-192.35.169.116 # censys.io
-192.35.169.117 # censys.io
-192.35.169.118 # censys.io
-192.35.169.119 # censys.io
-192.35.169.120 # censys.io
-192.35.169.121 # censys.io
-192.35.169.122 # censys.io
-192.35.169.123 # censys.io
-192.35.169.124 # censys.io
-192.35.169.125 # censys.io
-192.35.169.126 # censys.io
-192.35.169.127 # censys.io
-192.35.169.128 # censys.io
-192.35.169.129 # censys.io
-192.35.169.130 # censys.io
-192.35.169.131 # censys.io
-192.35.169.132 # censys.io
-192.35.169.133 # censys.io
-192.35.169.134 # censys.io
-192.35.169.135 # censys.io
-192.35.169.136 # censys.io
-192.35.169.137 # censys.io
-192.35.169.138 # censys.io
-192.35.169.139 # censys.io
-192.35.169.140 # censys.io
-192.35.169.141 # censys.io
-192.35.169.142 # censys.io
-192.35.169.143 # censys.io
-192.35.169.144 # censys.io
-192.35.169.145 # censys.io
-192.35.169.146 # censys.io
-192.35.169.147 # censys.io
-192.35.169.148 # censys.io
-192.35.169.149 # censys.io
-192.35.169.150 # censys.io
-192.35.169.151 # censys.io
-192.35.169.152 # censys.io
-192.35.169.153 # censys.io
-192.35.169.154 # censys.io
-192.35.169.155 # censys.io
-192.35.169.156 # censys.io
-192.35.169.157 # censys.io
-192.35.169.158 # censys.io
-192.35.169.159 # censys.io
-192.35.169.160 # censys.io
-192.35.169.161 # censys.io
-192.35.169.162 # censys.io
-192.35.169.163 # censys.io
-192.35.169.164 # censys.io
-192.35.169.165 # censys.io
-192.35.169.166 # censys.io
-192.35.169.167 # censys.io
-192.35.169.168 # censys.io
-192.35.169.169 # censys.io
-192.35.169.170 # censys.io
-192.35.169.171 # censys.io
-192.35.169.172 # censys.io
-192.35.169.173 # censys.io
-192.35.169.174 # censys.io
-192.35.169.175 # censys.io
-192.35.169.176 # censys.io
-192.35.169.177 # censys.io
-192.35.169.178 # censys.io
-192.35.169.179 # censys.io
-192.35.169.180 # censys.io
-192.35.169.181 # censys.io
-192.35.169.182 # censys.io
-192.35.169.183 # censys.io
-192.35.169.184 # censys.io
-192.35.169.185 # censys.io
-192.35.169.186 # censys.io
-192.35.169.187 # censys.io
-192.35.169.188 # censys.io
-192.35.169.189 # censys.io
-192.35.169.190 # censys.io
-192.35.169.191 # censys.io
-192.35.169.192 # censys.io
-192.35.169.193 # censys.io
-192.35.169.194 # censys.io
-192.35.169.195 # censys.io
-192.35.169.196 # censys.io
-192.35.169.197 # censys.io
-192.35.169.198 # censys.io
-192.35.169.199 # censys.io
-192.35.169.200 # censys.io
-192.35.169.201 # censys.io
-192.35.169.202 # censys.io
-192.35.169.203 # censys.io
-192.35.169.204 # censys.io
-192.35.169.205 # censys.io
-192.35.169.206 # censys.io
-192.35.169.207 # censys.io
-192.35.169.208 # censys.io
-192.35.169.209 # censys.io
-192.35.169.210 # censys.io
-192.35.169.211 # censys.io
-192.35.169.212 # censys.io
-192.35.169.213 # censys.io
-192.35.169.214 # censys.io
-192.35.169.215 # censys.io
-192.35.169.216 # censys.io
-192.35.169.217 # censys.io
-192.35.169.218 # censys.io
-192.35.169.219 # censys.io
-192.35.169.220 # censys.io
-192.35.169.221 # censys.io
-192.35.169.222 # censys.io
-192.35.169.223 # censys.io
-192.35.169.224 # censys.io
-192.35.169.225 # censys.io
-192.35.169.226 # censys.io
-192.35.169.227 # censys.io
-192.35.169.228 # censys.io
-192.35.169.229 # censys.io
-192.35.169.230 # censys.io
-192.35.169.231 # censys.io
-192.35.169.232 # censys.io
-192.35.169.233 # censys.io
-192.35.169.234 # censys.io
-192.35.169.235 # censys.io
-192.35.169.236 # censys.io
-192.35.169.237 # censys.io
-192.35.169.238 # censys.io
-192.35.169.239 # censys.io
-192.35.169.240 # censys.io
-192.35.169.241 # censys.io
-192.35.169.242 # censys.io
-192.35.169.243 # censys.io
-192.35.169.244 # censys.io
-192.35.169.245 # censys.io
-192.35.169.246 # censys.io
-192.35.169.247 # censys.io
-192.35.169.248 # censys.io
-192.35.169.249 # censys.io
-192.35.169.250 # censys.io
-192.35.169.251 # censys.io
-192.35.169.252 # censys.io
-192.35.169.253 # censys.io
-192.35.169.254 # censys.io
-
-# Reference: https://twitter.com/bad_packets/status/1178208013389189121
-
-185.216.140.180 # NYU Osiris Laboratory
-
-185.216.140.249 # scanner.openportstats.com
-185.216.140.185 # scanner.openportstats.com
-185.216.140.35 # scanner.openportstats.com
-185.216.140.32 # scanner.openportstats.com
-185.216.140.27 # scanner.openportstats.com
-94.102.51.31 # scanner.openportstats.com
-94.102.49.159 # scanner.openportstats.com
-94.102.49.97 # scanner.openportstats.com
-94.102.49.57 # scanner.openportstats.com
-93.174.93.27 # scanner.openportstats.com
-89.248.172.20 # scanner.openportstats.com
-89.248.169.2 # scanner.openportstats.com
-89.248.168.226 # scanner.openportstats.com
-89.248.168.225 # scanner.openportstats.com
-89.248.168.223 # scanner.openportstats.com
-89.248.168.222 # scanner.openportstats.com
-89.248.168.221 # scanner.openportstats.com
-89.248.168.197 # scanner.openportstats.com
-89.248.168.129 # scanner.openportstats.com
-89.248.168.62 # scanner.openportstats.com
-89.248.162.161 # scanner.openportstats.com
-89.248.160.193 # scanner.openportstats.com
-80.82.78.27 # scanner.openportstats.com
-80.82.77.244 # scanner.openportstats.com
-80.82.77.232 # scanner.openportstats.com
-80.82.77.215 # scanner.openportstats.com
-80.82.77.146 # scanner.openportstats.com
-80.82.77.85 # scanner.openportstats.com
-80.82.70.217 # scanner.openportstats.com
-80.82.70.168 # scanner.openportstats.com
-80.82.65.201 # scanner.openportstats.com
-80.82.65.62 # scanner.openportstats.com
-
-# Reference: http://outspoken.ca/
-
-172.105.231.199 # outspoken.ca
-
-# Reference: http://phenome.ca/
-
-172.105.23.36 # phenome.ca
-
-# Reference: http://ltx71.com/
-
-35.239.58.193 # ltx71
-35.202.2.1 # ltx71
-
-# Reference: https://twitter.com/campuscodi/status/1263486708110278658
-# Reference: https://www.cert.ssi.gouv.fr/scans/
-
-185.50.66.1 # ANSSI
-92.154.95.236 # ANSSI
-
-# Reference: https://community.greenbone.net/t/is-greenbone-hacking-me/1134
-
-212.95.124.190 # Greenbone
-
-# Reference: https://twitter.com/Gi7w0rm/status/1473272489467944963
-# Reference: https://twitter.com/1ZRR4H/status/1473277092339097614
-
-167.71.13.196 # leakix.net
-
-# Reference: https://twitter.com/James_inthe_box/status/1470408273727668225
-# Reference: https://www.alphastrike.io/log4j/
-
-45.83.64.0
-45.83.64.1
-45.83.64.2
-45.83.64.3
-45.83.64.4
-45.83.64.5
-45.83.64.6
-45.83.64.7
-45.83.64.8
-45.83.64.9
-45.83.64.10
-45.83.64.11
-45.83.64.12
-45.83.64.13
-45.83.64.14
-45.83.64.15
-45.83.64.16
-45.83.64.17
-45.83.64.18
-45.83.64.19
-45.83.64.20
-45.83.64.21
-45.83.64.22
-45.83.64.23
-45.83.64.24
-45.83.64.25
-45.83.64.26
-45.83.64.27
-45.83.64.28
-45.83.64.29
-45.83.64.30
-45.83.64.31
-45.83.64.32
-45.83.64.33
-45.83.64.34
-45.83.64.35
-45.83.64.36
-45.83.64.37
-45.83.64.38
-45.83.64.39
-45.83.64.40
-45.83.64.41
-45.83.64.42
-45.83.64.43
-45.83.64.44
-45.83.64.45
-45.83.64.46
-45.83.64.47
-45.83.64.48
-45.83.64.49
-45.83.64.50
-45.83.64.51
-45.83.64.52
-45.83.64.53
-45.83.64.54
-45.83.64.55
-45.83.64.56
-45.83.64.57
-45.83.64.58
-45.83.64.59
-45.83.64.60
-45.83.64.61
-45.83.64.62
-45.83.64.63
-45.83.64.64
-45.83.64.65
-45.83.64.66
-45.83.64.67
-45.83.64.68
-45.83.64.69
-45.83.64.70
-45.83.64.71
-45.83.64.72
-45.83.64.73
-45.83.64.74
-45.83.64.75
-45.83.64.76
-45.83.64.77
-45.83.64.78
-45.83.64.79
-45.83.64.80
-45.83.64.81
-45.83.64.82
-45.83.64.83
-45.83.64.84
-45.83.64.85
-45.83.64.86
-45.83.64.87
-45.83.64.88
-45.83.64.89
-45.83.64.90
-45.83.64.91
-45.83.64.92
-45.83.64.93
-45.83.64.94
-45.83.64.95
-45.83.64.96
-45.83.64.97
-45.83.64.98
-45.83.64.99
-45.83.64.100
-45.83.64.101
-45.83.64.102
-45.83.64.103
-45.83.64.104
-45.83.64.105
-45.83.64.106
-45.83.64.107
-45.83.64.108
-45.83.64.109
-45.83.64.110
-45.83.64.111
-45.83.64.112
-45.83.64.113
-45.83.64.114
-45.83.64.115
-45.83.64.116
-45.83.64.117
-45.83.64.118
-45.83.64.119
-45.83.64.120
-45.83.64.121
-45.83.64.122
-45.83.64.123
-45.83.64.124
-45.83.64.125
-45.83.64.126
-45.83.64.127
-45.83.64.128
-45.83.64.129
-45.83.64.130
-45.83.64.131
-45.83.64.132
-45.83.64.133
-45.83.64.134
-45.83.64.135
-45.83.64.136
-45.83.64.137
-45.83.64.138
-45.83.64.139
-45.83.64.140
-45.83.64.141
-45.83.64.142
-45.83.64.143
-45.83.64.144
-45.83.64.145
-45.83.64.146
-45.83.64.147
-45.83.64.148
-45.83.64.149
-45.83.64.150
-45.83.64.151
-45.83.64.152
-45.83.64.153
-45.83.64.154
-45.83.64.155
-45.83.64.156
-45.83.64.157
-45.83.64.158
-45.83.64.159
-45.83.64.160
-45.83.64.161
-45.83.64.162
-45.83.64.163
-45.83.64.164
-45.83.64.165
-45.83.64.166
-45.83.64.167
-45.83.64.168
-45.83.64.169
-45.83.64.170
-45.83.64.171
-45.83.64.172
-45.83.64.173
-45.83.64.174
-45.83.64.175
-45.83.64.176
-45.83.64.177
-45.83.64.178
-45.83.64.179
-45.83.64.180
-45.83.64.181
-45.83.64.182
-45.83.64.183
-45.83.64.184
-45.83.64.185
-45.83.64.186
-45.83.64.187
-45.83.64.188
-45.83.64.189
-45.83.64.190
-45.83.64.191
-45.83.64.192
-45.83.64.193
-45.83.64.194
-45.83.64.195
-45.83.64.196
-45.83.64.197
-45.83.64.198
-45.83.64.199
-45.83.64.200
-45.83.64.201
-45.83.64.202
-45.83.64.203
-45.83.64.204
-45.83.64.205
-45.83.64.206
-45.83.64.207
-45.83.64.208
-45.83.64.209
-45.83.64.210
-45.83.64.211
-45.83.64.212
-45.83.64.213
-45.83.64.214
-45.83.64.215
-45.83.64.216
-45.83.64.217
-45.83.64.218
-45.83.64.219
-45.83.64.220
-45.83.64.221
-45.83.64.222
-45.83.64.223
-45.83.64.224
-45.83.64.225
-45.83.64.226
-45.83.64.227
-45.83.64.228
-45.83.64.229
-45.83.64.230
-45.83.64.231
-45.83.64.232
-45.83.64.233
-45.83.64.234
-45.83.64.235
-45.83.64.236
-45.83.64.237
-45.83.64.238
-45.83.64.239
-45.83.64.240
-45.83.64.241
-45.83.64.242
-45.83.64.243
-45.83.64.244
-45.83.64.245
-45.83.64.246
-45.83.64.247
-45.83.64.248
-45.83.64.249
-45.83.64.250
-45.83.64.251
-45.83.64.252
-45.83.64.253
-45.83.64.254
-45.83.64.255
-45.83.65.0
-45.83.65.1
-45.83.65.2
-45.83.65.3
-45.83.65.4
-45.83.65.5
-45.83.65.6
-45.83.65.7
-45.83.65.8
-45.83.65.9
-45.83.65.10
-45.83.65.11
-45.83.65.12
-45.83.65.13
-45.83.65.14
-45.83.65.15
-45.83.65.16
-45.83.65.17
-45.83.65.18
-45.83.65.19
-45.83.65.20
-45.83.65.21
-45.83.65.22
-45.83.65.23
-45.83.65.24
-45.83.65.25
-45.83.65.26
-45.83.65.27
-45.83.65.28
-45.83.65.29
-45.83.65.30
-45.83.65.31
-45.83.65.32
-45.83.65.33
-45.83.65.34
-45.83.65.35
-45.83.65.36
-45.83.65.37
-45.83.65.38
-45.83.65.39
-45.83.65.40
-45.83.65.41
-45.83.65.42
-45.83.65.43
-45.83.65.44
-45.83.65.45
-45.83.65.46
-45.83.65.47
-45.83.65.48
-45.83.65.49
-45.83.65.50
-45.83.65.51
-45.83.65.52
-45.83.65.53
-45.83.65.54
-45.83.65.55
-45.83.65.56
-45.83.65.57
-45.83.65.58
-45.83.65.59
-45.83.65.60
-45.83.65.61
-45.83.65.62
-45.83.65.63
-45.83.65.64
-45.83.65.65
-45.83.65.66
-45.83.65.67
-45.83.65.68
-45.83.65.69
-45.83.65.70
-45.83.65.71
-45.83.65.72
-45.83.65.73
-45.83.65.74
-45.83.65.75
-45.83.65.76
-45.83.65.77
-45.83.65.78
-45.83.65.79
-45.83.65.80
-45.83.65.81
-45.83.65.82
-45.83.65.83
-45.83.65.84
-45.83.65.85
-45.83.65.86
-45.83.65.87
-45.83.65.88
-45.83.65.89
-45.83.65.90
-45.83.65.91
-45.83.65.92
-45.83.65.93
-45.83.65.94
-45.83.65.95
-45.83.65.96
-45.83.65.97
-45.83.65.98
-45.83.65.99
-45.83.65.100
-45.83.65.101
-45.83.65.102
-45.83.65.103
-45.83.65.104
-45.83.65.105
-45.83.65.106
-45.83.65.107
-45.83.65.108
-45.83.65.109
-45.83.65.110
-45.83.65.111
-45.83.65.112
-45.83.65.113
-45.83.65.114
-45.83.65.115
-45.83.65.116
-45.83.65.117
-45.83.65.118
-45.83.65.119
-45.83.65.120
-45.83.65.121
-45.83.65.122
-45.83.65.123
-45.83.65.124
-45.83.65.125
-45.83.65.126
-45.83.65.127
-45.83.65.128
-45.83.65.129
-45.83.65.130
-45.83.65.131
-45.83.65.132
-45.83.65.133
-45.83.65.134
-45.83.65.135
-45.83.65.136
-45.83.65.137
-45.83.65.138
-45.83.65.139
-45.83.65.140
-45.83.65.141
-45.83.65.142
-45.83.65.143
-45.83.65.144
-45.83.65.145
-45.83.65.146
-45.83.65.147
-45.83.65.148
-45.83.65.149
-45.83.65.150
-45.83.65.151
-45.83.65.152
-45.83.65.153
-45.83.65.154
-45.83.65.155
-45.83.65.156
-45.83.65.157
-45.83.65.158
-45.83.65.159
-45.83.65.160
-45.83.65.161
-45.83.65.162
-45.83.65.163
-45.83.65.164
-45.83.65.165
-45.83.65.166
-45.83.65.167
-45.83.65.168
-45.83.65.169
-45.83.65.170
-45.83.65.171
-45.83.65.172
-45.83.65.173
-45.83.65.174
-45.83.65.175
-45.83.65.176
-45.83.65.177
-45.83.65.178
-45.83.65.179
-45.83.65.180
-45.83.65.181
-45.83.65.182
-45.83.65.183
-45.83.65.184
-45.83.65.185
-45.83.65.186
-45.83.65.187
-45.83.65.188
-45.83.65.189
-45.83.65.190
-45.83.65.191
-45.83.65.192
-45.83.65.193
-45.83.65.194
-45.83.65.195
-45.83.65.196
-45.83.65.197
-45.83.65.198
-45.83.65.199
-45.83.65.200
-45.83.65.201
-45.83.65.202
-45.83.65.203
-45.83.65.204
-45.83.65.205
-45.83.65.206
-45.83.65.207
-45.83.65.208
-45.83.65.209
-45.83.65.210
-45.83.65.211
-45.83.65.212
-45.83.65.213
-45.83.65.214
-45.83.65.215
-45.83.65.216
-45.83.65.217
-45.83.65.218
-45.83.65.219
-45.83.65.220
-45.83.65.221
-45.83.65.222
-45.83.65.223
-45.83.65.224
-45.83.65.225
-45.83.65.226
-45.83.65.227
-45.83.65.228
-45.83.65.229
-45.83.65.230
-45.83.65.231
-45.83.65.232
-45.83.65.233
-45.83.65.234
-45.83.65.235
-45.83.65.236
-45.83.65.237
-45.83.65.238
-45.83.65.239
-45.83.65.240
-45.83.65.241
-45.83.65.242
-45.83.65.243
-45.83.65.244
-45.83.65.245
-45.83.65.246
-45.83.65.247
-45.83.65.248
-45.83.65.249
-45.83.65.250
-45.83.65.251
-45.83.65.252
-45.83.65.253
-45.83.65.254
-45.83.65.255
-45.83.66.0
-45.83.66.1
-45.83.66.2
-45.83.66.3
-45.83.66.4
-45.83.66.5
-45.83.66.6
-45.83.66.7
-45.83.66.8
-45.83.66.9
-45.83.66.10
-45.83.66.11
-45.83.66.12
-45.83.66.13
-45.83.66.14
-45.83.66.15
-45.83.66.16
-45.83.66.17
-45.83.66.18
-45.83.66.19
-45.83.66.20
-45.83.66.21
-45.83.66.22
-45.83.66.23
-45.83.66.24
-45.83.66.25
-45.83.66.26
-45.83.66.27
-45.83.66.28
-45.83.66.29
-45.83.66.30
-45.83.66.31
-45.83.66.32
-45.83.66.33
-45.83.66.34
-45.83.66.35
-45.83.66.36
-45.83.66.37
-45.83.66.38
-45.83.66.39
-45.83.66.40
-45.83.66.41
-45.83.66.42
-45.83.66.43
-45.83.66.44
-45.83.66.45
-45.83.66.46
-45.83.66.47
-45.83.66.48
-45.83.66.49
-45.83.66.50
-45.83.66.51
-45.83.66.52
-45.83.66.53
-45.83.66.54
-45.83.66.55
-45.83.66.56
-45.83.66.57
-45.83.66.58
-45.83.66.59
-45.83.66.60
-45.83.66.61
-45.83.66.62
-45.83.66.63
-45.83.66.64
-45.83.66.65
-45.83.66.66
-45.83.66.67
-45.83.66.68
-45.83.66.69
-45.83.66.70
-45.83.66.71
-45.83.66.72
-45.83.66.73
-45.83.66.74
-45.83.66.75
-45.83.66.76
-45.83.66.77
-45.83.66.78
-45.83.66.79
-45.83.66.80
-45.83.66.81
-45.83.66.82
-45.83.66.83
-45.83.66.84
-45.83.66.85
-45.83.66.86
-45.83.66.87
-45.83.66.88
-45.83.66.89
-45.83.66.90
-45.83.66.91
-45.83.66.92
-45.83.66.93
-45.83.66.94
-45.83.66.95
-45.83.66.96
-45.83.66.97
-45.83.66.98
-45.83.66.99
-45.83.66.100
-45.83.66.101
-45.83.66.102
-45.83.66.103
-45.83.66.104
-45.83.66.105
-45.83.66.106
-45.83.66.107
-45.83.66.108
-45.83.66.109
-45.83.66.110
-45.83.66.111
-45.83.66.112
-45.83.66.113
-45.83.66.114
-45.83.66.115
-45.83.66.116
-45.83.66.117
-45.83.66.118
-45.83.66.119
-45.83.66.120
-45.83.66.121
-45.83.66.122
-45.83.66.123
-45.83.66.124
-45.83.66.125
-45.83.66.126
-45.83.66.127
-45.83.66.128
-45.83.66.129
-45.83.66.130
-45.83.66.131
-45.83.66.132
-45.83.66.133
-45.83.66.134
-45.83.66.135
-45.83.66.136
-45.83.66.137
-45.83.66.138
-45.83.66.139
-45.83.66.140
-45.83.66.141
-45.83.66.142
-45.83.66.143
-45.83.66.144
-45.83.66.145
-45.83.66.146
-45.83.66.147
-45.83.66.148
-45.83.66.149
-45.83.66.150
-45.83.66.151
-45.83.66.152
-45.83.66.153
-45.83.66.154
-45.83.66.155
-45.83.66.156
-45.83.66.157
-45.83.66.158
-45.83.66.159
-45.83.66.160
-45.83.66.161
-45.83.66.162
-45.83.66.163
-45.83.66.164
-45.83.66.165
-45.83.66.166
-45.83.66.167
-45.83.66.168
-45.83.66.169
-45.83.66.170
-45.83.66.171
-45.83.66.172
-45.83.66.173
-45.83.66.174
-45.83.66.175
-45.83.66.176
-45.83.66.177
-45.83.66.178
-45.83.66.179
-45.83.66.180
-45.83.66.181
-45.83.66.182
-45.83.66.183
-45.83.66.184
-45.83.66.185
-45.83.66.186
-45.83.66.187
-45.83.66.188
-45.83.66.189
-45.83.66.190
-45.83.66.191
-45.83.66.192
-45.83.66.193
-45.83.66.194
-45.83.66.195
-45.83.66.196
-45.83.66.197
-45.83.66.198
-45.83.66.199
-45.83.66.200
-45.83.66.201
-45.83.66.202
-45.83.66.203
-45.83.66.204
-45.83.66.205
-45.83.66.206
-45.83.66.207
-45.83.66.208
-45.83.66.209
-45.83.66.210
-45.83.66.211
-45.83.66.212
-45.83.66.213
-45.83.66.214
-45.83.66.215
-45.83.66.216
-45.83.66.217
-45.83.66.218
-45.83.66.219
-45.83.66.220
-45.83.66.221
-45.83.66.222
-45.83.66.223
-45.83.66.224
-45.83.66.225
-45.83.66.226
-45.83.66.227
-45.83.66.228
-45.83.66.229
-45.83.66.230
-45.83.66.231
-45.83.66.232
-45.83.66.233
-45.83.66.234
-45.83.66.235
-45.83.66.236
-45.83.66.237
-45.83.66.238
-45.83.66.239
-45.83.66.240
-45.83.66.241
-45.83.66.242
-45.83.66.243
-45.83.66.244
-45.83.66.245
-45.83.66.246
-45.83.66.247
-45.83.66.248
-45.83.66.249
-45.83.66.250
-45.83.66.251
-45.83.66.252
-45.83.66.253
-45.83.66.254
-45.83.66.255
-45.83.67.0
-45.83.67.1
-45.83.67.2
-45.83.67.3
-45.83.67.4
-45.83.67.5
-45.83.67.6
-45.83.67.7
-45.83.67.8
-45.83.67.9
-45.83.67.10
-45.83.67.11
-45.83.67.12
-45.83.67.13
-45.83.67.14
-45.83.67.15
-45.83.67.16
-45.83.67.17
-45.83.67.18
-45.83.67.19
-45.83.67.20
-45.83.67.21
-45.83.67.22
-45.83.67.23
-45.83.67.24
-45.83.67.25
-45.83.67.26
-45.83.67.27
-45.83.67.28
-45.83.67.29
-45.83.67.30
-45.83.67.31
-45.83.67.32
-45.83.67.33
-45.83.67.34
-45.83.67.35
-45.83.67.36
-45.83.67.37
-45.83.67.38
-45.83.67.39
-45.83.67.40
-45.83.67.41
-45.83.67.42
-45.83.67.43
-45.83.67.44
-45.83.67.45
-45.83.67.46
-45.83.67.47
-45.83.67.48
-45.83.67.49
-45.83.67.50
-45.83.67.51
-45.83.67.52
-45.83.67.53
-45.83.67.54
-45.83.67.55
-45.83.67.56
-45.83.67.57
-45.83.67.58
-45.83.67.59
-45.83.67.60
-45.83.67.61
-45.83.67.62
-45.83.67.63
-45.83.67.64
-45.83.67.65
-45.83.67.66
-45.83.67.67
-45.83.67.68
-45.83.67.69
-45.83.67.70
-45.83.67.71
-45.83.67.72
-45.83.67.73
-45.83.67.74
-45.83.67.75
-45.83.67.76
-45.83.67.77
-45.83.67.78
-45.83.67.79
-45.83.67.80
-45.83.67.81
-45.83.67.82
-45.83.67.83
-45.83.67.84
-45.83.67.85
-45.83.67.86
-45.83.67.87
-45.83.67.88
-45.83.67.89
-45.83.67.90
-45.83.67.91
-45.83.67.92
-45.83.67.93
-45.83.67.94
-45.83.67.95
-45.83.67.96
-45.83.67.97
-45.83.67.98
-45.83.67.99
-45.83.67.100
-45.83.67.101
-45.83.67.102
-45.83.67.103
-45.83.67.104
-45.83.67.105
-45.83.67.106
-45.83.67.107
-45.83.67.108
-45.83.67.109
-45.83.67.110
-45.83.67.111
-45.83.67.112
-45.83.67.113
-45.83.67.114
-45.83.67.115
-45.83.67.116
-45.83.67.117
-45.83.67.118
-45.83.67.119
-45.83.67.120
-45.83.67.121
-45.83.67.122
-45.83.67.123
-45.83.67.124
-45.83.67.125
-45.83.67.126
-45.83.67.127
-45.83.67.128
-45.83.67.129
-45.83.67.130
-45.83.67.131
-45.83.67.132
-45.83.67.133
-45.83.67.134
-45.83.67.135
-45.83.67.136
-45.83.67.137
-45.83.67.138
-45.83.67.139
-45.83.67.140
-45.83.67.141
-45.83.67.142
-45.83.67.143
-45.83.67.144
-45.83.67.145
-45.83.67.146
-45.83.67.147
-45.83.67.148
-45.83.67.149
-45.83.67.150
-45.83.67.151
-45.83.67.152
-45.83.67.153
-45.83.67.154
-45.83.67.155
-45.83.67.156
-45.83.67.157
-45.83.67.158
-45.83.67.159
-45.83.67.160
-45.83.67.161
-45.83.67.162
-45.83.67.163
-45.83.67.164
-45.83.67.165
-45.83.67.166
-45.83.67.167
-45.83.67.168
-45.83.67.169
-45.83.67.170
-45.83.67.171
-45.83.67.172
-45.83.67.173
-45.83.67.174
-45.83.67.175
-45.83.67.176
-45.83.67.177
-45.83.67.178
-45.83.67.179
-45.83.67.180
-45.83.67.181
-45.83.67.182
-45.83.67.183
-45.83.67.184
-45.83.67.185
-45.83.67.186
-45.83.67.187
-45.83.67.188
-45.83.67.189
-45.83.67.190
-45.83.67.191
-45.83.67.192
-45.83.67.193
-45.83.67.194
-45.83.67.195
-45.83.67.196
-45.83.67.197
-45.83.67.198
-45.83.67.199
-45.83.67.200
-45.83.67.201
-45.83.67.202
-45.83.67.203
-45.83.67.204
-45.83.67.205
-45.83.67.206
-45.83.67.207
-45.83.67.208
-45.83.67.209
-45.83.67.210
-45.83.67.211
-45.83.67.212
-45.83.67.213
-45.83.67.214
-45.83.67.215
-45.83.67.216
-45.83.67.217
-45.83.67.218
-45.83.67.219
-45.83.67.220
-45.83.67.221
-45.83.67.222
-45.83.67.223
-45.83.67.224
-45.83.67.225
-45.83.67.226
-45.83.67.227
-45.83.67.228
-45.83.67.229
-45.83.67.230
-45.83.67.231
-45.83.67.232
-45.83.67.233
-45.83.67.234
-45.83.67.235
-45.83.67.236
-45.83.67.237
-45.83.67.238
-45.83.67.239
-45.83.67.240
-45.83.67.241
-45.83.67.242
-45.83.67.243
-45.83.67.244
-45.83.67.245
-45.83.67.246
-45.83.67.247
-45.83.67.248
-45.83.67.249
-45.83.67.250
-45.83.67.251
-45.83.67.252
-45.83.67.253
-45.83.67.254
-45.83.67.255
-
-# Reference: https://blog.nintechnet.com/how-to-block-w00tw00t-at-isc-sans-dfind-and-other-web-vulnerability-scanners/
-# Reference: https://tehtris.com/en/blog/honeypots-activity-of-the-week-48
-# Reference: https://www.webhostingdiscussion.net/blog/get-w00tw00t-at-isc-sans-http1-1/
-
-/w00tw00t.at.ISC.SANS.DFind:)
-
-# Reference: https://tehtris.com/en/blog/honeypots-activity-of-the-week-51
-
-/w00tw00t.at.blackhats.romanian.anti-sec:)
-
-# Reference: https://twitter.com/r3dbU7z/status/1633406502747754498
-
-193.142.146.101
-193.149.176.207
-92.118.39.82
-
-# Reference: https://github.com/stamparm/maltrail/issues/19197
-# Reference: https://github.com/datacenters-network/security/commit/fe8fb8b5a55df1292bbbf71917ec42b5caf9d6ae
-
-94.102.61.0 # security.criminalip.com
-94.102.61.1 # security.criminalip.com
-94.102.61.2 # security.criminalip.com
-94.102.61.3 # security.criminalip.com
-94.102.61.4 # security.criminalip.com
-94.102.61.5 # security.criminalip.com
-94.102.61.6 # security.criminalip.com
-94.102.61.7 # security.criminalip.com
-94.102.61.8 # security.criminalip.com
-94.102.61.9 # security.criminalip.com
-94.102.61.10 # security.criminalip.com
-94.102.61.11 # security.criminalip.com
-94.102.61.12 # security.criminalip.com
-94.102.61.13 # security.criminalip.com
-94.102.61.14 # security.criminalip.com
-94.102.61.15 # security.criminalip.com
-94.102.61.16 # security.criminalip.com
-94.102.61.17 # security.criminalip.com
-94.102.61.18 # security.criminalip.com
-94.102.61.19 # security.criminalip.com
-94.102.61.20 # security.criminalip.com
-94.102.61.21 # security.criminalip.com
-94.102.61.22 # security.criminalip.com
-94.102.61.23 # security.criminalip.com
-94.102.61.24 # security.criminalip.com
-94.102.61.25 # security.criminalip.com
-94.102.61.26 # security.criminalip.com
-94.102.61.27 # security.criminalip.com
-94.102.61.28 # security.criminalip.com
-94.102.61.29 # security.criminalip.com
-94.102.61.30 # security.criminalip.com
-94.102.61.31 # security.criminalip.com
-94.102.61.32 # security.criminalip.com
-94.102.61.33 # security.criminalip.com
-94.102.61.34 # security.criminalip.com
-94.102.61.35 # security.criminalip.com
-94.102.61.36 # security.criminalip.com
-94.102.61.37 # security.criminalip.com
-94.102.61.38 # security.criminalip.com
-94.102.61.39 # security.criminalip.com
-94.102.61.40 # security.criminalip.com
-94.102.61.41 # security.criminalip.com
-94.102.61.42 # security.criminalip.com
-94.102.61.43 # security.criminalip.com
-94.102.61.44 # security.criminalip.com
-94.102.61.45 # security.criminalip.com
-94.102.61.46 # security.criminalip.com
-94.102.61.47 # security.criminalip.com
-94.102.61.48 # security.criminalip.com
-94.102.61.49 # security.criminalip.com
-94.102.61.50 # security.criminalip.com
-94.102.61.51 # security.criminalip.com
-94.102.61.52 # security.criminalip.com
-94.102.61.53 # security.criminalip.com
-94.102.61.54 # security.criminalip.com
-94.102.61.55 # security.criminalip.com
-94.102.61.56 # security.criminalip.com
-94.102.61.57 # security.criminalip.com
-94.102.61.58 # security.criminalip.com
-94.102.61.59 # security.criminalip.com
-94.102.61.60 # security.criminalip.com
-94.102.61.61 # security.criminalip.com
-94.102.61.62 # security.criminalip.com
-94.102.61.63 # security.criminalip.com
-94.102.61.64 # security.criminalip.com
-94.102.61.65 # security.criminalip.com
-94.102.61.66 # security.criminalip.com
-94.102.61.67 # security.criminalip.com
-94.102.61.68 # security.criminalip.com
-94.102.61.69 # security.criminalip.com
-94.102.61.70 # security.criminalip.com
-94.102.61.71 # security.criminalip.com
-94.102.61.72 # security.criminalip.com
-94.102.61.73 # security.criminalip.com
-94.102.61.74 # security.criminalip.com
-94.102.61.75 # security.criminalip.com
-94.102.61.76 # security.criminalip.com
-94.102.61.77 # security.criminalip.com
-94.102.61.78 # security.criminalip.com
-94.102.61.79 # security.criminalip.com
-94.102.61.80 # security.criminalip.com
-94.102.61.81 # security.criminalip.com
-94.102.61.82 # security.criminalip.com
-94.102.61.83 # security.criminalip.com
-94.102.61.84 # security.criminalip.com
-94.102.61.85 # security.criminalip.com
-94.102.61.86 # security.criminalip.com
-94.102.61.87 # security.criminalip.com
-94.102.61.88 # security.criminalip.com
-94.102.61.89 # security.criminalip.com
-94.102.61.90 # security.criminalip.com
-94.102.61.91 # security.criminalip.com
-94.102.61.92 # security.criminalip.com
-94.102.61.93 # security.criminalip.com
-94.102.61.94 # security.criminalip.com
-94.102.61.95 # security.criminalip.com
-94.102.61.96 # security.criminalip.com
-94.102.61.97 # security.criminalip.com
-94.102.61.98 # security.criminalip.com
-94.102.61.99 # security.criminalip.com
-94.102.61.100 # security.criminalip.com
-94.102.61.101 # security.criminalip.com
-94.102.61.102 # security.criminalip.com
-94.102.61.103 # security.criminalip.com
-94.102.61.104 # security.criminalip.com
-94.102.61.105 # security.criminalip.com
-94.102.61.106 # security.criminalip.com
-94.102.61.107 # security.criminalip.com
-94.102.61.108 # security.criminalip.com
-94.102.61.109 # security.criminalip.com
-94.102.61.110 # security.criminalip.com
-94.102.61.111 # security.criminalip.com
-94.102.61.112 # security.criminalip.com
-94.102.61.113 # security.criminalip.com
-94.102.61.114 # security.criminalip.com
-94.102.61.115 # security.criminalip.com
-94.102.61.116 # security.criminalip.com
-94.102.61.117 # security.criminalip.com
-94.102.61.118 # security.criminalip.com
-94.102.61.119 # security.criminalip.com
-94.102.61.120 # security.criminalip.com
-94.102.61.121 # security.criminalip.com
-94.102.61.122 # security.criminalip.com
-94.102.61.123 # security.criminalip.com
-94.102.61.124 # security.criminalip.com
-94.102.61.125 # security.criminalip.com
-94.102.61.126 # security.criminalip.com
-94.102.61.127 # security.criminalip.com
-94.102.61.128 # security.criminalip.com
-94.102.61.129 # security.criminalip.com
-94.102.61.130 # security.criminalip.com
-94.102.61.131 # security.criminalip.com
-94.102.61.132 # security.criminalip.com
-94.102.61.133 # security.criminalip.com
-94.102.61.134 # security.criminalip.com
-94.102.61.135 # security.criminalip.com
-94.102.61.136 # security.criminalip.com
-94.102.61.137 # security.criminalip.com
-94.102.61.138 # security.criminalip.com
-94.102.61.139 # security.criminalip.com
-94.102.61.140 # security.criminalip.com
-94.102.61.141 # security.criminalip.com
-94.102.61.142 # security.criminalip.com
-94.102.61.143 # security.criminalip.com
-94.102.61.144 # security.criminalip.com
-94.102.61.145 # security.criminalip.com
-94.102.61.146 # security.criminalip.com
-94.102.61.147 # security.criminalip.com
-94.102.61.148 # security.criminalip.com
-94.102.61.149 # security.criminalip.com
-94.102.61.150 # security.criminalip.com
-94.102.61.151 # security.criminalip.com
-94.102.61.152 # security.criminalip.com
-94.102.61.153 # security.criminalip.com
-94.102.61.154 # security.criminalip.com
-94.102.61.155 # security.criminalip.com
-94.102.61.156 # security.criminalip.com
-94.102.61.157 # security.criminalip.com
-94.102.61.158 # security.criminalip.com
-94.102.61.159 # security.criminalip.com
-94.102.61.160 # security.criminalip.com
-94.102.61.161 # security.criminalip.com
-94.102.61.162 # security.criminalip.com
-94.102.61.163 # security.criminalip.com
-94.102.61.164 # security.criminalip.com
-94.102.61.165 # security.criminalip.com
-94.102.61.166 # security.criminalip.com
-94.102.61.167 # security.criminalip.com
-94.102.61.168 # security.criminalip.com
-94.102.61.169 # security.criminalip.com
-94.102.61.170 # security.criminalip.com
-94.102.61.171 # security.criminalip.com
-94.102.61.172 # security.criminalip.com
-94.102.61.173 # security.criminalip.com
-94.102.61.174 # security.criminalip.com
-94.102.61.175 # security.criminalip.com
-94.102.61.176 # security.criminalip.com
-94.102.61.177 # security.criminalip.com
-94.102.61.178 # security.criminalip.com
-94.102.61.179 # security.criminalip.com
-94.102.61.180 # security.criminalip.com
-94.102.61.181 # security.criminalip.com
-94.102.61.182 # security.criminalip.com
-94.102.61.183 # security.criminalip.com
-94.102.61.184 # security.criminalip.com
-94.102.61.185 # security.criminalip.com
-94.102.61.186 # security.criminalip.com
-94.102.61.187 # security.criminalip.com
-94.102.61.188 # security.criminalip.com
-94.102.61.189 # security.criminalip.com
-94.102.61.190 # security.criminalip.com
-94.102.61.191 # security.criminalip.com
-94.102.61.192 # security.criminalip.com
-94.102.61.193 # security.criminalip.com
-94.102.61.194 # security.criminalip.com
-94.102.61.195 # security.criminalip.com
-94.102.61.196 # security.criminalip.com
-94.102.61.197 # security.criminalip.com
-94.102.61.198 # security.criminalip.com
-94.102.61.199 # security.criminalip.com
-94.102.61.200 # security.criminalip.com
-94.102.61.201 # security.criminalip.com
-94.102.61.202 # security.criminalip.com
-94.102.61.203 # security.criminalip.com
-94.102.61.204 # security.criminalip.com
-94.102.61.205 # security.criminalip.com
-94.102.61.206 # security.criminalip.com
-94.102.61.207 # security.criminalip.com
-94.102.61.208 # security.criminalip.com
-94.102.61.209 # security.criminalip.com
-94.102.61.210 # security.criminalip.com
-94.102.61.211 # security.criminalip.com
-94.102.61.212 # security.criminalip.com
-94.102.61.213 # security.criminalip.com
-94.102.61.214 # security.criminalip.com
-94.102.61.215 # security.criminalip.com
-94.102.61.216 # security.criminalip.com
-94.102.61.217 # security.criminalip.com
-94.102.61.218 # security.criminalip.com
-94.102.61.219 # security.criminalip.com
-94.102.61.220 # security.criminalip.com
-94.102.61.221 # security.criminalip.com
-94.102.61.222 # security.criminalip.com
-94.102.61.223 # security.criminalip.com
-94.102.61.224 # security.criminalip.com
-94.102.61.225 # security.criminalip.com
-94.102.61.226 # security.criminalip.com
-94.102.61.227 # security.criminalip.com
-94.102.61.228 # security.criminalip.com
-94.102.61.229 # security.criminalip.com
-94.102.61.230 # security.criminalip.com
-94.102.61.231 # security.criminalip.com
-94.102.61.232 # security.criminalip.com
-94.102.61.233 # security.criminalip.com
-94.102.61.234 # security.criminalip.com
-94.102.61.235 # security.criminalip.com
-94.102.61.236 # security.criminalip.com
-94.102.61.237 # security.criminalip.com
-94.102.61.238 # security.criminalip.com
-94.102.61.239 # security.criminalip.com
-94.102.61.240 # security.criminalip.com
-94.102.61.241 # security.criminalip.com
-94.102.61.242 # security.criminalip.com
-94.102.61.243 # security.criminalip.com
-94.102.61.244 # security.criminalip.com
-94.102.61.245 # security.criminalip.com
-94.102.61.246 # security.criminalip.com
-94.102.61.247 # security.criminalip.com
-94.102.61.248 # security.criminalip.com
-94.102.61.249 # security.criminalip.com
-94.102.61.250 # security.criminalip.com
-94.102.61.251 # security.criminalip.com
-94.102.61.252 # security.criminalip.com
-94.102.61.253 # security.criminalip.com
-94.102.61.254 # security.criminalip.com
-94.102.61.255 # security.criminalip.com
-
-# Reference: https://raw.githubusercontent.com/NoahVail/BadIPs/main/shadowserver.txt
-
-184.105.139.66 # scan-00.shadowserver.org
-184.105.139.126 # scan-00a.shadowserver.org
-184.105.139.67 # scan-01.shadowserver.org
-184.105.139.71 # scan-01a.shadowserver.org
-184.105.139.75 # scan-01c.shadowserver.org
-184.105.139.79 # scan-01d.shadowserver.org
-184.105.139.83 # scan-01e.shadowserver.org
-184.105.139.87 # scan-01f.shadowserver.org
-184.105.139.91 # scan-01g.shadowserver.org
-184.105.139.95 # scan-01h.shadowserver.org
-184.105.139.99 # scan-01i.shadowserver.org
-184.105.139.103 # scan-01j.shadowserver.org
-184.105.139.107 # scan-01k.shadowserver.org
-184.105.139.111 # scan-01l.shadowserver.org
-184.105.139.115 # scan-01m.shadowserver.org
-184.105.139.119 # scan-01n.shadowserver.org
-184.105.139.123 # scan-01o.shadowserver.org
-184.105.139.68 # scan-02.shadowserver.org
-184.105.139.72 # scan-02a.shadowserver.org
-184.105.139.76 # scan-02b.shadowserver.org
-184.105.139.80 # scan-02c.shadowserver.org
-184.105.139.84 # scan-02d.shadowserver.org
-184.105.139.88 # scan-02e.shadowserver.org
-184.105.139.92 # scan-02f.shadowserver.org
-184.105.139.96 # scan-02g.shadowserver.org
-184.105.139.100 # scan-02h.shadowserver.org
-184.105.139.104 # scan-02i.shadowserver.org
-184.105.139.108 # scan-02j.shadowserver.org
-184.105.139.112 # scan-02k.shadowserver.org
-184.105.139.116 # scan-02l.shadowserver.org
-184.105.139.120 # scan-02m.shadowserver.org
-184.105.139.124 # scan-02n.shadowserver.org
-184.105.139.69 # scan-03.shadowserver.org
-184.105.139.73 # scan-03a.shadowserver.org
-184.105.139.77 # scan-03b.shadowserver.org
-184.105.139.81 # scan-03b.shadowserver.org
-184.105.139.85 # scan-03c.shadowserver.org
-184.105.139.89 # scan-03d.shadowserver.org
-184.105.139.93 # scan-03e.shadowserver.org
-184.105.139.97 # scan-03f.shadowserver.org
-184.105.139.101 # scan-03g.shadowserver.org
-184.105.139.105 # scan-03h.shadowserver.org
-184.105.139.109 # scan-03i.shadowserver.org
-184.105.139.113 # scan-03j.shadowserver.org
-184.105.139.117 # scan-03k.shadowserver.org
-184.105.139.121 # scan-03l.shadowserver.org
-184.105.139.125 # scan-03m.shadowserver.org
-184.105.139.70 # scan-04.shadowserver.org
-184.105.139.74 # scan-04a.shadowserver.org
-184.105.139.78 # scan-04b.shadowserver.org
-184.105.139.82 # scan-04c.shadowserver.org
-184.105.139.86 # scan-04d.shadowserver.org
-184.105.139.90 # scan-04e.shadowserver.org
-184.105.139.94 # scan-04f.shadowserver.org
-184.105.139.98 # scan-04g.shadowserver.org
-184.105.139.102 # scan-04h.shadowserver.org
-184.105.139.106 # scan-04i.shadowserver.org
-184.105.139.110 # scan-04j.shadowserver.org
-184.105.139.114 # scan-04k.shadowserver.org
-184.105.139.118 # scan-04l.shadowserver.org
-184.105.139.122 # scan-04m.shadowserver.org
-216.218.206.66 # scan-05.shadowserver.org
-216.218.206.70 # scan-05a.shadowserver.org
-216.218.206.74 # scan-05b.shadowserver.org
-216.218.206.78 # scan-05c.shadowserver.org
-216.218.206.82 # scan-05d.shadowserver.org
-216.218.206.86 # scan-05e.shadowserver.org
-216.218.206.90 # scan-05f.shadowserver.org
-216.218.206.94 # scan-05g.shadowserver.org
-216.218.206.98 # scan-05h.shadowserver.org
-216.218.206.102 # scan-05i.shadowserver.org
-216.218.206.106 # scan-05j.shadowserver.org
-216.218.206.110 # scan-05k.shadowserver.org
-216.218.206.114 # scan-05l.shadowserver.org
-216.218.206.118 # scan-05m.shadowserver.org
-216.218.206.122 # scan-05n.shadowserver.org
-216.218.206.126 # scan-05o.shadowserver.org
-216.218.206.67 # scan-06.shadowserver.org
-216.218.206.71 # scan-06a.shadowserver.org
-216.218.206.75 # scan-06b.shadowserver.org
-216.218.206.79 # scan-06c.shadowserver.org
-216.218.206.83 # scan-06d.shadowserver.org
-216.218.206.87 # scan-06e.shadowserver.org
-216.218.206.91 # scan-06f.shadowserver.org
-216.218.206.95 # scan-06g.shadowserver.org
-216.218.206.99 # scan-06h.shadowserver.org
-216.218.206.103 # scan-06i.shadowserver.org
-216.218.206.107 # scan-06j.shadowserver.org
-216.218.206.111 # scan-06k.shadowserver.org
-216.218.206.115 # scan-06l.shadowserver.org
-216.218.206.119 # scan-06m.shadowserver.org
-216.218.206.123 # scan-06n.shadowserver.org
-216.218.206.68 # scan-07.shadowserver.org
-216.218.206.72 # scan-07a.shadowserver.org
-216.218.206.76 # scan-07b.shadowserver.org
-216.218.206.80 # scan-07c.shadowserver.org
-216.218.206.84 # scan-07d.shadowserver.org
-216.218.206.88 # scan-07e.shadowserver.org
-216.218.206.92 # scan-07f.shadowserver.org
-216.218.206.96 # scan-07g.shadowserver.org
-216.218.206.100 # scan-07h.shadowserver.org
-216.218.206.108 # scan-07j.shadowserver.org
-216.218.206.112 # scan-07k.shadowserver.org
-216.218.206.116 # scan-07l.shadowserver.org
-216.218.206.120 # scan-07m.shadowserver.org
-216.218.206.124 # scan-07n.shadowserver.org
-216.218.206.104 # scan-07u.shadowserver.org
-216.218.206.69 # scan-08.shadowserver.org
-216.218.206.73 # scan-08a.shadowserver.org
-216.218.206.77 # scan-08b.shadowserver.org
-216.218.206.81 # scan-08c.shadowserver.org
-216.218.206.85 # scan-08d.shadowserver.org
-216.218.206.89 # scan-08e.shadowserver.org
-216.218.206.93 # scan-08f.shadowserver.org
-216.218.206.97 # scan-08g.shadowserver.org
-216.218.206.101 # scan-08h.shadowserver.org
-216.218.206.105 # scan-08i.shadowserver.org
-216.218.206.109 # scan-08j.shadowserver.org
-216.218.206.113 # scan-08k.shadowserver.org
-216.218.206.117 # scan-08l.shadowserver.org
-216.218.206.121 # scan-08m.shadowserver.org
-216.218.206.125 # scan-08n.shadowserver.org
-74.82.47.2 # scan-09.shadowserver.org
-74.82.47.6 # scan-09a.shadowserver.org
-74.82.47.10 # scan-09b.shadowserver.org
-74.82.47.14 # scan-09c.shadowserver.org
-74.82.47.18 # scan-09d.shadowserver.org
-74.82.47.22 # scan-09e.shadowserver.org
-74.82.47.26 # scan-09f.shadowserver.org
-74.82.47.30 # scan-09g.shadowserver.org
-74.82.47.34 # scan-09h.shadowserver.org
-74.82.47.38 # scan-09i.shadowserver.org
-74.82.47.42 # scan-09j.shadowserver.org
-74.82.47.26 # scan-09k.shadowserver.org
-74.82.47.50 # scan-09l.shadowserver.org
-74.82.47.54 # scan-09m.shadowserver.org
-74.82.47.58 # scan-09n.shadowserver.org
-74.82.47.62 # scan-09o.shadowserver.org
-74.82.47.3 # scan-10.shadowserver.org
-74.82.47.7 # scan-10a.shadowserver.org
-74.82.47.11 # scan-10b.shadowserver.org
-74.82.47.15 # scan-10c.shadowserver.org
-74.82.47.19 # scan-10d.shadowserver.org
-74.82.47.23 # scan-10e.shadowserver.org
-74.82.47.27 # scan-10f.shadowserver.org
-74.82.47.31 # scan-10g.shadowserver.org
-74.82.47.35 # scan-10h.shadowserver.org
-74.82.47.39 # scan-10i.shadowserver.org
-74.82.47.43 # scan-10j.shadowserver.org
-74.82.47.47 # scan-10k.shadowserver.org
-74.82.47.51 # scan-10l.shadowserver.org
-74.82.47.55 # scan-10m.shadowserver.org
-74.82.47.59 # scan-10n.shadowserver.org
-74.82.47.63 # scan-10o.shadowserver.org
-74.82.47.4 # scan-11.shadowserver.org
-74.82.47.8 # scan-11a.shadowserver.org
-74.82.47.12 # scan-11b.shadowserver.org
-74.82.47.16 # scan-11c.shadowserver.org
-74.82.47.20 # scan-11d.shadowserver.org
-74.82.47.24 # scan-11e.shadowserver.org
-74.82.47.28 # scan-11f.shadowserver.org
-74.82.47.32 # scan-11g.shadowserver.org
-74.82.47.36 # scan-11h.shadowserver.org
-74.82.47.40 # scan-11i.shadowserver.org
-74.82.47.44 # scan-11j.shadowserver.org
-74.82.47.48 # scan-11k.shadowserver.org
-74.82.47.52 # scan-11l.shadowserver.org
-74.82.47.56 # scan-11m.shadowserver.org
-74.82.47.60 # scan-11n.shadowserver.org
-74.82.47.5 # scan-12.shadowserver.org
-74.82.47.9 # scan-12a.shadowserver.org
-74.82.47.17 # scan-12b.shadowserver.org
-74.82.47.13 # scan-12b.shadowserver.org
-74.82.47.21 # scan-12c.shadowserver.org
-74.82.47.25 # scan-12d.shadowserver.org
-74.82.47.29 # scan-12e.shadowserver.org
-74.82.47.33 # scan-12f.shadowserver.org
-74.82.47.37 # scan-12g.shadowserver.org
-74.82.47.41 # scan-12h.shadowserver.org
-74.82.47.45 # scan-12i.shadowserver.org
-74.82.47.49 # scan-12j.shadowserver.org
-74.82.47.53 # scan-12k.shadowserver.org
-74.82.47.57 # scan-12l.shadowserver.org
-74.82.47.61 # scan-12m.shadowserver.org
-184.105.247.194 # scan-13.shadowserver.org
-184.105.247.198 # scan-13a.shadowserver.org
-184.105.247.202 # scan-13b.shadowserver.org
-184.105.247.206 # scan-13c.shadowserver.org
-184.105.247.210 # scan-13d.shadowserver.org
-184.105.247.214 # scan-13e.shadowserver.org
-184.105.247.218 # scan-13f.shadowserver.org
-184.105.247.222 # scan-13g.shadowserver.org
-184.105.247.226 # scan-13h.shadowserver.org
-184.105.247.230 # scan-13i.shadowserver.org
-184.105.247.234 # scan-13j.shadowserver.org
-184.105.247.238 # scan-13k.shadowserver.org
-184.105.247.242 # scan-13l.shadowserver.org
-184.105.247.246 # scan-13m.shadowserver.org
-184.105.247.250 # scan-13n.shadowserver.org
-184.105.247.254 # scan-13o.shadowserver.org
-184.105.247.195 # scan-14.shadowserver.org
-184.105.247.199 # scan-14a.shadowserver.org
-184.105.247.203 # scan-14b.shadowserver.org
-184.105.247.207 # scan-14c.shadowserver.org
-184.105.247.211 # scan-14d.shadowserver.org
-184.105.247.215 # scan-14e.shadowserver.org
-184.105.247.219 # scan-14f.shadowserver.org
-184.105.247.223 # scan-14g.shadowserver.org
-184.105.247.227 # scan-14h.shadowserver.org
-184.105.247.231 # scan-14i.shadowserver.org
-184.105.247.235 # scan-14j.shadowserver.org
-184.105.247.239 # scan-14k.shadowserver.org
-184.105.247.243 # scan-14l.shadowserver.org
-184.105.247.247 # scan-14m.shadowserver.org
-184.105.247.251 # scan-14n.shadowserver.org
-184.105.247.196 # scan-15.shadowserver.org
-184.105.247.200 # scan-15a.shadowserver.org
-184.105.247.204 # scan-15b.shadowserver.org
-184.105.247.208 # scan-15c.shadowserver.org
-184.105.247.212 # scan-15d.shadowserver.org
-184.105.247.216 # scan-15e.shadowserver.org
-184.105.247.220 # scan-15f.shadowserver.org
-184.105.247.224 # scan-15g.shadowserver.org
-184.105.247.228 # scan-15h.shadowserver.org
-184.105.247.232 # scan-15i.shadowserver.org
-184.105.247.236 # scan-15j.shadowserver.org
-184.105.247.240 # scan-15k.shadowserver.org
-184.105.247.244 # scan-15l.shadowserver.org
-184.105.247.248 # scan-15m.shadowserver.org
-184.105.247.252 # scan-15n.shadowserver.org
-184.105.247.197 # scan-16.shadowserver.org
-184.105.247.201 # scan-16a.shadowserver.org
-184.105.247.205 # scan-16b.shadowserver.org
-184.105.247.209 # scan-16c.shadowserver.org
-184.105.247.213 # scan-16d.shadowserver.org
-184.105.247.217 # scan-16e.shadowserver.org
-184.105.247.221 # scan-16f.shadowserver.org
-184.105.247.225 # scan-16g.shadowserver.org
-184.105.247.229 # scan-16h.shadowserver.org
-184.105.247.233 # scan-16i.shadowserver.org
-184.105.247.237 # scan-16j.shadowserver.org
-184.105.247.241 # scan-16k.shadowserver.org
-184.105.247.245 # scan-16l.shadowserver.org
-184.105.247.249 # scan-16m.shadowserver.org
-184.105.247.253 # scan-16n.shadowserver.org
-65.49.20.66 # scan-17.shadowserver.org
-65.49.20.70 # scan-17a.shadowserver.org
-65.49.20.74 # scan-17b.shadowserver.org
-65.49.20.78 # scan-17c.shadowserver.org
-65.49.20.82 # scan-17d.shadowserver.org
-65.49.20.86 # scan-17e.shadowserver.org
-65.49.20.90 # scan-17f.shadowserver.org
-65.49.20.94 # scan-17g.shadowserver.org
-65.49.20.98 # scan-17h.shadowserver.org
-65.49.20.102 # scan-17i.shadowserver.org
-65.49.20.106 # scan-17j.shadowserver.org
-65.49.20.110 # scan-17k.shadowserver.org
-65.49.20.114 # scan-17l.shadowserver.org
-65.49.20.118 # scan-17m.shadowserver.org
-65.49.20.122 # scan-17n.shadowserver.org
-65.49.20.126 # scan-17o.shadowserver.org
-65.49.20.67 # scan-18.shadowserver.org
-65.49.20.71 # scan-18a.shadowserver.org
-65.49.20.75 # scan-18b.shadowserver.org
-65.49.20.79 # scan-18c.shadowserver.org
-65.49.20.83 # scan-18d.shadowserver.org
-65.49.20.87 # scan-18e.shadowserver.org
-65.49.20.91 # scan-18f.shadowserver.org
-65.49.20.95 # scan-18g.shadowserver.org
-65.49.20.99 # scan-18h.shadowserver.org
-65.49.20.103 # scan-18i.shadowserver.org
-65.49.20.107 # scan-18j.shadowserver.org
-65.49.20.111 # scan-18k.shadowserver.org
-65.49.20.115 # scan-18l.shadowserver.org
-65.49.20.119 # scan-18m.shadowserver.org
-65.49.20.123 # scan-18n.shadowserver.org
-65.49.20.68 # scan-19.shadowserver.org
-65.49.20.72 # scan-19a.shadowserver.org
-65.49.20.76 # scan-19b.shadowserver.org
-65.49.20.80 # scan-19c.shadowserver.org
-65.49.20.84 # scan-19d.shadowserver.org
-65.49.20.88 # scan-19e.shadowserver.org
-65.49.20.92 # scan-19f.shadowserver.org
-65.49.20.96 # scan-19g.shadowserver.org
-65.49.20.100 # scan-19h.shadowserver.org
-65.49.20.104 # scan-19i.shadowserver.org
-65.49.20.108 # scan-19j.shadowserver.org
-65.49.20.112 # scan-19k.shadowserver.org
-65.49.20.116 # scan-19l.shadowserver.org
-65.49.20.120 # scan-19m.shadowserver.org
-65.49.20.124 # scan-19n.shadowserver.org
-65.49.20.69 # scan-20.shadowserver.org
-65.49.20.73 # scan-20a.shadowserver.org
-65.49.20.77 # scan-20b.shadowserver.org
-65.49.20.81 # scan-20c.shadowserver.org
-65.49.20.85 # scan-20d.shadowserver.org
-65.49.20.89 # scan-20e.shadowserver.org
-65.49.20.93 # scan-20f.shadowserver.org
-65.49.20.97 # scan-20g.shadowserver.org
-65.49.20.101 # scan-20h.shadowserver.org
-65.49.20.105 # scan-20i.shadowserver.org
-65.49.20.109 # scan-20j.shadowserver.org
-65.49.20.113 # scan-20k.shadowserver.org
-65.49.20.117 # scan-20l.shadowserver.org
-65.49.20.121 # scan-20m.shadowserver.org
-65.49.20.125 # scan-20n.shadowserver.org
-184.105.247.238 # scan-21.shadowserver.org
-184.105.247.247 # scan-21a.shadowserver.org
-184.105.247.252 # scan-21b.shadowserver.org
-64.62.197.2 # scan-36a.shadowserver.org
-64.62.197.3 # scan-36b.shadowserver.org
-64.62.197.4 # scan-36c.shadowserver.org
-64.62.197.5 # scan-36d.shadowserver.org
-64.62.197.6 # scan-36e.shadowserver.org
-64.62.197.7 # scan-36f.shadowserver.org
-64.62.197.8 # scan-36g.shadowserver.org
-64.62.197.9 # scan-36h.shadowserver.org
-64.62.197.10 # scan-36i.shadowserver.org
-64.62.197.11 # scan-36j.shadowserver.org
-64.62.197.12 # scan-36k.shadowserver.org
-64.62.197.13 # scan-36l.shadowserver.org
-64.62.197.14 # scan-36m.shadowserver.org
-64.62.197.15 # scan-36n.shadowserver.org
-64.62.197.16 # scan-36o.shadowserver.org
-64.62.197.32 # scan-37a.shadowserver.org
-64.62.197.33 # scan-37b.shadowserver.org
-64.62.197.34 # scan-37c.shadowserver.org
-64.62.197.35 # scan-37d.shadowserver.org
-64.62.197.36 # scan-37e.shadowserver.org
-64.62.197.37 # scan-37f.shadowserver.org
-64.62.197.38 # scan-37g.shadowserver.org
-64.62.197.39 # scan-37h.shadowserver.org
-64.62.197.40 # scan-37i.shadowserver.org
-64.62.197.41 # scan-37j.shadowserver.org
-64.62.197.42 # scan-37k.shadowserver.org
-64.62.197.43 # scan-37l.shadowserver.org
-64.62.197.44 # scan-37m.shadowserver.org
-64.62.197.45 # scan-37n.shadowserver.org
-64.62.197.46 # scan-37o.shadowserver.org
-64.62.197.62 # scan-38a.shadowserver.org
-64.62.197.63 # scan-38b.shadowserver.org
-64.62.197.64 # scan-38c.shadowserver.org
-64.62.197.65 # scan-38d.shadowserver.org
-64.62.197.66 # scan-38e.shadowserver.org
-64.62.197.67 # scan-38f.shadowserver.org
-64.62.197.68 # scan-38g.shadowserver.org
-64.62.197.69 # scan-38h.shadowserver.org
-64.62.197.70 # scan-38i.shadowserver.org
-64.62.197.71 # scan-38j.shadowserver.org
-64.62.197.72 # scan-38k.shadowserver.org
-64.62.197.73 # scan-38l.shadowserver.org
-64.62.197.74 # scan-38m.shadowserver.org
-64.62.197.75 # scan-38n.shadowserver.org
-64.62.197.76 # scan-38o.shadowserver.org
-64.62.197.92 # scan-39a.shadowserver.org
-64.62.197.93 # scan-39b.shadowserver.org
-64.62.197.94 # scan-39c.shadowserver.org
-64.62.197.95 # scan-39d.shadowserver.org
-64.62.197.96 # scan-39e.shadowserver.org
-64.62.197.97 # scan-39f.shadowserver.org
-64.62.197.98 # scan-39g.shadowserver.org
-64.62.197.99 # scan-39h.shadowserver.org
-64.62.197.100 # scan-39i.shadowserver.org
-64.62.197.101 # scan-39j.shadowserver.org
-64.62.197.102 # scan-39k.shadowserver.org
-64.62.197.103 # scan-39l.shadowserver.org
-64.62.197.104 # scan-39m.shadowserver.org
-64.62.197.105 # scan-39n.shadowserver.org
-64.62.197.106 # scan-39o.shadowserver.org
-64.62.197.122 # scan-40a.shadowserver.org
-64.62.197.123 # scan-40b.shadowserver.org
-64.62.197.124 # scan-40c.shadowserver.org
-64.62.197.125 # scan-40d.shadowserver.org
-64.62.197.126 # scan-40e.shadowserver.org
-64.62.197.127 # scan-40f.shadowserver.org
-64.62.197.128 # scan-40g.shadowserver.org
-64.62.197.129 # scan-40h.shadowserver.org
-64.62.197.130 # scan-40i.shadowserver.org
-64.62.197.131 # scan-40j.shadowserver.org
-64.62.197.132 # scan-40k.shadowserver.org
-64.62.197.133 # scan-40l.shadowserver.org
-64.62.197.134 # scan-40m.shadowserver.org
-64.62.197.135 # scan-40n.shadowserver.org
-64.62.197.136 # scan-40o.shadowserver.org
-64.62.197.152 # scan-41a.shadowserver.org
-64.62.197.153 # scan-41b.shadowserver.org
-64.62.197.154 # scan-41c.shadowserver.org
-64.62.197.155 # scan-41d.shadowserver.org
-64.62.197.156 # scan-41e.shadowserver.org
-64.62.197.157 # scan-41f.shadowserver.org
-64.62.197.158 # scan-41g.shadowserver.org
-64.62.197.159 # scan-41h.shadowserver.org
-64.62.197.160 # scan-41i.shadowserver.org
-64.62.197.161 # scan-41j.shadowserver.org
-64.62.197.162 # scan-41k.shadowserver.org
-64.62.197.163 # scan-41l.shadowserver.org
-64.62.197.164 # scan-41m.shadowserver.org
-64.62.197.165 # scan-41n.shadowserver.org
-64.62.197.166 # scan-41o.shadowserver.org
-64.62.197.182 # scan-42a.shadowserver.org
-64.62.197.183 # scan-42b.shadowserver.org
-64.62.197.184 # scan-42c.shadowserver.org
-64.62.197.185 # scan-42d.shadowserver.org
-64.62.197.186 # scan-42e.shadowserver.org
-64.62.197.187 # scan-42f.shadowserver.org
-64.62.197.188 # scan-42g.shadowserver.org
-64.62.197.189 # scan-42h.shadowserver.org
-64.62.197.190 # scan-42i.shadowserver.org
-64.62.197.191 # scan-42j.shadowserver.org
-64.62.197.192 # scan-42k.shadowserver.org
-64.62.197.193 # scan-42l.shadowserver.org
-64.62.197.194 # scan-42m.shadowserver.org
-64.62.197.195 # scan-42n.shadowserver.org
-64.62.197.196 # scan-42o.shadowserver.org
-64.62.197.212 # scan-43a.shadowserver.org
-64.62.197.237 # scan-43aa.shadowserver.org
-64.62.197.238 # scan-43ab.shadowserver.org
-64.62.197.239 # scan-43ac.shadowserver.org
-64.62.197.240 # scan-43ad.shadowserver.org
-64.62.197.241 # scan-43ae.shadowserver.org
-64.62.197.213 # scan-43b.shadowserver.org
-64.62.197.214 # scan-43c.shadowserver.org
-64.62.197.215 # scan-43d.shadowserver.org
-64.62.197.216 # scan-43e.shadowserver.org
-64.62.197.217 # scan-43f.shadowserver.org
-64.62.197.218 # scan-43g.shadowserver.org
-64.62.197.219 # scan-43h.shadowserver.org
-64.62.197.220 # scan-43i.shadowserver.org
-64.62.197.221 # scan-43j.shadowserver.org
-64.62.197.222 # scan-43k.shadowserver.org
-64.62.197.223 # scan-43l.shadowserver.org
-64.62.197.224 # scan-43m.shadowserver.org
-64.62.197.225 # scan-43n.shadowserver.org
-64.62.197.226 # scan-43o.shadowserver.org
-64.62.197.227 # scan-43p.shadowserver.org
-64.62.197.228 # scan-43q.shadowserver.org
-64.62.197.229 # scan-43r.shadowserver.org
-64.62.197.230 # scan-43s.shadowserver.org
-64.62.197.231 # scan-43t.shadowserver.org
-64.62.197.232 # scan-43u.shadowserver.org
-64.62.197.233 # scan-43v.shadowserver.org
-64.62.197.234 # scan-43w.shadowserver.org
-64.62.197.235 # scan-43x.shadowserver.org
-64.62.197.236 # scan-43y.shadowserver.org
-64.62.197.17 # scan-44a.shadowserver.org
-64.62.197.18 # scan-44b.shadowserver.org
-64.62.197.19 # scan-44c.shadowserver.org
-64.62.197.20 # scan-44d.shadowserver.org
-64.62.197.21 # scan-44e.shadowserver.org
-64.62.197.22 # scan-44f.shadowserver.org
-64.62.197.23 # scan-44g.shadowserver.org
-64.62.197.24 # scan-44h.shadowserver.org
-64.62.197.25 # scan-44i.shadowserver.org
-64.62.197.26 # scan-44j.shadowserver.org
-64.62.197.27 # scan-44k.shadowserver.org
-64.62.197.28 # scan-44l.shadowserver.org
-64.62.197.29 # scan-44m.shadowserver.org
-64.62.197.30 # scan-44n.shadowserver.org
-64.62.197.31 # scan-44o.shadowserver.org
-64.62.197.47 # scan-45a.shadowserver.org
-64.62.197.48 # scan-45b.shadowserver.org
-64.62.197.49 # scan-45c.shadowserver.org
-64.62.197.50 # scan-45d.shadowserver.org
-64.62.197.51 # scan-45e.shadowserver.org
-64.62.197.52 # scan-45f.shadowserver.org
-64.62.197.53 # scan-45g.shadowserver.org
-64.62.197.54 # scan-45h.shadowserver.org
-64.62.197.55 # scan-45i.shadowserver.org
-64.62.197.56 # scan-45j.shadowserver.org
-64.62.197.57 # scan-45k.shadowserver.org
-64.62.197.58 # scan-45l.shadowserver.org
-64.62.197.59 # scan-45m.shadowserver.org
-64.62.197.60 # scan-45n.shadowserver.org
-64.62.197.61 # scan-45o.shadowserver.org
-64.62.197.77 # scan-46a.shadowserver.org
-64.62.197.78 # scan-46b.shadowserver.org
-64.62.197.79 # scan-46c.shadowserver.org
-64.62.197.80 # scan-46d.shadowserver.org
-64.62.197.81 # scan-46e.shadowserver.org
-64.62.197.82 # scan-46f.shadowserver.org
-64.62.197.83 # scan-46g.shadowserver.org
-64.62.197.84 # scan-46h.shadowserver.org
-64.62.197.85 # scan-46i.shadowserver.org
-64.62.197.86 # scan-46j.shadowserver.org
-64.62.197.87 # scan-46k.shadowserver.org
-64.62.197.88 # scan-46l.shadowserver.org
-64.62.197.89 # scan-46m.shadowserver.org
-64.62.197.90 # scan-46n.shadowserver.org
-64.62.197.91 # scan-46o.shadowserver.org
-64.62.197.107 # scan-47a.shadowserver.org
-64.62.197.108 # scan-47b.shadowserver.org
-64.62.197.109 # scan-47c.shadowserver.org
-64.62.197.110 # scan-47d.shadowserver.org
-64.62.197.111 # scan-47e.shadowserver.org
-64.62.197.112 # scan-47f.shadowserver.org
-64.62.197.113 # scan-47g.shadowserver.org
-64.62.197.114 # scan-47h.shadowserver.org
-64.62.197.115 # scan-47i.shadowserver.org
-64.62.197.116 # scan-47j.shadowserver.org
-64.62.197.117 # scan-47k.shadowserver.org
-64.62.197.118 # scan-47l.shadowserver.org
-64.62.197.119 # scan-47m.shadowserver.org
-64.62.197.120 # scan-47n.shadowserver.org
-64.62.197.121 # scan-47o.shadowserver.org
-64.62.197.137 # scan-48a.shadowserver.org
-64.62.197.138 # scan-48b.shadowserver.org
-64.62.197.139 # scan-48c.shadowserver.org
-64.62.197.140 # scan-48d.shadowserver.org
-64.62.197.141 # scan-48e.shadowserver.org
-64.62.197.142 # scan-48f.shadowserver.org
-64.62.197.143 # scan-48g.shadowserver.org
-64.62.197.144 # scan-48h.shadowserver.org
-64.62.197.145 # scan-48i.shadowserver.org
-64.62.197.146 # scan-48j.shadowserver.org
-64.62.197.147 # scan-48k.shadowserver.org
-64.62.197.148 # scan-48l.shadowserver.org
-64.62.197.149 # scan-48m.shadowserver.org
-64.62.197.150 # scan-48n.shadowserver.org
-64.62.197.151 # scan-48o.shadowserver.org
-64.62.197.167 # scan-49a.shadowserver.org
-64.62.197.168 # scan-49b.shadowserver.org
-64.62.197.169 # scan-49c.shadowserver.org
-64.62.197.170 # scan-49d.shadowserver.org
-64.62.197.171 # scan-49e.shadowserver.org
-64.62.197.172 # scan-49f.shadowserver.org
-64.62.197.173 # scan-49g.shadowserver.org
-64.62.197.174 # scan-49h.shadowserver.org
-64.62.197.175 # scan-49i.shadowserver.org
-64.62.197.176 # scan-49j.shadowserver.org
-64.62.197.177 # scan-49k.shadowserver.org
-64.62.197.178 # scan-49l.shadowserver.org
-64.62.197.179 # scan-49m.shadowserver.org
-64.62.197.180 # scan-49n.shadowserver.org
-64.62.197.181 # scan-49o.shadowserver.org
-64.62.197.197 # scan-50a.shadowserver.org
-64.62.197.198 # scan-50b.shadowserver.org
-64.62.197.199 # scan-50c.shadowserver.org
-64.62.197.200 # scan-50d.shadowserver.org
-64.62.197.201 # scan-50e.shadowserver.org
-64.62.197.202 # scan-50f.shadowserver.org
-64.62.197.203 # scan-50g.shadowserver.org
-64.62.197.204 # scan-50h.shadowserver.org
-64.62.197.205 # scan-50i.shadowserver.org
-64.62.197.206 # scan-50j.shadowserver.org
-64.62.197.207 # scan-50k.shadowserver.org
-64.62.197.208 # scan-50l.shadowserver.org
-64.62.197.209 # scan-50m.shadowserver.org
-64.62.197.210 # scan-50n.shadowserver.org
-64.62.197.211 # scan-50o.shadowserver.org
-64.62.197.227 # scan-51a.shadowserver.org
-64.62.197.228 # scan-51b.shadowserver.org
-64.62.197.229 # scan-51c.shadowserver.org
-64.62.197.230 # scan-51d.shadowserver.org
-64.62.197.231 # scan-51e.shadowserver.org
-64.62.197.232 # scan-51f.shadowserver.org
-64.62.197.233 # scan-51g.shadowserver.org
-64.62.197.234 # scan-51h.shadowserver.org
-64.62.197.235 # scan-51i.shadowserver.org
-64.62.197.236 # scan-51j.shadowserver.org
-64.62.197.237 # scan-51k.shadowserver.org
-64.62.197.238 # scan-51l.shadowserver.org
-64.62.197.239 # scan-51m.shadowserver.org
-64.62.197.240 # scan-51n.shadowserver.org
-64.62.197.241 # scan-51o.shadowserver.org
-65.49.1.10 # scan-52a.shadowserver.org
-65.49.1.11 # scan-52b.shadowserver.org
-65.49.1.12 # scan-52c.shadowserver.org
-65.49.1.13 # scan-52d.shadowserver.org
-65.49.1.14 # scan-52e.shadowserver.org
-65.49.1.15 # scan-52f.shadowserver.org
-65.49.1.16 # scan-52g.shadowserver.org
-65.49.1.17 # scan-52h.shadowserver.org
-65.49.1.18 # scan-52i.shadowserver.org
-65.49.1.19 # scan-52j.shadowserver.org
-65.49.1.20 # scan-52k.shadowserver.org
-65.49.1.21 # scan-52l.shadowserver.org
-65.49.1.22 # scan-52m.shadowserver.org
-65.49.1.23 # scan-52n.shadowserver.org
-65.49.1.24 # scan-53a.shadowserver.org
-65.49.1.25 # scan-53b.shadowserver.org
-65.49.1.26 # scan-53c.shadowserver.org
-65.49.1.27 # scan-53d.shadowserver.org
-65.49.1.28 # scan-53e.shadowserver.org
-65.49.1.29 # scan-53f.shadowserver.org
-65.49.1.30 # scan-53g.shadowserver.org
-65.49.1.31 # scan-53h.shadowserver.org
-65.49.1.32 # scan-53i.shadowserver.org
-65.49.1.33 # scan-53j.shadowserver.org
-65.49.1.34 # scan-53k.shadowserver.org
-65.49.1.35 # scan-53l.shadowserver.org
-65.49.1.36 # scan-53m.shadowserver.org
-65.49.1.37 # scan-53n.shadowserver.org
-65.49.1.38 # scan-54a.shadowserver.org
-65.49.1.39 # scan-54b.shadowserver.org
-65.49.1.40 # scan-54c.shadowserver.org
-65.49.1.41 # scan-54d.shadowserver.org
-65.49.1.42 # scan-54e.shadowserver.org
-65.49.1.43 # scan-54f.shadowserver.org
-65.49.1.44 # scan-54g.shadowserver.org
-65.49.1.45 # scan-54h.shadowserver.org
-65.49.1.46 # scan-54i.shadowserver.org
-65.49.1.47 # scan-54j.shadowserver.org
-65.49.1.48 # scan-54k.shadowserver.org
-65.49.1.49 # scan-54l.shadowserver.org
-65.49.1.50 # scan-54m.shadowserver.org
-65.49.1.51 # scan-54n.shadowserver.org
-65.49.1.52 # scan-55a.shadowserver.org
-65.49.1.53 # scan-55b.shadowserver.org
-65.49.1.54 # scan-55c.shadowserver.org
-65.49.1.55 # scan-55d.shadowserver.org
-65.49.1.56 # scan-55e.shadowserver.org
-65.49.1.57 # scan-55f.shadowserver.org
-65.49.1.58 # scan-55g.shadowserver.org
-65.49.1.59 # scan-55h.shadowserver.org
-65.49.1.60 # scan-55i.shadowserver.org
-65.49.1.61 # scan-55j.shadowserver.org
-65.49.1.52 # scan-55k.shadowserver.org
-65.49.1.63 # scan-55l.shadowserver.org
-65.49.1.64 # scan-55m.shadowserver.org
-65.49.1.65 # scan-55n.shadowserver.org
-65.49.1.66 # scan-56a.shadowserver.org
-65.49.1.67 # scan-56b.shadowserver.org
-65.49.1.68 # scan-56c.shadowserver.org
-65.49.1.69 # scan-56d.shadowserver.org
-65.49.1.70 # scan-56e.shadowserver.org
-65.49.1.71 # scan-56f.shadowserver.org
-65.49.1.72 # scan-56g.shadowserver.org
-65.49.1.73 # scan-56h.shadowserver.org
-65.49.1.74 # scan-56i.shadowserver.org
-65.49.1.75 # scan-56j.shadowserver.org
-65.49.1.76 # scan-56k.shadowserver.org
-65.49.1.77 # scan-56l.shadowserver.org
-65.49.1.78 # scan-56m.shadowserver.org
-65.49.1.79 # scan-56n.shadowserver.org
-65.49.1.80 # scan-57a.shadowserver.org
-65.49.1.81 # scan-57b.shadowserver.org
-65.49.1.82 # scan-57c.shadowserver.org
-65.49.1.83 # scan-57d.shadowserver.org
-65.49.1.84 # scan-57e.shadowserver.org
-65.49.1.85 # scan-57f.shadowserver.org
-65.49.1.86 # scan-57g.shadowserver.org
-65.49.1.87 # scan-57h.shadowserver.org
-65.49.1.88 # scan-57i.shadowserver.org
-65.49.1.89 # scan-57j.shadowserver.org
-65.49.1.90 # scan-57k.shadowserver.org
-65.49.1.91 # scan-57l.shadowserver.org
-65.49.1.92 # scan-57m.shadowserver.org
-65.49.1.93 # scan-57n.shadowserver.org
-65.49.1.94 # scan-58a.shadowserver.org
-65.49.1.95 # scan-58b.shadowserver.org
-65.49.1.96 # scan-58c.shadowserver.org
-65.49.1.97 # scan-58d.shadowserver.org
-65.49.1.98 # scan-58e.shadowserver.org
-65.49.1.99 # scan-58f.shadowserver.org
-65.49.1.100 # scan-58g.shadowserver.org
-65.49.1.101 # scan-58h.shadowserver.org
-65.49.1.102 # scan-58i.shadowserver.org
-65.49.1.103 # scan-58j.shadowserver.org
-65.49.1.104 # scan-58k.shadowserver.org
-65.49.1.105 # scan-58l.shadowserver.org
-65.49.1.106 # scan-58m.shadowserver.org
-65.49.1.107 # scan-58n.shadowserver.org
-65.49.1.108 # scan-59a.shadowserver.org
-65.49.1.109 # scan-59b.shadowserver.org
-65.49.1.110 # scan-59c.shadowserver.org
-65.49.1.111 # scan-59d.shadowserver.org
-65.49.1.112 # scan-59e.shadowserver.org
-65.49.1.113 # scan-59f.shadowserver.org
-65.49.1.114 # scan-59g.shadowserver.org
-65.49.1.115 # scan-59h.shadowserver.org
-65.49.1.116 # scan-59i.shadowserver.org
-65.49.1.117 # scan-59j.shadowserver.org
-65.49.1.118 # scan-59k.shadowserver.org
-65.49.1.119 # scan-59l.shadowserver.org
-65.49.1.120 # scan-59m.shadowserver.org
-65.49.1.121 # scan-59n.shadowserver.org
-64.62.156.10 # scan-60-0.shadowserver.org
-64.62.156.11 # scan-60-1.shadowserver.org
-64.62.156.12 # scan-60-2.shadowserver.org
-64.62.156.13 # scan-60-3.shadowserver.org
-64.62.156.14 # scan-60-4.shadowserver.org
-64.62.156.15 # scan-60-5.shadowserver.org
-64.62.156.16 # scan-60-6.shadowserver.org
-64.62.156.17 # scan-60-7.shadowserver.org
-64.62.156.18 # scan-60-8.shadowserver.org
-64.62.156.19 # scan-60-9.shadowserver.org
-64.62.156.20 # scan-60-10.shadowserver.org
-64.62.156.21 # scan-60-11.shadowserver.org
-64.62.156.22 # scan-60-12.shadowserver.org
-64.62.156.23 # scan-60-13.shadowserver.org
-64.62.156.24 # scan-61-0.shadowserver.org
-64.62.156.25 # scan-61-1.shadowserver.org
-64.62.156.26 # scan-61-2.shadowserver.org
-64.62.156.27 # scan-61-3.shadowserver.org
-64.62.156.28 # scan-61-4.shadowserver.org
-64.62.156.29 # scan-61-5.shadowserver.org
-64.62.156.30 # scan-61-6.shadowserver.org
-64.62.156.31 # scan-61-7.shadowserver.org
-64.62.156.32 # scan-61-8.shadowserver.org
-64.62.156.33 # scan-61-9.shadowserver.org
-64.62.156.34 # scan-61-10.shadowserver.org
-64.62.156.35 # scan-61-11.shadowserver.org
-64.62.156.36 # scan-61-12.shadowserver.org
-64.62.156.37 # scan-61-13.shadowserver.org
-64.62.156.38 # scan-62-0.shadowserver.org
-64.62.156.39 # scan-62-1.shadowserver.org
-64.62.156.40 # scan-62-2.shadowserver.org
-64.62.156.41 # scan-62-3.shadowserver.org
-64.62.156.42 # scan-62-4.shadowserver.org
-64.62.156.43 # scan-62-5.shadowserver.org
-64.62.156.45 # scan-62-7.shadowserver.org
-64.62.156.46 # scan-62-8.shadowserver.org
-64.62.156.47 # scan-62-9.shadowserver.org
-64.62.156.48 # scan-62-10.shadowserver.org
-64.62.156.49 # scan-62-11.shadowserver.org
-64.62.156.50 # scan-62-12.shadowserver.org
-64.62.156.51 # scan-62-13.shadowserver.org
-64.62.156.52 # scan-63-0.shadowserver.org
-64.62.156.53 # scan-63-1.shadowserver.org
-64.62.156.54 # scan-63-2.shadowserver.org
-64.62.156.55 # scan-63-3.shadowserver.org
-64.62.156.56 # scan-63-4.shadowserver.org
-64.62.156.57 # scan-63-5.shadowserver.org
-64.62.156.58 # scan-63-6.shadowserver.org
-64.62.156.59 # scan-63-7.shadowserver.org
-64.62.156.60 # scan-63-8.shadowserver.org
-64.62.156.61 # scan-63-9.shadowserver.org
-64.62.156.62 # scan-63-10.shadowserver.org
-64.62.156.63 # scan-63-11.shadowserver.org
-64.62.156.64 # scan-63-12.shadowserver.org
-64.62.156.65 # scan-63-13.shadowserver.org
-64.62.156.66 # scan-64-0.shadowserver.org
-64.62.156.67 # scan-64-1.shadowserver.org
-64.62.156.68 # scan-64-2.shadowserver.org
-64.62.156.69 # scan-64-3.shadowserver.org
-64.62.156.70 # scan-64-4.shadowserver.org
-64.62.156.71 # scan-64-5.shadowserver.org
-64.62.156.72 # scan-64-6.shadowserver.org
-64.62.156.73 # scan-64-7.shadowserver.org
-64.62.156.74 # scan-64-8.shadowserver.org
-64.62.156.75 # scan-64-9.shadowserver.org
-64.62.156.76 # scan-64-10.shadowserver.org
-64.62.156.77 # scan-64-11.shadowserver.org
-64.62.156.78 # scan-64-12.shadowserver.org
-64.62.156.79 # scan-64-13.shadowserver.org
-64.62.156.80 # scan-65-0.shadowserver.org
-64.62.156.81 # scan-65-1.shadowserver.org
-64.62.156.82 # scan-65-2.shadowserver.org
-64.62.156.83 # scan-65-3.shadowserver.org
-64.62.156.84 # scan-65-4.shadowserver.org
-64.62.156.85 # scan-65-5.shadowserver.org
-64.62.156.86 # scan-65-6.shadowserver.org
-64.62.156.87 # scan-65-7.shadowserver.org
-64.62.156.88 # scan-65-8.shadowserver.org
-64.62.156.89 # scan-65-9.shadowserver.org
-64.62.156.90 # scan-65-10.shadowserver.org
-64.62.156.91 # scan-65-11.shadowserver.org
-64.62.156.92 # scan-65-12.shadowserver.org
-64.62.156.93 # scan-65-13.shadowserver.org
-64.62.156.94 # scan-66-0.shadowserver.org
-64.62.156.95 # scan-66-1.shadowserver.org
-64.62.156.96 # scan-66-2.shadowserver.org
-64.62.156.97 # scan-66-3.shadowserver.org
-64.62.156.98 # scan-66-4.shadowserver.org
-64.62.156.99 # scan-66-5.shadowserver.org
-64.62.156.100 # scan-66-6.shadowserver.org
-64.62.156.101 # scan-66-7.shadowserver.org
-64.62.156.102 # scan-66-8.shadowserver.org
-64.62.156.103 # scan-66-9.shadowserver.org
-64.62.156.104 # scan-66-10.shadowserver.org
-64.62.156.105 # scan-66-11.shadowserver.org
-64.62.156.106 # scan-66-12.shadowserver.org
-64.62.156.107 # scan-66-13.shadowserver.org
-64.62.156.108 # scan-67-0.shadowserver.org
-64.62.156.109 # scan-67-1.shadowserver.org
-64.62.156.110 # scan-67-2.shadowserver.org
-64.62.156.111 # scan-67-3.shadowserver.org
-64.62.156.112 # scan-67-4.shadowserver.org
-64.62.156.113 # scan-67-5.shadowserver.org
-64.62.156.114 # scan-67-6.shadowserver.org
-64.62.156.115 # scan-67-7.shadowserver.org
-64.62.156.116 # scan-67-8.shadowserver.org
-64.62.156.117 # scan-67-9.shadowserver.org
-64.62.156.118 # scan-67-10.shadowserver.org
-64.62.156.119 # scan-67-11.shadowserver.org
-64.62.156.120 # scan-67-12.shadowserver.org
-64.62.156.121 # scan-67-13.shadowserver.org
\ No newline at end of file
diff --git a/dicom_server/storage/c_store_files/received_2025-02-26_12-53-08.939114 b/dicom_server/storage/c_store_files/received_2025-02-26_12-53-08.939114
deleted file mode 100644
index 44f4271e..00000000
Binary files a/dicom_server/storage/c_store_files/received_2025-02-26_12-53-08.939114 and /dev/null differ
diff --git a/dicom_server/storage/c_store_files/received_2025-02-26_12-53-09.097456 b/dicom_server/storage/c_store_files/received_2025-02-26_12-53-09.097456
deleted file mode 100644
index 638ffdf6..00000000
Binary files a/dicom_server/storage/c_store_files/received_2025-02-26_12-53-09.097456 and /dev/null differ
diff --git a/dicom_server/storage/c_store_files/received_2025-02-26_12-56-32.368162 b/dicom_server/storage/c_store_files/received_2025-02-26_12-56-32.368162
deleted file mode 100644
index bbce5a60..00000000
Binary files a/dicom_server/storage/c_store_files/received_2025-02-26_12-56-32.368162 and /dev/null differ
diff --git a/dicom_server/storage/c_store_files/received_2025-02-26_12-56-32.399083 b/dicom_server/storage/c_store_files/received_2025-02-26_12-56-32.399083
deleted file mode 100644
index c513b319..00000000
Binary files a/dicom_server/storage/c_store_files/received_2025-02-26_12-56-32.399083 and /dev/null differ
diff --git a/dicom_server/storage/c_store_files/received_2025-02-26_13-00-30.089549 b/dicom_server/storage/c_store_files/received_2025-02-26_13-00-30.089549
deleted file mode 100644
index 6e01b3a6..00000000
Binary files a/dicom_server/storage/c_store_files/received_2025-02-26_13-00-30.089549 and /dev/null differ
diff --git a/dicom_server/storage/can.pdf b/dicom_server/storage/can.pdf
deleted file mode 100644
index f09f842b..00000000
Binary files a/dicom_server/storage/can.pdf and /dev/null differ
diff --git a/dicom_server/storage/db.db b/dicom_server/storage/db.db
deleted file mode 100644
index ce3c53fb..00000000
Binary files a/dicom_server/storage/db.db and /dev/null differ
diff --git a/dicom_server/storage/hash_store.json b/dicom_server/storage/hash_store.json
deleted file mode 100644
index 9e26dfee..00000000
--- a/dicom_server/storage/hash_store.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.10590189250759975484045586598017156720/1.2.826.0.1.3680043.8.498.64675181953256514698349738265049013348/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.10590189250759975484045586598017156720/1.2.826.0.1.3680043.8.498.64675181953256514698349738265049013348/00000001.dcm
deleted file mode 100644
index 4949edbc..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.10590189250759975484045586598017156720/1.2.826.0.1.3680043.8.498.64675181953256514698349738265049013348/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.10590189250759975484045586598017156720/1.2.826.0.1.3680043.8.498.64675181953256514698349738265049013348/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.10590189250759975484045586598017156720/1.2.826.0.1.3680043.8.498.64675181953256514698349738265049013348/00000002.dcm
deleted file mode 100644
index 29841f16..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.10590189250759975484045586598017156720/1.2.826.0.1.3680043.8.498.64675181953256514698349738265049013348/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.11521666132076923398505473312237369872/1.2.826.0.1.3680043.8.498.58131925766316692806954208860593548975/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.11521666132076923398505473312237369872/1.2.826.0.1.3680043.8.498.58131925766316692806954208860593548975/00000001.dcm
deleted file mode 100644
index 64979e21..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.11521666132076923398505473312237369872/1.2.826.0.1.3680043.8.498.58131925766316692806954208860593548975/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12092211869299543174144151270097208503/1.2.826.0.1.3680043.8.498.24813410926618868397958152054722832537/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12092211869299543174144151270097208503/1.2.826.0.1.3680043.8.498.24813410926618868397958152054722832537/00000001.dcm
deleted file mode 100644
index d22d929d..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12092211869299543174144151270097208503/1.2.826.0.1.3680043.8.498.24813410926618868397958152054722832537/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12092211869299543174144151270097208503/1.2.826.0.1.3680043.8.498.24813410926618868397958152054722832537/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12092211869299543174144151270097208503/1.2.826.0.1.3680043.8.498.24813410926618868397958152054722832537/00000002.dcm
deleted file mode 100644
index 3c8f7464..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12092211869299543174144151270097208503/1.2.826.0.1.3680043.8.498.24813410926618868397958152054722832537/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12789618790915575737569169577709574058/1.2.826.0.1.3680043.8.498.64664222092397241027140542183552634309/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12789618790915575737569169577709574058/1.2.826.0.1.3680043.8.498.64664222092397241027140542183552634309/00000001.dcm
deleted file mode 100644
index bbb5b0e3..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12789618790915575737569169577709574058/1.2.826.0.1.3680043.8.498.64664222092397241027140542183552634309/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12789618790915575737569169577709574058/1.2.826.0.1.3680043.8.498.64664222092397241027140542183552634309/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12789618790915575737569169577709574058/1.2.826.0.1.3680043.8.498.64664222092397241027140542183552634309/00000002.dcm
deleted file mode 100644
index 49fc3830..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.12789618790915575737569169577709574058/1.2.826.0.1.3680043.8.498.64664222092397241027140542183552634309/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.15867113980020672749037038235838520621/1.2.826.0.1.3680043.8.498.10776917505079578074674440543693933273/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.15867113980020672749037038235838520621/1.2.826.0.1.3680043.8.498.10776917505079578074674440543693933273/00000001.dcm
deleted file mode 100644
index e4819bb3..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.15867113980020672749037038235838520621/1.2.826.0.1.3680043.8.498.10776917505079578074674440543693933273/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.18809524771405495957430010686157800832/1.2.826.0.1.3680043.8.498.11728802670035389210485800010930119876/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.18809524771405495957430010686157800832/1.2.826.0.1.3680043.8.498.11728802670035389210485800010930119876/00000001.dcm
deleted file mode 100644
index fdbe05a4..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.18809524771405495957430010686157800832/1.2.826.0.1.3680043.8.498.11728802670035389210485800010930119876/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.18809524771405495957430010686157800832/1.2.826.0.1.3680043.8.498.11728802670035389210485800010930119876/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.18809524771405495957430010686157800832/1.2.826.0.1.3680043.8.498.11728802670035389210485800010930119876/00000002.dcm
deleted file mode 100644
index 133bed39..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.18809524771405495957430010686157800832/1.2.826.0.1.3680043.8.498.11728802670035389210485800010930119876/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.41747937481231429594425601806493478324/1.2.826.0.1.3680043.8.498.10776852485749554875676183144298037551/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.41747937481231429594425601806493478324/1.2.826.0.1.3680043.8.498.10776852485749554875676183144298037551/00000001.dcm
deleted file mode 100644
index 2e66a3ff..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.41747937481231429594425601806493478324/1.2.826.0.1.3680043.8.498.10776852485749554875676183144298037551/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.43511894471965770332726010803645184927/1.2.826.0.1.3680043.8.498.31869434214003203621364398786903016238/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.43511894471965770332726010803645184927/1.2.826.0.1.3680043.8.498.31869434214003203621364398786903016238/00000001.dcm
deleted file mode 100644
index f893b30f..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.43511894471965770332726010803645184927/1.2.826.0.1.3680043.8.498.31869434214003203621364398786903016238/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.44332593349059635271472846871645659900/1.2.826.0.1.3680043.8.498.81022868098800302211702599263528801698/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.44332593349059635271472846871645659900/1.2.826.0.1.3680043.8.498.81022868098800302211702599263528801698/00000001.dcm
deleted file mode 100644
index 6aa27ba2..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.44332593349059635271472846871645659900/1.2.826.0.1.3680043.8.498.81022868098800302211702599263528801698/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.44332593349059635271472846871645659900/1.2.826.0.1.3680043.8.498.81022868098800302211702599263528801698/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.44332593349059635271472846871645659900/1.2.826.0.1.3680043.8.498.81022868098800302211702599263528801698/00000002.dcm
deleted file mode 100644
index 4d95c5c2..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.44332593349059635271472846871645659900/1.2.826.0.1.3680043.8.498.81022868098800302211702599263528801698/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.46316696679784040321276909407618254115/1.2.826.0.1.3680043.8.498.60134155504455913083991074956053279022/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.46316696679784040321276909407618254115/1.2.826.0.1.3680043.8.498.60134155504455913083991074956053279022/00000001.dcm
deleted file mode 100644
index df938dde..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.46316696679784040321276909407618254115/1.2.826.0.1.3680043.8.498.60134155504455913083991074956053279022/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.46316696679784040321276909407618254115/1.2.826.0.1.3680043.8.498.60134155504455913083991074956053279022/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.46316696679784040321276909407618254115/1.2.826.0.1.3680043.8.498.60134155504455913083991074956053279022/00000002.dcm
deleted file mode 100644
index 18452c78..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.46316696679784040321276909407618254115/1.2.826.0.1.3680043.8.498.60134155504455913083991074956053279022/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.49074372699768127504649608365685190993/1.2.826.0.1.3680043.8.498.96177029239087592369756038786097171128/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.49074372699768127504649608365685190993/1.2.826.0.1.3680043.8.498.96177029239087592369756038786097171128/00000001.dcm
deleted file mode 100644
index 24781cef..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.49074372699768127504649608365685190993/1.2.826.0.1.3680043.8.498.96177029239087592369756038786097171128/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.49074372699768127504649608365685190993/1.2.826.0.1.3680043.8.498.96177029239087592369756038786097171128/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.49074372699768127504649608365685190993/1.2.826.0.1.3680043.8.498.96177029239087592369756038786097171128/00000002.dcm
deleted file mode 100644
index 38e4055d..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.49074372699768127504649608365685190993/1.2.826.0.1.3680043.8.498.96177029239087592369756038786097171128/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.51124740674841311872969826194585880486/1.2.826.0.1.3680043.8.498.72770021774801564503649092990007161078/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.51124740674841311872969826194585880486/1.2.826.0.1.3680043.8.498.72770021774801564503649092990007161078/00000001.dcm
deleted file mode 100644
index 6bb3aa79..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.51124740674841311872969826194585880486/1.2.826.0.1.3680043.8.498.72770021774801564503649092990007161078/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.57585422726306831494010424988699945769/1.2.826.0.1.3680043.8.498.75628722642579922728765867820565988434/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.57585422726306831494010424988699945769/1.2.826.0.1.3680043.8.498.75628722642579922728765867820565988434/00000001.dcm
deleted file mode 100644
index 7d33707a..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.57585422726306831494010424988699945769/1.2.826.0.1.3680043.8.498.75628722642579922728765867820565988434/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.58669736542305382855730930244121988214/1.2.826.0.1.3680043.8.498.12592356111722599139024658446004261858/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.58669736542305382855730930244121988214/1.2.826.0.1.3680043.8.498.12592356111722599139024658446004261858/00000001.dcm
deleted file mode 100644
index 5f06a7a2..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.58669736542305382855730930244121988214/1.2.826.0.1.3680043.8.498.12592356111722599139024658446004261858/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.58669736542305382855730930244121988214/1.2.826.0.1.3680043.8.498.12592356111722599139024658446004261858/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.58669736542305382855730930244121988214/1.2.826.0.1.3680043.8.498.12592356111722599139024658446004261858/00000002.dcm
deleted file mode 100644
index 64ee47bd..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.58669736542305382855730930244121988214/1.2.826.0.1.3680043.8.498.12592356111722599139024658446004261858/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.62334915881703564549096769369240067056/1.2.826.0.1.3680043.8.498.10613514618311750075164273140064492154/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.62334915881703564549096769369240067056/1.2.826.0.1.3680043.8.498.10613514618311750075164273140064492154/00000001.dcm
deleted file mode 100644
index 55229567..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.62334915881703564549096769369240067056/1.2.826.0.1.3680043.8.498.10613514618311750075164273140064492154/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.62334915881703564549096769369240067056/1.2.826.0.1.3680043.8.498.10613514618311750075164273140064492154/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.62334915881703564549096769369240067056/1.2.826.0.1.3680043.8.498.10613514618311750075164273140064492154/00000002.dcm
deleted file mode 100644
index c89f94dc..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.62334915881703564549096769369240067056/1.2.826.0.1.3680043.8.498.10613514618311750075164273140064492154/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.66102171793526349306276293030861669810/1.2.826.0.1.3680043.8.498.17163262143307443838764191506444479449/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.66102171793526349306276293030861669810/1.2.826.0.1.3680043.8.498.17163262143307443838764191506444479449/00000001.dcm
deleted file mode 100644
index 69543f75..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.66102171793526349306276293030861669810/1.2.826.0.1.3680043.8.498.17163262143307443838764191506444479449/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.66102171793526349306276293030861669810/1.2.826.0.1.3680043.8.498.17163262143307443838764191506444479449/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.66102171793526349306276293030861669810/1.2.826.0.1.3680043.8.498.17163262143307443838764191506444479449/00000002.dcm
deleted file mode 100644
index d3f58851..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.66102171793526349306276293030861669810/1.2.826.0.1.3680043.8.498.17163262143307443838764191506444479449/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.66862912571271290939199869512914303337/1.2.826.0.1.3680043.8.498.46465246539583469137808738818259336446/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.66862912571271290939199869512914303337/1.2.826.0.1.3680043.8.498.46465246539583469137808738818259336446/00000001.dcm
deleted file mode 100644
index cd525f24..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.66862912571271290939199869512914303337/1.2.826.0.1.3680043.8.498.46465246539583469137808738818259336446/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.82710566058583395333771138197091774088/1.2.826.0.1.3680043.8.498.11735835072178673649794529934996964240/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.82710566058583395333771138197091774088/1.2.826.0.1.3680043.8.498.11735835072178673649794529934996964240/00000001.dcm
deleted file mode 100644
index 85a1cd85..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.82710566058583395333771138197091774088/1.2.826.0.1.3680043.8.498.11735835072178673649794529934996964240/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.89213458580428630877960297402444571202/1.2.826.0.1.3680043.8.498.15205626005850970146760208703760454536/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.89213458580428630877960297402444571202/1.2.826.0.1.3680043.8.498.15205626005850970146760208703760454536/00000001.dcm
deleted file mode 100644
index 74947303..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.89213458580428630877960297402444571202/1.2.826.0.1.3680043.8.498.15205626005850970146760208703760454536/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.89213458580428630877960297402444571202/1.2.826.0.1.3680043.8.498.15205626005850970146760208703760454536/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.89213458580428630877960297402444571202/1.2.826.0.1.3680043.8.498.15205626005850970146760208703760454536/00000002.dcm
deleted file mode 100644
index a9f1ad44..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.89213458580428630877960297402444571202/1.2.826.0.1.3680043.8.498.15205626005850970146760208703760454536/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.90055437863574373707335490243842875769/1.2.826.0.1.3680043.8.498.20101284692353901983957570488040654219/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.90055437863574373707335490243842875769/1.2.826.0.1.3680043.8.498.20101284692353901983957570488040654219/00000001.dcm
deleted file mode 100644
index 7eb7ea93..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.90055437863574373707335490243842875769/1.2.826.0.1.3680043.8.498.20101284692353901983957570488040654219/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.90055437863574373707335490243842875769/1.2.826.0.1.3680043.8.498.20101284692353901983957570488040654219/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.90055437863574373707335490243842875769/1.2.826.0.1.3680043.8.498.20101284692353901983957570488040654219/00000002.dcm
deleted file mode 100644
index da865662..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.90055437863574373707335490243842875769/1.2.826.0.1.3680043.8.498.20101284692353901983957570488040654219/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.99840597448218397131606914894463064250/1.2.826.0.1.3680043.8.498.91128023732295823846769994360531891722/00000001.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.99840597448218397131606914894463064250/1.2.826.0.1.3680043.8.498.91128023732295823846769994360531891722/00000001.dcm
deleted file mode 100644
index e0ff8182..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.99840597448218397131606914894463064250/1.2.826.0.1.3680043.8.498.91128023732295823846769994360531891722/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.99840597448218397131606914894463064250/1.2.826.0.1.3680043.8.498.91128023732295823846769994360531891722/00000002.dcm b/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.99840597448218397131606914894463064250/1.2.826.0.1.3680043.8.498.91128023732295823846769994360531891722/00000002.dcm
deleted file mode 100644
index 0022c231..00000000
Binary files a/dicom_server/storage/sample_tcia_data/CT/1.2.826.0.1.3680043.8.498.99840597448218397131606914894463064250/1.2.826.0.1.3680043.8.498.91128023732295823846769994360531891722/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.10016530598716229545556354630675336346/1.2.826.0.1.3680043.8.498.76964482956790630774191887306762025099/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.10016530598716229545556354630675336346/1.2.826.0.1.3680043.8.498.76964482956790630774191887306762025099/00000001.dcm
deleted file mode 100644
index b9cd3a8b..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.10016530598716229545556354630675336346/1.2.826.0.1.3680043.8.498.76964482956790630774191887306762025099/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.10953655899506566867543625124162185718/1.2.826.0.1.3680043.8.498.37712308716840430129202783066130640695/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.10953655899506566867543625124162185718/1.2.826.0.1.3680043.8.498.37712308716840430129202783066130640695/00000001.dcm
deleted file mode 100644
index 5db52596..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.10953655899506566867543625124162185718/1.2.826.0.1.3680043.8.498.37712308716840430129202783066130640695/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.10961256429424324357531751322010058643/1.2.826.0.1.3680043.8.498.38787993987831179365346899921989289686/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.10961256429424324357531751322010058643/1.2.826.0.1.3680043.8.498.38787993987831179365346899921989289686/00000001.dcm
deleted file mode 100644
index 93e5f7b0..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.10961256429424324357531751322010058643/1.2.826.0.1.3680043.8.498.38787993987831179365346899921989289686/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11056066153490659290670526801442649204/1.2.826.0.1.3680043.8.498.88158496882218130910015817620284218886/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11056066153490659290670526801442649204/1.2.826.0.1.3680043.8.498.88158496882218130910015817620284218886/00000001.dcm
deleted file mode 100644
index 89f37290..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11056066153490659290670526801442649204/1.2.826.0.1.3680043.8.498.88158496882218130910015817620284218886/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11086765944648725850616801314012245100/1.2.826.0.1.3680043.8.498.99005491134431028147299440951612863564/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11086765944648725850616801314012245100/1.2.826.0.1.3680043.8.498.99005491134431028147299440951612863564/00000001.dcm
deleted file mode 100644
index aa90c173..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11086765944648725850616801314012245100/1.2.826.0.1.3680043.8.498.99005491134431028147299440951612863564/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11519997722692684500088745411169056945/1.2.826.0.1.3680043.8.498.11251845704002745669172920280193080008/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11519997722692684500088745411169056945/1.2.826.0.1.3680043.8.498.11251845704002745669172920280193080008/00000001.dcm
deleted file mode 100644
index 4af1b0f0..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11519997722692684500088745411169056945/1.2.826.0.1.3680043.8.498.11251845704002745669172920280193080008/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11519997722692684500088745411169056945/1.2.826.0.1.3680043.8.498.11251845704002745669172920280193080008/00000002.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11519997722692684500088745411169056945/1.2.826.0.1.3680043.8.498.11251845704002745669172920280193080008/00000002.dcm
deleted file mode 100644
index a0e0a6b0..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11519997722692684500088745411169056945/1.2.826.0.1.3680043.8.498.11251845704002745669172920280193080008/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11828085988669984176082080378228587642/1.2.826.0.1.3680043.8.498.77027556151213329327584981393017274111/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11828085988669984176082080378228587642/1.2.826.0.1.3680043.8.498.77027556151213329327584981393017274111/00000001.dcm
deleted file mode 100644
index dd212f57..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11828085988669984176082080378228587642/1.2.826.0.1.3680043.8.498.77027556151213329327584981393017274111/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11888112058071025657057967243360502339/1.2.826.0.1.3680043.8.498.73223614250517487784765873672365636069/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11888112058071025657057967243360502339/1.2.826.0.1.3680043.8.498.73223614250517487784765873672365636069/00000001.dcm
deleted file mode 100644
index 84963f2a..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.11888112058071025657057967243360502339/1.2.826.0.1.3680043.8.498.73223614250517487784765873672365636069/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.12645847045629770682637553302672826138/1.2.826.0.1.3680043.8.498.88785786556888771701752891543574627760/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.12645847045629770682637553302672826138/1.2.826.0.1.3680043.8.498.88785786556888771701752891543574627760/00000001.dcm
deleted file mode 100644
index f25cc60e..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.12645847045629770682637553302672826138/1.2.826.0.1.3680043.8.498.88785786556888771701752891543574627760/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.12730706601557331064137759099320535240/1.2.826.0.1.3680043.8.498.48235596565827532156720042565387934126/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.12730706601557331064137759099320535240/1.2.826.0.1.3680043.8.498.48235596565827532156720042565387934126/00000001.dcm
deleted file mode 100644
index c45dd3bb..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.12730706601557331064137759099320535240/1.2.826.0.1.3680043.8.498.48235596565827532156720042565387934126/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.12851311793227958258648782747982183755/1.2.826.0.1.3680043.8.498.27246094578961120216506188867897882544/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.12851311793227958258648782747982183755/1.2.826.0.1.3680043.8.498.27246094578961120216506188867897882544/00000001.dcm
deleted file mode 100644
index 2d16bd23..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.12851311793227958258648782747982183755/1.2.826.0.1.3680043.8.498.27246094578961120216506188867897882544/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.13027110343492862025061156971186177591/1.2.826.0.1.3680043.8.498.82772433924422938090461176784880654379/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.13027110343492862025061156971186177591/1.2.826.0.1.3680043.8.498.82772433924422938090461176784880654379/00000001.dcm
deleted file mode 100644
index 2c8ba8dd..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.13027110343492862025061156971186177591/1.2.826.0.1.3680043.8.498.82772433924422938090461176784880654379/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.18249985052609049432768566524404320180/1.2.826.0.1.3680043.8.498.14733073439642691143785373098264355455/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.18249985052609049432768566524404320180/1.2.826.0.1.3680043.8.498.14733073439642691143785373098264355455/00000001.dcm
deleted file mode 100644
index 4a7053a4..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.18249985052609049432768566524404320180/1.2.826.0.1.3680043.8.498.14733073439642691143785373098264355455/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.22948900337817704030380606946454005116/1.2.826.0.1.3680043.8.498.60981990697886527128450987935768672259/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.22948900337817704030380606946454005116/1.2.826.0.1.3680043.8.498.60981990697886527128450987935768672259/00000001.dcm
deleted file mode 100644
index a0053fcd..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.22948900337817704030380606946454005116/1.2.826.0.1.3680043.8.498.60981990697886527128450987935768672259/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.41373139881624515383324698857551536131/1.2.826.0.1.3680043.8.498.54647031164110955647871028385998642999/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.41373139881624515383324698857551536131/1.2.826.0.1.3680043.8.498.54647031164110955647871028385998642999/00000001.dcm
deleted file mode 100644
index de19bc2a..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.41373139881624515383324698857551536131/1.2.826.0.1.3680043.8.498.54647031164110955647871028385998642999/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.43598293831943126250686971694472589645/1.2.826.0.1.3680043.8.498.13114444380968476758042952382481724785/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.43598293831943126250686971694472589645/1.2.826.0.1.3680043.8.498.13114444380968476758042952382481724785/00000001.dcm
deleted file mode 100644
index 093e1c7a..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.43598293831943126250686971694472589645/1.2.826.0.1.3680043.8.498.13114444380968476758042952382481724785/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.44871478262580726159642912637468264906/1.2.826.0.1.3680043.8.498.45414781186542652771210998166535776298/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.44871478262580726159642912637468264906/1.2.826.0.1.3680043.8.498.45414781186542652771210998166535776298/00000001.dcm
deleted file mode 100644
index fe6310e6..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.44871478262580726159642912637468264906/1.2.826.0.1.3680043.8.498.45414781186542652771210998166535776298/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.48689595924039569729132912117968444145/1.2.826.0.1.3680043.8.498.22619008643675601792715060429210807576/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.48689595924039569729132912117968444145/1.2.826.0.1.3680043.8.498.22619008643675601792715060429210807576/00000001.dcm
deleted file mode 100644
index 1250e063..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.48689595924039569729132912117968444145/1.2.826.0.1.3680043.8.498.22619008643675601792715060429210807576/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.51884442048815016337072669990290820087/1.2.826.0.1.3680043.8.498.12085240629641738891267260835079850514/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.51884442048815016337072669990290820087/1.2.826.0.1.3680043.8.498.12085240629641738891267260835079850514/00000001.dcm
deleted file mode 100644
index 4871f989..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.51884442048815016337072669990290820087/1.2.826.0.1.3680043.8.498.12085240629641738891267260835079850514/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.51884442048815016337072669990290820087/1.2.826.0.1.3680043.8.498.12085240629641738891267260835079850514/00000002.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.51884442048815016337072669990290820087/1.2.826.0.1.3680043.8.498.12085240629641738891267260835079850514/00000002.dcm
deleted file mode 100644
index 3420ea5d..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.51884442048815016337072669990290820087/1.2.826.0.1.3680043.8.498.12085240629641738891267260835079850514/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.51884442048815016337072669990290820087/1.2.826.0.1.3680043.8.498.12085240629641738891267260835079850514/00000003.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.51884442048815016337072669990290820087/1.2.826.0.1.3680043.8.498.12085240629641738891267260835079850514/00000003.dcm
deleted file mode 100644
index 77be6f16..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.51884442048815016337072669990290820087/1.2.826.0.1.3680043.8.498.12085240629641738891267260835079850514/00000003.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.52646395242122471142806229622199450712/1.2.826.0.1.3680043.8.498.11294620885455739738270527112565625028/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.52646395242122471142806229622199450712/1.2.826.0.1.3680043.8.498.11294620885455739738270527112565625028/00000001.dcm
deleted file mode 100644
index 37ad4596..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.52646395242122471142806229622199450712/1.2.826.0.1.3680043.8.498.11294620885455739738270527112565625028/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.61185429242941491998901137907616115919/1.2.826.0.1.3680043.8.498.13546189517769929717508047560726929784/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.61185429242941491998901137907616115919/1.2.826.0.1.3680043.8.498.13546189517769929717508047560726929784/00000001.dcm
deleted file mode 100644
index e87407ce..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.61185429242941491998901137907616115919/1.2.826.0.1.3680043.8.498.13546189517769929717508047560726929784/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.61231715940387747205240553266273298672/1.2.826.0.1.3680043.8.498.24376537816938669547413767886515286352/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.61231715940387747205240553266273298672/1.2.826.0.1.3680043.8.498.24376537816938669547413767886515286352/00000001.dcm
deleted file mode 100644
index 9fa8d7b3..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.61231715940387747205240553266273298672/1.2.826.0.1.3680043.8.498.24376537816938669547413767886515286352/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.63160548072861040333956455770918143416/1.2.826.0.1.3680043.8.498.42879836681281290930599050679443237175/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.63160548072861040333956455770918143416/1.2.826.0.1.3680043.8.498.42879836681281290930599050679443237175/00000001.dcm
deleted file mode 100644
index 290ae18b..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.63160548072861040333956455770918143416/1.2.826.0.1.3680043.8.498.42879836681281290930599050679443237175/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.65120751395402212102282663379583114382/1.2.826.0.1.3680043.8.498.76447558434138733815986151058642286613/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.65120751395402212102282663379583114382/1.2.826.0.1.3680043.8.498.76447558434138733815986151058642286613/00000001.dcm
deleted file mode 100644
index 6ba7f385..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.65120751395402212102282663379583114382/1.2.826.0.1.3680043.8.498.76447558434138733815986151058642286613/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.70136330041439720145944702763426846921/1.2.826.0.1.3680043.8.498.87159304116183887799250096168722032679/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.70136330041439720145944702763426846921/1.2.826.0.1.3680043.8.498.87159304116183887799250096168722032679/00000001.dcm
deleted file mode 100644
index c32732de..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.70136330041439720145944702763426846921/1.2.826.0.1.3680043.8.498.87159304116183887799250096168722032679/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.77158241914882687983336433942002658174/1.2.826.0.1.3680043.8.498.88479698105332608627363875812023139030/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.77158241914882687983336433942002658174/1.2.826.0.1.3680043.8.498.88479698105332608627363875812023139030/00000001.dcm
deleted file mode 100644
index 7b8fb4eb..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.77158241914882687983336433942002658174/1.2.826.0.1.3680043.8.498.88479698105332608627363875812023139030/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.80545970942555911093186671539853379974/1.2.826.0.1.3680043.8.498.10826552316063983814634096092996973710/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.80545970942555911093186671539853379974/1.2.826.0.1.3680043.8.498.10826552316063983814634096092996973710/00000001.dcm
deleted file mode 100644
index ce187cc7..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.80545970942555911093186671539853379974/1.2.826.0.1.3680043.8.498.10826552316063983814634096092996973710/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.86501642064911014989766849611882652300/1.2.826.0.1.3680043.8.498.93440634059035920217865934049323687751/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.86501642064911014989766849611882652300/1.2.826.0.1.3680043.8.498.93440634059035920217865934049323687751/00000001.dcm
deleted file mode 100644
index 390b7ddc..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.86501642064911014989766849611882652300/1.2.826.0.1.3680043.8.498.93440634059035920217865934049323687751/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.86501642064911014989766849611882652300/1.2.826.0.1.3680043.8.498.93440634059035920217865934049323687751/00000002.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.86501642064911014989766849611882652300/1.2.826.0.1.3680043.8.498.93440634059035920217865934049323687751/00000002.dcm
deleted file mode 100644
index b5308b70..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.86501642064911014989766849611882652300/1.2.826.0.1.3680043.8.498.93440634059035920217865934049323687751/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.88919413328939057310684704396468125831/1.2.826.0.1.3680043.8.498.34213137259961574552171572852149118288/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.88919413328939057310684704396468125831/1.2.826.0.1.3680043.8.498.34213137259961574552171572852149118288/00000001.dcm
deleted file mode 100644
index 9fdf3e64..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.88919413328939057310684704396468125831/1.2.826.0.1.3680043.8.498.34213137259961574552171572852149118288/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.90447984118889125290656930539760021955/1.2.826.0.1.3680043.8.498.79121710236723851541443933597449500426/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.90447984118889125290656930539760021955/1.2.826.0.1.3680043.8.498.79121710236723851541443933597449500426/00000001.dcm
deleted file mode 100644
index 624b7a41..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.90447984118889125290656930539760021955/1.2.826.0.1.3680043.8.498.79121710236723851541443933597449500426/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.90447984118889125290656930539760021955/1.2.826.0.1.3680043.8.498.79121710236723851541443933597449500426/00000002.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.90447984118889125290656930539760021955/1.2.826.0.1.3680043.8.498.79121710236723851541443933597449500426/00000002.dcm
deleted file mode 100644
index cc887a0e..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.90447984118889125290656930539760021955/1.2.826.0.1.3680043.8.498.79121710236723851541443933597449500426/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.90447984118889125290656930539760021955/1.2.826.0.1.3680043.8.498.79121710236723851541443933597449500426/00000003.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.90447984118889125290656930539760021955/1.2.826.0.1.3680043.8.498.79121710236723851541443933597449500426/00000003.dcm
deleted file mode 100644
index 53b1dfda..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.90447984118889125290656930539760021955/1.2.826.0.1.3680043.8.498.79121710236723851541443933597449500426/00000003.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.91856967460746511092599161682753832435/1.2.826.0.1.3680043.8.498.13327059512260671448015110058705214736/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.91856967460746511092599161682753832435/1.2.826.0.1.3680043.8.498.13327059512260671448015110058705214736/00000001.dcm
deleted file mode 100644
index f5f919e5..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.91856967460746511092599161682753832435/1.2.826.0.1.3680043.8.498.13327059512260671448015110058705214736/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.92471253071352609895919459309524054478/1.2.826.0.1.3680043.8.498.41439320857683907105200296458210989978/00000001.dcm b/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.92471253071352609895919459309524054478/1.2.826.0.1.3680043.8.498.41439320857683907105200296458210989978/00000001.dcm
deleted file mode 100644
index 03f14dae..00000000
Binary files a/dicom_server/storage/sample_tcia_data/MR/1.2.826.0.1.3680043.8.498.92471253071352609895919459309524054478/1.2.826.0.1.3680043.8.498.41439320857683907105200296458210989978/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.10275134433123282773425514344177008679/1.2.826.0.1.3680043.8.498.57830462228033348392944602795914046152/00000001.dcm b/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.10275134433123282773425514344177008679/1.2.826.0.1.3680043.8.498.57830462228033348392944602795914046152/00000001.dcm
deleted file mode 100644
index c17fd07d..00000000
Binary files a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.10275134433123282773425514344177008679/1.2.826.0.1.3680043.8.498.57830462228033348392944602795914046152/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.11441169722243151012033467917709555840/1.2.826.0.1.3680043.8.498.11554619108128409104742257546265152956/00000001.dcm b/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.11441169722243151012033467917709555840/1.2.826.0.1.3680043.8.498.11554619108128409104742257546265152956/00000001.dcm
deleted file mode 100644
index 2b3a3d53..00000000
Binary files a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.11441169722243151012033467917709555840/1.2.826.0.1.3680043.8.498.11554619108128409104742257546265152956/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.11904248216115874096925809760764564266/1.2.826.0.1.3680043.8.498.13007024930753414216301706711018242576/00000001.dcm b/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.11904248216115874096925809760764564266/1.2.826.0.1.3680043.8.498.13007024930753414216301706711018242576/00000001.dcm
deleted file mode 100644
index 03efa6ec..00000000
Binary files a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.11904248216115874096925809760764564266/1.2.826.0.1.3680043.8.498.13007024930753414216301706711018242576/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.12294514441811850869482213648053863831/1.2.826.0.1.3680043.8.498.51563503770574889672074868065611774244/00000001.dcm b/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.12294514441811850869482213648053863831/1.2.826.0.1.3680043.8.498.51563503770574889672074868065611774244/00000001.dcm
deleted file mode 100644
index bd0a27bc..00000000
Binary files a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.12294514441811850869482213648053863831/1.2.826.0.1.3680043.8.498.51563503770574889672074868065611774244/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.53733333505222903282605570971296315077/1.2.826.0.1.3680043.8.498.77199717797025850115601034298570814309/00000001.dcm b/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.53733333505222903282605570971296315077/1.2.826.0.1.3680043.8.498.77199717797025850115601034298570814309/00000001.dcm
deleted file mode 100644
index 98a0ab88..00000000
Binary files a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.53733333505222903282605570971296315077/1.2.826.0.1.3680043.8.498.77199717797025850115601034298570814309/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.91269274418970155329339929061904590599/1.2.826.0.1.3680043.8.498.70404263125594726728302027515142865689/00000001.dcm b/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.91269274418970155329339929061904590599/1.2.826.0.1.3680043.8.498.70404263125594726728302027515142865689/00000001.dcm
deleted file mode 100644
index 7811c74b..00000000
Binary files a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.91269274418970155329339929061904590599/1.2.826.0.1.3680043.8.498.70404263125594726728302027515142865689/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.95965396556488944877205455370018694777/1.2.826.0.1.3680043.8.498.11788834693029532846659051958491316092/00000001.dcm b/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.95965396556488944877205455370018694777/1.2.826.0.1.3680043.8.498.11788834693029532846659051958491316092/00000001.dcm
deleted file mode 100644
index eabf3d25..00000000
Binary files a/dicom_server/storage/sample_tcia_data/US/1.2.826.0.1.3680043.8.498.95965396556488944877205455370018694777/1.2.826.0.1.3680043.8.498.11788834693029532846659051958491316092/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1222/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1222/00000001.dcm
deleted file mode 100644
index 69941be2..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1222/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1222/00000002.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1222/00000002.dcm
deleted file mode 100644
index dabac1e4..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1222/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1222/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1222/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1222/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1224/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1224/00000001.dcm
deleted file mode 100644
index 71583640..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1224/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1224/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1224/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1/1.3.6.1.4.1.9328.50.4.1224/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2315/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2315/00000001.dcm
deleted file mode 100644
index 61fcea49..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2315/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2315/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2315/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2315/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2317/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2317/00000001.dcm
deleted file mode 100644
index efb5ed6d..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2317/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2317/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2317/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.1240/1.3.6.1.4.1.9328.50.4.2317/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3739/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3739/00000001.dcm
deleted file mode 100644
index 91c1a5b3..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3739/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3739/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3739/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3739/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3741/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3741/00000001.dcm
deleted file mode 100644
index 5bde26e4..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3741/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3741/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3741/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.2319/1.3.6.1.4.1.9328.50.4.3741/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4909/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4909/00000001.dcm
deleted file mode 100644
index eda0a177..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4909/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4909/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4909/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4909/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4911/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4911/00000001.dcm
deleted file mode 100644
index f85b81e1..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4911/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4911/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4911/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.3827/1.3.6.1.4.1.9328.50.4.4911/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5515/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5515/00000001.dcm
deleted file mode 100644
index f52a98a1..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5515/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5515/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5515/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5515/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5517/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5517/00000001.dcm
deleted file mode 100644
index c2061832..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5517/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5517/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5517/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5514/1.3.6.1.4.1.9328.50.4.5517/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6492/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6492/00000001.dcm
deleted file mode 100644
index 34667802..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6492/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6492/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6492/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6492/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6494/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6494/00000001.dcm
deleted file mode 100644
index ab126526..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6494/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6494/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6494/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.5690/1.3.6.1.4.1.9328.50.4.6494/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6645/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6645/00000001.dcm
deleted file mode 100644
index 9854e17d..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6645/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6645/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6645/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6645/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6648/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6648/00000001.dcm
deleted file mode 100644
index c9d8a710..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6648/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6648/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6648/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.6644/1.3.6.1.4.1.9328.50.4.6648/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7884/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7884/00000001.dcm
deleted file mode 100644
index 204cc620..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7884/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7884/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7884/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7884/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7887/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7887/00000001.dcm
deleted file mode 100644
index 72159e66..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7887/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7887/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7887/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.7700/1.3.6.1.4.1.9328.50.4.7887/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8972/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8972/00000001.dcm
deleted file mode 100644
index 858278e6..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8972/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8972/00000002.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8972/00000002.dcm
deleted file mode 100644
index 53ba1f61..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8972/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8972/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8972/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8972/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8975/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8975/00000001.dcm
deleted file mode 100644
index 7027064c..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8975/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8975/00000002.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8975/00000002.dcm
deleted file mode 100644
index 28ab06e6..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8975/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8975/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8975/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.8971/1.3.6.1.4.1.9328.50.4.8975/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.9864/1.3.6.1.4.1.9328.50.4.10410/00000001.dcm b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.9864/1.3.6.1.4.1.9328.50.4.10410/00000001.dcm
deleted file mode 100644
index 419d4058..00000000
Binary files a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.9864/1.3.6.1.4.1.9328.50.4.10410/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.9864/1.3.6.1.4.1.9328.50.4.10410/LICENSE b/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.9864/1.3.6.1.4.1.9328.50.4.10410/LICENSE
deleted file mode 100644
index 260564e1..00000000
--- a/dicom_server/storage/tcia_data/CT/1.3.6.1.4.1.9328.50.4.9864/1.3.6.1.4.1.9328.50.4.10410/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The CT COLONOGRAPHY collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/00000001.dcm
deleted file mode 100644
index 2538300e..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/00000002.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/00000002.dcm
deleted file mode 100644
index ef75485f..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/00000003.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/00000003.dcm
deleted file mode 100644
index 9cd7befb..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/00000003.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333/1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/00000001.dcm
deleted file mode 100644
index 262febd7..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/00000002.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/00000002.dcm
deleted file mode 100644
index 5968f759..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/00000003.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/00000003.dcm
deleted file mode 100644
index cd860a75..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/00000003.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.214977269702839341119466032225/1.3.6.1.4.1.14519.5.2.1.3344.4004.202746879813159634459448440239/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/00000001.dcm
deleted file mode 100644
index 122e3897..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/00000002.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/00000002.dcm
deleted file mode 100644
index 0d5289c7..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/00000003.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/00000003.dcm
deleted file mode 100644
index abc1283b..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/00000003.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.3344.4004.351166456082622648398326533596/1.3.6.1.4.1.14519.5.2.1.3344.4004.272487956995344916792939892979/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/00000001.dcm
deleted file mode 100644
index b31450e5..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/00000002.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/00000002.dcm
deleted file mode 100644
index a0b636ea..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/00000003.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/00000003.dcm
deleted file mode 100644
index f916abd5..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/00000003.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/LICENSE
deleted file mode 100644
index 5e53c3c6..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.193649047777130441728491079961/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-BRCA collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.403937030827769964464463925040/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.403937030827769964464463925040/00000001.dcm
deleted file mode 100644
index 667be063..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.403937030827769964464463925040/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.403937030827769964464463925040/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.403937030827769964464463925040/LICENSE
deleted file mode 100644
index 5e53c3c6..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.102062272840540438760965339143/1.3.6.1.4.1.14519.5.2.1.6450.4002.403937030827769964464463925040/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-BRCA collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.200275600888726925129353314254/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.200275600888726925129353314254/00000001.dcm
deleted file mode 100644
index e6c9954e..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.200275600888726925129353314254/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.200275600888726925129353314254/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.200275600888726925129353314254/LICENSE
deleted file mode 100644
index 5e53c3c6..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.200275600888726925129353314254/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-BRCA collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/00000001.dcm
deleted file mode 100644
index 277e79af..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/00000002.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/00000002.dcm
deleted file mode 100644
index c460721d..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/00000002.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/00000003.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/00000003.dcm
deleted file mode 100644
index 81adb95a..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/00000003.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/LICENSE
deleted file mode 100644
index 5e53c3c6..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4002.211186279484947894320684250626/1.3.6.1.4.1.14519.5.2.1.6450.4002.306508291402583996893904746007/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-BRCA collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.181533441897904852444135591210/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.181533441897904852444135591210/00000001.dcm
deleted file mode 100644
index ce4c6656..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.181533441897904852444135591210/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.181533441897904852444135591210/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.181533441897904852444135591210/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.181533441897904852444135591210/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.193128412117078354762782748985/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.193128412117078354762782748985/00000001.dcm
deleted file mode 100644
index 5452ff9b..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.193128412117078354762782748985/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.193128412117078354762782748985/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.193128412117078354762782748985/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.193128412117078354762782748985/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.248423970716449525479791191555/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.248423970716449525479791191555/00000001.dcm
deleted file mode 100644
index 56cbe194..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.248423970716449525479791191555/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.248423970716449525479791191555/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.248423970716449525479791191555/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.248423970716449525479791191555/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.314884631720526583701949985455/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.314884631720526583701949985455/00000001.dcm
deleted file mode 100644
index 1863f460..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.314884631720526583701949985455/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.314884631720526583701949985455/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.314884631720526583701949985455/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.314884631720526583701949985455/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.479466354380429411985863772640/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.479466354380429411985863772640/00000001.dcm
deleted file mode 100644
index 0f6771e1..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.479466354380429411985863772640/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.479466354380429411985863772640/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.479466354380429411985863772640/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.479466354380429411985863772640/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.777980414333503818608912381207/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.777980414333503818608912381207/00000001.dcm
deleted file mode 100644
index f2e2d23c..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.777980414333503818608912381207/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.777980414333503818608912381207/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.777980414333503818608912381207/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.6450.4004.826194787045364541764616401951/1.3.6.1.4.1.14519.5.2.1.6450.4004.777980414333503818608912381207/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.8421.4010.494820795574321354068305701989/1.3.6.1.4.1.14519.5.2.1.8421.4010.599891696674786828895575528385/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.8421.4010.494820795574321354068305701989/1.3.6.1.4.1.14519.5.2.1.8421.4010.599891696674786828895575528385/00000001.dcm
deleted file mode 100644
index f6934cd5..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.8421.4010.494820795574321354068305701989/1.3.6.1.4.1.14519.5.2.1.8421.4010.599891696674786828895575528385/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.8421.4010.494820795574321354068305701989/1.3.6.1.4.1.14519.5.2.1.8421.4010.599891696674786828895575528385/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.8421.4010.494820795574321354068305701989/1.3.6.1.4.1.14519.5.2.1.8421.4010.599891696674786828895575528385/LICENSE
deleted file mode 100644
index d6bb84a2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.8421.4010.494820795574321354068305701989/1.3.6.1.4.1.14519.5.2.1.8421.4010.599891696674786828895575528385/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRP collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4002.598259735076963619140290764151/1.3.6.1.4.1.14519.5.2.1.9203.4002.316107347605352262747330582345/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4002.598259735076963619140290764151/1.3.6.1.4.1.14519.5.2.1.9203.4002.316107347605352262747330582345/00000001.dcm
deleted file mode 100644
index 089944ef..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4002.598259735076963619140290764151/1.3.6.1.4.1.14519.5.2.1.9203.4002.316107347605352262747330582345/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4002.598259735076963619140290764151/1.3.6.1.4.1.14519.5.2.1.9203.4002.316107347605352262747330582345/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4002.598259735076963619140290764151/1.3.6.1.4.1.14519.5.2.1.9203.4002.316107347605352262747330582345/LICENSE
deleted file mode 100644
index 5e53c3c6..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4002.598259735076963619140290764151/1.3.6.1.4.1.14519.5.2.1.9203.4002.316107347605352262747330582345/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-BRCA collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.120040831509964218651869989360/1.3.6.1.4.1.14519.5.2.1.9203.4004.217511570228283505925392655478/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.120040831509964218651869989360/1.3.6.1.4.1.14519.5.2.1.9203.4004.217511570228283505925392655478/00000001.dcm
deleted file mode 100644
index 9fc59dde..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.120040831509964218651869989360/1.3.6.1.4.1.14519.5.2.1.9203.4004.217511570228283505925392655478/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.120040831509964218651869989360/1.3.6.1.4.1.14519.5.2.1.9203.4004.217511570228283505925392655478/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.120040831509964218651869989360/1.3.6.1.4.1.14519.5.2.1.9203.4004.217511570228283505925392655478/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.120040831509964218651869989360/1.3.6.1.4.1.14519.5.2.1.9203.4004.217511570228283505925392655478/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.277223612814392319061038141767/1.3.6.1.4.1.14519.5.2.1.9203.4004.112408759615899648853868305405/00000001.dcm b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.277223612814392319061038141767/1.3.6.1.4.1.14519.5.2.1.9203.4004.112408759615899648853868305405/00000001.dcm
deleted file mode 100644
index d7796a7c..00000000
Binary files a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.277223612814392319061038141767/1.3.6.1.4.1.14519.5.2.1.9203.4004.112408759615899648853868305405/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.277223612814392319061038141767/1.3.6.1.4.1.14519.5.2.1.9203.4004.112408759615899648853868305405/LICENSE b/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.277223612814392319061038141767/1.3.6.1.4.1.14519.5.2.1.9203.4004.112408759615899648853868305405/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/storage/tcia_data/MR/1.3.6.1.4.1.14519.5.2.1.9203.4004.277223612814392319061038141767/1.3.6.1.4.1.14519.5.2.1.9203.4004.112408759615899648853868305405/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/storage/tcia_data/US/1.3.6.1.4.1.14519.5.2.1.108454284526362480267821337495591719224/1.3.6.1.4.1.14519.5.2.1.74792416577700287889704207257650233333/00000001.dcm b/dicom_server/storage/tcia_data/US/1.3.6.1.4.1.14519.5.2.1.108454284526362480267821337495591719224/1.3.6.1.4.1.14519.5.2.1.74792416577700287889704207257650233333/00000001.dcm
deleted file mode 100644
index 40ec6e5d..00000000
Binary files a/dicom_server/storage/tcia_data/US/1.3.6.1.4.1.14519.5.2.1.108454284526362480267821337495591719224/1.3.6.1.4.1.14519.5.2.1.74792416577700287889704207257650233333/00000001.dcm and /dev/null differ
diff --git a/dicom_server/storage/tcia_data/US/1.3.6.1.4.1.14519.5.2.1.108454284526362480267821337495591719224/1.3.6.1.4.1.14519.5.2.1.74792416577700287889704207257650233333/LICENSE b/dicom_server/storage/tcia_data/US/1.3.6.1.4.1.14519.5.2.1.108454284526362480267821337495591719224/1.3.6.1.4.1.14519.5.2.1.74792416577700287889704207257650233333/LICENSE
deleted file mode 100644
index 87342916..00000000
--- a/dicom_server/storage/tcia_data/US/1.3.6.1.4.1.14519.5.2.1.108454284526362480267821337495591719224/1.3.6.1.4.1.14519.5.2.1.74792416577700287889704207257650233333/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The Prostate-MRI-US-Biopsy collection is distributed under the CC BY 4.0 at https://creativecommons.org/licenses/by/4.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/tests/global_patcher.py b/dicom_server/tests/global_patcher.py
deleted file mode 100644
index e1cd0985..00000000
--- a/dicom_server/tests/global_patcher.py
+++ /dev/null
@@ -1,17 +0,0 @@
-import sys, os
-from unittest.mock import patch, Mock
-
-sys.path.append(os.path.abspath(".."))
-
-
-patch.multiple(
- "config",
- DICOM_DATABASE="./mock_database.db",
- DICOM_STORAGE_DIR="./mock_dicom_files/",
- FLASK_ACTIVATED=False,
-).start()
-
-patch.multiple(
- "utilities.dicom_util",
- assign_runtime_contexts_support=Mock(return_value=""),
-).start()
diff --git a/dicom_server/tests/mock_database.db b/dicom_server/tests/mock_database.db
deleted file mode 100644
index e05fce50..00000000
Binary files a/dicom_server/tests/mock_database.db and /dev/null differ
diff --git "a/dicom_server/tests/mock_dicom_files/CT_Oliver M\303\270ller_1.dcm" "b/dicom_server/tests/mock_dicom_files/CT_Oliver M\303\270ller_1.dcm"
deleted file mode 100644
index 8dd76d14..00000000
Binary files "a/dicom_server/tests/mock_dicom_files/CT_Oliver M\303\270ller_1.dcm" and /dev/null differ
diff --git a/dicom_server/tests/mock_dicom_files/DX_Amanda Larsen_1.dcm b/dicom_server/tests/mock_dicom_files/DX_Amanda Larsen_1.dcm
deleted file mode 100644
index a214139a..00000000
Binary files a/dicom_server/tests/mock_dicom_files/DX_Amanda Larsen_1.dcm and /dev/null differ
diff --git "a/dicom_server/tests/mock_dicom_files/MR_Agnete \303\230stergaard_1.dcm" "b/dicom_server/tests/mock_dicom_files/MR_Agnete \303\230stergaard_1.dcm"
deleted file mode 100644
index 8489245b..00000000
Binary files "a/dicom_server/tests/mock_dicom_files/MR_Agnete \303\230stergaard_1.dcm" and /dev/null differ
diff --git a/dicom_server/tests/mock_dicom_files/OPT_Ronnie Nikolajsen_compressed_MPEG4AV.dcm b/dicom_server/tests/mock_dicom_files/OPT_Ronnie Nikolajsen_compressed_MPEG4AV.dcm
deleted file mode 100644
index 23506ab2..00000000
Binary files a/dicom_server/tests/mock_dicom_files/OPT_Ronnie Nikolajsen_compressed_MPEG4AV.dcm and /dev/null differ
diff --git a/dicom_server/tests/mock_dicom_files/US_Jarl Frederiksen_1.dcm b/dicom_server/tests/mock_dicom_files/US_Jarl Frederiksen_1.dcm
deleted file mode 100644
index 2f96634d..00000000
Binary files a/dicom_server/tests/mock_dicom_files/US_Jarl Frederiksen_1.dcm and /dev/null differ
diff --git a/dicom_server/tests/mock_dicom_files_tcia/CT_Flemming Andresen_1.dcm b/dicom_server/tests/mock_dicom_files_tcia/CT_Flemming Andresen_1.dcm
deleted file mode 100644
index 7ad664ac..00000000
Binary files a/dicom_server/tests/mock_dicom_files_tcia/CT_Flemming Andresen_1.dcm and /dev/null differ
diff --git a/dicom_server/tests/mock_tcia_files/CT/1.3.6.1.4.1.14519.5.2.1.1706.4004.444177310459496979546263018696/1.3.6.1.4.1.14519.5.2.1.1706.4004.177628054013141234562279962482/00000001.dcm b/dicom_server/tests/mock_tcia_files/CT/1.3.6.1.4.1.14519.5.2.1.1706.4004.444177310459496979546263018696/1.3.6.1.4.1.14519.5.2.1.1706.4004.177628054013141234562279962482/00000001.dcm
deleted file mode 100644
index 2baead91..00000000
Binary files a/dicom_server/tests/mock_tcia_files/CT/1.3.6.1.4.1.14519.5.2.1.1706.4004.444177310459496979546263018696/1.3.6.1.4.1.14519.5.2.1.1706.4004.177628054013141234562279962482/00000001.dcm and /dev/null differ
diff --git a/dicom_server/tests/mock_tcia_files/CT/1.3.6.1.4.1.14519.5.2.1.1706.4004.444177310459496979546263018696/1.3.6.1.4.1.14519.5.2.1.1706.4004.177628054013141234562279962482/LICENSE b/dicom_server/tests/mock_tcia_files/CT/1.3.6.1.4.1.14519.5.2.1.1706.4004.444177310459496979546263018696/1.3.6.1.4.1.14519.5.2.1.1706.4004.177628054013141234562279962482/LICENSE
deleted file mode 100644
index b29057c2..00000000
--- a/dicom_server/tests/mock_tcia_files/CT/1.3.6.1.4.1.14519.5.2.1.1706.4004.444177310459496979546263018696/1.3.6.1.4.1.14519.5.2.1.1706.4004.177628054013141234562279962482/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-License Information. The TCGA-KIRC collection is distributed under the CC BY 3.0 at http://creativecommons.org/licenses/by/3.0/ By downloading the data, you agree to abide by terms of this license.
-Data Usage Policy
-
-Any user accessing TCIA data must agree to:
-- Not use the requested datasets, either alone or in concert with any other information, to identify or contact individual participants from whom data and/or samples were collected and follow all other conditions specified in the TCIA Site Disclaimer. Approved Users also agree not to generate and use information (e.g., facial images or comparable representations) in a manner that could allow the identities of research participants to be readily ascertained. These provisions do not apply to research investigators operating with specific IRB approval, pursuant to 45 CFR 46, to contact individuals within datasets or to obtain and use identifying information under an IRB-approved research protocol. All investigators including any Approved User conducting “human subjects research” within the scope of 45 CFR 46 must comply with the requirements contained therein.
-
-- Acknowledge in all oral or written presentations, disclosures, or publications the specific dataset(s) or applicable accession number(s) and the NIH-designated data repositories through which the investigator accessed any data. Citation guidelines for doing this are outlined below.
-
-- If you are considering mirroring a copy of our publicly available datasets or providing direct access to any of the TCIA data via another tool or website using the REST API (https://wiki.cancerimagingarchive.net/x/NIIiAQ) please review our Data Analysis Centers (DACs) page (https://wiki.cancerimagingarchive.net/x/x49XAQ) for more information. DACs must provide attribution and links back to this TCIA data use policy and must require downstream users to do the same.
-
-The summary page for every TCIA dataset includes a Citations & Data Usage Policy tab. Please consult the Citation & Data Usage Policy for each Collection before using them.
-- Most data are freely available to browse, download, and use for commercial, scientific and educational purposes as outlined in the Creative Commons Attribution 3.0 Unported License or the Creative Commons Attribution 4.0 International License. In rare circumstances commercial use may be prohibited using Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0) or Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0).
-
-- Most data are immediately accessible and do not require account registration. A small subset of collections do require registration and special permission to gain access. Refer to the "Access" column on https://www.cancerimagingarchive.net/collections/ for more details.
diff --git a/dicom_server/tests/test_handle_find.py b/dicom_server/tests/test_handle_find.py
deleted file mode 100644
index 9695c5bd..00000000
--- a/dicom_server/tests/test_handle_find.py
+++ /dev/null
@@ -1,256 +0,0 @@
-"""
-DICOM C-FIND Handler Test Suite
-
-This test module aims to validate the behavior of the handle_find() method
-within multiple scenarios. To ensure predictable and isolated testing, the following
-were used:
-
-1. ** Mock Data Hardcoded**:
- - A mock DICOM files storages with 5 pre-defined DICOM files was created.
- - A mock database was initialized from the mock files storage.
- - Mock events were created using pytest.fixture.
-
-2. **Mocked Events**:
- - DICOM C-FIND events were simulated using `pydicom.Dataset` objects.
- - Events cover various scenarios:
- - Finding all studies
- - finding specific study by `StudyInstanceUID`
- - Finding all Patients
- - finding specific Patient by `PatientID`
- - finding specific serie by `SerieInstanceUID`
- - Invalid SOP Class UID
- - Invalid identifier attributes
-
-3. **Behavioral Expectations**:
- - Tests validate both the response status codes (e.g., 0xFF00 for pending, 0x0000 for success)
- and the structure of returned datasets.
- - Assertions are based on the expected behavior of the DICOM protocol and the application logic.
-
-4. **Isolation**:
- - Database sessions are mocked to avoid run-time mismatching.
- - Logging is suppressed focus on functional validation (Other tests will take the logging) .
-"""
-
-import sys
-import os
-
-sys.path.append(os.path.abspath("../core/"))
-sys.path.append(os.path.abspath("../pydicom_and_pynetdicom_libs/"))
-import pytest
-from unittest.mock import Mock, patch
-from pydicom import Dataset
-import global_patcher
-
-
-@pytest.fixture
-def event_retreive_all_studies():
- event = Mock()
- request = Mock()
- event.request = request
- ds = Dataset()
- ds.QueryRetrieveLevel = "STUDY"
- event.identifier = ds
- return event
-
-
-@pytest.fixture
-def event_retrieve_specific_study():
- event = Mock()
- request = Mock()
- event.request = request
- ds = Dataset()
- ds.QueryRetrieveLevel = "STUDY"
- ds.StudyInstanceUID = (
- "1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333"
- )
- event.identifier = ds
- return event
-
-
-@pytest.fixture
-def event_retreive_all_patients():
- event = Mock()
- request = Mock()
- event.request = request
- ds = Dataset()
- ds.QueryRetrieveLevel = "PATIENT"
- event.identifier = ds
- return event
-
-
-@pytest.fixture
-def event_retrieve_specific_patient():
- event = Mock()
- request = Mock()
- event.request = request
- ds = Dataset()
- ds.QueryRetrieveLevel = "PATIENT"
- ds.PatientID = "6767"
- event.identifier = ds
- return event
-
-
-@pytest.fixture
-def event_retrieve_series_for_specific_study():
- event = Mock()
- request = Mock()
- event.request = request
- ds = Dataset()
- ds.QueryRetrieveLevel = "SERIES"
- ds.StudyInstanceUID = (
- "1.3.6.1.4.1.14519.5.2.1.3344.4004.189845485896538626080129650333"
- )
- event.identifier = ds
- return event
-
-
-"""
-Before all tests we patch the real database by initialize mock one with four studies for four different patients from a mock dicom files storage
-(Oliver Møller, Amanda Larsen, Agnete Østergaard, Ronnie Nikolajsen and Jarl Frederiksen)
-
-"""
-
-
-@pytest.fixture
-def mock_dicomdb():
- return Mock()
-
-
-import app_container
-
-test_container = app_container.ApplicationContainer()
-dicom_handlers = test_container.dicom_handlers()
-
-
-def test_invalid_sop_class(event_retrieve_specific_study):
- "" " Test handling of invalid SOP Class UID" ""
- with patch.multiple(
- "utilities.dicom_util",
- is_sopclassuid_valid=Mock(return_value=True),
- identifier_invalid=Mock(return_value=False),
- ):
- gen = dicom_handlers.handle_find(event_retrieve_specific_study)
- results = list(gen)
-
- assert len(results) == 1
- assert results[0][0] == 0xA900
-
-
-def test_invalid_identifier(event_retrieve_specific_study):
- """handling of invalid identifier attributes"""
- with patch.multiple(
- "utilities.dicom_util",
- is_sopclassuid_valid=Mock(return_value=False),
- identifier_invalid=Mock(return_value=True),
- ):
- gen = dicom_handlers.handle_find(event_retrieve_specific_study)
- results = list(gen)
-
- assert len(results) == 1
- assert results[0][0] == 0xC006
-
-
-def test_find_all_studies(event_retreive_all_studies):
-
- gen = dicom_handlers.handle_find(event_retreive_all_studies)
- results = list(gen)
- EXPECTED_MATCHES = 5
- EXPECTED_TOTAL = EXPECTED_MATCHES + 1
- assert len(results) == EXPECTED_TOTAL
- assert all(r[0] == 0xFF00 for r in results[:-1])
- assert results[-1][0] == 0x0000
-
-
-def test_find_specific_study(event_retrieve_specific_study):
-
- gen = dicom_handlers.handle_find(event_retrieve_specific_study)
- results = list(gen)
- EXPECTED_MATCHES = 1
- EXPECTED_TOTAL = EXPECTED_MATCHES + 1
- for status, dataset in results[:-1]:
- assert status == 0xFF00
- assert isinstance(dataset, Dataset)
- assert dataset.StudyInstanceUID
- assert len(results) == EXPECTED_TOTAL
- assert all(r[0] == 0xFF00 for r in results[:-1])
- assert results[-1][0] == 0x0000
-
-
-def test_find_all_patients(event_retreive_all_patients):
-
- EXPECTED_PATIENTS = 5
- EXPECTED_TOTAL = EXPECTED_PATIENTS + 1
- gen = dicom_handlers.handle_find(event_retreive_all_patients)
- results = list(gen)
- assert len(results) == EXPECTED_TOTAL
- assert all(r[0] == 0xFF00 for r in results[:-1])
- assert results[-1][0] == 0x0000
-
-
-# The event for this test includes a query with the PatientID for patient "Amanda Larsen"
-# the test pass if one dataset with a patient name of "Amanda Larsen" is returned in the retrieved dataset
-def test_find_specific_patient(event_retrieve_specific_patient):
- gen = dicom_handlers.handle_find(event_retrieve_specific_patient)
- results = list(gen)
- EXPECTED_MATCHES = 1
- EXPECTED_TOTAL = EXPECTED_MATCHES + 1
- EXCPECTED_PATIENT_NAME = "Amanda Larsen"
- for status, dataset in results[:-1]:
- assert status == 0xFF00
- assert isinstance(dataset, Dataset)
- assert dataset.PatientName
- # Assert that Patient level returns no attributes from other levels
- assert not hasattr(dataset, "StudyInstanceUID")
- assert not hasattr(dataset, "SeriesInstanceUID")
- assert results[0][1].PatientName == EXCPECTED_PATIENT_NAME
- assert len(results) == EXPECTED_TOTAL
- assert all(r[0] == 0xFF00 for r in results[:-1])
- assert results[-1][0] == 0x0000
-
-
-# The event for this test includes a query with the studyinstanceUID for a study for patient "Agnete Østergaard"
-# the test pass if one dataset with a seriesInstanceUID of "1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326" and series number of "6" is returned in the retrieved dataset
-def test_find_specific_serie(event_retrieve_series_for_specific_study):
-
- gen = dicom_handlers.handle_find(event_retrieve_series_for_specific_study)
- results = list(gen)
- EXPECTED_MATCHES = 1
- EXPECTED_TOTAL = EXPECTED_MATCHES + 1
- for status, dataset in results[:-1]:
- assert status == 0xFF00
- assert isinstance(dataset, Dataset)
- assert dataset.PatientName
- assert (
- results[0][1].SeriesInstanceUID
- == "1.3.6.1.4.1.14519.5.2.1.3344.4004.838622281675929509435013026326"
- )
- assert results[0][1].SeriesNumber == "6"
- assert len(results) == EXPECTED_TOTAL
- assert all(r[0] == 0xFF00 for r in results[:-1])
- assert results[-1][0] == 0x0000
-
-
-def test_response_generation_failure(event_retreive_all_patients, mock_dicomdb):
- # Here we build two empty datasets simulating the files in the storage are corrupted
- test_matches = [Dataset(), Dataset()]
- mock_dicomdb.get_response_data.side_effect = Exception("Test error")
-
- with patch.multiple(
- "utilities.dicom_util",
- is_sopclassuid_valid=Mock(return_value=False),
- identifier_invalid=Mock(return_value=False),
- all_requested=Mock(return_value=True),
- get_query_level=Mock(return_value="PATIENT"),
- ), patch.multiple(
- "dicomdb.DicomDatabase", query_all_patients=Mock(return_value=test_matches)
- ):
- gen = dicom_handlers.handle_find(event_retreive_all_patients)
- results = list(gen)
-
- assert (
- len(results) == 3
- ) # the failure state indicate thatt handle_find yilds (generate) three failures responses one on each returned dataset and a failure response
- assert results[0][0] == 0xC001
-
-
-pytest.main(["-v", "test_handle_find.py"])
diff --git a/dicom_server/tests/test_handle_get.py b/dicom_server/tests/test_handle_get.py
deleted file mode 100644
index 04e092ec..00000000
--- a/dicom_server/tests/test_handle_get.py
+++ /dev/null
@@ -1,115 +0,0 @@
-""" This module tests the functionality of the dicom_handlers handle_get() function for retrieving both uncompressed and compressed DICOM files.
-Asseretations:
-
-- The correct number of datasets is returned.
-
-- The returned files contain the expected patient names.
-
-- The transfer syntax is correctly handled (compressed or uncompressed)
-
-"""
-
-import sys
-import os
-
-sys.path.append(os.path.abspath("../core"))
-sys.path.append(os.path.abspath("../pydicom_and_pynetdicom_libs/"))
-
-import pytest
-from pydicom import Dataset
-from pydicom.uid import UID
-from unittest.mock import Mock
-from pynetdicom.sop_class import CTImageStorage
-import global_patcher
-import app_container
-
-test_container = app_container.ApplicationContainer()
-dicom_handlers = test_container.dicom_handlers()
-
-
-@pytest.fixture
-def event_uncompress_retrieve():
-
- event = Mock()
- event.event = Mock()
- ds = Dataset()
- ds.QueryRetrieveLevel = "STUDY"
- ds.StudyInstanceUID = "1.3.6.1.4.1.9328.50.4.1240"
- event.identifier = ds
-
- event.context = {
- "abstract_syntax": CTImageStorage,
- "transfer_syntax": "1.2.840.10008.1.2.1", # Little Endian
- }
- return event
-
-
-@pytest.fixture
-def event_compress_retrieve():
-
- event = Mock()
- event.event = Mock()
- ds = Dataset()
- ds.QueryRetrieveLevel = "STUDY"
- ds.StudyInstanceUID = (
- "1.2.826.0.1.3680043.8.1055.1.20111102150758591.92402465.76075429"
- )
- event.identifier = ds
-
- event.context = {
- "abstract_syntax": "1.2.840.10008.5.1.4.1.1.77.1.5.4",
- "transfer_syntax": "1.2.840.10008.1.2.4.91",
- }
- return event
-
-
-def test_get_uncompressed_file_using_little_Endian(event_uncompress_retrieve: Mock):
- """
- Tests the retrieval of an uncompressed
- DICOM file using Little Endian transfer syntax
-
- """
-
- gen = test_container.dicom_handlers().handle_get(event_uncompress_retrieve)
- result = list(gen)
- print("Reees", result[3])
-
- EXCPECTED_RETURNED_SETS = 1
- EXCPECTED_PATIONT_NAME_FOR_THIS_STUDY = "Oliver Møller"
- # Assert returning the excpected number of set
- assert result[0] == EXCPECTED_RETURNED_SETS
- RETURNED_FILE = result[2][1]
- # Assert the handle_get returns a dataset value
- assert not RETURNED_FILE == None
- # Assert the Excpected file's patient name based on the mock studyInstanceUID
- assert RETURNED_FILE.PatientName == EXCPECTED_PATIONT_NAME_FOR_THIS_STUDY
- # Assert the file is not commpressed
- assert not RETURNED_FILE.file_meta.TransferSyntaxUID.is_compressed
-
-
-def test_get_compressed_file_using_JPEG2000(event_compress_retrieve: Mock):
- """
- Tests the retrieval of a compressed DICOM
- file using JPEG 2000 transfer syntax
-
- """
-
- # Assert the use of compressed transfer syntax to retrieve the file
- assert UID(event_compress_retrieve.context["transfer_syntax"]).is_compressed
- gen = dicom_handlers.handle_get(event_compress_retrieve)
- result = list(gen)
- EXCPECTED_RETURNED_SETS = 1
- EXCPECTED_PATIONT_NAME_FOR_THIS_STUDY = "Ronnie Nikolajsen"
- # Assert returning the excpected number of set
- assert result[0] == EXCPECTED_RETURNED_SETS
- print(result[1])
- RETURNED_FILE = result[2][1]
- # Assert the handle_get returns a dataset value
- assert not RETURNED_FILE == None
- # Assert the Excpected file's patient name based on the mock studyInstanceUID
- assert RETURNED_FILE.PatientName == EXCPECTED_PATIONT_NAME_FOR_THIS_STUDY
- # Assert the file returned is decommpressed
- assert not RETURNED_FILE.file_meta.TransferSyntaxUID.is_compressed
-
-
-pytest.main(["-v", "test_handle_get.py"])
diff --git a/dicom_server/tests/test_tcia.py b/dicom_server/tests/test_tcia.py
deleted file mode 100644
index cb622dd8..00000000
--- a/dicom_server/tests/test_tcia.py
+++ /dev/null
@@ -1,135 +0,0 @@
-"""Not finished"""
-
-# import sys, schedule, shutil
-# import os
-
-# sys.path.append(os.path.abspath(".."))
-# sys.path.append(os.path.abspath("../core"))
-# sys.path.append(os.path.abspath("../custom_units"))
-# import jwt
-# import pytest
-# from unittest.mock import patch, Mock
-# from datetime import datetime, timedelta
-# import time
-# from faker import Faker
-# from utilities import tcia_util
-
-# patch.multiple(
-# "config",
-# INTEGRITY_CHECK=False,
-# DICOM_DATABASE="./mock_database.db",
-# FLASK_ACTIVATED=False,
-# TCIA_FILES_DIRECTORY="./mock_tcia_files",
-# DICOM_STORAGE_DIR="./mock_dicom_files_tcia",
-# TCIA_FILES_STAGGER_DIRECTORY="./stagger",
-# MAXIMUM_TCIA_FILES_IN_SERIE=1,
-# TCIA_STUDIES_PER_MODALITY=1,
-# MODALITIES=["CT"],
-# ).start()
-
-# import app_container
-
-# test_container = app_container.ApplicationContainer()
-# tcia_manager = test_container.tcia_scheduler().tcia_manager
-# tcia_api = tcia_manager.tcia_api
-
-
-# # def test_get_access_token():
-# # """
-# # Testing get access token from the TCIA API
-
-# # """
-
-# # tcia_api.get_access_token()
-# # token = tcia_api.access_token
-# # decoded_token = jwt.decode(token, options={"verify_signature": False})
-# # assert isinstance(token, str)
-# # assert len(token) > 0
-# # # Issuer claim
-# # assert "iss" in decoded_token
-# # # Expiration time claim
-# # assert "exp" in decoded_token
-# # # Subject claim
-# # assert "sub" in decoded_token
-# # # Assert the token is not expired
-# # current_time = int(time.time())
-# # assert decoded_token["exp"] > current_time
-
-
-# def test_files_stage():
-# tcia_manager.change_dicom_files()
-# assert 1 == 0
-# # Call the staging function
-# # tcia_util.stage_old_files(
-# # tcia_manager.storage_directory, tcia_manager.tcia_dir, tcia_manager.stagger_dir
-# # )
-
-# # tcia_util.restore_old_files(
-# # tcia_manager.storage_directory, tcia_manager.tcia_dir, tcia_manager.stagger_dir
-# # )
-
-
-# # def test_scheduled_job_starts_on_time():
-# # with patch.multiple(
-# # "utilities.tcia_util",
-# # delete_old_files=Mock(return_value=None),
-# # delete_temps=Mock(return_value=None),
-# # ), patch.multiple(
-# # "tcia_management.TCIAAPI",
-# # get_access_token=Mock(return_value=None),
-# # get_new_files=Mock(return_value=None),
-# # ), patch.multiple(
-# # "tcia_management.TCIAManager",
-# # organize_downloaded_files=Mock(return_value=None),
-# # ), patch.multiple(
-# # "dicomdb.DicomDatabase", initialize_database=Mock(return_value=None)
-# # ):
-# # tcia_manager.change_dicom_files()
-# # # Assert changing the dicom files job is scheduled
-# # assert "change_dicom_files()" in str(schedule.jobs)
-# # # current time
-# # now = datetime.now()
-# # # simulate two day elapased
-# # after_two_days = now + timedelta(days=2)
-# # # Patch the time in the schedule libraries to simulat time is passed
-# # with patch("schedule.datetime.datetime") as mock_datetime:
-# # mock_datetime.now.return_value = after_two_days
-# # # schedule.run_pending()
-# # # Assert the job is not executed yet
-# # assert not tcia_manager.change_dicom_files_called
-# # # simulate nine days elapsed
-# # after_nine_days = now + timedelta(days=9)
-# # with patch("schedule.datetime.datetime") as mock_datetime:
-# # mock_datetime.now.return_value = after_nine_days
-# # time.sleep(1)
-# # schedule.run_pending()
-# # # Assert the job is run after nine days elapsed
-# # assert tcia_manager.change_dicom_files_called
-
-
-# # def test_files_retrieved():
-# """
-# simulate retrieving 4 dicom files from 4 modalities each 1 week without running the thread
-
-# """
-
-# # t = get_configured_mock_tcia_object()
-# # try:
-# # shutil.rmtree(t.tcia_dir)
-# # except Exception as e:
-# # print("Temp deletion failed:", e)
-# # # Assert the folder where the files should be downloaded is empty
-# # assert not os.path.isdir(t.tcia_dir)
-# # # get tcia API access token to retrieve the files
-# # t.get_access_token()
-# # # patching the redis database to simulate that the studies have never been exist previously
-# # with patch.multiple(
-# # "redis_handler", get_TCI_existing_studies=Mock(return_value="Nothing".encode())
-# # ):
-# # # retrive the files through an API call
-# # t.get_new_files()
-# # # Assert the directory is not empty
-# # assert len(os.listdir(t.tcia_dir)) > 0
-
-
-# pytest.main(["-v", "test_tcia.py"])
diff --git a/dicom_server/utilities/dicom_util.py b/dicom_server/utilities/dicom_util.py
deleted file mode 100644
index 3f30d6af..00000000
--- a/dicom_server/utilities/dicom_util.py
+++ /dev/null
@@ -1,123 +0,0 @@
-from pynetdicom.apps.qrscp import db
-from pydicom import dcmread
-import config, os
-from datetime import datetime
-import logging
-
-
-exceptions_logger = logging.getLogger("exceptions")
-
-
-def is_patient_level(identifier):
- return identifier.QueryRetrieveLevel == "PATIENT"
-
-
-def is_series_level(identifier):
- return identifier.QueryRetrieveLevel == "SERIES"
-
-
-def is_study_level(identifier):
- return identifier.QueryRetrieveLevel == "STUDY"
-
-
-def get_query_level(identifier):
- return identifier.QueryRetrieveLevel
-
-
-def get_query_parameters(identifier):
-
- return [
- f"{raw.keyword}: {raw.value}"
- for raw in identifier
- if raw.keyword != "QueryRetrieveLevel"
- ]
-
-
-def filter_identifier_tags(identifier):
- if identifier.QueryRetrieveLevel == "STUDY":
- attr = db._STUDY_ROOT_ATTRIBUTES
-
- for raw in identifier:
- if (
- raw.keyword in attr["SERIES"]
- or raw.keyword in attr["IMAGE"]
- or not identifier[raw.keyword].value
- ):
- delattr(identifier, raw.keyword)
-
- elif identifier.QueryRetrieveLevel == "SERIES":
-
- attr = db._STUDY_ROOT_ATTRIBUTES
- for raw in identifier:
- if raw.keyword in attr["IMAGE"] or not identifier[raw.keyword].value:
- delattr(identifier, raw.keyword)
- elif identifier.QueryRetrieveLevel == "PATIENT":
- attr = db._PATIENT_ROOT_ATTRIBUTES
- for raw in identifier:
- if (
- raw.keyword in attr["SERIES"]
- or raw.keyword in attr["IMAGE"]
- or raw.keyword in attr["STUDY"]
- or not identifier[raw.keyword].value
- ):
- delattr(identifier, raw.keyword)
-
-
-def is_sopclassuid_valid(sop_class_uid):
- return sop_class_uid.keyword in (
- "UnifiedProcedureStepPull",
- "ModalityWorklistInformationModelFind",
- )
-
-
-def get_instances():
- instances = []
- for path in os.listdir(config.DICOM_STORAGE_DIR):
- instances.append(dcmread(os.path.join(config.DICOM_STORAGE_DIR, path)))
- return instances
-
-
-def identifier_invalid(identifier):
- return not "QueryRetrieveLevel" in identifier
-
-
-def all_requested(identifier):
- return len(identifier) == 1
-
-
-def file_compressed(instance):
- return instance.file_meta.TransferSyntaxUID.is_compressed
-
-
-def store_received_file(event):
- file_name = "received_" + datetime.now().strftime("%Y-%m-%d_%H-%M-%S.%f")
- event.dataset.file_meta = event.file_meta
- event.dataset.save_as(
- os.path.join(config.C_STORE_STORAGE, file_name), write_like_original=False
- )
-
-
-def assign_runtime_contexts_support(assoc):
- for context in assoc.accepted_contexts:
- context._as_scp = True
- context._as_scu = True
- context.scu_role = True
- context.scp_role = True
-
-
-def is_known_scanner(ip):
- with open(config.BLACKHOLE_FILE_PATH, "r") as file:
- for line in file:
- if ip in line:
- return True
-
- return False
-
-
-def format_log_entry(entry):
- return (
- entry.replace("True", "true")
- .replace("False", "false")
- .replace("None", "null")
- .replace("'", '"')
- )
diff --git a/dicom_server/utilities/tcia_fallback.py b/dicom_server/utilities/tcia_fallback.py
deleted file mode 100644
index 0f230c79..00000000
--- a/dicom_server/utilities/tcia_fallback.py
+++ /dev/null
@@ -1,112 +0,0 @@
-import os
-import shutil
-import logging
-import config
-
-app_logger = logging.getLogger("app_logger")
-exceptions_logger = logging.getLogger("exceptions")
-
-def should_use_fallback(tcia_username, tcia_password):
- """Check if TCIA fallback should be used"""
- # Check if fallback mode is disabled
- if not config.TCIA_FALLBACK_MODE:
- app_logger.info("TCIA fallback mode is disabled")
- return False
-
- # Check if TCIA is disabled via config
- if not config.TCIA_ACTIVATED:
- app_logger.info("TCIA is disabled, using fallback mode")
- return True
-
- # Check if credentials are missing or default
- if (not tcia_username or
- not tcia_password or
- tcia_username == "user" or
- tcia_password == "pass"):
- app_logger.info("TCIA credentials are missing or default, using fallback mode")
- return True
-
- return False
-
-def get_sample_tcia_directory():
- """Get the directory containing sample TCIA files"""
- return os.path.join(os.path.dirname(__file__), '..', 'storage', 'sample_tcia_data')
-
-def copy_sample_files_to_tcia_directory(tcia_dir):
- """Copy sample TCIA files to TCIA directory structure"""
- try:
- app_logger.info("Copying sample TCIA files to TCIA directory...")
-
- # Clear existing TCIA directory contents (but not the directory itself)
- if os.path.exists(tcia_dir):
- for item in os.listdir(tcia_dir):
- item_path = os.path.join(tcia_dir, item)
- if os.path.isdir(item_path):
- shutil.rmtree(item_path)
- else:
- os.remove(item_path)
- else:
- # Create TCIA directory if it doesn't exist
- os.makedirs(tcia_dir)
-
- sample_dir = get_sample_tcia_directory()
-
- if not os.path.exists(sample_dir):
- app_logger.warning(f"Sample TCIA directory not found: {sample_dir}")
- return 0
-
- files_copied = 0
-
- for modality in config.MODALITIES:
- modality_sample_dir = os.path.join(sample_dir, modality)
- if not os.path.exists(modality_sample_dir):
- app_logger.warning(f"No sample files found for modality {modality}")
- continue
-
- modality_dir = os.path.join(tcia_dir, modality)
- os.makedirs(modality_dir)
-
- for study_uid in os.listdir(modality_sample_dir):
- study_sample_dir = os.path.join(modality_sample_dir, study_uid)
- if not os.path.isdir(study_sample_dir):
- continue
-
- for series_uid in os.listdir(study_sample_dir):
- series_sample_dir = os.path.join(study_sample_dir, series_uid)
- if not os.path.isdir(series_sample_dir):
- continue
-
- from pydicom.uid import generate_uid
- new_study_uid = generate_uid()
- new_series_uid = generate_uid()
-
- study_dir = os.path.join(modality_dir, new_study_uid)
- series_dir = os.path.join(study_dir, new_series_uid)
- os.makedirs(series_dir)
-
- for filename in os.listdir(series_sample_dir):
- if filename.endswith('.dcm'):
- src_path = os.path.join(series_sample_dir, filename)
- dest_path = os.path.join(series_dir, filename)
- shutil.copy2(src_path, dest_path)
- files_copied += 1
-
- app_logger.info(f"Copied {files_copied} sample TCIA files to TCIA directory")
- return files_copied
-
- except Exception as e:
- exceptions_logger.exception(f"Error copying sample TCIA files: {e}")
- return 0
-
-def setup_fallback_data(tcia_username, tcia_password, tcia_dir):
- """Setup fallback data if TCIA is unavailable"""
- if should_use_fallback(tcia_username, tcia_password):
- app_logger.info("Setting up TCIA fallback data...")
- files_copied = copy_sample_files_to_tcia_directory(tcia_dir)
- if files_copied > 0:
- app_logger.info(f"Successfully set up {files_copied} fallback TCIA files")
- return True
- else:
- app_logger.warning("Failed to set up fallback data")
- return False
- return False
\ No newline at end of file
diff --git a/dicom_server/utilities/tcia_util.py b/dicom_server/utilities/tcia_util.py
deleted file mode 100644
index 5fec6f17..00000000
--- a/dicom_server/utilities/tcia_util.py
+++ /dev/null
@@ -1,256 +0,0 @@
-import random
-import os
-from datetime import datetime, timedelta
-import logging
-import zipfile
-import io
-from faker import Faker
-import random
-from pydicom import dcmread
-import shutil
-import config
-
-fake = Faker(config.FAKER_LOCALE);
-
-exceptions_logger = logging.getLogger("exceptions")
-
-
-def generate_patient_info():
- try:
- name = ""
- sex = ""
-
- if random.choice([True, False]):
- name = fake.first_name_male() + " " + fake.last_name_male()
- sex = "M"
- else:
- name = fake.first_name_female() + " " + fake.last_name_female()
- sex = "F"
-
- start_birth_date = datetime(1955, 12, 10)
- end_birth_date = datetime(1999, 12, 1)
- random_birth_date = start_birth_date + timedelta(
- days=random.randint(0, (end_birth_date - start_birth_date).days)
- )
- formatted_birth_date = random_birth_date.strftime("%Y%m%d")
-
- start_study_date = datetime(2010, 12, 10)
- end_study_date = datetime(2024, 12, 1)
- random_study_date = start_study_date + timedelta(
- days=random.randint(0, (end_study_date - start_study_date).days)
- )
- formatted_study_date = random_study_date.strftime("%Y%m%d")
- except Exception:
- exceptions_logger.exception(
- "Unexpected error while generating random patient data"
- )
- return (
- name,
- str(random.randint(10, 7400)),
- sex,
- formatted_birth_date,
- str(random.randint(35241, 567331169)),
- formatted_study_date,
- str(random.randint(3528941, 5673331169)),
- )
-
-
-def filter_retrieved_studies(
- existing_studies,
- _json,
- study_counter,
- number_of_studies_in_each_retrieved_modality,
- minimum_files,
- maximum_files,
-):
- metadata = {}
- for entry in _json:
- modality = entry["Modality"]
- study_uid = entry["StudyInstanceUID"]
- series_uid = entry["SeriesInstanceUID"]
- image_count = int(entry["ImageCount"])
-
- if satisfies_series_count_per_study(image_count, minimum_files, maximum_files):
- if never_downloaded_study(
- existing_studies, study_uid
- ) and studies_count_satisfied(
- study_counter, number_of_studies_in_each_retrieved_modality
- ):
- if is_valid_study(metadata, study_uid):
- study_counter += 1
- metadata[study_uid] = []
- metadata[study_uid].append({"se_uid": series_uid, "modality": modality})
- return metadata
-
-
-def extract_and_save_zip_data(mod, st_uid, se_uid, response, tcia_dir):
- with zipfile.ZipFile(io.BytesIO(response.content)) as zip_file:
- zip_file.extractall(path=f"{tcia_dir}/{mod}/{st_uid}/{se_uid}/")
-
-
-def is_valid_study(metadata, study_uid):
- return study_uid not in metadata
-
-
-def never_downloaded_study(existing_studies, study_uid):
- return study_uid.encode() not in existing_studies
-
-
-def studies_count_satisfied(
- study_counter, number_of_studies_in_each_retrieved_modality
-):
- return study_counter < number_of_studies_in_each_retrieved_modality
-
-
-def satisfies_series_count_per_study(image_count, minimum_files, maximum_files):
- return minimum_files <= image_count <= maximum_files
-
-
-def get_random_institution(osm_service=None):
- """
- Get a random medical institution name
- """
- if osm_service and config.OSM_ENABLED:
- try:
- institutions = osm_service.get_medical_institutions()
- if institutions:
- return random.choice(institutions)
- except Exception:
- exceptions_logger.exception("Error getting institution from OSM service, using fallback")
-
- # Fallback to original hardcoded institutions
- return random.choice(config.OSM_FALLBACK_INSTITUTIONS)
-
-
-def store_retrieved_file(
- directory, modality, study_files_counter, patient_name, dataset
-):
- filename = f"{modality}_{patient_name}_{study_files_counter}.dcm"
- filepath = os.path.join(directory, filename)
- try:
- dataset.save_as(filepath)
- except Exception:
- exceptions_logger.exception("File save failed:")
-
-
-def get_files_per_serie(modality, study_uid, se_uid, tcia_dir):
- return os.listdir(os.path.join(tcia_dir, modality, study_uid, se_uid))
-
-
-def get_downloaded_series_per_study(modality, study_uid, tcia_dir):
- return os.listdir(os.path.join(tcia_dir, modality, study_uid))
-
-
-def build_file_dataset(
- modality,
- study_uid,
- patient_name,
- patient_id,
- patient_sex,
- birth_date,
- study_id,
- study_date,
- accession_number,
- institution,
- se_uid,
- file,
- tcia_dir,
-):
- dataset = dcmread(os.path.join(tcia_dir, modality, study_uid, se_uid, file))
- dataset.StudyInstanceUID = study_uid
- dataset.InstitutionName = institution
- dataset.SeriesInstanceUID = se_uid
- dataset.PatientName = patient_name
- dataset.PatientID = patient_id
- dataset.PatientSex = patient_sex
- dataset.PatientBirthDate = birth_date
- dataset.StudyID = study_id
- dataset.AccessionNumber = accession_number
- dataset.StudyDate = study_date
- dataset.SeriesDate = study_date
- return dataset
-
-
-def get_downloaded_modalitis(tcia_dir):
- return os.listdir(tcia_dir)
-
-
-def get_studies_from_modality(modality, tcia_dir):
- return os.listdir(os.path.join(tcia_dir, modality))
-
-
-def initialize_dicom_directory_if_not_exist(storage_directory):
- directory = os.path.join(storage_directory)
- if not os.path.exists(directory):
- os.makedirs(directory)
- return directory
-
-
-def is_licience_file(file):
- return file == "LICENSE"
-
-
-def stage_old_files(storage_dir, tcia_dir, stagger_dir):
- try:
- for filename in os.listdir(storage_dir):
- full_file_path = os.path.join(storage_dir, filename)
- if os.path.isfile(full_file_path):
- dest_path = os.path.join(stagger_dir, "DICOM", filename)
- if os.path.exists(dest_path):
- os.remove(dest_path)
- shutil.move(full_file_path, os.path.join(stagger_dir, "DICOM"))
- for folder in os.listdir(tcia_dir):
- full_folder_path = os.path.join(tcia_dir, folder)
- if os.path.isdir(full_folder_path):
- dest_path = os.path.join(stagger_dir, "TCIA", folder)
- if os.path.exists(dest_path):
- shutil.rmtree(dest_path)
- shutil.move(full_folder_path, os.path.join(stagger_dir, "TCIA"))
- except Exception:
- exceptions_logger.exception("Unexpected error while stagging files")
- raise
-
-
-def restore_old_files(storage_dir, tcia_dir, stagger_dir):
- try:
- for filename in os.listdir(os.path.join(stagger_dir, "DICOM")):
-
- full_file_path = os.path.join(stagger_dir, "DICOM", filename)
- if os.path.isfile(full_file_path):
- dest_path = os.path.join(storage_dir, filename)
- if os.path.exists(dest_path):
- os.remove(dest_path)
- shutil.move(full_file_path, storage_dir)
- for folder in os.listdir((os.path.join(stagger_dir, "TCIA"))):
- full_folder_path = os.path.join(stagger_dir, "TCIA", folder)
- if os.path.isdir(full_folder_path):
- dest_path = os.path.join(tcia_dir, folder)
- if os.path.exists(dest_path):
- shutil.rmtree(dest_path)
- shutil.move(full_folder_path, tcia_dir)
- except Exception:
- exceptions_logger.exception("Unexpected error while restoring files")
- raise
-
-
-def delete_staged_files(stage_dir):
- try:
- for root, dirs, files in os.walk(os.path.join(stage_dir, "DICOM")):
- for file in files:
- file_path = os.path.join(root, file)
- if not file.endswith(".py"):
- os.remove(file_path)
- path_to_remove = os.path.join(stage_dir, "TCIA")
- if os.path.isdir(path_to_remove):
- if not file.endswith(".py"):
- shutil.rmtree(path_to_remove)
-
- except Exception:
- exceptions_logger.exception("Unexpected error while removing stagged files")
- raise
-
-
-def delete_downloded_files_if_exist(tcia_dir):
-
- for dir in os.listdir(tcia_dir):
- shutil.rmtree(os.path.join(tcia_dir, dir))
diff --git a/dicomhawkinit/Dockerfile b/dicomhawkinit/Dockerfile
deleted file mode 100644
index e10c731a..00000000
--- a/dicomhawkinit/Dockerfile
+++ /dev/null
@@ -1,27 +0,0 @@
-FROM alpine:latest
-
-# Use UID 2000 to match T-Pot's security model
-ARG APP_UID=2000
-ARG APP_GID=2000
-
-# Install required packages
-RUN apk add --no-cache \
- logrotate \
- pigz \
- gettext
-
-# Copy dist directory
-COPY dist/ /opt/dicomhawk/
-
-RUN addgroup -g ${APP_GID} dicom \
- && adduser -D -u ${APP_UID} -G dicom -s /bin/sh dicom \
- && chown -R ${APP_UID}:${APP_GID} /opt/dicomhawk
-
-# Set permissions
-RUN chmod 755 /opt/dicomhawk/bin/clean.sh \
- && chmod 755 /opt/dicomhawk/entrypoint.sh \
- && chmod 644 /opt/dicomhawk/etc/logrotate/logrotate.template
-
-USER ${APP_UID}:${APP_GID}
-
-ENTRYPOINT ["/opt/dicomhawk/entrypoint.sh"]
\ No newline at end of file
diff --git a/dicomhawkinit/dist/bin/clean.sh b/dicomhawkinit/dist/bin/clean.sh
deleted file mode 100644
index e8f6fca8..00000000
--- a/dicomhawkinit/dist/bin/clean.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/sh
-# DICOMHawk Log Cleaner & Rotator
-
-RED="\033[0;31m"
-GREEN="\033[0;32m"
-WHITE="\033[0;0m"
-
-PIGZ=$(which pigz)
-if [ -z "$PIGZ" ]; then
- PIGZ=$(which gzip)
-fi
-
-setup_logrotate_conf() {
- local LOGROTATE_CONF="/opt/dicomhawk/etc/logrotate/logrotate.conf"
- local LOGROTATE_TEMP="/opt/dicomhawk/etc/logrotate/logrotate.template"
- envsubst < $LOGROTATE_TEMP > $LOGROTATE_CONF
- chmod 644 $LOGROTATE_CONF
-}
-
-setup_directories() {
- mkdir -p /data/dicomhawk/logs/dicom_raw_logs
- mkdir -p /data/dicomhawk/logs/simplified
- mkdir -p /data/dicomhawk/logs/exceptions
- mkdir -p /data/dicomhawk/logs/api_logs
- mkdir -p /data/dicomhawk/logs/reputation
- mkdir -p /data/dicomhawk/logs/scanned_ips
- chmod 770 /data/dicomhawk/logs -R
-
- mkdir -p /data/dicomhawk/etc/logrotate
- chmod 755 /data/dicomhawk/etc/logrotate
-}
-
-rotate_logs() {
- local STATUS="/data/dicomhawk/etc/logrotate/status"
- local CONF="/opt/dicomhawk/etc/logrotate/logrotate.conf"
-
- setup_logrotate_conf
-
- logrotate -f -s $STATUS $CONF
-
- # Compress any uncompressed rotated logs
- find /data/dicomhawk/logs -type f -name "*.log.*" ! -name "*.gz" -exec $PIGZ -f {} \;
-}
-
-
-echo -e "${GREEN}Starting DICOMHawk log management...${WHITE}"
-
-setup_directories
-
-rotate_logs
-
-echo -e "${GREEN}Log management completed!${WHITE}"
\ No newline at end of file
diff --git a/dicomhawkinit/dist/entrypoint.sh b/dicomhawkinit/dist/entrypoint.sh
deleted file mode 100644
index 22002097..00000000
--- a/dicomhawkinit/dist/entrypoint.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-# Setup cron job with environment variable
-echo "0 0 * * * /opt/dicomhawk/bin/clean.sh ${PERSISTENCE_CYCLES:-30}" > /etc/crontabs/root
-
-# Run clean script once at startup
-/opt/dicomhawk/bin/clean.sh ${PERSISTENCE_CYCLES:-30}
-
-# Start cron daemon to run logrotate periodically
-crond -f -l 2
\ No newline at end of file
diff --git a/dicomhawkinit/dist/etc/logrotate/logrotate.template b/dicomhawkinit/dist/etc/logrotate/logrotate.template
deleted file mode 100644
index 1e3ef748..00000000
--- a/dicomhawkinit/dist/etc/logrotate/logrotate.template
+++ /dev/null
@@ -1,12 +0,0 @@
-/data/dicomhawk/logs/**/*.log
-{
- su root root
- copytruncate
- create 770 root root
- daily
- missingok
- notifempty
- rotate 30
- compress
- compresscmd /usr/bin/pigz
-}
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
deleted file mode 100644
index e5f8c159..00000000
--- a/docker-compose.yml
+++ /dev/null
@@ -1,202 +0,0 @@
-services:
- # Configuration Customizer (runs first)
- customizer:
- profiles: ["main"]
- build: ./customizer/.
- volumes:
- - .:/workspace
- environment:
- - PYTHONUNBUFFERED=1
- networks:
- main_network:
- ipv4_address: 172.29.0.8
-
- # Main Stack Services (profile: main)
- logserver:
- profiles: ["main"]
- build: ./flask_logging_server/.
- tmpfs:
- - /tmp:uid=2000,gid=2000
- volumes:
- - ./data/dicomhawk/logs:/var/log/dicomhawk:uid=2000,gid=2000
- environment:
- - Docker_ENV=True
- networks:
- main_network:
- ipv4_address: 172.29.0.5
- ports:
- - "5000:5000"
-
- api:
- profiles: ["main"]
- build: ./API/.
- depends_on:
- - customizer
- tmpfs:
- - /tmp:uid=2000,gid=2000
- volumes:
- - ./data/dicomhawk/logs:/var/log/dicomhawk:uid=2000,gid=2000
- - ./dicom_server/storage:/opt/dicomhawk/storage:uid=2000,gid=2000
- - ./API/uploads:/api/uploads:uid=2000,gid=2000
- networks:
- main_network:
- ipv4_address: 172.29.0.2
- ports:
- - "3702:3702"
- environment:
- - Docker_ENV=True
- - ABUSE_IP_API_KEY=APIKEY
- - IP_QUALITY_SCORE_API_KEY=APIKEY
- - VIRUS_TOTAL_API_KEY=APIKEY
- - ACCESS_TOKEN_SECRET=${ACCESS_TOKEN_SECRET}
- - REFRESH_TOKEN_SECRET=${REFRESH_TOKEN_SECRET}
- - ADMIN_SECRET=${ADMIN_SECRET}
- - ADMIN_REFRESH_TOKEN_SECRET=${ADMIN_REFRESH_TOKEN_SECRET}
- - SESSION_SECRET=${SESSION_SECRET}
- - API_PORT=${API_PORT}
-
- redis:
- profiles: ["main"]
- image: redis
- user: "2000:2000"
- tmpfs:
- - /tmp:uid=2000,gid=2000
- ports:
- - "6379:6379"
- networks:
- main_network:
- ipv4_address: 172.29.0.4
-
- dicom_server:
- profiles: ["main"]
- depends_on:
- - customizer
- environment:
- - PROD=yes
- - FLASK_ACTIVATED=yes
- - BLOCK_SCANNERS=no
- - INTEGRITY_CHECK=yes
- - TCIA_ACTIVATED=yes
- - BLACKHOLE_FILE_PATH=/opt/dicomhawk/storage/blackhole_list.txt
- - REDIS_HOST=172.29.0.4
- - TCIA_USER_NAME=${TCIA_USER_NAME}
- - TCIA_PASSWORD=${TCIA_PASSWORD}
- - TCIA_PERIOD_UNIT=${TCIA_PERIOD_UNIT}
- - TCIA_PERIOD=${TCIA_PERIOD}
- - FAKER_LOCALE=${FAKER_LOCALE}
- - OSM_ENABLED=${OSM_ENABLED:-true}
- - OSM_COUNTRY=${OSM_COUNTRY}
- - OSM_CITY=${OSM_CITY}
- - OSM_CACHE_DURATION=${OSM_CACHE_DURATION:-24}
- - OSM_MAX_INSTITUTIONS=${OSM_MAX_INSTITUTIONS:-50}
- - OSM_TIMEOUT=${OSM_TIMEOUT:-30}
- - OSM_FALLBACK_INSTITUTIONS=${OSM_FALLBACK_INSTITUTIONS:-["Københavns Sundhedscenter", "Aarhus Kliniken", "Odense Patienthus", "Nordjylland Med Institut"]}
- - ABUSE_IP_API_KEY=${ABUSE_IP_API_KEY}
- - IP_QUALITY_SCORE_API_KEY=${IP_QUALITY_SCORE_API_KEY}
- - VIRUS_TOTAL_API_KEY=${VIRUS_TOTAL_API_KEY}
- - MODALITIES=["CT", "MR", "US", "DX"]
- - MINIMUM_TCIA_FILES_IN_SERIE=1
- - MAXIMUM_TCIA_FILES_IN_SERIE=3
- - TCIA_STUDIES_PER_MODALITY=10
- - DOCKER=yes
- - HONEY_URL="https://[YOURHONEYURL]"
- - DICOM_PORTS=${DICOM_PORTS}
- - DICOM_IMPLEMENTATION_NAME=${DICOM_IMPLEMENTATION_NAME}
- - DICOM_IMPLEMENTATION_UID=${DICOM_IMPLEMENTATION_UID}
-
- build: ./dicom_server/.
- tmpfs:
- - /tmp:uid=2000,gid=2000
- volumes:
- - ./data/dicomhawk/logs:/var/log/dicomhawk:uid=2000,gid=2000
- - ./dicom_server/storage:/opt/dicomhawk/storage:uid=2000,gid=2000
- - ./dicom_server/storage/tcia_data:/opt/dicomhawk/tcia/data:uid=2000,gid=2000
- - ./dicom_server/storage/stagger:/opt/dicomhawk/tcia/stagger:uid=2000,gid=2000
- ports:
- - "11112:11112"
- networks:
- main_network:
- ipv4_address: 172.29.0.3
-
- dicomhawkinit:
- profiles: ["main"]
- container_name: dicomhawkinit
- build: ./dicomhawkinit/.
- restart: always
- environment:
- - PERSISTENCE_CYCLES=30
- tmpfs:
- - /tmp:uid=2000,gid=2000
- volumes:
- - ./data:/data:uid=2000,gid=2000
- networks:
- main_network:
- ipv4_address: 172.29.0.7
-
- # Monitoring Stack Services (profile: monitoring)
- logstash:
- profiles: ["monitoring"]
- image: 6711/logstash3:1.0.0
- entrypoint: ["/bin/bash", "/sub.sh"]
- user: "1000:1000"
- volumes:
- - ./data:/data:uid=1000,gid=1000
- - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- depends_on:
- - elastiksearch
- networks:
- monitoring_network:
- ipv4_address: 172.18.0.2
- main_network:
- ipv4_address: 172.29.0.6
-
- elastiksearch:
- profiles: ["monitoring"]
- image: 6711/elasticsearch
- entrypoint: ["/bin/bash", "/entry.sh"]
- mem_limit: 2g
- memswap_limit: 2g
- environment:
- - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # Reduce to 512MB heap
- - "xpack.security.enabled=false"
- - "cluster.routing.allocation.disk.threshold_enabled=false"
- - "logger.level=ERROR" # Reduce logging to ERROR only
- - "bootstrap.memory_lock=false" # Disable memory locking to avoid issues
- - "indices.memory.index_buffer_size=10%" # Limit index buffer
- - "indices.queries.cache.size=10%" # Limit query cache
- - "indices.fielddata.cache.size=10%" # Limit fielddata cache
- - "node.name=elasticsearch-single"
- - "cluster.name=docker-cluster"
- ports:
- - "9200:9200"
- - "9300:9300"
- networks:
- monitoring_network:
- ipv4_address: 172.18.0.3
-
- kibana:
- profiles: ["monitoring"]
- image: 6711/kibana
- depends_on:
- - elastiksearch
- ports:
- - "5601:5601"
- networks:
- monitoring_network:
- ipv4_address: 172.18.0.4
-
-volumes:
- shared_data:
- driver: local
-
-networks:
- main_network:
- ipam:
- config:
- - subnet: 172.29.0.0/16
- gateway: 172.29.0.1
- monitoring_network:
- ipam:
- config:
- - subnet: 172.18.0.0/16
- gateway: 172.18.0.1
diff --git a/docs/commands.md b/docs/commands.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/configuration.md b/docs/configuration.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/contact.md b/docs/contact.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/faq.md b/docs/faq.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/features.md b/docs/features.md
new file mode 100644
index 00000000..e69de29b
diff --git a/cover_images/architecturehoneynet.png b/docs/figures/architecture.png
similarity index 100%
rename from cover_images/architecturehoneynet.png
rename to docs/figures/architecture.png
diff --git a/cover_images/kibana.png b/docs/figures/dashboard.png
similarity index 100%
rename from cover_images/kibana.png
rename to docs/figures/dashboard.png
diff --git a/cover_images/deployment.png b/docs/figures/deployment.png
similarity index 100%
rename from cover_images/deployment.png
rename to docs/figures/deployment.png
diff --git a/cover_images/dicomhawk_logo.png b/docs/figures/logo.png
similarity index 100%
rename from cover_images/dicomhawk_logo.png
rename to docs/figures/logo.png
diff --git a/docs/installation.md b/docs/installation.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/quick_start.md b/docs/quick_start.md
new file mode 100644
index 00000000..e69de29b
diff --git a/flask_logging_server/Dockerfile b/flask_logging_server/Dockerfile
deleted file mode 100644
index 913150b8..00000000
--- a/flask_logging_server/Dockerfile
+++ /dev/null
@@ -1,33 +0,0 @@
-FROM python:3.8-slim
-
-ARG APP_UID=2000
-ARG APP_GID=2000
-
-# Set the working directory in the container to /app
-WORKDIR /log_server
-
-# Install system dependencies
-RUN apt-get update && apt-get install -y \
- gcc \
- libc6-dev \
- && rm -rf /var/lib/apt/lists/*
-
-# Copy the current directory contents into the container at /app
-COPY . /log_server
-
-# Install any needed packages specified in requirements.txt
-RUN pip install flask uwsgi \
- && groupadd -g ${APP_GID} dicom \
- && useradd -m -u ${APP_UID} -g ${APP_GID} -s /usr/sbin/nologin dicom \
- && chown -R ${APP_UID}:${APP_GID} /var/log
-
-# Make port 5000 available to the world outside this container
-EXPOSE 5000
-
-# Define environment variable
-ENV NAME World
-
-USER ${APP_UID}:${APP_GID}
-
-# Run uWSGI with the configuration
-CMD ["uwsgi", "--http", "0.0.0.0:5000", "--module", "logserver:app", "--processes", "1", "--threads", "8"]
diff --git a/flask_logging_server/logserver.py b/flask_logging_server/logserver.py
deleted file mode 100644
index 3ad19f12..00000000
--- a/flask_logging_server/logserver.py
+++ /dev/null
@@ -1,107 +0,0 @@
-from flask import Flask, jsonify, render_template, send_from_directory
-import os, json, logging
-
-logger = logging.getLogger("log_app_logger")
-
-
-Docker_ENV = os.getenv("Docker_ENV", "false")
-
-
-log_directory, simplified_log_directory, host = (
- ("/var/log/dicomhawk", "/var/log/dicomhawk", "172.29.0.5")
- if Docker_ENV == "True"
- else ("./logs", "./logs", "0.0.0.0")
-)
-
-
-# Set logging files
-log_file_path = os.path.join(log_directory, "dicom_raw_logs/dicom_raw.log")
-
-simplified_log_file_path = os.path.join(
- simplified_log_directory, "simplified/simplified_logger.log"
-)
-exception_log_file_path = os.path.join(log_directory, "exceptions/exceptions.log")
-
-
-app = Flask(__name__)
-
-
-@app.route("/")
-def landing_page():
- return render_template("landing.html")
-
-
-@app.route("/home")
-def home():
- return render_template("status.html")
-
-
-@app.route("/logs")
-def logs():
- return render_template("logs.html")
-
-
-@app.route("/status")
-def status():
- return jsonify({"status": "running"})
-
-
-@app.route("/logs/all")
-def all_logs():
- try:
- if not os.path.exists(log_file_path):
- return jsonify({"error": "Log file does not exist"}), 404
- with open(log_file_path, "r") as f:
- log_content = f.read().replace("\n", " ")
-
- return f"{log_content} "
- except Exception as e:
- return jsonify({"error": "Internal Server Error"}), 500
-
-
-@app.route("/logs/simplified")
-def simplified_logs():
- try:
- # if not os.path.exists(simplified_log_file_path):
- # return jsonify([]) # Return an empty list if the log file does not exist
- log_entries = []
- with open(simplified_log_file_path, "r") as f:
- for line in f:
- line = line.strip()
- if line:
- try:
- log_entries.append(json.loads(str(line.replace("'", '"'))))
- except json.JSONDecodeError as e:
- logger.error(f"Unexpected error: {e}")
-
- return jsonify(log_entries)
-
- except Exception as e:
- logger.error(f"Error reading simplified log file: {e}")
- return jsonify([]) # Return an empty list in case of error
-
-
-@app.route("/logs/simplified_page")
-def simplified_logs_page():
-
- return render_template("simplified_logs.html")
-
-
-@app.route("/favicon.ico")
-def favicon():
- return send_from_directory("static", "favicon.ico")
-
-
-@app.errorhandler(404)
-def not_found(e):
- # Do not log 404 errors
- return jsonify({"error": "Not Found"}), 404
-
-
-@app.errorhandler(Exception)
-def handle_exception(e):
- return jsonify({"error": "Internal Server Error"}), 500
-
-
-if Docker_ENV != "True":
- app.run(host, debug=True, port=5000)
diff --git a/install.sh b/install.sh
deleted file mode 100755
index fee8285b..00000000
--- a/install.sh
+++ /dev/null
@@ -1,174 +0,0 @@
-#!/usr/bin/env bash
-
-# DICOMHawk Installation Script
-# This script helps users install and configure DICOMHawk
-
-set -e
-
-# Colors for output
-RED='\033[0;31m'
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-BLUE='\033[0;34m'
-NC='\033[0m' # No Color
-
-# Function to print colored output
-print_status() {
- echo -e "${BLUE}[INFO]${NC} $1"
-}
-
-print_success() {
- echo -e "${GREEN}[SUCCESS]${NC} $1"
-}
-
-print_warning() {
- echo -e "${YELLOW}[WARNING]${NC} $1"
-}
-
-print_error() {
- echo -e "${RED}[ERROR]${NC} $1"
-}
-
-# Check if Docker is installed
-check_docker() {
-
- if ! command -v docker &> /dev/null; then
- print_error "Docker is not installed. Please install Docker first."
- exit 1
- fi
-
- if ! command -v docker-compose &> /dev/null; then
- print_error "Docker Compose is not installed. Please install Docker Compose first."
- exit 1
- fi
-
- print_success "Docker and Docker Compose are installed"
-}
-
-# Check if running as root
-check_root() {
- if [[ $EUID -eq 0 ]]; then
- print_warning "Running as root. This is not recommended for security reasons."
- read -p "Do you want to continue? (y/N): " -n 1 -r
- echo
- if [[ ! $REPLY =~ ^[Yy]$ ]]; then
- exit 1
- fi
- fi
-}
-
-
-create_directories() {
- print_status "Creating necessary directories..."
-
- mkdir -p data/dicomhawk/logs
- mkdir -p dicom_server/storage/dicom_storage
- mkdir -p dicom_server/storage/c_store_files
- mkdir -p dicom_server/storage/tcia_data
- mkdir -p dicom_server/storage/stagger
-
- print_success "Directories created"
-}
-
-# Check if .env file exists
-check_env_file() {
- if [ -f ".env" ]; then
- print_warning "Configuration file .env already exists."
- read -p "Do you want to reconfigure? (y/N): " -n 1 -r
- echo
- if [[ $REPLY =~ ^[Yy]$ ]]; then
- rm -f .env
- print_status "Removed existing .env file"
- else
- print_status "Using existing configuration"
- return 0
- fi
- fi
-
- return 1
-}
-
-# Run the customizer
-run_customizer() {
- print_status "Starting configuration process..."
-
- # Check if Python is available
- if ! command -v python3 &> /dev/null; then
- print_error "Python3 is not installed. Please install Python3 first."
- exit 1
- fi
-
- # Run the customizer
- python3 customizer/customizer.py
-
- if [ -f ".env" ]; then
- print_success "Configuration completed successfully!"
- else
- print_error "Configuration failed. Please check the output above."
- exit 1
- fi
-}
-
-# Build and start containers
-start_containers() {
- print_status "Building and starting containers..."
-
- # Build the customizer first
- docker-compose build customizer
-
- # Start the main stack
- docker-compose --profile main up -d
-
- print_success "Containers started successfully!"
-}
-
-# final instructions
-show_instructions() {
- echo print_success "DICOMHawk installation completed!"
-
- echo "
- Access points:
- - Web Interface: http://localhost:5000
- - API: http://localhost:3702
- - DICOM Server: localhost:11112
-
- Useful commands:
- - View logs: docker-compose logs -f
- - Stop services: docker-compose down
- - Restart services: docker-compose restart
- "
-
- echo print_warning "Important:
- - Update TCIA credentials if they expire
- - Monitor logs for any issues
- "
-
- exit 0
-}
-
-main() {
- echo '
-==========================================
- DICOMHawk Installation
-==========================================
- '
-
- check_root
- check_docker
- create_directories
-
- if check_env_file; then
- print_status "Using existing configuration"
- else
- run_customizer
- fi
-
- start_containers
- show_instructions
-}
-
-# Handle script interruption
-trap 'print_error "Installation interrupted"; exit 1' INT TERM
-
-# Run main function
-main "$@"
\ No newline at end of file
diff --git a/logstash.conf b/logstash.conf
deleted file mode 100644
index 31e72567..00000000
--- a/logstash.conf
+++ /dev/null
@@ -1,121 +0,0 @@
-input {
- file {
- path => "/data/dicomhawk/logs/**/*.log*"
- start_position => "beginning"
- sincedb_path => "/dev/null"
- type => "dicomhawk_logs"
- tags => ["dicomhawk"]
- }
-}
-
-filter {
- if [log][file][path] =~ /simplified/ {
- mutate {
- add_field => { "log_type" => "dicom_simplified" }
- add_tag => ["dicom", "simplified"]
- }
- json {
- source => "message"
- }
- # Fix field type conflicts - convert N/A to null for numeric fields
- if [matches] == "N/A" {
- mutate {
- remove_field => ["matches"]
- }
- }
- } else if [log][file][path] =~ /dicom_raw_logs/ {
- mutate {
- add_field => { "log_type" => "dicom_full" }
- add_tag => ["dicom", "dicom_raw_logs"]
- }
- } else if [log][file][path] =~ /api_logs/ {
- mutate {
- add_field => { "log_type" => "api" }
- add_tag => ["api"]
- }
- json {
- source => "message"
- }
- } else if [log][file][path] =~ /reputation/ {
- mutate {
- add_field => { "log_type" => "reputation" }
- add_tag => ["reputation"]
- }
- json {
- source => "message"
- }
- } else if [log][file][path] =~ /scanned_ips/ {
- mutate {
- add_field => { "log_type" => "scanned_ips" }
- add_tag => ["scanned_ips"]
- }
- json {
- source => "message"
- }
- } else if [log][file][path] =~ /exceptions/ {
- mutate {
- add_field => { "log_type" => "exceptions" }
- add_tag => ["exceptions"]
- }
- json {
- source => "message"
- }
- } else {
- mutate {
- add_field => { "log_type" => "general" }
- add_tag => ["general"]
- }
- }
-
-
- mutate {
- add_field => { "environment" => "dicomhawk" }
- add_field => { "source_file" => "%{[log][file][path]}" }
- }
-
- # Parse timestamp if present
- if [timestamp] {
- date {
- match => [ "timestamp", "ISO8601" ]
- }
- }
-}
-
-output {
- if [log_type] == "dicom_simplified" {
- elasticsearch {
- hosts => ["172.18.0.3:9200"]
- index => "dicom_simplified-%{+YYYY.MM.dd}"
- }
- } else if [log_type] == "dicom_full" {
- elasticsearch {
- hosts => ["172.18.0.3:9200"]
- index => "dicom_full-%{+YYYY.MM.dd}"
- }
- } else if [log_type] == "api" {
- elasticsearch {
- hosts => ["172.18.0.3:9200"]
- index => "api_data-%{+YYYY.MM.dd}"
- }
- } else if [log_type] == "reputation" {
- elasticsearch {
- hosts => ["172.18.0.3:9200"]
- index => "reputation-%{+YYYY.MM.dd}"
- }
- } else if [log_type] == "scanned_ips" {
- elasticsearch {
- hosts => ["172.18.0.3:9200"]
- index => "scanned_ips-%{+YYYY.MM.dd}"
- }
- } else if [log_type] == "exceptions" {
- elasticsearch {
- hosts => ["172.18.0.3:9200"]
- index => "exceptions-%{+YYYY.MM.dd}"
- }
- } else {
- elasticsearch {
- hosts => ["172.18.0.3:9200"]
- index => "general_logs-%{+YYYY.MM.dd}"
- }
- }
-}
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 00000000..8d1f8d47
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,55 @@
+[build-system]
+requires = ["setuptools>=61.0"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "dicomhawk"
+version = "0.1.0"
+description = "DICOM honeypot"
+authors = [
+ {name = "Georgios Theodoridis"}
+]
+license = { text = "MIT" }
+readme = "README.md"
+requires-python = ">=3.12"
+dependencies = [
+ "pydicom",
+ "pynetdicom",
+ "pylibjpeg",
+ "pylibjpeg-libjpeg",
+ "pylibjpeg-openjpeg",
+ "requests",
+ "redis",
+ "schedule",
+ "jwt",
+ "dependency-injector",
+ "aenum",
+ "pytz",
+ "overpy",
+ "sqlalchemy",
+ "typer",
+ "numpy",
+ # for the web
+ "flask",
+ "ujson"
+]
+
+[project.optional-dependencies]
+dev = [
+ "pytest",
+ "faker",
+]
+
+[tool.setuptools]
+package-dir = { "" = "src" }
+
+[tool.setuptools.packages.find]
+where = ["src"]
+include = ["dicomhawk", "dicomhawk.*", "commands", "commands.*", "web", "web.*"]
+
+[project.urls]
+Homepage = "https://github.com/honeynet/DICOMHawk"
+Issues = "https://github.com/honeynet/DICOMHawk/issues"
+
+[project.scripts]
+dicomhawk = "commands.main:main"
diff --git a/src/commands/__init__.py b/src/commands/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/commands/main.py b/src/commands/main.py
new file mode 100644
index 00000000..0d9319ec
--- /dev/null
+++ b/src/commands/main.py
@@ -0,0 +1,10 @@
+import typer
+from .serve import serve_app
+from .web import web_app
+
+app = typer.Typer(help="DicomHawk")
+app.add_typer(serve_app)
+app.add_typer(web_app)
+
+def main():
+ app()
diff --git a/src/commands/serve.py b/src/commands/serve.py
new file mode 100644
index 00000000..b03d105c
--- /dev/null
+++ b/src/commands/serve.py
@@ -0,0 +1,56 @@
+import typer
+from dicomhawk import new_dicomhawk
+
+serve_app = typer.Typer(help="dicomhawk runner")
+
+@serve_app.command()
+def serve(
+ ports: str = typer.Option(
+ "104,11112",
+ "-p",
+ "--ports",
+ help="Posts to listen for connections"
+ ),
+ ae_title: str = typer.Option(
+ "ORTHANC",
+ "-ae",
+ "--ae_title",
+ help="AE title"
+ ),
+ impl_uid: str = typer.Option(
+ "1.2.3.4", # TODO: fix this
+ "-id",
+ "--impl_uid",
+ help="Implementation UID"
+ ),
+ impl_name: str = typer.Option(
+ "ORTHANC",
+ "-in",
+ "--impl_name",
+ help="Implementation name"
+ ),
+ dimse: str | None = typer.Option(
+ None,
+ "-d",
+ "--dimse",
+ help="DIMSE operations supported"
+ ),
+ database: str | None = typer.Option(
+ None,
+ "-db",
+ "--database",
+ help="path to database"
+ ),
+ ):
+
+ config = new_server_config(
+ ports,
+ ae_title,
+ impl_uid,
+ impl_name,
+ dimse,
+ database
+ )
+
+ hp = new_dicomhawk(config)
+ hp.run()
\ No newline at end of file
diff --git a/src/commands/web.py b/src/commands/web.py
new file mode 100644
index 00000000..75ab2f04
--- /dev/null
+++ b/src/commands/web.py
@@ -0,0 +1,16 @@
+import typer
+from web.server import main
+
+web_app = typer.Typer(help="dicomhawk web logging server")
+
+@web_app.command()
+def serve(
+ port: str = typer.Option(
+ "5000",
+ "-p",
+ "--ports",
+ help="Posts to listen for connections"
+ ),
+ ):
+
+ main(port)
\ No newline at end of file
diff --git a/src/dicomhawk/__init__.py b/src/dicomhawk/__init__.py
new file mode 100644
index 00000000..a2559dcc
--- /dev/null
+++ b/src/dicomhawk/__init__.py
@@ -0,0 +1,5 @@
+from .app import new_dicomhawk
+
+__all__ = [
+ "new_dicomhawk"
+]
\ No newline at end of file
diff --git a/src/dicomhawk/app.py b/src/dicomhawk/app.py
new file mode 100644
index 00000000..6b59405b
--- /dev/null
+++ b/src/dicomhawk/app.py
@@ -0,0 +1,23 @@
+from .server import ServerConfig, new_server
+from .component import Component
+
+from logging import Logger
+
+class DicomHawk:
+ def __init__(self, logger: Logger, components: list[Component], config: ServerConfig) -> None:
+ self.logger = logger
+ self.components = components
+ self.server = new_server(self.logger, config)
+
+ def start(self) -> None:
+ for c in self.components:
+ c.start()
+ self.server.run()
+
+ def stop(self) -> None:
+ self.server.stop()
+ for c in self.components:
+ c.stop()
+
+def new_dicomhawk(logger: Logger, components: list[Component], config: ServerConfig) -> DicomHawk:
+ return DicomHawk(logger, components, config)
diff --git a/src/dicomhawk/component.py b/src/dicomhawk/component.py
new file mode 100644
index 00000000..16ed7b58
--- /dev/null
+++ b/src/dicomhawk/component.py
@@ -0,0 +1,10 @@
+from abc import ABC
+from logging import Logger
+
+# Dont know if this is a component, a bus, a plugin, or something different
+class Component(ABC):
+ logger: Logger
+ config: dict
+
+ def start(self): ...
+ def stop(self): ...
\ No newline at end of file
diff --git a/src/dicomhawk/config.py b/src/dicomhawk/config.py
new file mode 100644
index 00000000..5eced539
--- /dev/null
+++ b/src/dicomhawk/config.py
@@ -0,0 +1,201 @@
+import os
+import json
+
+from dataclasses import dataclass
+from typing import List
+
+@dataclass(frozen=True)
+class DICOMSettings:
+ PORTS: List[int]
+ SERVER_HOST: str
+
+ STORAGE_DIR: str
+ C_STORE_DIR: str
+ DATABASE: str
+ HASH_STORE: str
+ CANARY_PDF: str
+ INTEGRITY_CHECK: bool
+
+ # AE title
+ AE_TITLE: str
+
+ # UserInfo (application identity)
+ IMPLEMENTATION_NAME: str
+ IMPLEMENTATION_UID: str
+
+
+@dataclass(frozen=True)
+class TCIASettings:
+ ACTIVATED: bool
+ FALLBACK_MODE: bool
+ USERNAME: str
+ PASSWORD: str
+ PERIOD_UNIT: str
+ PERIOD: int
+ FILES_DIR: str
+ STAGGER_DIR: str
+ MODALITIES: List[str]
+ MIN_FILES: int
+ MAX_FILES: int
+ STUDIES_PER_MODALITY: int
+
+
+@dataclass(frozen=True)
+class OSMSettings:
+ ENABLED: bool
+ COUNTRY: str
+ CITY: str
+ CACHE_DURATION: int
+ MAX_INSTITUTIONS: int
+ TIMEOUT: int
+ FALLBACK_INSTITUTIONS: List[str]
+ CACHE_FILE: str
+
+@dataclass(frozen=True)
+class Settings:
+ PROD: bool
+ DOCKER: bool
+
+ FLASK_ACTIVATED: bool
+ BLOCK_SCANNERS: bool
+
+ BLACKHOLE_FILE: str
+ REDIS_HOST: str
+
+ MAIN_LOG_DIR: str
+ SIMPLIFIED_LOG_DIR: str
+ EXCEPTIONS_LOG_DIR: str
+
+ # TODO: we shouldn't store api keys. This can be loaded from secrets
+ ABUSE_IP_API_KEY: str
+ IP_QUALITY_SCORE_API_KEY: str
+ VIRUS_TOTAL_API_KEY: str
+
+ HONEY_URL: str
+ FAKER_LOCALE: str
+
+ DICOM: DICOMSettings
+ TCIA: TCIASettings
+ OSM: OSMSettings
+
+
+TRUE_LIST = {"true", "1", "t", "yes"}
+
+
+def env_bool(name: str, default: str = "False") -> bool:
+ return os.getenv(name, default).lower() in TRUE_LIST
+
+
+def env_int(name: str, default: int) -> int:
+ return int(os.getenv(name, default))
+
+
+def env_json(name: str, default):
+ try:
+ return json.loads(os.getenv(name, json.dumps(default)))
+ except json.JSONDecodeError:
+ return default
+
+
+def docker_path(docker: bool, docker_path: str, local_path: str) -> str:
+ return docker_path if docker else local_path
+
+def require(value, name: str):
+ if not value:
+ raise RuntimeError(f"Missing required configuration: {name}")
+ return value
+
+
+def require_one_of(value, name: str, allowed):
+ if value not in allowed:
+ raise RuntimeError(f"{name} must be one of {allowed}")
+ return value
+
+
+
+def load_settings() -> Settings:
+ docker = env_bool("DOCKER")
+
+ dicom = DICOMSettings(
+ PORTS=env_json("DICOM_PORTS", [11112]),
+ SERVER_HOST="172.29.0.3" if docker else "0.0.0.0",
+
+ STORAGE_DIR=docker_path(docker, "/opt/dicomhawk/storage/dicom_storage", "./storage/dicom_storage"),
+ C_STORE_DIR=docker_path(docker, "/opt/dicomhawk/storage/c_store_files", "./storage/c_store_files"),
+ DATABASE=docker_path(docker, "/opt/dicomhawk/storage/db.db", "./storage/db.db"),
+ HASH_STORE=docker_path(docker, "/opt/dicomhawk/storage/hash_store.json", "./storage/hash_store.json"),
+ CANARY_PDF=docker_path(docker, "/opt/dicomhawk/storage/can.pdf", "./storage/can.pdf"),
+ INTEGRITY_CHECK=env_bool("INTEGRITY_CHECK", "True"),
+
+ AE_TITLE=os.getenv("DICOM_AE_TITLE", "ORTHANC"), # TODO: I am not sure this is the typical AE title for ORTHANC
+ IMPLEMENTATION_NAME=os.getenv("DICOM_IMPLEMENTATION_NAME", "ORTHANC"), # TODO: missing the version?
+ IMPLEMENTATION_UID=os.getenv("DICOM_IMPLEMENTATION_UID"), # TODO: find the ORTHANC implementation id
+ )
+
+ tcia = TCIASettings(
+ ACTIVATED=env_bool("TCIA_ACTIVATED", "True"),
+ FALLBACK_MODE=env_bool("TCIA_FALLBACK_MODE", "True"),
+ USERNAME=os.getenv("TCIA_USER_NAME", "user"),
+ PASSWORD=os.getenv("TCIA_PASSWORD", "pass"),
+ PERIOD_UNIT=require_one_of(
+ os.getenv("TCIA_PERIOD_UNIT", "week"),
+ "TCIA_PERIOD_UNIT",
+ {"hour", "day", "week"},
+ ),
+ PERIOD=env_int("TCIA_PERIOD", 1),
+ FILES_DIR=docker_path(docker, "/opt/dicomhawk/tcia/data", "./storage/tcia_data"),
+ STAGGER_DIR=docker_path(docker, "/opt/dicomhawk/tcia/stagger", "./storage/stagger"),
+ MODALITIES=env_json("MODALITIES", ["CT", "MR", "US", "DX"]),
+ MIN_FILES=env_int("MINIMUM_TCIA_FILES_IN_SERIE", 1),
+ MAX_FILES=env_int("MAXIMUM_TCIA_FILES_IN_SERIE", 3),
+ STUDIES_PER_MODALITY=env_int("TCIA_STUDIES_PER_MODALITY", 10),
+ )
+
+ osm = OSMSettings(
+ ENABLED=env_bool("OSM_ENABLED", "True"),
+ COUNTRY=os.getenv("OSM_COUNTRY", "DK"),
+ CITY=os.getenv("OSM_CITY", ""),
+ CACHE_DURATION=env_int("OSM_CACHE_DURATION", 24),
+ MAX_INSTITUTIONS=env_int("OSM_MAX_INSTITUTIONS", 50),
+ TIMEOUT=env_int("OSM_TIMEOUT", 30),
+ FALLBACK_INSTITUTIONS=env_json(
+ "OSM_FALLBACK_INSTITUTIONS",
+ ["Københavns Sundhedscenter", "Aarhus Kliniken"],
+ ),
+ CACHE_FILE=docker_path(
+ docker,
+ "/opt/dicomhawk/storage/osm_institutions_cache.json",
+ "./storage/osm_institutions_cache.json",
+ ),
+ )
+
+ return Settings(
+ PROD=env_bool("PROD"),
+ DOCKER=docker,
+ FLASK_ACTIVATED=env_bool("FLASK_ACTIVATED", "True"),
+ BLOCK_SCANNERS=env_bool("BLOCK_SCANNERS"),
+ BLACKHOLE_FILE=docker_path(
+ docker,
+ "/opt/dicomhawk/storage/blackhole_list.txt",
+ "./storage/blackhole_list.txt",
+ ),
+ REDIS_HOST=os.getenv("REDIS_HOST", "172.29.0.4") if docker else "localhost",
+ MAIN_LOG_DIR=docker_path(docker, "/var/log/dicomhawk/dicom_raw_logs", "../flask_logging_server/logs/dicom_raw_logs"),
+ SIMPLIFIED_LOG_DIR=docker_path(docker, "/var/log/dicomhawk/simplified", "../flask_logging_server/logs/simplified"),
+ EXCEPTIONS_LOG_DIR=docker_path(docker, "/var/log/dicomhawk/exceptions", "./exceptions"),
+
+ # TODO: Point to a file or a secret, do not load this into memory
+ ABUSE_IP_API_KEY=require(os.getenv("ABUSE_IP__KEY"), "ABUSE_IP__KEY"),
+ IP_QUALITY_SCORE_API_KEY=require(os.getenv("IP_QUALITY_SCORE_API_KEY"), "IP_QUALITY_SCORE_API_KEY"),
+ VIRUS_TOTAL_API_KEY=require(os.getenv("VIRUS_TOTAL_API_KEY"), "VIRUS_TOTAL_API_KEY"),
+
+ HONEY_URL=os.getenv("HONEY_URL", "VALUE"),
+ FAKER_LOCALE=os.getenv("FAKER_LOCALE", "en_US"),
+
+ # Settings
+ DICOM=dicom,
+ TCIA=tcia,
+ OSM=osm,
+ )
+
+settings = load_settings()
diff --git a/src/dicomhawk/handlers.py b/src/dicomhawk/handlers.py
new file mode 100644
index 00000000..a28a0e47
--- /dev/null
+++ b/src/dicomhawk/handlers.py
@@ -0,0 +1,152 @@
+from typing import Callable, Any, Generator, Optional
+
+from pydicom.dataset import Dataset
+from pynetdicom.events import Event
+
+from .status import QRStatus
+from .repository import Repository
+
+import logging
+
+logger = logging.getLogger(__name__)
+
+type EventHandler = Callable[[Repository, Event], Any]
+type QRResult = Generator[tuple[int, Optional[Dataset]], None, None]
+
+# def middlewhare(event: Event)
+# take the event and send it together with the event manager to the handler
+
+def default_handler(**kwargs):
+ pass
+
+def handle_find(
+ repo: Repository, # This is an interface to the repo
+ event: Event
+ ) -> QRResult:
+
+ if err := repo.eval_qr(event):
+ # NOTE: we may want a separate logger for this?
+ logger.error(err.error)
+ yield (err.status, None)
+
+ # NOTE: the ev will log this
+ idt = event.identifier
+ model = event.request.AffectedSOPClassUID
+
+ result = repo.find(idt, model, inject=True)
+ if (err:=result.error) is not None:
+ logger.error(err.error)
+ yield (err.status, None)
+ return
+
+ for m in result.matches:
+ if event.is_cancelled:
+ yield (QRStatus.CANCEL, None)
+ return
+
+ res = m.as_identifier(idt, model)
+ res.RetrieveAETitle = event.assoc.ae.ae_title
+
+ yield (QRStatus.PENDING, res)
+ yield (QRStatus.SUCCESS, None)
+
+def handle_get(
+ repo: Repository,
+ event: Event
+ ) -> QRResult:
+
+ if err := repo.eval_qr(event):
+ logger.error(err.error)
+ yield (err.status, None)
+
+ idt = event.identifier
+ model = event.request.AffectedSOPClassUID
+
+ result = repo.find(idt, model)
+ if (err:=result.error) is not None:
+ logger.error(err.error)
+ yield (err.status, None)
+ return
+
+ yield len(result.matches) # type: ignore
+ for m in result.matches:
+ if event.is_cancelled:
+ yield (QRStatus.CANCEL, None)
+ return
+
+ res = repo.find_instance(m, decompress=True)
+ if (err:=res.error) is not None:
+ logger.error(err.error)
+ yield (err.status, None)
+
+ yield (QRStatus.PENDING, res.dataset)
+ yield (QRStatus.SUCCESS, None)
+
+def handle_move(
+ repo: Repository,
+ event: Event
+ ) -> QRResult:
+
+ if err := repo.eval_qr(event):
+ logger.error(err.error)
+ yield (err.status, None)
+
+ idt = event.identifier
+ model = event.request.AffectedSOPClassUID
+
+ result = repo.find(idt, model)
+ if (err:=result.error) is not None:
+ logger.error(err.error)
+ yield (err.status, None)
+ return
+
+ # TODO: need destinations
+ # try:
+ # addr, port = destinations[event.move_destination]
+ # except KeyError:
+ # logger.info("No matching move destination in the configuration")
+ # yield None, None
+ # return
+ # contexts = list(set([ii.context for ii in matches]))
+ # yield addr, port, {"contexts": contexts[:128]}
+
+ yield len(result.matches) # type: ignore
+ for m in result.matches:
+ if event.is_cancelled:
+ yield (QRStatus.CANCEL, None)
+ return
+
+ res = repo.find_instance(m, decompress=True)
+ if (err:=res.error) is not None:
+ logger.error(err.error)
+ yield (err.status, None)
+
+ yield (QRStatus.PENDING, res.dataset)
+
+ yield (QRStatus.SUCCESS, None)
+
+
+def handle_store(
+ repo: Repository,
+ event: Event
+ ) -> QRResult:
+
+ repo.store(event.identifier)
+ yield (QRStatus.SUCCESS, None)
+
+
+class DIMSEFactory:
+ handlers: dict[str, EventHandler]
+
+ def get(self, name: str) -> EventHandler | None:
+ return self.handlers[name]
+
+ def register(self, name: str, handler: EventHandler) -> 'DIMSEFactory':
+ self.handlers[name] = handler
+ return self
+
+def new_dimse_factory() -> DIMSEFactory:
+ factory = DIMSEFactory()
+ # TODO: register handlers
+
+ return factory
\ No newline at end of file
diff --git a/src/dicomhawk/honey.py b/src/dicomhawk/honey.py
new file mode 100644
index 00000000..c111a8ae
--- /dev/null
+++ b/src/dicomhawk/honey.py
@@ -0,0 +1,6 @@
+from typing import Callable
+from pydicom.dataset import Dataset
+
+type Middleware = Callable[[Dataset], Dataset]
+
+def inject_honeytoken(ds: Dataset) -> Dataset: ...
\ No newline at end of file
diff --git a/src/dicomhawk/repository.py b/src/dicomhawk/repository.py
new file mode 100644
index 00000000..ab01920f
--- /dev/null
+++ b/src/dicomhawk/repository.py
@@ -0,0 +1,192 @@
+
+from pydicom import dcmread
+from pydicom.uid import UID
+from pydicom.dataset import Dataset
+from pydicom.pixel_data_handlers.util import apply_modality_lut
+
+from pynetdicom.events import Event
+from pynetdicom.apps.qrscp import db
+
+from sqlalchemy import Engine
+from sqlalchemy.schema import MetaData
+from sqlalchemy.orm import sessionmaker, Session
+
+from .status import QRStatus
+from .storage import Storage
+from .honey import Middleware
+
+import os
+import logging
+
+logger = logging.getLogger(__name__)
+
+class QRError:
+ error: str
+ status: int
+
+class QRResult:
+ matches: list[Dataset]
+ error: QRError
+
+class FindResult:
+ dataset: Dataset
+ error: QRError
+
+class Repository:
+ supported_sop: list[UID]
+ engine: Engine
+ session: Session
+
+ def __init__(self, location: str | None, storage: Storage, middlewares: list[Middleware]=[]):
+ self.location = location or ":memory:"
+ self.storage: Storage = storage
+ self.middlewares = middlewares
+
+ def _new_connection(self) -> Engine:
+ engine = db.create(
+ f"sqlite:///{self.location}"
+ )
+
+ meta = MetaData()
+ meta.reflect(bind=engine)
+ return engine
+
+ def _new_session(self):
+ if not self.engine:
+ self.engine = self._new_connection()
+ session = sessionmaker(bind=self.engine)()
+ return session
+
+ def _connect(self):
+ if not self.session:
+ self.session = self._new_session()
+ return self.session
+
+ def _apply_middlewares(self, instance: Dataset) -> Dataset:
+ for mw in self.middlewares:
+ instance = mw(instance)
+ return instance
+
+ @property
+ def conn(self):
+ return self._connect()
+
+ def start(self):
+ self._connect()
+ return self
+
+ def stop(self):
+ if self.session:
+ self.session.close()
+ if self.engine:
+ self.engine.dispose()
+
+ def supports(self, sop: UID | None) -> bool:
+ return sop in self.supported_sop
+
+ def eval_qr(self, event: Event) -> QRError | None:
+ err = QRError()
+ if not self.supports(sop:=event.request.AffectedSOPClassUID):
+ err.error = f"SOP Class not supported: {sop}"
+ err.status = QRStatus.SOP_CLASS_NOT_SUPPORTED
+ return err
+
+ ds = event.identifier
+ if not ds.get("QueryRetrieveLevel"):
+ err.error = f"request identifier not supported: {ds}"
+ err.status = QRStatus.SOP_CLASS_INVALID
+ return err
+ return
+
+ def find(self, ds: Dataset, model, inject: bool = False) -> QRResult:
+ conn = self.conn
+ result = QRResult()
+ try:
+ matches = db.search(model, ds, conn)
+ except db.InvalidIdentifier as exc:
+ conn.rollback()
+
+ err = QRError()
+ err.error = f"Invalid C-FIND Identifier received: {exc}"
+ err.status = QRStatus.SOP_CLASS_INVALID
+ result.error = err
+ return result
+ except Exception as exc:
+ conn.rollback()
+
+ err = QRError()
+ err.error = f"Exception occurred while querying database: {exc}"
+ err.status = QRStatus.FAILURE
+ result.error = err
+ return result
+
+ if inject:
+ matches = [self._apply_middlewares(m) for m in matches]
+
+ result.matches = matches
+ return result
+
+ def store(self, ds: Dataset, safe: bool = False) -> QRError | None:
+ # NOTE: anything not safe is zipped and quarantined
+ # save a raw copy of the dataset with the current timestamp
+ if not safe:
+ with self.storage.temp() as tf:
+ ds.save_as(tf, enforce_file_format=False)
+ self.storage.compress(tf)
+
+ fdir = self.storage.jail(safe)
+ fname = ds.SOPInstanceUID # NOTE: this is dangerous
+ fpath = os.path.join(fdir, fname)
+
+ if os.path.exists(fpath):
+ logger.warning(f"Instance already exists in storage directory: {fname}; overwriting")
+
+ try:
+ ds.save_as(fpath, overwrite=True)
+ except Exception as exc:
+ err = QRError()
+ err.error = f"Failed writing instance to storage directory: {exc}"
+ err.status = QRStatus.STORE_ERROR
+ return err
+
+ try:
+ # Path is relative to the database file
+ matches = (
+ self.conn.query(db.Instance)
+ .filter(db.Instance.sop_instance_uid == ds.SOPInstanceUID)
+ .all()
+ )
+
+ db.add_instance(ds, self.conn, os.path.abspath(fpath))
+ if not matches:
+ logger.info("Instance added to database")
+ else:
+ logger.info("Database entry for instance updated")
+ except Exception as exc:
+ self.conn.rollback()
+
+ logger.error("Unable to add instance to the database")
+ logger.exception(exc)
+
+ def find_instance(self, match: Dataset, decompress: bool = False, inject: bool = True) -> FindResult:
+ result = FindResult()
+
+ try:
+ instance = dcmread(match.filename)
+ except Exception as exc:
+ err = QRError()
+ err.error = f"Error reading file: {match.filename}\n{exc}"
+ err.status = 0xC421
+ result.error = err
+ return result
+
+ # NOTE: not sure this is needed tbh, why not sending files compressed?
+ if decompress and instance.file_meta.TransferSyntaxUID.is_compressed:
+ instance.decompress()
+ apply_modality_lut(instance.pixel_array, instance)
+
+ if inject:
+ instance = self._apply_middlewares(instance)
+
+ result.dataset = instance
+ return result
\ No newline at end of file
diff --git a/src/dicomhawk/server.py b/src/dicomhawk/server.py
new file mode 100644
index 00000000..456cbbe7
--- /dev/null
+++ b/src/dicomhawk/server.py
@@ -0,0 +1,123 @@
+from copy import copy
+from logging import Logger
+from itertools import chain
+from pynetdicom import (
+ evt,
+ AE,
+)
+
+from pynetdicom.transport import ThreadedAssociationServer
+from pynetdicom.presentation import (
+ AllStoragePresentationContexts,
+ StoragePresentationContexts,
+)
+
+from pynetdicom.sop_class import (
+ _QR_CLASSES,
+ _VERIFICATION_CLASSES
+)
+
+class ServerConfig:
+ PORTS: list[int]
+ HOST: str
+
+ STORAGE_DIR: str
+ C_STORE_DIR: str
+ DATABASE: str
+ HASH_STORE: str
+ CANARY_PDF: str
+ INTEGRITY_CHECK: bool
+
+ # AE title
+ AE_TITLE: str
+
+ # UserInfo (application identity)
+ IMPLEMENTATION_NAME: str
+ IMPLEMENTATION_UID: str
+
+ # Maximum number of associations (min: 1, max: 65536)
+ MAX_ASSOC: int
+
+class Server:
+ listeners: list[ThreadedAssociationServer]
+
+ def __init__(
+ self,
+ logger: Logger,
+ config: ServerConfig,
+ ):
+
+ self.logger = logger
+ self.config = config
+
+ # TODO: we have a whole class to make handlers, use that
+ handler_factory = new_handler_factory()
+ self.handlers = self.make_handlers(handler_factory)
+
+ def make_handlers(self, handlers: HandlerFactory):
+ # TODO: the config should have a list of supported operations
+ return [
+ (evt.EVT_ACSE_RECV, handlers.get("associate")),
+ (evt.EVT_RELEASED, handlers.get("release")),
+ (evt.EVT_C_FIND, handlers.get("find")),
+ (evt.EVT_C_STORE, handlers.get("store")),
+ (evt.EVT_C_ECHO, handlers.get("echo")),
+ (evt.EVT_C_MOVE, handlers.get("move")),
+ (evt.EVT_C_GET, handlers.get("get")),
+ (evt.EVT_ABORTED, handlers.get("abort")),
+ ]
+
+ def init(self) -> AE:
+ self.logger.debug("Initializing AE")
+
+ # Titles
+ ae = AE(ae_title=self.config.AE_TITLE)
+
+ # Implementation identification
+ ae.implementation_class_uid = self.config.IMPLEMENTATION_UID
+ ae.implementation_version_name = self.config.IMPLEMENTATION_NAME
+
+ # Other config
+ ae.maximum_associations = self.config.MAX_ASSOC
+ # NOTE: this is an annoying setting. Default value refuses connections
+ # from greedy malware
+ ae.maximum_pdu_size = 65536
+
+ # Set supported operations
+ store_ctx = copy(StoragePresentationContexts)
+ for ctx in store_ctx:
+ ctx._as_scp = True
+ ctx._as_scu = True
+ ctx.scp_role = True
+ ctx.scu_role = True
+
+ ae.requested_contexts = store_ctx
+ ae.supported_contexts = AllStoragePresentationContexts
+
+ for qr in chain(_QR_CLASSES.values(), _VERIFICATION_CLASSES.values()):
+ ae.add_supported_context(qr)
+
+ return ae
+ def run(self):
+ # Start server on each port
+ app = self.init()
+
+ threads: list[ThreadedAssociationServer] = []
+ for port in self.config.PORTS:
+ if worker := app.start_server(
+ (self.config.HOST, port),
+ evt_handlers=self.handlers,
+ block=False
+ ):
+ threads.append(worker)
+
+ for th in threads:
+ th.serve_forever()
+ self.logger.info(f"Listening in {self.config.PORTS}")
+
+ def stop(self):
+ for srv in self.listeners:
+ srv.shutdown()
+
+def new_server(logger: Logger, config: ServerConfig) -> Server:
+ return Server(logger, config)
\ No newline at end of file
diff --git a/src/dicomhawk/status.py b/src/dicomhawk/status.py
new file mode 100644
index 00000000..3bbedfbe
--- /dev/null
+++ b/src/dicomhawk/status.py
@@ -0,0 +1,17 @@
+from enum import IntEnum, StrEnum
+
+class QRStatus(IntEnum):
+ SUCCESS = 0x0000
+ PENDING = 0xFF00
+ CANCEL = 0xFE00
+ FAILURE = 0xC000
+
+ SOP_CLASS_NOT_SUPPORTED = 0x0122
+ SOP_CLASS_INVALID = 0xA900 # Identifier does not match SOP class
+
+ STORE_ERROR = 0xA700
+
+class QRLevel(StrEnum):
+ STUDY = "STUDY"
+ SERIES = "SERIES"
+ PATIENT = "PATIENT"
\ No newline at end of file
diff --git a/src/dicomhawk/storage.py b/src/dicomhawk/storage.py
new file mode 100644
index 00000000..3936227e
--- /dev/null
+++ b/src/dicomhawk/storage.py
@@ -0,0 +1,44 @@
+from contextlib import contextmanager
+import tempfile
+import gzip
+import shutil
+
+from pathlib import Path
+from datetime import datetime
+from uuid import uuid4
+
+class Storage:
+ storage_dir: str
+ quarantine_dir: str
+
+ def __init__(self, traces: str) -> None:
+ self.traces_dir = Path(traces)
+ self.traces_dir.mkdir(parents=True, exist_ok=True)
+
+ def jail(self, safe: bool = False) -> str:
+ if safe:
+ return self.storage_dir
+ return self.quarantine_dir
+
+ @contextmanager
+ def temp(self, suffix=".dcm"):
+ date_name = datetime.now().strftime("%YY%mm%dd_%HH%MM%SS")
+ filename = f"{date_name}_{uuid4().hex}{suffix}"
+
+ tmp_dir = Path(tempfile.gettempdir())
+ path = tmp_dir / filename
+
+ try:
+ yield path
+ finally:
+ path.unlink(missing_ok=True)
+
+ def compress(self, path: Path, compress_suffix=".gz") -> Path:
+ compressed_path = (
+ self.traces_dir / path.name
+ ).with_suffix(path.suffix + compress_suffix)
+
+ with path.open("rb") as f_in, gzip.open(compressed_path, "wb") as f_out:
+ shutil.copyfileobj(f_in, f_out)
+
+ return compressed_path
\ No newline at end of file
diff --git a/src/web/__init__.py b/src/web/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/web/server.py b/src/web/server.py
new file mode 100644
index 00000000..771b562f
--- /dev/null
+++ b/src/web/server.py
@@ -0,0 +1,90 @@
+import os
+import ujson
+from flask import Flask, jsonify, render_template, send_from_directory
+
+import logging
+
+logger = logging.getLogger(__name__)
+
+app = Flask(__name__)
+
+@app.route("/")
+def landing_page():
+ return render_template("landing.html")
+
+
+@app.route("/home")
+def home():
+ return render_template("status.html")
+
+
+@app.route("/logs")
+def logs():
+ return render_template("logs.html")
+
+
+@app.route("/status")
+def status():
+ return jsonify({"status": "running"})
+
+@app.route("/logs/simplified_page")
+def simplified_logs_page():
+ return render_template("simplified_logs.html")
+
+
+@app.route("/favicon.ico")
+def favicon():
+ return send_from_directory("static", "favicon.ico")
+
+
+@app.errorhandler(404)
+def not_found(e):
+ # Do not log 404 errors
+ return jsonify({"error": "Not Found"}), 404
+
+
+@app.errorhandler(Exception)
+def handle_exception(e):
+ return jsonify({"error": "Internal Server Error"}), 500
+
+
+@app.route("/logs/simplified")
+def simplified_logs():
+ logs_dir = app.config["logs"]
+ fpath = os.path.join(logs_dir, "simplified.log")
+
+ if not os.path.exists(fpath):
+ return jsonify({"error": "Logs not found"}), 404
+
+ records = []
+ with open(fpath, "r") as f:
+ for line in f:
+ line = line.replace("'", '"').strip()
+ if not line:
+ continue
+
+ record = ujson.loads(line)
+ records.append(record)
+
+ return jsonify(records)
+
+@app.route("/logs/all")
+def all_logs():
+ logs_dir = app.config["logs"]
+ fpath = os.path.join(logs_dir, "logs.log")
+
+ if not os.path.exists(fpath):
+ return jsonify({"error": "Logs not found"}), 404
+
+ with open(fpath, "r") as f:
+ log_content = f.read().replace("\n", " ")
+
+ return f"{log_content} "
+
+def main(
+ host: str="0.0.0.0",
+ port: int=5000,
+ logs_dir: str="logs/dicomhawk",
+ ):
+ app.config["logs"] = logs_dir
+ app.run(host, port=port)
diff --git a/flask_logging_server/static/all_logs.js b/src/web/static/all_logs.js
similarity index 100%
rename from flask_logging_server/static/all_logs.js
rename to src/web/static/all_logs.js
diff --git a/flask_logging_server/static/favicon.ico b/src/web/static/favicon.ico
similarity index 100%
rename from flask_logging_server/static/favicon.ico
rename to src/web/static/favicon.ico
diff --git a/flask_logging_server/static/dicomhawk_logo.png b/src/web/static/logo.png
similarity index 100%
rename from flask_logging_server/static/dicomhawk_logo.png
rename to src/web/static/logo.png
diff --git a/flask_logging_server/static/logs.js b/src/web/static/logs.js
similarity index 100%
rename from flask_logging_server/static/logs.js
rename to src/web/static/logs.js
diff --git a/flask_logging_server/static/particles.json b/src/web/static/particles.json
similarity index 100%
rename from flask_logging_server/static/particles.json
rename to src/web/static/particles.json
diff --git a/flask_logging_server/static/particles.min.js b/src/web/static/particles.min.js
similarity index 100%
rename from flask_logging_server/static/particles.min.js
rename to src/web/static/particles.min.js
diff --git a/flask_logging_server/static/styles.css b/src/web/static/styles.css
similarity index 100%
rename from flask_logging_server/static/styles.css
rename to src/web/static/styles.css
diff --git a/flask_logging_server/templates/landing.html b/src/web/templates/landing.html
similarity index 79%
rename from flask_logging_server/templates/landing.html
rename to src/web/templates/landing.html
index 815ddc4d..8b3b090e 100644
--- a/flask_logging_server/templates/landing.html
+++ b/src/web/templates/landing.html
@@ -10,7 +10,7 @@
@@ -34,13 +34,10 @@
Welcome to DICOMHawk
-