         return lhs.bytes == rhs.bytes
     }
 
-    static let any = in6_addr(bytes: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
-    static let loopback = in6_addr(bytes: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1])
+    public static let any = in6_addr(bytes: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
+    public static let loopback = in6_addr(bytes: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1])
 
     /**
         Initialise with either 4- or 16-byte address
         4-byte addresses are converted to IPv4-mapped IPv6 representation
     */
-    init(bytes: [UInt8]) {
+    public init(bytes: [UInt8]) {
         self.init()
         self.bytes = bytes
     }

    /**
        Initialise with IPv4 or IPv6 string, eg. "123.123.123.123" or "2001:db8:85a3::8a2e:370:7334"
    */
    init?(string: String) {
        let cstr = Array(string.utf8CString)
        var addr6 = in6_addr()
        if inet_pton(AF_INET6, cstr, &addr6) == 1 {

        May be written as array of either 4 or 16 bytes
        4-byte addresses are converted to IPv4-mapped IPv6 addresses
    */
    public var bytes: [UInt8] {
        get {
            var result = [UInt8](repeating: 0, count: 16)
            var mself = self
