aboutsummaryrefslogtreecommitdiffhomepage
path: root/pingora-ketama
diff options
context:
space:
mode:
Diffstat (limited to 'pingora-ketama')
-rw-r--r--pingora-ketama/Cargo.toml32
-rw-r--r--pingora-ketama/LICENSE202
-rw-r--r--pingora-ketama/benches/memory.rs22
-rw-r--r--pingora-ketama/benches/simple.rs45
-rw-r--r--pingora-ketama/examples/health_aware_selector.rs94
-rw-r--r--pingora-ketama/src/lib.rs447
-rw-r--r--pingora-ketama/test-data/README.md18
-rw-r--r--pingora-ketama/test-data/nginx.conf29
-rw-r--r--pingora-ketama/test-data/sample-nginx-upstream.csv1001
-rwxr-xr-xpingora-ketama/test-data/trace.sh6
10 files changed, 1896 insertions, 0 deletions
diff --git a/pingora-ketama/Cargo.toml b/pingora-ketama/Cargo.toml
new file mode 100644
index 0000000..1e467b5
--- /dev/null
+++ b/pingora-ketama/Cargo.toml
@@ -0,0 +1,32 @@
+[package]
+name = "pingora-ketama"
+version = "0.1.0"
+description = "Rust port of the nginx consistent hash function"
+authors = ["Pingora Team <[email protected]>"]
+license = "Apache-2.0"
+edition = "2021"
+repository = "https://github.com/cloudflare/pingora"
+categories = ["caching", "algorithms"]
+keywords = ["hash", "hashing", "consistent", "pingora"]
+
+[dependencies]
+crc32fast = "1.3"
+
+[dev-dependencies]
+criterion = "0.4"
+csv = "1.2"
+dhat = "0.3"
+env_logger = "0.9"
+log = { workspace = true }
+rand = "0.8"
+
+[[bench]]
+name = "simple"
+harness = false
+
+[[bench]]
+name = "memory"
+harness = false
+
+[features]
+heap-prof = []
diff --git a/pingora-ketama/LICENSE b/pingora-ketama/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/pingora-ketama/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/pingora-ketama/benches/memory.rs b/pingora-ketama/benches/memory.rs
new file mode 100644
index 0000000..ac12de4
--- /dev/null
+++ b/pingora-ketama/benches/memory.rs
@@ -0,0 +1,22 @@
+use pingora_ketama::{Bucket, Continuum};
+
+#[global_allocator]
+static ALLOC: dhat::Alloc = dhat::Alloc;
+
+fn buckets() -> Vec<Bucket> {
+ let mut b = Vec::new();
+
+ for i in 1..254 {
+ b.push(Bucket::new(
+ format!("127.0.0.{i}:6443").parse().unwrap(),
+ 10,
+ ));
+ }
+
+ b
+}
+
+pub fn main() {
+ let _profiler = dhat::Profiler::new_heap();
+ let _c = Continuum::new(&buckets());
+}
diff --git a/pingora-ketama/benches/simple.rs b/pingora-ketama/benches/simple.rs
new file mode 100644
index 0000000..253cf33
--- /dev/null
+++ b/pingora-ketama/benches/simple.rs
@@ -0,0 +1,45 @@
+use pingora_ketama::{Bucket, Continuum};
+
+use criterion::{criterion_group, criterion_main, Criterion};
+use rand::distributions::Alphanumeric;
+use rand::{thread_rng, Rng};
+
+#[cfg(feature = "heap-prof")]
+#[global_allocator]
+static ALLOC: dhat::Alloc = dhat::Alloc;
+
+fn buckets() -> Vec<Bucket> {
+ let mut b = Vec::new();
+
+ for i in 1..101 {
+ b.push(Bucket::new(format!("127.0.0.{i}:6443").parse().unwrap(), 1));
+ }
+
+ b
+}
+
+fn random_string() -> String {
+ thread_rng()
+ .sample_iter(&Alphanumeric)
+ .take(30)
+ .map(char::from)
+ .collect()
+}
+
+pub fn criterion_benchmark(c: &mut Criterion) {
+ #[cfg(feature = "heap-prof")]
+ let _profiler = dhat::Profiler::new_heap();
+
+ c.bench_function("create_continuum", |b| {
+ b.iter(|| Continuum::new(&buckets()))
+ });
+
+ c.bench_function("continuum_hash", |b| {
+ let continuum = Continuum::new(&buckets());
+
+ b.iter(|| continuum.node(random_string().as_bytes()))
+ });
+}
+
+criterion_group!(benches, criterion_benchmark);
+criterion_main!(benches);
diff --git a/pingora-ketama/examples/health_aware_selector.rs b/pingora-ketama/examples/health_aware_selector.rs
new file mode 100644
index 0000000..938c7d7
--- /dev/null
+++ b/pingora-ketama/examples/health_aware_selector.rs
@@ -0,0 +1,94 @@
+use log::info;
+use pingora_ketama::{Bucket, Continuum};
+use std::collections::HashMap;
+use std::net::SocketAddr;
+
+// A repository for node healthiness, emulating a health checker.
+struct NodeHealthRepository {
+ nodes: HashMap<SocketAddr, bool>,
+}
+
+impl NodeHealthRepository {
+ fn new() -> Self {
+ NodeHealthRepository {
+ nodes: HashMap::new(),
+ }
+ }
+
+ fn set_node_health(&mut self, node: SocketAddr, is_healthy: bool) {
+ self.nodes.insert(node, is_healthy);
+ }
+
+ fn node_is_healthy(&self, node: &SocketAddr) -> bool {
+ self.nodes.get(node).cloned().unwrap_or(false)
+ }
+}
+
+// A health-aware node selector, which relies on the above health repository.
+struct HealthAwareNodeSelector<'a> {
+ ring: Continuum,
+ max_tries: usize,
+ node_health_repo: &'a NodeHealthRepository,
+}
+
+impl<'a> HealthAwareNodeSelector<'a> {
+ fn new(r: Continuum, tries: usize, nhr: &NodeHealthRepository) -> HealthAwareNodeSelector {
+ HealthAwareNodeSelector {
+ ring: r,
+ max_tries: tries,
+ node_health_repo: nhr,
+ }
+ }
+
+ // Try to select a node within <max_tries> attempts.
+ fn try_select(&self, key: &str) -> Option<SocketAddr> {
+ let node_iter = self.ring.node_iter(key.as_bytes());
+
+ for (tries, node) in node_iter.enumerate() {
+ if tries >= self.max_tries {
+ break;
+ }
+
+ if self.node_health_repo.node_is_healthy(node) {
+ return Some(*node);
+ }
+ }
+
+ None
+ }
+}
+
+// RUST_LOG=INFO cargo run --example health_aware_selector
+fn main() {
+ env_logger::init();
+
+ // Set up some nodes.
+ let buckets: Vec<_> = (1..=10)
+ .map(|i| Bucket::new(format!("127.0.0.{i}:6443").parse().unwrap(), 1))
+ .collect();
+
+ // Mark the 1-5th nodes healthy, the 6-10th nodes unhealthy.
+ let mut health_repo = NodeHealthRepository::new();
+ (1..=10)
+ .map(|i| (i, format!("127.0.0.{i}:6443").parse().unwrap()))
+ .for_each(|(i, n)| {
+ health_repo.set_node_health(n, i < 6);
+ });
+
+ // Create a health-aware selector with up to 3 tries.
+ let health_aware_selector =
+ HealthAwareNodeSelector::new(Continuum::new(&buckets), 3, &health_repo);
+
+ // Let's try the selector on a few keys.
+ for i in 0..5 {
+ let key = format!("key_{i}");
+ match health_aware_selector.try_select(&key) {
+ Some(node) => {
+ info!("{key}: {}:{}", node.ip(), node.port());
+ }
+ None => {
+ info!("{key}: no healthy node found!");
+ }
+ }
+ }
+}
diff --git a/pingora-ketama/src/lib.rs b/pingora-ketama/src/lib.rs
new file mode 100644
index 0000000..0917056
--- /dev/null
+++ b/pingora-ketama/src/lib.rs
@@ -0,0 +1,447 @@
+// Copyright 2024 Cloudflare, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! # pingora-ketama
+//! A Rust port of the nginx consistent hashing algorithm.
+//!
+//! This crate provides a consistent hashing algorithm which is identical in
+//! behavior to [nginx consistent hashing](https://www.nginx.com/resources/wiki/modules/consistent_hash/).
+//!
+//! Using a consistent hash strategy like this is useful when one wants to
+//! minimize the amount of requests that need to be rehashed to different nodes
+//! when a node is added or removed.
+//!
+//! Here's a simple example of how one might use it:
+//!
+//! ```
+//! use pingora_ketama::{Bucket, Continuum};
+//!
+//! # #[allow(clippy::needless_doctest_main)]
+//! fn main() {
+//! // Set up a continuum with a few nodes of various weight.
+//! let mut buckets = vec![];
+//! buckets.push(Bucket::new("127.0.0.1:12345".parse().unwrap(), 1));
+//! buckets.push(Bucket::new("127.0.0.2:12345".parse().unwrap(), 2));
+//! buckets.push(Bucket::new("127.0.0.3:12345".parse().unwrap(), 3));
+//! let ring = Continuum::new(&buckets);
+//!
+//! // Let's see what the result is for a few keys:
+//! for key in &["some_key", "another_key", "last_key"] {
+//! let node = ring.node(key.as_bytes()).unwrap();
+//! println!("{}: {}:{}", key, node.ip(), node.port());
+//! }
+//! }
+//! ```
+//!
+//! ```bash
+//! # Output:
+//! some_key: 127.0.0.3:12345
+//! another_key: 127.0.0.3:12345
+//! last_key: 127.0.0.2:12345
+//! ```
+//!
+//! We've provided a health-aware example in
+//! `pingora-ketama/examples/health_aware_selector.rs`.
+//!
+//! For a carefully crafted real-world example, see the pingora-load-balancer
+//! crate.
+
+use std::cmp::Ordering;
+use std::io::Write;
+use std::net::SocketAddr;
+use std::usize;
+
+use crc32fast::Hasher;
+
+/// A [Bucket] represents a server for consistent hashing
+///
+/// A [Bucket] contains a [SocketAddr] to the server and a weight associated with it.
+#[derive(Clone, Debug, Eq, PartialEq, PartialOrd)]
+pub struct Bucket {
+ // The node name.
+ // TODO: UDS
+ node: SocketAddr,
+
+ // The weight associated with a node. A higher weight indicates that this node should
+ // receive more requests.
+ weight: u32,
+}
+
+impl Bucket {
+ /// Return a new bucket with the given node and weight.
+ ///
+ /// The chance that a [Bucket] is selected is proportional to the relative weight of all [Bucket]s.
+ ///
+ /// # Panics
+ ///
+ /// This will panic if the weight is zero.
+ pub fn new(node: SocketAddr, weight: u32) -> Self {
+ assert!(weight != 0, "weight must be at least one");
+
+ Bucket { node, weight }
+ }
+}
+
+// A point on the continuum.
+#[derive(Clone, Debug, Eq, PartialEq)]
+struct Point {
+ // the index to the actual address
+ node: u32,
+ hash: u32,
+}
+
+// We only want to compare the hash when sorting so we implement these traits by hand.
+impl Ord for Point {
+ fn cmp(&self, other: &Self) -> Ordering {
+ self.hash.cmp(&other.hash)
+ }
+}
+
+impl PartialOrd for Point {
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ Some(self.cmp(other))
+ }
+}
+
+impl Point {
+ fn new(node: u32, hash: u32) -> Self {
+ Point { node, hash }
+ }
+}
+
+/// The consistent hashing ring
+///
+/// A [Continuum] represents a ring of buckets where a node is associated with various points on
+/// the ring.
+pub struct Continuum {
+ ring: Box<[Point]>,
+ addrs: Box<[SocketAddr]>,
+}
+
+impl Continuum {
+ /// Create a new [Continuum] with the given list of buckets.
+ pub fn new(buckets: &[Bucket]) -> Self {
+ // This constant is copied from nginx. It will create 160 points per weight unit. For
+ // example, a weight of 2 will create 320 points on the ring.
+ const POINT_MULTIPLE: u32 = 160;
+
+ if buckets.is_empty() {
+ return Continuum {
+ ring: Box::new([]),
+ addrs: Box::new([]),
+ };
+ }
+
+ // The total weight is multiplied by the factor of points to create many points per node.
+ let total_weight: u32 = buckets.iter().fold(0, |sum, b| sum + b.weight);
+ let mut ring = Vec::with_capacity((total_weight * POINT_MULTIPLE) as usize);
+ let mut addrs = Vec::with_capacity(buckets.len());
+
+ for bucket in buckets {
+ let mut hasher = Hasher::new();
+
+ // We only do the following for backwards compatibility with nginx/memcache:
+ // - Convert SocketAddr to string
+ // - The hash input is as follows "HOST EMPTY PORT PREVIOUS_HASH". Spaces are only added
+ // for readability.
+ // TODO: remove this logic and hash the literal SocketAddr once we no longer
+ // need backwards compatibility
+
+ // with_capacity = max_len(ipv6)(39) + len(null)(1) + max_len(port)(5)
+ let mut hash_bytes = Vec::with_capacity(39 + 1 + 5);
+ write!(&mut hash_bytes, "{}", bucket.node.ip()).unwrap();
+ write!(&mut hash_bytes, "\0").unwrap();
+ write!(&mut hash_bytes, "{}", bucket.node.port()).unwrap();
+ hasher.update(hash_bytes.as_ref());
+
+ // A higher weight will add more points for this node.
+ let num_points = bucket.weight * POINT_MULTIPLE;
+
+ // This is appended to the crc32 hash for each point.
+ let mut prev_hash: u32 = 0;
+ addrs.push(bucket.node);
+ let node = addrs.len() - 1;
+ for _ in 0..num_points {
+ let mut hasher = hasher.clone();
+ hasher.update(&prev_hash.to_le_bytes());
+
+ let hash = hasher.finalize();
+ ring.push(Point::new(node as u32, hash));
+ prev_hash = hash;
+ }
+ }
+
+ // Sort and remove any duplicates.
+ ring.sort();
+ ring.dedup_by(|a, b| a.hash == b.hash);
+
+ Continuum {
+ ring: ring.into_boxed_slice(),
+ addrs: addrs.into_boxed_slice(),
+ }
+ }
+
+ /// Find the associated index for the given input.
+ pub fn node_idx(&self, input: &[u8]) -> usize {
+ let hash = crc32fast::hash(input);
+
+ // The `Result` returned here is either a match or the error variant returns where the
+ // value would be inserted.
+ match self.ring.binary_search_by(|p| p.hash.cmp(&hash)) {
+ Ok(i) => i,
+ Err(i) => {
+ // We wrap around to the front if this value would be inserted at the end.
+ if i == self.ring.len() {
+ 0
+ } else {
+ i
+ }
+ }
+ }
+ }
+
+ /// Hash the given `hash_key` to the server address.
+ pub fn node(&self, hash_key: &[u8]) -> Option<SocketAddr> {
+ self.ring
+ .get(self.node_idx(hash_key)) // should we unwrap here?
+ .map(|p| self.addrs[p.node as usize])
+ }
+
+ /// Get an iterator of nodes starting at the original hashed node of the `hash_key`.
+ ///
+ /// This function is useful to find failover servers if the original ones are offline, which is
+ /// cheaper than rebuilding the entire hash ring.
+ pub fn node_iter(&self, hash_key: &[u8]) -> NodeIterator {
+ NodeIterator {
+ idx: self.node_idx(hash_key),
+ continuum: self,
+ }
+ }
+
+ pub fn get_addr(&self, idx: &mut usize) -> Option<&SocketAddr> {
+ let point = self.ring.get(*idx);
+ if point.is_some() {
+ // only update idx for non-empty ring otherwise we will panic on modulo 0
+ *idx = (*idx + 1) % self.ring.len();
+ }
+ point.map(|p| &self.addrs[p.node as usize])
+ }
+}
+
+/// Iterator over a Continuum
+pub struct NodeIterator<'a> {
+ idx: usize,
+ continuum: &'a Continuum,
+}
+
+impl<'a> Iterator for NodeIterator<'a> {
+ type Item = &'a SocketAddr;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.continuum.get_addr(&mut self.idx)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use std::net::SocketAddr;
+ use std::path::Path;
+
+ use super::{Bucket, Continuum};
+
+ fn get_sockaddr(ip: &str) -> SocketAddr {
+ ip.parse().unwrap()
+ }
+
+ #[test]
+ fn consistency_after_adding_host() {
+ fn assert_hosts(c: &Continuum) {
+ assert_eq!(c.node(b"a"), Some(get_sockaddr("127.0.0.10:6443")));
+ assert_eq!(c.node(b"b"), Some(get_sockaddr("127.0.0.5:6443")));
+ }
+
+ let buckets: Vec<_> = (1..11)
+ .map(|u| Bucket::new(get_sockaddr(&format!("127.0.0.{u}:6443")), 1))
+ .collect();
+ let c = Continuum::new(&buckets);
+ assert_hosts(&c);
+
+ // Now add a new host and ensure that the hosts don't get shuffled.
+ let buckets: Vec<_> = (1..12)
+ .map(|u| Bucket::new(get_sockaddr(&format!("127.0.0.{u}:6443")), 1))
+ .collect();
+
+ let c = Continuum::new(&buckets);
+ assert_hosts(&c);
+ }
+
+ #[test]
+ fn matches_nginx_sample() {
+ let upstream_hosts = ["127.0.0.1:7777", "127.0.0.1:7778"];
+ let upstream_hosts = upstream_hosts.iter().map(|i| get_sockaddr(i));
+
+ let mut buckets = Vec::new();
+ for upstream in upstream_hosts {
+ buckets.push(Bucket::new(upstream, 1));
+ }
+
+ let c = Continuum::new(&buckets);
+
+ assert_eq!(c.node(b"/some/path"), Some(get_sockaddr("127.0.0.1:7778")));
+ assert_eq!(
+ c.node(b"/some/longer/path"),
+ Some(get_sockaddr("127.0.0.1:7777"))
+ );
+ assert_eq!(
+ c.node(b"/sad/zaidoon"),
+ Some(get_sockaddr("127.0.0.1:7778"))
+ );
+ assert_eq!(c.node(b"/g"), Some(get_sockaddr("127.0.0.1:7777")));
+ assert_eq!(
+ c.node(b"/pingora/team/is/cool/and/this/is/a/long/uri"),
+ Some(get_sockaddr("127.0.0.1:7778"))
+ );
+ assert_eq!(
+ c.node(b"/i/am/not/confident/in/this/code"),
+ Some(get_sockaddr("127.0.0.1:7777"))
+ );
+ }
+
+ #[test]
+ fn matches_nginx_sample_data() {
+ let upstream_hosts = [
+ "10.0.0.1:443",
+ "10.0.0.2:443",
+ "10.0.0.3:443",
+ "10.0.0.4:443",
+ "10.0.0.5:443",
+ "10.0.0.6:443",
+ "10.0.0.7:443",
+ "10.0.0.8:443",
+ "10.0.0.9:443",
+ ];
+ let upstream_hosts = upstream_hosts.iter().map(|i| get_sockaddr(i));
+
+ let mut buckets = Vec::new();
+ for upstream in upstream_hosts {
+ buckets.push(Bucket::new(upstream, 100));
+ }
+
+ let c = Continuum::new(&buckets);
+
+ let path = Path::new(env!("CARGO_MANIFEST_DIR"))
+ .join("test-data")
+ .join("sample-nginx-upstream.csv");
+
+ let mut rdr = csv::ReaderBuilder::new()
+ .has_headers(false)
+ .from_path(path)
+ .unwrap();
+
+ for pair in rdr.records() {
+ let pair = pair.unwrap();
+ let uri = pair.get(0).unwrap();
+ let upstream = pair.get(1).unwrap();
+
+ let got = c.node(uri.as_bytes()).unwrap();
+ assert_eq!(got, get_sockaddr(upstream));
+ }
+ }
+
+ #[test]
+ fn node_iter() {
+ let upstream_hosts = ["127.0.0.1:7777", "127.0.0.1:7778", "127.0.0.1:7779"];
+ let upstream_hosts = upstream_hosts.iter().map(|i| get_sockaddr(i));
+
+ let mut buckets = Vec::new();
+ for upstream in upstream_hosts {
+ buckets.push(Bucket::new(upstream, 1));
+ }
+
+ let c = Continuum::new(&buckets);
+ let mut iter = c.node_iter(b"doghash");
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7778")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7779")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7779")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7777")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7777")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7778")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7778")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7779")));
+
+ // drop 127.0.0.1:7777
+ let upstream_hosts = ["127.0.0.1:7777", "127.0.0.1:7779"];
+ let upstream_hosts = upstream_hosts.iter().map(|i| get_sockaddr(i));
+
+ let mut buckets = Vec::new();
+ for upstream in upstream_hosts {
+ buckets.push(Bucket::new(upstream, 1));
+ }
+
+ let c = Continuum::new(&buckets);
+ let mut iter = c.node_iter(b"doghash");
+ // 127.0.0.1:7778 nodes are gone now
+ // assert_eq!(iter.next(), Some("127.0.0.1:7778"));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7779")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7779")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7777")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7777")));
+ // assert_eq!(iter.next(), Some("127.0.0.1:7778"));
+ // assert_eq!(iter.next(), Some("127.0.0.1:7778"));
+ assert_eq!(iter.next(), Some(&get_sockaddr("127.0.0.1:7779")));
+
+ // assert infinite cycle
+ let c = Continuum::new(&[Bucket::new(get_sockaddr("127.0.0.1:7777"), 1)]);
+ let mut iter = c.node_iter(b"doghash");
+
+ let start_idx = iter.idx;
+ for _ in 0..c.ring.len() {
+ assert!(iter.next().is_some());
+ }
+ // assert wrap around
+ assert_eq!(start_idx, iter.idx);
+ }
+
+ #[test]
+ fn test_empty() {
+ let c = Continuum::new(&[]);
+ assert!(c.node(b"doghash").is_none());
+
+ let mut iter = c.node_iter(b"doghash");
+ assert!(iter.next().is_none());
+ assert!(iter.next().is_none());
+ assert!(iter.next().is_none());
+ }
+
+ #[test]
+ fn test_ipv6_ring() {
+ let upstream_hosts = ["[::1]:7777", "[::1]:7778", "[::1]:7779"];
+ let upstream_hosts = upstream_hosts.iter().map(|i| get_sockaddr(i));
+
+ let mut buckets = Vec::new();
+ for upstream in upstream_hosts {
+ buckets.push(Bucket::new(upstream, 1));
+ }
+
+ let c = Continuum::new(&buckets);
+ let mut iter = c.node_iter(b"doghash");
+ assert_eq!(iter.next(), Some(&get_sockaddr("[::1]:7777")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("[::1]:7778")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("[::1]:7777")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("[::1]:7778")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("[::1]:7778")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("[::1]:7777")));
+ assert_eq!(iter.next(), Some(&get_sockaddr("[::1]:7779")));
+ }
+}
diff --git a/pingora-ketama/test-data/README.md b/pingora-ketama/test-data/README.md
new file mode 100644
index 0000000..f44bac8
--- /dev/null
+++ b/pingora-ketama/test-data/README.md
@@ -0,0 +1,18 @@
+# Steps to generate nginx upstream ketama hash logs
+
+1. Prepare nginx conf
+```
+mkdir -p /tmp/nginx-ketama/logs
+cp nginx.conf /tmp/nginx-ketama
+nginx -t -c nginx.conf -p /tmp/nginx-ketama
+```
+
+2. Generate trace
+```
+./trace.sh
+```
+
+3. Collect trace
+```
+ cp /tmp/nginx-ketama/logs/access.log ./sample-nginx-upstream.csv
+``` \ No newline at end of file
diff --git a/pingora-ketama/test-data/nginx.conf b/pingora-ketama/test-data/nginx.conf
new file mode 100644
index 0000000..7b30a3a
--- /dev/null
+++ b/pingora-ketama/test-data/nginx.conf
@@ -0,0 +1,29 @@
+events {}
+http {
+ log_format upper '$request_uri,$upstream_addr';
+
+ upstream uppers {
+ hash $request_uri consistent;
+
+ server 10.0.0.1:443 weight=100 max_fails=0;
+ server 10.0.0.2:443 weight=100 max_fails=0;
+ server 10.0.0.3:443 weight=100 max_fails=0;
+ server 10.0.0.4:443 weight=100 max_fails=0;
+ server 10.0.0.5:443 weight=100 max_fails=0;
+ server 10.0.0.6:443 weight=100 max_fails=0;
+ server 10.0.0.7:443 weight=100 max_fails=0;
+ server 10.0.0.8:443 weight=100 max_fails=0;
+ server 10.0.0.9:443 weight=100 max_fails=0;
+ }
+
+ server {
+ listen 127.0.0.1:8080;
+
+ location / {
+ access_log /tmp/nginx-ketama/logs/access.log upper;
+ proxy_connect_timeout 5ms;
+ proxy_next_upstream off;
+ proxy_pass http://uppers;
+ }
+ }
+} \ No newline at end of file
diff --git a/pingora-ketama/test-data/sample-nginx-upstream.csv b/pingora-ketama/test-data/sample-nginx-upstream.csv
new file mode 100644
index 0000000..1b0c113
--- /dev/null
+++ b/pingora-ketama/test-data/sample-nginx-upstream.csv
@@ -0,0 +1,1001 @@
+/81fa1d251d605775d647b5b55565e71526d4cef6,10.0.0.7:443
+/2fec328e6ccdda6a7edf329f9f780e546ea183b4,10.0.0.5:443
+/19fb835d90883a6263ec4279c6da184e3f1a79b2,10.0.0.4:443
+/da7a88e542f7aaddc074f988164b9df7e5f7fea6,10.0.0.4:443
+/8f87cfd8005306643b6528b3d4125cf005139a7e,10.0.0.5:443
+/26d2769eab098458bc3e4e641a4b7d8abffd0aea,10.0.0.6:443
+/aa5b5323980f2d3e21246212ebd820c3949c1e88,10.0.0.7:443
+/d9c4bc3cc4517c629e8f4c911c2fd8baf260ae65,10.0.0.1:443
+/28c1c069a2904bb3b3e0f9731b1ff8de9ab7a76d,10.0.0.4:443
+/fe5199bdfeee5cd431ae7e9f77f178164f9995a0,10.0.0.9:443
+/43992eee187920c5e8695332f71ca6e23ef6ac4b,10.0.0.3:443
+/38528aab753a6f32de86b5a7acdbb0c885137a81,10.0.0.9:443
+/12d4b9155ff599c0ac554226796b58a2278b450f,10.0.0.7:443
+/9c34c9a4f9009997dd29c6e6a627b0aca7beb6e5,10.0.0.5:443
+/eb5a2ab55796afd673874fd7560f1329be5540bd,10.0.0.9:443
+/ad7b5395766b77098c3f212043650a805b622ffe,10.0.0.3:443
+/c72fedf4177499635302849496898fe4f3409cc1,10.0.0.9:443
+/77766138aaf0c016bdd1f6b996177fc8ca1d2204,10.0.0.8:443
+/860c86b94e04f2648fb164c87fd6166707fd08ff,10.0.0.6:443
+/1b419454e4eb63ef915e8e06cc11110a3ccd607e,10.0.0.7:443
+/a8762dc488e1a1af31e53af8ddb887d4f3cca990,10.0.0.8:443
+/2e8e8e8fdeada0bbd33ba57d20209b4d9343f965,10.0.0.4:443
+/0220fa8b9a256e7fcf823097759aa3c44e6390e3,10.0.0.6:443
+/418c1c554186b78c11de89227fbc24ef128bce54,10.0.0.8:443
+/bc86e565b76f8e6f560064b02ab26529b6064571,10.0.0.3:443
+/5c6a9b50df69956bd2b937ce7871ba6d67678db6,10.0.0.5:443
+/5726f95dd0b1b145ad1a06755580f42fea41ac2a,10.0.0.9:443
+/db601a7f7e24504b820e5ef5276b2653ec6c17d9,10.0.0.4:443
+/f428a38a0d3dbbb12d475aa8f5be917147175eaf,10.0.0.6:443
+/b815ca5871d52098946eded8a3382d086747818f,10.0.0.1:443
+/fc61e21e21c6c0a9e03807a2cad7c1e79a104786,10.0.0.1:443
+/8278c52b97c1e805c1c7c1a62123ca0a87e2ea2a,10.0.0.8:443
+/668fd6d99bfb50b85b0928a8915761be2ca19089,10.0.0.2:443
+/fefbfb22035c938b44d305dbb71b11d531257af8,10.0.0.2:443
+/c30b287269464a75cf76a603145a7e44b83c8bde,10.0.0.5:443
+/7584dbc60619230cb5a315cfdd3760fe2e2980c3,10.0.0.9:443
+/399b3bdce88319bdba1b6b310cfcbd9db9cec234,10.0.0.6:443
+/5edc91979f6f38dbbe00544d97d617b92b3df93d,10.0.0.9:443
+/ac740e2450803d9b6042a3a98e5fe16eaad536e6,10.0.0.1:443
+/46013f26dbbde9c25de5fcbb92ff331d5614bae8,10.0.0.5:443
+/f109862c7c78e8ce087aeff9f2368d54d91fd3be,10.0.0.5:443
+/fdc13a7011bbcf36b232adde4c610f0f35e9147e,10.0.0.3:443
+/8387a3c076e525cae448c6a3b22988a2f37a98fc,10.0.0.1:443
+/b4739e36d8e7eba1a400925c928caf0741b1a92a,10.0.0.1:443
+/d92612bb3f678d8b181fa176e0af7227bf5f7e42,10.0.0.9:443
+/89ec56b1d8d72c888b044e8cd7fa51b9ac726a41,10.0.0.2:443
+/7cf921d8181af6912676f20c3d961d3f2ffbad20,10.0.0.3:443
+/9181876c839cf16fd7c8c858b7afdc0178fb9500,10.0.0.3:443
+/1034a4394566c826888f813af75c396fe8082b43,10.0.0.3:443
+/81ac831667e89c2c6b3c6098b598d99eb1ce2b20,10.0.0.2:443
+/d9dbae8a03a430b8d9cbffcf622b4e379bc89bf6,10.0.0.7:443
+/c67776793fdcf7553fe0cb6414bb9dafe0216911,10.0.0.6:443
+/1ee25559aa4aaa11ec1b3d2cc8645ed05ec001b3,10.0.0.9:443
+/580180a2b85efff1a393ea2449ae271148ca2770,10.0.0.2:443
+/84e1a1904a52e43ace344346032daca4e1bb69d6,10.0.0.8:443
+/9cd06ffa608a252a30d935d2ebf10eceda06ba2e,10.0.0.6:443
+/cf85a0000f38ac5346ddddd8cc0c28a054bbe60c,10.0.0.5:443
+/c31f22b05514e380dd4430086486dc3ba4e36ed4,10.0.0.6:443
+/336fdd336fde2bde2e0132d4be65088953036175,10.0.0.7:443
+/cb1e7e2c425607defdd725e81ca3121340dbc8bb,10.0.0.8:443
+/7bd85bb6826eeb30a67a999bfdeb6f6368954a3d,10.0.0.5:443
+/bb542ca4f154437b0fa394b3be8d45350efc4955,10.0.0.8:443
+/53e425848829e3aeb1c6991512e1951145b2ce46,10.0.0.6:443
+/a6ad65c1bcacb876b76165e741f35c98a09cbbf3,10.0.0.3:443
+/1fca16e96a89623e2ef7a93fccd767c4ef2a7905,10.0.0.9:443
+/b9ad129954c11aa1491552845199c2fb4bbff25e,10.0.0.2:443
+/9c0380f918aeb44664929447077ee992894cb754,10.0.0.9:443
+/a9aeb4e3fb0b2358f70a6d9c2ad62409a7c24574,10.0.0.5:443
+/8d563416df0c167343d295f889d64dd9ff213a9e,10.0.0.7:443
+/71ddc6cc8f25f63ad7df9ad963beb9a14ca6b76f,10.0.0.2:443
+/1dd61ea19da5970147129b0ba635338bc93c7aba,10.0.0.7:443
+/2c019dd0aebfdf9d94fb1201b25f443c91c034f8,10.0.0.8:443
+/636b620e6d548492a0fac32e895fa64ab48fa70d,10.0.0.1:443
+/e26420a446174c0bcbc008f3d8ce97570d55619e,10.0.0.7:443
+/2522d660a63527ab2f74c7a167366bbb0bc46cb1,10.0.0.6:443
+/6e585c3e88aeb95554f5c00730c70d71189a12c6,10.0.0.1:443
+/0bc50da77b7cf3959612950d97564e91e5a0f3fa,10.0.0.9:443
+/167872e2688593c6544c0855b76a99fd0f96bb69,10.0.0.8:443
+/7842aa002d2416c4587d779bbea40f5983883a9d,10.0.0.1:443
+/b3cdb310440af5a8a9788534e2a44e1df75fc0aa,10.0.0.2:443
+/7c17fc177496c13dd1207388087ae1979603c886,10.0.0.5:443
+/28865c3daa92ec1e3784c51e9aa70c78b902dfa6,10.0.0.3:443
+/4b990fc439195c5e05cfea65a2453f23fc5bbf1a,10.0.0.5:443
+/7261021a69a6478b0620315c231c4aa26fda2638,10.0.0.2:443
+/d5caa3e251ad2dd28ba82c3dcb99bff6d368e2a0,10.0.0.1:443
+/a8606508d178e519aa53f989ef60db8a0f3a2c2c,10.0.0.2:443
+/eb797fcf3e5954c884b78360247e38566f7f674a,10.0.0.9:443
+/289ced7bea19beee166cf4b07d31c8461975d4e4,10.0.0.6:443
+/e563ce7e72b68097a6432f68f86ed6f40d040ac3,10.0.0.3:443
+/ba22b6f2657746d3b8f802ab2303ffd4b040a73f,10.0.0.7:443
+/5dbda23f45eb02ecc74e57905b9dc6eab6d9770c,10.0.0.9:443
+/637691e12da247452c3a614f560001e263a9f85e,10.0.0.5:443
+/b2e491e1528813c17dfc888c5039c9e3f40f9040,10.0.0.8:443
+/a4575d09e2fcb4d42e214c33be25c2f1c10e8323,10.0.0.5:443
+/d655e051b4f82c459b20afbd2ccca058e16ad3fa,10.0.0.2:443
+/cdca39ce5deb7022702e18e0c6b61010ba931e54,10.0.0.9:443
+/58b31129208a29d2435258dc9f24a6b851ed1ac0,10.0.0.6:443
+/019930f0699b20a72a091c1042dfe33ac568b190,10.0.0.5:443
+/f00117302e2daca8c81e68cb33cf445b72c45895,10.0.0.9:443
+/da90cf74593ee181693910a40142bc79479c354e,10.0.0.5:443
+/87654ba6f96f359e4418b3368ae2256a3c2dad51,10.0.0.2:443
+/e85d0e6a90433b5a64257469c2cb4e441f39d07c,10.0.0.3:443
+/8527e42c8677b3f8264a2a647c00eb3acc5d0207,10.0.0.1:443
+/3adbb76ad6ae8a5342a5458e5f41ac4bdddb45fb,10.0.0.5:443
+/96e7ecedc6c60f0b52869a98f9d192af1e72d329,10.0.0.9:443
+/430095d6c47a7d2a8073e73df1c694fc9065e8f3,10.0.0.4:443
+/475ce23ca92e83ebfbc781aa337063c6b034bfb6,10.0.0.3:443
+/3a2cd1836406244cf08a552f60734872cfabfa1d,10.0.0.4:443
+/47372a5cf6b640c32681f094dd588fa204839637,10.0.0.1:443
+/74d7ecd706817756952727e82a5933549d582f68,10.0.0.4:443
+/0c1ab68f17265ddc9a58577f2a3443b523508d2a,10.0.0.3:443
+/e72871b3b2e08e87443995810c8fc542ec0c3b88,10.0.0.7:443
+/20ffdb8b43d521aee3c81cbb668b94828bf3f86d,10.0.0.9:443
+/b9a4b7d390a4fb62ea6252287351954ce6935fd2,10.0.0.9:443
+/71f52570d9fa32e2df99088e44850fa9097804ec,10.0.0.6:443
+/9533af016368e423dc90b4e249002233fa3fcd06,10.0.0.8:443
+/23992435c60a48db0188097fb2f15826d99be05f,10.0.0.1:443
+/bc351d376bcd7338aca33255199bfa3ced51d66b,10.0.0.5:443
+/bc5a14bccb994f346069886be05ba91dc4cefacd,10.0.0.4:443
+/6a29ff380492b77fe69f9ec0851cbbf7228d62f3,10.0.0.8:443
+/99bbb0675c38e292e979110ac88fc7711edc92a2,10.0.0.7:443
+/786105dc60dfffc8e2ea58679a14fd4428570d10,10.0.0.4:443
+/d983235f5af78dc9b13a5d177a44c6a76c8fbb2c,10.0.0.8:443
+/55163e01bc026cab4cf6985c8c2583876680aa80,10.0.0.2:443
+/eb68e3145c8a531198ea2a60e7a4fe6cb1a2b78f,10.0.0.6:443
+/7996a420a8e08545583a8ca0941c1a0c9ddc875c,10.0.0.9:443
+/d8d3509e8df61eff246be4faa6630d5f11b81172,10.0.0.4:443
+/ecd74f84dadcbb5e7ab90430ba424a996a5ec50f,10.0.0.7:443
+/566ca8a48b0875bdf60d224188b0d952da6c8dc7,10.0.0.5:443
+/0497f891fd6d35ffc0ed28dd3ba17eeba1301fa0,10.0.0.2:443
+/6a406d220cbda7fad4facc04632fd0c12dc6d998,10.0.0.4:443
+/3a54c0bfc41cd0942d0e479430cdbc551e33fb99,10.0.0.9:443
+/a7a224cf1e0d9b4e5493b2f61fa53ad72de58b94,10.0.0.6:443
+/4121200fe9e4e7c2126c5d71d108e5119f37783a,10.0.0.4:443
+/caf4c4b46875bbfa63b9ab35a4bce5646ebd55b4,10.0.0.3:443
+/90ad2be0a253536ab7c3e961443a91ded0e66e61,10.0.0.1:443
+/caf569f41f3556f588fefc887d6ec0d454bfef8c,10.0.0.9:443
+/0e3c3e157ffefdfa94e785d4a55f4eb6fca4dc70,10.0.0.2:443
+/b0b8ba29e45725715f7982a05edac1ff999a7899,10.0.0.3:443
+/cc5430ac1220fe146e68e9cf6f174269d403224d,10.0.0.7:443
+/508445e1be7b2b4495f2eb5907530bb095e98ea7,10.0.0.5:443
+/d6169d6f2495da4842a67163dcc0e5f31acb1a0c,10.0.0.3:443
+/8d85ea8d983c0e35836b8a203660c6c919da645d,10.0.0.8:443
+/ee5128bf7f95196d6569af52c9d99c4d60f132c6,10.0.0.7:443
+/461d5e76ae9d26244e546eed7038efe6cf7d9bbd,10.0.0.2:443
+/9f97615d8e9dea23c4c4e841838404fcd8698d8e,10.0.0.6:443
+/c01e055c153b1d34d51c6598e2e1c3fc362d812e,10.0.0.8:443
+/7c087772081d068f5fd86960e4d89901f3c06afe,10.0.0.2:443
+/37e6e5c96c2661d244cbd243151f9c90119d5f4a,10.0.0.4:443
+/663e532894288bb97751dda93f151d85f6c16813,10.0.0.7:443
+/2b3904fd38fc96f184226c842f0643cd0596d865,10.0.0.3:443
+/14cb69e56f7f17a26f0bdfce16dec5baf539dba0,10.0.0.8:443
+/adbe42c7ca6dd63d976f49262cf3d1a27a5f7bb0,10.0.0.2:443
+/70b58e27d6eb735c3c82d9aec1f6608f2f32195f,10.0.0.3:443
+/e7d3683cca1dcc45d8e3fdfb54eddc9b34141d65,10.0.0.3:443
+/407e3958ae8b94172af71487050ef5dc0aeab2ac,10.0.0.6:443
+/4c5af9e573fc3e0120d322a950fcbb792074d670,10.0.0.7:443
+/fe92a691ba1d11d6f49e5144be9baee390cc27e6,10.0.0.9:443
+/298835604d35f371a68e93047c699a7c41375f97,10.0.0.6:443
+/2155470425069f357851ba81346b879a8193aebb,10.0.0.3:443
+/f55d45d265ec44be7ded0db1252281348fab75f0,10.0.0.4:443
+/798f665aa334e5eb9a49669785e94da933d81f32,10.0.0.8:443
+/ad8bf2624e7fc687b0130b61fdee9db2a2d865fd,10.0.0.7:443
+/d2002a4943563ca4c4fc66b4ad65aac4e1410b2e,10.0.0.2:443
+/a025e91fc9b3fcdc0491d0e4b4b0f09e322e53eb,10.0.0.6:443
+/b4a46e8f0ca5698b4f6dd201b87e88125b153ece,10.0.0.4:443
+/ff2a4976667b127ca1e3bb5027e8a836e56fd358,10.0.0.2:443
+/307086130cdefaa3d899fca3dd9e77047fff1cf7,10.0.0.5:443
+/558d5eeb99c6f1cfd6367fb101392072e5140c44,10.0.0.7:443
+/a1a3799079c1ef01be067c4c6a1db5b7fe6515b1,10.0.0.4:443
+/5b66932db9324bb9f8d6fc1f7be819c1c1ff43bd,10.0.0.5:443
+/1d69b12d308183c0d6432fb4cb8bacbc86193830,10.0.0.8:443
+/eef4c8b2ded3656c9d6174a72ffc487f0c769492,10.0.0.2:443
+/eb439a2cd0e4c9fdd95d8c0f657a81ce20f96a0e,10.0.0.2:443
+/b6f64c4a87c0d38417ce3dcc7a553a185df7f384,10.0.0.8:443
+/393d62711ecc6309a19a96ea73cffae546922f64,10.0.0.8:443
+/aa18663a595f369e048e33505f82d21ebbfe354d,10.0.0.9:443
+/759754a69ee3e4449bacd21a5866b8434b743cfe,10.0.0.1:443
+/c01e96c10fd69b430cf67edcc3fd2fec7ba30097,10.0.0.4:443
+/284e0c7dbb8e7da2a1fd7180f8d542fbf2410767,10.0.0.3:443
+/6f360332b72940cc117999224b5be35551a1790a,10.0.0.5:443
+/a83eee32d7132975d5d2d2848bc7881345e63735,10.0.0.6:443
+/9d8bfc97428dee1b1495d2568e5ac68b8ec7973d,10.0.0.1:443
+/9e09d80d5653ac55445b42c091ada230ed96cf67,10.0.0.4:443
+/6ca8d4fd764a20ca1b766f9d2a14b81011d80da4,10.0.0.5:443
+/fb89be9d12828716f95a60d092f2a028c876259a,10.0.0.1:443
+/29ffb1d20ace9afed20ce8613a2b636dae70638f,10.0.0.6:443
+/b569fa1c31949a8ab05a60939d44b1132534556d,10.0.0.7:443
+/71a89db0bb322607a2557b089a5d160fa574fc7d,10.0.0.1:443
+/4449e3e6404cecdc9a36ecff54babedc84619b1c,10.0.0.2:443
+/b26294352e342bd6e953264f9e14393413bb371d,10.0.0.2:443
+/a72621f8691cf08ffdc5884556d5512a5ecd1f6e,10.0.0.4:443
+/dc4732cfa991632b719def815b228ded96abaa1e,10.0.0.5:443
+/b908128cca7c859493155441660eaaa09b2fae80,10.0.0.1:443
+/d93c9304c07c8f1d2b6f6c89c882fc2cfad3fefe,10.0.0.4:443
+/8a0db29dc8df0b7845a9ab213d4bd8ac59a121e8,10.0.0.7:443
+/49559040bdef5e1a5dc8ee89f897b79115ef1bfe,10.0.0.7:443
+/23428c6b465b7c43629bc28fa1a7431c6e541778,10.0.0.9:443
+/9db1610e40a3197a5b8c2d0dee2b2ccfe4cabb92,10.0.0.3:443
+/1c6cf23cac024d126066771bae7af48ba141dfd9,10.0.0.1:443
+/5e89a982f7f165b47fef959e10c32afa1e01783e,10.0.0.1:443
+/52644098601b604c9e9e5e3d1150f13e81240fc8,10.0.0.8:443
+/1771afea4cf491711aa3b608fbd8b470306d7bc9,10.0.0.4:443
+/825cb4d51b986eef44d3cba31dd87c4ce3d9c159,10.0.0.4:443
+/83a6211a968db8d62e17525ce593c144ed7fbb4c,10.0.0.4:443
+/6a9abd46a919eed40be39b9d53bd73cb74acf540,10.0.0.6:443
+/12db006d907a255f8d61e5070d1a41defdae27ba,10.0.0.2:443
+/0cf51c79b9d115d7be8fcc104e2f51fee1a3caa6,10.0.0.5:443
+/6bbab5e098876a84c403ef8cbe9864c21f9bb0aa,10.0.0.4:443
+/5fc725bf869cf190f8ce82814d5e8e749030c8cf,10.0.0.1:443
+/859d96b17c00e528c07fe1696fc7ddfdb34c4875,10.0.0.7:443
+/a55638df8b2ceca37d24bb78826833deb633c79d,10.0.0.2:443
+/70ed2f73f55d4d00f9cf694a7f669c3ba11f89ed,10.0.0.3:443
+/b5c910057d813197f8353c31d233de719212455a,10.0.0.5:443
+/b602d274d7d8ff89505fb3ba364b6ccbeeb561ab,10.0.0.6:443
+/50ba092d17178b78c2643e798138ff5514d2d0a2,10.0.0.1:443
+/bf3244d6cec5c60aa29ccca799415354607b7803,10.0.0.9:443
+/7f4ddcc20818c0db3cdd8b440c269e33ef22a7c7,10.0.0.4:443
+/9dc2eaaf3539a7c0a5b97be1f722f544539c6257,10.0.0.2:443
+/c5359e50f3c202f5cd5c096bd15d757ba659e815,10.0.0.5:443
+/038366c13ffa60a0d9ef4bef212e6e7354a6bbfa,10.0.0.8:443
+/9e40dac2f57fe43878519a83af3b75fc2e590217,10.0.0.6:443
+/9b2c05c1d561f86cf9682673628dfef2160650a8,10.0.0.5:443
+/78a2ea21a979d1d0c8e07f0185f358fe58393c12,10.0.0.5:443
+/83d46e2ff9cd7bb557c1b00533a0e4f1733df84b,10.0.0.1:443
+/29bf196e578a83824c55b0f78ceab36b1eb9c82b,10.0.0.4:443
+/61249cd3d39f4dae802db5f0a875a5a4a8ad191d,10.0.0.1:443
+/c7c7dfdf8e9e68d5540aae13b2cbb5fe86c1b965,10.0.0.6:443
+/4be4e8d7897f7d9dfa210bd236e9bb45454fea20,10.0.0.9:443
+/cb5ed875dedef2013fab5b051a8636d10fef56dc,10.0.0.6:443
+/e12ec1f2b657ad0f7988db38254652e153525ad9,10.0.0.7:443
+/9ec5a64e415451efcc8aa7648b284774361e03eb,10.0.0.7:443
+/3a6afe9c8e8f041a59695055cb7733ae254632bd,10.0.0.7:443
+/e3393950cb37481a7b00cbefc3298d14aeda0807,10.0.0.3:443
+/7c6e41537748edb49cfc56ee505256f40935a99e,10.0.0.3:443
+/6bbc445ff57bc9c54407f31616f1b23bf5ee27ce,10.0.0.5:443
+/99ba1e8f21532dab31caf0731f1c5edc8455550b,10.0.0.5:443
+/725fbb619d38c436bb88e28d5219e720989ab6db,10.0.0.4:443
+/7b519ba8928f440bf01ac1d6b98611fb59bb1c89,10.0.0.8:443
+/2ff8d8dd2a37ff1cb34692a00c7fb7d1c155b419,10.0.0.3:443
+/f76abffc1a71b95e7969cceaad57429672beaf68,10.0.0.3:443
+/fe58d58e116026db4cf106ef57732e1b629caade,10.0.0.6:443
+/45549ca0d7c95e97c299b58b03ecf1939e140c9c,10.0.0.1:443
+/93695453157442d799a007d1710f7dbf968be8f1,10.0.0.9:443
+/ebe69b2ea9db3e66a2157021a17f852695eab8be,10.0.0.4:443
+/a885aecaaf297eaac5c98ed708fe6a73fc9273b8,10.0.0.2:443
+/2859256b987358b8d2ee0c81b5494cde3a98d602,10.0.0.1:443
+/d19ae90e456730d2db6b36c1ed1a45335b368fc1,10.0.0.1:443
+/f16f2e87bee62b1523dbb5824b5dfe338ec67704,10.0.0.8:443
+/fcd5f91888014decb190a9dac5fe9fca7ed8d70f,10.0.0.9:443
+/3ee610b32554b5f7c27d40a52bb982378ceb4fb6,10.0.0.7:443
+/21cc5cb90ba59b6b743bc437f0f93c45d21aaea9,10.0.0.7:443
+/8d2bffec729dd863e6dcdaeaefca22d6e29403bb,10.0.0.2:443
+/2ce6b015ea081b69a3867f7b09b753f83fbd4b77,10.0.0.9:443
+/64fcc9606275d6a259a084696318ab704a81932b,10.0.0.5:443
+/0984409349566b9bda3f5ff3b0dae93c6979969c,10.0.0.6:443
+/2b3775815cd0064c1603ec6dfe62b9ff54180638,10.0.0.5:443
+/563ff0fa8762400c92ccb700adb6ea6a7bfb0d33,10.0.0.6:443
+/901f7c9eca3f038ecf6a684a2c46b827c24e8ee6,10.0.0.5:443
+/3dbd852fb7f851fda48f742488e51dfd8d4a472e,10.0.0.9:443
+/a50ef8903707c1c5d7158a851d636ef65e198e7a,10.0.0.7:443
+/92603aec7e7f7a5847f523c336bd80d786667d6f,10.0.0.4:443
+/a941b070f313629549a2874fef17b29b25069214,10.0.0.1:443
+/9a80624738b37b3a3d6b0749feae2bb82d0672c0,10.0.0.5:443
+/f863b682f5f260f4762a14831d949c5dc9bd5f28,10.0.0.7:443
+/d41f6919aa10ee037b4a69df874de03ccfc6432a,10.0.0.4:443
+/e995303d36162db8650a2802ce0d52263c29ec0c,10.0.0.1:443
+/7823ceab6e649edbb4f99d62282fe00edbe3acca,10.0.0.2:443
+/bfd84f41dfe1d4470730d0aa41eb73b9d7461503,10.0.0.1:443
+/53f7534ee600e63d0b32bbc1f2f9e4794373c4bb,10.0.0.7:443
+/26f4c39897fdec0b453bc15860a45137064c4ef8,10.0.0.8:443
+/7345179e10fa47e31faf60e165e7802f31315c56,10.0.0.8:443
+/d47e4a2590ff8d5dd916d826adc3c20b9224a3de,10.0.0.8:443
+/8ebb8b58c53468143f882b186fb64ef14e962c0a,10.0.0.4:443
+/7fa7b9821ce360682b88b07fa27158af8d4b10bd,10.0.0.8:443
+/7d3b908d960f61cf4944ac52164eaf9890c17c47,10.0.0.3:443
+/3900dbeff282a20a6dc0b450581ae27f44230f75,10.0.0.7:443
+/327a041d0576f11ba4c0fc677a8b1fa7cdd5b215,10.0.0.6:443
+/20450e190c6b829846d1a67e43b2e57cf7e5b472,10.0.0.4:443
+/d6d97ddf81c5a8f4f11b87198a3f8e75814d09ae,10.0.0.9:443
+/48a468d706a7cc4b07c0e74695a9c2f64012b02a,10.0.0.2:443
+/35903e2f79bf054b45d9f342642d488b85ec086f,10.0.0.2:443
+/4198c731ac8a3638a955ae891498ea4071b2be10,10.0.0.7:443
+/575be0ba8f57b2650f53499ab19fcf10aca1a467,10.0.0.9:443
+/c211460d038ae3aeb286e759dbe99b9084c56fc1,10.0.0.6:443
+/7d5071d6ed21ce66d8887ee6f88bf8b3145d417d,10.0.0.4:443
+/77435459761c415127dac0d314fe73b728e93816,10.0.0.2:443
+/16a401100431531a7cd8528d6ea8f957df584e4f,10.0.0.4:443
+/9b9af306b3fb801bc4cb127118aee22f4678c6d0,10.0.0.2:443
+/4902696d40151e903ec5bf810f2b82af7bf92799,10.0.0.3:443
+/3207830ce45f38a326cba44a2bbed7ea7009e7f1,10.0.0.8:443
+/002655dd3e576dd2be046915f365ee7947c77553,10.0.0.7:443
+/8a316dc9861784929ae9283ff9edf50fcf2abb77,10.0.0.7:443
+/8b2639c2cf4f75723ae219f9c8a60779e93b3a50,10.0.0.2:443
+/d135a3f32a0eaec83386f9b8167c8b351fa0f9cd,10.0.0.5:443
+/3cb5d50669030262c50b916b5e5f0ff112a23f87,10.0.0.5:443
+/791d86b7b2c2860da849c6e20006b3f5f92714a1,10.0.0.3:443
+/de08fde7bd93bfd844407842d09bc163675fbcbb,10.0.0.2:443
+/0576ce89f317cf54673e20eb664bb8992c975a71,10.0.0.9:443
+/fd7244f5203e2985e6c65ee07686cbd2a489e21c,10.0.0.6:443
+/233de62d4ed3f6e6a8d847500ed8be500970bd0e,10.0.0.8:443
+/8b8ec68415a7a9cbc426c23ba98ad165a434fa1c,10.0.0.6:443
+/ec4230ec3e8fa6600907e777c94f2e59382b4542,10.0.0.7:443
+/bd220769eedf9c7efa641de459810048891e3dc6,10.0.0.3:443
+/9165254e59f4fad93b93a02210b25dbcaac4e0be,10.0.0.1:443
+/0adb6ec07cfcd61534a065db496c7042e97391fe,10.0.0.5:443
+/39a5c89484e21a243c7061d39dbd236c80d4ede3,10.0.0.3:443
+/dc560955b3b817db3e79e37255cd18bd66a39a22,10.0.0.9:443
+/9d433be2cca7907dae1b8c24900edc5adb6065bf,10.0.0.2:443
+/2531e51eda6b68cc2faa7a09ad032387b2676523,10.0.0.9:443
+/d591b928b7f89b00458ea30ef6f4fd20cd7e41c2,10.0.0.7:443
+/9720475f8d148f70245ade435243bfba5a1ba559,10.0.0.4:443
+/2544d73a3c1b0f04829284a5b425607f4f61ced7,10.0.0.2:443
+/e3af59332ba621011d98fbf2a38c8a0b69b9ca79,10.0.0.5:443
+/d8f4c58c0db28d7368f453d41abd59f6999b3ccc,10.0.0.8:443
+/8a6180a589aec21a274a3f47781ccb1311b0833f,10.0.0.6:443
+/83aca0a94c4883adb8e7ff795c1008ed59052691,10.0.0.7:443
+/adc1ab7741effd4ece0e832c41d1fe69f5e1805c,10.0.0.6:443
+/35a50236b60e680d3d968ad3857525a8649fd6a7,10.0.0.1:443
+/30495b101ac5318458d74b3a286527e164efac53,10.0.0.9:443
+/e2067038a82745a65406516f15817b63e328a825,10.0.0.2:443
+/754c3e717cf1640d11ee1ca113571fd0ae55a0c2,10.0.0.9:443
+/c4462289d891b8b0c0783041044908bd347a27a7,10.0.0.1:443
+/68129869b04bc2255d2a17ce01afb14f1be73032,10.0.0.3:443
+/683a4f8e369c5c3eeb85f0779aced10809bbdbb8,10.0.0.8:443
+/8da89d7686976482713413835c889a7f289174a7,10.0.0.3:443
+/511bef26cd42422c6f0c9bd33714a07b06dbb3e1,10.0.0.1:443
+/b871c4e41b3eababead2aa4dbea87fef7161affa,10.0.0.8:443
+/808da0dc7d4025a0858eec92ac72e9ffbff233c4,10.0.0.2:443
+/6fee636398f916c4ba0074fc327f7b3dbf683a8b,10.0.0.2:443
+/03ce09b1a7c7ae719f66f489841d0ff11635ffc5,10.0.0.3:443
+/8653f568fca5173d6d274060692912676709981f,10.0.0.9:443
+/8f8402b8bba56124ec6de0552c1844bd76bf72ea,10.0.0.4:443
+/2c89ed1b71a52c9b0a9fa7909dc87d4d06237216,10.0.0.1:443
+/5279a73f9dcfa562f13180791932598ed8a067f1,10.0.0.9:443
+/456482cc45669a59fe8af5e49648a8079bc35c06,10.0.0.4:443
+/90350e060dff6a507e69bd80c38629a2d9bf12b9,10.0.0.1:443
+/2d5c624c50ba3ae06782861bba176e9b2f45f529,10.0.0.8:443
+/67077af97e65ae301e88c6cd0e87c7ddb68fa9ef,10.0.0.6:443
+/f017e954321efbfe4046942be0a1122d9be81d52,10.0.0.9:443
+/0b74a181ce4b4f43023e4bc0acd7770f2867572f,10.0.0.5:443
+/f40f8509ac9f73516224825e88a220ca02db2d81,10.0.0.7:443
+/c2f12ede0ced03c9357a4fc5e05e9af5652433c4,10.0.0.9:443
+/d3ec86f1dde7e9c416c88ddbabf854e21decec2d,10.0.0.7:443
+/ea29487fa7e1c9e79ff0f257bfd8241736ddab9f,10.0.0.7:443
+/b8f4ec5dee59a8693710cb95e1734900d7b6b076,10.0.0.4:443
+/d0be164540802b86de0762ea266e03c8859ff70d,10.0.0.8:443
+/cab9ed312a56db577bc36e4c2f52e84f8abb09ce,10.0.0.7:443
+/62dfa34389964b03792842c09adce33e7decc837,10.0.0.5:443
+/f653827f1289ae68efd5a0d057fbc172f8352842,10.0.0.8:443
+/dbd9b9cf5affa501ddcd1a19eefa4240e311f94a,10.0.0.5:443
+/3e74e167ef6393b6544b4e75da97f30f6c2e6477,10.0.0.6:443
+/d004b31247c668c439fc8e491f71a69dfd35a55b,10.0.0.6:443
+/17e79540d401ae73e7d666444feececf64602d23,10.0.0.8:443
+/06c9cb78908d623842c4a7c7baae3d55009ffc43,10.0.0.1:443
+/64427a2e50196a34670b9de8a4aebe44cbb26cc5,10.0.0.2:443
+/802741e276f10186ee9b63d47af006e8bc3de516,10.0.0.1:443
+/10cea480539356be3f2a2f14c05f057a60ef9b10,10.0.0.5:443
+/17d5b6820d78727b781be06cbc7cd2a9be650794,10.0.0.8:443
+/1c0f7ec3d8919ffd2ccb3312fb7d6d2e15cd3133,10.0.0.2:443
+/ef3afb81312d46b826f033d9adf0c730996e7992,10.0.0.7:443
+/080e45e7955e797bdc906af2fabeb8fbf2ac48e1,10.0.0.1:443
+/c043b1a590f09716da25328fe0573c8e2e9c0bdc,10.0.0.9:443
+/df604b478f31f11b4cb291b1a393749ce4e72ef3,10.0.0.7:443
+/32a8a7a0678c834e2cc7ec0584cd193fd1fd91e5,10.0.0.5:443
+/8303fbffee5f38f8eb4a51f3c1255de830abce34,10.0.0.5:443
+/24c16585ac0791c7aa1d8a16bea2fae9e7008cc5,10.0.0.5:443
+/0059d4d899d1e961f249a060d91e932a89bc9b4e,10.0.0.4:443
+/f1edc74510b17b10cdff8801776d4eaf72a1cf0c,10.0.0.2:443
+/faaec2162ff441c490fd2dc0640bf2c941438995,10.0.0.3:443
+/1159fc0cd3e683f92fc649aad3a4bcc34564c3a3,10.0.0.3:443
+/2ade445523d26c3b1519e699590939011036217c,10.0.0.7:443
+/cc6b2c1b20ef1a63adf2afaf1207ecf446fb5719,10.0.0.6:443
+/8cb65496c9ebd858fb1101d85cf35467c4a0be17,10.0.0.8:443
+/38a5bad44dfc1ee47585be27cbd9598959ea6caf,10.0.0.2:443
+/c651109ffc0f2270596065009642fe3fe0529e60,10.0.0.5:443
+/b71ae7d9c9d4b67677fec2e630313cd01cd130e5,10.0.0.2:443
+/088d49f180d9a2211708c95d5e9d6986705c8d7e,10.0.0.4:443
+/8e44a5bd8519aa7b6d85f01e7b01e1a2ca236b6c,10.0.0.6:443
+/2526eec4890f03477261584646a0ed6def65f8f4,10.0.0.8:443
+/3a70dff8627a20ee109fa8241d7da762a02e02b3,10.0.0.4:443
+/eb999a0198002b52abca1fd424a44013989e1403,10.0.0.4:443
+/22a12a10268929d77ef8dcdea96f8aa69ab92d8a,10.0.0.7:443
+/b467e43c88f0e69b52e3d341fcee52198f90cf77,10.0.0.1:443
+/c5245921b3f6a21adafd6598046957086edfbeea,10.0.0.7:443
+/6229b444f64a7529dd956877c24b2d149a1debf7,10.0.0.8:443
+/4f8b5505d9e817b39e0b68e196c62240acd07306,10.0.0.7:443
+/8699dc12aa122266013234df69eb5e14d6282174,10.0.0.5:443
+/094dc8a3111d132d294030b358c23e63ff2ad680,10.0.0.5:443
+/3ecdf7b29e567a94e1548f0884f414af6539f974,10.0.0.4:443
+/abb4e33382452c2f5c5d3d0b89f11cc2d497a3a9,10.0.0.9:443
+/696adbeedd54670bdcca6356597b580dd9c4c42c,10.0.0.8:443
+/940b2a895c5540f5dd079f7ba930962980bf4e77,10.0.0.7:443
+/e3ad3f730ef0f82530373e966fc35e7521ba0fae,10.0.0.5:443
+/e68f238fe1b9f3ebffb102e98ee2d958194f0c3e,10.0.0.2:443
+/9e09afd63284f764392213c9f282e59c859ccc2a,10.0.0.3:443
+/40d1f0a5f73460d07f777d16ce0edb5215e0af5b,10.0.0.5:443
+/e641c93505fff2131a1bd6a2bcdeccc7ef56e108,10.0.0.5:443
+/51f5ef58442e9176bf4ab0e3d2a31e3919314467,10.0.0.1:443
+/5c752e882a791057babbc7c9d0fcd6f98249a90c,10.0.0.3:443
+/1a93e7ac8192b94e62372c526a858203ab55f82c,10.0.0.9:443
+/4f00d996e102527cfd906afe596b1fd20b9587e2,10.0.0.7:443
+/cb33e35ff6809c1d9e87af168853c8779949df28,10.0.0.1:443
+/8238f15b1556e4c5a2cfd3024ca22ca0cc38cf75,10.0.0.7:443
+/4d9af33ca789f5675e0b3b7db89277d9f07fe487,10.0.0.9:443
+/31f11a12c1729fbf56e7924ddeaef596d9246ffb,10.0.0.2:443
+/dc5b466b915a7eb13aa3c28a6df11201defc4776,10.0.0.1:443
+/a83dcc91951b9b9bfc86dd414ab2378dcb74bdb8,10.0.0.8:443
+/68dcee7d8e5b5bf81c1acdec7dd97891ce3aca1c,10.0.0.3:443
+/661f218fa06f2b92f22e0ab81731ac4029f4adc2,10.0.0.7:443
+/cd29f2138dc83eeb5d4f16d7b13d0c81483959a2,10.0.0.9:443
+/d34d0b880b1e7499c2133f06e9373f5ea4e841ce,10.0.0.6:443
+/1fb666f29371b67fef8e44a9322c9e387261fa18,10.0.0.2:443
+/808b776dc196d1759afc93646bbfca2c3e8074b3,10.0.0.2:443
+/20888fbf1def43e3123b0a9e4eba7fd7d5f2a410,10.0.0.4:443
+/d7cd6d38cbd5b94c432e15cd2f7502dbb306d757,10.0.0.9:443
+/fc018aa6e4835271d8cd024ec3943115cf4e94b0,10.0.0.5:443
+/27dc43e54f5d904746a36b482123346f44293b51,10.0.0.5:443
+/ed60ccb18540ad211073c281aee0dfc31ccc942e,10.0.0.4:443
+/5fe5f6c1b4d13ba7200d6a89c456f60eb36690f3,10.0.0.2:443
+/e2e2680aff762da702475c5307a31779cab5595a,10.0.0.4:443
+/b9a3d570d0f60b98af06bb2bb8f20bfefa8bc4f6,10.0.0.2:443
+/6b476c8bb82dcf0a32e3999826a788c48fe83e7d,10.0.0.2:443
+/80a371eb8a4a18395199455f8bde883ee548e4ba,10.0.0.3:443
+/de87fa6ef77299db61ac048fc87ce6e3e39934bc,10.0.0.3:443
+/52c42c3136fef68070d143e62366e47b5de255cf,10.0.0.4:443
+/ce7ea948d35ff4f7409eb507cfd3fc6e3b7cf30a,10.0.0.6:443
+/53e772cf7a78bda717c98a08b9081a40a03392da,10.0.0.7:443
+/9bcb6eeb362e0f6c8c04325848cd93f1a4fb75b0,10.0.0.4:443
+/2ef946b7546ba83f528e4af5f60a585fa22cd5e9,10.0.0.8:443
+/a964b047adfe079bd4f39c5d79daac5317611bb2,10.0.0.2:443
+/2cfad7113f585441f4fd054df57e08aa3f7d3441,10.0.0.8:443
+/f5352d8e5f1e080bc70c241a8e65cb48690bf44d,10.0.0.8:443
+/7108e1b4b2a8d73f6a892bf394d6db68eab4b06b,10.0.0.8:443
+/5ce086abaaa907ea06ad20e029375d0a469f6688,10.0.0.3:443
+/e8c9dabb0ae5ff95db4dc58d5e5ad8f49dbe1467,10.0.0.8:443
+/3ea868d97d0f366875936dee5944d30f133a11ee,10.0.0.3:443
+/4c34d28c12494292d3eb30c70e2ee5158ae45bcf,10.0.0.3:443
+/b1367bfef3363e82dce33834cccd1b6178dd4e01,10.0.0.5:443
+/e563665cf03942d218f963ac225b9f65f6f47e44,10.0.0.4:443
+/ae4a64bd0638678f1f19b31f1610e800510308a8,10.0.0.3:443
+/581ee1ca9a6cad9786fe37cba35c4809410a902f,10.0.0.2:443
+/d8065f52a7d18810daaeef95f724c63a843f9354,10.0.0.7:443
+/461f1d57aab6fa3c1bf72f5aa724ed264647c4d3,10.0.0.9:443
+/70335780553fc4499c3d7b903b7e6fb6f06bc47b,10.0.0.5:443
+/9733a49859bbd9b971475bd40e4a2bf7d9bfd203,10.0.0.3:443
+/d3d04d2aa72354af7b52b344a07dcd22dca462b8,10.0.0.2:443
+/c5ea5378e9a319cc2a455d6e296dd3ca5aa12477,10.0.0.6:443
+/f20e309d5d7d97489cc0d5ad3737af32008968cb,10.0.0.6:443
+/33d387521125b7825c8480755efce6e298e936a1,10.0.0.7:443
+/a99b72b250bfb58ddf9d6fa9f805e2873ce0c229,10.0.0.8:443
+/c8997a1855b1b4d8c6fd0a9dc21c01ffd7a1aa0d,10.0.0.4:443
+/43b0d060a125208528829cbace2759c05655c8b2,10.0.0.5:443
+/e609d51a78b4e83d2b778fef69d00f07a66e586c,10.0.0.4:443
+/e62b9cead57079d3290ac764079b6466f7340c9f,10.0.0.2:443
+/d31c487a361be7abb28a0b872d87fb41a907dd2b,10.0.0.9:443
+/b17261bb106af0ee0cc6c710439eb26135dd5f5d,10.0.0.6:443
+/14d92585f8702ef9ff0fd000907f00ca1f6a458c,10.0.0.6:443
+/fe79953554bb5aaf34adc6928060af206e8fa993,10.0.0.2:443
+/cefd63669258fb86a920a65d6fd1d511c508d954,10.0.0.6:443
+/143c0259d1759575c859b902f4e56ef478624989,10.0.0.3:443
+/50315f90fc6f82d29d925e3947ba7c32f19b5611,10.0.0.2:443
+/95428f6c4dcfbb2a0c17a5de4861de01bd3f325f,10.0.0.7:443
+/5ae459d770c6446c4d33104734b7a0293b48ce32,10.0.0.1:443
+/7078c3416e5b78c65c318b3916b5be6d92896c88,10.0.0.4:443
+/a489b81fdc1b4020b4bd3af8b759466c9023cbe2,10.0.0.4:443
+/6a6b490f616c8b52c4548b3c7f46d527662bcb5e,10.0.0.4:443
+/a607e4a8ef834a9ba7575729460fb697f5247cf8,10.0.0.2:443
+/0ea9ba29578fd164f5942d037366c3c6768bdda2,10.0.0.4:443
+/d9ba5006e81ac5128c20823155f4cfe991598179,10.0.0.4:443
+/b691e1e01b2f64c9c584bcec928345657b95d293,10.0.0.7:443
+/44710040aaa84b18986e3f16bc18e3c6ae63169b,10.0.0.7:443
+/9ffc3d11bf5b67e6e316646e64f1b703dd79bd94,10.0.0.1:443
+/1e2905288bed5c9b4c3f03cd6daeede56c2ffada,10.0.0.1:443
+/1d54d79aa491a886dfda64a7780b04161d1481a0,10.0.0.4:443
+/318d2d5e7b7347704e8a0552cbcb01adaef758a9,10.0.0.7:443
+/22b7965fa39aba2195e1fdc1e845e01f378c3d51,10.0.0.8:443
+/3cb017f3b5edf03f68ba84c5e8671e959273dd69,10.0.0.5:443
+/60c48c28f0ffdbe1225b02ef2fabd26364126d73,10.0.0.9:443
+/50330c984bb2167761149c43868e27401c678dd8,10.0.0.7:443
+/ee359ac7b7e76cbc38f5a70cfb4a7323161e8519,10.0.0.9:443
+/6dc489dc87cb4c097812bcbffa666f1d3a06920b,10.0.0.6:443
+/b084378cffd7ba654dd33d13ae00915abddb5acb,10.0.0.8:443
+/de8d58cf5b06da64685d35ea3d85692dd98443ba,10.0.0.2:443
+/926ad3a9d1411e8f959f8a99270e534c2fcc60e7,10.0.0.1:443
+/6f5efb290d2fc1f49af390123a8d45242535ba6c,10.0.0.1:443
+/be0651f76c2d6b3fea26840eb42ff84603fdeb91,10.0.0.2:443
+/664dfe003d4a68cd9502992896f6698ac2930b2f,10.0.0.2:443
+/d5c1076ec326bbbf73e06d110ddec314bab4901e,10.0.0.6:443
+/12bb31b94377990b52936138e755d30e1df5c4ad,10.0.0.9:443
+/e4e3d4a7766b7ef0038e05c72d7c60c853902d78,10.0.0.6:443
+/f1ace48a0bd8b225c5b05a4f310ad6146caab520,10.0.0.4:443
+/d6f4e19fb0dd901454337ea0a62a671f7e731b1f,10.0.0.8:443
+/e7e149ae5cc3b8d3432a74d2a5eff884304f149a,10.0.0.8:443
+/55f9309e65ad34333635e2392170a2d9e8e80f62,10.0.0.4:443
+/90cc256a42fe5c65d3b1c261b6713aac2d668405,10.0.0.1:443
+/b9530da73b2c2287f52955290ec2dbc0e2cd197d,10.0.0.3:443
+/45a8ce0efc2197c63f1b0feddd1d0ea3fb62cb62,10.0.0.3:443
+/af5eb18f6287ead6b0d8d9d4f740916eef27b921,10.0.0.9:443
+/7d4c22a4d647cfc95bc563ce3f0d56217623ea40,10.0.0.8:443
+/6f6d1b8ccb3515ea7a4dfbba821b7e24f0af890e,10.0.0.8:443
+/448153aa0816ea4c11fd433e4011279a9e911319,10.0.0.9:443
+/e1db3b77b5891866a1bb0f136e9a3b6f1a8fd7ac,10.0.0.4:443
+/8e5ddebd1bc756119aaa55d408583bf07c6947f4,10.0.0.1:443
+/cb7c13c7fd7c12a0226dca64d01f154380b26ad5,10.0.0.1:443
+/5b5987f50249480e48251ab6f848580d4dc69372,10.0.0.6:443
+/a81f2d7b7e3640837acc6d0532aa52974371215d,10.0.0.6:443
+/4fb00e1ae798e403dee221592d1b63d8a23ec7ee,10.0.0.4:443
+/06ecb7c80ee19fc3dcdde75659cbf0fc1d03d5f7,10.0.0.1:443
+/4c3644f13f8b64a3919d4c8a53387f102f8efbf1,10.0.0.1:443
+/82d78d0be6134b4da73a81a442ce4c5277d23d8c,10.0.0.3:443
+/968765803dd3e6461c0ff78f95342c0c113e4991,10.0.0.5:443
+/b49bd6e5e66970eb7378c37dde945cf542601636,10.0.0.6:443
+/7789c5109794ebfb0fe72e3bdc2fc29baa58e537,10.0.0.8:443
+/29857840ad23d55c82c93cbf7971b416e118985b,10.0.0.7:443
+/9aab0c35922eadd6e1cf5512af5272b20ff87638,10.0.0.6:443
+/094cd8c29e8621928b163ba64c52752f9dfe5ce2,10.0.0.5:443
+/f56b7ae1b06eff812326334a68cee675f3bf390b,10.0.0.5:443
+/a5a029d6c0f758aab2eb8fb56594a0e2e118a8a4,10.0.0.4:443
+/fe56c1fc75e419f220ea6bf06af6f5321c895f6d,10.0.0.6:443
+/0d5b4bab87051120251a86b92db52e12582ffdd1,10.0.0.1:443
+/34f43611722818ef7baa47b8d07067658765aab7,10.0.0.4:443
+/e70ae66289144a1adae07ea70f507767d57e08d2,10.0.0.9:443
+/3f10a40788eb0581f47d1f7ba7c57cdd6beef74f,10.0.0.5:443
+/2d58723eabb6c5adfb1fa239e34c30da32f117a3,10.0.0.6:443
+/efc167a6366a437ba465c1fc71ec28341082ce94,10.0.0.3:443
+/0bfb80585b1a0fa49c2c863ab39dbe06599681b0,10.0.0.5:443
+/57febded047c2a5455d7662d4967ac0666fb58bf,10.0.0.8:443
+/f06e91822c1eb12e9c560453b2947d45c961ebd5,10.0.0.5:443
+/2292f8823bd4364769bfdd6ef106c6186082a345,10.0.0.1:443
+/dd37a086d19829dfff28195b3b63a197193f154c,10.0.0.1:443
+/74f336292ef253b07abdce03a0f0d47ac6482062,10.0.0.8:443
+/22eb9772d6538887bfc57bad65ef8a72d7ede1d6,10.0.0.7:443
+/a1df865f8909812c4a83e29efe67460c6756bc17,10.0.0.5:443
+/82f35bed949dc360e05c3a60f8d30970f9f30fcd,10.0.0.7:443
+/e6d5dc89bb8d677be8c2dc6cc1f164a254e4436d,10.0.0.3:443
+/dc64f2b2db6cbfb3129d83d0a5ca4d18d45ac35b,10.0.0.9:443
+/d7b8e1a5f574730502d6328885ffbe76a93726cb,10.0.0.5:443
+/e98e4eec7b294b9be385e3f87f5a5a86c4b202fd,10.0.0.7:443
+/7c78c7e886c0a735c2043ceffd442e7a3df6de18,10.0.0.7:443
+/53fcdac505c2e9d61d3df43336fbed32d4d52274,10.0.0.1:443
+/e4e48c52272aeb71e75533c0447168a17dd0a8ac,10.0.0.2:443
+/ea3361f8b5124bc65fe4273df0c03177066e8f1a,10.0.0.1:443
+/7db8dcb86856a592128f019df1696d1bd8f0729f,10.0.0.9:443
+/b8b33e4984ab558303db0b2481d8b6ab52bbeba6,10.0.0.1:443
+/a61755fc46e10c87e457c3fe06a46ca261624b33,10.0.0.1:443
+/74e9e54ea37b089a100561e9c89852a47d738657,10.0.0.1:443
+/7daddba4e4b97331ab3e47976295aa522c7622bf,10.0.0.6:443
+/9a4a68b8ccea854a22b1064b2b647270161df2b3,10.0.0.2:443
+/5b42f6b8ac65a644c8203a0e1f44d452653d24c4,10.0.0.3:443
+/2ae53235a7dd1ee0ae2e0187969e33daae6466e1,10.0.0.5:443
+/cedffeffa4fedb95411a03e7abd3e7771982e5b8,10.0.0.6:443
+/56a5eb3af8c0de47c03da5850dd5a41bca391bf4,10.0.0.9:443
+/8770f96efc90e2c044835618c1fbc21f784148fb,10.0.0.4:443
+/77b4bb2780a93a397dc469fd804b05a3fe6443a3,10.0.0.3:443
+/666b5de9ea6b7768dc6638f1426b5292465de061,10.0.0.1:443
+/793233793175f196f861bbd781cffedc1dfe1649,10.0.0.8:443
+/6e6c4ca7b99531e8ed151f023d3f54dbc1aa72b9,10.0.0.1:443
+/a144b632b672fed3d6d3cdc98d4b664993ae2c3d,10.0.0.7:443
+/074d306725d881f0acd57ed9f08ab85976adef84,10.0.0.3:443
+/c9c04880224d2977fa60a0eef06d1c795fe6a423,10.0.0.9:443
+/d20ffc4abee9257d5dc1fca42c53f6db63a2a664,10.0.0.6:443
+/316bdd0350db3c95c148e66a291f23d382251f92,10.0.0.3:443
+/a91ec91455f9c64ff666f271a7697c41b6777c40,10.0.0.5:443
+/ebaa896e268efc129dfb87e51c06b69c0d3d10b5,10.0.0.9:443
+/baa5d67516c1a6346ab05f10821c7ad25d297cdf,10.0.0.7:443
+/e8a049830e420d8502891a00eb55982ba0e9fd8a,10.0.0.2:443
+/2885644f1735ca86b002e623d2ea6824977b3386,10.0.0.7:443
+/85a0370ec94aca8895951954ca810d3b06b1f7af,10.0.0.4:443
+/4eda15a4a13e529b2aea970a1b3591e537b8c906,10.0.0.3:443
+/bfa3f4f77e6f65a87448d260eb7647b6e02cc8ca,10.0.0.5:443
+/599ca6d3012a3aa53854fb5e0d25c303d622e8d3,10.0.0.6:443
+/2332508d304442b6a6b4cebe557be963e31aa07b,10.0.0.3:443
+/0c32f97e9ca195ab9eba167702fb7af9f9809bc2,10.0.0.6:443
+/0c4ad0a80bdb18e6a82233a8ebf2103e72cda899,10.0.0.1:443
+/56e0aaba9e15a92b4ef584d3e8ebe091c52e2f60,10.0.0.4:443
+/0adf617e084382c2a23249aa985cd8b8acdaa65b,10.0.0.3:443
+/ed18addfd26398806fca2a8a2fe14bbe090fe0e0,10.0.0.5:443
+/d1a2ba53f3b93e000e644d5b1ad8c6854ea9f65d,10.0.0.6:443
+/7107620d6a0be698aac43ffc25f86eae6f53a2e1,10.0.0.8:443
+/3e4ae6d93c0251c47b243273c3cfa6a8e75561f1,10.0.0.8:443
+/d4c0a3bd89b4dddf0a6ea0b0527290ea09eb5a9c,10.0.0.1:443
+/152e9ed59081b05a44434e96acb10841a6ac4913,10.0.0.9:443
+/37165697fc6ef78a2f77de34e332378708c645b8,10.0.0.6:443
+/a4e2739e0c203344e3243ecd1085ae55c3e80e7a,10.0.0.8:443
+/23795bea08d22a82aeb2fdde5cf561d439358287,10.0.0.8:443
+/dfec4908e467ca09908796e4adaa92aa9483b5c3,10.0.0.3:443
+/ee0b2b4442cf36ae3c29d01c815bfa6cfe48fdfc,10.0.0.1:443
+/cb78173624dc4cb41a7b0237d17f7af6a083ea18,10.0.0.2:443
+/d739f678a0da873018a2c748a92ee4719fce3a0f,10.0.0.4:443
+/2323b27ff2ca01083ac32f731fbcd4d100e93e19,10.0.0.4:443
+/d499e2ec08b34a0bf998c14c887b383265034c9f,10.0.0.9:443
+/143084dfd65a8bdcd57fb64651f96008b040087b,10.0.0.6:443
+/97eaf99e3029d498617ea5154d783a7eb5c70c48,10.0.0.4:443
+/33a3ea00c963b4f990846722d410b76a95b8de58,10.0.0.7:443
+/74102b50e78c7af16e679839dcbda2e0372b6007,10.0.0.7:443
+/98e74ce3d20c7897ba902ddb716d77ccc12d7184,10.0.0.5:443
+/04675a8dc4351a5aefbd2ca04b6fc110d396a968,10.0.0.6:443
+/fc9d0c65157c42a6e4faaaaeeed021e97eba2829,10.0.0.1:443
+/e79898b6d8400872a5e147b49e9a639756cbe950,10.0.0.4:443
+/383d327d7129f3b712ff73766f8ce42c74e53b15,10.0.0.3:443
+/210ecfe8a674dc8a5ce6e0ff2cecca5f78769a23,10.0.0.8:443
+/0ceddf293af83e1c0b20a2f951c249dae970dac7,10.0.0.1:443
+/35f0c2c9af248df96020a501f0cd01c35750cbc0,10.0.0.8:443
+/52bc55a205fa328543f03294d9ed5417820fa601,10.0.0.6:443
+/3e4431ffbb010af04dd776032e7ac6f59a3b104c,10.0.0.8:443
+/4d9b2f4f469f2b2b5f3962306f97e75859c8d936,10.0.0.8:443
+/56f073a5a58f509bd491f8884fb340a935f40308,10.0.0.4:443
+/3c2b58f0da1000a8a78a3277b7fb5b1cfcd849a6,10.0.0.8:443
+/928720a69173cbfedccbcfc04b198414b5164f00,10.0.0.6:443
+/d87b50fec3d063f2a71d17c82d042c2abdcb7017,10.0.0.1:443
+/3f56709086bde9189226f4c98d6debd284176644,10.0.0.2:443
+/cdb098b71941c131bdafe7123c569453e08875b4,10.0.0.4:443
+/75dc829b5562bf143582d8ebed2766892438fdf6,10.0.0.5:443
+/e92003125b6bf378ea6279b52c744bbfa947c7ff,10.0.0.9:443
+/43601fdc2b42ea10e6eddf5ad078d9959591b054,10.0.0.1:443
+/4de1baf0df9a5653c30ba33552d107c8050ba65a,10.0.0.4:443
+/d8d7b30cd8c473d9dfccf65626bdcaf093524fab,10.0.0.9:443
+/44486486ce00b0c97d44bdaa8e9ad0cd4cef2f24,10.0.0.4:443
+/2f2b76cd6ceb9d1942d5e9ef0f887e2447426de1,10.0.0.3:443
+/0f4b330a57a82f31e00455ef74555b31f5bed5a5,10.0.0.3:443
+/1ac2f42face0e1b71f40775e804816f562f5046b,10.0.0.4:443
+/09d09a595f2bf13257e07133ac78186f35555584,10.0.0.5:443
+/0110e2fe94b7def844f20606e2c8456d3502bccf,10.0.0.3:443
+/e3b4ef341806cc37ca73c853f7fb946e1f5f6e8e,10.0.0.7:443
+/38e28374b1a9f41bc73cdfce491eb2bb0bce6fbd,10.0.0.3:443
+/d1713989a361ca1eed0f5f68fee5c50f91854b5f,10.0.0.3:443
+/f23af6f472102edef6de9491f9a844070ba3029d,10.0.0.9:443
+/f196a713839baae0bc51f4b1436927d36f2ff7d3,10.0.0.1:443
+/7598e8238744d04076326a8e3597578f9ecc8c09,10.0.0.1:443
+/59a02561ca435d78ab8aa7422feabf8773dec410,10.0.0.7:443
+/ca62f7298625dc574326a50ad33a4538559fc47a,10.0.0.5:443
+/04bb8594fabb6dab24d9913b98cf38d0563f83b7,10.0.0.6:443
+/8841711058feec5187329165955a9c60407f83fc,10.0.0.4:443
+/4d884355dd150df67499ef203c01635a229ba6c7,10.0.0.2:443
+/071866a73e91187306c1e407f0115a4d4151aeb6,10.0.0.2:443
+/afd57a92e88c0328fb968edd941b4100c6c9fb61,10.0.0.5:443
+/531c345d706cd574388c37ad61ba205c406b1d59,10.0.0.3:443
+/4502d8a61fb1a981fab9999a469dbac6e25e7f05,10.0.0.1:443
+/e230fc4ffa3bc256581c8eadd173e1cbc73b0cfe,10.0.0.1:443
+/05f427fdba3ff5f8d3039d3630772f161b8c9f14,10.0.0.3:443
+/911e4045fe7a9e356c9a4a83edb7675844e71e1d,10.0.0.1:443
+/6e23a5865d2058af3619068245ead5e51618e0c7,10.0.0.4:443
+/d1a0e473ffe13801ea65171346ad99201c498078,10.0.0.3:443
+/815a0974398d76788a4b3da7d0cca31f126d7de4,10.0.0.9:443
+/4b5e04ef7002bbde1ab4076a838dec1de1d26f39,10.0.0.1:443
+/524cccc30582e8a63d8312af6635e22baae5cc6c,10.0.0.6:443
+/96b6e633b7128d91860de1ac281c3080fc3abafa,10.0.0.9:443
+/bd9d0ab3293f97f2d0723f68fd28f15bd536c156,10.0.0.8:443
+/47e8509e8d7eb07744a7bbb065e51a64af82fa8e,10.0.0.3:443
+/7186ce2f19770360dfb9ecd97b89e16efac316d1,10.0.0.9:443
+/eed6c4e6883b62cdc3a7b196d99273557b071dd2,10.0.0.2:443
+/b96d9c4be72a2b9492c2d7317b95e9e8126b5c22,10.0.0.3:443
+/548f0aba642aad540d75ba5179b4c4e0769d3f1c,10.0.0.9:443
+/26584bcf23d47c9d064c9f80f8e428b694aca25d,10.0.0.9:443
+/e2037c8f1d790b8c725d9b2935056043ecbd8e93,10.0.0.2:443
+/7eba0adbc91b2e122b190de42e4560a2157b112d,10.0.0.8:443
+/9146d10cd7ab98d06cd0f4b4197602778d6e4140,10.0.0.8:443
+/9fa77d555984524b0361fb3072036e91cc6ea3f3,10.0.0.8:443
+/52f48dffdc8736b0c0e71df9a3c0f80e88770725,10.0.0.3:443
+/2265098f5d88d6d99acdb58cdcc1259d928625cc,10.0.0.9:443
+/d6192927efab74c222d087ad8dc2e820dcb7f6ea,10.0.0.4:443
+/18d1d3a2d5ed8d726aef5302787d369b79781866,10.0.0.4:443
+/19c735d6358604129199dcd752ff41f4221fa57e,10.0.0.5:443
+/b351359d0d09616a3fac0e66ae77e26357781753,10.0.0.6:443
+/6dd6111dd3ca9ad06569393e50484d3347035fa0,10.0.0.6:443
+/93e3738859d55cbde6df33ff6cb633a9f80dc0fa,10.0.0.9:443
+/eedde9fe113eb083a5d3c2508057360ddc18686b,10.0.0.7:443
+/62a3e2d15c1c66eb816f3dc13b5827984b9f699b,10.0.0.9:443
+/f1b4e2ea07bb5ed2f47433b75d1f7c8ef5bbf7d8,10.0.0.9:443
+/fa62a18b60e7385df8024532e7aeef87cc1df239,10.0.0.4:443
+/7d1aa3efc0114d39a9f010b900e1db11151e639d,10.0.0.6:443
+/f0468f9ae142e357977988238dd0688c49773aa0,10.0.0.4:443
+/d8b5c9789b2aab6444a2ef1d8cef7ae774458ab8,10.0.0.4:443
+/0a85a262365cc25072bfafe6136a7ba369566112,10.0.0.6:443
+/4dded059c42653a7c1beaa541e63645bf551ad08,10.0.0.2:443
+/49bd739af1ec870702c3847e967e8c6b435c5329,10.0.0.2:443
+/8d95d2e2928f6c92b660ec1c1fa7df8ff813aec6,10.0.0.4:443
+/93bf75656856b0a55da0773071dc39089dad6c98,10.0.0.3:443
+/e3390ff69032d41cc118b525049af3a5b802fae7,10.0.0.2:443
+/3150a053fd0dbbb2d248eebe951137ca8078f1d2,10.0.0.2:443
+/3f9d225fb79822a7b27f99d8d201ca1a45bb2ab6,10.0.0.2:443
+/452402b171258fcd3a5b107c1c939518102d2470,10.0.0.4:443
+/08317e0decede1f945dc9e1fe173bb4f6fb8cfd6,10.0.0.3:443
+/2cb847f4fbc26879a7b38289fb9add3bdc92a61b,10.0.0.4:443
+/42ba7f638d09315bd314f1ecb6cbaba154074a68,10.0.0.5:443
+/c0370eebe06344737bd403540f6adb13609b884f,10.0.0.8:443
+/9c71526d82a2a81ac13581c5f93125202f95aff2,10.0.0.3:443
+/e334fd8fafc2cb8809436c3e95e285d8c6079a94,10.0.0.7:443
+/c396727f862d04377b9b67299231d1d64d3d208a,10.0.0.3:443
+/6e51035a8d1f3bdd7f1732fd749ef13732a95944,10.0.0.8:443
+/785266cb2e5abbf8e8d68ed6944c44bc8784e83d,10.0.0.7:443
+/212094a923c2cc9abba620361a83ed32ffc89562,10.0.0.4:443
+/139a4d3ff8c15c8bbe453dc8b51a4369a9761129,10.0.0.8:443
+/990a8cbd6640ba4c5002b6e139b1ddc0784f687d,10.0.0.9:443
+/a6fb42bfd3197c44719ed46faf9d90cb06548ad8,10.0.0.7:443
+/000c6423f358a2c3d3f495b13d62c0d2c39f50bf,10.0.0.1:443
+/1cec05fac01fdaacba7ce488edd944661542c006,10.0.0.3:443
+/271f90733f7434e025ebc1f28267e53433857e1a,10.0.0.7:443
+/39e38084ed794b098342c8e73c50eb6e8a473451,10.0.0.3:443
+/391aed0b4c3552fe6045ee9e9fa5b1d749dad8f8,10.0.0.5:443
+/6f08ffaed414be3b69721e7f6d32cdbf708af3b3,10.0.0.9:443
+/e70ea65e0acabc146426f773ee43d27693b291cb,10.0.0.3:443
+/b4e2cf556861071282564ee2f08e188fac4c5253,10.0.0.6:443
+/6e68bc22256a8e097ae14c5309b968eac3ff115b,10.0.0.9:443
+/47960ff89fcae7481243ffa5164fd694546f238a,10.0.0.3:443
+/f574bef3f84ad106c19f59e9e9e02b531545144b,10.0.0.2:443
+/4c3e44af33a9121771dfc8ec0f9315ac44133350,10.0.0.9:443
+/b15cfc1da87f56a87bd209364583cb5ab32236dc,10.0.0.4:443
+/40fa370749b2451bea54a014f1424acf8f26689f,10.0.0.5:443
+/2b427b399d5020c4422e0795378c785ddb7294c2,10.0.0.1:443
+/bc6adfe886d10fe6eafb996229582b4bfc8d222a,10.0.0.8:443
+/f7b4e0538be13ab1bf2d07e6811a503a9017d9f3,10.0.0.2:443
+/5e89704df5e29e7cf5d66780e8c21ee43976a437,10.0.0.4:443
+/7b83fa2b9257a4c2d3130dca607ec04fb042a867,10.0.0.6:443
+/a3b86bc98a2d6f3ffa6572d699127b0bddedfed8,10.0.0.8:443
+/e4d0162d0642d1b8c48d405df85e19a38f0feeb3,10.0.0.7:443
+/4d485cce05cbc8a437c1c0935d481a7bea42fca5,10.0.0.2:443
+/845b67ac4a0134e07b0a024cc4e23712b6e6aa9b,10.0.0.2:443
+/b79bb4986238b94afdd2cb060f5552eef7ff54e6,10.0.0.3:443
+/af07fafd8a759a1cf5a609d578639be03caea26d,10.0.0.2:443
+/81af00d61c1ef5b0613ad4beb2dd25f89efc6182,10.0.0.8:443
+/593136c41899f34390c6d37d16edbbb9cfff7abf,10.0.0.7:443
+/cf81d9fb40a3fc64d11770126f3a699d70eb0feb,10.0.0.7:443
+/63c546d9b325c23c3861555b1e605cc203079992,10.0.0.7:443
+/4ca3fa4d44be023ccfa77e4f77f68fa0b8ea7710,10.0.0.5:443
+/e701444e1b1d9f079e9c879d8f999d88b56d68e4,10.0.0.5:443
+/f6c473391fa230f190cdda902f793977ce7de8ad,10.0.0.4:443
+/7bc73bd36bbd732b25e146e2f1b01003eb159775,10.0.0.6:443
+/5f287e6957a09c1be550752505a5c1420ec8d3bc,10.0.0.1:443
+/bebd964d7ca6eddee7de35715ebd96afa29fc8e2,10.0.0.2:443
+/db7a5038c8f2d930653563a2e523683c0a93bc88,10.0.0.1:443
+/47a642c6b0895911ca70f994f506c415505d75e1,10.0.0.9:443
+/8c5554e66fa04d50fb84d5f49ace6de0852a34da,10.0.0.6:443
+/89923f03ca432e5969fd0cdf5c15bb70b98efe2c,10.0.0.3:443
+/7a0aa569021d8b2b2ce9bfcb07310c1ebfad5151,10.0.0.1:443
+/0937e417478b8173a2bb86dc7b8b9454e059de4d,10.0.0.3:443
+/188c99ab8d7267ee33a9a5acc8de76bd58898b45,10.0.0.2:443
+/c4a8f4fb2483266c7166285df63f3640fa2319ae,10.0.0.8:443
+/4b0d34f033113d93ecf921c6a0feb0b2d45fb126,10.0.0.9:443
+/fb42de2cd7c51cacd89d7575bccd67f7ec25e451,10.0.0.4:443
+/028a4c7b547864a379e75c95c587ce64202181dc,10.0.0.8:443
+/cc5a526f4da916ea0a13b85e0c6e98b3d7437cc2,10.0.0.3:443
+/9113f453c2c434907b4ff773fe5b86f21e382416,10.0.0.1:443
+/830245306057d4c72845188ee1bcd3faec480fa2,10.0.0.1:443
+/81d4b64d141924bb939f5379c79f68c8f73f6861,10.0.0.5:443
+/be650948e3ec4fb93c66085f4ccf5b03ab52da7d,10.0.0.3:443
+/dbf7fb2f6d1c71680d904a7982c255d38d9cb66d,10.0.0.6:443
+/df2fd0964b001d47e7d7d8f704997f8b2c188e2b,10.0.0.3:443
+/52599e6c628d3713b5a86776e7bf4e8eba08096b,10.0.0.8:443
+/9a8dfa9f83cddf2f78d3dfaf2977d373250d08bc,10.0.0.6:443
+/f6fff2fc64e81812c1fd6f44b17c0fca8f4d9b21,10.0.0.7:443
+/c74b67ef81c0f0159ebf55bdb7cec7edbb49ef01,10.0.0.7:443
+/1d489c78f83a538058f88a86d5d3b784a4c8c15b,10.0.0.3:443
+/c19e2d12a05580a32ed36959def7a94542f3e4b2,10.0.0.2:443
+/0ee2827f11b4ec40f5b9461cafbafc67c9bb19a4,10.0.0.6:443
+/6fb7e55aa135073aafdaee252c0d41711f0012cf,10.0.0.2:443
+/c31f4f1035ecf919c2a8ad9aaba8f34787b6dbfc,10.0.0.5:443
+/da600775aba95b86e525802936ee1080854c9171,10.0.0.7:443
+/713544fa205d177ae8892dcf355b3d9099d36346,10.0.0.9:443
+/7c838304cffcd5141ea13dc98ebe74d3c9fb0b68,10.0.0.5:443
+/1dfa23ab97268feb6b3fd019ff226fbcd628995c,10.0.0.2:443
+/525a23553d91d72be5ae26127029e9e3bdfdb6d7,10.0.0.9:443
+/963f18f8446ec2ab1921e0579c7af87477ef3592,10.0.0.3:443
+/64b104d6efe390c5e8a008312e16772cc76632e8,10.0.0.2:443
+/de3125db331f2c903e96f273a649f782abde3250,10.0.0.7:443
+/fb2452ca4688e9fa8177919d72032717ac19d692,10.0.0.4:443
+/76e8bbc123c7346c3398619f12d9888fee50811e,10.0.0.8:443
+/d6f9d8096fe75dd35f317b7d1ce0bc02306f6121,10.0.0.3:443
+/1e543c13b6af55fc60e9ba216790bccda9c2c3d1,10.0.0.2:443
+/5f5831dbaeba200adb52eefeb26d792cf996a01f,10.0.0.3:443
+/60ac99dd1fe31198399c6b447438e8ac62a35036,10.0.0.4:443
+/579077bb8a893f47c1b1eca7d8cd2d62c8a3b774,10.0.0.2:443
+/86590bffd69757efb277e2b6db69385bbb6ebba3,10.0.0.7:443
+/f829ea6c46b59cde7ba3c6745b58c3ea170bc73b,10.0.0.3:443
+/27f54b7138336175705207561c6a0a123049ab66,10.0.0.7:443
+/fab8ba44a38c657d3b8f9066daac9f3222e3fd50,10.0.0.3:443
+/03540d372c8e6621cf57ecb910cf872164f9c53a,10.0.0.9:443
+/be320aecabb73286f782df249b53ef4f7c816b72,10.0.0.1:443
+/7e383ecf09c026dec3eb9c77ca35274f209748a3,10.0.0.2:443
+/749dd7577081e9d47a3bf9ef091b6e5b8daa5786,10.0.0.3:443
+/9507f34faa73988fb0d35f65141b2e1b0f407cd7,10.0.0.3:443
+/a2188b80856ef974da6eac0238a35afef2e1c30c,10.0.0.6:443
+/1ca972ed159b7e8c838752ce60186262a923d057,10.0.0.4:443
+/57e7abe6d05fe0443800929dcf46315bc5135519,10.0.0.4:443
+/075a1e1426a5d210fd5501249809b1e20c793c92,10.0.0.2:443
+/36c50cfcf56f7e15f91844b9f3201efa4cc26fc8,10.0.0.5:443
+/f824965edace119738da671b1e3cba0e44be224d,10.0.0.5:443
+/ba49bc86400cd3970ea82550b493ac21a5bf750c,10.0.0.6:443
+/2dbc4c595e56af88a175811e715d908d04223c2b,10.0.0.1:443
+/e322f439382552e76fb5672448c2fc6beb56e32f,10.0.0.8:443
+/e86b62c9f240c97f1503be26f97fbd412b846e2d,10.0.0.3:443
+/e15c58a856824298802fed4151234e2a4812697a,10.0.0.7:443
+/e7b5cbc5701beadb3c8dc04361cdd1de8f8b0d1d,10.0.0.3:443
+/bf317994d21c8731f4afdebb4d77e8eb997a962b,10.0.0.5:443
+/cabb2f8ffcd78c654c2eb0bbecd32a4a5523c165,10.0.0.8:443
+/17e54d3b00f5b989798846b7729789343df86d56,10.0.0.2:443
+/334fcdca67212b01973f946729a2cb569adec510,10.0.0.3:443
+/a5d301755197c85985ee48ec53b4c3a1b6bfd9fe,10.0.0.1:443
+/f2b98e19ef44d81d16fce5e9e3b51c3be2a8c713,10.0.0.2:443
+/6a69c385697c7ed6b85ced626d993b02216c2186,10.0.0.6:443
+/7d269fcf2722875d9d75eb2e3a7e0fae6ae69a98,10.0.0.5:443
+/126e39e079fa7f2b254146466e9ab79dc4347be6,10.0.0.6:443
+/8a4aa1d8a6d6a2938ecf7a42814723e282a90af7,10.0.0.1:443
+/b9d9fabb46dbe2db5f5e0164c98002114c96006e,10.0.0.2:443
+/d50477758d2f8e99392ae9d51ecef57484c97c5c,10.0.0.1:443
+/09ac262b5b37a5b19fa989e5ac75722fdb8e17fa,10.0.0.1:443
+/e1a322b3fc40fbc296f9ed8dc86d6e91c6dc8edb,10.0.0.7:443
+/1c08ea2a0c42f17d99acbcb2b0ffd33ba1fb34be,10.0.0.8:443
+/6aeefd631b7ddc01936b7fc11f1e8aa5a892bec0,10.0.0.4:443
+/f579e4e7a050029dd9f21a38104c1f1b65e201e5,10.0.0.3:443
+/9764ed5aff70cac5a5859415251c0b78dfd37909,10.0.0.7:443
+/42d5cfb85dba89806546ac382f61fd909cdd40e9,10.0.0.2:443
+/4cf6e01e948d9cd30032b5ce77d2d8b2daaf21c8,10.0.0.2:443
+/e0367d6d11e81aaed084aceac24b327abf053c0f,10.0.0.2:443
+/28b88a8f6ce2d2b9bd5867f89555f2e43dc96c96,10.0.0.8:443
+/56b207c041ede2daa065d56b03173663eb6a1f2b,10.0.0.9:443
+/6aa844c78eb0fb44bd506a920360377163eb7150,10.0.0.9:443
+/327dabc969eb616dc10e4ba33f45d0cc97bf79d9,10.0.0.4:443
+/7352ac0a60c2f2bedb0d80b0249db5aa59e0c876,10.0.0.4:443
+/70a2d83045053301afcd56deb30bf9095a9ad9d6,10.0.0.6:443
+/cbd05a3e43fb4b1aa98283c8d460571c43144391,10.0.0.9:443
+/0c903f04b7f6d4a59a97c4ae212a41ad579e5a1f,10.0.0.1:443
+/3dc7749f4a1f30ab1da8b4e2722d3228b0e8b33d,10.0.0.7:443
+/b502f7505431f9b895c9fe04de74250f27f96f7f,10.0.0.7:443
+/14aa1d4b3ddf14d7f5cba9de1f08213a8a104131,10.0.0.9:443
+/cce74a90b51c414ffbb28ad26794bf589c1eaf82,10.0.0.2:443
+/a86f00b80c039be1e4fad0b5508bd1710ba08ae1,10.0.0.4:443
+/055b3843846da3e34606dc209c9b30192e6119da,10.0.0.4:443
+/f05c831872443fb183c6c19d1a9dbe45315f0205,10.0.0.4:443
+/d974f0525fca48f3fae6d6cbd0b394e4324ad422,10.0.0.3:443
+/00ef799f7c152055a4163c41bb9bcd37fa375f77,10.0.0.8:443
+/7d876337b6f86b9873ccc49f7efaae91d180a06d,10.0.0.4:443
+/93e9efe1dba728a9a51d68024eddf764903cac1f,10.0.0.3:443
+/891d1f6116aec61df9dce652743ae159861e9160,10.0.0.5:443
+/eec92486c171c84f0dcf3db001ce9b32615166f3,10.0.0.2:443
+/363f23c9bea6cac01f85f7ec7142110363110c83,10.0.0.7:443
+/51c699024eca637817d2bdad512b9c1d19fafec4,10.0.0.6:443
+/b7aaa2cd36505f55bb047799649acadc5e20e499,10.0.0.8:443
+/b17b2a0be4fa445a0f762a92dee8b8d83e992eae,10.0.0.8:443
+/e4c7719fd87bd86bf5c818a7aa38af4d50691d51,10.0.0.6:443
+/edf7c0e6f7c1bbdc7bc67912607a32ff5ea786fc,10.0.0.7:443
+/62d1fb98dbf4825ae9db6f919233f32391ce1e63,10.0.0.8:443
+/e0214b5cf9fb6464dfd37a84fd41a759e571a531,10.0.0.7:443
+/bf7e606b9858081dd5f7f2346f70e314238809e3,10.0.0.9:443
+/f4907d05ffb94d07ea2a1eb8dc187268cd386f0e,10.0.0.2:443
+/cdfc8d53ae78926694e5d1ebe872d30f7e57b324,10.0.0.5:443
+/0de8c668d5445e80ca5d0ece0e653fc664b494e8,10.0.0.3:443
+/fafc8ecbe6fc726999a249b9a2bfcb52371dec5b,10.0.0.2:443
+/ec395c49cff03d52796f59fabdabd045eac000c2,10.0.0.3:443
+/0bfbcb5addb0f60e28504de36a10abb80d253011,10.0.0.3:443
+/6bfbff0669887fbad3bc871771c62f9c5d723740,10.0.0.3:443
+/d0b0e5ce39dbfd7a3b46542c1088e0231295be11,10.0.0.9:443
+/79dc5f7b75fb82ed6dc0be947434d924ade41bc0,10.0.0.6:443
+/f729ac665760539349f1c808bee81b70d58537d2,10.0.0.8:443
+/fc97f5ede259d60ba9f28888ac3b2155b5490df6,10.0.0.1:443
+/0c5cb1e0dfed034af7c893de52841686a762f6aa,10.0.0.2:443
+/accc74f350aa74842630517d6abfed728d5da084,10.0.0.8:443
+/1c2e760244036ee1f0539288d446830a0fa38457,10.0.0.7:443
+/0f60c86359a38087105591e609f90b962b02b74d,10.0.0.4:443
+/9e26cafc4562d086fadce9cdf56c049e9cfd93b8,10.0.0.5:443
+/bce221dd780f255f84e159f1097ada3461ff5ab6,10.0.0.2:443
+/c918871122a23989009073c879ff5c6d3add13c9,10.0.0.2:443
+/50735adf2192b44d672b99cacf66e650582f9088,10.0.0.1:443
+/fb763e843db495284a217b2ec5027d7698bd49ca,10.0.0.1:443
+/ae068dab9d1784aa098085b9f62e168c79bb75cc,10.0.0.9:443
+/6b989c5c0af97c2acd640cb2f05dc4b4fe7c9323,10.0.0.4:443
+/fd81185d074101b22059f022b174d058b8d84a6e,10.0.0.8:443
+/20277b4366206f795ed97f4631baa755636ddc1e,10.0.0.6:443
+/c9199750bcb6c7b916958bee64f562547d6b1209,10.0.0.3:443
+/9ea2e79813eb3a6d7b710affe1b15f7da29c1800,10.0.0.2:443
+/2de1269fec587f989b911e4780eb056c310d2f38,10.0.0.3:443
+/6869b9dc65fbfb56fbe828c0ac57da2bc7c0f460,10.0.0.6:443
+/aab69be5e6c02f972e8a5e0e4c9716b84d91e667,10.0.0.6:443
+/f8bb7d358e7c5e58b5d68a29a2d1ca4cb1a4af61,10.0.0.6:443
+/441f8eab7ac90bb4022d35aca197b5765ecb7dbd,10.0.0.6:443
+/36bad018c5b41a8f3731267f364cbe74cee32a81,10.0.0.4:443
+/8d31a4ecc03b0d8680ccef099ed528f07a5e8aa0,10.0.0.8:443
+/2e8ee9b09986f2e9435dc2b3b05d9353a8edfd3b,10.0.0.2:443
+/950dedb075f2e3b2bc485659e0158fa0c26511ee,10.0.0.7:443
+/2bff636db028f497c8d26cce0c138a5049e69db7,10.0.0.4:443
+/33353d31c296876c1267ae7793d0c03caea2a387,10.0.0.6:443
+/bf5e822a05f799f153c648ccad9987396c9350cd,10.0.0.8:443
+/92a14cc304c5fce82d3e4999fb1a819c92cfe2fb,10.0.0.9:443
+/06c1a1908f37b4cdacd7098b7304ced839f8412b,10.0.0.3:443
+/de42c498d10e019fad348d4e2e512afd8981a7b9,10.0.0.3:443
+/42fda236e32757240063ecb99681a30121629ab3,10.0.0.8:443
+/b93d832939ca288351cb707d8332ff7aade5c6d0,10.0.0.1:443
+/2fac7e24ec806b0b5b9f7bf99587e50357d9db04,10.0.0.9:443
+/8750e04a953b8d6a5922ccd6172d59052671207a,10.0.0.5:443
+/c5128cc73e48a0270a27e6e2b89f563dd756f987,10.0.0.6:443
+/4f798881963c3638cd89168511eccdc8f6ecc62f,10.0.0.9:443
+/330116fb139c1313bc78bf314a211d98dad8093e,10.0.0.1:443
+/d2ff19c61e6be34733295d7c2f81b18c81a687bb,10.0.0.5:443
+/5ff80f927eb571aa8cc006e0b7c237d8f571ffce,10.0.0.6:443
+/b2ec40a643fd05a9f0d52b180893c9837a824060,10.0.0.8:443
+/9445a32fc9ea94e27622826699123272ca5bb38a,10.0.0.8:443
+/7b12433171a2a61d85b95d8ffd9ddd7e8ba1f0d2,10.0.0.5:443
+/8f1cdae5a092253771e8d07f66ef45d6cc540c5e,10.0.0.6:443
+/7b70d96ff0b14c53aaf134e16cb0ac8394b9ec93,10.0.0.7:443
+/1c91cb4395964c049653b422be092ecc6957ccb1,10.0.0.3:443
+/1680013d16baaadb8cffb6838dcaacfa9ddf815b,10.0.0.5:443
+/a6cd614c3f4c92608f176ecbbd24d4d3e980c18e,10.0.0.5:443
+/5f1ad23d97b5effe56b07770e1b1e3eb9302ce32,10.0.0.9:443
+/4014ea7ccfafddaa137d536e55a4fcd04f4acd23,10.0.0.7:443
+/4fe5c55f2b57b57de6773d70b788f2950f98aedb,10.0.0.4:443
+/a5e42b24f4d2b631529dc5e693f0f44bec25d917,10.0.0.4:443
+/605b3c16dde75dde0ed96aa420121d491043b868,10.0.0.5:443
+/a44dfbc27a6071c7fc05ec6c9bcf08a80059d9fa,10.0.0.1:443
+/376db7678f97b6614c81a967ac480d2af1ec0494,10.0.0.9:443
+/7ab905b17ac0f3dabc9e73654f7108a60382b4bc,10.0.0.9:443
+/7e15729b3688eac3a344b412fb66660812e51f5a,10.0.0.9:443
+/fbe2e0d0d220635295397028926abcab95eae6f3,10.0.0.9:443
+/68c054186128694496e7e34307333f0ee0fcdd83,10.0.0.5:443
+/1539ed321544c684ffec1d533551c8ca3b814bed,10.0.0.2:443
+/52239e8766c814c60a588320ff4e55dc9fed5345,10.0.0.9:443
+/7dbfc596b9cf0c5fada4c6521d67d7e8d42f6fea,10.0.0.2:443
+/d04621fb5f44305c3532899899c6f53b6afd5a0e,10.0.0.9:443
+/581c7d2014ef9aa2a30e54ac748164ba66a534d1,10.0.0.8:443
+/d6c7154f9d5d3dadd5e890c8f7a1b178c4992eea,10.0.0.2:443
+/bbf232fd8d3a7f781b378f160e3fb629ce09ad59,10.0.0.5:443
+/5290410ff6812f651bac427d10fae8ec7a40af1f,10.0.0.9:443
+/41cfbbdf14643164ccb783e93eb123f23f2f32bc,10.0.0.8:443
+/9259ff15fbb6d028166e31434d4e2dc335c390c1,10.0.0.2:443
+/20258376b3bf0e3221118d0b5af2c4b8fa99fef6,10.0.0.6:443
+/7e34ebb4b42eafe0d92fb748745416bdcdb67bb6,10.0.0.2:443
+/2fe398814da4f25bf0f9f6982b43d955b93c9c4b,10.0.0.1:443
+/6bcc489d911d7e972b2decd5827d4eb628111a84,10.0.0.4:443
+/87c70ef625901e6ba2c9dd6951efa9964bebe528,10.0.0.1:443
+/3b79cc56f47bc4487a12e940caff6f4c294b633d,10.0.0.1:443
+/bc5e3f9cfd2ca035467321a7280dd2bf1250259c,10.0.0.4:443
+/260555bb77d941f8761b6a8b81267b6884da79d0,10.0.0.5:443
+/e77e4992d06c6b662602f32bf8a52b1567eb2f48,10.0.0.6:443
+/0923bd0601bf7c074d173268cbf94cff7b39045b,10.0.0.6:443
+/d7d8f74a97ab8b8f0df34c447e2ba2bf19a8a142,10.0.0.2:443
+/1151eda28cedf93b701b4ae0f47b35c488d493af,10.0.0.3:443
+/e4b07856919718e9c7cd00154fbb12c343bf5b55,10.0.0.6:443
+/d5751616b55b115bb0260fee64eef350e83cf080,10.0.0.1:443
+/83bcc3183e99dcba798f17ac6340722b1431ed0d,10.0.0.5:443
+/2e84b809ca1744c2abfe7d8ec18dc80adbddc0bc,10.0.0.2:443
+/782631660d3fd29586a00922d9e1885c30615bbf,10.0.0.2:443
+/0b43b69669114bc2ef38ad7e03fae7a82ac22f29,10.0.0.5:443
+/59bb4679fc26333daec10a9a06ebe185ab252628,10.0.0.4:443
+/26b7bd3eae9d48dae1677893dc7efb7d7d9386ac,10.0.0.6:443
+/1842eded9ad6f8e951f4e788bbedd8ad9b5d2289,10.0.0.8:443
+/c0b818cdd2005b05932a6369a80d47993cf1982b,10.0.0.9:443
+/6f3b0ed59323086c2557c6ba6aeb433bd82509bb,10.0.0.1:443
+/bbe9eabb406b05b3b13ce634caf88123d095de39,10.0.0.3:443
+/fad30adc6c95657b9be1a490b338798fa08504c4,10.0.0.3:443
+/56a66dd5081af7ed9d9307374606245a751cceb7,10.0.0.4:443
+/356beada6689aaba95fafc526101a982acb007ae,10.0.0.9:443
+/c9917bb9de0eea13e66c71c88c35a03f3567bae2,10.0.0.1:443
+/495d1913174caaaae68eda040e329cf9ab6b807c,10.0.0.2:443
+/f89a11728d36429756ea52ed934a853ae2cf62a5,10.0.0.2:443
+/3263ba8199377065aafe566132716c2bf4fa300d,10.0.0.9:443
+/cf44e7fe43a615a8b58cf5c3b7486e95acf95904,10.0.0.5:443
+/2a055e911545b3eb8ca31202c16a916a061eb35c,10.0.0.7:443
+/120600f104f1305c96642a7382c7074386dc9f08,10.0.0.3:443
+/05690a98a3b475aed24b300bd1d8303c5f0ed93c,10.0.0.8:443
+/648371cafaf32c90a7c48ec2c6d57f84d4f81346,10.0.0.1:443
+/c346dd5aae927ff513fe5a8ece05ec7c2d5674d1,10.0.0.9:443
+/531b748b3a7ba01687e3eb6bff2df8951daaf1f4,10.0.0.5:443
+/c0935bb5ad0fad0b3f9ff4b924c01971116eac7a,10.0.0.7:443
+/2bf19d2be50af6207c977fa502caa8a6dd6722da,10.0.0.8:443
+/afc63845c577fb67edb01f2f4faa19415f36420d,10.0.0.2:443
+/efaa738ada05c233a8f0d57b3064d6ccd86b1a14,10.0.0.5:443
+/b1d708f56428e8c5e9ae6f8a2a492c75271b8a45,10.0.0.5:443
+/5b9abc512a9b5ee9083d0feec592002f5f31dad3,10.0.0.7:443
+/55289a755e9560c48aa164f357598a47603badbd,10.0.0.2:443
+/472ecb69a8ca3b590d1dd3153928d7bb09f43799,10.0.0.4:443
+/072d33b67d2137d961ff8ee5a5c0d024196e4c91,10.0.0.7:443
+/ca285c1755e98e6a8080cbe45f54e91f7d466c2a,10.0.0.2:443
+/13661ad2ef4c48f7e99825bce7efc3833d0bb1d4,10.0.0.3:443
+/b093d7e4f7588296fb1b02b38f20effb4c193571,10.0.0.1:443
+/dc82252b61b41f0760eb44be138b6bca8a22b804,10.0.0.9:443
+/1cddee843b564a0ef0acb8ca9d7dff0d7df3dcfd,10.0.0.2:443
+/560e227e16cb133b6fe840bf9ef03e8aee0dad66,10.0.0.8:443
+/55b1bd74ae0aea31731589550b7610ed00c1e616,10.0.0.9:443
+/87f0d8ea3eaa758b41763fd06d2fa52d2fcff7a7,10.0.0.7:443
+/e669bc52f256862c9ae2e0a7748ee3786a2abcf8,10.0.0.9:443
+/3fca3907c98117eb1920bd03179a35aee3cf1939,10.0.0.3:443
+/3d2582fcdf65814ef32ceb3ca30a38aba02020d2,10.0.0.7:443
+/2628fbf7ed1e6f3f2152a57e1b7c440895088534,10.0.0.6:443
+/37f57ab1100409e62e4ca9532dd245a2e84eab7a,10.0.0.8:443
+/1558c2abe0ba2f4d83172d32ee9489a5f2469174,10.0.0.2:443
+/8e2dc4336eb4fb16deebee7c3157b2a4ddc040d8,10.0.0.5:443
+/016a870bfd0d09832a50ca14d666e7ef21978f5a,10.0.0.3:443
+/f3d2b5c0cad02f1507f1a5c21b4cd8704f32ac11,10.0.0.6:443
+/1ded786d6cc703eda6a20bb7388114a6b74cb17b,10.0.0.1:443
+/de0132cb6cdc9aeba721296519d0b64bdb752855,10.0.0.6:443
+/30f11551b9d666c96604d01526eb001c9cd7524c,10.0.0.9:443
+/eb8bc43a527ac9f8088010954c78fff7a75f1bca,10.0.0.9:443
+/30803c02cdc19bccba32ad9fc2e77a4d20eac091,10.0.0.5:443
+/7281a18bbbb2dfb089b3039f516792e6b0c67714,10.0.0.2:443
+/8787a462e8890da32babea287e4874d3da54246e,10.0.0.6:443
+/2b76b52f43b204a6353a1f999ff40a221602199b,10.0.0.3:443
+/56e71d678f5482e4dfe45ae83993e9e1c9fe2731,10.0.0.1:443
+/08d820998361440ed076fa803e05d3c983383920,10.0.0.2:443
+/cc449cf6cee8ce83f646097ac3d3287becacfe41,10.0.0.4:443
+/2da713a30a3333b7895b3d65a320fe6c20bf670a,10.0.0.8:443
+/658e0cefd2b9a97b2dd840c2a243afc0dbf06cf1,10.0.0.9:443 \ No newline at end of file
diff --git a/pingora-ketama/test-data/trace.sh b/pingora-ketama/test-data/trace.sh
new file mode 100755
index 0000000..1c309bb
--- /dev/null
+++ b/pingora-ketama/test-data/trace.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+set -eu
+for i in {0..1000}; do
+ URI=$(openssl rand -hex 20)
+ curl http://localhost:8080/$URI -so /dev/null || true
+done \ No newline at end of file