use std::net::{Ipv4Addr, Ipv6Addr};
pub use default_net::ip::*;
pub fn is_global_ipv4(ipv4_addr: &Ipv4Addr) -> bool {
!(ipv4_addr.octets()[0] == 0 || ipv4_addr.is_private()
|| matches!(ipv4_addr.octets(), [169, 254, ..])
|| ipv4_addr.is_loopback()
|| ipv4_addr.is_link_local()
||(ipv4_addr.octets()[0] == 192 && ipv4_addr.octets()[1] == 0 && ipv4_addr.octets()[2] == 0)
|| ipv4_addr.is_documentation()
|| ipv4_addr.octets()[0] == 198 && (ipv4_addr.octets()[1] & 0xfe) == 18
|| ipv4_addr.octets()[0] & 240 == 240 && !ipv4_addr.is_broadcast()
|| ipv4_addr.is_broadcast())
}
pub fn is_global_ipv6(ipv6_addr: &Ipv6Addr) -> bool {
!(ipv6_addr.is_unspecified()
|| ipv6_addr.is_loopback()
|| matches!(ipv6_addr.segments(), [0, 0, 0, 0, 0, 0xffff, _, _])
|| matches!(ipv6_addr.segments(), [0x64, 0xff9b, 1, _, _, _, _, _])
|| matches!(ipv6_addr.segments(), [0x100, 0, 0, 0, _, _, _, _])
|| (matches!(ipv6_addr.segments(), [0x2001, b, _, _, _, _, _, _] if b < 0x200)
&& !(
u128::from_be_bytes(ipv6_addr.octets()) == 0x2001_0001_0000_0000_0000_0000_0000_0001
|| u128::from_be_bytes(ipv6_addr.octets()) == 0x2001_0001_0000_0000_0000_0000_0000_0002
|| matches!(ipv6_addr.segments(), [0x2001, 3, _, _, _, _, _, _])
|| matches!(ipv6_addr.segments(), [0x2001, 4, 0x112, _, _, _, _, _])
|| matches!(ipv6_addr.segments(), [0x2001, b, _, _, _, _, _, _] if b >= 0x20 && b <= 0x2F)
))
|| ((ipv6_addr.segments()[0] == 0x2001) && (ipv6_addr.segments()[1] == 0x2) && (ipv6_addr.segments()[2] == 0))
|| ((ipv6_addr.segments()[0] & 0xfe00) == 0xfc00)
|| ((ipv6_addr.segments()[0] & 0xffc0) == 0xfe80))
}