2025-04-02 06:50:39 -04:00

558 lines
16 KiB
JavaScript

(function () {
var r, t, n, e, i, o, a, s;
(t = {}),
(s = this),
'undefined' != typeof module && null !== module && module.exports ?
(module.exports = t)
: (s.ipaddr = t),
(a = function (r, t, n, e) {
var i, o;
if (r.length !== t.length)
throw new Error(
'ipaddr: cannot match CIDR for objects with different lengths'
);
for (i = 0; e > 0; ) {
if (((o = n - e) < 0 && (o = 0), r[i] >> o != t[i] >> o)) return !1;
(e -= n), (i += 1);
}
return !0;
}),
(t.subnetMatch = function (r, t, n) {
var e, i, o, a, s;
null == n && (n = 'unicast');
for (o in t)
for (
!(a = t[o])[0] || a[0] instanceof Array || (a = [a]),
e = 0,
i = a.length;
e < i;
e++
)
if (((s = a[e]), r.kind() === s[0].kind() && r.match.apply(r, s)))
return o;
return n;
}),
(t.IPv4 = (function () {
function r(r) {
var t, n, e;
if (4 !== r.length)
throw new Error('ipaddr: ipv4 octet count should be 4');
for (t = 0, n = r.length; t < n; t++)
if (!(0 <= (e = r[t]) && e <= 255))
throw new Error('ipaddr: ipv4 octet should fit in 8 bits');
this.octets = r;
}
return (
(r.prototype.kind = function () {
return 'ipv4';
}),
(r.prototype.toString = function () {
return this.octets.join('.');
}),
(r.prototype.toNormalizedString = function () {
return this.toString();
}),
(r.prototype.toByteArray = function () {
return this.octets.slice(0);
}),
(r.prototype.match = function (r, t) {
var n;
if (
(void 0 === t && ((r = (n = r)[0]), (t = n[1])),
'ipv4' !== r.kind())
)
throw new Error(
'ipaddr: cannot match ipv4 address with non-ipv4 one'
);
return a(this.octets, r.octets, 8, t);
}),
(r.prototype.SpecialRanges = {
unspecified: [[new r([0, 0, 0, 0]), 8]],
broadcast: [[new r([255, 255, 255, 255]), 32]],
multicast: [[new r([224, 0, 0, 0]), 4]],
linkLocal: [[new r([169, 254, 0, 0]), 16]],
loopback: [[new r([127, 0, 0, 0]), 8]],
carrierGradeNat: [[new r([100, 64, 0, 0]), 10]],
private: [
[new r([10, 0, 0, 0]), 8],
[new r([172, 16, 0, 0]), 12],
[new r([192, 168, 0, 0]), 16],
],
reserved: [
[new r([192, 0, 0, 0]), 24],
[new r([192, 0, 2, 0]), 24],
[new r([192, 88, 99, 0]), 24],
[new r([198, 51, 100, 0]), 24],
[new r([203, 0, 113, 0]), 24],
[new r([240, 0, 0, 0]), 4],
],
}),
(r.prototype.range = function () {
return t.subnetMatch(this, this.SpecialRanges);
}),
(r.prototype.toIPv4MappedAddress = function () {
return t.IPv6.parse('::ffff:' + this.toString());
}),
(r.prototype.prefixLengthFromSubnetMask = function () {
var r, t, n, e, i, o, a;
for (
a = {
0: 8,
128: 7,
192: 6,
224: 5,
240: 4,
248: 3,
252: 2,
254: 1,
255: 0,
},
r = 0,
i = !1,
t = n = 3;
n >= 0;
t = n += -1
) {
if (!((e = this.octets[t]) in a)) return null;
if (((o = a[e]), i && 0 !== o)) return null;
8 !== o && (i = !0), (r += o);
}
return 32 - r;
}),
r
);
})()),
(n = '(0?\\d+|0x[a-f0-9]+)'),
(e = {
fourOctet: new RegExp(
'^' + n + '\\.' + n + '\\.' + n + '\\.' + n + '$',
'i'
),
longValue: new RegExp('^' + n + '$', 'i'),
}),
(t.IPv4.parser = function (r) {
var t, n, i, o, a;
if (
((n = function (r) {
return '0' === r[0] && 'x' !== r[1] ? parseInt(r, 8) : parseInt(r);
}),
(t = r.match(e.fourOctet)))
)
return (function () {
var r, e, o, a;
for (a = [], r = 0, e = (o = t.slice(1, 6)).length; r < e; r++)
(i = o[r]), a.push(n(i));
return a;
})();
if ((t = r.match(e.longValue))) {
if ((a = n(t[1])) > 4294967295 || a < 0)
throw new Error('ipaddr: address outside defined range');
return (function () {
var r, t;
for (t = [], o = r = 0; r <= 24; o = r += 8) t.push((a >> o) & 255);
return t;
})().reverse();
}
return null;
}),
(t.IPv6 = (function () {
function r(r, t) {
var n, e, i, o, a, s;
if (16 === r.length)
for (this.parts = [], n = e = 0; e <= 14; n = e += 2)
this.parts.push((r[n] << 8) | r[n + 1]);
else {
if (8 !== r.length)
throw new Error('ipaddr: ipv6 part count should be 8 or 16');
this.parts = r;
}
for (i = 0, o = (s = this.parts).length; i < o; i++)
if (!(0 <= (a = s[i]) && a <= 65535))
throw new Error('ipaddr: ipv6 part should fit in 16 bits');
t && (this.zoneId = t);
}
return (
(r.prototype.kind = function () {
return 'ipv6';
}),
(r.prototype.toString = function () {
return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');
}),
(r.prototype.toRFC5952String = function () {
var r, t, n, e, i;
for (
e = /((^|:)(0(:|$)){2,})/g,
i = this.toNormalizedString(),
r = 0,
t = -1;
(n = e.exec(i));
)
n[0].length > t && ((r = n.index), (t = n[0].length));
return t < 0 ? i : i.substring(0, r) + '::' + i.substring(r + t);
}),
(r.prototype.toByteArray = function () {
var r, t, n, e, i;
for (r = [], t = 0, n = (i = this.parts).length; t < n; t++)
(e = i[t]), r.push(e >> 8), r.push(255 & e);
return r;
}),
(r.prototype.toNormalizedString = function () {
var r, t, n;
return (
(r = function () {
var r, n, e, i;
for (i = [], r = 0, n = (e = this.parts).length; r < n; r++)
(t = e[r]), i.push(t.toString(16));
return i;
}
.call(this)
.join(':')),
(n = ''),
this.zoneId && (n = '%' + this.zoneId),
r + n
);
}),
(r.prototype.toFixedLengthString = function () {
var r, t, n;
return (
(r = function () {
var r, n, e, i;
for (i = [], r = 0, n = (e = this.parts).length; r < n; r++)
(t = e[r]), i.push(t.toString(16).padStart(4, '0'));
return i;
}
.call(this)
.join(':')),
(n = ''),
this.zoneId && (n = '%' + this.zoneId),
r + n
);
}),
(r.prototype.match = function (r, t) {
var n;
if (
(void 0 === t && ((r = (n = r)[0]), (t = n[1])),
'ipv6' !== r.kind())
)
throw new Error(
'ipaddr: cannot match ipv6 address with non-ipv6 one'
);
return a(this.parts, r.parts, 16, t);
}),
(r.prototype.SpecialRanges = {
unspecified: [new r([0, 0, 0, 0, 0, 0, 0, 0]), 128],
linkLocal: [new r([65152, 0, 0, 0, 0, 0, 0, 0]), 10],
multicast: [new r([65280, 0, 0, 0, 0, 0, 0, 0]), 8],
loopback: [new r([0, 0, 0, 0, 0, 0, 0, 1]), 128],
uniqueLocal: [new r([64512, 0, 0, 0, 0, 0, 0, 0]), 7],
ipv4Mapped: [new r([0, 0, 0, 0, 0, 65535, 0, 0]), 96],
rfc6145: [new r([0, 0, 0, 0, 65535, 0, 0, 0]), 96],
rfc6052: [new r([100, 65435, 0, 0, 0, 0, 0, 0]), 96],
'6to4': [new r([8194, 0, 0, 0, 0, 0, 0, 0]), 16],
teredo: [new r([8193, 0, 0, 0, 0, 0, 0, 0]), 32],
reserved: [[new r([8193, 3512, 0, 0, 0, 0, 0, 0]), 32]],
}),
(r.prototype.range = function () {
return t.subnetMatch(this, this.SpecialRanges);
}),
(r.prototype.isIPv4MappedAddress = function () {
return 'ipv4Mapped' === this.range();
}),
(r.prototype.toIPv4Address = function () {
var r, n, e;
if (!this.isIPv4MappedAddress())
throw new Error(
'ipaddr: trying to convert a generic ipv6 address to ipv4'
);
return (
(e = this.parts.slice(-2)),
(r = e[0]),
(n = e[1]),
new t.IPv4([r >> 8, 255 & r, n >> 8, 255 & n])
);
}),
(r.prototype.prefixLengthFromSubnetMask = function () {
var r, t, n, e, i, o, a;
for (
a = {
0: 16,
32768: 15,
49152: 14,
57344: 13,
61440: 12,
63488: 11,
64512: 10,
65024: 9,
65280: 8,
65408: 7,
65472: 6,
65504: 5,
65520: 4,
65528: 3,
65532: 2,
65534: 1,
65535: 0,
},
r = 0,
i = !1,
t = n = 7;
n >= 0;
t = n += -1
) {
if (!((e = this.parts[t]) in a)) return null;
if (((o = a[e]), i && 0 !== o)) return null;
16 !== o && (i = !0), (r += o);
}
return 128 - r;
}),
r
);
})()),
(i = '(?:[0-9a-f]+::?)+'),
(o = {
zoneIndex: new RegExp('%[0-9a-z]{1,}', 'i'),
native: new RegExp(
'^(::)?(' + i + ')?([0-9a-f]+)?(::)?(%[0-9a-z]{1,})?$',
'i'
),
transitional: new RegExp(
'^((?:' +
i +
')|(?:::)(?:' +
i +
')?)' +
n +
'\\.' +
n +
'\\.' +
n +
'\\.' +
n +
'(%[0-9a-z]{1,})?$',
'i'
),
}),
(r = function (r, t) {
var n, e, i, a, s, p;
if (r.indexOf('::') !== r.lastIndexOf('::')) return null;
for (
(p = (r.match(o.zoneIndex) || [])[0]) &&
((p = p.substring(1)), (r = r.replace(/%.+$/, ''))),
n = 0,
e = -1;
(e = r.indexOf(':', e + 1)) >= 0;
)
n++;
if (
('::' === r.substr(0, 2) && n--, '::' === r.substr(-2, 2) && n--, n > t)
)
return null;
for (s = t - n, a = ':'; s--; ) a += '0:';
return (
':' === (r = r.replace('::', a))[0] && (r = r.slice(1)),
':' === r[r.length - 1] && (r = r.slice(0, -1)),
(t = (function () {
var t, n, e, o;
for (o = [], t = 0, n = (e = r.split(':')).length; t < n; t++)
(i = e[t]), o.push(parseInt(i, 16));
return o;
})()),
{ parts: t, zoneId: p }
);
}),
(t.IPv6.parser = function (t) {
var n, e, i, a, s, p, u;
if (o.native.test(t)) return r(t, 8);
if (
(a = t.match(o.transitional)) &&
((u = a[6] || ''), (n = r(a[1].slice(0, -1) + u, 6)).parts)
) {
for (
e = 0,
i = (p = [
parseInt(a[2]),
parseInt(a[3]),
parseInt(a[4]),
parseInt(a[5]),
]).length;
e < i;
e++
)
if (!(0 <= (s = p[e]) && s <= 255)) return null;
return (
n.parts.push((p[0] << 8) | p[1]),
n.parts.push((p[2] << 8) | p[3]),
{ parts: n.parts, zoneId: n.zoneId }
);
}
return null;
}),
(t.IPv4.isIPv4 = t.IPv6.isIPv6 =
function (r) {
return null !== this.parser(r);
}),
(t.IPv4.isValid = function (r) {
try {
return new this(this.parser(r)), !0;
} catch (r) {
return r, !1;
}
}),
(t.IPv4.isValidFourPartDecimal = function (r) {
return !(
!t.IPv4.isValid(r) || !r.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/)
);
}),
(t.IPv6.isValid = function (r) {
var t;
if ('string' == typeof r && -1 === r.indexOf(':')) return !1;
try {
return (t = this.parser(r)), new this(t.parts, t.zoneId), !0;
} catch (r) {
return r, !1;
}
}),
(t.IPv4.parse = function (r) {
var t;
if (null === (t = this.parser(r)))
throw new Error('ipaddr: string is not formatted like ip address');
return new this(t);
}),
(t.IPv6.parse = function (r) {
var t;
if (null === (t = this.parser(r)).parts)
throw new Error('ipaddr: string is not formatted like ip address');
return new this(t.parts, t.zoneId);
}),
(t.IPv4.parseCIDR = function (r) {
var t, n, e;
if (
(n = r.match(/^(.+)\/(\d+)$/)) &&
(t = parseInt(n[2])) >= 0 &&
t <= 32
)
return (
(e = [this.parse(n[1]), t]),
Object.defineProperty(e, 'toString', {
value: function () {
return this.join('/');
},
}),
e
);
throw new Error(
'ipaddr: string is not formatted like an IPv4 CIDR range'
);
}),
(t.IPv4.subnetMaskFromPrefixLength = function (r) {
var t, n, e;
if ((r = parseInt(r)) < 0 || r > 32)
throw new Error('ipaddr: invalid IPv4 prefix length');
for (e = [0, 0, 0, 0], n = 0, t = Math.floor(r / 8); n < t; )
(e[n] = 255), n++;
return (
t < 4 && (e[t] = (Math.pow(2, r % 8) - 1) << (8 - (r % 8))), new this(e)
);
}),
(t.IPv4.broadcastAddressFromCIDR = function (r) {
var t, n, e, i, o;
try {
for (
e = (t = this.parseCIDR(r))[0].toByteArray(),
o = this.subnetMaskFromPrefixLength(t[1]).toByteArray(),
i = [],
n = 0;
n < 4;
)
i.push(parseInt(e[n], 10) | (255 ^ parseInt(o[n], 10))), n++;
return new this(i);
} catch (r) {
throw (
(r, new Error('ipaddr: the address does not have IPv4 CIDR format'))
);
}
}),
(t.IPv4.networkAddressFromCIDR = function (r) {
var t, n, e, i, o;
try {
for (
e = (t = this.parseCIDR(r))[0].toByteArray(),
o = this.subnetMaskFromPrefixLength(t[1]).toByteArray(),
i = [],
n = 0;
n < 4;
)
i.push(parseInt(e[n], 10) & parseInt(o[n], 10)), n++;
return new this(i);
} catch (r) {
throw (
(r, new Error('ipaddr: the address does not have IPv4 CIDR format'))
);
}
}),
(t.IPv6.parseCIDR = function (r) {
var t, n, e;
if (
(n = r.match(/^(.+)\/(\d+)$/)) &&
(t = parseInt(n[2])) >= 0 &&
t <= 128
)
return (
(e = [this.parse(n[1]), t]),
Object.defineProperty(e, 'toString', {
value: function () {
return this.join('/');
},
}),
e
);
throw new Error(
'ipaddr: string is not formatted like an IPv6 CIDR range'
);
}),
(t.isValid = function (r) {
return t.IPv6.isValid(r) || t.IPv4.isValid(r);
}),
(t.parse = function (r) {
if (t.IPv6.isValid(r)) return t.IPv6.parse(r);
if (t.IPv4.isValid(r)) return t.IPv4.parse(r);
throw new Error('ipaddr: the address has neither IPv6 nor IPv4 format');
}),
(t.parseCIDR = function (r) {
try {
return t.IPv6.parseCIDR(r);
} catch (n) {
n;
try {
return t.IPv4.parseCIDR(r);
} catch (r) {
throw (
(r,
new Error(
'ipaddr: the address has neither IPv6 nor IPv4 CIDR format'
))
);
}
}
}),
(t.fromByteArray = function (r) {
var n;
if (4 === (n = r.length)) return new t.IPv4(r);
if (16 === n) return new t.IPv6(r);
throw new Error(
'ipaddr: the binary input is neither an IPv6 nor IPv4 address'
);
}),
(t.process = function (r) {
var t;
return (
(t = this.parse(r)),
'ipv6' === t.kind() && t.isIPv4MappedAddress() ? t.toIPv4Address() : t
);
});
}).call(this);