aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/assets
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2022-03-04 14:14:10 +0500
committerEgor Tensin <Egor.Tensin@gmail.com>2022-03-04 14:35:05 +0500
commit8f1a1dda3c90241cca61def89cf2bb6ca214d52c (patch)
treebe71bdd3c886eb399d48f7779791d9ce79442486 /assets
parentmain.js: refactor IP address parsing (diff)
downloadwireguard-config-8f1a1dda3c90241cca61def89cf2bb6ca214d52c.tar.gz
wireguard-config-8f1a1dda3c90241cca61def89cf2bb6ca214d52c.zip
bundle ip-address (to be used instead of ipaddr.js)
This fucking sucks ass, but ipaddr.js is buggy: https://github.com/whitequark/ipaddr.js/issues/160
Diffstat (limited to 'assets')
-rw-r--r--assets/js/bundle.js3253
1 files changed, 3253 insertions, 0 deletions
diff --git a/assets/js/bundle.js b/assets/js/bundle.js
new file mode 100644
index 0000000..ef8987c
--- /dev/null
+++ b/assets/js/bundle.js
@@ -0,0 +1,3253 @@
+require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.AddressError = void 0;
+var AddressError = /** @class */ (function (_super) {
+ __extends(AddressError, _super);
+ function AddressError(message, parseMessage) {
+ var _this = _super.call(this, message) || this;
+ _this.name = 'AddressError';
+ if (parseMessage !== null) {
+ _this.parseMessage = parseMessage;
+ }
+ return _this;
+ }
+ return AddressError;
+}(Error));
+exports.AddressError = AddressError;
+
+},{}],2:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isCorrect = exports.isInSubnet = void 0;
+function isInSubnet(address) {
+ if (this.subnetMask < address.subnetMask) {
+ return false;
+ }
+ if (this.mask(address.subnetMask) === address.mask()) {
+ return true;
+ }
+ return false;
+}
+exports.isInSubnet = isInSubnet;
+function isCorrect(defaultBits) {
+ return function () {
+ if (this.addressMinusSuffix !== this.correctForm()) {
+ return false;
+ }
+ if (this.subnetMask === defaultBits && !this.parsedSubnet) {
+ return true;
+ }
+ return this.parsedSubnet === String(this.subnetMask);
+ };
+}
+exports.isCorrect = isCorrect;
+
+},{}],3:[function(require,module,exports){
+"use strict";
+/* eslint-disable no-param-reassign */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Address4 = void 0;
+var common = __importStar(require("./common"));
+var constants = __importStar(require("./v4/constants"));
+var address_error_1 = require("./address-error");
+var jsbn_1 = require("jsbn");
+var sprintf_js_1 = require("sprintf-js");
+/**
+ * Represents an IPv4 address
+ * @class Address4
+ * @param {string} address - An IPv4 address string
+ */
+var Address4 = /** @class */ (function () {
+ function Address4(address) {
+ this.groups = constants.GROUPS;
+ this.parsedAddress = [];
+ this.parsedSubnet = '';
+ this.subnet = '/32';
+ this.subnetMask = 32;
+ this.v4 = true;
+ /**
+ * Returns true if the address is correct, false otherwise
+ * @memberof Address4
+ * @instance
+ * @returns {Boolean}
+ */
+ this.isCorrect = common.isCorrect(constants.BITS);
+ /**
+ * Returns true if the given address is in the subnet of the current address
+ * @memberof Address4
+ * @instance
+ * @returns {boolean}
+ */
+ this.isInSubnet = common.isInSubnet;
+ this.address = address;
+ var subnet = constants.RE_SUBNET_STRING.exec(address);
+ if (subnet) {
+ this.parsedSubnet = subnet[0].replace('/', '');
+ this.subnetMask = parseInt(this.parsedSubnet, 10);
+ this.subnet = "/" + this.subnetMask;
+ if (this.subnetMask < 0 || this.subnetMask > constants.BITS) {
+ throw new address_error_1.AddressError('Invalid subnet mask.');
+ }
+ address = address.replace(constants.RE_SUBNET_STRING, '');
+ }
+ this.addressMinusSuffix = address;
+ this.parsedAddress = this.parse(address);
+ }
+ Address4.isValid = function (address) {
+ try {
+ // eslint-disable-next-line no-new
+ new Address4(address);
+ return true;
+ }
+ catch (e) {
+ return false;
+ }
+ };
+ /*
+ * Parses a v4 address
+ */
+ Address4.prototype.parse = function (address) {
+ var groups = address.split('.');
+ if (!address.match(constants.RE_ADDRESS)) {
+ throw new address_error_1.AddressError('Invalid IPv4 address.');
+ }
+ return groups;
+ };
+ /**
+ * Returns the correct form of an address
+ * @memberof Address4
+ * @instance
+ * @returns {String}
+ */
+ Address4.prototype.correctForm = function () {
+ return this.parsedAddress.map(function (part) { return parseInt(part, 10); }).join('.');
+ };
+ /**
+ * Converts a hex string to an IPv4 address object
+ * @memberof Address4
+ * @static
+ * @param {string} hex - a hex string to convert
+ * @returns {Address4}
+ */
+ Address4.fromHex = function (hex) {
+ var padded = hex.replace(/:/g, '').padStart(8, '0');
+ var groups = [];
+ var i;
+ for (i = 0; i < 8; i += 2) {
+ var h = padded.slice(i, i + 2);
+ groups.push(parseInt(h, 16));
+ }
+ return new Address4(groups.join('.'));
+ };
+ /**
+ * Converts an integer into a IPv4 address object
+ * @memberof Address4
+ * @static
+ * @param {integer} integer - a number to convert
+ * @returns {Address4}
+ */
+ Address4.fromInteger = function (integer) {
+ return Address4.fromHex(integer.toString(16));
+ };
+ /**
+ * Return an address from in-addr.arpa form
+ * @memberof Address4
+ * @static
+ * @param {string} arpaFormAddress - an 'in-addr.arpa' form ipv4 address
+ * @returns {Adress4}
+ * @example
+ * var address = Address4.fromArpa(42.2.0.192.in-addr.arpa.)
+ * address.correctForm(); // '192.0.2.42'
+ */
+ Address4.fromArpa = function (arpaFormAddress) {
+ // remove ending ".in-addr.arpa." or just "."
+ var leader = arpaFormAddress.replace(/(\.in-addr\.arpa)?\.$/, '');
+ var address = leader.split('.').reverse().join('.');
+ return new Address4(address);
+ };
+ /**
+ * Converts an IPv4 address object to a hex string
+ * @memberof Address4
+ * @instance
+ * @returns {String}
+ */
+ Address4.prototype.toHex = function () {
+ return this.parsedAddress.map(function (part) { return sprintf_js_1.sprintf('%02x', parseInt(part, 10)); }).join(':');
+ };
+ /**
+ * Converts an IPv4 address object to an array of bytes
+ * @memberof Address4
+ * @instance
+ * @returns {Array}
+ */
+ Address4.prototype.toArray = function () {
+ return this.parsedAddress.map(function (part) { return parseInt(part, 10); });
+ };
+ /**
+ * Converts an IPv4 address object to an IPv6 address group
+ * @memberof Address4
+ * @instance
+ * @returns {String}
+ */
+ Address4.prototype.toGroup6 = function () {
+ var output = [];
+ var i;
+ for (i = 0; i < constants.GROUPS; i += 2) {
+ var hex = sprintf_js_1.sprintf('%02x%02x', parseInt(this.parsedAddress[i], 10), parseInt(this.parsedAddress[i + 1], 10));
+ output.push(sprintf_js_1.sprintf('%x', parseInt(hex, 16)));
+ }
+ return output.join(':');
+ };
+ /**
+ * Returns the address as a BigInteger
+ * @memberof Address4
+ * @instance
+ * @returns {BigInteger}
+ */
+ Address4.prototype.bigInteger = function () {
+ return new jsbn_1.BigInteger(this.parsedAddress.map(function (n) { return sprintf_js_1.sprintf('%02x', parseInt(n, 10)); }).join(''), 16);
+ };
+ /**
+ * Helper function getting start address.
+ * @memberof Address4
+ * @instance
+ * @returns {BigInteger}
+ */
+ Address4.prototype._startAddress = function () {
+ return new jsbn_1.BigInteger(this.mask() + '0'.repeat(constants.BITS - this.subnetMask), 2);
+ };
+ /**
+ * The first address in the range given by this address' subnet.
+ * Often referred to as the Network Address.
+ * @memberof Address4
+ * @instance
+ * @returns {Address4}
+ */
+ Address4.prototype.startAddress = function () {
+ return Address4.fromBigInteger(this._startAddress());
+ };
+ /**
+ * The first host address in the range given by this address's subnet ie
+ * the first address after the Network Address
+ * @memberof Address4
+ * @instance
+ * @returns {Address4}
+ */
+ Address4.prototype.startAddressExclusive = function () {
+ var adjust = new jsbn_1.BigInteger('1');
+ return Address4.fromBigInteger(this._startAddress().add(adjust));
+ };
+ /**
+ * Helper function getting end address.
+ * @memberof Address4
+ * @instance
+ * @returns {BigInteger}
+ */
+ Address4.prototype._endAddress = function () {
+ return new jsbn_1.BigInteger(this.mask() + '1'.repeat(constants.BITS - this.subnetMask), 2);
+ };
+ /**
+ * The last address in the range given by this address' subnet
+ * Often referred to as the Broadcast
+ * @memberof Address4
+ * @instance
+ * @returns {Address4}
+ */
+ Address4.prototype.endAddress = function () {
+ return Address4.fromBigInteger(this._endAddress());
+ };
+ /**
+ * The last host address in the range given by this address's subnet ie
+ * the last address prior to the Broadcast Address
+ * @memberof Address4
+ * @instance
+ * @returns {Address4}
+ */
+ Address4.prototype.endAddressExclusive = function () {
+ var adjust = new jsbn_1.BigInteger('1');
+ return Address4.fromBigInteger(this._endAddress().subtract(adjust));
+ };
+ /**
+ * Converts a BigInteger to a v4 address object
+ * @memberof Address4
+ * @static
+ * @param {BigInteger} bigInteger - a BigInteger to convert
+ * @returns {Address4}
+ */
+ Address4.fromBigInteger = function (bigInteger) {
+ return Address4.fromInteger(parseInt(bigInteger.toString(), 10));
+ };
+ /**
+ * Returns the first n bits of the address, defaulting to the
+ * subnet mask
+ * @memberof Address4
+ * @instance
+ * @returns {String}
+ */
+ Address4.prototype.mask = function (mask) {
+ if (mask === undefined) {
+ mask = this.subnetMask;
+ }
+ return this.getBitsBase2(0, mask);
+ };
+ /**
+ * Returns the bits in the given range as a base-2 string
+ * @memberof Address4
+ * @instance
+ * @returns {string}
+ */
+ Address4.prototype.getBitsBase2 = function (start, end) {
+ return this.binaryZeroPad().slice(start, end);
+ };
+ /**
+ * Return the reversed ip6.arpa form of the address
+ * @memberof Address4
+ * @param {Object} options
+ * @param {boolean} options.omitSuffix - omit the "in-addr.arpa" suffix
+ * @instance
+ * @returns {String}
+ */
+ Address4.prototype.reverseForm = function (options) {
+ if (!options) {
+ options = {};
+ }
+ var reversed = this.correctForm().split('.').reverse().join('.');
+ if (options.omitSuffix) {
+ return reversed;
+ }
+ return sprintf_js_1.sprintf('%s.in-addr.arpa.', reversed);
+ };
+ /**
+ * Returns true if the given address is a multicast address
+ * @memberof Address4
+ * @instance
+ * @returns {boolean}
+ */
+ Address4.prototype.isMulticast = function () {
+ return this.isInSubnet(new Address4('224.0.0.0/4'));
+ };
+ /**
+ * Returns a zero-padded base-2 string representation of the address
+ * @memberof Address4
+ * @instance
+ * @returns {string}
+ */
+ Address4.prototype.binaryZeroPad = function () {
+ return this.bigInteger().toString(2).padStart(constants.BITS, '0');
+ };
+ /**
+ * Groups an IPv4 address for inclusion at the end of an IPv6 address
+ * @returns {String}
+ */
+ Address4.prototype.groupForV6 = function () {
+ var segments = this.parsedAddress;
+ return this.address.replace(constants.RE_ADDRESS, sprintf_js_1.sprintf('<span class="hover-group group-v4 group-6">%s</span>.<span class="hover-group group-v4 group-7">%s</span>', segments.slice(0, 2).join('.'), segments.slice(2, 4).join('.')));
+ };
+ return Address4;
+}());
+exports.Address4 = Address4;
+
+},{"./address-error":1,"./common":2,"./v4/constants":5,"jsbn":9,"sprintf-js":10}],4:[function(require,module,exports){
+"use strict";
+/* eslint-disable prefer-destructuring */
+/* eslint-disable no-param-reassign */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __spreadArray = (this && this.__spreadArray) || function (to, from) {
+ for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
+ to[j] = from[i];
+ return to;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Address6 = void 0;
+var common = __importStar(require("./common"));
+var constants4 = __importStar(require("./v4/constants"));
+var constants6 = __importStar(require("./v6/constants"));
+var helpers = __importStar(require("./v6/helpers"));
+var ipv4_1 = require("./ipv4");
+var regular_expressions_1 = require("./v6/regular-expressions");
+var address_error_1 = require("./address-error");
+var jsbn_1 = require("jsbn");
+var sprintf_js_1 = require("sprintf-js");
+function assert(condition) {
+ if (!condition) {
+ throw new Error('Assertion failed.');
+ }
+}
+function addCommas(number) {
+ var r = /(\d+)(\d{3})/;
+ while (r.test(number)) {
+ number = number.replace(r, '$1,$2');
+ }
+ return number;
+}
+function spanLeadingZeroes4(n) {
+ n = n.replace(/^(0{1,})([1-9]+)$/, '<span class="parse-error">$1</span>$2');
+ n = n.replace(/^(0{1,})(0)$/, '<span class="parse-error">$1</span>$2');
+ return n;
+}
+/*
+ * A helper function to compact an array
+ */
+function compact(address, slice) {
+ var s1 = [];
+ var s2 = [];
+ var i;
+ for (i = 0; i < address.length; i++) {
+ if (i < slice[0]) {
+ s1.push(address[i]);
+ }
+ else if (i > slice[1]) {
+ s2.push(address[i]);
+ }
+ }
+ return s1.concat(['compact']).concat(s2);
+}
+function paddedHex(octet) {
+ return sprintf_js_1.sprintf('%04x', parseInt(octet, 16));
+}
+function unsignByte(b) {
+ // eslint-disable-next-line no-bitwise
+ return b & 0xff;
+}
+/**
+ * Represents an IPv6 address
+ * @class Address6
+ * @param {string} address - An IPv6 address string
+ * @param {number} [groups=8] - How many octets to parse
+ * @example
+ * var address = new Address6('2001::/32');
+ */
+var Address6 = /** @class */ (function () {
+ function Address6(address, optionalGroups) {
+ this.addressMinusSuffix = '';
+ this.parsedSubnet = '';
+ this.subnet = '/128';
+ this.subnetMask = 128;
+ this.v4 = false;
+ this.zone = '';
+ // #region Attributes
+ /**
+ * Returns true if the given address is in the subnet of the current address
+ * @memberof Address6
+ * @instance
+ * @returns {boolean}
+ */
+ this.isInSubnet = common.isInSubnet;
+ /**
+ * Returns true if the address is correct, false otherwise
+ * @memberof Address6
+ * @instance
+ * @returns {boolean}
+ */
+ this.isCorrect = common.isCorrect(constants6.BITS);
+ if (optionalGroups === undefined) {
+ this.groups = constants6.GROUPS;
+ }
+ else {
+ this.groups = optionalGroups;
+ }
+ this.address = address;
+ var subnet = constants6.RE_SUBNET_STRING.exec(address);
+ if (subnet) {
+ this.parsedSubnet = subnet[0].replace('/', '');
+ this.subnetMask = parseInt(this.parsedSubnet, 10);
+ this.subnet = "/" + this.subnetMask;
+ if (Number.isNaN(this.subnetMask) ||
+ this.subnetMask < 0 ||
+ this.subnetMask > constants6.BITS) {
+ throw new address_error_1.AddressError('Invalid subnet mask.');
+ }
+ address = address.replace(constants6.RE_SUBNET_STRING, '');
+ }
+ else if (/\//.test(address)) {
+ throw new address_error_1.AddressError('Invalid subnet mask.');
+ }
+ var zone = constants6.RE_ZONE_STRING.exec(address);
+ if (zone) {
+ this.zone = zone[0];
+ address = address.replace(constants6.RE_ZONE_STRING, '');
+ }
+ this.addressMinusSuffix = address;
+ this.parsedAddress = this.parse(this.addressMinusSuffix);
+ }
+ Address6.isValid = function (address) {
+ try {
+ // eslint-disable-next-line no-new
+ new Address6(address);
+ return true;
+ }
+ catch (e) {
+ return false;
+ }
+ };
+ /**
+ * Convert a BigInteger to a v6 address object
+ * @memberof Address6
+ * @static
+ * @param {BigInteger} bigInteger - a BigInteger to convert
+ * @returns {Address6}
+ * @example
+ * var bigInteger = new BigInteger('1000000000000');
+ * var address = Address6.fromBigInteger(bigInteger);
+ * address.correctForm(); // '::e8:d4a5:1000'
+ */
+ Address6.fromBigInteger = function (bigInteger) {
+ var hex = bigInteger.toString(16).padStart(32, '0');
+ var groups = [];
+ var i;
+ for (i = 0; i < constants6.GROUPS; i++) {
+ groups.push(hex.slice(i * 4, (i + 1) * 4));
+ }
+ return new Address6(groups.join(':'));
+ };
+ /**
+ * Convert a URL (with optional port number) to an address object
+ * @memberof Address6
+ * @static
+ * @param {string} url - a URL with optional port number
+ * @example
+ * var addressAndPort = Address6.fromURL('http://[ffff::]:8080/foo/');
+ * addressAndPort.address.correctForm(); // 'ffff::'
+ * addressAndPort.port; // 8080
+ */
+ Address6.fromURL = function (url) {
+ var host;
+ var port = null;
+ var result;
+ // If we have brackets parse them and find a port
+ if (url.indexOf('[') !== -1 && url.indexOf(']:') !== -1) {
+ result = constants6.RE_URL_WITH_PORT.exec(url);
+ if (result === null) {
+ return {
+ error: 'failed to parse address with port',
+ address: null,
+ port: null,
+ };
+ }
+ host = result[1];
+ port = result[2];
+ // If there's a URL extract the address
+ }
+ else if (url.indexOf('/') !== -1) {
+ // Remove the protocol prefix
+ url = url.replace(/^[a-z0-9]+:\/\//, '');
+ // Parse the address
+ result = constants6.RE_URL.exec(url);
+ if (result === null) {
+ return {
+ error: 'failed to parse address from URL',
+ address: null,
+ port: null,
+ };
+ }
+ host = result[1];
+ // Otherwise just assign the URL to the host and let the library parse it
+ }
+ else {
+ host = url;
+ }
+ // If there's a port convert it to an integer
+ if (port) {
+ port = parseInt(port, 10);
+ // squelch out of range ports
+ if (port < 0 || port > 65536) {
+ port = null;
+ }
+ }
+ else {
+ // Standardize `undefined` to `null`
+ port = null;
+ }
+ return {
+ address: new Address6(host),
+ port: port,
+ };
+ };
+ /**
+ * Create an IPv6-mapped address given an IPv4 address
+ * @memberof Address6
+ * @static
+ * @param {string} address - An IPv4 address string
+ * @returns {Address6}
+ * @example
+ * var address = Address6.fromAddress4('192.168.0.1');
+ * address.correctForm(); // '::ffff:c0a8:1'
+ * address.to4in6(); // '::ffff:192.168.0.1'
+ */
+ Address6.fromAddress4 = function (address) {
+ var address4 = new ipv4_1.Address4(address);
+ var mask6 = constants6.BITS - (constants4.BITS - address4.subnetMask);
+ return new Address6("::ffff:" + address4.correctForm() + "/" + mask6);
+ };
+ /**
+ * Return an address from ip6.arpa form
+ * @memberof Address6
+ * @static
+ * @param {string} arpaFormAddress - an 'ip6.arpa' form address
+ * @returns {Adress6}
+ * @example
+ * var address = Address6.fromArpa(e.f.f.f.3.c.2.6.f.f.f.e.6.6.8.e.1.0.6.7.9.4.e.c.0.0.0.0.1.0.0.2.ip6.arpa.)
+ * address.correctForm(); // '2001:0:ce49:7601:e866:efff:62c3:fffe'
+ */
+ Address6.fromArpa = function (arpaFormAddress) {
+ // remove ending ".ip6.arpa." or just "."
+ var address = arpaFormAddress.replace(/(\.ip6\.arpa)?\.$/, '');
+ var semicolonAmount = 7;
+ // correct ip6.arpa form with ending removed will be 63 characters
+ if (address.length !== 63) {
+ throw new address_error_1.AddressError("Invalid 'ip6.arpa' form.");
+ }
+ var parts = address.split('.').reverse();
+ for (var i = semicolonAmount; i > 0; i--) {
+ var insertIndex = i * 4;
+ parts.splice(insertIndex, 0, ':');
+ }
+ address = parts.join('');
+ return new Address6(address);
+ };
+ /**
+ * Return the Microsoft UNC transcription of the address
+ * @memberof Address6
+ * @instance
+ * @returns {String} the Microsoft UNC transcription of the address
+ */
+ Address6.prototype.microsoftTranscription = function () {
+ return sprintf_js_1.sprintf('%s.ipv6-literal.net', this.correctForm().replace(/:/g, '-'));
+ };
+ /**
+ * Return the first n bits of the address, defaulting to the subnet mask
+ * @memberof Address6
+ * @instance
+ * @param {number} [mask=subnet] - the number of bits to mask
+ * @returns {String} the first n bits of the address as a string
+ */
+ Address6.prototype.mask = function (mask) {
+ if (mask === void 0) { mask = this.subnetMask; }
+ return this.getBitsBase2(0, mask);
+ };
+ /**
+ * Return the number of possible subnets of a given size in the address
+ * @memberof Address6
+ * @instance
+ * @param {number} [size=128] - the subnet size
+ * @returns {String}
+ */
+ // TODO: probably useful to have a numeric version of this too
+ Address6.prototype.possibleSubnets = function (subnetSize) {
+ if (subnetSize === void 0) { subnetSize = 128; }
+ var availableBits = constants6.BITS - this.subnetMask;
+ var subnetBits = Math.abs(subnetSize - constants6.BITS);
+ var subnetPowers = availableBits - subnetBits;
+ if (subnetPowers < 0) {
+ return '0';
+ }
+ return addCommas(new jsbn_1.BigInteger('2', 10).pow(subnetPowers).toString(10));
+ };
+ /**
+ * Helper function getting start address.
+ * @memberof Address6
+ * @instance
+ * @returns {BigInteger}
+ */
+ Address6.prototype._startAddress = function () {
+ return new jsbn_1.BigInteger(this.mask() + '0'.repeat(constants6.BITS - this.subnetMask), 2);
+ };
+ /**
+ * The first address in the range given by this address' subnet
+ * Often referred to as the Network Address.
+ * @memberof Address6
+ * @instance
+ * @returns {Address6}
+ */
+ Address6.prototype.startAddress = function () {
+ return Address6.fromBigInteger(this._startAddress());
+ };
+ /**
+ * The first host address in the range given by this address's subnet ie
+ * the first address after the Network Address
+ * @memberof Address6
+ * @instance
+ * @returns {Address6}
+ */
+ Address6.prototype.startAddressExclusive = function () {
+ var adjust = new jsbn_1.BigInteger('1');
+ return Address6.fromBigInteger(this._startAddress().add(adjust));
+ };
+ /**
+ * Helper function getting end address.
+ * @memberof Address6
+ * @instance
+ * @returns {BigInteger}
+ */
+ Address6.prototype._endAddress = function () {
+ return new jsbn_1.BigInteger(this.mask() + '1'.repeat(constants6.BITS - this.subnetMask), 2);
+ };
+ /**
+ * The last address in the range given by this address' subnet
+ * Often referred to as the Broadcast
+ * @memberof Address6
+ * @instance
+ * @returns {Address6}
+ */
+ Address6.prototype.endAddress = function () {
+ return Address6.fromBigInteger(this._endAddress());
+ };
+ /**
+ * The last host address in the range given by this address's subnet ie
+ * the last address prior to the Broadcast Address
+ * @memberof Address6
+ * @instance
+ * @returns {Address6}
+ */
+ Address6.prototype.endAddressExclusive = function () {
+ var adjust = new jsbn_1.BigInteger('1');
+ return Address6.fromBigInteger(this._endAddress().subtract(adjust));
+ };
+ /**
+ * Return the scope of the address
+ * @memberof Address6
+ * @instance
+ * @returns {String}
+ */
+ Address6.prototype.getScope = function () {
+ var scope = constants6.SCOPES[this.getBits(12, 16).intValue()];
+ if (this.getType() === 'Global unicast' && scope !== 'Link local') {
+ scope = 'Global';
+ }
+ return scope || 'Unknown';
+ };
+ /**
+ * Return the type of the address
+ * @memberof Address6
+ * @instance
+ * @returns {String}
+ */
+ Address6.prototype.getType = function () {
+ for (var _i = 0, _a = Object.keys(constants6.TYPES); _i < _a.length; _i++) {
+ var subnet = _a[_i];
+ if (this.isInSubnet(new Address6(subnet))) {
+ return constants6.TYPES[subnet];
+ }
+ }
+ return 'Global unicast';
+ };
+ /**
+ * Return the bits in the given range as a BigInteger
+ * @memberof Address6
+ * @instance
+ * @returns {BigInteger}
+ */
+ Address6.prototype.getBits = function (start, end) {
+ return new jsbn_1.BigInteger(this.getBitsBase2(start, end), 2);
+ };
+ /**
+ * Return the bits in the given range as a base-2 string
+ * @memberof Address6
+ * @instance
+ * @returns {String}
+ */
+ Address6.prototype.getBitsBase2 = function (start, end) {
+ return this.binaryZeroPad().slice(start, end);
+ };
+ /**
+ * Return the bits in the given range as a base-16 string
+ * @memberof Address6
+ * @instance
+ * @returns {String}
+ */
+ Address6.prototype.getBitsBase16 = function (start, end) {
+ var length = end - start;
+ if (length % 4 !== 0) {
+ throw new Error('Length of bits to retrieve must be divisible by four');
+ }
+ return this.getBits(start, end)
+ .toString(16)
+ .padStart(length / 4, '0');
+ };
+ /**
+ * Return the bits that are set past the subnet mask length
+ * @memberof Address6
+ * @instance
+ * @returns {String}
+ */
+ Address6.prototype.getBitsPastSubnet = function () {
+ return this.getBitsBase2(this.subnetMask, constants6.BITS);
+ };
+ /**
+ * Return the reversed ip6.arpa form of the address
+ * @memberof Address6
+ * @param {Object} options
+ * @param {boolean} options.omitSuffix - omit the "ip6.arpa" suffix
+ * @instance
+ * @returns {String}
+ */
+ Address6.prototype.reverseForm = function (options) {
+ if (!options) {
+ options = {};
+ }
+ var characters = Math.floor(this.subnetMask / 4);
+ var reversed = this.canonicalForm()
+ .replace(/:/g, '')
+ .split('')
+ .slice(0, characters)
+ .reverse()
+ .join('.');
+ if (characters > 0) {
+ if (options.omitSuffix) {
+ return reversed;
+ }
+ return sprintf_js_1.sprintf('%s.ip6.arpa.', reversed);
+ }
+ if (options.omitSuffix) {
+ return '';
+ }
+ return 'ip6.arpa.';
+ };
+ /**
+ * Return the correct form of the address
+ * @memberof Address6
+ * @instance
+ * @returns {String}
+ */
+ Address6.prototype.correctForm = function () {
+ var i;
+ var groups = [];
+ var zeroCounter = 0;
+ var zeroes = [];
+ for (i = 0; i < this.parsedAddress.length; i++) {
+ var value = parseInt(this.parsedAddress[i], 16);
+ if (value === 0) {
+ zeroCounter++;
+ }
+ if (value !== 0 && zeroCounter > 0) {
+ if (zeroCounter > 1) {
+ zeroes.push([i - zeroCounter, i - 1]);
+ }
+ zeroCounter = 0;
+ }
+ }
+ // Do we end with a string of zeroes?
+ if (zeroCounter > 1) {
+ zeroes.push([this.parsedAddress.length - zeroCounter, this.parsedAddress.length - 1]);
+ }
+ var zeroLengths = zeroes.map(function (n) { return n[1] - n[0] + 1; });
+ if (zeroes.length > 0) {
+ var index = zeroLengths.indexOf(Math.max.apply(Math, zeroLengths));
+ groups = compact(this.parsedAddress, zeroes[index]);
+ }
+ else {
+ groups = this.parsedAddress;
+ }
+ for (i = 0; i < groups.length; i++) {
+ if (groups[i] !== 'compact') {
+ groups[i] = parseInt(groups[i], 16).toString(16);
+ }
+ }
+ var correct = groups.join(':');
+ correct = correct.replace(/^compact$/, '::');
+ correct = correct.replace(/^compact|compact$/, ':');
+ correct = correct.replace(/compact/, '');
+ return correct;
+ };
+ /**
+ * Return a zero-padded base-2 string representation of the address
+ * @memberof Address6
+ * @instance
+ * @returns {String}
+ * @example
+ * var address = new Address6('2001:4860:4001:803::1011');
+ * address.binaryZeroPad();
+ * // '0010000000000001010010000110000001000000000000010000100000000011
+ * // 0000000000000000000000000000000000000000000000000001000000010001'
+ */
+ Address6.prototype.binaryZeroPad = function () {
+ return this.bigInteger().toString(2).padStart(constants6.BITS, '0');
+ };
+ // TODO: Improve the semantics of this helper function
+ Address6.prototype.parse4in6 = function (address) {
+ var groups = address.split(':');
+ var lastGroup = groups.slice(-1)[0];
+ var address4 = lastGroup.match(constants4.RE_ADDRESS);
+ if (address4) {
+ this.parsedAddress4 = address4[0];
+ this.address4 = new ipv4_1.Address4(this.parsedAddress4);
+ for (var i = 0; i < this.address4.groups; i++) {
+ if (/^0[0-9]+/.test(this.address4.parsedAddress[i])) {
+ throw new address_error_1.AddressError("IPv4 addresses can't have leading zeroes.", address.replace(constants4.RE_ADDRESS, this.address4.parsedAddress.map(spanLeadingZeroes4).join('.')));
+ }
+ }
+ this.v4 = true;
+ groups[groups.length - 1] = this.address4.toGroup6();
+ address = groups.join(':');
+ }
+ return address;
+ };
+ // TODO: Make private?
+ Address6.prototype.parse = function (address) {
+ address = this.parse4in6(address);
+ var badCharacters = address.match(constants6.RE_BAD_CHARACTERS);
+ if (badCharacters) {
+ throw new address_error_1.AddressError(sprintf_js_1.sprintf('Bad character%s detected in address: %s', badCharacters.length > 1 ? 's' : '', badCharacters.join('')), address.replace(constants6.RE_BAD_CHARACTERS, '<span class="parse-error">$1</span>'));
+ }
+ var badAddress = address.match(constants6.RE_BAD_ADDRESS);
+ if (badAddress) {
+ throw new address_error_1.AddressError(sprintf_js_1.sprintf('Address failed regex: %s', badAddress.join('')), address.replace(constants6.RE_BAD_ADDRESS, '<span class="parse-error">$1</span>'));
+ }
+ var groups = [];
+ var halves = address.split('::');
+ if (halves.length === 2) {
+ var first = halves[0].split(':');
+ var last = halves[1].split(':');
+ if (first.length === 1 && first[0] === '') {
+ first = [];
+ }
+ if (last.length === 1 && last[0] === '') {
+ last = [];
+ }
+ var remaining = this.groups - (first.length + last.length);
+ if (!remaining) {
+ throw new address_error_1.AddressError('Error parsing groups');
+ }
+ this.elidedGroups = remaining;
+ this.elisionBegin = first.length;
+ this.elisionEnd = first.length + this.elidedGroups;
+ groups = groups.concat(first);
+ for (var i = 0; i < remaining; i++) {
+ groups.push('0');
+ }
+ groups = groups.concat(last);
+ }
+ else if (halves.length === 1) {
+ groups = address.split(':');
+ this.elidedGroups = 0;
+ }
+ else {
+ throw new address_error_1.AddressError('Too many :: groups found');
+ }
+ groups = groups.map(function (group) { return sprintf_js_1.sprintf('%x', parseInt(group, 16)); });
+ if (groups.length !== this.groups) {
+ throw new address_error_1.AddressError('Incorrect number of groups found');
+ }
+ return groups;
+ };
+ /**
+ * Return the canonical form of the address
+ * @memberof Address6
+ * @instance
+ * @returns {String}
+ */
+ Address6.prototype.canonicalForm = function () {
+ return this.parsedAddress.map(paddedHex).join(':');
+ };
+ /**
+ * Return the decimal form of the address
+ * @memberof Address6
+ * @instance
+ * @returns {String}
+ */
+ Address6.prototype.decimal = function () {
+ return this.parsedAddress.map(function (n) { return sprintf_js_1.sprintf('%05d', parseInt(n, 16)); }).join(':');
+ };
+ /**
+ * Return the address as a BigInteger
+ * @memberof Address6
+ * @instance
+ * @returns {BigInteger}
+ */
+ Address6.prototype.bigInteger = function () {
+ return new jsbn_1.BigInteger(this.parsedAddress.map(paddedHex).join(''), 16);
+ };
+ /**
+ * Return the last two groups of this address as an IPv4 address string
+ * @memberof Address6
+ * @instance
+ * @returns {Address4}
+ * @example
+ * var address = new Address6('2001:4860:4001::1825:bf11');
+ * address.to4().correctForm(); // '24.37.191.17'
+ */
+ Address6.prototype.to4 = function () {
+ var binary = this.binaryZeroPad().split('');
+ return ipv4_1.Address4.fromHex(new jsbn_1.BigInteger(binary.slice(96, 128).join(''), 2).toString(16));
+ };
+ /**
+ * Return the v4-in-v6 form of the address
+ * @memberof Address6
+ * @instance
+ * @returns {String}
+ */
+ Address6.prototype.to4in6 = function () {
+ var address4 = this.to4();
+ var address6 = new Address6(this.parsedAddress.slice(0, 6).join(':'), 6);
+ var correct = address6.correctForm();
+ var infix = '';
+ if (!/:$/.test(correct)) {
+ infix = ':';
+ }
+ return correct + infix + address4.address;
+ };
+ /**
+ * Return an object containing the Teredo properties of the address
+ * @memberof Address6
+ * @instance
+ * @returns {Object}
+ */
+ Address6.prototype.inspectTeredo = function () {
+ /*
+ - Bits 0 to 31 are set to the Teredo prefix (normally 2001:0000::/32).
+ - Bits 32 to 63 embed the primary IPv4 address of the Teredo server that
+ is used.
+ - Bits 64 to 79 can be used to define some flags. Currently only the
+ higher order bit is used; it is set to 1 if the Teredo client is
+ located behind a cone NAT, 0 otherwise. For Microsoft's Windows Vista
+ and Windows Server 2008 implementations, more bits are used. In those
+ implementations, the format for these 16 bits is "CRAAAAUG AAAAAAAA",
+ where "C" remains the "Cone" flag. The "R" bit is reserved for future
+ use. The "U" bit is for the Universal/Local flag (set to 0). The "G" bit
+ is Individual/Group flag (set to 0). The A bits are set to a 12-bit
+ randomly generated number chosen by the Teredo client to introduce
+ additional protection for the Teredo node against IPv6-based scanning
+ attacks.
+ - Bits 80 to 95 contains the obfuscated UDP port number. This is the
+ port number that is mapped by the NAT to the Teredo client with all
+ bits inverted.
+ - Bits 96 to 127 contains the obfuscated IPv4 address. This is the
+ public IPv4 address of the NAT with all bits inverted.
+ */
+ var prefix = this.getBitsBase16(0, 32);
+ var udpPort = this.getBits(80, 96).xor(new jsbn_1.BigInteger('ffff', 16)).toString();
+ var server4 = ipv4_1.Address4.fromHex(this.getBitsBase16(32, 64));
+ var client4 = ipv4_1.Address4.fromHex(this.getBits(96, 128).xor(new jsbn_1.BigInteger('ffffffff', 16)).toString(16));
+ var flags = this.getBits(64, 80);
+ var flagsBase2 = this.getBitsBase2(64, 80);
+ var coneNat = flags.testBit(15);
+ var reserved = flags.testBit(14);
+ var groupIndividual = flags.testBit(8);
+ var universalLocal = flags.testBit(9);
+ var nonce = new jsbn_1.BigInteger(flagsBase2.slice(2, 6) + flagsBase2.slice(8, 16), 2).toString(10);
+ return {
+ prefix: sprintf_js_1.sprintf('%s:%s', prefix.slice(0, 4), prefix.slice(4, 8)),
+ server4: server4.address,
+ client4: client4.address,
+ flags: flagsBase2,
+ coneNat: coneNat,
+ microsoft: {
+ reserved: reserved,
+ universalLocal: universalLocal,
+ groupIndividual: groupIndividual,
+ nonce: nonce,
+ },
+ udpPort: udpPort,
+ };
+ };
+ /**
+ * Return an object containing the 6to4 properties of the address
+ * @memberof Address6
+ * @instance
+ * @returns {Object}
+ */
+ Address6.prototype.inspect6to4 = function () {
+ /*
+ - Bits 0 to 15 are set to the 6to4 prefix (2002::/16).
+ - Bits 16 to 48 embed the IPv4 address of the 6to4 gateway that is used.
+ */
+ var prefix = this.getBitsBase16(0, 16);
+ var gateway = ipv4_1.Address4.fromHex(this.getBitsBase16(16, 48));
+ return {
+ prefix: sprintf_js_1.sprintf('%s', prefix.slice(0, 4)),
+ gateway: gateway.address,
+ };
+ };
+ /**
+ * Return a v6 6to4 address from a v6 v4inv6 address
+ * @memberof Address6
+ * @instance
+ * @returns {Address6}
+ */
+ Address6.prototype.to6to4 = function () {
+ if (!this.is4()) {
+ return null;
+ }
+ var addr6to4 = [
+ '2002',
+ this.getBitsBase16(96, 112),
+ this.getBitsBase16(112, 128),
+ '',
+ '/16',
+ ].join(':');
+ return new Address6(addr6to4);
+ };
+ /**
+ * Return a byte array
+ * @memberof Address6
+ * @instance
+ * @returns {Array}
+ */
+ Address6.prototype.toByteArray = function () {
+ var byteArray = this.bigInteger().toByteArray();
+ // work around issue where `toByteArray` returns a leading 0 element
+ if (byteArray.length === 17 && byteArray[0] === 0) {
+ return byteArray.slice(1);
+ }
+ return byteArray;
+ };
+ /**
+ * Return an unsigned byte array
+ * @memberof Address6
+ * @instance
+ * @returns {Array}
+ */
+ Address6.prototype.toUnsignedByteArray = function () {
+ return this.toByteArray().map(unsignByte);
+ };
+ /**
+ * Convert a byte array to an Address6 object
+ * @memberof Address6
+ * @static
+ * @returns {Address6}
+ */
+ Address6.fromByteArray = function (bytes) {
+ return this.fromUnsignedByteArray(bytes.map(unsignByte));
+ };
+ /**
+ * Convert an unsigned byte array to an Address6 object
+ * @memberof Address6
+ * @static
+ * @returns {Address6}
+ */
+ Address6.fromUnsignedByteArray = function (bytes) {
+ var BYTE_MAX = new jsbn_1.BigInteger('256', 10);
+ var result = new jsbn_1.BigInteger('0', 10);
+ var multiplier = new jsbn_1.BigInteger('1', 10);
+ for (var i = bytes.length - 1; i >= 0; i--) {
+ result = result.add(multiplier.multiply(new jsbn_1.BigInteger(bytes[i].toString(10), 10)));
+ multiplier = multiplier.multiply(BYTE_MAX);
+ }
+ return Address6.fromBigInteger(result);
+ };
+ /**
+ * Returns true if the address is in the canonical form, false otherwise
+ * @memberof Address6
+ * @instance
+ * @returns {boolean}
+ */
+ Address6.prototype.isCanonical = function () {
+ return this.addressMinusSuffix === this.canonicalForm();
+ };
+ /**
+ * Returns true if the address is a link local address, false otherwise
+ * @memberof Address6
+ * @instance
+ * @returns {boolean}
+ */
+ Address6.prototype.isLinkLocal = function () {
+ // Zeroes are required, i.e. we can't check isInSubnet with 'fe80::/10'
+ if (this.getBitsBase2(0, 64) ===
+ '1111111010000000000000000000000000000000000000000000000000000000') {
+ return true;
+ }
+ return false;
+ };
+ /**
+ * Returns true if the address is a multicast address, false otherwise
+ * @memberof Address6
+ * @instance
+ * @returns {boolean}
+ */
+ Address6.prototype.isMulticast = function () {
+ return this.getType() === 'Multicast';
+ };
+ /**
+ * Returns true if the address is a v4-in-v6 address, false otherwise
+ * @memberof Address6
+ * @instance
+ * @returns {boolean}
+ */
+ Address6.prototype.is4 = function () {
+ return this.v4;
+ };
+ /**
+ * Returns true if the address is a Teredo address, false otherwise
+ * @memberof Address6
+ * @instance
+ * @returns {boolean}
+ */
+ Address6.prototype.isTeredo = function () {
+ return this.isInSubnet(new Address6('2001::/32'));
+ };
+ /**
+ * Returns true if the address is a 6to4 address, false otherwise
+ * @memberof Address6
+ * @instance
+ * @returns {boolean}
+ */
+ Address6.prototype.is6to4 = function () {
+ return this.isInSubnet(new Address6('2002::/16'));
+ };
+ /**
+ * Returns true if the address is a loopback address, false otherwise
+ * @memberof Address6
+ * @instance
+ * @returns {boolean}
+ */
+ Address6.prototype.isLoopback = function () {
+ return this.getType() === 'Loopback';
+ };
+ // #endregion
+ // #region HTML
+ /**
+ * @returns {String} the address in link form with a default port of 80
+ */
+ Address6.prototype.href = function (optionalPort) {
+ if (optionalPort === undefined) {
+ optionalPort = '';
+ }
+ else {
+ optionalPort = sprintf_js_1.sprintf(':%s', optionalPort);
+ }
+ return sprintf_js_1.sprintf('http://[%s]%s/', this.correctForm(), optionalPort);
+ };
+ /**
+ * @returns {String} a link suitable for conveying the address via a URL hash
+ */
+ Address6.prototype.link = function (options) {
+ if (!options) {
+ options = {};
+ }
+ if (options.className === undefined) {
+ options.className = '';
+ }
+ if (options.prefix === undefined) {
+ options.prefix = '/#address=';
+ }
+ if (options.v4 === undefined) {
+ options.v4 = false;
+ }
+ var formFunction = this.correctForm;
+ if (options.v4) {
+ formFunction = this.to4in6;
+ }
+ if (options.className) {
+ return sprintf_js_1.sprintf('<a href="%1$s%2$s" class="%3$s">%2$s</a>', options.prefix, formFunction.call(this), options.className);
+ }
+ return sprintf_js_1.sprintf('<a href="%1$s%2$s">%2$s</a>', options.prefix, formFunction.call(this));
+ };
+ /**
+ * Groups an address
+ * @returns {String}
+ */
+ Address6.prototype.group = function () {
+ if (this.elidedGroups === 0) {
+ // The simple case
+ return helpers.simpleGroup(this.address).join(':');
+ }
+ assert(typeof this.elidedGroups === 'number');
+ assert(typeof this.elisionBegin === 'number');
+ // The elided case
+ var output = [];
+ var _a = this.address.split('::'), left = _a[0], right = _a[1];
+ if (left.length) {
+ output.push.apply(output, helpers.simpleGroup(left));
+ }
+ else {
+ output.push('');
+ }
+ var classes = ['hover-group'];
+ for (var i = this.elisionBegin; i < this.elisionBegin + this.elidedGroups; i++) {
+ classes.push(sprintf_js_1.sprintf('group-%d', i));
+ }
+ output.push(sprintf_js_1.sprintf('<span class="%s"></span>', classes.join(' ')));
+ if (right.length) {
+ output.push.apply(output, helpers.simpleGroup(right, this.elisionEnd));
+ }
+ else {
+ output.push('');
+ }
+ if (this.is4()) {
+ assert(this.address4 instanceof ipv4_1.Address4);
+ output.pop();
+ output.push(this.address4.groupForV6());
+ }
+ return output.join(':');
+ };
+ // #endregion
+ // #region Regular expressions
+ /**
+ * Generate a regular expression string that can be used to find or validate
+ * all variations of this address
+ * @memberof Address6
+ * @instance
+ * @param {boolean} substringSearch
+ * @returns {string}
+ */
+ Address6.prototype.regularExpressionString = function (substringSearch) {
+ if (substringSearch === void 0) { substringSearch = false; }
+ var output = [];
+ // TODO: revisit why this is necessary
+ var address6 = new Address6(this.correctForm());
+ if (address6.elidedGroups === 0) {
+ // The simple case
+ output.push(regular_expressions_1.simpleRegularExpression(address6.parsedAddress));
+ }
+ else if (address6.elidedGroups === constants6.GROUPS) {
+ // A completely elided address
+ output.push(regular_expressions_1.possibleElisions(constants6.GROUPS));
+ }
+ else {
+ // A partially elided address
+ var halves = address6.address.split('::');
+ if (halves[0].length) {
+ output.push(regular_expressions_1.simpleRegularExpression(halves[0].split(':')));
+ }
+ assert(typeof address6.elidedGroups === 'number');
+ output.push(regular_expressions_1.possibleElisions(address6.elidedGroups, halves[0].length !== 0, halves[1].length !== 0));
+ if (halves[1].length) {
+ output.push(regular_expressions_1.simpleRegularExpression(halves[1].split(':')));
+ }
+ output = [output.join(':')];
+ }
+ if (!substringSearch) {
+ output = __spreadArray(__spreadArray([
+ '(?=^|',
+ regular_expressions_1.ADDRESS_BOUNDARY,
+ '|[^\\w\\:])('
+ ], output), [
+ ')(?=[^\\w\\:]|',
+ regular_expressions_1.ADDRESS_BOUNDARY,
+ '|$)',
+ ]);
+ }
+ return output.join('');
+ };
+ /**
+ * Generate a regular expression that can be used to find or validate all
+ * variations of this address.
+ * @memberof Address6
+ * @instance
+ * @param {boolean} substringSearch
+ * @returns {RegExp}
+ */
+ Address6.prototype.regularExpression = function (substringSearch) {
+ if (substringSearch === void 0) { substringSearch = false; }
+ return new RegExp(this.regularExpressionString(substringSearch), 'i');
+ };
+ return Address6;
+}());
+exports.Address6 = Address6;
+
+},{"./address-error":1,"./common":2,"./ipv4":3,"./v4/constants":5,"./v6/constants":6,"./v6/helpers":7,"./v6/regular-expressions":8,"jsbn":9,"sprintf-js":10}],5:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RE_SUBNET_STRING = exports.RE_ADDRESS = exports.GROUPS = exports.BITS = void 0;
+exports.BITS = 32;
+exports.GROUPS = 4;
+exports.RE_ADDRESS = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/g;
+exports.RE_SUBNET_STRING = /\/\d{1,2}$/;
+
+},{}],6:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.RE_URL_WITH_PORT = exports.RE_URL = exports.RE_ZONE_STRING = exports.RE_SUBNET_STRING = exports.RE_BAD_ADDRESS = exports.RE_BAD_CHARACTERS = exports.TYPES = exports.SCOPES = exports.GROUPS = exports.BITS = void 0;
+exports.BITS = 128;
+exports.GROUPS = 8;
+/**
+ * Represents IPv6 address scopes
+ * @memberof Address6
+ * @static
+ */
+exports.SCOPES = {
+ 0: 'Reserved',
+ 1: 'Interface local',
+ 2: 'Link local',
+ 4: 'Admin local',
+ 5: 'Site local',
+ 8: 'Organization local',
+ 14: 'Global',
+ 15: 'Reserved',
+};
+/**
+ * Represents IPv6 address types
+ * @memberof Address6
+ * @static
+ */
+exports.TYPES = {
+ 'ff01::1/128': 'Multicast (All nodes on this interface)',
+ 'ff01::2/128': 'Multicast (All routers on this interface)',
+ 'ff02::1/128': 'Multicast (All nodes on this link)',
+ 'ff02::2/128': 'Multicast (All routers on this link)',
+ 'ff05::2/128': 'Multicast (All routers in this site)',
+ 'ff02::5/128': 'Multicast (OSPFv3 AllSPF routers)',
+ 'ff02::6/128': 'Multicast (OSPFv3 AllDR routers)',
+ 'ff02::9/128': 'Multicast (RIP routers)',
+ 'ff02::a/128': 'Multicast (EIGRP routers)',
+ 'ff02::d/128': 'Multicast (PIM routers)',
+ 'ff02::16/128': 'Multicast (MLDv2 reports)',
+ 'ff01::fb/128': 'Multicast (mDNSv6)',
+ 'ff02::fb/128': 'Multicast (mDNSv6)',
+ 'ff05::fb/128': 'Multicast (mDNSv6)',
+ 'ff02::1:2/128': 'Multicast (All DHCP servers and relay agents on this link)',
+ 'ff05::1:2/128': 'Multicast (All DHCP servers and relay agents in this site)',
+ 'ff02::1:3/128': 'Multicast (All DHCP servers on this link)',
+ 'ff05::1:3/128': 'Multicast (All DHCP servers in this site)',
+ '::/128': 'Unspecified',
+ '::1/128': 'Loopback',
+ 'ff00::/8': 'Multicast',
+ 'fe80::/10': 'Link-local unicast',
+};
+/**
+ * A regular expression that matches bad characters in an IPv6 address
+ * @memberof Address6
+ * @static
+ */
+exports.RE_BAD_CHARACTERS = /([^0-9a-f:/%])/gi;
+/**
+ * A regular expression that matches an incorrect IPv6 address
+ * @memberof Address6
+ * @static
+ */
+exports.RE_BAD_ADDRESS = /([0-9a-f]{5,}|:{3,}|[^:]:$|^:[^:]|\/$)/gi;
+/**
+ * A regular expression that matches an IPv6 subnet
+ * @memberof Address6
+ * @static
+ */
+exports.RE_SUBNET_STRING = /\/\d{1,3}(?=%|$)/;
+/**
+ * A regular expression that matches an IPv6 zone
+ * @memberof Address6
+ * @static
+ */
+exports.RE_ZONE_STRING = /%.*$/;
+exports.RE_URL = new RegExp(/^\[{0,1}([0-9a-f:]+)\]{0,1}/);
+exports.RE_URL_WITH_PORT = new RegExp(/\[([0-9a-f:]+)\]:([0-9]{1,5})/);
+
+},{}],7:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.simpleGroup = exports.spanLeadingZeroes = exports.spanAll = exports.spanAllZeroes = void 0;
+var sprintf_js_1 = require("sprintf-js");
+/**
+ * @returns {String} the string with all zeroes contained in a <span>
+ */
+function spanAllZeroes(s) {
+ return s.replace(/(0+)/g, '<span class="zero">$1</span>');
+}
+exports.spanAllZeroes = spanAllZeroes;
+/**
+ * @returns {String} the string with each character contained in a <span>
+ */
+function spanAll(s, offset) {
+ if (offset === void 0) { offset = 0; }
+ var letters = s.split('');
+ return letters
+ .map(function (n, i) {
+ return sprintf_js_1.sprintf('<span class="digit value-%s position-%d">%s</span>', n, i + offset, spanAllZeroes(n));
+ } // XXX Use #base-2 .value-0 instead?
+ )
+ .join('');
+}
+exports.spanAll = spanAll;
+function spanLeadingZeroesSimple(group) {
+ return group.replace(/^(0+)/, '<span class="zero">$1</span>');
+}
+/**
+ * @returns {String} the string with leading zeroes contained in a <span>
+ */
+function spanLeadingZeroes(address) {
+ var groups = address.split(':');
+ return groups.map(function (g) { return spanLeadingZeroesSimple(g); }).join(':');
+}
+exports.spanLeadingZeroes = spanLeadingZeroes;
+/**
+ * Groups an address
+ * @returns {String} a grouped address
+ */
+function simpleGroup(addressString, offset) {
+ if (offset === void 0) { offset = 0; }
+ var groups = addressString.split(':');
+ return groups.map(function (g, i) {
+ if (/group-v4/.test(g)) {
+ return g;
+ }
+ return sprintf_js_1.sprintf('<span class="hover-group group-%d">%s</span>', i + offset, spanLeadingZeroesSimple(g));
+ });
+}
+exports.simpleGroup = simpleGroup;
+
+},{"sprintf-js":10}],8:[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.possibleElisions = exports.simpleRegularExpression = exports.ADDRESS_BOUNDARY = exports.padGroup = exports.groupPossibilities = void 0;
+var v6 = __importStar(require("./constants"));
+var sprintf_js_1 = require("sprintf-js");
+function groupPossibilities(possibilities) {
+ return sprintf_js_1.sprintf('(%s)', possibilities.join('|'));
+}
+exports.groupPossibilities = groupPossibilities;
+function padGroup(group) {
+ if (group.length < 4) {
+ return sprintf_js_1.sprintf('0{0,%d}%s', 4 - group.length, group);
+ }
+ return group;
+}
+exports.padGroup = padGroup;
+exports.ADDRESS_BOUNDARY = '[^A-Fa-f0-9:]';
+function simpleRegularExpression(groups) {
+ var zeroIndexes = [];
+ groups.forEach(function (group, i) {
+ var groupInteger = parseInt(group, 16);
+ if (groupInteger === 0) {
+ zeroIndexes.push(i);
+ }
+ });
+ // You can technically elide a single 0, this creates the regular expressions
+ // to match that eventuality
+ var possibilities = zeroIndexes.map(function (zeroIndex) {
+ return groups
+ .map(function (group, i) {
+ if (i === zeroIndex) {
+ var elision = i === 0 || i === v6.GROUPS - 1 ? ':' : '';
+ return groupPossibilities([padGroup(group), elision]);
+ }
+ return padGroup(group);
+ })
+ .join(':');
+ });
+ // The simplest case
+ possibilities.push(groups.map(padGroup).join(':'));
+ return groupPossibilities(possibilities);
+}
+exports.simpleRegularExpression = simpleRegularExpression;
+function possibleElisions(elidedGroups, moreLeft, moreRight) {
+ var left = moreLeft ? '' : ':';
+ var right = moreRight ? '' : ':';
+ var possibilities = [];
+ // 1. elision of everything (::)
+ if (!moreLeft && !moreRight) {
+ possibilities.push('::');
+ }
+ // 2. complete elision of the middle
+ if (moreLeft && moreRight) {
+ possibilities.push('');
+ }
+ if ((moreRight && !moreLeft) || (!moreRight && moreLeft)) {
+ // 3. complete elision of one side
+ possibilities.push(':');
+ }
+ // 4. elision from the left side
+ possibilities.push(sprintf_js_1.sprintf('%s(:0{1,4}){1,%d}', left, elidedGroups - 1));
+ // 5. elision from the right side
+ possibilities.push(sprintf_js_1.sprintf('(0{1,4}:){1,%d}%s', elidedGroups - 1, right));
+ // 6. no elision
+ possibilities.push(sprintf_js_1.sprintf('(0{1,4}:){%d}0{1,4}', elidedGroups - 1));
+ // 7. elision (including sloppy elision) from the middle
+ for (var groups = 1; groups < elidedGroups - 1; groups++) {
+ for (var position = 1; position < elidedGroups - groups; position++) {
+ possibilities.push(sprintf_js_1.sprintf('(0{1,4}:){%d}:(0{1,4}:){%d}0{1,4}', position, elidedGroups - position - groups - 1));
+ }
+ }
+ return groupPossibilities(possibilities);
+}
+exports.possibleElisions = possibleElisions;
+
+},{"./constants":6,"sprintf-js":10}],9:[function(require,module,exports){
+(function(){
+
+ // Copyright (c) 2005 Tom Wu
+ // All Rights Reserved.
+ // See "LICENSE" for details.
+
+ // Basic JavaScript BN library - subset useful for RSA encryption.
+
+ // Bits per digit
+ var dbits;
+
+ // JavaScript engine analysis
+ var canary = 0xdeadbeefcafe;
+ var j_lm = ((canary&0xffffff)==0xefcafe);
+
+ // (public) Constructor
+ function BigInteger(a,b,c) {
+ if(a != null)
+ if("number" == typeof a) this.fromNumber(a,b,c);
+ else if(b == null && "string" != typeof a) this.fromString(a,256);
+ else this.fromString(a,b);
+ }
+
+ // return new, unset BigInteger
+ function nbi() { return new BigInteger(null); }
+
+ // am: Compute w_j += (x*this_i), propagate carries,
+ // c is initial carry, returns final carry.
+ // c < 3*dvalue, x < 2*dvalue, this_i < dvalue
+ // We need to select the fastest one that works in this environment.
+
+ // am1: use a single mult and divide to get the high bits,
+ // max digit bits should be 26 because
+ // max internal value = 2*dvalue^2-2*dvalue (< 2^53)
+ function am1(i,x,w,j,c,n) {
+ while(--n >= 0) {
+ var v = x*this[i++]+w[j]+c;
+ c = Math.floor(v/0x4000000);
+ w[j++] = v&0x3ffffff;
+ }
+ return c;
+ }
+ // am2 avoids a big mult-and-extract completely.
+ // Max digit bits should be <= 30 because we do bitwise ops
+ // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
+ function am2(i,x,w,j,c,n) {
+ var xl = x&0x7fff, xh = x>>15;
+ while(--n >= 0) {
+ var l = this[i]&0x7fff;
+ var h = this[i++]>>15;
+ var m = xh*l+h*xl;
+ l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);
+ c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
+ w[j++] = l&0x3fffffff;
+ }
+ return c;
+ }
+ // Alternately, set max digit bits to 28 since some
+ // browsers slow down when dealing with 32-bit numbers.
+ function am3(i,x,w,j,c,n) {
+ var xl = x&0x3fff, xh = x>>14;
+ while(--n >= 0) {
+ var l = this[i]&0x3fff;
+ var h = this[i++]>>14;
+ var m = xh*l+h*xl;
+ l = xl*l+((m&0x3fff)<<14)+w[j]+c;
+ c = (l>>28)+(m>>14)+xh*h;
+ w[j++] = l&0xfffffff;
+ }
+ return c;
+ }
+ var inBrowser = typeof navigator !== "undefined";
+ if(inBrowser && j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
+ BigInteger.prototype.am = am2;
+ dbits = 30;
+ }
+ else if(inBrowser && j_lm && (navigator.appName != "Netscape")) {
+ BigInteger.prototype.am = am1;
+ dbits = 26;
+ }
+ else { // Mozilla/Netscape seems to prefer am3
+ BigInteger.prototype.am = am3;
+ dbits = 28;
+ }
+
+ BigInteger.prototype.DB = dbits;
+ BigInteger.prototype.DM = ((1<<dbits)-1);
+ BigInteger.prototype.DV = (1<<dbits);
+
+ var BI_FP = 52;
+ BigInteger.prototype.FV = Math.pow(2,BI_FP);
+ BigInteger.prototype.F1 = BI_FP-dbits;
+ BigInteger.prototype.F2 = 2*dbits-BI_FP;
+
+ // Digit conversions
+ var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
+ var BI_RC = new Array();
+ var rr,vv;
+ rr = "0".charCodeAt(0);
+ for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
+ rr = "a".charCodeAt(0);
+ for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
+ rr = "A".charCodeAt(0);
+ for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
+
+ function int2char(n) { return BI_RM.charAt(n); }
+ function intAt(s,i) {
+ var c = BI_RC[s.charCodeAt(i)];
+ return (c==null)?-1:c;
+ }
+
+ // (protected) copy this to r
+ function bnpCopyTo(r) {
+ for(var i = this.t-1; i >= 0; --i) r[i] = this[i];
+ r.t = this.t;
+ r.s = this.s;
+ }
+
+ // (protected) set from integer value x, -DV <= x < DV
+ function bnpFromInt(x) {
+ this.t = 1;
+ this.s = (x<0)?-1:0;
+ if(x > 0) this[0] = x;
+ else if(x < -1) this[0] = x+this.DV;
+ else this.t = 0;
+ }
+
+ // return bigint initialized to value
+ function nbv(i) { var r = nbi(); r.fromInt(i); return r; }
+
+ // (protected) set from string and radix
+ function bnpFromString(s,b) {
+ var k;
+ if(b == 16) k = 4;
+ else if(b == 8) k = 3;
+ else if(b == 256) k = 8; // byte array
+ else if(b == 2) k = 1;
+ else if(b == 32) k = 5;
+ else if(b == 4) k = 2;
+ else { this.fromRadix(s,b); return; }
+ this.t = 0;
+ this.s = 0;
+ var i = s.length, mi = false, sh = 0;
+ while(--i >= 0) {
+ var x = (k==8)?s[i]&0xff:intAt(s,i);
+ if(x < 0) {
+ if(s.charAt(i) == "-") mi = true;
+ continue;
+ }
+ mi = false;
+ if(sh == 0)
+ this[this.t++] = x;
+ else if(sh+k > this.DB) {
+ this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;
+ this[this.t++] = (x>>(this.DB-sh));
+ }
+ else
+ this[this.t-1] |= x<<sh;
+ sh += k;
+ if(sh >= this.DB) sh -= this.DB;
+ }
+ if(k == 8 && (s[0]&0x80) != 0) {
+ this.s = -1;
+ if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;
+ }
+ this.clamp();
+ if(mi) BigInteger.ZERO.subTo(this,this);
+ }
+
+ // (protected) clamp off excess high words
+ function bnpClamp() {
+ var c = this.s&this.DM;
+ while(this.t > 0 && this[this.t-1] == c) --this.t;
+ }
+
+ // (public) return string representation in given radix
+ function bnToString(b) {
+ if(this.s < 0) return "-"+this.negate().toString(b);
+ var k;
+ if(b == 16) k = 4;
+ else if(b == 8) k = 3;
+ else if(b == 2) k = 1;
+ else if(b == 32) k = 5;
+ else if(b == 4) k = 2;
+ else return this.toRadix(b);
+ var km = (1<<k)-1, d, m = false, r = "", i = this.t;
+ var p = this.DB-(i*this.DB)%k;
+ if(i-- > 0) {
+ if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }
+ while(i >= 0) {
+ if(p < k) {
+ d = (this[i]&((1<<p)-1))<<(k-p);
+ d |= this[--i]>>(p+=this.DB-k);
+ }
+ else {
+ d = (this[i]>>(p-=k))&km;
+ if(p <= 0) { p += this.DB; --i; }
+ }
+ if(d > 0) m = true;
+ if(m) r += int2char(d);
+ }
+ }
+ return m?r:"0";
+ }
+
+ // (public) -this
+ function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }
+
+ // (public) |this|
+ function bnAbs() { return (this.s<0)?this.negate():this; }
+
+ // (public) return + if this > a, - if this < a, 0 if equal
+ function bnCompareTo(a) {
+ var r = this.s-a.s;
+ if(r != 0) return r;
+ var i = this.t;
+ r = i-a.t;
+ if(r != 0) return (this.s<0)?-r:r;
+ while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;
+ return 0;
+ }
+
+ // returns bit length of the integer x
+ function nbits(x) {
+ var r = 1, t;
+ if((t=x>>>16) != 0) { x = t; r += 16; }
+ if((t=x>>8) != 0) { x = t; r += 8; }
+ if((t=x>>4) != 0) { x = t; r += 4; }
+ if((t=x>>2) != 0) { x = t; r += 2; }
+ if((t=x>>1) != 0) { x = t; r += 1; }
+ return r;
+ }
+
+ // (public) return the number of bits in "this"
+ function bnBitLength() {
+ if(this.t <= 0) return 0;
+ return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));
+ }
+
+ // (protected) r = this << n*DB
+ function bnpDLShiftTo(n,r) {
+ var i;
+ for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];
+ for(i = n-1; i >= 0; --i) r[i] = 0;
+ r.t = this.t+n;
+ r.s = this.s;
+ }
+
+ // (protected) r = this >> n*DB
+ function bnpDRShiftTo(n,r) {
+ for(var i = n; i < this.t; ++i) r[i-n] = this[i];
+ r.t = Math.max(this.t-n,0);
+ r.s = this.s;
+ }
+
+ // (protected) r = this << n
+ function bnpLShiftTo(n,r) {
+ var bs = n%this.DB;
+ var cbs = this.DB-bs;
+ var bm = (1<<cbs)-1;
+ var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;
+ for(i = this.t-1; i >= 0; --i) {
+ r[i+ds+1] = (this[i]>>cbs)|c;
+ c = (this[i]&bm)<<bs;
+ }
+ for(i = ds-1; i >= 0; --i) r[i] = 0;
+ r[ds] = c;
+ r.t = this.t+ds+1;
+ r.s = this.s;
+ r.clamp();
+ }
+
+ // (protected) r = this >> n
+ function bnpRShiftTo(n,r) {
+ r.s = this.s;
+ var ds = Math.floor(n/this.DB);
+ if(ds >= this.t) { r.t = 0; return; }
+ var bs = n%this.DB;
+ var cbs = this.DB-bs;
+ var bm = (1<<bs)-1;
+ r[0] = this[ds]>>bs;
+ for(var i = ds+1; i < this.t; ++i) {
+ r[i-ds-1] |= (this[i]&bm)<<cbs;
+ r[i-ds] = this[i]>>bs;
+ }
+ if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;
+ r.t = this.t-ds;
+ r.clamp();
+ }
+
+ // (protected) r = this - a
+ function bnpSubTo(a,r) {
+ var i = 0, c = 0, m = Math.min(a.t,this.t);
+ while(i < m) {
+ c += this[i]-a[i];
+ r[i++] = c&this.DM;
+ c >>= this.DB;
+ }
+ if(a.t < this.t) {
+ c -= a.s;
+ while(i < this.t) {
+ c += this[i];
+ r[i++] = c&this.DM;
+ c >>= this.DB;
+ }
+ c += this.s;
+ }
+ else {
+ c += this.s;
+ while(i < a.t) {
+ c -= a[i];
+ r[i++] = c&this.DM;
+ c >>= this.DB;
+ }
+ c -= a.s;
+ }
+ r.s = (c<0)?-1:0;
+ if(c < -1) r[i++] = this.DV+c;
+ else if(c > 0) r[i++] = c;
+ r.t = i;
+ r.clamp();
+ }
+
+ // (protected) r = this * a, r != this,a (HAC 14.12)
+ // "this" should be the larger one if appropriate.
+ function bnpMultiplyTo(a,r) {
+ var x = this.abs(), y = a.abs();
+ var i = x.t;
+ r.t = i+y.t;
+ while(--i >= 0) r[i] = 0;
+ for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);
+ r.s = 0;
+ r.clamp();
+ if(this.s != a.s) BigInteger.ZERO.subTo(r,r);
+ }
+
+ // (protected) r = this^2, r != this (HAC 14.16)
+ function bnpSquareTo(r) {
+ var x = this.abs();
+ var i = r.t = 2*x.t;
+ while(--i >= 0) r[i] = 0;
+ for(i = 0; i < x.t-1; ++i) {
+ var c = x.am(i,x[i],r,2*i,0,1);
+ if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {
+ r[i+x.t] -= x.DV;
+ r[i+x.t+1] = 1;
+ }
+ }
+ if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);
+ r.s = 0;
+ r.clamp();
+ }
+
+ // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
+ // r != q, this != m. q or r may be null.
+ function bnpDivRemTo(m,q,r) {
+ var pm = m.abs();
+ if(pm.t <= 0) return;
+ var pt = this.abs();
+ if(pt.t < pm.t) {
+ if(q != null) q.fromInt(0);
+ if(r != null) this.copyTo(r);
+ return;
+ }
+ if(r == null) r = nbi();
+ var y = nbi(), ts = this.s, ms = m.s;
+ var nsh = this.DB-nbits(pm[pm.t-1]); // normalize modulus
+ if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }
+ else { pm.copyTo(y); pt.copyTo(r); }
+ var ys = y.t;
+ var y0 = y[ys-1];
+ if(y0 == 0) return;
+ var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);
+ var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;
+ var i = r.t, j = i-ys, t = (q==null)?nbi():q;
+ y.dlShiftTo(j,t);
+ if(r.compareTo(t) >= 0) {
+ r[r.t++] = 1;
+ r.subTo(t,r);
+ }
+ BigInteger.ONE.dlShiftTo(ys,t);
+ t.subTo(y,y); // "negative" y so we can replace sub with am later
+ while(y.t < ys) y[y.t++] = 0;
+ while(--j >= 0) {
+ // Estimate quotient digit
+ var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);
+ if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) { // Try it out
+ y.dlShiftTo(j,t);
+ r.subTo(t,r);
+ while(r[i] < --qd) r.subTo(t,r);
+ }
+ }
+ if(q != null) {
+ r.drShiftTo(ys,q);
+ if(ts != ms) BigInteger.ZERO.subTo(q,q);
+ }
+ r.t = ys;
+ r.clamp();
+ if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder
+ if(ts < 0) BigInteger.ZERO.subTo(r,r);
+ }
+
+ // (public) this mod a
+ function bnMod(a) {
+ var r = nbi();
+ this.abs().divRemTo(a,null,r);
+ if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);
+ return r;
+ }
+
+ // Modular reduction using "classic" algorithm
+ function Classic(m) { this.m = m; }
+ function cConvert(x) {
+ if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
+ else return x;
+ }
+ function cRevert(x) { return x; }
+ function cReduce(x) { x.divRemTo(this.m,null,x); }
+ function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
+ function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
+
+ Classic.prototype.convert = cConvert;
+ Classic.prototype.revert = cRevert;
+ Classic.prototype.reduce = cReduce;
+ Classic.prototype.mulTo = cMulTo;
+ Classic.prototype.sqrTo = cSqrTo;
+
+ // (protected) return "-1/this % 2^DB"; useful for Mont. reduction
+ // justification:
+ // xy == 1 (mod m)
+ // xy = 1+km
+ // xy(2-xy) = (1+km)(1-km)
+ // x[y(2-xy)] = 1-k^2m^2
+ // x[y(2-xy)] == 1 (mod m^2)
+ // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
+ // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
+ // JS multiply "overflows" differently from C/C++, so care is needed here.
+ function bnpInvDigit() {
+ if(this.t < 1) return 0;
+ var x = this[0];
+ if((x&1) == 0) return 0;
+ var y = x&3; // y == 1/x mod 2^2
+ y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4
+ y = (y*(2-(x&0xff)*y))&0xff; // y == 1/x mod 2^8
+ y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16
+ // last step - calculate inverse mod DV directly;
+ // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
+ y = (y*(2-x*y%this.DV))%this.DV; // y == 1/x mod 2^dbits
+ // we really want the negative inverse, and -DV < y < DV
+ return (y>0)?this.DV-y:-y;
+ }
+
+ // Montgomery reduction
+ function Montgomery(m) {
+ this.m = m;
+ this.mp = m.invDigit();
+ this.mpl = this.mp&0x7fff;
+ this.mph = this.mp>>15;
+ this.um = (1<<(m.DB-15))-1;
+ this.mt2 = 2*m.t;
+ }
+
+ // xR mod m
+ function montConvert(x) {
+ var r = nbi();
+ x.abs().dlShiftTo(this.m.t,r);
+ r.divRemTo(this.m,null,r);
+ if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);
+ return r;
+ }
+
+ // x/R mod m
+ function montRevert(x) {
+ var r = nbi();
+ x.copyTo(r);
+ this.reduce(r);
+ return r;
+ }
+
+ // x = x/R mod m (HAC 14.32)
+ function montReduce(x) {
+ while(x.t <= this.mt2) // pad x so am has enough room later
+ x[x.t++] = 0;
+ for(var i = 0; i < this.m.t; ++i) {
+ // faster way of calculating u0 = x[i]*mp mod DV
+ var j = x[i]&0x7fff;
+ var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;
+ // use am to combine the multiply-shift-add into one call
+ j = i+this.m.t;
+ x[j] += this.m.am(0,u0,x,i,0,this.m.t);
+ // propagate carry
+ while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }
+ }
+ x.clamp();
+ x.drShiftTo(this.m.t,x);
+ if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
+ }
+
+ // r = "x^2/R mod m"; x != r
+ function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
+
+ // r = "xy/R mod m"; x,y != r
+ function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
+
+ Montgomery.prototype.convert = montConvert;
+ Montgomery.prototype.revert = montRevert;
+ Montgomery.prototype.reduce = montReduce;
+ Montgomery.prototype.mulTo = montMulTo;
+ Montgomery.prototype.sqrTo = montSqrTo;
+
+ // (protected) true iff this is even
+ function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }
+
+ // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
+ function bnpExp(e,z) {
+ if(e > 0xffffffff || e < 1) return BigInteger.ONE;
+ var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;
+ g.copyTo(r);
+ while(--i >= 0) {
+ z.sqrTo(r,r2);
+ if((e&(1<<i)) > 0) z.mulTo(r2,g,r);
+ else { var t = r; r = r2; r2 = t; }
+ }
+ return z.revert(r);
+ }
+
+ // (public) this^e % m, 0 <= e < 2^32
+ function bnModPowInt(e,m) {
+ var z;
+ if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
+ return this.exp(e,z);
+ }
+
+ // protected
+ BigInteger.prototype.copyTo = bnpCopyTo;
+ BigInteger.prototype.fromInt = bnpFromInt;
+ BigInteger.prototype.fromString = bnpFromString;
+ BigInteger.prototype.clamp = bnpClamp;
+ BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
+ BigInteger.prototype.drShiftTo = bnpDRShiftTo;
+ BigInteger.prototype.lShiftTo = bnpLShiftTo;
+ BigInteger.prototype.rShiftTo = bnpRShiftTo;
+ BigInteger.prototype.subTo = bnpSubTo;
+ BigInteger.prototype.multiplyTo = bnpMultiplyTo;
+ BigInteger.prototype.squareTo = bnpSquareTo;
+ BigInteger.prototype.divRemTo = bnpDivRemTo;
+ BigInteger.prototype.invDigit = bnpInvDigit;
+ BigInteger.prototype.isEven = bnpIsEven;
+ BigInteger.prototype.exp = bnpExp;
+
+ // public
+ BigInteger.prototype.toString = bnToString;
+ BigInteger.prototype.negate = bnNegate;
+ BigInteger.prototype.abs = bnAbs;
+ BigInteger.prototype.compareTo = bnCompareTo;
+ BigInteger.prototype.bitLength = bnBitLength;
+ BigInteger.prototype.mod = bnMod;
+ BigInteger.prototype.modPowInt = bnModPowInt;
+
+ // "constants"
+ BigInteger.ZERO = nbv(0);
+ BigInteger.ONE = nbv(1);
+
+ // Copyright (c) 2005-2009 Tom Wu
+ // All Rights Reserved.
+ // See "LICENSE" for details.
+
+ // Extended JavaScript BN functions, required for RSA private ops.
+
+ // Version 1.1: new BigInteger("0", 10) returns "proper" zero
+ // Version 1.2: square() API, isProbablePrime fix
+
+ // (public)
+ function bnClone() { var r = nbi(); this.copyTo(r); return r; }
+
+ // (public) return value as integer
+ function bnIntValue() {
+ if(this.s < 0) {
+ if(this.t == 1) return this[0]-this.DV;
+ else if(this.t == 0) return -1;
+ }
+ else if(this.t == 1) return this[0];
+ else if(this.t == 0) return 0;
+ // assumes 16 < DB < 32
+ return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];
+ }
+
+ // (public) return value as byte
+ function bnByteValue() { return (this.t==0)?this.s:(this[0]<<24)>>24; }
+
+ // (public) return value as short (assumes DB>=16)
+ function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; }
+
+ // (protected) return x s.t. r^x < DV
+ function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }
+
+ // (public) 0 if this == 0, 1 if this > 0
+ function bnSigNum() {
+ if(this.s < 0) return -1;
+ else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;
+ else return 1;
+ }
+
+ // (protected) convert to radix string
+ function bnpToRadix(b) {
+ if(b == null) b = 10;
+ if(this.signum() == 0 || b < 2 || b > 36) return "0";
+ var cs = this.chunkSize(b);
+ var a = Math.pow(b,cs);
+ var d = nbv(a), y = nbi(), z = nbi(), r = "";
+ this.divRemTo(d,y,z);
+ while(y.signum() > 0) {
+ r = (a+z.intValue()).toString(b).substr(1) + r;
+ y.divRemTo(d,y,z);
+ }
+ return z.intValue().toString(b) + r;
+ }
+
+ // (protected) convert from radix string
+ function bnpFromRadix(s,b) {
+ this.fromInt(0);
+ if(b == null) b = 10;
+ var cs = this.chunkSize(b);
+ var d = Math.pow(b,cs), mi = false, j = 0, w = 0;
+ for(var i = 0; i < s.length; ++i) {
+ var x = intAt(s,i);
+ if(x < 0) {
+ if(s.charAt(i) == "-" && this.signum() == 0) mi = true;
+ continue;
+ }
+ w = b*w+x;
+ if(++j >= cs) {
+ this.dMultiply(d);
+ this.dAddOffset(w,0);
+ j = 0;
+ w = 0;
+ }
+ }
+ if(j > 0) {
+ this.dMultiply(Math.pow(b,j));
+ this.dAddOffset(w,0);
+ }
+ if(mi) BigInteger.ZERO.subTo(this,this);
+ }
+
+ // (protected) alternate constructor
+ function bnpFromNumber(a,b,c) {
+ if("number" == typeof b) {
+ // new BigInteger(int,int,RNG)
+ if(a < 2) this.fromInt(1);
+ else {
+ this.fromNumber(a,c);
+ if(!this.testBit(a-1)) // force MSB set
+ this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);
+ if(this.isEven()) this.dAddOffset(1,0); // force odd
+ while(!this.isProbablePrime(b)) {
+ this.dAddOffset(2,0);
+ if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);
+ }
+ }
+ }
+ else {
+ // new BigInteger(int,RNG)
+ var x = new Array(), t = a&7;
+ x.length = (a>>3)+1;
+ b.nextBytes(x);
+ if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;
+ this.fromString(x,256);
+ }
+ }
+
+ // (public) convert to bigendian byte array
+ function bnToByteArray() {
+ var i = this.t, r = new Array();
+ r[0] = this.s;
+ var p = this.DB-(i*this.DB)%8, d, k = 0;
+ if(i-- > 0) {
+ if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p)
+ r[k++] = d|(this.s<<(this.DB-p));
+ while(i >= 0) {
+ if(p < 8) {
+ d = (this[i]&((1<<p)-1))<<(8-p);
+ d |= this[--i]>>(p+=this.DB-8);
+ }
+ else {
+ d = (this[i]>>(p-=8))&0xff;
+ if(p <= 0) { p += this.DB; --i; }
+ }
+ if((d&0x80) != 0) d |= -256;
+ if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;
+ if(k > 0 || d != this.s) r[k++] = d;
+ }
+ }
+ return r;
+ }
+
+ function bnEquals(a) { return(this.compareTo(a)==0); }
+ function bnMin(a) { return(this.compareTo(a)<0)?this:a; }
+ function bnMax(a) { return(this.compareTo(a)>0)?this:a; }
+
+ // (protected) r = this op a (bitwise)
+ function bnpBitwiseTo(a,op,r) {
+ var i, f, m = Math.min(a.t,this.t);
+ for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]);
+ if(a.t < this.t) {
+ f = a.s&this.DM;
+ for(i = m; i < this.t; ++i) r[i] = op(this[i],f);
+ r.t = this.t;
+ }
+ else {
+ f = this.s&this.DM;
+ for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);
+ r.t = a.t;
+ }
+ r.s = op(this.s,a.s);
+ r.clamp();
+ }
+
+ // (public) this & a
+ function op_and(x,y) { return x&y; }
+ function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }
+
+ // (public) this | a
+ function op_or(x,y) { return x|y; }
+ function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }
+
+ // (public) this ^ a
+ function op_xor(x,y) { return x^y; }
+ function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }
+
+ // (public) this & ~a
+ function op_andnot(x,y) { return x&~y; }
+ function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }
+
+ // (public) ~this
+ function bnNot() {
+ var r = nbi();
+ for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i];
+ r.t = this.t;
+ r.s = ~this.s;
+ return r;
+ }
+
+ // (public) this << n
+ function bnShiftLeft(n) {
+ var r = nbi();
+ if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);
+ return r;
+ }
+
+ // (public) this >> n
+ function bnShiftRight(n) {
+ var r = nbi();
+ if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);
+ return r;
+ }
+
+ // return index of lowest 1-bit in x, x < 2^31
+ function lbit(x) {
+ if(x == 0) return -1;
+ var r = 0;
+ if((x&0xffff) == 0) { x >>= 16; r += 16; }
+ if((x&0xff) == 0) { x >>= 8; r += 8; }
+ if((x&0xf) == 0) { x >>= 4; r += 4; }
+ if((x&3) == 0) { x >>= 2; r += 2; }
+ if((x&1) == 0) ++r;
+ return r;
+ }
+
+ // (public) returns index of lowest 1-bit (or -1 if none)
+ function bnGetLowestSetBit() {
+ for(var i = 0; i < this.t; ++i)
+ if(this[i] != 0) return i*this.DB+lbit(this[i]);
+ if(this.s < 0) return this.t*this.DB;
+ return -1;
+ }
+
+ // return number of 1 bits in x
+ function cbit(x) {
+ var r = 0;
+ while(x != 0) { x &= x-1; ++r; }
+ return r;
+ }
+
+ // (public) return number of set bits
+ function bnBitCount() {
+ var r = 0, x = this.s&this.DM;
+ for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x);
+ return r;
+ }
+
+ // (public) true iff nth bit is set
+ function bnTestBit(n) {
+ var j = Math.floor(n/this.DB);
+ if(j >= this.t) return(this.s!=0);
+ return((this[j]&(1<<(n%this.DB)))!=0);
+ }
+
+ // (protected) this op (1<<n)
+ function bnpChangeBit(n,op) {
+ var r = BigInteger.ONE.shiftLeft(n);
+ this.bitwiseTo(r,op,r);
+ return r;
+ }
+
+ // (public) this | (1<<n)
+ function bnSetBit(n) { return this.changeBit(n,op_or); }
+
+ // (public) this & ~(1<<n)
+ function bnClearBit(n) { return this.changeBit(n,op_andnot); }
+
+ // (public) this ^ (1<<n)
+ function bnFlipBit(n) { return this.changeBit(n,op_xor); }
+
+ // (protected) r = this + a
+ function bnpAddTo(a,r) {
+ var i = 0, c = 0, m = Math.min(a.t,this.t);
+ while(i < m) {
+ c += this[i]+a[i];
+ r[i++] = c&this.DM;
+ c >>= this.DB;
+ }
+ if(a.t < this.t) {
+ c += a.s;
+ while(i < this.t) {
+ c += this[i];
+ r[i++] = c&this.DM;
+ c >>= this.DB;
+ }
+ c += this.s;
+ }
+ else {
+ c += this.s;
+ while(i < a.t) {
+ c += a[i];
+ r[i++] = c&this.DM;
+ c >>= this.DB;
+ }
+ c += a.s;
+ }
+ r.s = (c<0)?-1:0;
+ if(c > 0) r[i++] = c;
+ else if(c < -1) r[i++] = this.DV+c;
+ r.t = i;
+ r.clamp();
+ }
+
+ // (public) this + a
+ function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }
+
+ // (public) this - a
+ function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }
+
+ // (public) this * a
+ function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }
+
+ // (public) this^2
+ function bnSquare() { var r = nbi(); this.squareTo(r); return r; }
+
+ // (public) this / a
+ function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }
+
+ // (public) this % a
+ function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }
+
+ // (public) [this/a,this%a]
+ function bnDivideAndRemainder(a) {
+ var q = nbi(), r = nbi();
+ this.divRemTo(a,q,r);
+ return new Array(q,r);
+ }
+
+ // (protected) this *= n, this >= 0, 1 < n < DV
+ function bnpDMultiply(n) {
+ this[this.t] = this.am(0,n-1,this,0,0,this.t);
+ ++this.t;
+ this.clamp();
+ }
+
+ // (protected) this += n << w words, this >= 0
+ function bnpDAddOffset(n,w) {
+ if(n == 0) return;
+ while(this.t <= w) this[this.t++] = 0;
+ this[w] += n;
+ while(this[w] >= this.DV) {
+ this[w] -= this.DV;
+ if(++w >= this.t) this[this.t++] = 0;
+ ++this[w];
+ }
+ }
+
+ // A "null" reducer
+ function NullExp() {}
+ function nNop(x) { return x; }
+ function nMulTo(x,y,r) { x.multiplyTo(y,r); }
+ function nSqrTo(x,r) { x.squareTo(r); }
+
+ NullExp.prototype.convert = nNop;
+ NullExp.prototype.revert = nNop;
+ NullExp.prototype.mulTo = nMulTo;
+ NullExp.prototype.sqrTo = nSqrTo;
+
+ // (public) this^e
+ function bnPow(e) { return this.exp(e,new NullExp()); }
+
+ // (protected) r = lower n words of "this * a", a.t <= n
+ // "this" should be the larger one if appropriate.
+ function bnpMultiplyLowerTo(a,n,r) {
+ var i = Math.min(this.t+a.t,n);
+ r.s = 0; // assumes a,this >= 0
+ r.t = i;
+ while(i > 0) r[--i] = 0;
+ var j;
+ for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t);
+ for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i);
+ r.clamp();
+ }
+
+ // (protected) r = "this * a" without lower n words, n > 0
+ // "this" should be the larger one if appropriate.
+ function bnpMultiplyUpperTo(a,n,r) {
+ --n;
+ var i = r.t = this.t+a.t-n;
+ r.s = 0; // assumes a,this >= 0
+ while(--i >= 0) r[i] = 0;
+ for(i = Math.max(n-this.t,0); i < a.t; ++i)
+ r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n);
+ r.clamp();
+ r.drShiftTo(1,r);
+ }
+
+ // Barrett modular reduction
+ function Barrett(m) {
+ // setup Barrett
+ this.r2 = nbi();
+ this.q3 = nbi();
+ BigInteger.ONE.dlShiftTo(2*m.t,this.r2);
+ this.mu = this.r2.divide(m);
+ this.m = m;
+ }
+
+ function barrettConvert(x) {
+ if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);
+ else if(x.compareTo(this.m) < 0) return x;
+ else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
+ }
+
+ function barrettRevert(x) { return x; }
+
+ // x = x mod m (HAC 14.42)
+ function barrettReduce(x) {
+ x.drShiftTo(this.m.t-1,this.r2);
+ if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }
+ this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);
+ this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);
+ while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);
+ x.subTo(this.r2,x);
+ while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
+ }
+
+ // r = x^2 mod m; x != r
+ function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
+
+ // r = x*y mod m; x,y != r
+ function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
+
+ Barrett.prototype.convert = barrettConvert;
+ Barrett.prototype.revert = barrettRevert;
+ Barrett.prototype.reduce = barrettReduce;
+ Barrett.prototype.mulTo = barrettMulTo;
+ Barrett.prototype.sqrTo = barrettSqrTo;
+
+ // (public) this^e % m (HAC 14.85)
+ function bnModPow(e,m) {
+ var i = e.bitLength(), k, r = nbv(1), z;
+ if(i <= 0) return r;
+ else if(i < 18) k = 1;
+ else if(i < 48) k = 3;
+ else if(i < 144) k = 4;
+ else if(i < 768) k = 5;
+ else k = 6;
+ if(i < 8)
+ z = new Classic(m);
+ else if(m.isEven())
+ z = new Barrett(m);
+ else
+ z = new Montgomery(m);
+
+ // precomputation
+ var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;
+ g[1] = z.convert(this);
+ if(k > 1) {
+ var g2 = nbi();
+ z.sqrTo(g[1],g2);
+ while(n <= km) {
+ g[n] = nbi();
+ z.mulTo(g2,g[n-2],g[n]);
+ n += 2;
+ }
+ }
+
+ var j = e.t-1, w, is1 = true, r2 = nbi(), t;
+ i = nbits(e[j])-1;
+ while(j >= 0) {
+ if(i >= k1) w = (e[j]>>(i-k1))&km;
+ else {
+ w = (e[j]&((1<<(i+1))-1))<<(k1-i);
+ if(j > 0) w |= e[j-1]>>(this.DB+i-k1);
+ }
+
+ n = k;
+ while((w&1) == 0) { w >>= 1; --n; }
+ if((i -= n) < 0) { i += this.DB; --j; }
+ if(is1) { // ret == 1, don't bother squaring or multiplying it
+ g[w].copyTo(r);
+ is1 = false;
+ }
+ else {
+ while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }
+ if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }
+ z.mulTo(r2,g[w],r);
+ }
+
+ while(j >= 0 && (e[j]&(1<<i)) == 0) {
+ z.sqrTo(r,r2); t = r; r = r2; r2 = t;
+ if(--i < 0) { i = this.DB-1; --j; }
+ }
+ }
+ return z.revert(r);
+ }
+
+ // (public) gcd(this,a) (HAC 14.54)
+ function bnGCD(a) {
+ var x = (this.s<0)?this.negate():this.clone();
+ var y = (a.s<0)?a.negate():a.clone();
+ if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }
+ var i = x.getLowestSetBit(), g = y.getLowestSetBit();
+ if(g < 0) return x;
+ if(i < g) g = i;
+ if(g > 0) {
+ x.rShiftTo(g,x);
+ y.rShiftTo(g,y);
+ }
+ while(x.signum() > 0) {
+ if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);
+ if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);
+ if(x.compareTo(y) >= 0) {
+ x.subTo(y,x);
+ x.rShiftTo(1,x);
+ }
+ else {
+ y.subTo(x,y);
+ y.rShiftTo(1,y);
+ }
+ }
+ if(g > 0) y.lShiftTo(g,y);
+ return y;
+ }
+
+ // (protected) this % n, n < 2^26
+ function bnpModInt(n) {
+ if(n <= 0) return 0;
+ var d = this.DV%n, r = (this.s<0)?n-1:0;
+ if(this.t > 0)
+ if(d == 0) r = this[0]%n;
+ else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n;
+ return r;
+ }
+
+ // (public) 1/this % m (HAC 14.61)
+ function bnModInverse(m) {
+ var ac = m.isEven();
+ if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;
+ var u = m.clone(), v = this.clone();
+ var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
+ while(u.signum() != 0) {
+ while(u.isEven()) {
+ u.rShiftTo(1,u);
+ if(ac) {
+ if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
+ a.rShiftTo(1,a);
+ }
+ else if(!b.isEven()) b.subTo(m,b);
+ b.rShiftTo(1,b);
+ }
+ while(v.isEven()) {
+ v.rShiftTo(1,v);
+ if(ac) {
+ if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
+ c.rShiftTo(1,c);
+ }
+ else if(!d.isEven()) d.subTo(m,d);
+ d.rShiftTo(1,d);
+ }
+ if(u.compareTo(v) >= 0) {
+ u.subTo(v,u);
+ if(ac) a.subTo(c,a);
+ b.subTo(d,b);
+ }
+ else {
+ v.subTo(u,v);
+ if(ac) c.subTo(a,c);
+ d.subTo(b,d);
+ }
+ }
+ if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
+ if(d.compareTo(m) >= 0) return d.subtract(m);
+ if(d.signum() < 0) d.addTo(m,d); else return d;
+ if(d.signum() < 0) return d.add(m); else return d;
+ }
+
+ var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];
+ var lplim = (1<<26)/lowprimes[lowprimes.length-1];
+
+ // (public) test primality with certainty >= 1-.5^t
+ function bnIsProbablePrime(t) {
+ var i, x = this.abs();
+ if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) {
+ for(i = 0; i < lowprimes.length; ++i)
+ if(x[0] == lowprimes[i]) return true;
+ return false;
+ }
+ if(x.isEven()) return false;
+ i = 1;
+ while(i < lowprimes.length) {
+ var m = lowprimes[i], j = i+1;
+ while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];
+ m = x.modInt(m);
+ while(i < j) if(m%lowprimes[i++] == 0) return false;
+ }
+ return x.millerRabin(t);
+ }
+
+ // (protected) true if probably prime (HAC 4.24, Miller-Rabin)
+ function bnpMillerRabin(t) {
+ var n1 = this.subtract(BigInteger.ONE);
+ var k = n1.getLowestSetBit();
+ if(k <= 0) return false;
+ var r = n1.shiftRight(k);
+ t = (t+1)>>1;
+ if(t > lowprimes.length) t = lowprimes.length;
+ var a = nbi();
+ for(var i = 0; i < t; ++i) {
+ //Pick bases at random, instead of starting at 2
+ a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);
+ var y = a.modPow(r,this);
+ if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
+ var j = 1;
+ while(j++ < k && y.compareTo(n1) != 0) {
+ y = y.modPowInt(2,this);
+ if(y.compareTo(BigInteger.ONE) == 0) return false;
+ }
+ if(y.compareTo(n1) != 0) return false;
+ }
+ }
+ return true;
+ }
+
+ // protected
+ BigInteger.prototype.chunkSize = bnpChunkSize;
+ BigInteger.prototype.toRadix = bnpToRadix;
+ BigInteger.prototype.fromRadix = bnpFromRadix;
+ BigInteger.prototype.fromNumber = bnpFromNumber;
+ BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
+ BigInteger.prototype.changeBit = bnpChangeBit;
+ BigInteger.prototype.addTo = bnpAddTo;
+ BigInteger.prototype.dMultiply = bnpDMultiply;
+ BigInteger.prototype.dAddOffset = bnpDAddOffset;
+ BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
+ BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
+ BigInteger.prototype.modInt = bnpModInt;
+ BigInteger.prototype.millerRabin = bnpMillerRabin;
+
+ // public
+ BigInteger.prototype.clone = bnClone;
+ BigInteger.prototype.intValue = bnIntValue;
+ BigInteger.prototype.byteValue = bnByteValue;
+ BigInteger.prototype.shortValue = bnShortValue;
+ BigInteger.prototype.signum = bnSigNum;
+ BigInteger.prototype.toByteArray = bnToByteArray;
+ BigInteger.prototype.equals = bnEquals;
+ BigInteger.prototype.min = bnMin;
+ BigInteger.prototype.max = bnMax;
+ BigInteger.prototype.and = bnAnd;
+ BigInteger.prototype.or = bnOr;
+ BigInteger.prototype.xor = bnXor;
+ BigInteger.prototype.andNot = bnAndNot;
+ BigInteger.prototype.not = bnNot;
+ BigInteger.prototype.shiftLeft = bnShiftLeft;
+ BigInteger.prototype.shiftRight = bnShiftRight;
+ BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
+ BigInteger.prototype.bitCount = bnBitCount;
+ BigInteger.prototype.testBit = bnTestBit;
+ BigInteger.prototype.setBit = bnSetBit;
+ BigInteger.prototype.clearBit = bnClearBit;
+ BigInteger.prototype.flipBit = bnFlipBit;
+ BigInteger.prototype.add = bnAdd;
+ BigInteger.prototype.subtract = bnSubtract;
+ BigInteger.prototype.multiply = bnMultiply;
+ BigInteger.prototype.divide = bnDivide;
+ BigInteger.prototype.remainder = bnRemainder;
+ BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
+ BigInteger.prototype.modPow = bnModPow;
+ BigInteger.prototype.modInverse = bnModInverse;
+ BigInteger.prototype.pow = bnPow;
+ BigInteger.prototype.gcd = bnGCD;
+ BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
+
+ // JSBN-specific extension
+ BigInteger.prototype.square = bnSquare;
+
+ // Expose the Barrett function
+ BigInteger.prototype.Barrett = Barrett
+
+ // BigInteger interfaces not implemented in jsbn:
+
+ // BigInteger(int signum, byte[] magnitude)
+ // double doubleValue()
+ // float floatValue()
+ // int hashCode()
+ // long longValue()
+ // static BigInteger valueOf(long val)
+
+ // Random number generator - requires a PRNG backend, e.g. prng4.js
+
+ // For best results, put code like
+ // <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>
+ // in your main HTML document.
+
+ var rng_state;
+ var rng_pool;
+ var rng_pptr;
+
+ // Mix in a 32-bit integer into the pool
+ function rng_seed_int(x) {
+ rng_pool[rng_pptr++] ^= x & 255;
+ rng_pool[rng_pptr++] ^= (x >> 8) & 255;
+ rng_pool[rng_pptr++] ^= (x >> 16) & 255;
+ rng_pool[rng_pptr++] ^= (x >> 24) & 255;
+ if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;
+ }
+
+ // Mix in the current time (w/milliseconds) into the pool
+ function rng_seed_time() {
+ rng_seed_int(new Date().getTime());
+ }
+
+ // Initialize the pool with junk if needed.
+ if(rng_pool == null) {
+ rng_pool = new Array();
+ rng_pptr = 0;
+ var t;
+ if(typeof window !== "undefined" && window.crypto) {
+ if (window.crypto.getRandomValues) {
+ // Use webcrypto if available
+ var ua = new Uint8Array(32);
+ window.crypto.getRandomValues(ua);
+ for(t = 0; t < 32; ++t)
+ rng_pool[rng_pptr++] = ua[t];
+ }
+ else if(navigator.appName == "Netscape" && navigator.appVersion < "5") {
+ // Extract entropy (256 bits) from NS4 RNG if available
+ var z = window.crypto.random(32);
+ for(t = 0; t < z.length; ++t)
+ rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;
+ }
+ }
+ while(rng_pptr < rng_psize) { // extract some randomness from Math.random()
+ t = Math.floor(65536 * Math.random());
+ rng_pool[rng_pptr++] = t >>> 8;
+ rng_pool[rng_pptr++] = t & 255;
+ }
+ rng_pptr = 0;
+ rng_seed_time();
+ //rng_seed_int(window.screenX);
+ //rng_seed_int(window.screenY);
+ }
+
+ function rng_get_byte() {
+ if(rng_state == null) {
+ rng_seed_time();
+ rng_state = prng_newstate();
+ rng_state.init(rng_pool);
+ for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)
+ rng_pool[rng_pptr] = 0;
+ rng_pptr = 0;
+ //rng_pool = null;
+ }
+ // TODO: allow reseeding after first request
+ return rng_state.next();
+ }
+
+ function rng_get_bytes(ba) {
+ var i;
+ for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();
+ }
+
+ function SecureRandom() {}
+
+ SecureRandom.prototype.nextBytes = rng_get_bytes;
+
+ // prng4.js - uses Arcfour as a PRNG
+
+ function Arcfour() {
+ this.i = 0;
+ this.j = 0;
+ this.S = new Array();
+ }
+
+ // Initialize arcfour context from key, an array of ints, each from [0..255]
+ function ARC4init(key) {
+ var i, j, t;
+ for(i = 0; i < 256; ++i)
+ this.S[i] = i;
+ j = 0;
+ for(i = 0; i < 256; ++i) {
+ j = (j + this.S[i] + key[i % key.length]) & 255;
+ t = this.S[i];
+ this.S[i] = this.S[j];
+ this.S[j] = t;
+ }
+ this.i = 0;
+ this.j = 0;
+ }
+
+ function ARC4next() {
+ var t;
+ this.i = (this.i + 1) & 255;
+ this.j = (this.j + this.S[this.i]) & 255;
+ t = this.S[this.i];
+ this.S[this.i] = this.S[this.j];
+ this.S[this.j] = t;
+ return this.S[(t + this.S[this.i]) & 255];
+ }
+
+ Arcfour.prototype.init = ARC4init;
+ Arcfour.prototype.next = ARC4next;
+
+ // Plug in your RNG constructor here
+ function prng_newstate() {
+ return new Arcfour();
+ }
+
+ // Pool size must be a multiple of 4 and greater than 32.
+ // An array of bytes the size of the pool will be passed to init()
+ var rng_psize = 256;
+
+ if (typeof exports !== 'undefined') {
+ exports = module.exports = {
+ default: BigInteger,
+ BigInteger: BigInteger,
+ SecureRandom: SecureRandom,
+ };
+ } else {
+ this.jsbn = {
+ BigInteger: BigInteger,
+ SecureRandom: SecureRandom
+ };
+ }
+
+}).call(this);
+
+},{}],10:[function(require,module,exports){
+/* global window, exports, define */
+
+!function() {
+ 'use strict'
+
+ var re = {
+ not_string: /[^s]/,
+ not_bool: /[^t]/,
+ not_type: /[^T]/,
+ not_primitive: /[^v]/,
+ number: /[diefg]/,
+ numeric_arg: /[bcdiefguxX]/,
+ json: /[j]/,
+ not_json: /[^j]/,
+ text: /^[^\x25]+/,
+ modulo: /^\x25{2}/,
+ placeholder: /^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,
+ key: /^([a-z_][a-z_\d]*)/i,
+ key_access: /^\.([a-z_][a-z_\d]*)/i,
+ index_access: /^\[(\d+)\]/,
+ sign: /^[+-]/
+ }
+
+ function sprintf(key) {
+ // `arguments` is not an array, but should be fine for this call
+ return sprintf_format(sprintf_parse(key), arguments)
+ }
+
+ function vsprintf(fmt, argv) {
+ return sprintf.apply(null, [fmt].concat(argv || []))
+ }
+
+ function sprintf_format(parse_tree, argv) {
+ var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign
+ for (i = 0; i < tree_length; i++) {
+ if (typeof parse_tree[i] === 'string') {
+ output += parse_tree[i]
+ }
+ else if (typeof parse_tree[i] === 'object') {
+ ph = parse_tree[i] // convenience purposes only
+ if (ph.keys) { // keyword argument
+ arg = argv[cursor]
+ for (k = 0; k < ph.keys.length; k++) {
+ if (arg == undefined) {
+ throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k-1]))
+ }
+ arg = arg[ph.keys[k]]
+ }
+ }
+ else if (ph.param_no) { // positional argument (explicit)
+ arg = argv[ph.param_no]
+ }
+ else { // positional argument (implicit)
+ arg = argv[cursor++]
+ }
+
+ if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) {
+ arg = arg()
+ }
+
+ if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg))) {
+ throw new TypeError(sprintf('[sprintf] expecting number but found %T', arg))
+ }
+
+ if (re.number.test(ph.type)) {
+ is_positive = arg >= 0
+ }
+
+ switch (ph.type) {
+ case 'b':
+ arg = parseInt(arg, 10).toString(2)
+ break
+ case 'c':
+ arg = String.fromCharCode(parseInt(arg, 10))
+ break
+ case 'd':
+ case 'i':
+ arg = parseInt(arg, 10)
+ break
+ case 'j':
+ arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0)
+ break
+ case 'e':
+ arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential()
+ break
+ case 'f':
+ arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg)
+ break
+ case 'g':
+ arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg)
+ break
+ case 'o':
+ arg = (parseInt(arg, 10) >>> 0).toString(8)
+ break
+ case 's':
+ arg = String(arg)
+ arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+ break
+ case 't':
+ arg = String(!!arg)
+ arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+ break
+ case 'T':
+ arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase()
+ arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+ break
+ case 'u':
+ arg = parseInt(arg, 10) >>> 0
+ break
+ case 'v':
+ arg = arg.valueOf()
+ arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+ break
+ case 'x':
+ arg = (parseInt(arg, 10) >>> 0).toString(16)
+ break
+ case 'X':
+ arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase()
+ break
+ }
+ if (re.json.test(ph.type)) {
+ output += arg
+ }
+ else {
+ if (re.number.test(ph.type) && (!is_positive || ph.sign)) {
+ sign = is_positive ? '+' : '-'
+ arg = arg.toString().replace(re.sign, '')
+ }
+ else {
+ sign = ''
+ }
+ pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' '
+ pad_length = ph.width - (sign + arg).length
+ pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : ''
+ output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg)
+ }
+ }
+ }
+ return output
+ }
+
+ var sprintf_cache = Object.create(null)
+
+ function sprintf_parse(fmt) {
+ if (sprintf_cache[fmt]) {
+ return sprintf_cache[fmt]
+ }
+
+ var _fmt = fmt, match, parse_tree = [], arg_names = 0
+ while (_fmt) {
+ if ((match = re.text.exec(_fmt)) !== null) {
+ parse_tree.push(match[0])
+ }
+ else if ((match = re.modulo.exec(_fmt)) !== null) {
+ parse_tree.push('%')
+ }
+ else if ((match = re.placeholder.exec(_fmt)) !== null) {
+ if (match[2]) {
+ arg_names |= 1
+ var field_list = [], replacement_field = match[2], field_match = []
+ if ((field_match = re.key.exec(replacement_field)) !== null) {
+ field_list.push(field_match[1])
+ while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
+ if ((field_match = re.key_access.exec(replacement_field)) !== null) {
+ field_list.push(field_match[1])
+ }
+ else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
+ field_list.push(field_match[1])
+ }
+ else {
+ throw new SyntaxError('[sprintf] failed to parse named argument key')
+ }
+ }
+ }
+ else {
+ throw new SyntaxError('[sprintf] failed to parse named argument key')
+ }
+ match[2] = field_list
+ }
+ else {
+ arg_names |= 2
+ }
+ if (arg_names === 3) {
+ throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported')
+ }
+
+ parse_tree.push(
+ {
+ placeholder: match[0],
+ param_no: match[1],
+ keys: match[2],
+ sign: match[3],
+ pad_char: match[4],
+ align: match[5],
+ width: match[6],
+ precision: match[7],
+ type: match[8]
+ }
+ )
+ }
+ else {
+ throw new SyntaxError('[sprintf] unexpected placeholder')
+ }
+ _fmt = _fmt.substring(match[0].length)
+ }
+ return sprintf_cache[fmt] = parse_tree
+ }
+
+ /**
+ * export to either browser or node.js
+ */
+ /* eslint-disable quote-props */
+ if (typeof exports !== 'undefined') {
+ exports['sprintf'] = sprintf
+ exports['vsprintf'] = vsprintf
+ }
+ if (typeof window !== 'undefined') {
+ window['sprintf'] = sprintf
+ window['vsprintf'] = vsprintf
+
+ if (typeof define === 'function' && define['amd']) {
+ define(function() {
+ return {
+ 'sprintf': sprintf,
+ 'vsprintf': vsprintf
+ }
+ })
+ }
+ }
+ /* eslint-enable quote-props */
+}(); // eslint-disable-line
+
+},{}],"ip-address":[function(require,module,exports){
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.v6 = exports.AddressError = exports.Address6 = exports.Address4 = void 0;
+var ipv4_1 = require("./lib/ipv4");
+Object.defineProperty(exports, "Address4", { enumerable: true, get: function () { return ipv4_1.Address4; } });
+var ipv6_1 = require("./lib/ipv6");
+Object.defineProperty(exports, "Address6", { enumerable: true, get: function () { return ipv6_1.Address6; } });
+var address_error_1 = require("./lib/address-error");
+Object.defineProperty(exports, "AddressError", { enumerable: true, get: function () { return address_error_1.AddressError; } });
+var helpers = __importStar(require("./lib/v6/helpers"));
+exports.v6 = { helpers: helpers };
+
+},{"./lib/address-error":1,"./lib/ipv4":3,"./lib/ipv6":4,"./lib/v6/helpers":7}]},{},[]);